static gboolean close_drawer_in_idle (gpointer data) { Drawer *drawer = (Drawer *) data; drawer->close_timeout_id = 0; if (drawer->opened_for_drag) { panel_toplevel_hide (drawer->toplevel, FALSE, -1); drawer->opened_for_drag = FALSE; } return FALSE; }
/* * This function implements Esc moving focus from the drawer to the drawer * icon and closing the drawer and Shift+Esc moving focus from the drawer * to the drawer icon without closing the drawer when focus is in the drawer. */ static gboolean key_press_drawer_widget (GtkWidget *widget, GdkEventKey *event, Drawer *drawer) { PanelWidget *panel_widget; if (event->keyval != GDK_KEY_Escape) return FALSE; panel_widget = panel_toplevel_get_panel_widget (drawer->toplevel); gtk_window_present (GTK_WINDOW (panel_widget->toplevel)); if ((event->state & gtk_accelerator_get_default_mod_mask ()) == GDK_SHIFT_MASK || panel_toplevel_get_is_hidden (drawer->toplevel)) return TRUE; panel_toplevel_hide (drawer->toplevel, FALSE, -1); return TRUE; }
static void panel_action_button_clicked (GtkButton *gtk_button) { PanelActionButton *button; g_return_if_fail (PANEL_IS_ACTION_BUTTON (gtk_button)); button = PANEL_ACTION_BUTTON (gtk_button); g_return_if_fail (button->priv->type > PANEL_ACTION_NONE); g_return_if_fail (button->priv->type < PANEL_ACTION_LAST); if (panel_global_config_get_drawer_auto_close ()) { PanelToplevel *toplevel; toplevel = PANEL_WIDGET (gtk_widget_get_parent (GTK_WIDGET (button)))->toplevel; if (panel_toplevel_get_is_attached (toplevel)) panel_toplevel_hide (toplevel, FALSE, -1); } if (actions [button->priv->type].invoke) actions [button->priv->type].invoke (GTK_WIDGET (button)); }
static gboolean key_press_drawer (GtkWidget *widget, GdkEventKey *event, Drawer *drawer) { gboolean retval = TRUE; GtkOrientation orient; if (event->state & gtk_accelerator_get_default_mod_mask ()) return FALSE; orient = PANEL_WIDGET (gtk_widget_get_parent (drawer->button))->orient; switch (event->keyval) { case GDK_KEY_Up: case GDK_KEY_KP_Up: if (orient == GTK_ORIENTATION_HORIZONTAL) { if (!panel_toplevel_get_is_hidden (drawer->toplevel)) drawer_focus_panel_widget (drawer, GTK_DIR_TAB_BACKWARD); } else { /* let default focus movement happen */ retval = FALSE; } break; case GDK_KEY_Left: case GDK_KEY_KP_Left: if (orient == GTK_ORIENTATION_VERTICAL) { if (!panel_toplevel_get_is_hidden (drawer->toplevel)) drawer_focus_panel_widget (drawer, GTK_DIR_TAB_BACKWARD); } else { /* let default focus movement happen */ retval = FALSE; } break; case GDK_KEY_Down: case GDK_KEY_KP_Down: if (orient == GTK_ORIENTATION_HORIZONTAL) { if (!panel_toplevel_get_is_hidden (drawer->toplevel)) drawer_focus_panel_widget (drawer, GTK_DIR_TAB_FORWARD); } else { /* let default focus movement happen */ retval = FALSE; } break; case GDK_KEY_Right: case GDK_KEY_KP_Right: if (orient == GTK_ORIENTATION_VERTICAL) { if (!panel_toplevel_get_is_hidden (drawer->toplevel)) drawer_focus_panel_widget (drawer, GTK_DIR_TAB_FORWARD); } else { /* let default focus movement happen */ retval = FALSE; } break; case GDK_KEY_Escape: panel_toplevel_hide (drawer->toplevel, FALSE, -1); break; default: retval = FALSE; break; } return retval; }
static void load_drawer_applet (char *toplevel_id, GSettings *settings, const char *custom_icon, gboolean use_custom_icon, const char *tooltip, PanelToplevel *parent_toplevel, gboolean locked, int pos, gboolean exactpos, const char *id) { PanelOrientation orientation; PanelToplevel *toplevel = NULL; Drawer *drawer = NULL; PanelWidget *panel_widget; orientation = panel_toplevel_get_orientation (parent_toplevel); if (toplevel_id) toplevel = panel_profile_get_toplevel_by_id (toplevel_id); if (!toplevel) toplevel = create_drawer_toplevel (id, settings); if (toplevel) { panel_toplevel_hide (toplevel, FALSE, -1); drawer = create_drawer_applet (toplevel, parent_toplevel, tooltip, custom_icon, use_custom_icon, orientation); } if (!drawer) return; panel_widget = panel_toplevel_get_panel_widget (parent_toplevel); drawer->info = mate_panel_applet_register (drawer->button, drawer, (GDestroyNotify) g_free, panel_widget, locked, pos, exactpos, PANEL_OBJECT_DRAWER, id); if (!drawer->info) { gtk_widget_destroy (GTK_WIDGET (toplevel)); return; } g_signal_connect_after (drawer->button, "size_allocate", G_CALLBACK (drawer_button_size_allocated), drawer); panel_widget_add_forbidden (panel_toplevel_get_panel_widget (drawer->toplevel)); panel_widget_set_applet_expandable (panel_widget, GTK_WIDGET (drawer->button), FALSE, TRUE); panel_widget_set_applet_size_constrained (panel_widget, GTK_WIDGET (drawer->button), TRUE); mate_panel_applet_add_callback (drawer->info, "add", "list-add", _("_Add to Drawer..."), drawer_changes_enabled); mate_panel_applet_add_callback (drawer->info, "properties", "document-properties", _("_Properties"), drawer_changes_enabled); mate_panel_applet_add_callback (drawer->info, "help", "help-browser", _("_Help"), NULL); panel_drawer_connect_to_gsettings (drawer); }