Skip to content

Instantly share code, notes, and snippets.

@saivert
Created April 19, 2021 14:30
Show Gist options
  • Select an option

  • Save saivert/00fb0a04d038a8bb60d76dec49e22d49 to your computer and use it in GitHub Desktop.

Select an option

Save saivert/00fb0a04d038a8bb60d76dec49e22d49 to your computer and use it in GitHub Desktop.
diff --git a/plugins/gtkui/ddbseekbar.c b/plugins/gtkui/ddbseekbar.c
index c9f7b4a66..37cd034a1 100644
--- a/plugins/gtkui/ddbseekbar.c
+++ b/plugins/gtkui/ddbseekbar.c
@@ -191,6 +191,7 @@ static void ddb_seekbar_class_init (DdbSeekbarClass * klass) {
GTK_WIDGET_CLASS (klass)->button_release_event = ddb_seekbar_real_button_release_event;
GTK_WIDGET_CLASS (klass)->motion_notify_event = ddb_seekbar_real_motion_notify_event;
GTK_WIDGET_CLASS (klass)->configure_event = ddb_seekbar_real_configure_event;
+ // GTK_WIDGET_CLASS (klass)->scroll_event = ddb_seekbar_real_scroll_event;
G_OBJECT_CLASS (klass)->constructor = ddb_seekbar_constructor;
}
diff --git a/plugins/gtkui/ddbvolumebar.c b/plugins/gtkui/ddbvolumebar.c
index 41cc83a0a..e31b9600d 100644
--- a/plugins/gtkui/ddbvolumebar.c
+++ b/plugins/gtkui/ddbvolumebar.c
@@ -64,6 +64,7 @@ ddb_volumebar_size_allocate (GtkWidget *widget,
if (gtk_widget_get_realized (widget))
{
+ printf(stderr, "size_allocate -> get_realized is TRUE\n");
if (gtk_widget_get_has_window (widget))
gdk_window_move_resize (gtk_widget_get_window(widget),
allocation->x, allocation->y,
@@ -99,6 +100,92 @@ on_volumebar_scroll_event (GtkWidget *widget,
gboolean
on_volumebar_configure_event (GtkWidget *widget, GdkEventConfigure *event);
+
+static void
+ddbvolumebar_realize (GtkWidget *widget)
+{
+ DdbVolumeBar *button = DDB_VOLUMEBAR (widget);
+
+ GtkAllocation allocation;
+ GdkWindow *window;
+ GdkWindowAttr attributes;
+ gint attributes_mask;
+
+ gtk_widget_get_allocation (widget, &allocation);
+
+ gtk_widget_set_realized (widget, TRUE);
+
+ attributes.window_type = GDK_WINDOW_CHILD;
+ attributes.x = allocation.x;
+ attributes.y = allocation.y;
+ attributes.width = allocation.width;
+ attributes.height = allocation.height;
+ attributes.wclass = GDK_INPUT_ONLY;
+ attributes.event_mask = gtk_widget_get_events (widget);
+ attributes.event_mask |= (GDK_BUTTON_PRESS_MASK |
+ GDK_BUTTON_RELEASE_MASK |
+ GDK_ENTER_NOTIFY_MASK |
+ GDK_LEAVE_NOTIFY_MASK);
+
+ attributes_mask = GDK_WA_X | GDK_WA_Y;
+
+ window = gtk_widget_get_parent_window (widget);
+ gtk_widget_set_window (widget, window);
+ g_object_ref (window);
+
+ button->event_window = gdk_window_new (window,
+ &attributes, attributes_mask);
+
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_register_window (widget, button->event_window);
+#else
+ gdk_window_set_user_data (button->event_window, widget);
+#endif
+}
+
+
+static void
+ddbvolumebar_unrealize (GtkWidget *widget)
+{
+ DdbVolumeBar *button = DDB_VOLUMEBAR (widget);
+
+ if (button->event_window)
+ {
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_unregister_window (widget, button->event_window);
+#endif
+ gdk_window_destroy (button->event_window);
+ button->event_window = NULL;
+ }
+
+ GTK_WIDGET_CLASS (ddb_volumebar_parent_class)->unrealize (widget);
+}
+
+static void
+ddbvolumebar_map (GtkWidget *widget)
+{
+ DdbVolumeBar *button = DDB_VOLUMEBAR (widget);
+
+ GTK_WIDGET_CLASS (ddb_volumebar_parent_class)->map (widget);
+
+ if (button->event_window)
+ gdk_window_show (button->event_window);
+}
+
+static void
+ddbvolumebar_unmap (GtkWidget *widget)
+{
+ DdbVolumeBar *button = DDB_VOLUMEBAR (widget);
+
+ if (button->event_window)
+ {
+ gdk_window_hide (button->event_window);
+ }
+
+ GTK_WIDGET_CLASS (ddb_volumebar_parent_class)->unmap (widget);
+}
+
+
static void
ddb_volumebar_class_init(DdbVolumeBarClass *class)
{
@@ -114,6 +201,12 @@ ddb_volumebar_class_init(DdbVolumeBarClass *class)
widget_class->motion_notify_event = on_volumebar_motion_notify_event;
widget_class->scroll_event = on_volumebar_scroll_event;
widget_class->configure_event = on_volumebar_configure_event;
+
+ widget_class->realize = ddbvolumebar_realize;
+ widget_class->unrealize = ddbvolumebar_unrealize;
+ widget_class->map = ddbvolumebar_map;
+ widget_class->unmap = ddbvolumebar_unmap;
+
}
GtkWidget * ddb_volumebar_new() {
diff --git a/plugins/gtkui/ddbvolumebar.h b/plugins/gtkui/ddbvolumebar.h
index 66b0d957c..d9f823b39 100644
--- a/plugins/gtkui/ddbvolumebar.h
+++ b/plugins/gtkui/ddbvolumebar.h
@@ -44,6 +44,8 @@ typedef void * DdbVolumeBarColIter;
struct _DdbVolumeBar {
GtkWidget parent;
int show_dbs;
+
+ GdkWindow *event_window;
};
struct _DdbVolumeBarClass {
diff --git a/plugins/gtkui/widgets.c b/plugins/gtkui/widgets.c
index 65f8b43bf..904f91813 100644
--- a/plugins/gtkui/widgets.c
+++ b/plugins/gtkui/widgets.c
@@ -4319,16 +4319,13 @@ ddb_gtkui_widget_t *
w_volumebar_create (void) {
w_volumebar_t *w = malloc (sizeof (w_volumebar_t));
memset (w, 0, sizeof (w_volumebar_t));
- w->base.widget = gtk_event_box_new ();
+ w->base.widget = w->volumebar = ddb_volumebar_new ();
w->base.message = w_volumebar_message;
- w->volumebar = ddb_volumebar_new ();
#if GTK_CHECK_VERSION(3,0,0)
gtk_widget_set_events (GTK_WIDGET (w->base.widget), gtk_widget_get_events (GTK_WIDGET (w->base.widget)) | GDK_SCROLL_MASK);
#endif
- ddb_volumebar_init_signals (DDB_VOLUMEBAR (w->volumebar), w->base.widget);
gtk_widget_show (w->volumebar);
gtk_widget_set_size_request (w->base.widget, 70, -1);
- gtk_container_add (GTK_CONTAINER (w->base.widget), w->volumebar);
w_override_signals (w->base.widget, w);
return (ddb_gtkui_widget_t*)w;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment