summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan Pablo Ugarte <juanpablougarte@gmail.com>2014-05-20 19:50:51 -0300
committerJuan Pablo Ugarte <juanpablougarte@gmail.com>2014-05-20 19:53:18 -0300
commite04d9a01c97d10de8d7a9d06273289a9ec9bc5ab (patch)
tree159f347c315df751920fbb08e773241d07f83dc5
parent76a8184f6f300d9e6d1a6b04eddf8fcd11a4638c (diff)
downloadglade-e04d9a01c97d10de8d7a9d06273289a9ec9bc5ab.tar.gz
GladeDesignLayout: cursor and button event cleanup.
Propagate button press properly. Fixed several pointer glitches.
-rw-r--r--gladeui/glade-design-layout.c100
1 files changed, 56 insertions, 44 deletions
diff --git a/gladeui/glade-design-layout.c b/gladeui/glade-design-layout.c
index 357efb80..5cc37746 100644
--- a/gladeui/glade-design-layout.c
+++ b/gladeui/glade-design-layout.c
@@ -75,7 +75,6 @@ struct _GladeDesignLayoutPrivate
gint child_offset;
GdkRectangle east, south, south_east;
- GdkCursor *cursor; /* Current cursor */
GdkCursor *cursors[N_ACTIVITY];
GdkRectangle child_rect;
@@ -229,14 +228,11 @@ gdl_get_activity_from_pointer (GladeDesignLayout *layout, gint x, gint y)
return ACTIVITY_NONE;
}
-static void
+static inline void
gdl_set_cursor (GladeDesignLayoutPrivate *priv, GdkCursor *cursor)
{
- if (cursor != priv->cursor)
- {
- priv->cursor = cursor;
- gdk_window_set_cursor (priv->window, cursor);
- }
+ if (cursor != gdk_window_get_cursor (priv->window))
+ gdk_window_set_cursor (priv->window, cursor);
}
static Activity
@@ -267,7 +263,7 @@ gdl_margin_get_activity (Margins margin)
}
static gboolean
-glade_design_layout_leave_notify_event (GtkWidget *widget, GdkEventCrossing *ev)
+glade_design_layout_enter_leave_notify_event (GtkWidget *widget, GdkEventCrossing *ev)
{
GtkWidget *child;
GladeDesignLayoutPrivate *priv;
@@ -278,7 +274,16 @@ glade_design_layout_leave_notify_event (GtkWidget *widget, GdkEventCrossing *ev)
priv = GLADE_DESIGN_LAYOUT_PRIVATE (widget);
- if (priv->activity == ACTIVITY_NONE)
+ if (ev->type == GDK_ENTER_NOTIFY)
+ {
+ Activity activity = priv->activity;
+
+ if (priv->activity == ACTIVITY_MARGINS)
+ activity = gdl_margin_get_activity (priv->margin);
+
+ gdl_set_cursor (priv, priv->cursors[activity]);
+ }
+ else if (priv->activity == ACTIVITY_NONE)
gdl_set_cursor (priv, NULL);
return FALSE;
@@ -390,10 +395,38 @@ gdl_alignments_invalidate (GdkWindow *window,
cairo_region_destroy (region);
}
+static void
+gdl_update_cursor_for_position (GtkWidget *widget, gint x, gint y)
+{
+ GladeDesignLayout *layout = GLADE_DESIGN_LAYOUT (widget);
+ Activity activity = gdl_get_activity_from_pointer (layout, x, y);
+ GladeDesignLayoutPrivate *priv = layout->priv;
+
+ if (priv->node_over != priv->margin &&
+ (activity == ACTIVITY_ALIGNMENTS ||
+ glade_project_get_pointer_mode (priv->project) == GLADE_POINTER_ALIGN_EDIT))
+ {
+ if (priv->selection)
+ gdl_alignments_invalidate (priv->window, widget, priv->selection,
+ priv->node_over | priv->margin);
+ else
+ gdk_window_invalidate_rect (priv->window, NULL, FALSE);
+
+ priv->node_over = priv->margin;
+ }
+
+ if (activity == ACTIVITY_MARGINS)
+ activity = gdl_margin_get_activity (priv->margin);
+
+ /* Only set the cursor if changed */
+ gdl_set_cursor (priv, priv->cursors[activity]);
+}
+
static gboolean
glade_design_layout_motion_notify_event (GtkWidget *widget, GdkEventMotion *ev)
{
- GladeDesignLayoutPrivate *priv;
+ GladeDesignLayout *layout = GLADE_DESIGN_LAYOUT (widget);
+ GladeDesignLayoutPrivate *priv = layout->priv;
GtkAllocation allocation;
GtkWidget *child;
gint x, y;
@@ -401,8 +434,6 @@ glade_design_layout_motion_notify_event (GtkWidget *widget, GdkEventMotion *ev)
if ((child = gtk_bin_get_child (GTK_BIN (widget))) == NULL)
return FALSE;
- priv = GLADE_DESIGN_LAYOUT_PRIVATE (widget);
-
x = ev->x;
y = ev->y;
@@ -427,13 +458,16 @@ glade_design_layout_motion_notify_event (GtkWidget *widget, GdkEventMotion *ev)
{
case ACTIVITY_RESIZE_WIDTH:
allocation.width = MAX (0, x - priv->dx - PADDING - OUTLINE_WIDTH);
+ glade_design_layout_update_child (layout, child, &allocation);
break;
case ACTIVITY_RESIZE_HEIGHT:
allocation.height = MAX (0, y - priv->dy - PADDING - OUTLINE_WIDTH);
+ glade_design_layout_update_child (layout, child, &allocation);
break;
case ACTIVITY_RESIZE_WIDTH_AND_HEIGHT:
allocation.height = MAX (0, y - priv->dy - PADDING - OUTLINE_WIDTH);
allocation.width = MAX (0, x - priv->dx - PADDING - OUTLINE_WIDTH);
+ glade_design_layout_update_child (layout, child, &allocation);
break;
case ACTIVITY_MARGINS:
{
@@ -486,33 +520,11 @@ glade_design_layout_motion_notify_event (GtkWidget *widget, GdkEventMotion *ev)
}
break;
default:
- {
- Activity activity = gdl_get_activity_from_pointer (GLADE_DESIGN_LAYOUT (widget), x, y);
-
- if (priv->node_over != priv->margin && (activity == ACTIVITY_ALIGNMENTS ||
- glade_project_get_pointer_mode (priv->project) == GLADE_POINTER_ALIGN_EDIT))
- {
- if (priv->selection)
- gdl_alignments_invalidate (priv->window, widget, priv->selection,
- priv->node_over | priv->margin);
- else
- gdk_window_invalidate_rect (priv->window, NULL, FALSE);
-
- priv->node_over = priv->margin;
- }
-
- if (activity == ACTIVITY_MARGINS)
- activity = gdl_margin_get_activity (priv->margin);
-
- /* Only set the cursor if changed */
- gdl_set_cursor (priv, priv->cursors[activity]);
- return TRUE;
- }
+ gdl_update_cursor_for_position (widget, x, y);
break;
}
- glade_design_layout_update_child (GLADE_DESIGN_LAYOUT (widget), child, &allocation);
- return FALSE;
+ return (priv->activity != ACTIVITY_NONE);
}
static gboolean
@@ -674,7 +686,7 @@ glade_design_layout_button_press_event (GtkWidget *widget, GdkEventButton *ev)
get_margin_bottom (selection) * -1);
gdl_set_cursor (priv, priv->cursors[gdl_margin_get_activity (priv->margin)]);
- return FALSE;
+ return TRUE;
break;
default:
gdl_set_cursor (priv, priv->cursors[priv->activity]);
@@ -696,8 +708,9 @@ glade_design_layout_button_press_event (GtkWidget *widget, GdkEventButton *ev)
_glade_design_view_thaw (priv->view);
}
- return FALSE;
+ return (activity != ACTIVITY_NONE);
}
+
static gboolean
glade_design_layout_button_release_event (GtkWidget *widget,
GdkEventButton *ev)
@@ -749,11 +762,11 @@ glade_design_layout_button_release_event (GtkWidget *widget,
priv->node_over = 0;
gdk_window_invalidate_rect (priv->window, NULL, FALSE);
}
-
+
priv->activity = ACTIVITY_NONE;
- gdl_set_cursor (priv, NULL);
+ gdl_update_cursor_for_position (widget, ev->x, ev->y);
- return FALSE;
+ return TRUE;
}
static void
@@ -1790,8 +1803,6 @@ glade_design_layout_unrealize (GtkWidget * widget)
}
}
- priv->cursor = NULL;
-
if (priv->widget_name)
{
g_object_unref (priv->widget_name);
@@ -2052,7 +2063,8 @@ glade_design_layout_class_init (GladeDesignLayoutClass * klass)
widget_class->realize = glade_design_layout_realize;
widget_class->unrealize = glade_design_layout_unrealize;
widget_class->motion_notify_event = glade_design_layout_motion_notify_event;
- widget_class->leave_notify_event = glade_design_layout_leave_notify_event;
+ widget_class->enter_notify_event = glade_design_layout_enter_leave_notify_event;
+ widget_class->leave_notify_event = glade_design_layout_enter_leave_notify_event;
widget_class->button_press_event = glade_design_layout_button_press_event;
widget_class->button_release_event = glade_design_layout_button_release_event;
widget_class->draw = glade_design_layout_draw;