From 576b8419ed5b8d4e586151d8965d1d5f89624ee1 Mon Sep 17 00:00:00 2001 From: Alexey Yakovenko Date: Mon, 30 Nov 2009 22:10:09 +0100 Subject: ported filemanager dnd into gtkui --- plugins/gtkui/callbacks.c | 21 ++++++++++++++++----- plugins/gtkui/fileman.c | 27 +++++++++++++++++++++++++++ plugins/gtkui/gtkplaylist.c | 20 -------------------- plugins/gtkui/gtkplaylist.h | 9 --------- plugins/gtkui/gtkui.c | 39 ++------------------------------------- plugins/gtkui/gtkui.h | 3 +++ 6 files changed, 48 insertions(+), 71 deletions(-) (limited to 'plugins/gtkui') diff --git a/plugins/gtkui/callbacks.c b/plugins/gtkui/callbacks.c index 5f1cd755..99373594 100644 --- a/plugins/gtkui/callbacks.c +++ b/plugins/gtkui/callbacks.c @@ -38,6 +38,9 @@ #include "session.h" #include "gtkui.h" +#define SELECTED(it) (deadbeef->pl_is_selected(it)) +#define PL_NEXT(it, iter) (deadbeef->pl_get_next(it, iter)) + extern GtkWidget *mainwin; extern gtkplaylist_t main_playlist; extern gtkplaylist_t search_playlist; @@ -611,14 +614,22 @@ on_playlist_drag_data_received (GtkWidget *widget, GTKPL_PROLOGUE; gchar *ptr=(char*)data->data; if (target_type == 0) { // uris - fprintf (stderr, "calling gtkpl_handle_fm_drag_drop\n"); -// if (!strncmp(ptr,"file:///",8)) { - gtkpl_handle_fm_drag_drop (ps, y, ptr, data->length); -// } + // this happens when dropped from file manager + char *mem = malloc (data->length+1); + memcpy (mem, ptr, data->length); + mem[data->length] = 0; + // we don't pass control structure, but there's only one drag-drop view currently + gtkui_receive_fm_drop (mem, data->length, y); } else if (target_type == 1) { uint32_t *d= (uint32_t *)ptr; - gtkpl_handle_drag_drop (ps, y, d, data->length/4); + int length = data->length/4; + int drop_row = y / rowheight + ps->scrollpos; + DB_playItem_t *drop_before = deadbeef->pl_get_for_idx_and_iter (drop_row, ps->iterator); + while (drop_before && SELECTED (drop_before)) { + drop_before = PL_NEXT(drop_before, ps->iterator); + } + deadbeef->pl_move_items (ps->iterator, drop_before, d, length); } gtk_drag_finish (drag_context, TRUE, FALSE, time); } diff --git a/plugins/gtkui/fileman.c b/plugins/gtkui/fileman.c index 14bfddca..8b08f466 100644 --- a/plugins/gtkui/fileman.c +++ b/plugins/gtkui/fileman.c @@ -1,5 +1,6 @@ #include "../../deadbeef.h" #include +#include #include "gtkui.h" #include "gtkplaylist.h" @@ -37,3 +38,29 @@ gtkui_open_files (struct _GSList *lst) { deadbeef->pl_free (); deadbeef->thread_start (open_files_worker, lst); } + +struct fmdrop_data { + char *mem; + int length; + int drop_y; +}; + +static void +fmdrop_worker (void *ctx) { + struct fmdrop_data *data = (struct fmdrop_data *)ctx; + gtkpl_add_fm_dropped_files (&main_playlist, data->mem, data->length, data->drop_y); + free (data); +} + +void +gtkui_receive_fm_drop (char *mem, int length, int drop_y) { + struct fmdrop_data *data = malloc (sizeof (struct fmdrop_data)); + if (!data) { + fprintf (stderr, "gtkui_receive_fm_drop: malloc failed\n"); + return; + } + data->mem = mem; + data->length = length; + data->drop_y = drop_y; + deadbeef->thread_start (fmdrop_worker, data); +} diff --git a/plugins/gtkui/gtkplaylist.c b/plugins/gtkui/gtkplaylist.c index 2186af2a..358b5a38 100644 --- a/plugins/gtkui/gtkplaylist.c +++ b/plugins/gtkui/gtkplaylist.c @@ -1190,16 +1190,6 @@ gtkpl_track_dragdrop (gtkplaylist_t *ps, int y) { } } -void -gtkpl_handle_drag_drop (gtkplaylist_t *ps, int drop_y, uint32_t *d, int length) { - int drop_row = drop_y / rowheight + ps->scrollpos; - DB_playItem_t *drop_before = deadbeef->pl_get_for_idx_and_iter (drop_row, ps->iterator); - while (drop_before && SELECTED (drop_before)) { - drop_before = PL_NEXT(drop_before, ps->iterator); - } - deadbeef->pl_move_items (ps->iterator, drop_before, d, length); -} - void on_playlist_drag_end (GtkWidget *widget, GdkDragContext *drag_context, @@ -1323,16 +1313,6 @@ gtkpl_add_fm_dropped_files (gtkplaylist_t *ps, char *ptr, int length, int drop_y GDK_THREADS_LEAVE(); } -void -gtkpl_handle_fm_drag_drop (gtkplaylist_t *ps, int drop_y, void *ptr, int length) { - // this happens when dropped from file manager - char *mem = malloc (length+1); - memcpy (mem, ptr, length); - mem[length] = 0; - // we don't pass control structure, but there's only one drag-drop view currently - deadbeef->sendmessage (M_FMDRAGDROP, (uintptr_t)mem, length, drop_y); -} - void gtkpl_header_draw (gtkplaylist_t *ps) { GtkWidget *widget = ps->header; diff --git a/plugins/gtkui/gtkplaylist.h b/plugins/gtkui/gtkplaylist.h index ddeb479f..5bf49d2e 100644 --- a/plugins/gtkui/gtkplaylist.h +++ b/plugins/gtkui/gtkplaylist.h @@ -149,15 +149,6 @@ gtkpl_keypress (gtkplaylist_t *ps, int keyval, int state); void gtkpl_track_dragdrop (gtkplaylist_t *ps, int y); -void -gtkpl_handle_drag_drop (gtkplaylist_t *ps, int drop_y, uint32_t *d, int length); - -void -gtkpl_handle_fm_drag_drop (gtkplaylist_t *ps, int drop_y, void *ptr, int length); - -void -gtkpl_add_fm_dropped_files (gtkplaylist_t *ps, char *ptr, int length, int drop_y); - void gtkpl_select_single (gtkplaylist_t *ps, int sel); diff --git a/plugins/gtkui/gtkui.c b/plugins/gtkui/gtkui.c index 88688863..96420a8b 100644 --- a/plugins/gtkui/gtkui.c +++ b/plugins/gtkui/gtkui.c @@ -245,41 +245,6 @@ guiplug_shutdown (void) { GDK_THREADS_LEAVE(); } -#if 0 -void -guiplug_start_current_track (void) { - gtkpl_playsong (&main_playlist); - if (playlist_current_ptr) { - GDK_THREADS_ENTER(); - gtkpl_redraw_pl_row (&main_playlist, pl_get_idx_of (playlist_current_ptr), playlist_current_ptr); - GDK_THREADS_LEAVE(); - } -} -#endif - -void -guiplug_start_track (int idx) { - GDK_THREADS_ENTER(); - gtkpl_playsongnum (idx); - GDK_THREADS_LEAVE(); -} - -void -guiplug_start_random (void) { - // - assert (0); -} - -void -guiplug_open_files (GSList *files) { - gtkpl_add_files (&main_playlist, files); - //gtkpl_playsong (&main_playlist); -} - -void -guiplug_add_fm_dropped_files (char *files, int p1, int p2) { - gtkpl_add_fm_dropped_files (&main_playlist, files, p1, p2); -} static int gtkui_on_activate (DB_event_t *ev, uintptr_t data) { @@ -335,7 +300,7 @@ gtkui_on_volumechanged (DB_event_t *ev, uintptr_t data) { } void -gtkui_thread (uintptr_t ctx) { +gtkui_thread (void *ctx) { // let's start some gtk g_thread_init (NULL); add_pixmap_directory (PREFIX "/share/deadbeef/pixmaps"); @@ -403,7 +368,7 @@ gtkui_start (void) { deadbeef->ev_subscribe (DB_PLUGIN (&plugin), DB_EV_FRAMEUPDATE, DB_CALLBACK (gtkui_on_frameupdate), 0); deadbeef->ev_subscribe (DB_PLUGIN (&plugin), DB_EV_VOLUMECHANGED, DB_CALLBACK (gtkui_on_volumechanged), 0); // gtk must be running in separate thread - deadbeef->thread_start (gtkui_thread, 0); + deadbeef->thread_start (gtkui_thread, NULL); return 0; } diff --git a/plugins/gtkui/gtkui.h b/plugins/gtkui/gtkui.h index dcfa5cd1..ae88ecff 100644 --- a/plugins/gtkui/gtkui.h +++ b/plugins/gtkui/gtkui.h @@ -14,4 +14,7 @@ gtkui_add_files (struct _GSList *lst); void gtkui_open_files (struct _GSList *lst); +void +gtkui_receive_fm_drop (char *mem, int length, int drop_y); + #endif -- cgit v1.2.3