summaryrefslogtreecommitdiff
path: root/gtk/gtkmenu.c
diff options
context:
space:
mode:
authorMichael Natterer <mitch@imendio.com>2007-04-25 12:11:08 +0000
committerMichael Natterer <mitch@src.gnome.org>2007-04-25 12:11:08 +0000
commit4a741888346db0afde9968dd6eb222eb46b7341f (patch)
treeef9cd28ed103eb677861869a00fcca87c74c460a /gtk/gtkmenu.c
parent653a03c218f1a308ba437661fdc56ad91d969a91 (diff)
downloadgtk+-4a741888346db0afde9968dd6eb222eb46b7341f.tar.gz
fix ACTIVE state of scroll buttons (we were setting the state to ACTIVE
2007-04-25 Michael Natterer <mitch@imendio.com> * gtk/gtkmenu.c (gtk_menu_handle_scrolling): fix ACTIVE state of scroll buttons (we were setting the state to ACTIVE but immediately overwriting it with NORMAL or PRELIGHT). Also got rid of many separate calls to gdk_window_invalidate_rect() by remembering the old button state and only invalidating the area if the state has changed (addresses parts of bug #433242, Tommi Komulainen). (gtk_menu_scroll_to): change the arrow states only if changing from or to INSENSITIVE state, so we don't overwrite the ACTIVE state set by above function. svn path=/trunk/; revision=17630
Diffstat (limited to 'gtk/gtkmenu.c')
-rw-r--r--gtk/gtkmenu.c134
1 files changed, 75 insertions, 59 deletions
diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c
index 92eb569bd7..9c92b04401 100644
--- a/gtk/gtkmenu.c
+++ b/gtk/gtkmenu.c
@@ -2466,7 +2466,7 @@ gtk_menu_paint (GtkWidget *widget,
gtk_paint_box (widget->style,
widget->window,
priv->upper_arrow_state,
- GTK_SHADOW_OUT,
+ GTK_SHADOW_OUT,
&event->area, widget, "menu",
border_x,
border_y,
@@ -2490,7 +2490,7 @@ gtk_menu_paint (GtkWidget *widget,
gtk_paint_box (widget->style,
widget->window,
priv->lower_arrow_state,
- GTK_SHADOW_OUT,
+ GTK_SHADOW_OUT,
&event->area, widget, "menu",
border_x,
height - border_y - scroll_arrow_height,
@@ -2905,7 +2905,7 @@ gtk_menu_motion_notify (GtkWidget *widget,
if (definitely_within_item (menu_item, event->x, event->y))
menu_shell->activate_time = 0;
-
+
need_enter = (menu->navigation_region != NULL || menu_shell->ignore_enter);
/* Check to see if we are within an active submenu's navigation region
@@ -3203,36 +3203,39 @@ gtk_menu_handle_scrolling (GtkMenu *menu,
if (priv->upper_arrow_state != GTK_STATE_INSENSITIVE)
{
+ gboolean arrow_pressed = FALSE;
+ GtkStateType arrow_state = GTK_STATE_NORMAL;
+
if (menu->upper_arrow_visible && !menu->tearoff_active)
{
if (touchscreen_mode)
{
- if (enter && menu->upper_arrow_prelight &&
- menu->timeout_id == 0)
+ if (enter && menu->upper_arrow_prelight)
{
- /* Deselect the active item so that
- * any submenus are popped down
- */
- gtk_menu_shell_deselect (menu_shell);
-
- gtk_menu_remove_scroll_timeout (menu);
- menu->scroll_step = -MENU_SCROLL_STEP2; /* always fast */
-
- if (!motion)
+ if (menu->timeout_id == 0)
{
- /* Only do stuff on click. */
- gtk_menu_start_scrolling (menu);
- priv->upper_arrow_state = GTK_STATE_ACTIVE;
+ /* Deselect the active item so that
+ * any submenus are popped down
+ */
+ gtk_menu_shell_deselect (menu_shell);
+
+ gtk_menu_remove_scroll_timeout (menu);
+ menu->scroll_step = -MENU_SCROLL_STEP2; /* always fast */
+
+ if (!motion)
+ {
+ /* Only do stuff on click. */
+ gtk_menu_start_scrolling (menu);
+ arrow_pressed = TRUE;
+ }
+ }
+ else
+ {
+ arrow_pressed = TRUE;
}
-
- gdk_window_invalidate_rect (GTK_WIDGET (menu)->window,
- &rect, FALSE);
}
else if (!enter)
{
- gdk_window_invalidate_rect (GTK_WIDGET (menu)->window,
- &rect, FALSE);
-
gtk_menu_stop_scrolling (menu);
}
}
@@ -3246,8 +3249,6 @@ gtk_menu_handle_scrolling (GtkMenu *menu,
{
menu->upper_arrow_prelight = TRUE;
menu->scroll_fast = scroll_fast;
- gdk_window_invalidate_rect (GTK_WIDGET (menu)->window,
- &rect, FALSE);
/* Deselect the active item so that
* any submenus are popped down
@@ -3266,16 +3267,23 @@ gtk_menu_handle_scrolling (GtkMenu *menu,
}
else if (!enter && !in_arrow && menu->upper_arrow_prelight)
{
- gdk_window_invalidate_rect (GTK_WIDGET (menu)->window,
- &rect, FALSE);
-
gtk_menu_stop_scrolling (menu);
}
}
}
- priv->upper_arrow_state = menu->upper_arrow_prelight ?
- GTK_STATE_PRELIGHT : GTK_STATE_NORMAL;
+ if (arrow_pressed)
+ arrow_state = GTK_STATE_ACTIVE;
+ else if (menu->upper_arrow_prelight)
+ arrow_state = GTK_STATE_PRELIGHT;
+
+ if (arrow_state != priv->upper_arrow_state)
+ {
+ priv->upper_arrow_state = arrow_state;
+
+ gdk_window_invalidate_rect (GTK_WIDGET (menu)->window,
+ &rect, FALSE);
+ }
}
/* lower arrow handling */
@@ -3298,36 +3306,39 @@ gtk_menu_handle_scrolling (GtkMenu *menu,
if (priv->lower_arrow_state != GTK_STATE_INSENSITIVE)
{
+ gboolean arrow_pressed = FALSE;
+ GtkStateType arrow_state = GTK_STATE_NORMAL;
+
if (menu->lower_arrow_visible && !menu->tearoff_active)
{
if (touchscreen_mode)
{
- if (enter && menu->lower_arrow_prelight &&
- menu->timeout_id == 0)
+ if (enter && menu->lower_arrow_prelight)
{
- /* Deselect the active item so that
- * any submenus are popped down
- */
- gtk_menu_shell_deselect (menu_shell);
-
- gtk_menu_remove_scroll_timeout (menu);
- menu->scroll_step = MENU_SCROLL_STEP2; /* always fast */
-
- if (!motion)
+ if (menu->timeout_id == 0)
{
- /* Only do stuff on click. */
- gtk_menu_start_scrolling (menu);
- priv->lower_arrow_state = GTK_STATE_ACTIVE;
+ /* Deselect the active item so that
+ * any submenus are popped down
+ */
+ gtk_menu_shell_deselect (menu_shell);
+
+ gtk_menu_remove_scroll_timeout (menu);
+ menu->scroll_step = MENU_SCROLL_STEP2; /* always fast */
+
+ if (!motion)
+ {
+ /* Only do stuff on click. */
+ gtk_menu_start_scrolling (menu);
+ arrow_pressed = TRUE;
+ }
+ }
+ else
+ {
+ arrow_pressed = TRUE;
}
-
- gdk_window_invalidate_rect (GTK_WIDGET (menu)->window,
- &rect, FALSE);
}
else if (!enter)
{
- gdk_window_invalidate_rect (GTK_WIDGET (menu)->window,
- &rect, FALSE);
-
gtk_menu_stop_scrolling (menu);
}
}
@@ -3341,8 +3352,6 @@ gtk_menu_handle_scrolling (GtkMenu *menu,
{
menu->lower_arrow_prelight = TRUE;
menu->scroll_fast = scroll_fast;
- gdk_window_invalidate_rect (GTK_WIDGET (menu)->window,
- &rect, FALSE);
/* Deselect the active item so that
* any submenus are popped down
@@ -3361,16 +3370,23 @@ gtk_menu_handle_scrolling (GtkMenu *menu,
}
else if (!enter && !in_arrow && menu->lower_arrow_prelight)
{
- gdk_window_invalidate_rect (GTK_WIDGET (menu)->window,
- &rect, FALSE);
-
gtk_menu_stop_scrolling (menu);
}
}
}
- priv->lower_arrow_state = menu->lower_arrow_prelight ?
- GTK_STATE_PRELIGHT : GTK_STATE_NORMAL;
+ if (arrow_pressed)
+ arrow_state = GTK_STATE_ACTIVE;
+ else if (menu->lower_arrow_prelight)
+ arrow_state = GTK_STATE_PRELIGHT;
+
+ if (arrow_state != priv->lower_arrow_state)
+ {
+ priv->lower_arrow_state = arrow_state;
+
+ gdk_window_invalidate_rect (GTK_WIDGET (menu)->window,
+ &rect, FALSE);
+ }
}
}
@@ -4066,13 +4082,13 @@ gtk_menu_scroll_to (GtkMenu *menu,
if (offset <= 0)
priv->upper_arrow_state = GTK_STATE_INSENSITIVE;
- else
+ else if (priv->upper_arrow_state == GTK_STATE_INSENSITIVE)
priv->upper_arrow_state = menu->upper_arrow_prelight ?
GTK_STATE_PRELIGHT : GTK_STATE_NORMAL;
if (offset >= menu_height - view_height)
priv->lower_arrow_state = GTK_STATE_INSENSITIVE;
- else
+ else if (priv->lower_arrow_state == GTK_STATE_INSENSITIVE)
priv->lower_arrow_state = menu->lower_arrow_prelight ?
GTK_STATE_PRELIGHT : GTK_STATE_NORMAL;