aboutsummaryrefslogtreecommitdiffstats
path: root/lib/ephy-gui.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ephy-gui.c')
-rw-r--r--lib/ephy-gui.c63
1 files changed, 56 insertions, 7 deletions
diff --git a/lib/ephy-gui.c b/lib/ephy-gui.c
index 88460dc78..fe340bcc5 100644
--- a/lib/ephy-gui.c
+++ b/lib/ephy-gui.c
@@ -36,11 +36,66 @@
#include <gtk/gtklabel.h>
#include <gtk/gtkstock.h>
#include <gtk/gtkmain.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, 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:
*/
@@ -52,7 +107,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;
@@ -61,10 +115,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;
@@ -76,8 +126,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