summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/display.c83
-rw-r--r--src/include/tabpopup.h5
-rw-r--r--src/ui/tabpopup.c40
3 files changed, 110 insertions, 18 deletions
diff --git a/src/core/display.c b/src/core/display.c
index cbe0eb7e..055c15d1 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -1592,6 +1592,37 @@ static gboolean maybe_send_event_to_gtk(MetaDisplay* display, XEvent* xevent)
return TRUE;
}
+static gboolean
+mouse_event_is_in_tab_popup (MetaDisplay *display,
+ MetaScreen *screen,
+ Window event_window,
+ int event_x,
+ int event_y,
+ int *popup_x,
+ int *popup_y)
+{
+ if (screen && screen->tab_popup)
+ {
+ int x, y;
+ Window child1, child2;
+ gboolean ok1 = XTranslateCoordinates (display->xdisplay,
+ event_window, event_window,
+ event_x, event_y,
+ &x, &y, &child1);
+
+ Window popup_xid = meta_ui_tab_popup_get_xid(screen->tab_popup);
+
+ gboolean ok2 = XTranslateCoordinates (display->xdisplay,
+ event_window, popup_xid,
+ event_x, event_y,
+ popup_x, popup_y, &child2);
+
+ return (ok1 && ok2 && child1 == popup_xid);
+ }
+ else
+ return FALSE;
+}
+
/**
* This is the most important function in the whole program. It is the heart,
* it is the nexus, it is the Grand Central Station of Marco's world.
@@ -1803,26 +1834,44 @@ static gboolean event_callback(XEvent* event, gpointer data)
display->grab_window == window) ||
grab_op_is_keyboard (display->grab_op))
{
- meta_topic (META_DEBUG_WINDOW_OPS,
- "Ending grab op %u on window %s due to button press\n",
- display->grab_op,
- (display->grab_window ?
- display->grab_window->desc :
- "none"));
- if (GRAB_OP_IS_WINDOW_SWITCH (display->grab_op))
+ gboolean is_in_tab_popup = FALSE;
+ if (grab_op_is_keyboard (display->grab_op))
+ {
+ MetaScreen *screen = meta_display_screen_for_root (display, event->xany.window);
+ int popup_x, popup_y;
+ is_in_tab_popup = mouse_event_is_in_tab_popup (display,
+ screen,
+ event->xany.window,
+ event->xbutton.x,
+ event->xbutton.y,
+ &popup_x,
+ &popup_y);
+ if (is_in_tab_popup && event->xbutton.button == Button1)
+ meta_ui_tab_popup_mouse_press(screen->tab_popup, popup_x, popup_y);
+ }
+ if (!is_in_tab_popup)
{
- MetaScreen *screen;
meta_topic (META_DEBUG_WINDOW_OPS,
- "Syncing to old stack positions.\n");
- screen =
- meta_display_screen_for_root (display, event->xany.window);
-
- if (screen!=NULL)
- meta_stack_set_positions (screen->stack,
- display->grab_old_window_stacking);
+ "Ending grab op %u on window %s due to button press\n",
+ display->grab_op,
+ (display->grab_window ?
+ display->grab_window->desc :
+ "none"));
+ if (GRAB_OP_IS_WINDOW_SWITCH (display->grab_op))
+ {
+ MetaScreen *screen;
+ meta_topic (META_DEBUG_WINDOW_OPS,
+ "Syncing to old stack positions.\n");
+ screen =
+ meta_display_screen_for_root (display, event->xany.window);
+
+ if (screen!=NULL)
+ meta_stack_set_positions (screen->stack,
+ display->grab_old_window_stacking);
+ }
+ meta_display_end_grab_op (display,
+ event->xbutton.time);
}
- meta_display_end_grab_op (display,
- event->xbutton.time);
}
else if (window && display->grab_op == META_GRAB_OP_NONE)
{
diff --git a/src/include/tabpopup.h b/src/include/tabpopup.h
index 630218b0..077ec909 100644
--- a/src/include/tabpopup.h
+++ b/src/include/tabpopup.h
@@ -69,7 +69,10 @@ void meta_ui_tab_popup_up (MetaTabPopup *popup);
MetaTabEntryKey meta_ui_tab_popup_get_selected (MetaTabPopup *popup);
void meta_ui_tab_popup_select (MetaTabPopup *popup,
MetaTabEntryKey key);
-
+Window meta_ui_tab_popup_get_xid (MetaTabPopup *popup);
+void meta_ui_tab_popup_mouse_press (MetaTabPopup *popup,
+ gint x,
+ gint y);
#endif
diff --git a/src/ui/tabpopup.c b/src/ui/tabpopup.c
index 9f83fb64..b896b0e3 100644
--- a/src/ui/tabpopup.c
+++ b/src/ui/tabpopup.c
@@ -640,6 +640,46 @@ meta_ui_tab_popup_select (MetaTabPopup *popup,
}
}
+Window
+meta_ui_tab_popup_get_xid (MetaTabPopup *popup)
+{
+ if (popup != NULL && popup->window != NULL)
+ return gdk_x11_window_get_xid(gtk_widget_get_window(popup->window));
+ else
+ return 0;
+}
+
+void
+meta_ui_tab_popup_mouse_press (MetaTabPopup *popup,
+ gint x,
+ gint y)
+{
+ GList *tmp = popup->entries;
+ gboolean found = FALSE;
+ while (tmp != NULL && !found)
+ {
+ TabEntry *te = tmp->data;
+ gint wx, wy;
+ if (gtk_widget_translate_coordinates(popup->window,
+ te->widget,
+ x, y,
+ &wx, &wy))
+ {
+ GtkAllocation alloc;
+ gtk_widget_get_allocation(te->widget, &alloc);
+ found = (0 <= wx && wx < alloc.width &&
+ 0 <= wy && wy < alloc.height);
+ if (found)
+ {
+ popup->current = tmp;
+ display_entry (popup, te);
+ }
+ }
+ tmp = tmp->next;
+ }
+}
+
+
#define META_TYPE_SELECT_IMAGE (meta_select_image_get_type ())
#define META_SELECT_IMAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_SELECT_IMAGE, MetaSelectImage))