aboutsummaryrefslogtreecommitdiff
path: root/src/idoscalemenuitem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/idoscalemenuitem.c')
-rw-r--r--src/idoscalemenuitem.c77
1 files changed, 71 insertions, 6 deletions
diff --git a/src/idoscalemenuitem.c b/src/idoscalemenuitem.c
index 8b9e1ac..8a55299 100644
--- a/src/idoscalemenuitem.c
+++ b/src/idoscalemenuitem.c
@@ -23,11 +23,18 @@
* Cody Russell <crussell@canonical.com>
*/
+#include "config.h"
+
+
#include <gtk/gtk.h>
#include "idorange.h"
#include "idoscalemenuitem.h"
#include "idotypebuiltins.h"
+#ifdef USE_GTK3
+#include "idooffscreenproxy.h"
+#endif
+
static void ido_scale_menu_item_set_property (GObject *object,
guint prop_id,
const GValue *value,
@@ -57,6 +64,11 @@ static void update_packing (IdoScaleMenuItem
struct _IdoScaleMenuItemPrivate {
GtkWidget *scale;
+
+#ifdef USE_GTK3
+ GtkWidget *proxy;
+#endif
+
GtkAdjustment *adjustment;
GtkWidget *primary_image;
GtkWidget *secondary_image;
@@ -226,6 +238,14 @@ ido_scale_menu_item_constructed (GObject *object)
priv->scale = ido_range_new (adj, range_style);
g_object_ref (priv->scale);
gtk_scale_set_draw_value (GTK_SCALE (priv->scale), FALSE);
+
+#ifdef USE_GTK3
+ gtk_widget_set_can_focus (priv->scale, FALSE);
+
+ priv->proxy = ido_offscreen_proxy_new ();
+ g_object_ref (priv->proxy);
+ gtk_container_add (GTK_CONTAINER (priv->proxy), priv->scale);
+#endif
hbox = gtk_hbox_new (FALSE, 0);
@@ -338,23 +358,39 @@ update_packing (IdoScaleMenuItem *self, IdoScaleMenuItemStyle style, IdoScaleMen
switch (old_style)
{
case IDO_SCALE_MENU_ITEM_STYLE_NONE:
- gtk_container_remove (container, priv->scale);
+#ifdef USE_GTK3
+ gtk_container_remove (container, priv->proxy);
+#else
+ gtk_container_remove (container, priv->scale);
+#endif
break;
case IDO_SCALE_MENU_ITEM_STYLE_IMAGE:
gtk_container_remove (container, priv->primary_image);
gtk_container_remove (container, priv->secondary_image);
- gtk_container_remove (container, priv->scale);
+#ifdef USE_GTK3
+ gtk_container_remove (container, priv->proxy);
+#else
+ gtk_container_remove (container, priv->scale);
+#endif
break;
case IDO_SCALE_MENU_ITEM_STYLE_LABEL:
gtk_container_remove (container, priv->primary_label);
gtk_container_remove (container, priv->secondary_label);
- gtk_container_remove (container, priv->scale);
+#ifdef USE_GTK3
+ gtk_container_remove (container, priv->proxy);
+#else
+ gtk_container_remove (container, priv->scale);
+#endif
break;
default:
- gtk_container_remove (container, priv->scale);
+#ifdef USE_GTK3
+ gtk_container_remove (container, priv->proxy);
+#else
+ gtk_container_remove (container, priv->scale);
+#endif
break;
}
}
@@ -362,23 +398,41 @@ update_packing (IdoScaleMenuItem *self, IdoScaleMenuItemStyle style, IdoScaleMen
switch (style)
{
case IDO_SCALE_MENU_ITEM_STYLE_NONE:
+#ifdef USE_GTK3
+ gtk_box_pack_start (GTK_BOX (priv->hbox), priv->proxy, FALSE, FALSE, 0);
+#else
gtk_box_pack_start (GTK_BOX (priv->hbox), priv->scale, FALSE, FALSE, 0);
+#endif
break;
case IDO_SCALE_MENU_ITEM_STYLE_IMAGE:
gtk_box_pack_start (GTK_BOX (priv->hbox), priv->primary_image, FALSE, FALSE, 0);
+
+#ifdef USE_GTK3
+ gtk_box_pack_start (GTK_BOX (priv->hbox), priv->proxy, FALSE, FALSE, 0);
+#else
gtk_box_pack_start (GTK_BOX (priv->hbox), priv->scale, FALSE, FALSE, 0);
+#endif
+
gtk_box_pack_start (GTK_BOX (priv->hbox), priv->secondary_image, FALSE, FALSE, 0);
break;
case IDO_SCALE_MENU_ITEM_STYLE_LABEL:
gtk_box_pack_start (GTK_BOX (priv->hbox), priv->primary_label, FALSE, FALSE, 0);
+#ifdef USE_GTK3
+ gtk_box_pack_start (GTK_BOX (priv->hbox), priv->proxy, FALSE, FALSE, 0);
+#else
gtk_box_pack_start (GTK_BOX (priv->hbox), priv->scale, FALSE, FALSE, 0);
+#endif
gtk_box_pack_start (GTK_BOX (priv->hbox), priv->secondary_label, FALSE, FALSE, 0);
break;
default:
+#ifdef USE_GTK3
+ gtk_box_pack_start (GTK_BOX (priv->hbox), priv->proxy, FALSE, FALSE, 0);
+#else
gtk_box_pack_start (GTK_BOX (priv->hbox), priv->scale, FALSE, FALSE, 0);
+#endif
break;
}
@@ -469,8 +523,11 @@ ido_scale_menu_item_button_press_event (GtkWidget *menuitem,
GdkEventButton *event)
{
IdoScaleMenuItemPrivate *priv = GET_PRIVATE (menuitem);
- GtkWidget *scale = priv->scale;
gdouble x;
+
+#ifndef USE_GTK3
+ GtkWidget *scale = priv->scale;
+#endif
// can we block emissions of "grab-notify" on parent??
@@ -480,12 +537,16 @@ ido_scale_menu_item_button_press_event (GtkWidget *menuitem,
translate_event_coordinates (menuitem, event->x_root, &x);
event->x_root = x;
+#ifndef USE_GTK3
ubuntu_gtk_widget_set_has_grab (scale, TRUE);
+#endif
- gtk_widget_event (scale,
+ gtk_widget_event (priv->scale,
((GdkEvent *)(void*)(event)));
+#ifndef USE_GTK3
ubuntu_gtk_widget_set_has_grab (scale, FALSE);
+#endif
if (!priv->grabbed)
{
@@ -493,7 +554,11 @@ ido_scale_menu_item_button_press_event (GtkWidget *menuitem,
g_signal_emit (menuitem, signals[SLIDER_GRABBED], 0);
}
+#ifdef USE_GTK3
+ return FALSE;
+#else
return TRUE;
+#endif
}
static gboolean