From 676b372bd195421646885a2d77300f31da4dd034 Mon Sep 17 00:00:00 2001 From: Maksym Veremeyenko Date: Fri, 24 Jun 2011 14:34:51 +0300 Subject: [PATCH 01/16] cleanup comments --- src/omnplay.cpp | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/omnplay.cpp b/src/omnplay.cpp index 219f5d6..d1dc906 100644 --- a/src/omnplay.cpp +++ b/src/omnplay.cpp @@ -1164,6 +1164,8 @@ static gboolean on_library_grid_key(GtkWidget *widget, GdkEventKey *event, gpoin static gboolean on_library_grid_button(GtkWidget *widget, GdkEventButton *event, gpointer data) { +// g_warning("on_library_grid_button: event->button=%d, event->type=%d", event->button, event->type); + if(event->button==1 && event->type==GDK_2BUTTON_PRESS) { omnplay_library_add((omnplay_instance_t* )data, 0); @@ -1175,6 +1177,8 @@ static gboolean on_library_grid_button(GtkWidget *widget, GdkEventButton *event, static gboolean on_playlist_grid_button(GtkWidget *widget, GdkEventButton *event, gpointer data) { +// g_warning("on_playlist_grid_button"); + if(event->button==1 && event->type==GDK_2BUTTON_PRESS) { omnplay_ctl((omnplay_instance_t* )data, BUTTON_PLAYER_CUE); @@ -1199,10 +1203,12 @@ void omnplay_init(omnplay_instance_t* app) GTK_SIGNAL_FUNC(on_main_window_destroy), app); gtk_widget_add_events(app->playlist_grid, GDK_BUTTON_PRESS_MASK); + gtk_widget_add_events(app->playlist_grid, GDK_KEY_PRESS_MASK); gtk_signal_connect(GTK_OBJECT(app->playlist_grid), "key-press-event", GTK_SIGNAL_FUNC(on_playlist_grid_key), app); gtk_widget_add_events(app->library_grid, GDK_BUTTON_PRESS_MASK); + gtk_widget_add_events(app->library_grid, GDK_KEY_PRESS_MASK); gtk_signal_connect(GTK_OBJECT(app->library_grid), "key-press-event", GTK_SIGNAL_FUNC(on_library_grid_key), app); @@ -1236,9 +1242,6 @@ void omnplay_init(omnplay_instance_t* app) omnplay_library_load(app); pthread_mutexattr_destroy(&attr); - - /* create UI for monitoring update */ -// ui_library_refresh(app, &app->library.refresh_ui[0], &app->library.refresh_ui[1]); }; void omnplay_release(omnplay_instance_t* app) -- 1.7.4.4 From 78b122111f5febfab573cd75584be2e60e98e246 Mon Sep 17 00:00:00 2001 From: Maksym Veremeyenko Date: Sat, 25 Jun 2011 11:32:15 +0300 Subject: [PATCH 02/16] add shortcut titles/processing --- src/omnplay.cpp | 23 ++++++++++++++++++++++- src/ui.c | 4 ++-- src/ui_buttons.c | 22 +++++++++++----------- 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/omnplay.cpp b/src/omnplay.cpp index d1dc906..8213402 100644 --- a/src/omnplay.cpp +++ b/src/omnplay.cpp @@ -1093,6 +1093,20 @@ static gboolean on_playlist_grid_key(GtkWidget *widget, GdkEventKey *event, gpoi return TRUE; }; break; + case GDK_KEY_uparrow: + if(event->state & GDK_CONTROL_MASK) + { + omnplay_playlist_item_swap(app, -1); + return TRUE; + }; + break; + case GDK_KEY_downarrow: + if(event->state & GDK_CONTROL_MASK) + { + omnplay_playlist_item_swap(app, -1); + return TRUE; + }; + break; case GDK_KEY_space: omnplay_ctl(app, BUTTON_PLAYER_PLAY); return TRUE; @@ -1105,7 +1119,8 @@ static gboolean on_playlist_grid_key(GtkWidget *widget, GdkEventKey *event, gpoi case GDK_KEY_Delete: omnplay_playlist_item_del(app); return TRUE; - case GDK_KEY_BackSpace: + case GDK_E: + case GDK_e: omnplay_playlist_item_edit(app); return TRUE; }; @@ -1157,6 +1172,12 @@ static gboolean on_library_grid_key(GtkWidget *widget, GdkEventKey *event, gpoin return TRUE; }; break; + case GDK_KEY_BackSpace: + omnplay_library_add(app, 0); + return TRUE; + case GDK_KEY_F5: + omnplay_library_refresh(app); + return TRUE; }; return FALSE; diff --git a/src/ui.c b/src/ui.c index 50da745..674fcbc 100644 --- a/src/ui.c +++ b/src/ui.c @@ -720,8 +720,8 @@ void ui_library_refresh(omnplay_instance_t* app, GtkWidget **p_win, GtkWidget ** win = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(win), _("Library refreshing...")); gtk_window_set_default_size(GTK_WINDOW(win), 250, 100); - gtk_window_set_modal(GTK_WINDOW(win), TRUE); - gtk_window_set_transient_for(GTK_WINDOW(win), GTK_WINDOW(app->window)); +// gtk_window_set_modal(GTK_WINDOW(win), TRUE); +// gtk_window_set_transient_for(GTK_WINDOW(win), GTK_WINDOW(app->window)); // gtk_window_set_deletable(GTK_WINDOW(win), FALSE); // gtk_window_set_resizable(GTK_WINDOW(win), FALSE); diff --git a/src/ui_buttons.c b/src/ui_buttons.c index 4d0f35e..99b6a5b 100644 --- a/src/ui_buttons.c +++ b/src/ui_buttons.c @@ -52,7 +52,7 @@ static const button_desc_t buttons[] = { { BUTTON_PLAYLIST_ITEM_ADD, - "Add item to playlist", + "Add item to playlist (Insert)", NULL, NULL, "button_playlist_add", @@ -60,7 +60,7 @@ static const button_desc_t buttons[] = }, { BUTTON_PLAYLIST_ITEM_EDIT, - "Edit item in playlist", + "Edit item in playlist (E)", NULL, NULL, "button_playlist_edit", @@ -68,7 +68,7 @@ static const button_desc_t buttons[] = }, { BUTTON_PLAYLIST_ITEM_DEL, - "Delete item from playlist", + "Delete item from playlist (Del)", NULL, NULL, "button_playlist_del", @@ -76,7 +76,7 @@ static const button_desc_t buttons[] = }, { BUTTON_PLAYLIST_ITEM_UP, - "Move item ebove", + "Move item ebove (Ctrl-UP)", NULL, NULL, "button_playlist_up", @@ -84,7 +84,7 @@ static const button_desc_t buttons[] = }, { BUTTON_PLAYLIST_ITEM_DOWN, - "Move item below", + "Move item below (Ctrl-DOWN)", NULL, NULL, "button_playlist_down", @@ -92,7 +92,7 @@ static const button_desc_t buttons[] = }, { BUTTON_PLAYLIST_LOAD, - "Load playlist", + "Load playlist (Ctrl-O)", NULL, NULL, "button_playlist_load", @@ -100,7 +100,7 @@ static const button_desc_t buttons[] = }, { BUTTON_PLAYLIST_SAVE, - "Save playlist", + "Save playlist (Ctrl-S)", NULL, NULL, "button_playlist_load", @@ -124,7 +124,7 @@ static const button_desc_t buttons[] = }, { BUTTON_PLAYER_CUE, - "Cue block", + "Cue block (Enter)", NULL, NULL, "button_playlist_cue", @@ -132,7 +132,7 @@ static const button_desc_t buttons[] = }, { BUTTON_PLAYER_PLAY, - "Play", + "Play (Space)", NULL, NULL, "button_playlist_play", @@ -156,7 +156,7 @@ static const button_desc_t buttons[] = }, { BUTTON_LIBRARY_ADD, - "Add to playlist", + "Add to playlist (Enter)", NULL, NULL, "button_library_add", @@ -164,7 +164,7 @@ static const button_desc_t buttons[] = }, { BUTTON_LIBRARY_REFRESH, - "Refresh library", + "Refresh library (F5)", NULL, NULL, "button_library_refresh", -- 1.7.4.4 From f1bfac97adfa55e2b3f96831656d1b4c0d881a41 Mon Sep 17 00:00:00 2001 From: Maksym Veremeyenko Date: Sat, 25 Jun 2011 11:32:47 +0300 Subject: [PATCH 03/16] use GThread for library refresh proc --- src/library.c | 24 +++++++++++------------- src/omnplay.h | 3 +-- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/library.c b/src/library.c index ab6cee7..d2e73f3 100644 --- a/src/library.c +++ b/src/library.c @@ -237,17 +237,15 @@ static void* omnplay_library_refresh_proc(void* data) int count, i; playlist_item_t* items; -#ifndef _WIN32 gdk_threads_enter(); -#endif /* _WIN32 */ + /* create UI for monitoring update */ ui_library_refresh(app, &refresh_ui[0], &refresh_ui[1]); gtk_widget_show_all(refresh_ui[0]); gtk_window_present(GTK_WINDOW(refresh_ui[0])); -#ifndef _WIN32 + gdk_flush(); gdk_threads_leave(); -#endif /* _WIN32 */ items = (playlist_item_t*)malloc(sizeof(playlist_item_t) * MAX_LIBRARY_ITEMS); @@ -263,6 +261,11 @@ static void* omnplay_library_refresh_proc(void* data) if(app->library.whois[0]) omnplay_whois_list(app, items, &count); + gdk_threads_enter(); + gtk_label_set_text(GTK_LABEL(refresh_ui[1]), "Setting library..."); + gdk_flush(); + gdk_threads_leave(); + pthread_mutex_lock(&app->library.lock); for(i = 0; i < count; i++) @@ -287,26 +290,21 @@ static void* omnplay_library_refresh_proc(void* data) gdk_flush(); gdk_threads_leave(); -#ifndef _WIN32 gdk_threads_enter(); -#endif /* _WIN32 */ gtk_widget_destroy(refresh_ui[0]); -#ifndef _WIN32 gdk_flush(); gdk_threads_leave(); -#endif /* _WIN32 */ return NULL; }; void omnplay_library_refresh(omnplay_instance_t* app) { - if(app->library.refresh_thread_r) - pthread_join(app->library.refresh_thread, NULL); - app->library.refresh_thread_r = 1; + if(app->library.refresh_thread) + g_thread_join(app->library.refresh_thread); - pthread_create(&app->library.refresh_thread, NULL, - omnplay_library_refresh_proc, app); + app->library.refresh_thread = g_thread_create( + omnplay_library_refresh_proc, app, TRUE, NULL); }; void omnplay_library_draw(omnplay_instance_t* app) diff --git a/src/omnplay.h b/src/omnplay.h index 1fdec39..e70d78b 100644 --- a/src/omnplay.h +++ b/src/omnplay.h @@ -155,8 +155,7 @@ typedef struct omnplay_instance char filename[PATH_MAX]; char whois[PATH_MAX]; pthread_mutex_t lock; - pthread_t refresh_thread; - int refresh_thread_r; + GThread* refresh_thread; GtkWidget *search; } library; struct -- 1.7.4.4 From 748793d57e5c7789957916de4f88c601ec2d00a5 Mon Sep 17 00:00:00 2001 From: Maksym Veremeyenko Date: Sat, 25 Jun 2011 11:59:58 +0300 Subject: [PATCH 04/16] revert switch to non-modal windows --- src/ui.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui.c b/src/ui.c index 674fcbc..50da745 100644 --- a/src/ui.c +++ b/src/ui.c @@ -720,8 +720,8 @@ void ui_library_refresh(omnplay_instance_t* app, GtkWidget **p_win, GtkWidget ** win = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(win), _("Library refreshing...")); gtk_window_set_default_size(GTK_WINDOW(win), 250, 100); -// gtk_window_set_modal(GTK_WINDOW(win), TRUE); -// gtk_window_set_transient_for(GTK_WINDOW(win), GTK_WINDOW(app->window)); + gtk_window_set_modal(GTK_WINDOW(win), TRUE); + gtk_window_set_transient_for(GTK_WINDOW(win), GTK_WINDOW(app->window)); // gtk_window_set_deletable(GTK_WINDOW(win), FALSE); // gtk_window_set_resizable(GTK_WINDOW(win), FALSE); -- 1.7.4.4 From d9d86d1a5d860fbfd2213c2c3286011d4f1b3fad Mon Sep 17 00:00:00 2001 From: Maksym Veremeyenko Date: Sat, 25 Jun 2011 12:06:29 +0300 Subject: [PATCH 05/16] move omneon status threads to GThread --- src/omnplay.cpp | 16 +++++----------- src/omnplay.h | 2 +- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/omnplay.cpp b/src/omnplay.cpp index 8213402..801cbaa 100644 --- a/src/omnplay.cpp +++ b/src/omnplay.cpp @@ -1241,24 +1241,19 @@ void omnplay_init(omnplay_instance_t* app) /* create lock */ pthread_mutex_init(&app->players.lock, &attr); + pthread_mutex_init(&app->playlist.lock, &attr); + pthread_mutex_init(&app->library.lock, &attr); /* create a omneon status thread */ for(i = 0; i < app->players.count; i++) - pthread_create(&app->players.item[i].thread, NULL, - omnplay_thread_proc, &app->players.item[i]); - - - /* create lock */ - pthread_mutex_init(&app->playlist.lock, &attr); + app->players.item[i].thread = g_thread_create( + omnplay_thread_proc, &app->players.item[i], TRUE, NULL); /* attach buttons click */ for(i = 1; i < BUTTON_LAST; i++) gtk_signal_connect(GTK_OBJECT(app->buttons[i]), "clicked", GTK_SIGNAL_FUNC( on_button_click), app ); - /* create lock */ - pthread_mutex_init(&app->library.lock, &attr); - /* load library */ omnplay_library_load(app); @@ -1268,13 +1263,12 @@ void omnplay_init(omnplay_instance_t* app) void omnplay_release(omnplay_instance_t* app) { int i; - void* r; app->f_exit = 1; for(i = 0; i < app->players.count; i++) /* create a omneon status thread */ - pthread_join(app->players.item[i].thread, &r); + g_thread_join(app->players.item[i].thread); /* destroy lock */ pthread_mutex_destroy(&app->players.lock); diff --git a/src/omnplay.h b/src/omnplay.h index e70d78b..de4e942 100644 --- a/src/omnplay.h +++ b/src/omnplay.h @@ -117,7 +117,7 @@ typedef struct omnplay_player char name[PATH_MAX]; char host[PATH_MAX]; void* handle; - pthread_t thread; + GThread* thread; GtkWidget *label_status, *label_state, *label_tc_cur, *label_tc_rem, *label_clip; struct omnplay_instance *app; int playlist_start; -- 1.7.4.4 From 87eb3dd37b216b347359aedac6ed40f905270320 Mon Sep 17 00:00:00 2001 From: Maksym Veremeyenko Date: Sat, 25 Jun 2011 12:17:15 +0300 Subject: [PATCH 06/16] add a find_index_of_playlist_item checks --- src/omnplay.cpp | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/src/omnplay.cpp b/src/omnplay.cpp index 801cbaa..0d64463 100644 --- a/src/omnplay.cpp +++ b/src/omnplay.cpp @@ -124,6 +124,9 @@ void omnplay_destroy(omnplay_instance_t* app) static int find_index_of_playlist_item(omnplay_instance_t* app, int start, int idx) { + if(start < 0 || start >= app->playlist.count) + return -1; + while(1) { if(app->playlist.item[start].omn_idx == idx) @@ -226,6 +229,9 @@ static void* omnplay_thread_proc(void* data) g_warning("omnplay_thread_proc\n"); + memset(&st_curr, 0, sizeof(OmPlrStatus)); + memset(&st_prev, 0, sizeof(OmPlrStatus)); + /* connect */ pthread_mutex_lock(&player->app->players.lock); r = OmPlrOpen(player->host, player->name, (OmPlrHandle*)&player->handle); -- 1.7.4.4 From f717f5b0949cf55190ebe9bb41aa07fa7fd545e1 Mon Sep 17 00:00:00 2001 From: Maksym Veremeyenko Date: Sat, 25 Jun 2011 13:57:54 +0300 Subject: [PATCH 07/16] drop library update window --- src/library.c | 34 +++++++++++++--------------------- src/omnplay.cpp | 9 +++++++++ src/omnplay.h | 1 + src/ui.c | 23 ----------------------- src/ui.h | 1 - 5 files changed, 23 insertions(+), 45 deletions(-) diff --git a/src/library.c b/src/library.c index d2e73f3..db9ff24 100644 --- a/src/library.c +++ b/src/library.c @@ -224,47 +224,34 @@ void omnplay_library_save(omnplay_instance_t* app) static void omnplay_get_content_cb(omnplay_instance_t* app, playlist_item_t* item, void* data) { - gdk_threads_enter(); - gtk_label_set_text(GTK_LABEL(data), item->id); - gdk_flush(); - gdk_threads_leave(); + omnplay_set_status(app, item->id); }; static void* omnplay_library_refresh_proc(void* data) { - GtkWidget *refresh_ui[2]; omnplay_instance_t* app = (omnplay_instance_t*)data; int count, i; playlist_item_t* items; gdk_threads_enter(); - - /* create UI for monitoring update */ - ui_library_refresh(app, &refresh_ui[0], &refresh_ui[1]); - gtk_widget_show_all(refresh_ui[0]); - gtk_window_present(GTK_WINDOW(refresh_ui[0])); - + gtk_widget_set_sensitive(app->window, FALSE); gdk_flush(); gdk_threads_leave(); + omnplay_set_status(app, "Updating library..."); + items = (playlist_item_t*)malloc(sizeof(playlist_item_t) * MAX_LIBRARY_ITEMS); - count = omnplay_get_content(app, items, MAX_LIBRARY_ITEMS, omnplay_get_content_cb, refresh_ui[1]); + count = omnplay_get_content(app, items, MAX_LIBRARY_ITEMS, omnplay_get_content_cb, NULL); if(count > 0) { - gdk_threads_enter(); - gtk_label_set_text(GTK_LABEL(refresh_ui[1]), "Quering whois..."); - gdk_flush(); - gdk_threads_leave(); + omnplay_set_status(app, "Quering whois..."); if(app->library.whois[0]) omnplay_whois_list(app, items, &count); - gdk_threads_enter(); - gtk_label_set_text(GTK_LABEL(refresh_ui[1]), "Setting library..."); - gdk_flush(); - gdk_threads_leave(); + omnplay_set_status(app, "Setting library..."); pthread_mutex_lock(&app->library.lock); @@ -283,6 +270,8 @@ static void* omnplay_library_refresh_proc(void* data) gdk_threads_leave(); }; + omnplay_set_status(app, "Normalizing playlist..."); + free(items); gdk_threads_enter(); @@ -290,11 +279,14 @@ static void* omnplay_library_refresh_proc(void* data) gdk_flush(); gdk_threads_leave(); + omnplay_set_status(app, ""); + gdk_threads_enter(); - gtk_widget_destroy(refresh_ui[0]); + gtk_widget_set_sensitive(app->window, TRUE); gdk_flush(); gdk_threads_leave(); + return NULL; }; diff --git a/src/omnplay.cpp b/src/omnplay.cpp index 0d64463..8c2bafc 100644 --- a/src/omnplay.cpp +++ b/src/omnplay.cpp @@ -1298,3 +1298,12 @@ void omnplay_playlist_normalize(omnplay_instance_t* app) if(omnplay_library_normalize_item(app, &app->playlist.item[i])) omnplay_playlist_draw_item(app, i); }; + +void omnplay_set_status(omnplay_instance_t* app, char* str) +{ + gdk_threads_enter(); +// gtk_label_set_text(GTK_LABEL(data), str); + gdk_flush(); + gdk_threads_leave(); +}; + diff --git a/src/omnplay.h b/src/omnplay.h index de4e942..f5051e5 100644 --- a/src/omnplay.h +++ b/src/omnplay.h @@ -188,6 +188,7 @@ int omnplay_library_normalize_item(omnplay_instance_t* app, playlist_item_t* ite playlist_item_t* omnplay_library_get_selected(omnplay_instance_t* app, int *count); void omnplay_playlist_normalize(omnplay_instance_t* app); void omnplay_library_search(omnplay_instance_t* app, int next); +void omnplay_set_status(omnplay_instance_t* app, char* str); #ifdef __cplusplus }; diff --git a/src/ui.c b/src/ui.c index 50da745..97d01be 100644 --- a/src/ui.c +++ b/src/ui.c @@ -712,26 +712,3 @@ int ui_playlist_item_dialog(omnplay_instance_t* app, playlist_item_t* item) return r; }; - -void ui_library_refresh(omnplay_instance_t* app, GtkWidget **p_win, GtkWidget **p_label) -{ - GtkWidget *win, *box, *label; - - win = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_title(GTK_WINDOW(win), _("Library refreshing...")); - gtk_window_set_default_size(GTK_WINDOW(win), 250, 100); - gtk_window_set_modal(GTK_WINDOW(win), TRUE); - gtk_window_set_transient_for(GTK_WINDOW(win), GTK_WINDOW(app->window)); -// gtk_window_set_deletable(GTK_WINDOW(win), FALSE); -// gtk_window_set_resizable(GTK_WINDOW(win), FALSE); - - box = gtk_vbox_new(FALSE, 0); - gtk_widget_show(box); - gtk_container_add(GTK_CONTAINER(win), box); - - label = create_label(NULL, "Requsting status...", NULL, 0), - gtk_box_pack_start (GTK_BOX(box), label, TRUE, TRUE, 0); - - *p_win = win; - *p_label = label; -}; diff --git a/src/ui.h b/src/ui.h index 9890138..0e313a1 100644 --- a/src/ui.h +++ b/src/ui.h @@ -29,7 +29,6 @@ extern "C" GtkWidget* ui_omnplay(omnplay_instance_t* app); int ui_playlist_item_dialog(omnplay_instance_t* app, playlist_item_t* item); -void ui_library_refresh(omnplay_instance_t* app, GtkWidget **p_win, GtkWidget **p_label); #ifdef __cplusplus }; -- 1.7.4.4 From 4c546648c90359fcbc9695c1c9139d7368462c09 Mon Sep 17 00:00:00 2001 From: Maksym Veremeyenko Date: Sat, 25 Jun 2011 14:04:54 +0300 Subject: [PATCH 08/16] mininal status string implementation --- src/omnplay.cpp | 2 +- src/omnplay.h | 1 + src/ui.c | 14 ++++++++++++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/omnplay.cpp b/src/omnplay.cpp index 8c2bafc..ae8cc9b 100644 --- a/src/omnplay.cpp +++ b/src/omnplay.cpp @@ -1302,7 +1302,7 @@ void omnplay_playlist_normalize(omnplay_instance_t* app) void omnplay_set_status(omnplay_instance_t* app, char* str) { gdk_threads_enter(); -// gtk_label_set_text(GTK_LABEL(data), str); + gtk_label_set_text(GTK_LABEL(app->status_label), str); gdk_flush(); gdk_threads_leave(); }; diff --git a/src/omnplay.h b/src/omnplay.h index f5051e5..de3c756 100644 --- a/src/omnplay.h +++ b/src/omnplay.h @@ -130,6 +130,7 @@ typedef struct omnplay_instance GtkWidget *playlist_grid; GtkWidget *library_grid; GtkWidget *buttons[BUTTON_LAST + 1]; + GtkWidget *status_label; struct { omnplay_player_t item[MAX_PLAYERS]; diff --git a/src/ui.c b/src/ui.c index 97d01be..a202491 100644 --- a/src/ui.c +++ b/src/ui.c @@ -560,6 +560,7 @@ static GtkWidget* pane_top(GtkWidget* top, omnplay_instance_t* app) GtkWidget* ui_omnplay (omnplay_instance_t* app) { GtkWidget *wnd; + GtkWidget* vbox; wnd = gtk_window_new (GTK_WINDOW_TOPLEVEL); GLADE_HOOKUP_OBJECT_NO_REF (wnd, wnd, "omnplay_window"); @@ -567,8 +568,17 @@ GtkWidget* ui_omnplay (omnplay_instance_t* app) gtk_window_set_title (GTK_WINDOW (wnd), _("Omneon Player")); gtk_window_set_default_size (GTK_WINDOW (wnd), 1024, 768); - gtk_container_add (GTK_CONTAINER (wnd), - pane_top(wnd, app)); + vbox = gtk_vbox_new(FALSE, 0); + gtk_widget_show(vbox); + + gtk_container_add(GTK_CONTAINER(wnd), vbox); + + gtk_box_pack_start (GTK_BOX (vbox), + pane_top(wnd, app), + TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (vbox), + app->status_label = create_label(wnd, "omnplay started", NULL, GTK_JUSTIFY_LEFT), + FALSE, FALSE, 0); app->playlist.block_icons[OMNPLAY_PLAYLIST_ITEM_BLOCK_BEGIN] = create_pixbuf("block_type_block_start_16x16.png"); -- 1.7.4.4 From c9fcb8c1abd63643e6979a1b3037d116516cdb0e Mon Sep 17 00:00:00 2001 From: Maksym Veremeyenko Date: Sun, 26 Jun 2011 16:23:34 +0300 Subject: [PATCH 09/16] drag-n-drop skeleton added --- src/omnplay.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 51 insertions(+), 0 deletions(-) diff --git a/src/omnplay.cpp b/src/omnplay.cpp index ae8cc9b..87a0b31 100644 --- a/src/omnplay.cpp +++ b/src/omnplay.cpp @@ -1215,6 +1215,39 @@ static gboolean on_playlist_grid_button(GtkWidget *widget, GdkEventButton *event return FALSE; }; + + +static void library_grid_drag_data_get_cb(GtkWidget *widget, GdkDragContext *context, + GtkSelectionData *selection_data, guint info, guint time, gpointer userdata) +{ + g_warning("library_grid_drag_data_get_cb"); +}; + +static void playlist_grid_drag_data_get_cb(GtkWidget *widget, GdkDragContext *context, + GtkSelectionData *selection_data, guint info, guint time, gpointer userdata) +{ + g_warning("playlist_grid_drag_data_get_cb"); +}; + +static void library_grid_drag_begin_cb(GtkWidget *widget, GdkDragContext *context, gpointer userdata) +{ + g_warning("library_grid_drag_begin_cb"); + gtk_drag_source_set_icon_stock(widget, GTK_STOCK_DND); +}; + +static void playlist_grid_drag_begin_cb(GtkWidget *widget, GdkDragContext *context, gpointer userdata) +{ + g_warning("playlist_grid_drag_begin_cb"); + gtk_drag_source_set_icon_stock(widget, GTK_STOCK_DND); +}; + +static void playlist_grid_drag_data_received(GtkWidget *widget, GdkDragContext *context, + gint x, gint y, GtkSelectionData *selection_data, guint info, guint time, gpointer userdata) +{ + g_warning("playlist_grid_drag_data_received"); +}; + + void omnplay_init(omnplay_instance_t* app) { int i; @@ -1264,6 +1297,24 @@ void omnplay_init(omnplay_instance_t* app) omnplay_library_load(app); pthread_mutexattr_destroy(&attr); + + /* setup drag n drop source/target */ + static GtkTargetEntry drag_targets[] = { { (char*) "STRING", 0, 1978 } }; + + gtk_drag_source_set(app->library_grid, GDK_BUTTON1_MASK, + drag_targets, 1, (GdkDragAction)(GDK_ACTION_COPY)); + + gtk_drag_source_set(app->playlist_grid, GDK_BUTTON1_MASK, + drag_targets, 1, (GdkDragAction)(GDK_ACTION_COPY | GDK_ACTION_MOVE)); + + gtk_drag_dest_set(app->playlist_grid, GTK_DEST_DEFAULT_ALL, + drag_targets, 1, (GdkDragAction)(GDK_ACTION_COPY | GDK_ACTION_MOVE)); + + g_signal_connect (app->library_grid, "drag_data_get", G_CALLBACK(library_grid_drag_data_get_cb), app); + g_signal_connect (app->playlist_grid, "drag_data_get", G_CALLBACK(playlist_grid_drag_data_get_cb), app); + g_signal_connect (app->library_grid, "drag_begin", G_CALLBACK(library_grid_drag_begin_cb), app); + g_signal_connect (app->playlist_grid, "drag_begin", G_CALLBACK(playlist_grid_drag_begin_cb), app); + g_signal_connect (app->playlist_grid, "drag_data_received", G_CALLBACK (playlist_grid_drag_data_received), app); }; void omnplay_release(omnplay_instance_t* app) -- 1.7.4.4 From ea4e0507bfe0da78db0ce013c455e76b6b900529 Mon Sep 17 00:00:00 2001 From: Maksym Veremeyenko Date: Sun, 26 Jun 2011 17:56:24 +0300 Subject: [PATCH 10/16] minimal drag-n-drop from library code added --- src/omnplay.cpp | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 61 insertions(+), 1 deletions(-) diff --git a/src/omnplay.cpp b/src/omnplay.cpp index 87a0b31..8fe16ee 100644 --- a/src/omnplay.cpp +++ b/src/omnplay.cpp @@ -1220,7 +1220,21 @@ static gboolean on_playlist_grid_button(GtkWidget *widget, GdkEventButton *event static void library_grid_drag_data_get_cb(GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection_data, guint info, guint time, gpointer userdata) { + int c; + playlist_item_t* items; + omnplay_instance_t* app = (omnplay_instance_t*)userdata; + g_warning("library_grid_drag_data_get_cb"); + + items = omnplay_library_get_selected(app, &c); + + /* clear item */ + if(items) + { + gtk_selection_data_set(selection_data, selection_data->target, 8, + (const guchar *)items, sizeof(playlist_item_t) * c); + free(items); + }; }; static void playlist_grid_drag_data_get_cb(GtkWidget *widget, GdkDragContext *context, @@ -1244,7 +1258,53 @@ static void playlist_grid_drag_begin_cb(GtkWidget *widget, GdkDragContext *conte static void playlist_grid_drag_data_received(GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint info, guint time, gpointer userdata) { + int c, i, idx; + playlist_item_type_t t; + playlist_item_t* items; + GtkTreePath *path = NULL; + omnplay_instance_t* app = (omnplay_instance_t*)userdata; + g_warning("playlist_grid_drag_data_received"); + + items = (playlist_item_t*)gtk_selection_data_get_data(selection_data); + c = gtk_selection_data_get_length(selection_data); + + if(c % sizeof(playlist_item_t)) + { + g_warning("playlist_grid_drag_data_received: ODD ITEMS"); + } + else + { + c /= sizeof(playlist_item_t); + + if(gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), x, y, &path, NULL, NULL, NULL)) + { + idx = gtk_tree_path_get_indices(path)[0]; + gtk_tree_path_free(path); + + g_warning("playlist_grid_drag_data_received: gtk_tree_path_get_indice[0]=%d", idx); + + /* normalize, FIX ME */ + idx--; if(idx < 0) idx = 0; + } + else + idx = app->playlist.count; + + g_warning("playlist_grid_drag_data_received: idx=%d", idx); + + if(omnplay_playlist_insert_check(app, idx, &t)) + { + for(i = 0; i < c; i++) + { + items[i].type = t; + items[i].error = 0; + }; + omnplay_playlist_insert_items(app, idx, items, c); + }; + }; + + /* Finish the drag */ + gtk_drag_finish(context, TRUE, FALSE, time); }; @@ -1299,7 +1359,7 @@ void omnplay_init(omnplay_instance_t* app) pthread_mutexattr_destroy(&attr); /* setup drag n drop source/target */ - static GtkTargetEntry drag_targets[] = { { (char*) "STRING", 0, 1978 } }; + static GtkTargetEntry drag_targets[] = { { (char*) "application/playlist_item_t", 0, 0 } }; gtk_drag_source_set(app->library_grid, GDK_BUTTON1_MASK, drag_targets, 1, (GdkDragAction)(GDK_ACTION_COPY)); -- 1.7.4.4 From 431d1c404d9ab8f53d61375f29044b5741853229 Mon Sep 17 00:00:00 2001 From: Maksym Veremeyenko Date: Sun, 26 Jun 2011 20:12:36 +0300 Subject: [PATCH 11/16] minimal playlist rows drag --- src/omnplay.cpp | 16 +++++++++++++++- 1 files changed, 15 insertions(+), 1 deletions(-) diff --git a/src/omnplay.cpp b/src/omnplay.cpp index 8fe16ee..905edee 100644 --- a/src/omnplay.cpp +++ b/src/omnplay.cpp @@ -1240,7 +1240,21 @@ static void library_grid_drag_data_get_cb(GtkWidget *widget, GdkDragContext *con static void playlist_grid_drag_data_get_cb(GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection_data, guint info, guint time, gpointer userdata) { - g_warning("playlist_grid_drag_data_get_cb"); + int *list, i; + playlist_item_t* items; + omnplay_instance_t* app = (omnplay_instance_t*)userdata; + + list = get_selected_items_playlist(app); + if(!list) return; + + items = (playlist_item_t*)malloc(sizeof(playlist_item_t) * list[0]); + for(i = 0; i < list[0]; i++) + items[i] = app->playlist.item[list[i + 1]]; + gtk_selection_data_set(selection_data, selection_data->target, 8, + (const guchar *)items, sizeof(playlist_item_t) * list[0]); + + free(items); + free(list); }; static void library_grid_drag_begin_cb(GtkWidget *widget, GdkDragContext *context, gpointer userdata) -- 1.7.4.4 From df482032dda64bf46dd2913318767257956d2ba0 Mon Sep 17 00:00:00 2001 From: Maksym Veremeyenko Date: Mon, 27 Jun 2011 12:32:46 +0300 Subject: [PATCH 12/16] minimal playlist drag-n-drop functionality implemented --- src/omnplay.cpp | 52 +++++++++++++++++++++++++++++++++++++++++++--------- src/omnplay.h | 1 + 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/src/omnplay.cpp b/src/omnplay.cpp index 905edee..f8d9930 100644 --- a/src/omnplay.cpp +++ b/src/omnplay.cpp @@ -481,10 +481,9 @@ static omnplay_player_t *get_player_at_pos(omnplay_instance_t* app, int pos) return NULL; }; -static void omnplay_playlist_delete_items(omnplay_instance_t* app, int* idxs, int count) +static void omnplay_playlist_delete_items(omnplay_instance_t* app, int* idxs, int count, int sel) { int i, j, idx; - GtkTreePath* path; pthread_mutex_lock(&app->playlist.lock); pthread_mutex_lock(&app->players.lock); @@ -528,11 +527,14 @@ static void omnplay_playlist_delete_items(omnplay_instance_t* app, int* idxs, in omnplay_playlist_draw(app); /* select */ - path = gtk_tree_path_new_from_indices(idxs[0], -1); - gtk_tree_selection_select_path(gtk_tree_view_get_selection(GTK_TREE_VIEW(app->playlist_grid)), path); - gtk_tree_view_set_cursor(GTK_TREE_VIEW(app->playlist_grid), path, NULL, FALSE); - gtk_tree_path_free(path); - + if(sel) + { + GtkTreePath* path; + path = gtk_tree_path_new_from_indices(idxs[0], -1); + gtk_tree_selection_select_path(gtk_tree_view_get_selection(GTK_TREE_VIEW(app->playlist_grid)), path); + gtk_tree_view_set_cursor(GTK_TREE_VIEW(app->playlist_grid), path, NULL, FALSE); + gtk_tree_path_free(path); + }; pthread_mutex_unlock(&app->players.lock); pthread_mutex_unlock(&app->playlist.lock); @@ -559,7 +561,7 @@ static void omnplay_playlist_item_del(omnplay_instance_t* app) }; if(c) - omnplay_playlist_delete_items(app, list2, c); + omnplay_playlist_delete_items(app, list2, c, 1); free(list2); free(list); @@ -1247,9 +1249,17 @@ static void playlist_grid_drag_data_get_cb(GtkWidget *widget, GdkDragContext *co list = get_selected_items_playlist(app); if(!list) return; + /* clear delete flag */ + for(i = 0; i < app->playlist.count; i++) + app->playlist.item[i].del = 0; + items = (playlist_item_t*)malloc(sizeof(playlist_item_t) * list[0]); for(i = 0; i < list[0]; i++) + { items[i] = app->playlist.item[list[i + 1]]; + if(context->action == GDK_ACTION_MOVE) + app->playlist.item[list[i + 1]].del = 1; + } gtk_selection_data_set(selection_data, selection_data->target, 8, (const guchar *)items, sizeof(playlist_item_t) * list[0]); @@ -1278,7 +1288,7 @@ static void playlist_grid_drag_data_received(GtkWidget *widget, GdkDragContext * GtkTreePath *path = NULL; omnplay_instance_t* app = (omnplay_instance_t*)userdata; - g_warning("playlist_grid_drag_data_received"); + g_warning("playlist_grid_drag_data_received: context->action=%d", context->action); items = (playlist_item_t*)gtk_selection_data_get_data(selection_data); c = gtk_selection_data_get_length(selection_data); @@ -1321,6 +1331,29 @@ static void playlist_grid_drag_data_received(GtkWidget *widget, GdkDragContext * gtk_drag_finish(context, TRUE, FALSE, time); }; +static void playlist_grid_drag_data_delete(GtkWidget *widget, GdkDragContext *context, gpointer userdata) +{ + int c, i, *list; + omnplay_instance_t* app = (omnplay_instance_t*)userdata; + + g_warning("playlist_grid_drag_data_delete"); + + list = (int*)malloc(sizeof(int) * MAX_PLAYLIST_ITEMS); + + for(i = 0, c = 0; i < app->playlist.count; i++) + if(app->playlist.item[i].del) + if(!idx_in_players_range(app, i)) + { + /* save index */ + list[c++] = i; + g_warning("playlist_grid_drag_data_delete: i=%d, c=%d", i, c); + }; + + if(c) + omnplay_playlist_delete_items(app, list, c, 0); + + free(list); +}; void omnplay_init(omnplay_instance_t* app) { @@ -1389,6 +1422,7 @@ void omnplay_init(omnplay_instance_t* app) g_signal_connect (app->library_grid, "drag_begin", G_CALLBACK(library_grid_drag_begin_cb), app); g_signal_connect (app->playlist_grid, "drag_begin", G_CALLBACK(playlist_grid_drag_begin_cb), app); g_signal_connect (app->playlist_grid, "drag_data_received", G_CALLBACK (playlist_grid_drag_data_received), app); + g_signal_connect (app->playlist_grid, "drag_data_delete", G_CALLBACK (playlist_grid_drag_data_delete), app); }; void omnplay_release(omnplay_instance_t* app) diff --git a/src/omnplay.h b/src/omnplay.h index de3c756..638247e 100644 --- a/src/omnplay.h +++ b/src/omnplay.h @@ -105,6 +105,7 @@ typedef struct playlist_item int omn_idx; int omn_offset; int error; + int del; } playlist_item_t; #define MAX_PLAYERS 4 -- 1.7.4.4 From 3b734bdf296b2d0888924661c6bffeeb62088996 Mon Sep 17 00:00:00 2001 From: Maksym Veremeyenko Date: Mon, 27 Jun 2011 12:37:37 +0300 Subject: [PATCH 13/16] make omnplay_selected_idxs_playlist public function --- src/omnplay.cpp | 12 ++++++------ src/omnplay.h | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/omnplay.cpp b/src/omnplay.cpp index f8d9930..18ea978 100644 --- a/src/omnplay.cpp +++ b/src/omnplay.cpp @@ -307,7 +307,7 @@ void get_selected_items_playlist_proc(GtkTreeModel *model, GtkTreePath *path, Gt list[0] = list[0] + 1; }; -static int* get_selected_items_playlist(omnplay_instance_t* app) +int* omnplay_selected_idxs_playlist(omnplay_instance_t* app) { int* list = NULL; GtkTreeSelection *selection; @@ -385,7 +385,7 @@ static int idxs_in_players_range(omnplay_instance_t* app, int start, int stop) static void omnplay_playlist_block(omnplay_instance_t* app, control_buttons_t button) { int start, stop, r, i; - int* list = get_selected_items_playlist(app); + int* list = omnplay_selected_idxs_playlist(app); if(!list) return; @@ -440,7 +440,7 @@ static void omnplay_playlist_block(omnplay_instance_t* app, control_buttons_t bu static int get_first_selected_item_playlist(omnplay_instance_t* app) { int idx; - int* list = get_selected_items_playlist(app); + int* list = omnplay_selected_idxs_playlist(app); if(!list) return -1; idx = list[1]; free(list); @@ -545,7 +545,7 @@ static void omnplay_playlist_item_del(omnplay_instance_t* app) int i, idx, c; int *list, *list2; - list = get_selected_items_playlist(app); + list = omnplay_selected_idxs_playlist(app); if(!list) return; list2 = (int*)malloc(sizeof(int) * list[0]); @@ -1016,7 +1016,7 @@ static void omnplay_playlist_item_copy(omnplay_instance_t* app) { int *list, i; - list = get_selected_items_playlist(app); + list = omnplay_selected_idxs_playlist(app); if(!list) return; for(i = 0; i < list[0]; i++) @@ -1246,7 +1246,7 @@ static void playlist_grid_drag_data_get_cb(GtkWidget *widget, GdkDragContext *co playlist_item_t* items; omnplay_instance_t* app = (omnplay_instance_t*)userdata; - list = get_selected_items_playlist(app); + list = omnplay_selected_idxs_playlist(app); if(!list) return; /* clear delete flag */ diff --git a/src/omnplay.h b/src/omnplay.h index 638247e..aad4ade 100644 --- a/src/omnplay.h +++ b/src/omnplay.h @@ -191,6 +191,7 @@ playlist_item_t* omnplay_library_get_selected(omnplay_instance_t* app, int *coun void omnplay_playlist_normalize(omnplay_instance_t* app); void omnplay_library_search(omnplay_instance_t* app, int next); void omnplay_set_status(omnplay_instance_t* app, char* str); +int* omnplay_selected_idxs_playlist(omnplay_instance_t* app); #ifdef __cplusplus }; -- 1.7.4.4 From b044f027724741a08a34a28988c94cb0eb07dd5b Mon Sep 17 00:00:00 2001 From: Maksym Veremeyenko Date: Mon, 27 Jun 2011 12:42:00 +0300 Subject: [PATCH 14/16] save selection after playlist redraw --- src/playlist.c | 16 ++++++++++++++++ 1 files changed, 16 insertions(+), 0 deletions(-) diff --git a/src/playlist.c b/src/playlist.c index 0644f7f..aec310d 100644 --- a/src/playlist.c +++ b/src/playlist.c @@ -257,10 +257,13 @@ void omnplay_playlist_save(omnplay_instance_t* app) void omnplay_playlist_draw(omnplay_instance_t* app) { int i; + int* sels; char tc1[12], tc2[12]; GtkListStore *list_store; GtkTreeIter iter; + sels = omnplay_selected_idxs_playlist(app); + list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(app->playlist_grid))); gtk_list_store_clear(list_store); @@ -286,6 +289,19 @@ void omnplay_playlist_draw(omnplay_instance_t* app) app->playlist.ver_prev = app->playlist.ver_curr; + if(sels) + { + GtkTreePath *path; + + /* select */ + path = gtk_tree_path_new_from_indices(sels[1], -1); + gtk_tree_selection_select_path(gtk_tree_view_get_selection(GTK_TREE_VIEW(app->playlist_grid)), path); + gtk_tree_view_set_cursor(GTK_TREE_VIEW(app->playlist_grid), path, NULL, FALSE); + gtk_tree_path_free(path); + + free(sels); + }; + pthread_mutex_unlock(&app->playlist.lock); }; -- 1.7.4.4 From afc27123fb65aa16cf42fd0cc5f0ac12820f2e85 Mon Sep 17 00:00:00 2001 From: Maksym Veremeyenko Date: Mon, 27 Jun 2011 12:42:16 +0300 Subject: [PATCH 15/16] select first inserted item --- src/omnplay.cpp | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/src/omnplay.cpp b/src/omnplay.cpp index 18ea978..3b32b4c 100644 --- a/src/omnplay.cpp +++ b/src/omnplay.cpp @@ -629,7 +629,7 @@ static void omnplay_playlist_insert_items(omnplay_instance_t* app, int idx, omnplay_playlist_draw(app); /* select */ - path = gtk_tree_path_new_from_indices(idx + count, -1); + path = gtk_tree_path_new_from_indices(idx, -1); gtk_tree_selection_select_path(gtk_tree_view_get_selection(GTK_TREE_VIEW(app->playlist_grid)), path); gtk_tree_view_set_cursor(GTK_TREE_VIEW(app->playlist_grid), path, NULL, FALSE); gtk_tree_path_free(path); -- 1.7.4.4 From b8d6baf21a4e1c3eeebc01e8a366d0cb0bf75f4c Mon Sep 17 00:00:00 2001 From: Maksym Veremeyenko Date: Mon, 27 Jun 2011 14:21:49 +0300 Subject: [PATCH 16/16] set GTK_TREE_VIEW_GRID_LINES_BOTH grid lines for all treeviews --- src/ui.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/src/ui.c b/src/ui.c index a202491..203b8f3 100644 --- a/src/ui.c +++ b/src/ui.c @@ -132,6 +132,7 @@ static GtkWidget* create_treeview(GtkWidget* top, char* name, const column_desc_ treeview = gtk_tree_view_new (); gtk_widget_show (treeview); gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE); + gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(treeview), GTK_TREE_VIEW_GRID_LINES_BOTH); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); -- 1.7.4.4