/** @brief Called when either the actual queue or the playing track change */
static void queue_playing_changed(void) {
-
+ const char *old_id = playing_track ? playing_track->id : 0;
+
/* Check that the playing track isn't in the queue. There's a race here due
* to the fact that we issue the two commands at slightly different times.
* If it goes wrong we re-issue and try again, so that we never offer up an
playing_track = NULL;
q = actual_queue;
}
- time(&last_playing); /* for column_length() */
+ if(!old_id || !playing_track || strcmp(old_id, playing_track->id))
+ time(&last_playing); /* for column_length() */
ql_new_queue(&ql_queue, q);
/* Tell anyone who cares */
event_raise("queue-list-changed", q);
}
}
+/** @brief Called when a key is pressed in the queue tree view */
+static gboolean queue_key_press(GtkWidget attribute((unused)) *widget,
+ GdkEventKey *event,
+ gpointer user_data) {
+ /*fprintf(stderr, "queue_key_press type=%d state=%#x keyval=%#x\n",
+ event->type, event->state, event->keyval);*/
+ switch(event->keyval) {
+ case GDK_BackSpace:
+ case GDK_Delete:
+ if(event->state)
+ break; /* Only take unmodified DEL/<-- */
+ ql_remove_activate(0, user_data);
+ return TRUE; /* Do not propagate */
+ }
+ return FALSE; /* Propagate */
+}
+
GtkWidget *queue_widget(void) {
GtkWidget *const w = init_queuelike(&ql_queue);
g_signal_connect(ql_queue.store,
"row-deleted",
G_CALLBACK(queue_row_deleted), &ql_queue);
+ /* Catch keypresses */
+ g_signal_connect(ql_queue.view, "key-press-event",
+ G_CALLBACK(queue_key_press), &ql_queue);
return w;
}