Merge lp:~gue5t/midori/italic-urls into lp:midori

Proposed by gue5t gue5t
Status: Merged
Approved by: Cris Dywan
Approved revision: 6885
Merged at revision: 6892
Proposed branch: lp:~gue5t/midori/italic-urls
Merge into: lp:midori
Diff against target: 205 lines (+125/-30)
1 file modified
katze/gtk3-compat.c (+125/-30)
To merge this branch: bzr merge lp:~gue5t/midori/italic-urls
Reviewer Review Type Date Requested Status
Cris Dywan Approve
Review via email: mp+253001@code.launchpad.net

Commit message

Improve robustness of GTK3-compatibility placeholder text fallback

Description of the change

This makes dragging text into the locationbar and search bar work, as well as fixing the bug described in the bug report. It also simplifies the code a fair bit and gives things better names.

To post a comment you must log in.
Revision history for this message
Cris Dywan (kalikiana) wrote :

Very nice clean-up!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'katze/gtk3-compat.c'
2--- katze/gtk3-compat.c 2012-12-13 22:58:45 +0000
3+++ katze/gtk3-compat.c 2015-03-15 19:13:07 +0000
4@@ -29,52 +29,141 @@
5 }
6 }
7
8+/* returns TRUE if the entry is currently showing its placeholder text */
9+static gboolean
10+sokoke_entry_is_showing_default (GtkEntry* entry)
11+{
12+ gint showing_default = GPOINTER_TO_INT (
13+ g_object_get_data (G_OBJECT (entry), "sokoke_showing_default"));
14+
15+ const gchar* text = gtk_entry_get_text (entry);
16+ const gchar* default_text = (const gchar*)g_object_get_data (
17+ G_OBJECT (entry), "sokoke_default_text");
18+
19+ return showing_default && !g_strcmp0(text, default_text);
20+}
21+
22+/* returns TRUE if the entry is not being used by the user to perform entry or
23+hold data at a given moment */
24+static gboolean
25+sokoke_entry_is_idle (GtkEntry* entry)
26+{
27+ const gchar* text = gtk_entry_get_text (entry);
28+
29+ /* if the default is visible or the user has left the entry blank */
30+ return sokoke_entry_is_showing_default(entry) ||
31+ (text && !*text && !gtk_widget_has_focus (GTK_WIDGET (entry)));
32+}
33+
34+static gboolean
35+sokoke_on_entry_text_changed (GtkEntry* entry,
36+ GParamSpec* pspec,
37+ gpointer userdata);
38+
39+static void
40+sokoke_hide_placeholder_text (GtkEntry* entry)
41+{
42+ if(sokoke_entry_is_showing_default (entry))
43+ {
44+ g_signal_handlers_block_by_func (entry, sokoke_on_entry_text_changed, NULL);
45+ gtk_entry_set_text (entry, "");
46+ g_signal_handlers_unblock_by_func (entry, sokoke_on_entry_text_changed, NULL);
47+ }
48+ g_object_set_data (G_OBJECT (entry), "sokoke_showing_default",
49+ GINT_TO_POINTER (0));
50+ sokoke_widget_set_pango_font_style (GTK_WIDGET (entry),
51+ PANGO_STYLE_NORMAL);
52+}
53+
54 static gboolean
55 sokoke_on_entry_focus_in_event (GtkEntry* entry,
56 GdkEventFocus* event,
57 gpointer userdata)
58 {
59- gint has_default = GPOINTER_TO_INT (
60- g_object_get_data (G_OBJECT (entry), "sokoke_has_default"));
61- if (has_default)
62- {
63- g_object_set_data (G_OBJECT (entry), "sokoke_has_default",
64- GINT_TO_POINTER (0));
65- gtk_entry_set_text (entry, "");
66- sokoke_widget_set_pango_font_style (GTK_WIDGET (entry),
67- PANGO_STYLE_NORMAL);
68- }
69+ sokoke_hide_placeholder_text (entry);
70 return FALSE;
71 }
72
73-static gboolean
74-sokoke_on_entry_focus_out_event (GtkEntry* entry,
75- GdkEventFocus* event,
76- gpointer userdata)
77+static void
78+sokoke_show_placeholder_text (GtkEntry* entry)
79 {
80+ /* no need to do work if the widget is unfocused with placeholder */
81+ if(sokoke_entry_is_showing_default (entry))
82+ return;
83+
84+ /* no need to do work if the placeholder is already visible */
85 const gchar* text = gtk_entry_get_text (entry);
86 if (text && !*text)
87 {
88 const gchar* default_text = (const gchar*)g_object_get_data (
89 G_OBJECT (entry), "sokoke_default_text");
90 g_object_set_data (G_OBJECT (entry),
91- "sokoke_has_default", GINT_TO_POINTER (1));
92+ "sokoke_showing_default", GINT_TO_POINTER (1));
93+ g_signal_handlers_block_by_func (entry, sokoke_on_entry_text_changed, NULL);
94 gtk_entry_set_text (entry, default_text);
95+ g_signal_handlers_unblock_by_func (entry, sokoke_on_entry_text_changed, NULL);
96 sokoke_widget_set_pango_font_style (GTK_WIDGET (entry),
97 PANGO_STYLE_ITALIC);
98 }
99- return FALSE;
100 }
101
102 static void
103-sokoke_on_entry_drag_data_received (GtkEntry* entry,
104- GdkDragContext* drag_context,
105- gint x,
106- gint y,
107- guint timestamp,
108- gpointer user_data)
109-{
110- sokoke_on_entry_focus_in_event (entry, NULL, NULL);
111+sokoke_on_entry_drag_leave (GtkEntry* entry,
112+ GdkDragContext* drag_context,
113+ guint timestamp,
114+ gpointer user_data)
115+{
116+ sokoke_show_placeholder_text (entry);
117+}
118+
119+static gboolean
120+sokoke_on_entry_text_changed (GtkEntry* entry,
121+ GParamSpec* pspec,
122+ gpointer userdata)
123+{
124+ if(sokoke_entry_is_idle (entry))
125+ {
126+ sokoke_show_placeholder_text (entry);
127+ }
128+ else
129+ {
130+ sokoke_hide_placeholder_text (entry);
131+ }
132+
133+ return TRUE;
134+}
135+
136+static gboolean
137+sokoke_on_entry_focus_out_event (GtkEntry* entry,
138+ GdkEventFocus* event,
139+ gpointer userdata)
140+{
141+ sokoke_show_placeholder_text (entry);
142+ return FALSE;
143+}
144+
145+static gboolean
146+sokoke_on_entry_drag_motion (GtkEntry* entry,
147+ GdkDragContext* drag_context,
148+ gint x,
149+ gint y,
150+ guint timestamp,
151+ gpointer user_data)
152+{
153+ sokoke_hide_placeholder_text (entry);
154+ return FALSE;
155+}
156+
157+static gboolean
158+sokoke_on_entry_drag_drop (GtkEntry* entry,
159+ GdkDragContext* drag_context,
160+ gint x,
161+ gint y,
162+ guint timestamp,
163+ gpointer user_data)
164+{
165+ sokoke_hide_placeholder_text (entry);
166+ return FALSE;
167 }
168
169 void
170@@ -86,23 +175,29 @@
171 g_object_set_data (G_OBJECT (entry), "sokoke_default_text", (gpointer)default_text);
172
173 if (default_text == NULL)
174- g_object_set_data (G_OBJECT (entry), "sokoke_has_default", GINT_TO_POINTER (0));
175+ g_object_set_data (G_OBJECT (entry), "sokoke_showing_default", GINT_TO_POINTER (0));
176 else if (!old_value)
177 {
178- g_object_set_data (G_OBJECT (entry), "sokoke_has_default", GINT_TO_POINTER (1));
179+ g_object_set_data (G_OBJECT (entry), "sokoke_showing_default", GINT_TO_POINTER (1));
180 sokoke_widget_set_pango_font_style (GTK_WIDGET (entry), PANGO_STYLE_ITALIC);
181 gtk_entry_set_text (entry, default_text);
182- g_signal_connect (entry, "drag-data-received",
183- G_CALLBACK (sokoke_on_entry_drag_data_received), NULL);
184+ g_signal_connect (entry, "drag-motion",
185+ G_CALLBACK (sokoke_on_entry_drag_motion), NULL);
186 g_signal_connect (entry, "focus-in-event",
187 G_CALLBACK (sokoke_on_entry_focus_in_event), NULL);
188+ g_signal_connect (entry, "drag-leave",
189+ G_CALLBACK (sokoke_on_entry_drag_leave), NULL);
190+ g_signal_connect (entry, "drag-drop",
191+ G_CALLBACK (sokoke_on_entry_drag_drop), NULL);
192 g_signal_connect (entry, "focus-out-event",
193 G_CALLBACK (sokoke_on_entry_focus_out_event), NULL);
194+ g_signal_connect (entry, "notify::text",
195+ G_CALLBACK (sokoke_on_entry_text_changed), NULL);
196 }
197 else if (!gtk_widget_has_focus (GTK_WIDGET (entry)))
198 {
199- gint has_default = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (entry), "sokoke_has_default"));
200- if (has_default)
201+ gint showing_default = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (entry), "sokoke_showing_default"));
202+ if (showing_default)
203 {
204 gtk_entry_set_text (entry, default_text);
205 sokoke_widget_set_pango_font_style (GTK_WIDGET (entry), PANGO_STYLE_ITALIC);

Subscribers

People subscribed via source and target branches

to all changes: