diff --git a/src/core/display-private.h b/src/core/display-private.h index bff48e782..576a4254e 100644 --- a/src/core/display-private.h +++ b/src/core/display-private.h @@ -427,4 +427,8 @@ void meta_display_queue_check_fullscreen (MetaDisplay *display); MetaWindow *meta_display_get_pointer_window (MetaDisplay *display, MetaWindow *not_this_one); +MetaWindow *meta_display_get_window_from_id (MetaDisplay *display, + uint64_t window_id); +uint64_t meta_display_generate_window_id (MetaDisplay *display); + #endif diff --git a/src/core/display.c b/src/core/display.c index 1531fc945..f96f36b38 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -3597,3 +3597,35 @@ meta_display_get_startup_notification (MetaDisplay *display) { return display->startup_notification; } + +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++); +} diff --git a/src/core/window-private.h b/src/core/window-private.h index 01cb1d659..1babd307f 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -151,6 +151,7 @@ struct _MetaWindow GObject parent_instance; MetaDisplay *display; + uint64_t id; guint64 stamp; MetaLogicalMonitor *monitor; MetaWorkspace *workspace; diff --git a/src/core/window.c b/src/core/window.c index 3018c1b7b..904b2866f 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -1161,6 +1161,8 @@ _meta_window_shared_new (MetaDisplay *display, window->has_resize_func = FALSE; } + window->id = meta_display_generate_window_id (display); + META_WINDOW_GET_CLASS (window)->manage (window); if (!window->override_redirect) @@ -8515,3 +8517,17 @@ meta_window_is_stackable (MetaWindow *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; +} diff --git a/src/meta/window.h b/src/meta/window.h index 068f773af..d4df32b00 100644 --- a/src/meta/window.h +++ b/src/meta/window.h @@ -259,4 +259,6 @@ gboolean meta_window_is_client_decorated (MetaWindow *window); gboolean meta_window_titlebar_is_onscreen (MetaWindow *window); void meta_window_shove_titlebar_onscreen (MetaWindow *window); +uint64_t meta_window_get_id (MetaWindow *window); + #endif