summaryrefslogtreecommitdiff
path: root/services
diff options
authorMarco Trevisan (Treviño) <mail@3v1n0.net>2015-01-29 16:46:04 +0100
committerMarco Trevisan (Treviño) <mail@3v1n0.net>2015-01-29 16:46:04 +0100
commitc0ae4419c22327bdb51f711d612a9bbd1caa93e5 (patch)
treeb6f49191ed61bd0ac5bd49f49d4ddaaf6e850238 /services
parente5db0e8e11f8a891cc6f79f5979cf59fe765389f (diff)
PanelService: compute entry panel based also on the parent window
(bzr r3899.2.13)
Diffstat (limited to 'services')
-rw-r--r--services/panel-service.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/services/panel-service.c b/services/panel-service.c
index c8c041f0e..f473bbb2a 100644
--- a/services/panel-service.c
+++ b/services/panel-service.c
@@ -265,9 +265,10 @@ panel_service_class_init (PanelServiceClass *klass)
}
static gboolean
-is_point_in_rect (gint x, gint y, GdkRectangle* rect)
+rect_contains_point (GdkRectangle* rect, gint x, gint y)
{
- g_return_val_if_fail (rect, FALSE);
+ if (!rect)
+ return FALSE;
return (x >= rect->x && x <= (rect->x + rect->width) &&
y >= rect->y && y <= (rect->y + rect->height));
@@ -290,7 +291,7 @@ get_entry_at (PanelService *self, gint x, gint y)
IndicatorObjectEntry *entry = k;
GdkRectangle *geo = v;
- if (is_point_in_rect (x, y, geo))
+ if (rect_contains_point (geo, x, y))
{
return entry;
}
@@ -321,8 +322,7 @@ get_entry_at_panel (PanelService *self, const gchar *panel, gint x, gint y)
IndicatorObjectEntry *entry = key;
GdkRectangle *geo = value;
- if (x >= geo->x && x <= (geo->x + geo->width) &&
- y >= geo->y && y <= (geo->y + geo->height))
+ if (rect_contains_point (geo, x, y))
{
return entry;
}
@@ -332,7 +332,7 @@ get_entry_at_panel (PanelService *self, const gchar *panel, gint x, gint y)
}
static const gchar*
-get_panel_at (PanelService *self, gint x, gint y)
+get_panel_for_parent_at (PanelService *self, guint parent, gint x, gint y)
{
GHashTableIter panel_iter, entries_iter;
gpointer key, value, k, v;
@@ -346,12 +346,15 @@ get_panel_at (PanelService *self, gint x, gint y)
while (g_hash_table_iter_next (&entries_iter, &k, &v))
{
+ IndicatorObjectEntry *entry = k;
GdkRectangle *geo = v;
- if (x >= geo->x && x <= (geo->x + geo->width) &&
- y >= geo->y && y <= (geo->y + geo->height))
+ if (!parent || entry->parent_window == parent)
{
- return panel_id;
+ if (rect_contains_point (geo, x, y))
+ {
+ return panel_id;
+ }
}
}
}
@@ -1739,7 +1742,7 @@ get_monitor_at (gint x, gint y)
rect.height *= scale;
}
- if (is_point_in_rect (x, y, &rect))
+ if (rect_contains_point (&rect, x, y))
{
return i;
}
@@ -2277,7 +2280,7 @@ panel_service_show_entry_common (PanelService *self,
priv->last_x = x;
priv->last_y = y;
priv->last_menu_button = button;
- priv->last_panel = get_panel_at (self, x, y);
+ priv->last_panel = get_panel_for_parent_at (self, xid, x, y);
g_signal_connect (priv->last_menu, "hide", G_CALLBACK (on_active_menu_hidden), self);
g_signal_connect_after (priv->last_menu, "move-current",