diff options
author | Christian Persch <chpe@cvs.gnome.org> | 2004-11-08 03:57:03 +0800 |
---|---|---|
committer | Christian Persch <chpe@src.gnome.org> | 2004-11-08 03:57:03 +0800 |
commit | c9bb2e2c7f9db1ee1a6cf684e2f51c110cfa868c (patch) | |
tree | 2c8e398728ea41745cc2eab8d6adce7d893b1fb3 /lib | |
parent | cee89e85bc3e32866e9717acdde758da5150b9c0 (diff) | |
download | gsoc2013-epiphany-c9bb2e2c7f9db1ee1a6cf684e2f51c110cfa868c.tar gsoc2013-epiphany-c9bb2e2c7f9db1ee1a6cf684e2f51c110cfa868c.tar.gz gsoc2013-epiphany-c9bb2e2c7f9db1ee1a6cf684e2f51c110cfa868c.tar.bz2 gsoc2013-epiphany-c9bb2e2c7f9db1ee1a6cf684e2f51c110cfa868c.tar.lz gsoc2013-epiphany-c9bb2e2c7f9db1ee1a6cf684e2f51c110cfa868c.tar.xz gsoc2013-epiphany-c9bb2e2c7f9db1ee1a6cf684e2f51c110cfa868c.tar.zst gsoc2013-epiphany-c9bb2e2c7f9db1ee1a6cf684e2f51c110cfa868c.zip |
When popping up the context menu with keyboard, select the first menu
2004-11-07 Christian Persch <chpe@cvs.gnome.org>
* lib/ephy-gui.c: (sanitize_popup_position),
(ephy_gui_menu_position_tree_selection),
(ephy_gui_menu_position_under_widget):
* lib/ephy-gui.h:
* lib/widgets/ephy-node-view.c: (ephy_node_view_add_toggle),
(ephy_node_view_popup):
* lib/widgets/ephy-node-view.h:
* src/bookmarks/ephy-bookmark-action.c: (show_context_menu),
(popup_menu_cb), (button_press_cb):
* src/bookmarks/ephy-bookmarks-editor.c:
(ephy_bookmarks_editor_show_popup_cb),
(keyword_node_show_popup_cb):
* src/bookmarks/ephy-topic-action.c: (button_toggled_cb),
(show_context_menu), (popup_menu_cb), (button_press_cb):
* src/ephy-history-window.c: (ephy_history_window_show_popup_cb):
* src/ephy-window.c: (show_embed_popup):
When popping up the context menu with keyboard, select the first
menu item. Fixes bug #154907 (ported from HEAD).
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ephy-gui.c | 64 | ||||
-rw-r--r-- | lib/ephy-gui.h | 6 | ||||
-rw-r--r-- | lib/widgets/ephy-node-view.c | 30 | ||||
-rw-r--r-- | lib/widgets/ephy-node-view.h | 4 |
4 files changed, 96 insertions, 8 deletions
diff --git a/lib/ephy-gui.c b/lib/ephy-gui.c index 58880e075..3b80abe13 100644 --- a/lib/ephy-gui.c +++ b/lib/ephy-gui.c @@ -39,11 +39,67 @@ #include <gtk/gtkwindow.h> #include <gtk/gtkversion.h> #include <gtk/gtkicontheme.h> +#include <gtk/gtktreeselection.h> /* Styles for tab labels */ GtkStyle *loading_text_style = NULL; GtkStyle *new_text_style = NULL; +static void +sanitize_popup_position (GtkWidget *widget, GtkMenu *menu, gint *x, gint *y) +{ + GdkScreen *screen = gtk_widget_get_screen (widget); + gint monitor_num; + GdkRectangle monitor; + GtkRequisition req; + + gtk_widget_size_request (GTK_WIDGET (menu), &req); + + monitor_num = gdk_screen_get_monitor_at_point (screen, *x, *y); + gtk_menu_set_monitor (menu, monitor_num); + gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor); + + *x = CLAMP (*x, monitor.x, monitor.x + MAX (0, monitor.width - req.width)); + *y = CLAMP (*y, monitor.y, monitor.y + MAX (0, monitor.height - req.height)); +} + +void +ephy_gui_menu_position_tree_selection (GtkMenu *menu, + gint *x, + gint *y, + gboolean *push_in, + gpointer user_data) +{ + GtkTreeSelection *selection; + GList *selected_rows; + GtkTreeModel *model; + GtkTreeView *tree_view = GTK_TREE_VIEW (user_data); + GtkWidget *widget = GTK_WIDGET (user_data); + GtkRequisition req; + + gtk_widget_size_request (GTK_WIDGET (menu), &req); + gdk_window_get_origin (widget->window, x, y); + + *x += (widget->allocation.width - req.width) / 2; + + selection = gtk_tree_view_get_selection (tree_view); + selected_rows = gtk_tree_selection_get_selected_rows (selection, &model); + if (selected_rows) + { + GdkRectangle cell_rect; + + gtk_tree_view_get_cell_area (tree_view, selected_rows->data, + NULL, &cell_rect); + + *y += CLAMP (cell_rect.y + cell_rect.height, 0, widget->allocation.height); + + g_list_foreach (selected_rows, (GFunc)gtk_tree_path_free, NULL); + g_list_free (selected_rows); + } + + sanitize_popup_position (widget, menu, x, y); +} + /** * gul_gui_menu_position_under_widget: */ @@ -55,7 +111,6 @@ ephy_gui_menu_position_under_widget (GtkMenu *menu, gpointer user_data) { GtkWidget *w = GTK_WIDGET (user_data); - gint screen_width, screen_height; GtkRequisition requisition; gboolean rtl; @@ -64,10 +119,6 @@ ephy_gui_menu_position_under_widget (GtkMenu *menu, gdk_window_get_origin (w->window, x, y); gtk_widget_size_request (GTK_WIDGET (menu), &requisition); - /* FIXME multihead */ - screen_width = gdk_screen_width (); - screen_height = gdk_screen_height (); - if (rtl) { *x += w->allocation.x + w->allocation.width - requisition.width; @@ -79,8 +130,7 @@ ephy_gui_menu_position_under_widget (GtkMenu *menu, *y += w->allocation.y + w->allocation.height; - *x = CLAMP (*x, 0, MAX (0, screen_width - requisition.width)); - *y = CLAMP (*y, 0, MAX (0, screen_height - requisition.height)); + sanitize_popup_position (w, menu, x, y); } gboolean diff --git a/lib/ephy-gui.h b/lib/ephy-gui.h index b6ab7a048..60da456da 100644 --- a/lib/ephy-gui.h +++ b/lib/ephy-gui.h @@ -30,6 +30,12 @@ G_BEGIN_DECLS +void ephy_gui_menu_position_tree_selection (GtkMenu *menu, + gint *x, + gint *y, + gboolean *push_in, + gpointer user_data); + void ephy_gui_menu_position_under_widget (GtkMenu *menu, gint *x, gint *y, diff --git a/lib/widgets/ephy-node-view.c b/lib/widgets/ephy-node-view.c index 0afbb9844..818588cdf 100644 --- a/lib/widgets/ephy-node-view.c +++ b/lib/widgets/ephy-node-view.c @@ -29,6 +29,7 @@ #include <gtk/gtkcellrenderertoggle.h> #include <gtk/gtktreemodelfilter.h> #include <gtk/gtkwindow.h> +#include <gtk/gtkmain.h> #include <gdk/gdkkeysyms.h> #include "ephy-node-view.h" @@ -1577,6 +1578,35 @@ ephy_node_view_add_toggle (EphyNodeView *view, EphyTreeModelNodeValueFunc value_ gtk_tree_view_append_column (GTK_TREE_VIEW (view), col); } +void +ephy_node_view_popup (EphyNodeView *view, GtkWidget *menu) +{ + GdkEvent *event; + + event = gtk_get_current_event (); + if (event) + { + if (event->type == GDK_KEY_PRESS) + { + GdkEventKey *key = (GdkEventKey *) event; + + gtk_menu_popup (GTK_MENU (menu), NULL, NULL, + ephy_gui_menu_position_tree_selection, + view, 0, key->time); + gtk_menu_shell_select_first (GTK_MENU_SHELL (menu), FALSE); + } + else if (event->type == GDK_BUTTON_PRESS) + { + GdkEventButton *button = (GdkEventButton *) event; + + gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, + NULL, button->button, button->time); + } + + gdk_event_free (event); + } +} + static void ephy_node_view_class_init (EphyNodeViewClass *klass) { diff --git a/lib/widgets/ephy-node-view.h b/lib/widgets/ephy-node-view.h index 0779e9d5c..50251b09b 100644 --- a/lib/widgets/ephy-node-view.h +++ b/lib/widgets/ephy-node-view.h @@ -69,7 +69,6 @@ typedef struct void (*node_activated) (EphyNodeView *view, EphyNode *node); void (*node_selected) (EphyNodeView *view, EphyNode *node); void (*node_dropped) (EphyNodeView *view, EphyNode *node, GList *uris); - void (*show_popup) (EphyNodeView *view); } EphyNodeViewClass; GType ephy_node_view_get_type (void); @@ -128,6 +127,9 @@ void ephy_node_view_edit (EphyNodeView *view, gboolean ephy_node_view_is_target (EphyNodeView *view); +void ephy_node_view_popup (EphyNodeView *view, + GtkWidget *menu); + G_END_DECLS #endif /* EPHY_NODE_VIEW_H */ |