[maemo-commits] [maemo-commits] r9891 - in projects/haf/branches/gtk+/maemo-gtk-2-10: . gtk
From: subversion at stage.maemo.org subversion at stage.maemo.orgDate: Thu Feb 15 11:55:16 EET 2007
- Previous message: [maemo-commits] r9890 - projects/haf/hafbuildbot
- Next message: [maemo-commits] r9892 - in projects/haf/branches/gtk+/maemo-gtk-2-10: . gtk
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Author: mitch Date: 2007-02-15 11:55:13 +0200 (Thu, 15 Feb 2007) New Revision: 9891 Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenu.c projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenushell.c projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenushell.h Log: 2007-02-15 Michael Natterer <mitch at imendio.com> Port over the remaining logic changes from maemo-gtk-2-6. The menus should behave as specified now. * gtk/gtkmenushell.c: add private memmbers "activated_submenu" and "first_click". (gtk_menu_shell_button_press) (gtk_menu_shell_button_release) (gtk_menu_shell_button_enter_notify) (gtk_menu_shell_button_leave_notify): activate submenus on button events. (gtk_menu_shell_real_select_item): don't activate submenus on item selection. (gtk_menu_shell_activate_item) (gtk_menu_shell_select_submenu_first) (gtk_menu_shell_activate_current): changed submenu activation and deactivation behavior. (gtk_real_menu_shell_move_current): deactivate submenu when keyboard-navigating to parent. (_gtk_menu_shell_set_first_click): new private api. * gtk/gtkmenushell.h: add _gtk_menu_shell_set_first_click(). * gtk/gtkmenu.c (gtk_menu_popup): call _gtk_menu_shell_set_first_click(). Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog =================================================================== --- projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog 2007-02-15 09:36:11 UTC (rev 9890) +++ projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog 2007-02-15 09:55:13 UTC (rev 9891) @@ -1,3 +1,35 @@ +2007-02-15 Michael Natterer <mitch at imendio.com> + + Port over the remaining logic changes from maemo-gtk-2-6. The + menus should behave as specified now. + + * gtk/gtkmenushell.c: add private memmbers "activated_submenu" and + "first_click". + + (gtk_menu_shell_button_press) + (gtk_menu_shell_button_release) + (gtk_menu_shell_button_enter_notify) + (gtk_menu_shell_button_leave_notify): activate submenus on button + events. + + (gtk_menu_shell_real_select_item): don't activate submenus on item + selection. + + (gtk_menu_shell_activate_item) + (gtk_menu_shell_select_submenu_first) + (gtk_menu_shell_activate_current): changed submenu activation + and deactivation behavior. + + (gtk_real_menu_shell_move_current): deactivate submenu when + keyboard-navigating to parent. + + (_gtk_menu_shell_set_first_click): new private api. + + * gtk/gtkmenushell.h: add _gtk_menu_shell_set_first_click(). + + * gtk/gtkmenu.c (gtk_menu_popup): call + _gtk_menu_shell_set_first_click(). + 2007-02-14 Kristian Rietveld <kris at imendio.com> * gtk/gtktreeview.c (gtk_tree_view_grab_notify): stop possibly Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenu.c =================================================================== --- projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenu.c 2007-02-15 09:36:11 UTC (rev 9890) +++ projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenu.c 2007-02-15 09:55:13 UTC (rev 9891) @@ -1540,9 +1540,9 @@ &priv->popup_pointer_x, &priv->popup_pointer_y, NULL); -#endif /* MAEMO_CHANGES */ -#ifdef MAEMO_CHANGES + _gtk_menu_shell_set_first_click (menu_shell); + /* if no item is selected, select the first one */ if (!menu_shell->active_menu_item) gtk_menu_shell_select_first (menu_shell, TRUE); Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenushell.c =================================================================== --- projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenushell.c 2007-02-15 09:36:11 UTC (rev 9890) +++ projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenushell.c 2007-02-15 09:55:13 UTC (rev 9891) @@ -32,6 +32,9 @@ #include "gtkkeyhash.h" #include "gtkmain.h" #include "gtkmarshalers.h" +#ifdef MAEMO_CHANGES +#include "gtkmenu.h" +#endif /* MAEMO_CHANGES */ #include "gtkmenubar.h" #include "gtkmenuitem.h" #include "gtkmenushell.h" @@ -140,6 +143,10 @@ GtkKeyHash *key_hash; gboolean take_focus; +#ifdef MAEMO_CHANGES + gboolean activated_submenu; + gboolean first_click; +#endif /* MAEMO_CHANGES */ }; static void gtk_menu_shell_set_property (GObject *object, @@ -388,6 +395,10 @@ priv->mnemonic_hash = NULL; priv->key_hash = NULL; priv->take_focus = TRUE; +#ifdef MAEMO_CHANGES + priv->activated_submenu = FALSE; + priv->first_click = FALSE; +#endif /* MAEMO_CHANGES */ } static void @@ -540,6 +551,9 @@ gtk_menu_shell_button_press (GtkWidget *widget, GdkEventButton *event) { +#ifdef MAEMO_CHANGES + GtkMenuShellPrivate *priv; +#endif /* MAEMO_CHANGES */ GtkMenuShell *menu_shell; GtkWidget *menu_item; @@ -551,17 +565,28 @@ menu_shell = GTK_MENU_SHELL (widget); +#ifdef MAEMO_CHANGES + priv = GTK_MENU_SHELL_GET_PRIVATE (widget); + menu_item = gtk_menu_shell_get_item (menu_shell, (GdkEvent *)event); +#endif /* MAEMO_CHANGES */ + +#ifdef MAEMO_CHANGES + if (!menu_shell->active) +#else if (menu_shell->parent_menu_shell) { return gtk_widget_event (menu_shell->parent_menu_shell, (GdkEvent*) event); } else if (!menu_shell->active || !menu_shell->button) +#endif /* MAEMO_CHANGES */ { _gtk_menu_shell_activate (menu_shell); menu_shell->button = event->button; +#ifndef MAEMO_CHANGES menu_item = gtk_menu_shell_get_item (menu_shell, (GdkEvent *)event); +#endif /* MAEMO_CHANGES */ if (menu_item && _gtk_menu_item_is_selectable (menu_item)) { @@ -579,6 +604,29 @@ } else { +#ifdef MAEMO_CHANGES + priv->first_click = FALSE; + + /* Activate submenu on button press, so that we can drag-move into it if + * necessary. + */ + if (menu_item && _gtk_menu_item_is_selectable (menu_item) && + GTK_MENU_ITEM (menu_item)->submenu != NULL && + !GTK_WIDGET_VISIBLE (GTK_MENU_ITEM (menu_item)->submenu)) + { + /* Hildon-crack: The item could be unselected when the tap + * occurs, make sure it gets selected. The real fix is bug#11670, + * remove this crack when it is done. + * NB#9417 + */ + gtk_menu_shell_select_item (menu_shell, menu_item); + + gtk_menu_shell_activate_item (menu_shell, menu_item, FALSE); + + priv->activated_submenu = TRUE; + } +#endif /* MAEMO_CHANGES */ + widget = gtk_get_event_widget ((GdkEvent*) event); if (widget == GTK_WIDGET (menu_shell)) { @@ -614,6 +662,9 @@ gtk_menu_shell_button_release (GtkWidget *widget, GdkEventButton *event) { +#ifdef MAEMO_CHANGES + GtkMenuShellPrivate *priv; +#endif /* MAEMO_CHANGES */ GtkMenuShell *menu_shell; GtkWidget *menu_item; gint deactivate; @@ -622,6 +673,80 @@ g_return_val_if_fail (event != NULL, FALSE); menu_shell = GTK_MENU_SHELL (widget); + +#ifdef MAEMO_CHANGES + + priv = GTK_MENU_SHELL_GET_PRIVATE (widget); + + menu_item = gtk_menu_shell_get_item (menu_shell, (GdkEvent*) event); + + if (menu_item && _gtk_menu_item_is_selectable (menu_item)) + { + if (GTK_MENU_ITEM (menu_item)->submenu == NULL) + { + GtkSettings *settings = gtk_widget_get_settings (widget); + int timeout; + + g_object_get (settings, "gtk-timeout-initial", &timeout, NULL); + + /* Prevent immediate activation on first click, this is mainly + * for combo popups and the like. */ + if (!priv->first_click || + (menu_shell->activate_time == 0) || + ((event->time - menu_shell->activate_time) > timeout)) + gtk_menu_shell_activate_item (menu_shell, menu_item, TRUE); + + /* activate_item will take care of deactivation if needed */ + deactivate = FALSE; + } + else + { + /* If we ended up on an item with a submenu, leave the menu up. */ + deactivate = FALSE; + + /* popdown the submenu if we didn't pop it up in this click */ + if (!priv->activated_submenu && + GTK_MENU_SHELL_GET_CLASS (menu_shell)->submenu_placement != GTK_TOP_BOTTOM) + _gtk_menu_item_popdown_submenu (menu_item); + } + } + else if (menu_item && + !_gtk_menu_item_is_selectable (menu_item) && + GTK_MENU_SHELL_GET_CLASS (menu_shell)->submenu_placement != GTK_TOP_BOTTOM) + { + deactivate = FALSE; + } + else if (menu_shell->parent_menu_shell) + { + /* Forward to parent (deactivate, mostly) if we have one */ + gtk_widget_event (menu_shell->parent_menu_shell, (GdkEvent*) event); + + deactivate = FALSE; + } + else + { + /* Not over a menuitem of any kind, no parent shell, so deactivate. */ + deactivate = TRUE; + } + + if (priv->first_click) + { + /* We only ever want to prevent deactivation on the first + * press/release. */ + priv->first_click = FALSE; + + deactivate = FALSE; + } + + if (deactivate) + { + gtk_menu_shell_deactivate (menu_shell); + g_signal_emit (menu_shell, menu_shell_signals[SELECTION_DONE], 0); + } + + priv->activated_submenu = FALSE; + +#else /* !MAEMO_CHANGES */ if (menu_shell->active) { if (menu_shell->button && (event->button != menu_shell->button)) @@ -692,6 +817,7 @@ g_signal_emit (menu_shell, menu_shell_signals[SELECTION_DONE], 0); } } +#endif /* MAEMO_CHANGES */ return TRUE; } @@ -728,6 +854,9 @@ gtk_menu_shell_enter_notify (GtkWidget *widget, GdkEventCrossing *event) { +#ifdef MAEMO_CHANGES + GtkMenuShellPrivate *priv; +#endif /* MAEMO_CHANGES */ GtkMenuShell *menu_shell; GtkWidget *menu_item; @@ -736,6 +865,10 @@ menu_shell = GTK_MENU_SHELL (widget); +#ifdef MAEMO_CHANGES + priv = GTK_MENU_SHELL_GET_PRIVATE (widget); +#endif /* MAEMO_CHANGES */ + if (menu_shell->active) { menu_item = gtk_get_event_widget ((GdkEvent*) event); @@ -756,6 +889,20 @@ (GTK_WIDGET_STATE (menu_item) != GTK_STATE_PRELIGHT)) { gtk_menu_shell_select_item (menu_shell, menu_item); + +#ifdef MAEMO_CHANGES + /* If the pen is down, and there is a submenu that is not + * yet visible, activate it + */ + if ((event->state & GDK_BUTTON1_MASK) && + GTK_MENU_ITEM (menu_item)->submenu != NULL && + !GTK_WIDGET_VISIBLE (GTK_MENU_ITEM (menu_item)->submenu)) + { + gtk_menu_shell_activate_item (menu_shell, menu_item, FALSE); + + priv->activated_submenu = TRUE; + } +#endif /* MAEMO_CHANGES */ } } else if (menu_shell->parent_menu_shell) @@ -791,8 +938,14 @@ if (!_gtk_menu_item_is_selectable (event_widget)) return TRUE; +#ifdef MAEMO_CHANGES if ((menu_shell->active_menu_item == event_widget) && + ((menu_item->submenu == NULL) || + (!GTK_WIDGET_VISIBLE (menu_item->submenu)))) +#else + if ((menu_shell->active_menu_item == event_widget) && (menu_item->submenu == NULL)) +#endif /* MAEMO_CHANGES */ { if ((event->detail != GDK_NOTIFY_INFERIOR) && (GTK_WIDGET_STATE (menu_item) != GTK_STATE_NORMAL)) @@ -883,6 +1036,12 @@ { if (menu_shell->active) { +#ifdef MAEMO_CHANGES + GtkMenuShellPrivate *priv = GTK_MENU_SHELL_GET_PRIVATE (menu_shell); + + priv->first_click = FALSE; +#endif /* MAEMO_CHANGES */ + menu_shell->button = 0; menu_shell->active = FALSE; menu_shell->activate_time = 0; @@ -988,11 +1147,13 @@ GTK_MENU_SHELL_GET_CLASS (menu_shell)->submenu_placement); gtk_menu_item_select (GTK_MENU_ITEM (menu_shell->active_menu_item)); +#ifndef MAEMO_CHANGES /* This allows the bizarre radio buttons-with-submenus-display-history * behavior */ if (GTK_MENU_ITEM (menu_shell->active_menu_item)->submenu) gtk_widget_activate (menu_shell->active_menu_item); +#endif /* !MAEMO_CHANGES */ } void @@ -1014,6 +1175,9 @@ { GSList *slist, *shells = NULL; gboolean deactivate = force_deactivate; +#ifdef MAEMO_CHANGES + gboolean submenu = FALSE; +#endif /* MAEMO_CHANGES */ g_return_if_fail (GTK_IS_MENU_SHELL (menu_shell)); g_return_if_fail (GTK_IS_MENU_ITEM (menu_item)); @@ -1024,7 +1188,16 @@ g_object_ref (menu_shell); g_object_ref (menu_item); +#ifdef MAEMO_CHANGES + if (GTK_MENU_ITEM (menu_item)->submenu != NULL) + submenu = TRUE; +#endif /* MAEMO_CHANGES */ + +#ifdef MAEMO_CHANGES + if (deactivate && !submenu) +#else if (deactivate) +#endif /* MAEMO_CHANGES */ { GtkMenuShell *parent_menu_shell = menu_shell; @@ -1044,15 +1217,29 @@ */ gdk_display_sync (gtk_widget_get_display (menu_item)); } +#ifdef MAEMO_CHANGES + else if (submenu) + { + _gtk_menu_item_set_placement (GTK_MENU_ITEM (menu_item), + GTK_MENU_SHELL_GET_CLASS (menu_shell)->submenu_placement); + } +#endif /* MAEMO_CHANGES */ gtk_widget_activate (menu_item); +#ifdef MAEMO_CHANGES + if (!submenu) + { +#endif /* MAEMO_CHANGES */ for (slist = shells; slist; slist = slist->next) { g_signal_emit (slist->data, menu_shell_signals[SELECTION_DONE], 0); g_object_unref (slist->data); } g_slist_free (shells); +#ifdef MAEMO_CHANGES + } +#endif /* MAEMO_CHANGES */ g_object_unref (menu_shell); g_object_unref (menu_item); @@ -1192,7 +1379,11 @@ if (menu_item->submenu) { +#ifdef MAEMO_CHANGES + gtk_menu_shell_activate_item (menu_shell, GTK_WIDGET (menu_item), FALSE); +#else _gtk_menu_item_popup_submenu (GTK_WIDGET (menu_item)); +#endif /* MAEMO_CHANGES */ gtk_menu_shell_select_first (GTK_MENU_SHELL (menu_item->submenu), TRUE); if (GTK_MENU_SHELL (menu_item->submenu)->active_menu_item) return TRUE; @@ -1216,6 +1407,19 @@ switch (direction) { case GTK_MENU_DIR_PARENT: + +#ifdef MAEMO_CHANGES + if(!parent_menu_shell || GTK_IS_MENU_BAR (parent_menu_shell)) + break; + + /* menu should be closed when returning from submenu. + * WARNING: This function is from GtkMenu, which normally + * shouldn't be called from GtkMenuShell, but currently + * there are no better alternatives. + */ + gtk_menu_popdown (GTK_MENU (menu_shell)); +#endif /* MAEMO_CHANGES */ + if (parent_menu_shell) { if (GTK_MENU_SHELL_GET_CLASS (parent_menu_shell)->submenu_placement == @@ -1255,6 +1459,7 @@ break; } +#ifndef MAEMO_CHANGES /* Try to find a menu running the opposite direction */ while (parent_menu_shell && (GTK_MENU_SHELL_GET_CLASS (parent_menu_shell)->submenu_placement == @@ -1277,6 +1482,7 @@ gtk_menu_shell_select_submenu_first (parent_menu_shell); } +#endif /* !MAEMO_CHANGES */ break; case GTK_MENU_DIR_PREV: @@ -1303,13 +1509,16 @@ if (menu_shell->active_menu_item && _gtk_menu_item_is_selectable (menu_shell->active_menu_item)) { - +#ifndef MAEMO_CHANGES if (GTK_MENU_ITEM (menu_shell->active_menu_item)->submenu == NULL) +#endif /* !MAEMO_CHANGES */ gtk_menu_shell_activate_item (menu_shell, menu_shell->active_menu_item, force_hide); +#ifndef MAEMO_CHANGES else _gtk_menu_item_popup_submenu (menu_shell->active_menu_item); +#endif /* !MAEMO_CHANGES */ } } @@ -1566,5 +1775,15 @@ } } +#ifdef MAEMO_CHANGES +void +_gtk_menu_shell_set_first_click (GtkMenuShell *menu_shell) +{ + GtkMenuShellPrivate *priv = GTK_MENU_SHELL_GET_PRIVATE (menu_shell); + + priv->first_click = TRUE; +} +#endif /* MAEMO_CHANGES */ + #define __GTK_MENU_SHELL_C__ #include "gtkaliasdef.c" Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenushell.h =================================================================== --- projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenushell.h 2007-02-15 09:36:11 UTC (rev 9890) +++ projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkmenushell.h 2007-02-15 09:55:13 UTC (rev 9891) @@ -126,6 +126,10 @@ void gtk_menu_shell_set_take_focus (GtkMenuShell *menu_shell, gboolean take_focus); +#ifdef MAEMO_CHANGES +void _gtk_menu_shell_set_first_click (GtkMenuShell *menu_shell); +#endif /* MAEMO_CHANGES */ + G_END_DECLS #endif /* __GTK_MENU_SHELL_H__ */
- Previous message: [maemo-commits] r9890 - projects/haf/hafbuildbot
- Next message: [maemo-commits] r9892 - in projects/haf/branches/gtk+/maemo-gtk-2-10: . gtk
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]