aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorChristian Persch <chpe@cvs.gnome.org>2004-11-08 03:57:03 +0800
committerChristian Persch <chpe@src.gnome.org>2004-11-08 03:57:03 +0800
commitc9bb2e2c7f9db1ee1a6cf684e2f51c110cfa868c (patch)
tree2c8e398728ea41745cc2eab8d6adce7d893b1fb3 /lib
parentcee89e85bc3e32866e9717acdde758da5150b9c0 (diff)
downloadgsoc2013-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.c64
-rw-r--r--lib/ephy-gui.h6
-rw-r--r--lib/widgets/ephy-node-view.c30
-rw-r--r--lib/widgets/ephy-node-view.h4
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 */