Add signals for when windows change monitors

This is useful in order to track e.g. which windows are on the primary
monitor.

https://bugzilla.gnome.org/show_bug.cgi?id=609258
This commit is contained in:
Alexander Larsson 2011-02-28 21:26:11 +01:00
parent 4e28a4d654
commit 74b97dcd14
3 changed files with 53 additions and 0 deletions

View File

@ -84,6 +84,8 @@ enum
WORKSPACE_ADDED, WORKSPACE_ADDED,
WORKSPACE_REMOVED, WORKSPACE_REMOVED,
WORKSPACE_SWITCHED, WORKSPACE_SWITCHED,
WINDOW_ENTERED_MONITOR,
WINDOW_LEFT_MONITOR,
STARTUP_SEQUENCE_CHANGED, STARTUP_SEQUENCE_CHANGED,
WORKAREAS_CHANGED, WORKAREAS_CHANGED,
MONITORS_CHANGED, MONITORS_CHANGED,
@ -201,6 +203,28 @@ meta_screen_class_init (MetaScreenClass *klass)
G_TYPE_INT, G_TYPE_INT,
MUTTER_TYPE_MOTION_DIRECTION); MUTTER_TYPE_MOTION_DIRECTION);
screen_signals[WINDOW_ENTERED_MONITOR] =
g_signal_new ("window-entered-monitor",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
_mutter_marshal_VOID__INT_OBJECT,
G_TYPE_NONE, 2,
G_TYPE_INT,
META_TYPE_WINDOW);
screen_signals[WINDOW_LEFT_MONITOR] =
g_signal_new ("window-left-monitor",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
_mutter_marshal_VOID__INT_OBJECT,
G_TYPE_NONE, 2,
G_TYPE_INT,
META_TYPE_WINDOW);
screen_signals[STARTUP_SEQUENCE_CHANGED] = screen_signals[STARTUP_SEQUENCE_CHANGED] =
g_signal_new ("startup-sequence-changed", g_signal_new ("startup-sequence-changed",
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
@ -2822,6 +2846,21 @@ meta_screen_resize (MetaScreen *screen,
screen->rect.width = width; screen->rect.width = width;
screen->rect.height = height; screen->rect.height = height;
/* Clear monitor for all windows on this screen, as it will become
* invalid. */
windows = meta_display_list_windows (screen->display,
META_LIST_INCLUDE_OVERRIDE_REDIRECT);
for (tmp = windows; tmp != NULL; tmp = tmp->next)
{
MetaWindow *window = tmp->data;
if (window->screen == screen)
{
g_signal_emit_by_name (screen, "window-left-monitor", window->monitor->number, window);
window->monitor = NULL;
}
}
reload_monitor_infos (screen); reload_monitor_infos (screen);
set_desktop_geometry_hint (screen); set_desktop_geometry_hint (screen);

View File

@ -1085,6 +1085,8 @@ meta_window_new_with_attrs (MetaDisplay *display,
meta_window_update_struts (window); meta_window_update_struts (window);
} }
g_signal_emit_by_name (window->screen, "window-entered-monitor", window->monitor->number, window);
/* Must add window to stack before doing move/resize, since the /* Must add window to stack before doing move/resize, since the
* window might have fullscreen size (i.e. should have been * window might have fullscreen size (i.e. should have been
* fullscreen'd; acrobat is one such braindead case; it withdraws * fullscreen'd; acrobat is one such braindead case; it withdraws
@ -1465,6 +1467,13 @@ meta_window_unmanage (MetaWindow *window,
} }
#endif #endif
if (window->monitor)
{
g_signal_emit_by_name (window->screen, "window-left-monitor",
window->monitor->number, window);
window->monitor = NULL;
}
if (!window->override_redirect) if (!window->override_redirect)
meta_stack_remove (window->screen->stack, window); meta_stack_remove (window->screen->stack, window);
@ -4104,6 +4113,10 @@ meta_window_update_monitor (MetaWindow *window)
meta_window_is_on_primary_monitor (window) && meta_window_is_on_primary_monitor (window) &&
window->screen->active_workspace != window->workspace) window->screen->active_workspace != window->workspace)
meta_window_change_workspace (window, window->screen->active_workspace); meta_window_change_workspace (window, window->screen->active_workspace);
if (old)
g_signal_emit_by_name (window->screen, "window-left-monitor", old->number, window);
g_signal_emit_by_name (window->screen, "window-entered-monitor", window->monitor->number, window);
} }
} }

View File

@ -1 +1,2 @@
VOID:INT,INT,ENUM VOID:INT,INT,ENUM
VOID:INT,OBJECT