diff -NurpP xmms-1.2.10.orig/xmms/playlistwin.c xmms-1.2.10/xmms/playlistwin.c --- xmms-1.2.10.orig/xmms/playlistwin.c 2005-03-26 18:29:38 +0400 +++ xmms-1.2.10/xmms/playlistwin.c 2005-03-26 18:32:33 +0400 @@ -1558,6 +1558,78 @@ static void playlistwin_keypress_up_down } +extern GList* queued_list; +static void playlistwin_insert_queued(PlayList_List* pl, int insert_at, int exchange) +{ + int queued_length,index,to_break=0; + GList* node; + + queued_length = g_list_length(queued_list); + + if(insert_at > queued_length) + insert_at = queued_length; + + PL_LOCK(); + for(node = get_playlist(); node;node = node->next) + { + PlaylistEntry *entry = node->data; + if(entry->selected) + { + GList* temp = g_list_find(queued_list,(void*)entry); + if(temp) + { + /* getting index */ + index = g_list_position(queued_list, temp); + + /* i don't need to move from dest to dest */ + if(index == insert_at) + break; + + /* remove selected from queued_list */ + queued_list = g_list_remove_link(queued_list, temp); + g_list_free_1(temp); + + /* if it exchange than ...*/ + if(exchange) + { + /* if index < insert_at than indexes are must be + * decresead to one (because we delete node above) */ + + temp = g_list_nth(queued_list, + index insert_at) + new_index--; + + /* new_index should be greater than 0 */ + new_index = new_index>0?new_index:0; + + queued_list = g_list_remove_link(queued_list,temp); + queued_list = g_list_insert(queued_list, temp->data, + new_index); + g_list_free_1(temp); + /* we don't need to exchange others */ + to_break=1; + } + } + } + + queued_list = g_list_insert(queued_list, (void*)entry,insert_at); + insert_at++; + if(to_break) + break; + } + } + PL_UNLOCK(); + fflush(stdout); + + return; +} + + static gboolean playlistwin_keypress(GtkWidget * w, GdkEventKey * event, gpointer data) { guint keyval; @@ -1580,6 +1652,27 @@ static gboolean playlistwin_keypress(Gtk keyval == GDK_Up || keyval == GDK_KP_Up, event->state); break; + /* Making keys "1", "2" and other to work in pl window */ + /* If you press ctrl+number than you get exchange between + * two positions */ + case GDK_3: + if (event->state & GDK_SHIFT_MASK) + { + playlistwin_fileinfo(); + refresh = FALSE; + break; + } + case GDK_1: + case GDK_2: + case GDK_4: + case GDK_5: + case GDK_6: + case GDK_7: + case GDK_8: + case GDK_9: + playlistwin_insert_queued(playlistwin_list, keyval - GDK_1, + event->state & GDK_CONTROL_MASK); + break; case GDK_Page_Up: playlistwin_scroll(-playlistwin_list->pl_num_visible); break; @@ -1617,11 +1710,6 @@ static gboolean playlistwin_keypress(Gtk playlistwin_show_filebrowser(); refresh=FALSE; break; - case GDK_3: - if (event->state & GDK_CONTROL_MASK) - playlistwin_fileinfo(); - refresh = FALSE; - break; default: if (!gtk_accel_group_activate(playlistwin_accel, event->keyval, event->state)) gtk_widget_event(mainwin, (GdkEvent *) event); diff -NurpP xmms-1.2.10.orig/xmms.1.in xmms-1.2.10/xmms.1.in --- xmms-1.2.10.orig/xmms.1.in 2005-03-26 18:29:38 +0400 +++ xmms-1.2.10/xmms.1.in 2005-03-26 18:25:13 +0400 @@ -154,6 +154,10 @@ Insert Add file dialog Shift + Insert Add directory dialog .br Alt + Insert Add url dialog +.br + Set unqueued list number +.br +Shift + Exchange between unqueued list tracks .in -2 Equalizer shade mode specific: