brauche hilfe um quellcode von xmms player zu verstehen



  • Hallo!

    bin noch ein ziemlicher anfänger auf dem gebiet. cich hab mir mal den quellcode von xmms player runtergeladen. Der player hat eine funktion mit dem namen jump_to_file wie bei winamp!
    möchte gerne wissen, an welcher stelle die gesuchten und gefundenen titel in dem fenster ausgegeben werden (möchte diese info nämlich auf einem display ausgeben).
    hier der quellcode für diese funktion:

    static void mainwin_jump_to_file_select_row_cb(GtkCList * widget, gint row, gint column, GdkEventButton * event, gpointer cb_data)
    {
    if (event && event->button == 1 && event->type == GDK_2BUTTON_PRESS)
    mainwin_jump_to_file_real_cb(widget);
    else
    mainwin_jtf_set_qbtn_label(widget, GTK_WIDGET(cb_data));
    }

    static void mainwin_jump_to_file_keypress_cb(GtkWidget * widget, GdkEventKey * event, gpointer userdata)
    {
    if (event && (event->keyval == GDK_Return))
    mainwin_jump_to_file_real_cb(GTK_CLIST(widget));
    else if (event && (event->keyval == GDK_Escape))
    gtk_widget_destroy(mainwin_jtf);
    }

    static gboolean mainwin_jump_to_file_entry_keypress_cb(GtkWidget * widget, GdkEventKey * event, gpointer userdata)
    {
    GtkCList* clist = GTK_CLIST(userdata);
    gboolean stop = FALSE;

    if (!event)
    return FALSE;

    switch (event->keyval)
    {
    case GDK_Return:
    mainwin_jump_to_file_real_cb(clist);
    break;
    case GDK_Escape:
    gtk_widget_destroy(mainwin_jtf);
    break;
    case GDK_Up:
    case GDK_Down:
    case GDK_Page_Up:
    case GDK_Page_Down:
    gtk_widget_event(GTK_WIDGET(clist), (GdkEvent *)event);
    /* Stop the signal or we might lose focus */
    stop = TRUE;
    break;
    case GDK_BackSpace:
    case GDK_Delete:
    if (strlen(gtk_entry_get_text(GTK_ENTRY(widget))) == 0)
    /* Optimization: Ignore delete keys if
    the string already is empty */
    stop = TRUE;
    break;
    default:
    return FALSE;
    }

    if (stop)
    gtk_signal_emit_stop_by_name(GTK_OBJECT(widget),
    "key_press_event");

    return TRUE;
    }

    static void mainwin_jump_to_file_jump_cb(GtkButton * widget, gpointer userdata)
    {
    mainwin_jump_to_file_real_cb(GTK_CLIST(userdata));
    }

    static void mainwin_jump_to_file_queue_cb(GtkButton * widget, gpointer userdata)
    {
    GtkCList *clist = GTK_CLIST(userdata);
    int *pos;

    if (clist->selection)
    {
    int lpos = GPOINTER_TO_INT(clist->selection->data);
    pos = gtk_clist_get_row_data(clist, lpos);
    playlist_queue_position(*pos);
    }
    mainwin_jtf_set_qbtn_label(clist, GTK_WIDGET(widget));
    }

    static int mainwin_jump_to_file_match(gchar* song, gchar * keys[], gint nw)
    {
    gint i;

    for (i = 0; i < nw; i++)
    {
    if (!strstr(song, keys[i]))
    return 0;
    }

    return 1;
    }

    static void mainwin_jump_to_file_edit_cb(GtkWidget * widget, gpointer userdata)
    {
    char* key;
    GtkCList* clist;
    GList *playlist;
    char *desc_buf;
    int songnr = 0;

    char words[20];
    int nw = 0, i;
    char
    ptr;

    PL_LOCK();
    playlist = get_playlist();
    key = g_strdup(gtk_entry_get_text(GTK_ENTRY(widget)));
    clist = GTK_CLIST(userdata);

    /* lowercase the key string */
    g_strdown(key);

    /* Chop the key string into ' '-separeted key words */
    for (ptr = key; nw < 20; ptr = strchr(ptr, ' '))
    {
    if (!ptr)
    break;
    else if (*ptr == ' ')
    {
    while (*ptr == ' ')
    {
    *ptr = '\0';
    ptr++;
    }
    words[nw++] = ptr;
    }
    else
    {
    words[nw++] = ptr;
    }
    }

    gtk_clist_freeze(clist);
    gtk_clist_clear(clist);

    while (playlist)
    {
    int match = 0;
    char *title, *filename;

    title = ((PlaylistEntry 😉 playlist->data)->title;
    filename = ((PlaylistEntry 😉 playlist->data)->filename;

    if (title)
    desc_buf = title;
    else if (strchr(filename, '/'))
    desc_buf = strrchr(filename, '/') + 1;
    else
    desc_buf = filename;

    /*
    * Optimize a little since the delay when beginning to
    * type is annoying. We'll drop through if the key is
    * zero length, and if it is a single letter, we'll
    * take a shortcut and use strchr. This'll save us
    * from constructing the lowercased song name to
    * compare. (Note that we cheat and do not compare the
    * one letter key case-insensitively, but I don't
    * think anybody notices (or wants to search by one
    * letter anyway.))
    *
    * These (admittedly ugly) hacks help noticeably.
    *
    * A further optimization would be to save the
    * lowercased versions of the filenames rather than
    * constructing them everytime. This'd take memory, so
    * I won't do it this time.
    */

    if (nw == 0 || /* zero char key /
    (nw == 1 && words[0][0] == '\0') || /
    zero char key /
    (nw == 1 && strlen(words[0]) == 1 && /
    one char key */
    ((title && strchr(title, words[0][0])) ||
    strchr(filename, words[0][0]))))
    match = 1;
    else if (nw == 1 && strlen(words[0]) == 1)
    match = 0;
    else
    {
    char song[256];

    /* Cook up a lowercased string that contains
    the filename and the (possible) title */
    for (ptr = title, i = 0; ptr && *ptr && i < 254; i++, ptr++)
    song[i] = tolower(*ptr);
    for (ptr = filename; *ptr && i < 254; i++, ptr++)
    song[i] = tolower(*ptr);
    song[i] = '\0';

    /* Compare the key words to the string - if
    all the words match, add to the clist */
    match = mainwin_jump_to_file_match(song, words, nw);
    }

    if (match)
    {
    int row, *data_buf;
    row = gtk_clist_append(clist, &desc_buf);
    data_buf = g_malloc(sizeof (int));
    *data_buf = songnr;
    gtk_clist_set_row_data_full(clist, row, data_buf, g_free);
    }

    songnr++;
    playlist = playlist->next;
    }

    PL_UNLOCK();

    if (cfg.sort_jump_to_file)
    {
    gtk_clist_set_sort_column(clist, 0);
    gtk_clist_set_sort_type(clist, GTK_SORT_ASCENDING);
    gtk_clist_sort(clist);
    }
    gtk_clist_select_row(clist, 0, 0);
    gtk_clist_thaw(clist);

    g_free(key);
    }

    static void mainwin_jump_to_file(void)
    {
    GtkWidget *vbox, *scrollwin, *clist, *sep, *bbox, *jump, *queue, *cancel, *edit, *search_label, *hbox;
    GList *playlist;
    char *title[1];
    gchar *desc_buf;
    gint *data_buf;
    gint row;

    PL_LOCK();
    playlist = get_playlist();

    if (!playlist)
    {
    PL_UNLOCK();
    return;
    }

    mainwin_jtf = gtk_window_new(GTK_WINDOW_DIALOG);
    gtk_window_set_title(GTK_WINDOW(mainwin_jtf), _("Jump to file"));
    gtk_window_set_transient_for(GTK_WINDOW(mainwin_jtf), GTK_WINDOW(mainwin));
    gtk_signal_connect(GTK_OBJECT(mainwin_jtf), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &mainwin_jtf);
    gtk_container_border_width(GTK_CONTAINER(mainwin_jtf), 10);
    gtk_window_set_default_size(GTK_WINDOW(mainwin_jtf), 300, 350);

    vbox = gtk_vbox_new(FALSE, 5);
    gtk_container_add(GTK_CONTAINER(mainwin_jtf), vbox);
    gtk_widget_show(vbox);

    queue = gtk_button_new_with_label(_("Queue"));

    title[0] = _("Files");
    clist = gtk_clist_new_with_titles(1, title);
    gtk_clist_set_selection_mode(GTK_CLIST(clist), GTK_SELECTION_BROWSE);
    gtk_signal_connect(GTK_OBJECT(clist), "select_row", GTK_SIGNAL_FUNC(mainwin_jump_to_file_select_row_cb), queue);
    gtk_signal_connect(GTK_OBJECT(clist), "key_press_event", GTK_SIGNAL_FUNC(mainwin_jump_to_file_keypress_cb), NULL);
    hbox = gtk_hbox_new(FALSE, 3);
    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 3);
    gtk_widget_show(hbox);

    search_label = gtk_label_new(_("Search: "));
    gtk_box_pack_start(GTK_BOX(hbox), search_label, FALSE, FALSE, 0);
    gtk_widget_show(search_label);

    edit = gtk_entry_new();
    gtk_entry_set_editable(GTK_ENTRY(edit), TRUE);
    gtk_signal_connect(GTK_OBJECT(edit), "changed", GTK_SIGNAL_FUNC(mainwin_jump_to_file_edit_cb), clist);
    gtk_signal_connect(GTK_OBJECT(edit), "key_press_event", GTK_SIGNAL_FUNC(mainwin_jump_to_file_entry_keypress_cb), clist);
    gtk_box_pack_start(GTK_BOX(hbox), edit, TRUE, TRUE, 3);
    gtk_widget_show(edit);

    scrollwin = gtk_scrolled_window_new(NULL, NULL);
    gtk_container_add(GTK_CONTAINER(scrollwin), clist);
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
    gtk_box_pack_start(GTK_BOX(vbox), scrollwin, TRUE, TRUE, 0);
    gtk_widget_set_usize(scrollwin, 330, 200);
    gtk_widget_show(clist);
    gtk_widget_show(scrollwin);

    sep = gtk_hseparator_new();
    gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 0);
    gtk_widget_show(sep);

    bbox = gtk_hbutton_box_new();
    gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
    gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5);
    gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);

    jump = gtk_button_new_with_label(_("Jump"));
    gtk_box_pack_start(GTK_BOX(bbox), jump, FALSE, FALSE, 0);
    gtk_signal_connect(GTK_OBJECT(jump), "clicked", GTK_SIGNAL_FUNC(mainwin_jump_to_file_jump_cb), clist);
    GTK_WIDGET_SET_FLAGS(jump, GTK_CAN_DEFAULT);
    gtk_widget_show(jump);
    gtk_widget_grab_default(jump);

    gtk_box_pack_start(GTK_BOX(bbox), queue, FALSE, FALSE, 0);
    gtk_signal_connect(GTK_OBJECT(queue), "clicked", GTK_SIGNAL_FUNC(mainwin_jump_to_file_queue_cb), clist);
    GTK_WIDGET_SET_FLAGS(queue, GTK_CAN_DEFAULT);
    gtk_widget_show(queue);

    cancel = gtk_button_new_with_label(_("Close"));
    gtk_box_pack_start(GTK_BOX(bbox), cancel, FALSE, FALSE, 0);
    gtk_signal_connect_object(GTK_OBJECT(cancel), "clicked", GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(mainwin_jtf));
    GTK_WIDGET_SET_FLAGS(cancel, GTK_CAN_DEFAULT);
    gtk_widget_show(cancel);
    gtk_widget_show(bbox);

    gtk_clist_clear(GTK_CLIST(clist));

    while (playlist)
    {
    if (((PlaylistEntry 😉 playlist->data)->title)
    desc_buf = ((PlaylistEntry 😉 playlist->data)->title;
    else if (strchr(((PlaylistEntry 😉 playlist->data)->filename, '/'))
    desc_buf = strrchr(((PlaylistEntry 😉 playlist->data)->filename, '/') + 1;
    else
    desc_buf = ((PlaylistEntry 😉 playlist->data)->filename;
    row = gtk_clist_append(GTK_CLIST(clist), &desc_buf);
    data_buf = g_malloc(sizeof (gint));
    *data_buf = row;
    gtk_clist_set_row_data_full(GTK_CLIST(clist), row, data_buf, g_free);
    playlist = playlist->next;
    }

    PL_UNLOCK();
    gtk_clist_select_row(GTK_CLIST(clist), get_playlist_position(), 0);

    if (cfg.sort_jump_to_file)
    {
    gtk_clist_set_sort_column(GTK_CLIST(clist), 0);
    gtk_clist_set_sort_type(GTK_CLIST(clist), GTK_SORT_ASCENDING);
    gtk_clist_sort(GTK_CLIST(clist));
    }
    gtk_window_set_modal(GTK_WINDOW(mainwin_jtf), 1);
    gtk_widget_show(mainwin_jtf);
    gtk_widget_grab_focus(edit);
    gtk_clist_moveto(GTK_CLIST(clist),
    GPOINTER_TO_INT(GTK_CLIST(clist)->selection->data),
    0, 0.5, 0.0);
    GTK_CLIST(clist)->focus_row = GPOINTER_TO_INT(GTK_CLIST(clist)->selection->data);
    }



  • Ich möchte dich drauf hinweisen, dass du so eben lizenzrechtlich geschützten Code gepostet hast...



  • Davon abgesehen dass das bei GPL nicht so tragisch sein dürfte,

    a) Schaut sich das sicher keiner komplett an
    b) Schon garnicht ohne Code-Tags und Einrückung
    c) Hat xmms eine Plugin-Schnittstelle für genau sowas (Display ansteuern)



  • wie sieht denn diese schnittstelle aus?
    hab schon einige plugins gefunden um aktuelle titelinformationen usw anzuzeigen, möchte aber die suchfunktion (jump to file) auch anzeigen!



  • Dafür gibts doch das OSD-Plugin & Co.

    Aber ich schließe mich den anderen an, so stellt man keine Fragen, wenn Du eine konkrete Frage hast, dann schieß los, aber uns einfach so unformatiert und unkommentiert solche Mengen Code hinzuknallen, ist bestenfalls unfreundlich.



  • siehe mainwin_jump_to_file_edit_cb...

    Ich bezweifle aber, dass du so weiterkommst.



  • Erst mal tschuldigung, hab wohl gegen ein paar "Regeln" verstoßen. Ich werde in Zukunft versuchen es besser zu machen (bitte vielleicht um etwas Nachsicht, bin eben ein blutiger Anfänger)!
    Trotzdem Danke für die Antworten, sie haben mir schon um einiges weitergeholfen!
    Nur noch ein paar Kleinigkeiten um nicht noch mehr falsch zu machen!
    Ist es verboten den Quellcode zu verändern und für private Zwecke zu verwenden?
    Angenommen ich schreib dafür ein Plugin, gibts dafür eine Anleitung, Leitfaden oder ähnliches?

    Sorry nochmal!!!!
    Es war keine Absicht von mir, hoffe ich hab niemanden allzu verärgert!!



  • hallo freund,
    nein nein für private zwecke kannst du damit ja alles machen was du magst. wenn du deine version allerdings zum download anbietest für andere dann musst du auch deine veränderungen im source code zum download anbieten, weil das ja die philosophie vom gpl ist



  • FreedomRunner schrieb:

    [...]Ist es verboten den Quellcode zu verändern und für private Zwecke zu verwenden?
    Angenommen ich schreib dafür ein Plugin, gibts dafür eine Anleitung, Leitfaden oder ähnliches?[...]

    Nein ist es nicht. Allerdings musst du, wenn du dein Programm weitergibts, den Quellcode mit veröffentlichen, wenn du Änderungen vorgenommen hast.

    Das Problem hier ist, dass du als Bedingung für die Weitergabe eine Version der GPL oder einen Verweis auf die GPL liefern musst.

    Für weiter Information lies dir doch mal die deutsche Übersetzung durch: http://www.gnu.de/gpl-ger.html


Anmelden zum Antworten