]> Pileus Git - ~andy/gtk/commitdiff
Support keynav in status icons. (#473786, Li Yuan)
authorMatthias Clasen <mclasen@redhat.com>
Tue, 12 Feb 2008 03:24:03 +0000 (03:24 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Tue, 12 Feb 2008 03:24:03 +0000 (03:24 +0000)
2008-02-11  Matthias Clasen  <mclasen@redhat.com>

        Support keynav in status icons.  (#473786, Li Yuan)

        * gtk/gtkstatusicon.c: Handle keynav, make the tray icon focusable.

        * gtk/gtktrayicon-x11.c: Draw a focus rectangle when focused.

svn path=/trunk/; revision=19515

ChangeLog
gtk/gtkstatusicon.c
gtk/gtktrayicon-x11.c

index 815b20446c7e77e2e07a57d0f06ce7a9ba474e04..6c910e3fca67864ff3e163993c631b17b008ba17 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-02-11  Matthias Clasen  <mclasen@redhat.com>
+
+       Support keynav in status icons.  (#473786, Li Yuan)
+
+       * gtk/gtkstatusicon.c: Handle keynav, make the tray icon focusable.
+
+       * gtk/gtktrayicon-x11.c: Draw a focus rectangle when focused.
+
 2008-02-11  Kristian Rietveld  <kris@imendio.com>
 
        * gtk/gtkcellview.c (gtk_cell_view_cell_layout_reorder)
index 8e607f15a54d6927687acce7fb0fe8064ffba4e9..d26abede9703830dbb470f15a357a41f5c43468a 100755 (executable)
@@ -150,6 +150,9 @@ static void     gtk_status_icon_embedded_changed (GtkStatusIcon *status_icon);
 static void     gtk_status_icon_orientation_changed (GtkStatusIcon *status_icon);
 
 #endif
+static gboolean gtk_status_icon_key_press        (GtkStatusIcon  *status_icon,
+                                                 GdkEventKey    *event);
+static void     gtk_status_icon_popup_menu       (GtkStatusIcon  *status_icon);
 static gboolean gtk_status_icon_button_press     (GtkStatusIcon  *status_icon,
                                                  GdkEventButton *event);
 static void     gtk_status_icon_disable_blinking (GtkStatusIcon  *status_icon);
@@ -488,6 +491,10 @@ gtk_status_icon_init (GtkStatusIcon *status_icon)
   gtk_widget_add_events (GTK_WIDGET (priv->tray_icon),
                         GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
 
+  g_signal_connect_swapped (priv->tray_icon, "key-press-event",
+                           G_CALLBACK (gtk_status_icon_key_press), status_icon);
+  g_signal_connect_swapped (priv->tray_icon, "popup-menu",
+                           G_CALLBACK (gtk_status_icon_popup_menu), status_icon);
   g_signal_connect_swapped (priv->tray_icon, "notify::embedded",
                            G_CALLBACK (gtk_status_icon_embedded_changed), status_icon);
   g_signal_connect_swapped (priv->tray_icon, "notify::orientation",
@@ -497,6 +504,7 @@ gtk_status_icon_init (GtkStatusIcon *status_icon)
   g_signal_connect_swapped (priv->tray_icon, "screen-changed",
                            G_CALLBACK (gtk_status_icon_screen_changed), status_icon);
   priv->image = gtk_image_new ();
+  GTK_WIDGET_SET_FLAGS (priv->image, GTK_CAN_FOCUS);
   gtk_container_add (GTK_CONTAINER (priv->tray_icon), priv->image);
   gtk_widget_show (priv->image);
 
@@ -1200,6 +1208,34 @@ gtk_status_icon_orientation_changed (GtkStatusIcon *status_icon)
 
 #endif
 
+static gboolean
+gtk_status_icon_key_press (GtkStatusIcon  *status_icon,
+                          GdkEventKey    *event)
+{
+  guint state, keyval;
+
+  state = event->state & gtk_accelerator_get_default_mod_mask ();
+  keyval = event->keyval;
+  if (state == 0 &&
+      (keyval == GDK_Return ||
+       keyval == GDK_KP_Enter ||
+       keyval == GDK_ISO_Enter ||
+       keyval == GDK_space ||
+       keyval == GDK_KP_Space))
+    {
+      emit_activate_signal (status_icon);
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
+static void
+gtk_status_icon_popup_menu (GtkStatusIcon  *status_icon)
+{
+  emit_popup_menu_signal (status_icon, 0, gtk_get_current_event_time ());
+}
+
 static gboolean
 gtk_status_icon_button_press (GtkStatusIcon  *status_icon,
                              GdkEventButton *event)
index e53edde202df4ca4ba8efa5679edab94cc49d0ab..b8bec7d7dfb8f426ab0cdcdba89b09d5fb9733a9 100755 (executable)
@@ -139,13 +139,34 @@ static gboolean
 gtk_tray_icon_expose (GtkWidget      *widget, 
                      GdkEventExpose *event)
 {
+  GtkWidget *focus_child;
+  gint border_width, x, y, width, height;
+  gboolean retval = FALSE;
+
   gdk_window_clear_area (widget->window, event->area.x, event->area.y,
                         event->area.width, event->area.height);
 
-  if (GTK_WIDGET_CLASS (gtk_tray_icon_parent_class)->expose_event)  
-    return GTK_WIDGET_CLASS (gtk_tray_icon_parent_class)->expose_event (widget, event);
+  if (GTK_WIDGET_CLASS (gtk_tray_icon_parent_class)->expose_event)
+    retval = GTK_WIDGET_CLASS (gtk_tray_icon_parent_class)->expose_event (widget, event);
+
+  focus_child = GTK_CONTAINER (widget)->focus_child;
+  if (focus_child && GTK_WIDGET_HAS_FOCUS (focus_child))
+    {
+      border_width = GTK_CONTAINER (widget)->border_width;
+
+      x = widget->allocation.x + border_width;
+      y = widget->allocation.y + border_width;
+
+      width  = widget->allocation.width  - 2 * border_width;
+      height = widget->allocation.height - 2 * border_width;
+
+      gtk_paint_focus (widget->style, widget->window,
+                       GTK_WIDGET_STATE (widget),
+                       &event->area, widget, "tray_icon",
+                       x, y, width, height);
+    }
 
-  return FALSE;
+  return retval;
 }
 
 static void