diff options
author | 2012-04-09 17:05:47 +0200 | |
---|---|---|
committer | 2012-04-09 17:06:50 +0200 | |
commit | bcecd3a2d929735341098fa19a97fdb3bf667dd0 (patch) | |
tree | b329838d98692a5ed9a37efc286e2f63caf8a4a9 /plugins/gtkui/widgets.c | |
parent | 506a70dff9b644bfe54777feea72bbb3c16a0605 (diff) |
fixed gtk3 support, broke design mode drawing
Diffstat (limited to 'plugins/gtkui/widgets.c')
-rw-r--r-- | plugins/gtkui/widgets.c | 112 |
1 files changed, 80 insertions, 32 deletions
diff --git a/plugins/gtkui/widgets.c b/plugins/gtkui/widgets.c index 89d21814..4157313a 100644 --- a/plugins/gtkui/widgets.c +++ b/plugins/gtkui/widgets.c @@ -235,29 +235,32 @@ w_create_from_string (const char *s, ddb_gtkui_widget_t **parent) { static ddb_gtkui_widget_t *current_widget; static int hidden = 0; -gboolean -w_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { +static gboolean +w_draw_event (GtkWidget *widget, cairo_t *cr, gpointer user_data) { if (hidden && user_data == current_widget) { - GdkColor clr = { - .red = 0x2d00, - .green = 0x0000, - .blue = 0xd600 - }; - GdkGC *gc = gdk_gc_new (widget->window); - gdk_gc_set_rgb_fg_color (gc, &clr); - if (GTK_WIDGET_NO_WINDOW (widget)) { - gdk_draw_rectangle (widget->window, gc, TRUE, widget->allocation.x, widget->allocation.y, widget->allocation.width, widget->allocation.height); + cairo_set_source_rgb (cr, 0.17f, 0, 0.83f); + GtkAllocation allocation; + gtk_widget_get_allocation(widget, &allocation); + + if (gtk_widget_get_has_window (widget)) { + cairo_rectangle (cr, allocation.x, allocation.y, allocation.width, allocation.height); } else { - gdk_draw_rectangle (widget->window, gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height); + cairo_rectangle (cr, 0, 0, allocation.width, allocation.height); } - g_object_unref (gc); - return TRUE; + cairo_fill (cr); } - return FALSE; } +gboolean +w_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { + cairo_t *cr = gdk_cairo_create (gtk_widget_get_window (widget)); + gboolean res = w_draw_event (widget, cr, user_data); + cairo_destroy (cr); + return res; +} + static char paste_buffer[1000]; static void @@ -469,7 +472,11 @@ w_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_da static void w_override_signals (GtkWidget *widget, gpointer user_data) { g_signal_connect ((gpointer) widget, "button_press_event", G_CALLBACK (w_button_press_event), user_data); +#if !GTK_CHECK_VERSION(3,0,0) g_signal_connect ((gpointer) widget, "expose_event", G_CALLBACK (w_expose_event), user_data); +#else + g_signal_connect ((gpointer) widget, "draw", G_CALLBACK (w_draw_event), user_data); +#endif if (GTK_IS_CONTAINER (widget)) { gtk_container_forall (GTK_CONTAINER (widget), w_override_signals, user_data); } @@ -554,10 +561,8 @@ w_container_remove (ddb_gtkui_widget_t *cont, ddb_gtkui_widget_t *child) { } ////// placeholder widget - gboolean -w_placeholder_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { - cairo_t *cr = gdk_cairo_create (widget->window); +w_placeholder_draw (GtkWidget *widget, cairo_t *cr, gpointer user_data) { cairo_set_source_rgb (cr, 255, 0, 0); cairo_surface_t *checker; cairo_t *cr2; @@ -581,21 +586,35 @@ w_placeholder_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer u cairo_set_source_surface (cr, checker, 0, 0); cairo_pattern_t *pt = cairo_get_source(cr); cairo_pattern_set_extend (pt, CAIRO_EXTEND_REPEAT); - cairo_rectangle (cr, 0, 0, widget->allocation.width, widget->allocation.height); + GtkAllocation a; + gtk_widget_get_allocation (widget, &a); + cairo_rectangle (cr, 0, 0, a.width, a.height); cairo_paint (cr); cairo_surface_destroy (checker); - cairo_destroy (cr); return FALSE; } +gboolean +w_placeholder_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { + cairo_t *cr = gdk_cairo_create (gtk_widget_get_window (widget)); + gboolean res = w_placeholder_draw (widget, cr, user_data); + cairo_destroy (cr); + return res; +} + ddb_gtkui_widget_t * w_placeholder_create (void) { w_placeholder_t *w = malloc (sizeof (w_placeholder_t)); memset (w, 0, sizeof (w_placeholder_t)); w->base.widget = gtk_drawing_area_new (); gtk_widget_set_events (w->base.widget, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); +#if !GTK_CHECK_VERSION(3,0,0) g_signal_connect ((gpointer) w->base.widget, "expose_event", G_CALLBACK (w_expose_event), w); g_signal_connect_after ((gpointer) w->base.widget, "expose_event", G_CALLBACK (w_placeholder_expose_event), w); +#else + g_signal_connect ((gpointer) w->base.widget, "draw", G_CALLBACK (w_draw_event), w); + g_signal_connect_after ((gpointer) w->base.widget, "draw", G_CALLBACK (w_placeholder_draw), w); +#endif g_signal_connect ((gpointer) w->base.widget, "button_press_event", G_CALLBACK (w_button_press_event), w); return (ddb_gtkui_widget_t*)w; } @@ -643,7 +662,11 @@ w_vsplitter_create (void) { ddb_gtkui_widget_t *ph1, *ph2; ph1 = w_create ("placeholder"); ph2 = w_create ("placeholder"); +#if !GTK_CHECK_VERSION(3,0,0) g_signal_connect ((gpointer) w->base.widget, "expose_event", G_CALLBACK (w_expose_event), w); +#else + g_signal_connect ((gpointer) w->base.widget, "draw", G_CALLBACK (w_draw_event), w); +#endif g_signal_connect ((gpointer) w->base.widget, "button_press_event", G_CALLBACK (w_button_press_event), w); w_append ((ddb_gtkui_widget_t*)w, ph1); @@ -666,7 +689,11 @@ w_hsplitter_create (void) { ddb_gtkui_widget_t *ph1, *ph2; ph1 = w_create ("placeholder"); ph2 = w_create ("placeholder"); +#if !GTK_CHECK_VERSION(3,0,0) g_signal_connect ((gpointer) w->base.widget, "expose_event", G_CALLBACK (w_expose_event), w); +#else + g_signal_connect ((gpointer) w->base.widget, "draw", G_CALLBACK (w_draw_event), w); +#endif g_signal_connect ((gpointer) w->base.widget, "button_press_event", G_CALLBACK (w_button_press_event), w); w_append ((ddb_gtkui_widget_t*)w, ph1); @@ -703,7 +730,7 @@ on_add_tab_activate (GtkMenuItem *menuitem, gpointer user_data) { int i = 0; for (ddb_gtkui_widget_t *c = w->base.children; c; c = c->next, i++); w->clicked_page = i-1; - gtk_notebook_set_page (GTK_NOTEBOOK (w->base.widget), w->clicked_page); + gtk_notebook_set_current_page (GTK_NOTEBOOK (w->base.widget), w->clicked_page); } @@ -755,7 +782,7 @@ on_move_tab_left_activate (GtkMenuItem *menuitem, gpointer user_data) { gtk_widget_show (newchild->widget); gtk_notebook_insert_page (GTK_NOTEBOOK (w->base.widget), newchild->widget, eventbox, w->clicked_page-1); - gtk_notebook_set_page (GTK_NOTEBOOK (w->base.widget), w->clicked_page-1); + gtk_notebook_set_current_page (GTK_NOTEBOOK (w->base.widget), w->clicked_page-1); w->clicked_page--; break; } @@ -772,9 +799,9 @@ on_move_tab_right_activate (GtkMenuItem *menuitem, gpointer user_data) { if (w->clicked_page >= i) return; - gtk_notebook_set_page (GTK_NOTEBOOK (w->base.widget), ++w->clicked_page); + gtk_notebook_set_current_page (GTK_NOTEBOOK (w->base.widget), ++w->clicked_page); on_move_tab_left_activate (menuitem, user_data); - gtk_notebook_set_page (GTK_NOTEBOOK (w->base.widget), ++w->clicked_page); + gtk_notebook_set_current_page (GTK_NOTEBOOK (w->base.widget), ++w->clicked_page); } static gboolean @@ -815,7 +842,7 @@ tab_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_ gtk_container_add (GTK_CONTAINER (menu), item); w->clicked_page = gtk_notebook_page_num (GTK_NOTEBOOK (w->base.widget), user_data); - gtk_notebook_set_page (GTK_NOTEBOOK (w->base.widget), w->clicked_page); + gtk_notebook_set_current_page (GTK_NOTEBOOK (w->base.widget), w->clicked_page); gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, widget, 0, gtk_get_current_event_time()); return TRUE; @@ -862,7 +889,7 @@ w_tabs_replace (ddb_gtkui_widget_t *cont, ddb_gtkui_widget_t *child, ddb_gtkui_w gtk_container_add (GTK_CONTAINER (eventbox), label); gtk_widget_show (newchild->widget); int pos = gtk_notebook_insert_page (GTK_NOTEBOOK (cont->widget), newchild->widget, eventbox, ntab); - gtk_notebook_set_page (GTK_NOTEBOOK (cont->widget), pos); + gtk_notebook_set_current_page (GTK_NOTEBOOK (cont->widget), pos); break; } } @@ -894,7 +921,11 @@ w_tabs_create (void) { ph2 = w_create ("placeholder"); ph3 = w_create ("placeholder"); +#if !GTK_CHECK_VERSION(3,0,0) g_signal_connect ((gpointer) w->base.widget, "expose_event", G_CALLBACK (w_expose_event), w); +#else + g_signal_connect ((gpointer) w->base.widget, "draw", G_CALLBACK (w_draw_event), w); +#endif g_signal_connect ((gpointer) w->base.widget, "button_press_event", G_CALLBACK (w_button_press_event), w); w_append ((ddb_gtkui_widget_t*)w, ph1); @@ -1118,8 +1149,8 @@ w_tabbed_playlist_create (void) { gtk_box_pack_start (GTK_BOX (vbox), tabstrip, FALSE, TRUE, 0); gtk_widget_set_size_request (tabstrip, -1, 24); - GTK_WIDGET_UNSET_FLAGS (tabstrip, GTK_CAN_FOCUS); - GTK_WIDGET_UNSET_FLAGS (tabstrip, GTK_CAN_DEFAULT); + gtk_widget_set_can_focus (tabstrip, FALSE); + gtk_widget_set_can_default (tabstrip, FALSE); gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (frame), 1); @@ -1259,13 +1290,15 @@ coverart_avail_callback (void *user_data) { } static gboolean -coverart_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { +coverart_draw (GtkWidget *widget, cairo_t *cr, gpointer user_data) { DB_playItem_t *it = deadbeef->streamer_get_playing_track (); if (!it) { return FALSE; } - int width = widget->allocation.width; - int height = widget->allocation.height; + GtkAllocation a; + gtk_widget_get_allocation (widget, &a); + int width = a.width; + int height = a.height; const char *album = deadbeef->pl_find_meta (it, "album"); const char *artist = deadbeef->pl_find_meta (it, "artist"); if (!album || !*album) { @@ -1275,7 +1308,10 @@ coverart_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_d if (pixbuf) { int pw = gdk_pixbuf_get_width (pixbuf); int ph = gdk_pixbuf_get_height (pixbuf); - gdk_draw_pixbuf (widget->window, widget->style->white_gc, pixbuf, 0, 0, widget->allocation.width/2-pw/2, widget->allocation.height/2-ph/2, pw, ph, GDK_RGB_DITHER_NONE, 0, 0); + gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0); + cairo_rectangle (cr, 0, 0, pw, ph); + cairo_fill (cr); +// gdk_draw_pixbuf (gtk_widget_get_window (widget), widget->style->white_gc, pixbuf, 0, 0, a.width/2-pw/2, a.height/2-ph/2, pw, ph, GDK_RGB_DITHER_NONE, 0, 0); g_object_unref (pixbuf); } deadbeef->pl_item_unref (it); @@ -1283,6 +1319,14 @@ coverart_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_d } static gboolean +coverart_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { + cairo_t *cr = gdk_cairo_create (gtk_widget_get_window (widget)); + gboolean res = coverart_draw (widget, cr, user_data); + cairo_destroy (cr); + return res; +} + +static gboolean coverart_redraw_cb (void *user_data) { w_coverart_t *w = user_data; gtk_widget_queue_draw (w->drawarea); @@ -1319,7 +1363,11 @@ w_coverart_create (void) { w->drawarea = gtk_drawing_area_new (); gtk_widget_show (w->drawarea); gtk_container_add (GTK_CONTAINER (w->base.widget), w->drawarea); +#if !GTK_CHECK_VERSION(3,0,0) g_signal_connect_after ((gpointer) w->drawarea, "expose_event", G_CALLBACK (coverart_expose_event), w); +#else + g_signal_connect_after ((gpointer) w->drawarea, "draw", G_CALLBACK (coverart_draw), w); +#endif w_override_signals (w->base.widget, w); return (ddb_gtkui_widget_t *)w; } |