diff --git a/src/Makefile.am b/src/Makefile.am
index 94d2b22c5..17bfb34db 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -198,8 +198,6 @@ libmutter_la_SOURCES = \
ui/ui.h \
ui/frames.c \
ui/frames.h \
- ui/resizepopup.c \
- ui/resizepopup.h \
ui/theme.c \
meta/theme.h \
ui/theme-private.h \
diff --git a/src/core/display-private.h b/src/core/display-private.h
index a4c79593e..07d4e2e77 100644
--- a/src/core/display-private.h
+++ b/src/core/display-private.h
@@ -478,6 +478,12 @@ gboolean meta_display_show_restart_message (MetaDisplay *display,
const char *message);
gboolean meta_display_request_restart (MetaDisplay *display);
+gboolean meta_display_show_resize_popup (MetaDisplay *display,
+ gboolean show,
+ MetaRectangle *rect,
+ int display_w,
+ int display_h);
+
void meta_restart_init (void);
void meta_restart_finish (void);
diff --git a/src/core/display.c b/src/core/display.c
index d79696377..936100a2f 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -122,6 +122,7 @@ enum
GRAB_OP_END,
SHOW_RESTART_MESSAGE,
RESTART,
+ SHOW_RESIZE_POPUP,
LAST_SIGNAL
};
@@ -329,6 +330,16 @@ meta_display_class_init (MetaDisplayClass *klass)
NULL, NULL,
G_TYPE_BOOLEAN, 0);
+ display_signals[SHOW_RESIZE_POPUP] =
+ g_signal_new ("show-resize-popup",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ g_signal_accumulator_true_handled,
+ NULL, NULL,
+ G_TYPE_BOOLEAN, 4,
+ G_TYPE_BOOLEAN, META_TYPE_RECTANGLE, G_TYPE_INT, G_TYPE_INT);
+
g_object_class_install_property (object_class,
PROP_FOCUS_WINDOW,
g_param_spec_object ("focus-window",
@@ -3018,6 +3029,22 @@ meta_display_request_restart (MetaDisplay *display)
return result;
}
+gboolean
+meta_display_show_resize_popup (MetaDisplay *display,
+ gboolean show,
+ MetaRectangle *rect,
+ int display_w,
+ int display_h)
+{
+ gboolean result = FALSE;
+
+ g_signal_emit (display,
+ display_signals[SHOW_RESIZE_POPUP], 0,
+ show, rect, display_w, display_h, &result);
+
+ return result;
+}
+
/**
* meta_display_is_pointer_emulating_sequence:
* @display: the display
diff --git a/src/ui/resizepopup.c b/src/ui/resizepopup.c
deleted file mode 100644
index 85bc5db9d..000000000
--- a/src/ui/resizepopup.c
+++ /dev/null
@@ -1,238 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-
-/* Metacity resizing-terminal-window feedback */
-
-/*
- * Copyright (C) 2001 Havoc Pennington
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see .
- */
-
-#include
-#include "resizepopup.h"
-#include "util-private.h"
-#include
-#include
-
-struct _MetaResizePopup
-{
- GtkWidget *size_window;
- GtkWidget *size_label;
- Display *display;
- int screen_number;
-
- int vertical_size;
- int horizontal_size;
-
- gboolean showing;
-
- MetaRectangle rect;
-};
-
-MetaResizePopup*
-meta_ui_resize_popup_new (Display *display,
- int screen_number)
-{
- MetaResizePopup *popup;
-
- popup = g_new0 (MetaResizePopup, 1);
-
- popup->display = display;
- popup->screen_number = screen_number;
-
- return popup;
-}
-
-void
-meta_ui_resize_popup_free (MetaResizePopup *popup)
-{
- g_return_if_fail (popup != NULL);
-
- if (popup->size_window)
- gtk_widget_destroy (popup->size_window);
-
- g_free (popup);
-}
-
-static gboolean
-size_window_draw (GtkWidget *widget,
- cairo_t *cr,
- MetaResizePopup *popup)
-{
- GtkStyleContext *context;
- gint width, height;
-
- context = gtk_widget_get_style_context (widget);
- width = gtk_widget_get_allocated_width (widget);
- height = gtk_widget_get_allocated_height (widget);
-
- gtk_render_background (context, cr, 0, 0, width, height);
- gtk_render_frame (context, cr, 0, 0, width, height);
-
- return FALSE;
-}
-
-static void
-ensure_size_window (MetaResizePopup *popup)
-{
- GdkVisual *visual;
- GdkScreen *screen;
-
- if (popup->size_window)
- return;
-
- popup->size_window = gtk_window_new (GTK_WINDOW_POPUP);
- screen = gdk_display_get_screen (gdk_x11_lookup_xdisplay (popup->display),
- popup->screen_number);
- visual = gdk_screen_get_rgba_visual (screen);
-
- gtk_window_set_screen (GTK_WINDOW (popup->size_window), screen);
- if (visual != NULL)
- gtk_widget_set_visual (popup->size_window, visual);
-
- gtk_window_set_type_hint (GTK_WINDOW (popup->size_window),
- GDK_WINDOW_TYPE_HINT_TOOLTIP);
- gtk_window_set_resizable (GTK_WINDOW (popup->size_window), FALSE);
-
- gtk_widget_set_app_paintable (popup->size_window, TRUE);
- gtk_style_context_add_class (gtk_widget_get_style_context (popup->size_window),
- GTK_STYLE_CLASS_TOOLTIP);
- g_signal_connect (popup->size_window, "draw",
- G_CALLBACK (size_window_draw), popup);
-
- popup->size_label = gtk_label_new ("");
- g_object_set (popup->size_label, "margin", 6, NULL);
-
- gtk_container_add (GTK_CONTAINER (popup->size_window), popup->size_label);
-
- gtk_widget_show (popup->size_label);
-}
-
-static void
-update_size_window (MetaResizePopup *popup)
-{
- char *str;
- int x, y;
- int width, height;
-
- g_return_if_fail (popup->size_window != NULL);
-
- /* Translators: This represents the size of a window. The first number is
- * the width of the window and the second is the height.
- */
- str = g_strdup_printf (_("%d x %d"),
- popup->horizontal_size,
- popup->vertical_size);
-
- gtk_label_set_text (GTK_LABEL (popup->size_label), str);
-
- g_free (str);
-
- gtk_window_get_size (GTK_WINDOW (popup->size_window), &width, &height);
-
- x = popup->rect.x + (popup->rect.width - width) / 2;
- y = popup->rect.y + (popup->rect.height - height) / 2;
-
- if (gtk_widget_get_realized (popup->size_window))
- {
- /* using move_resize to avoid jumpiness */
- gdk_window_move_resize (gtk_widget_get_window (popup->size_window),
- x, y,
- width, height);
- }
- else
- {
- gtk_window_move (GTK_WINDOW (popup->size_window),
- x, y);
- }
-}
-
-static void
-sync_showing (MetaResizePopup *popup)
-{
- if (popup->showing)
- {
- if (popup->size_window)
- gtk_widget_show (popup->size_window);
-
- if (popup->size_window && gtk_widget_get_realized (popup->size_window))
- gdk_window_raise (gtk_widget_get_window (popup->size_window));
- }
- else
- {
- if (popup->size_window)
- gtk_widget_hide (popup->size_window);
- }
-}
-
-void
-meta_ui_resize_popup_set (MetaResizePopup *popup,
- MetaRectangle rect,
- int base_width,
- int base_height,
- int width_inc,
- int height_inc)
-{
- gboolean need_update_size;
- int display_w, display_h;
-
- g_return_if_fail (popup != NULL);
-
- need_update_size = FALSE;
-
- display_w = rect.width - base_width;
- if (width_inc > 0)
- display_w /= width_inc;
-
- display_h = rect.height - base_height;
- if (height_inc > 0)
- display_h /= height_inc;
-
- if (!meta_rectangle_equal(&popup->rect, &rect) ||
- display_w != popup->horizontal_size ||
- display_h != popup->vertical_size)
- need_update_size = TRUE;
-
- popup->rect = rect;
- popup->vertical_size = display_h;
- popup->horizontal_size = display_w;
-
- if (need_update_size)
- {
- ensure_size_window (popup);
- update_size_window (popup);
- }
-
- sync_showing (popup);
-}
-
-void
-meta_ui_resize_popup_set_showing (MetaResizePopup *popup,
- gboolean showing)
-{
- g_return_if_fail (popup != NULL);
-
- if (showing == popup->showing)
- return;
-
- popup->showing = !!showing;
-
- if (popup->showing)
- {
- ensure_size_window (popup);
- update_size_window (popup);
- }
-
- sync_showing (popup);
-}
diff --git a/src/ui/resizepopup.h b/src/ui/resizepopup.h
deleted file mode 100644
index 2b83ea38f..000000000
--- a/src/ui/resizepopup.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
-
-/* Mutter resizing-terminal-window feedback */
-
-/*
- * Copyright (C) 2001 Havoc Pennington
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see .
- */
-
-#ifndef META_RESIZEPOPUP_H
-#define META_RESIZEPOPUP_H
-
-/* Don't include gtk.h or gdk.h here */
-#include
-#include
-#include
-#include
-#include
-
-typedef struct _MetaResizePopup MetaResizePopup;
-
-MetaResizePopup* meta_ui_resize_popup_new (Display *display,
- int screen_number);
-void meta_ui_resize_popup_free (MetaResizePopup *popup);
-void meta_ui_resize_popup_set (MetaResizePopup *popup,
- MetaRectangle rect,
- int base_width,
- int base_height,
- int width_inc,
- int height_inc);
-void meta_ui_resize_popup_set_showing (MetaResizePopup *popup,
- gboolean showing);
-
-#endif
-
diff --git a/src/x11/window-x11-private.h b/src/x11/window-x11-private.h
index d909a0cee..62341739e 100644
--- a/src/x11/window-x11-private.h
+++ b/src/x11/window-x11-private.h
@@ -25,7 +25,6 @@
#include "window-private.h"
#include "x11/iconcache.h"
-#include "ui/resizepopup.h"
G_BEGIN_DECLS
@@ -56,7 +55,7 @@ struct _MetaWindowX11Private
/* Requested geometry */
int border_width;
- MetaResizePopup *grab_resize_popup;
+ gboolean showing_resize_popup;
/* These are in server coordinates. If we have a frame, it's
* relative to the frame. */
diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c
index 321360ed5..fefef3bb0 100644
--- a/src/x11/window-x11.c
+++ b/src/x11/window-x11.c
@@ -44,7 +44,6 @@
#include "window-private.h"
#include "window-props.h"
#include "xprops.h"
-#include "resizepopup.h"
#include "session.h"
#include "workspace-private.h"
@@ -831,18 +830,28 @@ meta_window_refresh_resize_popup (MetaWindow *window)
{
MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
- MetaRectangle rect;
- meta_window_get_client_root_coords (window, &rect);
+ if (priv->showing_resize_popup)
+ {
+ MetaRectangle rect;
+ int display_w, display_h;
- meta_ui_resize_popup_set (priv->grab_resize_popup,
- rect,
- window->size_hints.base_width,
- window->size_hints.base_height,
- window->size_hints.width_inc,
- window->size_hints.height_inc);
+ meta_window_get_client_root_coords (window, &rect);
- meta_ui_resize_popup_set_showing (priv->grab_resize_popup, TRUE);
+ display_w = (rect.width - window->size_hints.base_width);
+ if (window->size_hints.width_inc > 0)
+ display_w /= window->size_hints.width_inc;
+
+ display_h = (rect.height - window->size_hints.base_height);
+ if (window->size_hints.height_inc > 0)
+ display_h /= window->size_hints.height_inc;
+
+ meta_display_show_resize_popup (window->display, TRUE, &rect, display_w, display_h);
+ }
+ else
+ {
+ meta_display_show_resize_popup (window->display, FALSE, NULL, 0, 0);
+ }
}
static void
@@ -859,8 +868,7 @@ meta_window_x11_grab_op_began (MetaWindow *window,
if (window->size_hints.width_inc > 1 || window->size_hints.height_inc > 1)
{
- priv->grab_resize_popup = meta_ui_resize_popup_new (window->display->xdisplay,
- window->screen->number);
+ priv->showing_resize_popup = TRUE;
meta_window_refresh_resize_popup (window);
}
}
@@ -875,10 +883,10 @@ meta_window_x11_grab_op_ended (MetaWindow *window,
MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
- if (priv->grab_resize_popup)
+ if (priv->showing_resize_popup)
{
- meta_ui_resize_popup_free (priv->grab_resize_popup);
- priv->grab_resize_popup = NULL;
+ priv->showing_resize_popup = FALSE;
+ meta_window_refresh_resize_popup (window);
}
META_WINDOW_CLASS (meta_window_x11_parent_class)->grab_op_ended (window, op);
@@ -1264,7 +1272,7 @@ meta_window_x11_move_resize_internal (MetaWindow *window,
if (need_configure_notify)
send_configure_notify (window);
- if (priv->grab_resize_popup)
+ if (priv->showing_resize_popup)
meta_window_refresh_resize_popup (window);
if (frame_shape_changed)