summaryrefslogtreecommitdiff
path: root/eel
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2012-10-17 23:15:29 -0400
committerCosimo Cecchi <cosimoc@gnome.org>2012-10-17 23:15:29 -0400
commitd5c4c3c0f3b12dac24479f5195dafac84cc7a3c1 (patch)
tree60f83cd17f0ad433c4bb04d582b5caa2fdf77720 /eel
parentf149927a486b647255a1713c287817a281d92f8d (diff)
downloadnautilus-d5c4c3c0f3b12dac24479f5195dafac84cc7a3c1.tar.gz
editable-label: add an input-only window for events
Add another input-only child to the parent GdkWindow's for events and imcontext. Since we will be painted in a GtkLayout, using only one input-only window won't work well with scrolling, but this way we can ensure that whatever GdkWindow the XIM engine will try to ensure native, it won't be our (floating) drawing window. https://bugzilla.gnome.org/show_bug.cgi?id=686053
Diffstat (limited to 'eel')
-rw-r--r--eel/eel-editable-label.c47
-rw-r--r--eel/eel-editable-label.h2
2 files changed, 43 insertions, 6 deletions
diff --git a/eel/eel-editable-label.c b/eel/eel-editable-label.c
index 8a9057b45..00df6abe9 100644
--- a/eel/eel-editable-label.c
+++ b/eel/eel-editable-label.c
@@ -1172,7 +1172,12 @@ static void
eel_editable_label_size_allocate (GtkWidget *widget,
GtkAllocation *allocation)
{
+ EelEditableLabel *label = EEL_EDITABLE_LABEL (widget);
+
(* GTK_WIDGET_CLASS (eel_editable_label_parent_class)->size_allocate) (widget, allocation);
+
+ gdk_window_move_resize (label->text_area, allocation->x, allocation->y,
+ allocation->width, allocation->height);
}
static void
@@ -1603,7 +1608,6 @@ eel_editable_label_realize (GtkWidget *widget)
attributes.width = allocation.width;
attributes.height = allocation.height;
attributes.visual = gtk_widget_get_visual (widget);
- attributes.cursor = gdk_cursor_new (GDK_XTERM);
attributes.event_mask = gtk_widget_get_events (widget) |
(GDK_EXPOSURE_MASK |
GDK_BUTTON_PRESS_MASK |
@@ -1615,18 +1619,35 @@ eel_editable_label_realize (GtkWidget *widget)
GDK_ENTER_NOTIFY_MASK |
GDK_LEAVE_NOTIFY_MASK);
- attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_CURSOR;
+ attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL;
window = gdk_window_new (gtk_widget_get_parent_window (widget),
&attributes, attributes_mask);
gtk_widget_set_window (widget, window);
gdk_window_set_user_data (window, widget);
+ attributes.cursor = gdk_cursor_new (GDK_XTERM);
+ attributes.window_type = GDK_WINDOW_CHILD;
+ 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_BUTTON1_MOTION_MASK |
+ GDK_BUTTON3_MOTION_MASK |
+ GDK_POINTER_MOTION_HINT_MASK |
+ GDK_POINTER_MOTION_MASK |
+ GDK_ENTER_NOTIFY_MASK |
+ GDK_LEAVE_NOTIFY_MASK);
+ attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_CURSOR;
+
+ label->text_area = gdk_window_new (gtk_widget_get_parent_window (widget),
+ &attributes, attributes_mask);
+ gdk_window_set_user_data (label->text_area, widget);
+ gtk_im_context_set_client_window (label->im_context, label->text_area);
g_object_unref (attributes.cursor);
style = gtk_widget_get_style_context (widget);
gtk_style_context_set_background (style, gtk_widget_get_window (widget));
- gtk_im_context_set_client_window (label->im_context, gtk_widget_get_window (widget));
}
static void
@@ -1636,8 +1657,14 @@ eel_editable_label_unrealize (GtkWidget *widget)
label = EEL_EDITABLE_LABEL (widget);
- /* Strange. Copied from GtkEntry, should be NULL? */
gtk_im_context_set_client_window (label->im_context, NULL);
+
+ if (label->text_area)
+ {
+ gdk_window_set_user_data (label->text_area, NULL);
+ gdk_window_destroy (label->text_area);
+ label->text_area = NULL;
+ }
(* GTK_WIDGET_CLASS (eel_editable_label_parent_class)->unrealize) (widget);
}
@@ -1645,12 +1672,20 @@ eel_editable_label_unrealize (GtkWidget *widget)
static void
eel_editable_label_map (GtkWidget *widget)
{
+ EelEditableLabel *label = EEL_EDITABLE_LABEL (widget);
+
(* GTK_WIDGET_CLASS (eel_editable_label_parent_class)->map) (widget);
+
+ gdk_window_show (label->text_area);
}
static void
eel_editable_label_unmap (GtkWidget *widget)
{
+ EelEditableLabel *label = EEL_EDITABLE_LABEL (widget);
+
+ gdk_window_hide (label->text_area);
+
(* GTK_WIDGET_CLASS (eel_editable_label_parent_class)->unmap) (widget);
}
@@ -1848,7 +1883,7 @@ eel_editable_label_motion (GtkWidget *widget,
if ((event->state & GDK_BUTTON1_MASK) == 0)
return FALSE;
- gdk_window_get_device_position (gtk_widget_get_window (widget),
+ gdk_window_get_device_position (label->text_area,
event->device,
&x, &y, NULL);
@@ -2984,7 +3019,7 @@ popup_position_func (GtkMenu *menu,
g_assert (gtk_widget_get_realized (widget));
- gdk_window_get_origin (gtk_widget_get_window (widget), x, y);
+ gdk_window_get_origin (label->text_area, x, y);
/*gtk_widget_size_request (label->popup_menu, &req);*/
gtk_widget_get_requisition (widget, &req);
diff --git a/eel/eel-editable-label.h b/eel/eel-editable-label.h
index cabcd636a..90bf31ce7 100644
--- a/eel/eel-editable-label.h
+++ b/eel/eel-editable-label.h
@@ -61,6 +61,8 @@ struct _EelEditableLabel
guint overwrite_mode : 1;
guint draw_outline : 1;
PangoWrapMode wrap_mode;
+
+ GdkWindow *text_area;
gchar *text;
int text_size; /* allocated size, in bytes */