summaryrefslogtreecommitdiff
path: root/plugins/gtkui/widgets.c
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2012-04-09 17:05:47 +0200
committerGravatar waker <wakeroid@gmail.com>2012-04-09 17:06:50 +0200
commitbcecd3a2d929735341098fa19a97fdb3bf667dd0 (patch)
treeb329838d98692a5ed9a37efc286e2f63caf8a4a9 /plugins/gtkui/widgets.c
parent506a70dff9b644bfe54777feea72bbb3c16a0605 (diff)
fixed gtk3 support, broke design mode drawing
Diffstat (limited to 'plugins/gtkui/widgets.c')
-rw-r--r--plugins/gtkui/widgets.c112
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;
}