diff options
-rw-r--r-- | callbacks.c | 26 | ||||
-rw-r--r-- | callbacks.h | 8 | ||||
-rw-r--r-- | deadbeef.glade | 177 | ||||
-rw-r--r-- | gtkplaylist.c | 65 | ||||
-rw-r--r-- | gtkplaylist.h | 5 | ||||
-rw-r--r-- | interface.c | 66 |
6 files changed, 259 insertions, 88 deletions
diff --git a/callbacks.c b/callbacks.c index 3d13b550..e1f4c821 100644 --- a/callbacks.c +++ b/callbacks.c @@ -66,11 +66,13 @@ main_playlist_init (GtkWidget *widget) { main_playlist.playlist = widget; main_playlist.header = lookup_widget (mainwin, "header"); main_playlist.scrollbar = lookup_widget (mainwin, "playscroll"); + main_playlist.hscrollbar = lookup_widget (mainwin, "playhscroll"); main_playlist.pcurr = &playlist_current_ptr; main_playlist.pcount = &pl_count; main_playlist.iterator = PL_MAIN; main_playlist.multisel = 1; main_playlist.scrollpos = 0; + main_playlist.hscrollpos = 0; main_playlist.row = -1; main_playlist.clicktime = -1; main_playlist.nvisiblerows = 0; @@ -81,6 +83,7 @@ main_playlist_init (GtkWidget *widget) { gtk_object_set_data (GTK_OBJECT (main_playlist.playlist), "ps", &main_playlist); gtk_object_set_data (GTK_OBJECT (main_playlist.header), "ps", &main_playlist); gtk_object_set_data (GTK_OBJECT (main_playlist.scrollbar), "ps", &main_playlist); + gtk_object_set_data (GTK_OBJECT (main_playlist.hscrollbar), "ps", &main_playlist); } void @@ -91,6 +94,7 @@ search_playlist_init (GtkWidget *widget) { search_playlist.playlist = widget; search_playlist.header = lookup_widget (searchwin, "searchheader"); search_playlist.scrollbar = lookup_widget (searchwin, "searchscroll"); + search_playlist.hscrollbar = lookup_widget (searchwin, "searchhscroll"); assert (search_playlist.header); assert (search_playlist.scrollbar); // main_playlist.pcurr = &search_current; @@ -98,6 +102,7 @@ search_playlist_init (GtkWidget *widget) { search_playlist.multisel = 0; search_playlist.iterator = PL_SEARCH; search_playlist.scrollpos = 0; + search_playlist.hscrollpos = 0; search_playlist.row = -1; search_playlist.clicktime = -1; search_playlist.nvisiblerows = 0; @@ -108,6 +113,7 @@ search_playlist_init (GtkWidget *widget) { gtk_object_set_data (GTK_OBJECT (search_playlist.playlist), "ps", &search_playlist); gtk_object_set_data (GTK_OBJECT (search_playlist.header), "ps", &search_playlist); gtk_object_set_data (GTK_OBJECT (search_playlist.scrollbar), "ps", &search_playlist); + gtk_object_set_data (GTK_OBJECT (search_playlist.hscrollbar), "ps", &search_playlist); } // redraw @@ -1254,3 +1260,23 @@ on_help1_activate (GtkMenuItem *menuitem, gtk_widget_show (widget); } + +void +on_playhscroll_value_changed (GtkRange *widget, + gpointer user_data) +{ + GTKPL_PROLOGUE; + int newscroll = gtk_range_get_value (GTK_RANGE (widget)); + gtkpl_hscroll (ps, newscroll); +} + + +void +on_searchhscroll_value_changed (GtkRange *widget, + gpointer user_data) +{ + GTKPL_PROLOGUE; + int newscroll = gtk_range_get_value (GTK_RANGE (widget)); + gtkpl_hscroll (ps, newscroll); +} + diff --git a/callbacks.h b/callbacks.h index 31f122fd..120e7488 100644 --- a/callbacks.h +++ b/callbacks.h @@ -529,3 +529,11 @@ on_find_activate (GtkMenuItem *menuitem, void on_help1_activate (GtkMenuItem *menuitem, gpointer user_data); + +void +on_playhscroll_value_changed (GtkRange *range, + gpointer user_data); + +void +on_searchhscroll_value_changed (GtkRange *range, + gpointer user_data); diff --git a/deadbeef.glade b/deadbeef.glade index 7c80c293..7f734701 100644 --- a/deadbeef.glade +++ b/deadbeef.glade @@ -659,57 +659,73 @@ </child> <child> - <widget class="GtkHBox" id=" "> - <property name="border_width">3</property> + <widget class="GtkTable" id="table1"> <property name="visible">True</property> + <property name="n_rows">2</property> + <property name="n_columns">2</property> <property name="homogeneous">False</property> - <property name="spacing">0</property> + <property name="row_spacing">0</property> + <property name="column_spacing">0</property> <child> - <widget class="GtkVBox" id="vbox3"> + <widget class="GtkHBox" id=" "> + <property name="border_width">3</property> <property name="visible">True</property> <property name="homogeneous">False</property> <property name="spacing">0</property> <child> - <widget class="GtkDrawingArea" id="header"> - <property name="height_request">24</property> + <widget class="GtkVBox" id="vbox3"> <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <signal name="expose_event" handler="on_header_expose_event" last_modification_time="Thu, 06 Aug 2009 14:54:29 GMT"/> - <signal name="configure_event" handler="on_header_configure_event" last_modification_time="Thu, 06 Aug 2009 14:54:33 GMT"/> - <signal name="realize" handler="on_header_realize" last_modification_time="Thu, 06 Aug 2009 14:54:41 GMT"/> - <signal name="motion_notify_event" handler="on_header_motion_notify_event" last_modification_time="Thu, 06 Aug 2009 16:33:54 GMT"/> - <signal name="button_press_event" handler="on_header_button_press_event" last_modification_time="Thu, 06 Aug 2009 16:42:32 GMT"/> - <signal name="button_release_event" handler="on_header_button_release_event" last_modification_time="Thu, 06 Aug 2009 16:47:31 GMT"/> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> + <property name="homogeneous">False</property> + <property name="spacing">0</property> - <child> - <widget class="GtkDrawingArea" id="playlist"> - <property name="visible">True</property> - <property name="events">GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK</property> - <signal name="configure_event" handler="on_playlist_configure_event" last_modification_time="Sat, 04 Jul 2009 00:03:23 GMT"/> - <signal name="expose_event" handler="on_playlist_expose_event" last_modification_time="Sat, 04 Jul 2009 00:03:29 GMT"/> - <signal name="realize" handler="on_playlist_realize" last_modification_time="Sat, 04 Jul 2009 00:03:36 GMT"/> - <signal name="button_press_event" handler="on_playlist_button_press_event" last_modification_time="Sat, 04 Jul 2009 00:41:38 GMT"/> - <signal name="scroll_event" handler="on_playlist_scroll_event" last_modification_time="Sat, 04 Jul 2009 17:16:21 GMT"/> - <signal name="drag_begin" handler="on_playlist_drag_begin" last_modification_time="Fri, 31 Jul 2009 10:36:23 GMT"/> - <signal name="drag_motion" handler="on_playlist_drag_motion" last_modification_time="Fri, 31 Jul 2009 10:36:30 GMT"/> - <signal name="drag_drop" handler="on_playlist_drag_drop" last_modification_time="Fri, 31 Jul 2009 10:36:39 GMT"/> - <signal name="drag_data_get" handler="on_playlist_drag_data_get" last_modification_time="Fri, 31 Jul 2009 10:36:43 GMT"/> - <signal name="drag_end" handler="on_playlist_drag_end" last_modification_time="Fri, 31 Jul 2009 11:41:00 GMT"/> - <signal name="drag_failed" handler="on_playlist_drag_failed" last_modification_time="Fri, 31 Jul 2009 11:41:05 GMT"/> - <signal name="drag_leave" handler="on_playlist_drag_leave" last_modification_time="Fri, 31 Jul 2009 11:41:11 GMT"/> - <signal name="button_release_event" handler="on_playlist_button_release_event" last_modification_time="Fri, 31 Jul 2009 12:20:56 GMT"/> - <signal name="motion_notify_event" handler="on_playlist_motion_notify_event" last_modification_time="Fri, 31 Jul 2009 12:23:49 GMT"/> - <signal name="drag_data_received" handler="on_playlist_drag_data_received" last_modification_time="Mon, 03 Aug 2009 12:07:39 GMT"/> - <signal name="drag_data_delete" handler="on_playlist_drag_data_delete" last_modification_time="Mon, 03 Aug 2009 12:35:47 GMT"/> + <child> + <widget class="GtkDrawingArea" id="header"> + <property name="height_request">24</property> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <signal name="expose_event" handler="on_header_expose_event" last_modification_time="Thu, 06 Aug 2009 14:54:29 GMT"/> + <signal name="configure_event" handler="on_header_configure_event" last_modification_time="Thu, 06 Aug 2009 14:54:33 GMT"/> + <signal name="realize" handler="on_header_realize" last_modification_time="Thu, 06 Aug 2009 14:54:41 GMT"/> + <signal name="motion_notify_event" handler="on_header_motion_notify_event" last_modification_time="Thu, 06 Aug 2009 16:33:54 GMT"/> + <signal name="button_press_event" handler="on_header_button_press_event" last_modification_time="Thu, 06 Aug 2009 16:42:32 GMT"/> + <signal name="button_release_event" handler="on_header_button_release_event" last_modification_time="Thu, 06 Aug 2009 16:47:31 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkDrawingArea" id="playlist"> + <property name="visible">True</property> + <property name="events">GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK</property> + <signal name="configure_event" handler="on_playlist_configure_event" last_modification_time="Sat, 04 Jul 2009 00:03:23 GMT"/> + <signal name="expose_event" handler="on_playlist_expose_event" last_modification_time="Sat, 04 Jul 2009 00:03:29 GMT"/> + <signal name="realize" handler="on_playlist_realize" last_modification_time="Sat, 04 Jul 2009 00:03:36 GMT"/> + <signal name="button_press_event" handler="on_playlist_button_press_event" last_modification_time="Sat, 04 Jul 2009 00:41:38 GMT"/> + <signal name="scroll_event" handler="on_playlist_scroll_event" last_modification_time="Sat, 04 Jul 2009 17:16:21 GMT"/> + <signal name="drag_begin" handler="on_playlist_drag_begin" last_modification_time="Fri, 31 Jul 2009 10:36:23 GMT"/> + <signal name="drag_motion" handler="on_playlist_drag_motion" last_modification_time="Fri, 31 Jul 2009 10:36:30 GMT"/> + <signal name="drag_drop" handler="on_playlist_drag_drop" last_modification_time="Fri, 31 Jul 2009 10:36:39 GMT"/> + <signal name="drag_data_get" handler="on_playlist_drag_data_get" last_modification_time="Fri, 31 Jul 2009 10:36:43 GMT"/> + <signal name="drag_end" handler="on_playlist_drag_end" last_modification_time="Fri, 31 Jul 2009 11:41:00 GMT"/> + <signal name="drag_failed" handler="on_playlist_drag_failed" last_modification_time="Fri, 31 Jul 2009 11:41:05 GMT"/> + <signal name="drag_leave" handler="on_playlist_drag_leave" last_modification_time="Fri, 31 Jul 2009 11:41:11 GMT"/> + <signal name="button_release_event" handler="on_playlist_button_release_event" last_modification_time="Fri, 31 Jul 2009 12:20:56 GMT"/> + <signal name="motion_notify_event" handler="on_playlist_motion_notify_event" last_modification_time="Fri, 31 Jul 2009 12:23:49 GMT"/> + <signal name="drag_data_received" handler="on_playlist_drag_data_received" last_modification_time="Mon, 03 Aug 2009 12:07:39 GMT"/> + <signal name="drag_data_delete" handler="on_playlist_drag_data_delete" last_modification_time="Mon, 03 Aug 2009 12:35:47 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> </widget> <packing> <property name="padding">0</property> @@ -719,9 +735,10 @@ </child> </widget> <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> </packing> </child> @@ -734,9 +751,30 @@ <signal name="value_changed" handler="on_playscroll_value_changed" last_modification_time="Sat, 04 Jul 2009 01:42:24 GMT"/> </widget> <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options">fill</property> + </packing> + </child> + + <child> + <widget class="GtkHScrollbar" id="playhscroll"> + <property name="visible">True</property> + <property name="update_policy">GTK_UPDATE_CONTINUOUS</property> + <property name="inverted">False</property> + <property name="adjustment">0 0 0 0 0 0</property> + <signal name="value_changed" handler="on_playhscroll_value_changed" last_modification_time="Sun, 13 Sep 2009 09:53:45 GMT"/> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options">fill</property> </packing> </child> </widget> @@ -877,10 +915,31 @@ Stas "uncle lag" Akimushkin <uncle.lag@gmail.com></property> </child> <child> - <widget class="GtkHBox" id="hbox6"> + <widget class="GtkTable" id="table2"> <property name="visible">True</property> + <property name="n_rows">2</property> + <property name="n_columns">2</property> <property name="homogeneous">False</property> - <property name="spacing">0</property> + <property name="row_spacing">0</property> + <property name="column_spacing">0</property> + + <child> + <widget class="GtkVScrollbar" id="searchscroll"> + <property name="visible">True</property> + <property name="update_policy">GTK_UPDATE_CONTINUOUS</property> + <property name="inverted">False</property> + <property name="adjustment">0 0 1 1 0 0</property> + <signal name="value_changed" handler="on_playscroll_value_changed" last_modification_time="Sat, 08 Aug 2009 23:47:34 GMT"/> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options">fill</property> + </packing> + </child> <child> <widget class="GtkVBox" id="vbox5"> @@ -928,24 +987,28 @@ Stas "uncle lag" Akimushkin <uncle.lag@gmail.com></property> </child> </widget> <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> </packing> </child> <child> - <widget class="GtkVScrollbar" id="searchscroll"> + <widget class="GtkHScrollbar" id="searchhscroll"> <property name="visible">True</property> <property name="update_policy">GTK_UPDATE_CONTINUOUS</property> <property name="inverted">False</property> - <property name="adjustment">0 0 1 1 0 0</property> - <signal name="value_changed" handler="on_playscroll_value_changed" last_modification_time="Sat, 08 Aug 2009 23:47:34 GMT"/> + <property name="adjustment">0 0 0 0 0 0</property> + <signal name="value_changed" handler="on_searchhscroll_value_changed" last_modification_time="Sun, 13 Sep 2009 10:07:12 GMT"/> </widget> <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options">fill</property> </packing> </child> </widget> diff --git a/gtkplaylist.c b/gtkplaylist.c index 11bac24c..4a41f6d6 100644 --- a/gtkplaylist.c +++ b/gtkplaylist.c @@ -194,6 +194,34 @@ gtkpl_setup_scrollbar (gtkplaylist_t *ps) { } void +gtkpl_setup_hscrollbar (gtkplaylist_t *ps) { + GtkWidget *playlist = ps->playlist; + int w = playlist->allocation.width; + int size = 0; + int i; + for (i = 0; i < pl_ncolumns; i++) { + size += ps->colwidths[i]; + } + if (w >= size) { + size = 0; + } + GtkWidget *scroll = ps->hscrollbar; + if (ps->hscrollpos >= size-w) { + int n = size-w-1; + ps->hscrollpos = max (0, n); + gtk_range_set_value (GTK_RANGE (scroll), ps->hscrollpos); + } + if (size == 0) { + gtk_widget_hide (scroll); + } + else { + GtkAdjustment *adj = (GtkAdjustment*)gtk_adjustment_new (gtk_range_get_value (GTK_RANGE (scroll)), 0, size, 1, w, w); + gtk_range_set_adjustment (GTK_RANGE (scroll), adj); + gtk_widget_show (scroll); + } +} + +void gtkpl_redraw_pl_row_novis (gtkplaylist_t *ps, int row, playItem_t *it) { draw_begin ((uintptr_t)ps->backbuf); if (it) { @@ -260,7 +288,7 @@ gtkpl_draw_pl_row (gtkplaylist_t *ps, int row, playItem_t *it) { draw_get_canvas_size ((uintptr_t)ps->backbuf, &width, &height); if (it == playlist_current_ptr && ps->colwidths[0] > 0/* && !p_isstopped ()*/) { uintptr_t pixbuf = p_ispaused () ? pause16_pixbuf : play16_pixbuf; - draw_pixbuf ((uintptr_t)ps->backbuf, pixbuf, ps->colwidths[0]/2-8, (row - ps->scrollpos) * rowheight + rowheight/2 - 8, 0, 0, 16, 16); + draw_pixbuf ((uintptr_t)ps->backbuf, pixbuf, ps->colwidths[0]/2-8-ps->hscrollpos, (row - ps->scrollpos) * rowheight + rowheight/2 - 8, 0, 0, 16, 16); } if (it && ((it->selected && ps->multisel) || (row == ps->row && !ps->multisel))) { if (row % 2) { @@ -315,8 +343,7 @@ gtkpl_draw_pl_row (gtkplaylist_t *ps, int row, playItem_t *it) { title, dur }; - int x = 0; -#if 1 + int x = -ps->hscrollpos; for (int i = 0; i < pl_ncolumns; i++) { char str[512]; if (i > 0) { @@ -349,12 +376,6 @@ gtkpl_draw_pl_row (gtkplaylist_t *ps, int row, playItem_t *it) { } x += ps->colwidths[i]; } -#endif -#if 0 - char dname[512]; - pl_format_item_display_name (it, dname, 512); - text_draw (cr, rowheight, row * rowheight - ps->scrollpos * rowheight, dname); -#endif } @@ -398,6 +419,7 @@ gtkpl_draw_playlist (gtkplaylist_t *ps, int x, int y, int w, int h) { void gtkpl_configure (gtkplaylist_t *ps) { gtkpl_setup_scrollbar (ps); + gtkpl_setup_hscrollbar (ps); GtkWidget *widget = ps->playlist; if (ps->backbuf) { g_object_unref (ps->backbuf); @@ -752,6 +774,18 @@ gtkpl_scroll (gtkplaylist_t *ps, int newscroll) { } void +gtkpl_hscroll (gtkplaylist_t *ps, int newscroll) { + if (newscroll != ps->hscrollpos) { + ps->hscrollpos = newscroll; + GtkWidget *widget = ps->playlist; + gtkpl_header_draw (ps); + gtkpl_expose_header (ps, 0, 0, ps->header->allocation.width, ps->header->allocation.height); + gtkpl_draw_playlist (ps, 0, 0, widget->allocation.width, widget->allocation.height); + gdk_draw_drawable (widget->window, widget->style->black_gc, ps->backbuf, 0, 0, 0, 0, widget->allocation.width, widget->allocation.height); + } +} + +void gtkpl_randomsong (void) { p_stop (); pl_randomsong (); @@ -1156,7 +1190,7 @@ gtkpl_handle_fm_drag_drop (gtkplaylist_t *ps, int drop_y, void *ptr, int length) void gtkpl_header_draw (gtkplaylist_t *ps) { GtkWidget *widget = ps->header; - int x = 0; + int x = -ps->hscrollpos; int w = 100; int h = widget->allocation.height; const char *detail = "toolbar"; @@ -1178,8 +1212,7 @@ gtkpl_header_draw (gtkplaylist_t *ps) { gtk_paint_box (widget->style, ps->backbuf_header, GTK_STATE_INSENSITIVE, GTK_SHADOW_OUT, NULL, NULL, detail, x, 0, widget->allocation.width-x, h); } draw_begin ((uintptr_t)ps->backbuf_header); - x = 0; -// gtkpl_set_cairo_header_font (cr); + x = -ps->hscrollpos; for (int i = 0; i < pl_ncolumns; i++) { if (x >= widget->allocation.width) { break; @@ -1187,7 +1220,6 @@ gtkpl_header_draw (gtkplaylist_t *ps) { w = ps->colwidths[i]; if (w > 0) { if (!ps->header_fitted[i]) { - //gtkpl_set_cairo_header_font (cr); gtkpl_fit_text (ps->colnames_fitted[i], NULL, pl_colname_max, colnames[i], ps->colwidths[i]-10); ps->header_fitted[i] = 1; } @@ -1268,7 +1300,7 @@ on_header_motion_notify_event (GtkWidget *widget, prev_header_x = event->x; gdk_window_set_cursor (widget->window, cursor_sz); // get column start pos - int x = 0; + int x = -ps->hscrollpos; for (int i = 0; i < header_sizing; i++) { int w = ps->colwidths[i]; x += w; @@ -1281,13 +1313,14 @@ on_header_motion_notify_event (GtkWidget *widget, int cidx = (k * pl_ncolumns + header_sizing) * 3; ps->fmtcache[cidx+2] = 0; } + gtkpl_setup_hscrollbar (ps); gtkpl_header_draw (ps); gtkpl_expose_header (ps, 0, 0, ps->header->allocation.width, ps->header->allocation.height); gtkpl_draw_playlist (ps, 0, 0, ps->playlist->allocation.width, ps->playlist->allocation.height); gtkpl_expose (ps, 0, 0, ps->playlist->allocation.width, ps->playlist->allocation.height); } else { - int x = 0; + int x = -ps->hscrollpos; for (int i = 0; i < pl_ncolumns; i++) { int w = ps->colwidths[i]; if (w > 0) { // ignore collapsed columns (hack for search window) @@ -1320,7 +1353,7 @@ on_header_button_press_event (GtkWidget *widget, header_sizing = -1; header_dragpt[0] = event->x; header_dragpt[1] = event->y; - int x = 0; + int x = -ps->hscrollpos; for (int i = 0; i < pl_ncolumns; i++) { int w = ps->colwidths[i]; if (event->x >= x + w - 2 && event->x <= x + w) { diff --git a/gtkplaylist.h b/gtkplaylist.h index 672a199c..9584aa06 100644 --- a/gtkplaylist.h +++ b/gtkplaylist.h @@ -57,6 +57,7 @@ typedef struct { GtkWidget *playlist; GtkWidget *header; GtkWidget *scrollbar; + GtkWidget *hscrollbar; GdkPixmap *backbuf; GdkPixmap *backbuf_header; // parameters @@ -67,6 +68,7 @@ typedef struct { int multisel; // if it uses multiple selection // current state int scrollpos; + int hscrollpos; int row; double clicktime; // for doubleclick detection int nvisiblerows; @@ -127,6 +129,9 @@ void gtkpl_scroll (gtkplaylist_t *ps, int newscroll); void +gtkpl_hscroll (gtkplaylist_t *ps, int newscroll); + +void gtkpl_handle_scroll_event (gtkplaylist_t *ps, int direction); void diff --git a/interface.c b/interface.c index 3037742f..a83d8321 100644 --- a/interface.c +++ b/interface.c @@ -94,11 +94,13 @@ create_mainwin (void) GtkWidget *image6; GtkWidget *volumebar; GtkWidget *seekbar; + GtkWidget *table1; GtkWidget *_; GtkWidget *vbox3; GtkWidget *header; GtkWidget *playlist; GtkWidget *playscroll; + GtkWidget *playhscroll; GtkWidget *statusbar; GtkAccelGroup *accel_group; @@ -420,9 +422,15 @@ create_mainwin (void) gtk_widget_set_size_request (seekbar, 200, -1); gtk_widget_set_events (seekbar, GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); + table1 = gtk_table_new (2, 2, FALSE); + gtk_widget_show (table1); + gtk_box_pack_start (GTK_BOX (vbox1), table1, TRUE, TRUE, 0); + _ = gtk_hbox_new (FALSE, 0); gtk_widget_show (_); - gtk_box_pack_start (GTK_BOX (vbox1), _, TRUE, TRUE, 0); + gtk_table_attach (GTK_TABLE (table1), _, 0, 1, 0, 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (_), 3); vbox3 = gtk_vbox_new (FALSE, 0); @@ -442,7 +450,15 @@ create_mainwin (void) playscroll = gtk_vscrollbar_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 1, 1, 0, 0))); gtk_widget_show (playscroll); - gtk_box_pack_start (GTK_BOX (_), playscroll, FALSE, TRUE, 0); + gtk_table_attach (GTK_TABLE (table1), playscroll, 1, 2, 0, 1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_FILL), 0, 0); + + playhscroll = gtk_hscrollbar_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 0, 0, 0, 0))); + gtk_widget_show (playhscroll); + gtk_table_attach (GTK_TABLE (table1), playhscroll, 0, 1, 1, 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_FILL), 0, 0); statusbar = gtk_statusbar_new (); gtk_widget_show (statusbar); @@ -640,6 +656,9 @@ create_mainwin (void) g_signal_connect ((gpointer) playscroll, "value_changed", G_CALLBACK (on_playscroll_value_changed), NULL); + g_signal_connect ((gpointer) playhscroll, "value_changed", + G_CALLBACK (on_playhscroll_value_changed), + NULL); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (mainwin, mainwin, "mainwin"); @@ -705,11 +724,13 @@ create_mainwin (void) GLADE_HOOKUP_OBJECT (mainwin, image6, "image6"); GLADE_HOOKUP_OBJECT (mainwin, volumebar, "volumebar"); GLADE_HOOKUP_OBJECT (mainwin, seekbar, "seekbar"); + GLADE_HOOKUP_OBJECT (mainwin, table1, "table1"); GLADE_HOOKUP_OBJECT (mainwin, _, "_"); GLADE_HOOKUP_OBJECT (mainwin, vbox3, "vbox3"); GLADE_HOOKUP_OBJECT (mainwin, header, "header"); GLADE_HOOKUP_OBJECT (mainwin, playlist, "playlist"); GLADE_HOOKUP_OBJECT (mainwin, playscroll, "playscroll"); + GLADE_HOOKUP_OBJECT (mainwin, playhscroll, "playhscroll"); GLADE_HOOKUP_OBJECT (mainwin, statusbar, "statusbar"); gtk_window_add_accel_group (GTK_WINDOW (mainwin), accel_group); @@ -765,11 +786,12 @@ create_searchwin (void) GtkWidget *searchwin; GtkWidget *vbox4; GtkWidget *searchentry; - GtkWidget *hbox6; + GtkWidget *table2; + GtkWidget *searchscroll; GtkWidget *vbox5; GtkWidget *searchheader; GtkWidget *searchlist; - GtkWidget *searchscroll; + GtkWidget *searchhscroll; searchwin = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_set_size_request (searchwin, 600, 150); @@ -790,13 +812,21 @@ create_searchwin (void) gtk_entry_set_invisible_char (GTK_ENTRY (searchentry), 8226); gtk_entry_set_activates_default (GTK_ENTRY (searchentry), TRUE); - hbox6 = gtk_hbox_new (FALSE, 0); - gtk_widget_show (hbox6); - gtk_box_pack_start (GTK_BOX (vbox4), hbox6, TRUE, TRUE, 0); + table2 = gtk_table_new (2, 2, FALSE); + gtk_widget_show (table2); + gtk_box_pack_start (GTK_BOX (vbox4), table2, TRUE, TRUE, 0); + + searchscroll = gtk_vscrollbar_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 1, 1, 0, 0))); + gtk_widget_show (searchscroll); + gtk_table_attach (GTK_TABLE (table2), searchscroll, 1, 2, 0, 1, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_FILL), 0, 0); vbox5 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox5); - gtk_box_pack_start (GTK_BOX (hbox6), vbox5, TRUE, TRUE, 0); + gtk_table_attach (GTK_TABLE (table2), vbox5, 0, 1, 0, 1, + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); searchheader = gtk_drawing_area_new (); gtk_widget_show (searchheader); @@ -810,9 +840,11 @@ create_searchwin (void) GTK_WIDGET_SET_FLAGS (searchlist, GTK_CAN_DEFAULT); gtk_widget_set_events (searchlist, GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); - searchscroll = gtk_vscrollbar_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 1, 1, 0, 0))); - gtk_widget_show (searchscroll); - gtk_box_pack_start (GTK_BOX (hbox6), searchscroll, FALSE, TRUE, 0); + searchhscroll = gtk_hscrollbar_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 0, 0, 0, 0))); + gtk_widget_show (searchhscroll); + gtk_table_attach (GTK_TABLE (table2), searchhscroll, 0, 1, 1, 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (GTK_FILL), 0, 0); g_signal_connect ((gpointer) searchwin, "key_press_event", G_CALLBACK (on_searchwin_key_press_event), @@ -823,6 +855,9 @@ create_searchwin (void) g_signal_connect ((gpointer) searchentry, "changed", G_CALLBACK (on_searchentry_changed), NULL); + g_signal_connect ((gpointer) searchscroll, "value_changed", + G_CALLBACK (on_playscroll_value_changed), + NULL); g_signal_connect ((gpointer) searchheader, "button_press_event", G_CALLBACK (on_header_button_press_event), NULL); @@ -859,19 +894,20 @@ create_searchwin (void) g_signal_connect ((gpointer) searchlist, "motion_notify_event", G_CALLBACK (on_playlist_motion_notify_event), NULL); - g_signal_connect ((gpointer) searchscroll, "value_changed", - G_CALLBACK (on_playscroll_value_changed), + g_signal_connect ((gpointer) searchhscroll, "value_changed", + G_CALLBACK (on_searchhscroll_value_changed), NULL); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (searchwin, searchwin, "searchwin"); GLADE_HOOKUP_OBJECT (searchwin, vbox4, "vbox4"); GLADE_HOOKUP_OBJECT (searchwin, searchentry, "searchentry"); - GLADE_HOOKUP_OBJECT (searchwin, hbox6, "hbox6"); + GLADE_HOOKUP_OBJECT (searchwin, table2, "table2"); + GLADE_HOOKUP_OBJECT (searchwin, searchscroll, "searchscroll"); GLADE_HOOKUP_OBJECT (searchwin, vbox5, "vbox5"); GLADE_HOOKUP_OBJECT (searchwin, searchheader, "searchheader"); GLADE_HOOKUP_OBJECT (searchwin, searchlist, "searchlist"); - GLADE_HOOKUP_OBJECT (searchwin, searchscroll, "searchscroll"); + GLADE_HOOKUP_OBJECT (searchwin, searchhscroll, "searchhscroll"); gtk_widget_grab_default (searchlist); return searchwin; |