summaryrefslogtreecommitdiffstats
path: root/meta/packages/gtk+/gtk+-2.6.4-1.osso7/gtkmenushell.c.diff
diff options
context:
space:
mode:
Diffstat (limited to 'meta/packages/gtk+/gtk+-2.6.4-1.osso7/gtkmenushell.c.diff')
-rw-r--r--meta/packages/gtk+/gtk+-2.6.4-1.osso7/gtkmenushell.c.diff490
1 files changed, 490 insertions, 0 deletions
diff --git a/meta/packages/gtk+/gtk+-2.6.4-1.osso7/gtkmenushell.c.diff b/meta/packages/gtk+/gtk+-2.6.4-1.osso7/gtkmenushell.c.diff
new file mode 100644
index 0000000000..3534b7716d
--- /dev/null
+++ b/meta/packages/gtk+/gtk+-2.6.4-1.osso7/gtkmenushell.c.diff
@@ -0,0 +1,490 @@
1--- gtk+-2.6.4/gtk/gtkmenushell.c 2005-02-09 18:46:54.000000000 +0200
2+++ gtk+-2.6.4/gtk/gtkmenushell.c 2005-04-06 16:19:36.999913520 +0300
3@@ -39,6 +39,8 @@
4 #include "gtkmnemonichash.h"
5 #include "gtktearoffmenuitem.h"
6 #include "gtkwindow.h"
7+#include "gtkprivate.h"
8+#include "gtkintl.h"
9
10 #define MENU_SHELL_TIMEOUT 500
11
12@@ -52,6 +54,11 @@
13 LAST_SIGNAL
14 };
15
16+enum {
17+ PROP_0,
18+ PROP_TAKE_FOCUS
19+};
20+
21 typedef void (*GtkMenuShellSignal1) (GtkObject *object,
22 GtkMenuDirectionType arg1,
23 gpointer data);
24@@ -122,10 +129,20 @@
25 {
26 GtkMnemonicHash *mnemonic_hash;
27 GtkKeyHash *key_hash;
28+ gboolean activated_submenu;
29+ gboolean take_focus;
30 };
31
32 static void gtk_menu_shell_class_init (GtkMenuShellClass *klass);
33 static void gtk_menu_shell_init (GtkMenuShell *menu_shell);
34+static void gtk_menu_shell_set_property (GObject *object,
35+ guint prop_id,
36+ const GValue *value,
37+ GParamSpec *pspec);
38+static void gtk_menu_shell_get_property (GObject *object,
39+ guint prop_id,
40+ GValue *value,
41+ GParamSpec *pspec);
42 static void gtk_menu_shell_realize (GtkWidget *widget);
43 static void gtk_menu_shell_finalize (GObject *object);
44 static gint gtk_menu_shell_button_press (GtkWidget *widget,
45@@ -176,7 +193,6 @@
46 static GtkContainerClass *parent_class = NULL;
47 static guint menu_shell_signals[LAST_SIGNAL] = { 0 };
48
49-
50 GType
51 gtk_menu_shell_get_type (void)
52 {
53@@ -220,6 +236,8 @@
54 container_class = (GtkContainerClass*) klass;
55
56 parent_class = g_type_class_peek_parent (klass);
57+ object_class->set_property = gtk_menu_shell_set_property;
58+ object_class->get_property = gtk_menu_shell_get_property;
59
60 object_class->finalize = gtk_menu_shell_finalize;
61
62@@ -299,9 +317,15 @@
63
64
65 binding_set = gtk_binding_set_by_class (klass);
66+/* Hildon : The following binding is commented out
67+ * because we want the Escape key to only exit the
68+ * currently opened submenu. Therefore, the handling
69+ * of esc-key will be moved to gtkmenuitem.c */
70+/*
71 gtk_binding_entry_add_signal (binding_set,
72 GDK_Escape, 0,
73 "cancel", 0);
74+*/
75 gtk_binding_entry_add_signal (binding_set,
76 GDK_Return, 0,
77 "activate_current", 1,
78@@ -330,7 +354,23 @@
79 GDK_F10, GDK_SHIFT_MASK,
80 "cycle_focus", 1,
81 GTK_TYPE_DIRECTION_TYPE, GTK_DIR_TAB_BACKWARD);
82-
83+ /**
84+ * GtkMenuShell:take-focus:
85+ *
86+ * A boolean that determines whether the menu and its submenus grab the
87+ * keyboard focus. See gtk_menu_shell_set_take_focus() and
88+ * gtk_menu_shell_get_take_focus().
89+ *
90+ * Since: 2.8
91+ **/
92+ g_object_class_install_property (object_class,
93+ PROP_TAKE_FOCUS,
94+ g_param_spec_boolean ("take-focus",
95+ P_("Take Focus"),
96+ P_("A boolean that determines whether the menu grabs the keyboard focus"),
97+ TRUE,
98+ G_PARAM_READWRITE));
99+
100 g_type_class_add_private (object_class, sizeof (GtkMenuShellPrivate));
101 }
102
103@@ -356,6 +396,46 @@
104
105 priv->mnemonic_hash = NULL;
106 priv->key_hash = NULL;
107+ priv->take_focus = TRUE;
108+ priv->activated_submenu = FALSE;
109+}
110+
111+static void
112+gtk_menu_shell_set_property (GObject *object,
113+ guint prop_id,
114+ const GValue *value,
115+ GParamSpec *pspec)
116+{
117+ GtkMenuShell *menu_shell = GTK_MENU_SHELL (object);
118+
119+ switch (prop_id)
120+ {
121+ case PROP_TAKE_FOCUS:
122+ gtk_menu_shell_set_take_focus (menu_shell, g_value_get_boolean (value));
123+ break;
124+ default:
125+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
126+ break;
127+ }
128+}
129+
130+static void
131+gtk_menu_shell_get_property (GObject *object,
132+ guint prop_id,
133+ GValue *value,
134+ GParamSpec *pspec)
135+{
136+ GtkMenuShell *menu_shell = GTK_MENU_SHELL (object);
137+
138+ switch (prop_id)
139+ {
140+ case PROP_TAKE_FOCUS:
141+ g_value_set_boolean (value, gtk_menu_shell_get_take_focus (menu_shell));
142+ break;
143+ default:
144+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
145+ break;
146+ }
147 }
148
149 static void
150@@ -470,6 +550,7 @@
151 gtk_menu_shell_button_press (GtkWidget *widget,
152 GdkEventButton *event)
153 {
154+ GtkMenuShellPrivate *priv;
155 GtkMenuShell *menu_shell;
156 GtkWidget *menu_item;
157
158@@ -479,7 +560,22 @@
159 if (event->type != GDK_BUTTON_PRESS)
160 return FALSE;
161
162+ priv = GTK_MENU_SHELL_GET_PRIVATE (widget);
163+
164 menu_shell = GTK_MENU_SHELL (widget);
165+ menu_item = gtk_menu_shell_get_item (menu_shell, (GdkEvent*) event);
166+
167+ if (menu_shell->active && menu_item &&
168+ (menu_shell->active_menu_item == menu_item) &&
169+ _gtk_menu_item_is_selectable (menu_item) &&
170+ GTK_MENU_ITEM (menu_item)->submenu != NULL &&
171+ !GTK_WIDGET_VISIBLE (GTK_MENU_ITEM (menu_item)->submenu))
172+ {
173+ /* Hildon : We want to be able to activate submenu items. */
174+ gtk_menu_shell_activate_item (menu_shell, menu_item, FALSE);
175+
176+ priv->activated_submenu = TRUE;
177+ }
178
179 if (menu_shell->parent_menu_shell)
180 {
181@@ -491,30 +587,29 @@
182
183 menu_shell->button = event->button;
184
185- menu_item = gtk_menu_shell_get_item (menu_shell, (GdkEvent *)event);
186-
187 if (menu_item && _gtk_menu_item_is_selectable (menu_item))
188- {
189- if ((menu_item->parent == widget) &&
190- (menu_item != menu_shell->active_menu_item))
191- {
192- if (GTK_MENU_SHELL_GET_CLASS (menu_shell)->submenu_placement == GTK_TOP_BOTTOM)
193- {
194- menu_shell->activate_time = event->time;
195- }
196+ {
197+
198+ if ((menu_item->parent == widget) &&
199+ (menu_item != menu_shell->active_menu_item))
200+ {
201+ if (GTK_MENU_SHELL_GET_CLASS (menu_shell)->submenu_placement == GTK_TOP_BOTTOM)
202+ {
203+ menu_shell->activate_time = event->time;
204+ }
205
206- gtk_menu_shell_select_item (menu_shell, menu_item);
207- }
208- }
209+ gtk_menu_shell_select_item (menu_shell, menu_item);
210+ }
211+ }
212 }
213 else
214 {
215 widget = gtk_get_event_widget ((GdkEvent*) event);
216 if (widget == GTK_WIDGET (menu_shell))
217- {
218- gtk_menu_shell_deactivate (menu_shell);
219- g_signal_emit (menu_shell, menu_shell_signals[SELECTION_DONE], 0);
220- }
221+ {
222+ gtk_menu_shell_deactivate (menu_shell);
223+ g_signal_emit (menu_shell, menu_shell_signals[SELECTION_DONE], 0);
224+ }
225 }
226
227 return TRUE;
228@@ -524,13 +619,20 @@
229 gtk_menu_shell_button_release (GtkWidget *widget,
230 GdkEventButton *event)
231 {
232+ GtkMenuShellPrivate *priv;
233 GtkMenuShell *menu_shell;
234 GtkWidget *menu_item;
235 gint deactivate;
236+ gboolean activated_submenu;
237
238 g_return_val_if_fail (GTK_IS_MENU_SHELL (widget), FALSE);
239 g_return_val_if_fail (event != NULL, FALSE);
240
241+ priv = GTK_MENU_SHELL_GET_PRIVATE (widget);
242+
243+ activated_submenu = priv->activated_submenu;
244+ priv->activated_submenu = FALSE;
245+
246 menu_shell = GTK_MENU_SHELL (widget);
247 if (menu_shell->active)
248 {
249@@ -556,11 +658,11 @@
250 gtk_menu_shell_activate_item (menu_shell, menu_item, TRUE);
251 return TRUE;
252 }
253- else if (GTK_MENU_SHELL_GET_CLASS (menu_shell)->submenu_placement != GTK_TOP_BOTTOM)
254- {
255- gtk_menu_item_select (GTK_MENU_ITEM (menu_item));
256- return TRUE;
257- }
258+ else if (!activated_submenu)
259+ {
260+ /* popdown the submenu if we didn't pop it up in this click */
261+ _gtk_menu_item_popdown_submenu (menu_item);
262+ }
263 }
264 else if (menu_item &&
265 !_gtk_menu_item_is_selectable (menu_item) &&
266@@ -630,12 +732,14 @@
267 gtk_menu_shell_enter_notify (GtkWidget *widget,
268 GdkEventCrossing *event)
269 {
270+ GtkMenuShellPrivate *priv;
271 GtkMenuShell *menu_shell;
272 GtkWidget *menu_item;
273
274 g_return_val_if_fail (GTK_IS_MENU_SHELL (widget), FALSE);
275 g_return_val_if_fail (event != NULL, FALSE);
276
277+ priv = GTK_MENU_SHELL_GET_PRIVATE (widget);
278 menu_shell = GTK_MENU_SHELL (widget);
279
280 if (menu_shell->active)
281@@ -658,6 +762,17 @@
282 (GTK_WIDGET_STATE (menu_item) != GTK_STATE_PRELIGHT))
283 {
284 gtk_menu_shell_select_item (menu_shell, menu_item);
285+
286+ /* If the pen is down, and there is a submenu that is not
287+ * yet visible, activate it */
288+ if ((event->state & GDK_BUTTON1_MASK) &&
289+ GTK_MENU_ITEM (menu_item)->submenu != NULL &&
290+ !GTK_WIDGET_VISIBLE (GTK_MENU_ITEM (menu_item)->submenu))
291+ {
292+ gtk_menu_shell_activate_item (menu_shell, menu_item, FALSE);
293+
294+ priv->activated_submenu = TRUE;
295+ }
296 }
297 }
298 else if (menu_shell->parent_menu_shell)
299@@ -887,8 +1002,14 @@
300 /* This allows the bizarre radio buttons-with-submenus-display-history
301 * behavior
302 */
303+ /* Hildon modification. We probably won't have those
304+ * bizarre radio buttons-with-submenus so we don't
305+ * need this. Also, this functionality interferes with
306+ * other functionality. */
307+/*
308 if (GTK_MENU_ITEM (menu_shell->active_menu_item)->submenu)
309 gtk_widget_activate (menu_shell->active_menu_item);
310+*/
311 }
312
313 void
314@@ -919,7 +1040,9 @@
315
316 g_object_ref (menu_shell);
317
318- if (deactivate)
319+ /* We don't want to deactivate if we're activating
320+ * a submenu item. */
321+ if ((deactivate) && (GTK_MENU_ITEM (menu_item)->submenu == NULL))
322 {
323 GtkMenuShell *parent_menu_shell = menu_shell;
324
325@@ -965,29 +1088,30 @@
326
327 if (distance > 0)
328 {
329+ /*Hildon: selection no longer wraps around at the
330+ *bottom of the menu*/
331+
332 node = node->next;
333- while (node != start_node &&
334- (!node || !_gtk_menu_item_is_selectable (node->data)))
335+ while (node && node != start_node &&
336+ !_gtk_menu_item_is_selectable (node->data))
337 {
338- if (!node)
339- node = menu_shell->children;
340- else
341 node = node->next;
342 }
343 }
344 else
345 {
346+ /*Hildon: selection no longer wraps around at the top
347+ *of the menu*/
348+
349 node = node->prev;
350- while (node != start_node &&
351- (!node || !_gtk_menu_item_is_selectable (node->data)))
352+ while (node && node != start_node &&
353+ !_gtk_menu_item_is_selectable (node->data))
354 {
355- if (!node)
356- node = g_list_last (menu_shell->children);
357- else
358 node = node->prev;
359 }
360 }
361
362+ /*note: gtk_menu_shell_select_item won't select non-selectable items*/
363 if (node)
364 gtk_menu_shell_select_item (menu_shell, node->data);
365 }
366@@ -1119,6 +1243,16 @@
367 switch (direction)
368 {
369 case GTK_MENU_DIR_PARENT:
370+
371+ if(!parent_menu_shell || GTK_IS_MENU_BAR(parent_menu_shell))
372+ break;
373+
374+ /* hildon-modification - menu should be closed when returning from submenu.
375+ * WARNING: This function is from GtkMenu, which normally
376+ * shouldn't be called from GtkMenuShell, but currently
377+ * there are no better alternatives. */
378+ gtk_menu_popdown (GTK_MENU (menu_shell));
379+
380 if (parent_menu_shell)
381 {
382 if (GTK_MENU_SHELL_GET_CLASS (parent_menu_shell)->submenu_placement ==
383@@ -1151,10 +1285,14 @@
384 _gtk_menu_item_is_selectable (menu_shell->active_menu_item) &&
385 GTK_MENU_ITEM (menu_shell->active_menu_item)->submenu)
386 {
387+ /* Hildon-modification -- submenu is not opened automatically but needs to be explicitly opened*/
388+ g_signal_emit (G_OBJECT (menu_shell), menu_shell_signals[ACTIVATE_CURRENT], 0, (gint) FALSE);
389+
390 if (gtk_menu_shell_select_submenu_first (menu_shell))
391 break;
392 }
393
394+#if 0
395 /* Try to find a menu running the opposite direction */
396 while (parent_menu_shell &&
397 (GTK_MENU_SHELL_GET_CLASS (parent_menu_shell)->submenu_placement ==
398@@ -1173,6 +1311,7 @@
399 gtk_menu_shell_move_selected (parent_menu_shell, 1);
400 gtk_menu_shell_select_submenu_first (parent_menu_shell);
401 }
402+#endif
403 break;
404
405 case GTK_MENU_DIR_PREV:
406@@ -1197,8 +1336,8 @@
407 gtk_real_menu_shell_activate_current (GtkMenuShell *menu_shell,
408 gboolean force_hide)
409 {
410- if (menu_shell->active_menu_item &&
411- _gtk_menu_item_is_selectable (menu_shell->active_menu_item))
412+ if (menu_shell->active_menu_item)/* &&
413+ _gtk_menu_item_is_selectable (menu_shell->active_menu_item)) */
414 {
415
416 if (GTK_MENU_ITEM (menu_shell->active_menu_item)->submenu == NULL)
417@@ -1390,4 +1529,73 @@
418 keyval, target);
419 gtk_menu_shell_reset_key_hash (menu_shell);
420 }
421+/**
422+ * gtk_menu_shell_get_take_focus:
423+ * @menu: a #GtkMenuShell
424+ *
425+ * @returns: %TRUE if the menu_shell will take the keyboard focus on popup.
426+ *
427+ * Since: 2.8
428+ **/
429+gboolean
430+gtk_menu_shell_get_take_focus (GtkMenuShell *menu_shell)
431+{
432+ GtkMenuShellPrivate *priv;
433+
434+ g_return_val_if_fail (GTK_IS_MENU_SHELL (menu_shell), FALSE);
435+
436+ priv = GTK_MENU_SHELL_GET_PRIVATE (menu_shell);
437+
438+ return priv->take_focus;
439+}
440+
441+/**
442+ * gtk_menu_shell_set_take_focus:
443+ * @menu: a #GtkMenuShell
444+ * @take_focus: %TRUE if the menu_shell should take the keyboard focus on popup.
445+ *
446+ * If @take_focus is %TRUE (the default) the menu will take the keyboard focus
447+ * so that it will receive all keyboard events which is needed to enable
448+ * keyboard navigation in menus.
449+ *
450+ * Setting @take_focus to %FALSE is useful only for special applications
451+ * like virtual keyboard implementations which should not take keyboard
452+ * focus.
453+ *
454+ * The @take_focus state of a menu or menu bar is automatically propagated
455+ * to submenus whenever a submenu is popped up, so you don't have to worry
456+ * about recursively setting it for your entire menu hierarchy. Only when
457+ * programmatically picking a submenu and popping it up manually, the
458+ * @take_focus property of the submenu needs to be set explicitely.
459+ *
460+ * Note that setting it to %FALSE has side-effects:
461+ *
462+ * If the focus is in some other app, it keeps the focus and keynav in
463+ * the menu doesn't work. Consequently, keynav on the menu will only
464+ * work if the focus is on some toplevel owned by the onscreen keyboard.
465+ *
466+ * To avoid confusing the user, menus with @take_focus set to %FALSE
467+ * should not display mnemonics or accelerators, since it cannot be
468+ * guaranteed that they will work.
469+ *
470+ * See also gdk_keyboard_grab()
471+ *
472+ * Since: 2.8
473+ **/
474+void
475+gtk_menu_shell_set_take_focus (GtkMenuShell *menu_shell,
476+ gboolean take_focus)
477+{
478+ GtkMenuShellPrivate *priv;
479+
480+ g_return_if_fail (GTK_IS_MENU_SHELL (menu_shell));
481+
482+ priv = GTK_MENU_SHELL_GET_PRIVATE (menu_shell);
483+
484+ if (priv->take_focus != take_focus)
485+ {
486+ priv->take_focus = take_focus;
487+ g_object_notify (G_OBJECT (menu_shell), "take-focus");
488+ }
489+}
490