summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2019-08-21 19:24:19 +0300
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2019-08-22 18:21:45 +0300
commitcb91162897ded460a99fa4508623c22e176e486c (patch)
tree9a165eb65d9914c1dca17689b56fb2e21dbc419d
parent55dacbf595590aa656a04c4d516ac8f3c1fbbd27 (diff)
downloadmetacity-cb91162897ded460a99fa4508623c22e176e486c.tar.gz
window: add meta_window_reframe
-rw-r--r--src/core/window-private.h5
-rw-r--r--src/core/window.c36
2 files changed, 41 insertions, 0 deletions
diff --git a/src/core/window-private.h b/src/core/window-private.h
index faa546c7..7f7eb276 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -99,8 +99,11 @@ struct _MetaWindow
MetaScreen *screen;
MetaWorkspace *workspace;
Window xwindow;
+
/* may be NULL! not all windows get decorated */
MetaFrame *frame;
+ guint reframe_id;
+
int depth;
Visual *xvisual;
Colormap colormap;
@@ -718,6 +721,8 @@ gboolean meta_window_updates_are_frozen (MetaWindow *window);
void meta_window_update_shape_region (MetaWindow *window);
+void meta_window_reframe (MetaWindow *window);
+
G_END_DECLS
#endif
diff --git a/src/core/window.c b/src/core/window.c
index 6aea86d9..50118752 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -9203,6 +9203,24 @@ meta_window_update_shape_region (MetaWindow *window)
meta_compositor_window_shape_region_changed (window->display->compositor, window);
}
+static gboolean
+reframe_cb (gpointer user_data)
+{
+ MetaWindow *window;
+
+ window = META_WINDOW (user_data);
+ window->reframe_id = 0;
+
+ if (!window->decorated)
+ return G_SOURCE_REMOVE;
+
+ meta_window_ensure_frame (window);
+ meta_window_queue (window, META_QUEUE_MOVE_RESIZE | META_QUEUE_CALC_SHOWING);
+ g_object_notify_by_pspec (G_OBJECT (window), properties[PROP_DECORATED]);
+
+ return G_SOURCE_REMOVE;
+}
+
static void
meta_window_finalize (GObject *object)
{
@@ -9210,6 +9228,12 @@ meta_window_finalize (GObject *object)
window = META_WINDOW (object);
+ if (window->reframe_id != 0)
+ {
+ g_source_remove (window->reframe_id);
+ window->reframe_id = 0;
+ }
+
g_clear_object (&window->icon);
g_clear_object (&window->mini_icon);
@@ -9289,3 +9313,15 @@ static void
meta_window_init (MetaWindow *window)
{
}
+
+void
+meta_window_reframe (MetaWindow *window)
+{
+ if (!window->decorated)
+ return;
+
+ meta_window_destroy_frame (window);
+ meta_window_move_resize_now (window);
+
+ window->reframe_id = g_idle_add (reframe_cb, window);
+}