window: Add window id

Generate a unique 64bit window-id which is unrelated to any windowing
backend.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/306
(cherry picked from commit bbcb66ddf4)
This commit is contained in:
Olivier Fourdan 2018-09-21 17:49:36 +02:00 committed by Ray Strode
parent c60c2f997c
commit b0267c1a4e
5 changed files with 55 additions and 0 deletions

View File

@ -507,4 +507,8 @@ void meta_display_notify_pad_group_switch (MetaDisplay *display,
guint n_mode, guint n_mode,
guint n_modes); guint n_modes);
MetaWindow *meta_display_get_window_from_id (MetaDisplay *display,
uint64_t window_id);
uint64_t meta_display_generate_window_id (MetaDisplay *display);
#endif #endif

View File

@ -3269,3 +3269,35 @@ meta_display_notify_pad_group_switch (MetaDisplay *display,
g_string_free (message, TRUE); g_string_free (message, TRUE);
} }
MetaWindow *
meta_display_get_window_from_id (MetaDisplay *display,
uint64_t window_id)
{
g_autoptr (GSList) windows = NULL;
GSList *l;
windows = meta_display_list_windows (display, META_LIST_DEFAULT);
for (l = windows; l; l = l->next)
{
MetaWindow *window = l->data;
if (window->id == window_id)
return window;
}
return NULL;
}
uint64_t
meta_display_generate_window_id (MetaDisplay *display)
{
static uint64_t base_window_id;
static uint64_t last_window_id;
if (!base_window_id)
base_window_id = g_random_int () + 1;
/* We can overflow here, that's fine */
return (base_window_id + last_window_id++);
}

View File

@ -153,6 +153,7 @@ struct _MetaWindow
MetaDisplay *display; MetaDisplay *display;
MetaScreen *screen; MetaScreen *screen;
uint64_t id;
guint64 stamp; guint64 stamp;
MetaLogicalMonitor *monitor; MetaLogicalMonitor *monitor;
MetaWorkspace *workspace; MetaWorkspace *workspace;

View File

@ -1142,6 +1142,8 @@ _meta_window_shared_new (MetaDisplay *display,
window->has_resize_func = FALSE; window->has_resize_func = FALSE;
} }
window->id = meta_display_generate_window_id (display);
META_WINDOW_GET_CLASS (window)->manage (window); META_WINDOW_GET_CLASS (window)->manage (window);
if (!window->override_redirect) if (!window->override_redirect)
@ -8466,3 +8468,17 @@ meta_window_is_stackable (MetaWindow *window)
{ {
return META_WINDOW_GET_CLASS (window)->is_stackable (window); return META_WINDOW_GET_CLASS (window)->is_stackable (window);
} }
/**
* meta_window_get_id:
* @window: a #MetaWindow
*
* Returns the window id associated with window.
*
* Returns: (transfer none): The window id
*/
uint64_t
meta_window_get_id (MetaWindow *window)
{
return window->id;
}

View File

@ -260,4 +260,6 @@ gboolean meta_window_is_client_decorated (MetaWindow *window);
gboolean meta_window_titlebar_is_onscreen (MetaWindow *window); gboolean meta_window_titlebar_is_onscreen (MetaWindow *window);
void meta_window_shove_titlebar_onscreen (MetaWindow *window); void meta_window_shove_titlebar_onscreen (MetaWindow *window);
uint64_t meta_window_get_id (MetaWindow *window);
#endif #endif