From cfbf3b9d4c846f12a99624331a56048c7e3a75b7 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Tue, 24 Jul 2012 11:18:32 -0400 Subject: Use AC_CHECK_LIBM to get -lm now that gtk doesn't include that in it's .pc file --- src/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am index b849bf5..8fdd5e0 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -82,7 +82,7 @@ libidoinclude_HEADERS = \ idotimeline.h \ libido.h -libido_0_1_la_LIBADD = $(GTK_LIBS) +libido_0_1_la_LIBADD = $(GTK_LIBS) $(LIBM) libido_0_1_la_LDFLAGS = \ $(GTK_LT_LDFLAGS) \ $(COVERAGE_LDFLAGS) -- cgit v1.2.3 From 992e74684a09cf608442caf7503e0adf8eb2831d Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Tue, 21 Aug 2012 12:22:51 -0500 Subject: add IdoSwitchMenuItem --- src/Makefile.am | 3 ++ src/idoswitchmenuitem.c | 131 ++++++++++++++++++++++++++++++++++++++++++++++++ src/idoswitchmenuitem.h | 55 ++++++++++++++++++++ 3 files changed, 189 insertions(+) create mode 100644 src/idoswitchmenuitem.c create mode 100644 src/idoswitchmenuitem.h (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am index b849bf5..6ddebb2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -19,6 +19,7 @@ sources_h = \ idomessagedialog.h \ idorange.h \ idoscalemenuitem.h \ + idoswitchmenuitem.h \ idotimeline.h \ libido.h @@ -67,6 +68,7 @@ libido_0_1_la_SOURCES = \ idomessagedialog.c \ idorange.c \ idoscalemenuitem.c \ + idoswitchmenuitem.c \ idotimeline.c libido3_0_1_la_SOURCES = $(libido_0_1_la_SOURCES) @@ -79,6 +81,7 @@ libidoinclude_HEADERS = \ idomessagedialog.h \ idorange.h \ idoscalemenuitem.h \ + idoswitchmenuitem.h \ idotimeline.h \ libido.h diff --git a/src/idoswitchmenuitem.c b/src/idoswitchmenuitem.c new file mode 100644 index 0000000..451e27d --- /dev/null +++ b/src/idoswitchmenuitem.c @@ -0,0 +1,131 @@ +/* + * Copyright © 2012 Canonical Ltd. + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 3, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranties of + * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + * + * Author: Charles Kerr + */ + +#include "config.h" + +#include "idoswitchmenuitem.h" + +static gboolean ido_switch_menu_button_release_event (GtkWidget * widget, + GdkEventButton * event); + + +struct _IdoSwitchMenuItemPrivate +{ + GtkWidget * box; + GtkWidget * content_area; + GtkWidget * switch_w; + GBinding * active_binding; +}; + +/*** +**** Life Cycle +***/ + +G_DEFINE_TYPE (IdoSwitchMenuItem, ido_switch_menu_item, GTK_TYPE_CHECK_MENU_ITEM) + +static void +ido_switch_menu_item_dispose (GObject *object) +{ + IdoSwitchMenuItem * self = IDO_SWITCH_MENU_ITEM(object); + IdoSwitchMenuItemPrivate *p = self->priv; + + g_clear_object (&p->active_binding); + + G_OBJECT_CLASS (ido_switch_menu_item_parent_class)->dispose (object); +} + +static void +ido_switch_menu_item_class_init (IdoSwitchMenuItemClass *klass) +{ + GObjectClass * gobject_class; + GtkWidgetClass * widget_class; + GtkCheckMenuItemClass * check_class; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->dispose = ido_switch_menu_item_dispose; + g_type_class_add_private (gobject_class, sizeof (IdoSwitchMenuItemPrivate)); + + widget_class = GTK_WIDGET_CLASS (klass); + widget_class->button_release_event = ido_switch_menu_button_release_event; + + check_class = GTK_CHECK_MENU_ITEM_CLASS (klass); + check_class->draw_indicator = NULL; +} + +static void +ido_switch_menu_item_init (IdoSwitchMenuItem *item) +{ + IdoSwitchMenuItemPrivate *priv; + + priv = item->priv = G_TYPE_INSTANCE_GET_PRIVATE (item, IDO_TYPE_SWITCH_MENU_ITEM, IdoSwitchMenuItemPrivate); + priv->box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + priv->content_area = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + priv->switch_w = gtk_switch_new (); + + gtk_box_pack_start (GTK_BOX (priv->box), priv->content_area, TRUE, TRUE, 0); + gtk_box_pack_end (GTK_BOX (priv->box), priv->switch_w, FALSE, FALSE, 0); + gtk_container_add (GTK_CONTAINER (item), priv->box); + gtk_widget_show_all (priv->box); + + priv->active_binding = g_object_bind_property (item, "active", + priv->switch_w, "active", + G_BINDING_SYNC_CREATE); +} + +/*** +**** Don't popdown immediately after clicking this... +**** instead, wait a moment so the user can see the GtkSwitch be toggled. +***/ + +static gboolean +popdown_later_cb (gpointer widget) +{ + GtkWidget * parent = gtk_widget_get_parent (widget); + if (GTK_IS_MENU (parent)) + { + gtk_menu_popdown (GTK_MENU(parent)); + } + g_object_unref (widget); + return FALSE; +} + +static gboolean +ido_switch_menu_button_release_event (GtkWidget * widget, GdkEventButton * event) +{ + gtk_menu_item_activate (GTK_MENU_ITEM(widget)); + g_timeout_add (500, popdown_later_cb, g_object_ref(widget)); + return TRUE; /* stop the event so that popdown() won't get called yet */ +} + +/*** +**** Public API +***/ + +GtkWidget * +ido_switch_menu_item_new (void) +{ + return g_object_new (IDO_TYPE_SWITCH_MENU_ITEM, NULL); +} + +GtkContainer * +ido_switch_menu_item_get_content_area (IdoSwitchMenuItem * item) +{ + g_return_val_if_fail (IDO_IS_SWITCH_MENU_ITEM(item), NULL); + + return GTK_CONTAINER (item->priv->content_area); +} diff --git a/src/idoswitchmenuitem.h b/src/idoswitchmenuitem.h new file mode 100644 index 0000000..a63ec72 --- /dev/null +++ b/src/idoswitchmenuitem.h @@ -0,0 +1,55 @@ +/* + * Copyright © 2012 Canonical Ltd. + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 3, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranties of + * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + * + * Author: Charles Kerr + */ + +#ifndef __IDO_SWITCH_MENU_ITEM_H__ +#define __IDO_SWITCH_MENU_ITEM_H__ + +#include + +G_BEGIN_DECLS + +#define IDO_TYPE_SWITCH_MENU_ITEM (ido_switch_menu_item_get_type ()) +#define IDO_SWITCH_MENU_ITEM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), IDO_TYPE_SWITCH_MENU_ITEM, IdoSwitchMenuItem)) +#define IDO_SWITCH_MENU_ITEM_CLASS(c) (G_TYPE_CHECK_CLASS_CAST ((c), IDO_TYPE_SWITCH_MENU_ITEM, IdoSwitchMenuItemClass)) +#define IDO_IS_SWITCH_MENU_ITEM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), IDO_TYPE_SWITCH_MENU_ITEM)) +#define IDO_IS_SWITCH_MENU_ITEM_CLASS(c) (G_TYPE_CHECK_CLASS_TYPE ((c), IDO_TYPE_SWITCH_MENU_ITEM)) +#define IDO_SWITCH_MENU_ITEM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), IDO_TYPE_SWITCH_MENU_ITEM, IdoSwitchMenuItemClass)) + +typedef struct _IdoSwitchMenuItem IdoSwitchMenuItem; +typedef struct _IdoSwitchMenuItemClass IdoSwitchMenuItemClass; +typedef struct _IdoSwitchMenuItemPrivate IdoSwitchMenuItemPrivate; + +struct _IdoSwitchMenuItem +{ + GtkCheckMenuItem parent_instance; + + IdoSwitchMenuItemPrivate *priv; +}; + +struct _IdoSwitchMenuItemClass +{ + GtkCheckMenuItemClass parent_class; +}; + +GType ido_switch_menu_item_get_type (void) G_GNUC_CONST; +GtkWidget *ido_switch_menu_item_new (void); +GtkContainer *ido_switch_menu_item_get_content_area (IdoSwitchMenuItem * item); + +G_END_DECLS + +#endif /* __IDO_SWITCH_MENU_ITEM_H__ */ -- cgit v1.2.3 From 0f1f31d9925cbce92b176c0acc74e3a162450d5c Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Tue, 21 Aug 2012 13:19:50 -0500 Subject: comment tweaks --- src/idoswitchmenuitem.c | 10 ++++++---- src/idoswitchmenuitem.h | 2 ++ 2 files changed, 8 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/idoswitchmenuitem.c b/src/idoswitchmenuitem.c index 451e27d..a85ecc6 100644 --- a/src/idoswitchmenuitem.c +++ b/src/idoswitchmenuitem.c @@ -1,4 +1,6 @@ /* + * A GtkCheckMenuItem that uses a GtkSwitch to show its 'active' property + * * Copyright © 2012 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it @@ -88,8 +90,8 @@ ido_switch_menu_item_init (IdoSwitchMenuItem *item) } /*** -**** Don't popdown immediately after clicking this... -**** instead, wait a moment so the user can see the GtkSwitch be toggled. +**** Don't popdown the menu immediately after clicking on a switch... +**** wait a moment so the user can see the GtkSwitch be toggled. ***/ static gboolean @@ -101,7 +103,7 @@ popdown_later_cb (gpointer widget) gtk_menu_popdown (GTK_MENU(parent)); } g_object_unref (widget); - return FALSE; + return FALSE; /* only call this cb once */ } static gboolean @@ -109,7 +111,7 @@ ido_switch_menu_button_release_event (GtkWidget * widget, GdkEventButton * event { gtk_menu_item_activate (GTK_MENU_ITEM(widget)); g_timeout_add (500, popdown_later_cb, g_object_ref(widget)); - return TRUE; /* stop the event so that popdown() won't get called yet */ + return TRUE; /* stop the event so that it doesn't trigger popdown() */ } /*** diff --git a/src/idoswitchmenuitem.h b/src/idoswitchmenuitem.h index a63ec72..7e7e2d2 100644 --- a/src/idoswitchmenuitem.h +++ b/src/idoswitchmenuitem.h @@ -1,4 +1,6 @@ /* + * A GtkCheckMenuItem that uses a GtkSwitch to show its 'active' property. + * * Copyright © 2012 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it -- cgit v1.2.3 From c0af3f554befb151128beb21119c0f621222fe14 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Tue, 21 Aug 2012 14:24:38 -0500 Subject: don't keep the GBinding pointer around, it'll be destroyed automatically when the menuitem's destroyed --- src/idoswitchmenuitem.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/idoswitchmenuitem.c b/src/idoswitchmenuitem.c index a85ecc6..6a0be34 100644 --- a/src/idoswitchmenuitem.c +++ b/src/idoswitchmenuitem.c @@ -31,7 +31,6 @@ struct _IdoSwitchMenuItemPrivate GtkWidget * box; GtkWidget * content_area; GtkWidget * switch_w; - GBinding * active_binding; }; /*** @@ -46,8 +45,6 @@ ido_switch_menu_item_dispose (GObject *object) IdoSwitchMenuItem * self = IDO_SWITCH_MENU_ITEM(object); IdoSwitchMenuItemPrivate *p = self->priv; - g_clear_object (&p->active_binding); - G_OBJECT_CLASS (ido_switch_menu_item_parent_class)->dispose (object); } @@ -84,9 +81,9 @@ ido_switch_menu_item_init (IdoSwitchMenuItem *item) gtk_container_add (GTK_CONTAINER (item), priv->box); gtk_widget_show_all (priv->box); - priv->active_binding = g_object_bind_property (item, "active", - priv->switch_w, "active", - G_BINDING_SYNC_CREATE); + g_object_bind_property (item, "active", + priv->switch_w, "active", + G_BINDING_SYNC_CREATE); } /*** -- cgit v1.2.3 From 791d004241cff29a1143dca4d44aea07896f7381 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Tue, 21 Aug 2012 14:27:04 -0500 Subject: ...and if we're not clearing that in dispose(), then we don't need dispose() anymore --- src/idoswitchmenuitem.c | 10 ---------- 1 file changed, 10 deletions(-) (limited to 'src') diff --git a/src/idoswitchmenuitem.c b/src/idoswitchmenuitem.c index 6a0be34..192323d 100644 --- a/src/idoswitchmenuitem.c +++ b/src/idoswitchmenuitem.c @@ -39,15 +39,6 @@ struct _IdoSwitchMenuItemPrivate G_DEFINE_TYPE (IdoSwitchMenuItem, ido_switch_menu_item, GTK_TYPE_CHECK_MENU_ITEM) -static void -ido_switch_menu_item_dispose (GObject *object) -{ - IdoSwitchMenuItem * self = IDO_SWITCH_MENU_ITEM(object); - IdoSwitchMenuItemPrivate *p = self->priv; - - G_OBJECT_CLASS (ido_switch_menu_item_parent_class)->dispose (object); -} - static void ido_switch_menu_item_class_init (IdoSwitchMenuItemClass *klass) { @@ -56,7 +47,6 @@ ido_switch_menu_item_class_init (IdoSwitchMenuItemClass *klass) GtkCheckMenuItemClass * check_class; gobject_class = G_OBJECT_CLASS (klass); - gobject_class->dispose = ido_switch_menu_item_dispose; g_type_class_add_private (gobject_class, sizeof (IdoSwitchMenuItemPrivate)); widget_class = GTK_WIDGET_CLASS (klass); -- cgit v1.2.3 From fb4b30683744b22f3eae819a100ad3184b454fc8 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Tue, 21 Aug 2012 14:34:16 -0500 Subject: use gtk_menu_shell_deactivate() rather than gtk_menu_popdown(); the latter handles the issue of the menu title being painted as if the menu were still open --- src/idoswitchmenuitem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/idoswitchmenuitem.c b/src/idoswitchmenuitem.c index 192323d..3831336 100644 --- a/src/idoswitchmenuitem.c +++ b/src/idoswitchmenuitem.c @@ -87,7 +87,7 @@ popdown_later_cb (gpointer widget) GtkWidget * parent = gtk_widget_get_parent (widget); if (GTK_IS_MENU (parent)) { - gtk_menu_popdown (GTK_MENU(parent)); + gtk_menu_shell_deactivate (GTK_MENU_SHELL(parent)); } g_object_unref (widget); return FALSE; /* only call this cb once */ -- cgit v1.2.3 From fbd76f40c44dd02acaa73ebaf843189b96da3357 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Tue, 21 Aug 2012 15:19:12 -0500 Subject: when the mouse is over the GtkSwitch widget, the menuitem should delegate the mouse down and motion events to it. --- src/idoswitchmenuitem.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'src') diff --git a/src/idoswitchmenuitem.c b/src/idoswitchmenuitem.c index 3831336..2ff60a3 100644 --- a/src/idoswitchmenuitem.c +++ b/src/idoswitchmenuitem.c @@ -24,6 +24,10 @@ static gboolean ido_switch_menu_button_release_event (GtkWidget * widget, GdkEventButton * event); +static gboolean ido_switch_menu_button_press_event (GtkWidget * widget, + GdkEventButton * event); +static gboolean ido_switch_menu_item_motion_notify_event (GtkWidget *menuitem, + GdkEventMotion *event); struct _IdoSwitchMenuItemPrivate @@ -50,7 +54,9 @@ ido_switch_menu_item_class_init (IdoSwitchMenuItemClass *klass) g_type_class_add_private (gobject_class, sizeof (IdoSwitchMenuItemPrivate)); widget_class = GTK_WIDGET_CLASS (klass); + widget_class->button_press_event = ido_switch_menu_button_press_event; widget_class->button_release_event = ido_switch_menu_button_release_event; + widget_class->motion_notify_event = ido_switch_menu_item_motion_notify_event; check_class = GTK_CHECK_MENU_ITEM_CLASS (klass); check_class->draw_indicator = NULL; @@ -101,6 +107,51 @@ ido_switch_menu_button_release_event (GtkWidget * widget, GdkEventButton * event return TRUE; /* stop the event so that it doesn't trigger popdown() */ } +/*** +**** +**** +***/ + +static gboolean +ido_switch_menu_button_press_event (GtkWidget * w, GdkEventButton * e) +{ + gboolean delegated = FALSE; + IdoSwitchMenuItemPrivate * p = IDO_SWITCH_MENU_ITEM(w)->priv; + + GtkAllocation a; + gtk_widget_get_allocation (p->switch_w, &a); + + if ((a.x <= e->x) && (e->x < a.x + a.width)) + { + e->x -= a.x; + e->x_root -= a.x; + gtk_widget_event (p->switch_w, (GdkEvent*)e); + delegated = TRUE; + } + + return delegated; +} + +static gboolean +ido_switch_menu_item_motion_notify_event (GtkWidget * w, GdkEventMotion * e) +{ + gboolean delegated = FALSE; + IdoSwitchMenuItemPrivate * p = IDO_SWITCH_MENU_ITEM(w)->priv; + + GtkAllocation a; + gtk_widget_get_allocation (p->switch_w, &a); + + if ((a.x <= e->x) && (e->x < a.x + a.width)) + { + e->x -= a.x; + e->x_root -= a.x; + gtk_widget_event (p->switch_w, (GdkEvent*)e); + delegated = TRUE; + } + + return delegated; +} + /*** **** Public API ***/ -- cgit v1.2.3 From 402fffb5f852115dc4c14519e4daaf419166a7d0 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Tue, 21 Aug 2012 16:43:49 -0500 Subject: revert the event delegation for now, it's not necessary for FF --- src/idoswitchmenuitem.c | 51 ------------------------------------------------- 1 file changed, 51 deletions(-) (limited to 'src') diff --git a/src/idoswitchmenuitem.c b/src/idoswitchmenuitem.c index 2ff60a3..3831336 100644 --- a/src/idoswitchmenuitem.c +++ b/src/idoswitchmenuitem.c @@ -24,10 +24,6 @@ static gboolean ido_switch_menu_button_release_event (GtkWidget * widget, GdkEventButton * event); -static gboolean ido_switch_menu_button_press_event (GtkWidget * widget, - GdkEventButton * event); -static gboolean ido_switch_menu_item_motion_notify_event (GtkWidget *menuitem, - GdkEventMotion *event); struct _IdoSwitchMenuItemPrivate @@ -54,9 +50,7 @@ ido_switch_menu_item_class_init (IdoSwitchMenuItemClass *klass) g_type_class_add_private (gobject_class, sizeof (IdoSwitchMenuItemPrivate)); widget_class = GTK_WIDGET_CLASS (klass); - widget_class->button_press_event = ido_switch_menu_button_press_event; widget_class->button_release_event = ido_switch_menu_button_release_event; - widget_class->motion_notify_event = ido_switch_menu_item_motion_notify_event; check_class = GTK_CHECK_MENU_ITEM_CLASS (klass); check_class->draw_indicator = NULL; @@ -107,51 +101,6 @@ ido_switch_menu_button_release_event (GtkWidget * widget, GdkEventButton * event return TRUE; /* stop the event so that it doesn't trigger popdown() */ } -/*** -**** -**** -***/ - -static gboolean -ido_switch_menu_button_press_event (GtkWidget * w, GdkEventButton * e) -{ - gboolean delegated = FALSE; - IdoSwitchMenuItemPrivate * p = IDO_SWITCH_MENU_ITEM(w)->priv; - - GtkAllocation a; - gtk_widget_get_allocation (p->switch_w, &a); - - if ((a.x <= e->x) && (e->x < a.x + a.width)) - { - e->x -= a.x; - e->x_root -= a.x; - gtk_widget_event (p->switch_w, (GdkEvent*)e); - delegated = TRUE; - } - - return delegated; -} - -static gboolean -ido_switch_menu_item_motion_notify_event (GtkWidget * w, GdkEventMotion * e) -{ - gboolean delegated = FALSE; - IdoSwitchMenuItemPrivate * p = IDO_SWITCH_MENU_ITEM(w)->priv; - - GtkAllocation a; - gtk_widget_get_allocation (p->switch_w, &a); - - if ((a.x <= e->x) && (e->x < a.x + a.width)) - { - e->x -= a.x; - e->x_root -= a.x; - gtk_widget_event (p->switch_w, (GdkEvent*)e); - delegated = TRUE; - } - - return delegated; -} - /*** **** Public API ***/ -- cgit v1.2.3