summarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.SRCINFO16
-rw-r--r--0001-Add-metacity-3.16-support.patch2021
-rw-r--r--0002-Remove-function-declarations-from-gtk-window-decorat.patch47
-rw-r--r--PKGBUILD20
4 files changed, 10 insertions, 2094 deletions
diff --git a/.SRCINFO b/.SRCINFO
index 6dc23caab124..9d7385646cde 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,8 +1,6 @@
-# Generated by makepkg 4.2.1
-# Sat May 30 01:03:05 UTC 2015
pkgbase = compiz-ubuntu
pkgdesc = OpenGL window and compositing manager
- pkgver = 0.9.12.1.15.10.20150511
+ pkgver = 0.9.12.1.15.10.20150627.1
pkgrel = 1
epoch = 1
url = http://www.compiz.org/
@@ -41,24 +39,20 @@ pkgbase = compiz-ubuntu
conflicts = compiz
conflicts = metacity-ubuntu
options = emptydirs
- source = https://launchpad.net/ubuntu/+archive/primary/+files/compiz_0.9.12.1+15.10.20150511.orig.tar.gz
- source = https://launchpad.net/ubuntu/+archive/primary/+files/compiz_0.9.12.1+15.10.20150511-0ubuntu1.diff.gz
+ source = https://launchpad.net/ubuntu/+archive/primary/+files/compiz_0.9.12.1+15.10.20150627.1.orig.tar.gz
+ source = https://launchpad.net/ubuntu/+archive/primary/+files/compiz_0.9.12.1+15.10.20150627.1-0ubuntu1.diff.gz
source = compiz.reset
source = 0001-Fix-cmake-install-directory.patch
source = 0002-Fix-python-install-command.patch
source = 0003-Use-Python-2.patch
source = 0004-Disable-Werror.patch
- source = 0001-Add-metacity-3.16-support.patch
- source = 0002-Remove-function-declarations-from-gtk-window-decorat.patch
- sha512sums = 3218acbd78f77036e60a649bff64c056681039de6e28d43e500e9ed84298435d8de98a016f9be858ed6f75474edb35a394d51ec84132e311465084f64925667d
- sha512sums = 50ac0c1dd682d5bdf6ff8a51f00b99245699fe5c643da75558bc93220e300b902103f70e18299d18fb0e9e2bd09d1a16155c9d8bbf45943ae35dd34661b14e0e
+ sha512sums = 9b9a67a6a03527aab7fae21cd4baf2bdc89efd6f6abcfa1b65c5ee67ecfb789ce4772e3c497b7f969d721c58872c0a6e46f45429d50a2faabaf81a26b9bb2e5c
+ sha512sums = ecff9b2a47fddff78301220bee67cb5432a9fcb060de1326b9d001c12740c23fbbc8a5e774c37664afb94d12b7068f83973968ca1222c6a27902b4d9d138d063
sha512sums = 5f4b38c5fe3af9de0fe7897b9fdd04184dff9bf448f21ef19d9ae1b224c972061d8b183aa01cf8dcdf4fb37bb3466233ce53a6dfbbe51b0ff04f17568d2dc7ff
sha512sums = 94b139716f74cfb26276dbc0c5a73aa1d6f591e888b976210e7523de83e782a76992350d08b8054c8a04eeeb5273130cdeaaffd155ee3e9800921b7541cbdd82
sha512sums = 1107fd002e1123fd52535f0016ee241c12d719a62c0a301a97338a230a73267b43982e0d23250ecac09b3a4b0ae78710fa9e04d84d5729ee6ac7293935579706
sha512sums = 247c393a1c84becea57ccae6e1c6ed8c0eae3f874627677f3944dca0197565b6b12912357ad4f025a5a876f294338cb79d498484392aabaf4bfa22e5a2c08b24
sha512sums = 1ec09ac2bbfe242670f9b51842c58bbe9b379f7a1bfeec12157b5ba3ea3142c88eb62462968f4378c64d75fa4148dca6123583399f93e2b6990c094d386f0951
- sha512sums = 4913dd84ae21514b761b2710d015ae091d5909f5ceccabb17f334afd25af3142bb4768417c549a2ab5f83bb4541fd561bd4a653ad4b2396d51a17c2d6c215c91
- sha512sums = 151983a93d74aac2d5fc23042e1c352a50478f663fae9e11739e0e3ea2139f2c0dfa6307cad4074a2319f3b1ce7be7d2cf73f37633bb2e4a12619b8b85757db8
pkgname = compiz-ubuntu
diff --git a/0001-Add-metacity-3.16-support.patch b/0001-Add-metacity-3.16-support.patch
deleted file mode 100644
index 286b6ebbb34a..000000000000
--- a/0001-Add-metacity-3.16-support.patch
+++ /dev/null
@@ -1,2021 +0,0 @@
-From bf3acf4f1b6505961f7ed2bc954b6bbd0dc23eca Mon Sep 17 00:00:00 2001
-From: Xiao-Long Chen <chenxiaolong@cxl.epac.to>
-Date: Fri, 1 May 2015 16:37:22 -0400
-Subject: [PATCH 1/2] Add metacity 3.16 support
-
-Based on revision 3951 from
-https://code.launchpad.net/~albertsmuktupavels/compiz/gwd-support-metacity-3-16
----
- gtk/CMakeLists.txt | 1 +
- gtk/config.h.gtk.in | 3 +
- gtk/window-decorator/CMakeLists.txt | 4 +-
- .../gwd-settings-storage-gsettings.c | 111 +-
- .../gwd-settings-storage-gsettings.h | 10 +
- gtk/window-decorator/metacity-3-16.c | 1555 ++++++++++++++++++++
- gtk/window-decorator/metacity.c | 4 +-
- gtk/window-decorator/settings.c | 5 +-
- gtk/window-decorator/tests/CMakeLists.txt | 15 +
- .../tests/org.gnome.metacity.gschema.xml | 10 +
- gtk/window-decorator/tests/test_gwd_settings.cpp | 5 +
- 11 files changed, 1697 insertions(+), 26 deletions(-)
- create mode 100644 gtk/window-decorator/metacity-3-16.c
- create mode 100644 gtk/window-decorator/tests/org.gnome.metacity.gschema.xml
-
-diff --git a/gtk/CMakeLists.txt b/gtk/CMakeLists.txt
-index 18483e8..a655cc8 100644
---- a/gtk/CMakeLists.txt
-+++ b/gtk/CMakeLists.txt
-@@ -28,6 +28,7 @@ if (USE_GTK)
- pkg_check_modules (METACITY libmetacity-private>=3.12.0)
- if (METACITY_FOUND)
- compiz_pkg_check_modules (HAVE_METACITY_3_14_0 libmetacity-private>=3.14.0)
-+ compiz_pkg_check_modules (HAVE_METACITY_3_16_0 libmetacity-private>=3.16.0)
- else (METACITY_FOUND)
- compiz_set (USE_METACITY 0)
- endif (METACITY_FOUND)
-diff --git a/gtk/config.h.gtk.in b/gtk/config.h.gtk.in
-index 75adfac..2c83152 100644
---- a/gtk/config.h.gtk.in
-+++ b/gtk/config.h.gtk.in
-@@ -4,4 +4,7 @@
- /* Define to 1 if metacity version >= 3.14.0 */
- #cmakedefine HAVE_METACITY_3_14_0 1
-
-+/* Define to 1 if metacity version >= 3.16.0 */
-+#cmakedefine HAVE_METACITY_3_16_0 1
-+
- #define GETTEXT_PACKAGE "${GETTEXT_PACKAGE}"
-diff --git a/gtk/window-decorator/CMakeLists.txt b/gtk/window-decorator/CMakeLists.txt
-index 06288a6..bfa914e 100644
---- a/gtk/window-decorator/CMakeLists.txt
-+++ b/gtk/window-decorator/CMakeLists.txt
-@@ -99,6 +99,7 @@ if (USE_GTK)
- gdk.c
- switcher.c
- metacity.c
-+ metacity-3-16.c
- events.c
- forcequit.c
- tooltip.c
-@@ -138,6 +139,3 @@ if (USE_GTK)
- endif (COMPIZ_BUILD_TESTING)
-
- endif (USE_GTK)
--
--
--
-diff --git a/gtk/window-decorator/gwd-settings-storage-gsettings.c b/gtk/window-decorator/gwd-settings-storage-gsettings.c
-index 300c4fc..f2cc364 100644
---- a/gtk/window-decorator/gwd-settings-storage-gsettings.c
-+++ b/gtk/window-decorator/gwd-settings-storage-gsettings.c
-@@ -17,6 +17,9 @@
- *
- * Authored By: Sam Spilsbury <sam.spilsbury@canonical.com>
- */
-+#ifdef HAVE_CONFIG_H
-+#include <config.h>
-+#endif
- #include <glib-object.h>
-
- #include <gio/gio.h>
-@@ -28,6 +31,7 @@
- #include "gwd-settings-storage-gsettings.h"
-
- const gchar * ORG_COMPIZ_GWD = "org.compiz.gwd";
-+const gchar * ORG_GNOME_METACITY = "org.gnome.metacity";
- const gchar * ORG_GNOME_MUTTER = "org.gnome.mutter";
- const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES = "org.gnome.desktop.wm.preferences";
-
-@@ -39,6 +43,7 @@ const gchar * ORG_COMPIZ_GWD_KEY_METACITY_THEME_ACTIVE_SHADE_OPACITY = "metacity
- const gchar * ORG_COMPIZ_GWD_KEY_METACITY_THEME_INACTIVE_SHADE_OPACITY = "metacity-theme-inactive-shade-opacity";
- const gchar * ORG_COMPIZ_GWD_KEY_USE_METACITY_THEME = "use-metacity-theme";
- const gchar * ORG_COMPIZ_GWD_KEY_MOUSE_WHEEL_ACTION = "mouse-wheel-action";
-+const gchar * ORG_GNOME_METACITY_THEME = "theme";
- const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_DOUBLE_CLICK_TITLEBAR = "action-double-click-titlebar";
- const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_MIDDLE_CLICK_TITLEBAR = "action-middle-click-titlebar";
- const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_RIGHT_CLICK_TITLEBAR = "action-right-click-titlebar";
-@@ -75,17 +80,17 @@ G_DEFINE_TYPE_WITH_CODE (GWDSettingsStorageGSettings, gwd_settings_storage_gsett
-
- enum
- {
-- GWD_SETTINGS_STORAGE_GSETTINGS_PROPERTY_DESKTOP_GSETTINGS = 1,
-- GWD_SETTINGS_STORAGE_GSETTINGS_PROPERTY_MUTTER_GSETTINGS = 2,
-- GWD_SETTINGS_STORAGE_GSETTINGS_PROPERTY_GWD_GSETTINGS = 3,
-- GWD_SETTINGS_STORAGE_GSETTINGS_PROPERTY_WRITABLE_SETTINGS = 4
-+ GWD_SETTINGS_STORAGE_GSETTINGS_PROPERTY_DESKTOP_GSETTINGS = 1,
-+ GWD_SETTINGS_STORAGE_GSETTINGS_PROPERTY_METACITY_GSETTINGS = 2,
-+ GWD_SETTINGS_STORAGE_GSETTINGS_PROPERTY_MUTTER_GSETTINGS = 3,
-+ GWD_SETTINGS_STORAGE_GSETTINGS_PROPERTY_GWD_GSETTINGS = 4,
-+ GWD_SETTINGS_STORAGE_GSETTINGS_PROPERTY_WRITABLE_SETTINGS = 5
- };
-
--const guint GWD_SETTINGS_STORAGE_GSETTINGS_N_CONSTRUCTION_PARAMS = 4;
--
- typedef struct _GWDSettingsStorageGSettingsPrivate
- {
- GSettings *desktop;
-+ GSettings *metacity;
- GSettings *mutter;
- GSettings *gwd;
- GWDSettingsWritable *writable;
-@@ -150,20 +155,34 @@ gwd_settings_storage_gsettings_update_blur (GWDSettingsStorage *settings)
- static gboolean
- gwd_settings_storage_gsettings_update_metacity_theme (GWDSettingsStorage *settings)
- {
-- GWDSettingsStorageGSettings *storage = GWD_SETTINGS_STORAGE_GSETTINGS (settings);
-- GWDSettingsStorageGSettingsPrivate *priv = GET_PRIVATE (storage);
-+ GWDSettingsStorageGSettings *storage;
-+ GWDSettingsStorageGSettingsPrivate *priv;
-+ gboolean use_metacity_theme;
-+ gchar *theme;
-+
-+ storage = GWD_SETTINGS_STORAGE_GSETTINGS (settings);
-+ priv = GET_PRIVATE (storage);
-
- if (!priv->gwd)
-- return FALSE;
-+ return FALSE;
-+
-+ use_metacity_theme = g_settings_get_boolean (priv->gwd, ORG_COMPIZ_GWD_KEY_USE_METACITY_THEME);
-
-+#ifdef HAVE_METACITY_3_16_0
-+ if (!priv->metacity)
-+ return FALSE;
-+
-+ theme = g_settings_get_string (priv->metacity, ORG_GNOME_METACITY_THEME);
-+#else
- if (!priv->desktop)
-- return FALSE;
-+ return FALSE;
-+
-+ theme = g_settings_get_string (priv->desktop, ORG_GNOME_DESKTOP_WM_PREFERENCES_THEME);
-+#endif
-
- return gwd_settings_writable_metacity_theme_changed (priv->writable,
-- g_settings_get_boolean (priv->gwd,
-- ORG_COMPIZ_GWD_KEY_USE_METACITY_THEME),
-- g_settings_get_string (priv->desktop,
-- ORG_GNOME_DESKTOP_WM_PREFERENCES_THEME));
-+ use_metacity_theme,
-+ theme);
- }
-
- static gboolean
-@@ -300,6 +319,12 @@ gwd_settings_storage_gsettings_set_property (GObject *object,
-
- priv->desktop = g_value_dup_object (value);
- break;
-+ case GWD_SETTINGS_STORAGE_GSETTINGS_PROPERTY_METACITY_GSETTINGS:
-+ if (priv->metacity)
-+ g_object_unref (priv->metacity);
-+
-+ priv->metacity = g_value_dup_object (value);
-+ break;
- case GWD_SETTINGS_STORAGE_GSETTINGS_PROPERTY_MUTTER_GSETTINGS:
- if (priv->mutter)
- g_object_unref (priv->mutter);
-@@ -330,6 +355,9 @@ gwd_settings_storage_gsettings_dispose (GObject *object)
- if (priv->desktop)
- g_object_unref (priv->desktop);
-
-+ if (priv->metacity)
-+ g_object_unref (priv->metacity);
-+
- if (priv->mutter)
- g_object_unref (priv->mutter);
-
-@@ -355,6 +383,11 @@ gwd_settings_storage_gsettings_class_init (GWDSettingsStorageGSettingsClass *kla
- "GSettings Object for org.gnome.desktop.wm.preferences",
- G_TYPE_SETTINGS,
- G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY),
-+ g_param_spec_object ("metacity-gsettings",
-+ ORG_GNOME_METACITY,
-+ "GSettings Object for org.gnome.metacity",
-+ G_TYPE_SETTINGS,
-+ G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY),
- g_param_spec_object ("mutter-gsettings",
- ORG_GNOME_MUTTER,
- "GSettings Object for org.gnome.mutter",
-@@ -388,14 +421,16 @@ void gwd_settings_storage_gsettings_init (GWDSettingsStorageGSettings *self)
-
- GWDSettingsStorage *
- gwd_settings_storage_gsettings_new (GSettings *desktop,
-+ GSettings *metacity,
- GSettings *mutter,
- GSettings *gwd,
- GWDSettingsWritable *writable)
- {
-- static const guint gwd_settings_storage_gsettings_n_construction_params = 4;
-+ static const guint gwd_settings_storage_gsettings_n_construction_params = 5;
- GParameter param[gwd_settings_storage_gsettings_n_construction_params];
-
- GValue desktop_value = G_VALUE_INIT;
-+ GValue metacity_value = G_VALUE_INIT;
- GValue mutter_value = G_VALUE_INIT;
- GValue gwd_value = G_VALUE_INIT;
- GValue writable_value = G_VALUE_INIT;
-@@ -405,29 +440,34 @@ gwd_settings_storage_gsettings_new (GSettings *desktop,
- g_return_val_if_fail (writable != NULL, NULL);
-
- g_value_init (&desktop_value, G_TYPE_OBJECT);
-+ g_value_init (&metacity_value, G_TYPE_OBJECT);
- g_value_init (&mutter_value, G_TYPE_OBJECT);
- g_value_init (&gwd_value, G_TYPE_OBJECT);
- g_value_init (&writable_value, G_TYPE_POINTER);
-
- g_value_take_object (&desktop_value, desktop);
-+ g_value_take_object (&metacity_value, metacity);
- g_value_take_object (&mutter_value, mutter);
- g_value_take_object (&gwd_value, gwd);
- g_value_set_pointer (&writable_value, writable);
-
- param[0].name = "desktop-gsettings";
- param[0].value = desktop_value;
-- param[1].name = "mutter-gsettings";
-- param[1].value = mutter_value;
-- param[2].name = "gwd-gsettings";
-- param[2].value = gwd_value;
-- param[3].name = "writable-settings";
-- param[3].value = writable_value;
-+ param[1].name = "metacity-gsettings";
-+ param[1].value = metacity_value;
-+ param[2].name = "mutter-gsettings";
-+ param[2].value = mutter_value;
-+ param[3].name = "gwd-gsettings";
-+ param[3].value = gwd_value;
-+ param[4].name = "writable-settings";
-+ param[4].value = writable_value;
-
- storage = GWD_SETTINGS_STORAGE_INTERFACE (g_object_newv (GWD_TYPE_SETTINGS_STORAGE_GSETTINGS,
- gwd_settings_storage_gsettings_n_construction_params,
- param));
-
- g_value_unset (&desktop_value);
-+ g_value_unset (&metacity_value);
- g_value_unset (&mutter_value);
- g_value_unset (&gwd_value);
- g_value_unset (&writable_value);
-@@ -488,6 +528,35 @@ gwd_get_org_compiz_gwd_settings ()
- }
-
- static void
-+org_gnome_metacity_settings_changed (GSettings *settings,
-+ const gchar *key,
-+ gpointer user_data)
-+{
-+ GWDSettingsStorage *storage;
-+
-+ storage = GWD_SETTINGS_STORAGE_INTERFACE (user_data);
-+
-+ if (strcmp (key, ORG_GNOME_METACITY_THEME) == 0)
-+ gwd_settings_storage_update_metacity_theme (storage);
-+}
-+
-+void
-+gwd_connect_org_gnome_metacity_settings (GSettings *settings,
-+ GWDSettingsStorage *storage)
-+{
-+ if (!settings)
-+ return;
-+
-+ g_signal_connect (settings, "changed", (GCallback) org_gnome_metacity_settings_changed, storage);
-+}
-+
-+GSettings *
-+gwd_get_org_gnome_metacity_settings ()
-+{
-+ return get_settings_no_abort (ORG_GNOME_METACITY);
-+}
-+
-+static void
- org_gnome_mutter_settings_changed (GSettings *settings,
- const gchar *key,
- gpointer user_data)
-diff --git a/gtk/window-decorator/gwd-settings-storage-gsettings.h b/gtk/window-decorator/gwd-settings-storage-gsettings.h
-index 8d0dbb3..781cf84 100644
---- a/gtk/window-decorator/gwd-settings-storage-gsettings.h
-+++ b/gtk/window-decorator/gwd-settings-storage-gsettings.h
-@@ -30,6 +30,7 @@ GType gwd_settings_storage_gsettings_get_type ();
-
- GWDSettingsStorage *
- gwd_settings_storage_gsettings_new (GSettings *orgGNOMEDesktopSettings,
-+ GSettings *metacitySettings,
- GSettings *mutterSettings,
- GSettings *gwdSettings,
- GWDSettingsWritable *writableSettings);
-@@ -42,6 +43,13 @@ GSettings *
- gwd_get_org_compiz_gwd_settings ();
-
- void
-+gwd_connect_org_gnome_metacity_settings (GSettings *settings,
-+ GWDSettingsStorage *storage);
-+
-+GSettings *
-+gwd_get_org_gnome_metacity_settings ();
-+
-+void
- gwd_connect_org_gnome_mutter_settings (GSettings *settings,
- GWDSettingsStorage *storage);
-
-@@ -56,6 +64,7 @@ GSettings *
- gwd_get_org_gnome_desktop_wm_preferences_settings ();
-
- extern const gchar * ORG_COMPIZ_GWD;
-+extern const gchar * ORG_GNOME_METACITY;
- extern const gchar * ORG_GNOME_MUTTER;
- extern const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES;
-
-@@ -67,6 +76,7 @@ extern const gchar * ORG_COMPIZ_GWD_KEY_METACITY_THEME_ACTIVE_SHADE_OPACITY;
- extern const gchar * ORG_COMPIZ_GWD_KEY_METACITY_THEME_INACTIVE_SHADE_OPACITY;
- extern const gchar * ORG_COMPIZ_GWD_KEY_USE_METACITY_THEME;
- extern const gchar * ORG_COMPIZ_GWD_KEY_MOUSE_WHEEL_ACTION;
-+extern const gchar * ORG_GNOME_METACITY_THEME;
- extern const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_DOUBLE_CLICK_TITLEBAR;
- extern const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_MIDDLE_CLICK_TITLEBAR;
- extern const gchar * ORG_GNOME_DESKTOP_WM_PREFERENCES_ACTION_RIGHT_CLICK_TITLEBAR;
-diff --git a/gtk/window-decorator/metacity-3-16.c b/gtk/window-decorator/metacity-3-16.c
-new file mode 100644
-index 0000000..a56085a
---- /dev/null
-+++ b/gtk/window-decorator/metacity-3-16.c
-@@ -0,0 +1,1555 @@
-+/*
-+ * Copyright © 2006 Novell, Inc.
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2 of the License, or (at your option) any later version.
-+ *
-+ * This library 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
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with this library; if not, write to the
-+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-+ * Boston, MA 02111-1307, USA.
-+ *
-+ * Author: David Reveman <davidr@novell.com>
-+ *
-+ * 2D Mode: Copyright © 2010 Sam Spilsbury <smspillaz@gmail.com>
-+ * Frames Management: Copright © 2011 Canonical Ltd.
-+ * Authored By: Sam Spilsbury <sam.spilsbury@canonical.com>
-+ */
-+
-+#include "gtk-window-decorator.h"
-+
-+#ifdef USE_METACITY
-+#ifdef HAVE_METACITY_3_16_0
-+
-+MetaButtonLayout meta_button_layout;
-+
-+static gboolean
-+meta_button_present (MetaButtonLayout *button_layout,
-+ MetaButtonFunction function)
-+{
-+ int i;
-+
-+ for (i = 0; i < MAX_BUTTONS_PER_CORNER; ++i)
-+ if (button_layout->left_buttons[i] == function)
-+ return TRUE;
-+
-+ for (i = 0; i < MAX_BUTTONS_PER_CORNER; ++i)
-+ if (button_layout->right_buttons[i] == function)
-+ return TRUE;
-+
-+ return FALSE;
-+}
-+
-+static void
-+decor_update_meta_window_property (decor_t *d,
-+ MetaTheme *theme,
-+ MetaFrameFlags flags,
-+ MetaFrameType type,
-+ Region top,
-+ Region bottom,
-+ Region left,
-+ Region right)
-+{
-+ long *data;
-+ GdkDisplay *display;
-+ Display *xdisplay;
-+ gint nQuad;
-+ decor_extents_t win_extents;
-+ decor_extents_t frame_win_extents;
-+ decor_extents_t max_win_extents;
-+ decor_extents_t frame_max_win_extents;
-+ decor_quad_t quads[N_QUADS_MAX];
-+ unsigned int nOffset;
-+ unsigned int frame_type;
-+ unsigned int frame_state;
-+ unsigned int frame_actions;
-+ gint w;
-+ gint lh;
-+ gint rh;
-+ gint top_stretch_offset;
-+ gint bottom_stretch_offset;
-+ gint left_stretch_offset;
-+ gint right_stretch_offset;
-+
-+ display = gdk_display_get_default ();
-+ xdisplay = gdk_x11_display_get_xdisplay (display);
-+
-+ nOffset = 1;
-+
-+ frame_type = populate_frame_type (d);
-+ frame_state = populate_frame_state (d);
-+ frame_actions = populate_frame_actions (d);
-+
-+ win_extents = frame_win_extents = d->frame->win_extents;
-+ max_win_extents = frame_max_win_extents = d->frame->max_win_extents;
-+
-+ /* Add the invisible grab area padding, but only for
-+ * pixmap type decorations */
-+ if (!d->frame_window)
-+ {
-+ GdkScreen *screen;
-+ MetaStyleInfo *style_info;
-+ MetaFrameBorders borders;
-+
-+ screen = gtk_widget_get_screen (d->frame->style_window_rgba);
-+ style_info = meta_theme_create_style_info (screen, NULL);
-+
-+ meta_theme_get_frame_borders (theme, style_info, type,
-+ d->frame->text_height,
-+ flags, &borders);
-+
-+ if (flags & META_FRAME_ALLOWS_HORIZONTAL_RESIZE)
-+ {
-+ frame_win_extents.left += borders.invisible.left;
-+ frame_win_extents.right += borders.invisible.right;
-+ frame_max_win_extents.left += borders.invisible.left;
-+ frame_max_win_extents.right += borders.invisible.right;
-+ }
-+
-+ if (flags & META_FRAME_ALLOWS_VERTICAL_RESIZE)
-+ {
-+ frame_win_extents.bottom += borders.invisible.bottom;
-+ frame_win_extents.top += borders.invisible.top;
-+ frame_max_win_extents.bottom += borders.invisible.bottom;
-+ frame_max_win_extents.top += borders.invisible.top;
-+ }
-+
-+ meta_style_info_unref (style_info);
-+ }
-+
-+ w = d->border_layout.top.x2 - d->border_layout.top.x1 -
-+ d->context->left_space - d->context->right_space;
-+
-+ if (d->border_layout.rotation)
-+ lh = d->border_layout.left.x2 - d->border_layout.left.x1;
-+ else
-+ lh = d->border_layout.left.y2 - d->border_layout.left.y1;
-+
-+ if (d->border_layout.rotation)
-+ rh = d->border_layout.right.x2 - d->border_layout.right.x1;
-+ else
-+ rh = d->border_layout.right.y2 - d->border_layout.right.y1;
-+
-+ left_stretch_offset = lh / 2;
-+ right_stretch_offset = rh / 2;
-+ top_stretch_offset = w - d->button_width - 1;
-+ bottom_stretch_offset = (d->border_layout.bottom.x2 - d->border_layout.bottom.x1 -
-+ d->context->left_space - d->context->right_space) / 2;
-+
-+ nQuad = decor_set_lXrXtXbX_window_quads (quads, d->context, &d->border_layout,
-+ left_stretch_offset, right_stretch_offset,
-+ top_stretch_offset, bottom_stretch_offset);
-+
-+ win_extents.top += d->frame->titlebar_height;
-+ frame_win_extents.top += d->frame->titlebar_height;
-+ max_win_extents.top += d->frame->max_titlebar_height;
-+ frame_max_win_extents.top += d->frame->max_titlebar_height;
-+
-+ if (d->frame_window)
-+ {
-+ data = decor_alloc_property (nOffset, WINDOW_DECORATION_TYPE_WINDOW);
-+ decor_gen_window_property (data, nOffset - 1, &win_extents, &max_win_extents,
-+ 20, 20, frame_type, frame_state, frame_actions);
-+ }
-+ else
-+ {
-+ data = decor_alloc_property (nOffset, WINDOW_DECORATION_TYPE_PIXMAP);
-+ decor_quads_to_property (data, nOffset - 1, cairo_xlib_surface_get_drawable (d->surface),
-+ &frame_win_extents, &win_extents,
-+ &frame_max_win_extents, &max_win_extents,
-+ ICON_SPACE + d->button_width,
-+ 0, quads, nQuad, frame_type, frame_state, frame_actions);
-+ }
-+
-+ gdk_error_trap_push ();
-+
-+ XChangeProperty (xdisplay, d->prop_xid, win_decor_atom, XA_INTEGER,
-+ 32, PropModeReplace, (guchar *) data,
-+ PROP_HEADER_SIZE + BASE_PROP_SIZE + QUAD_PROP_SIZE * N_QUADS_MAX);
-+ gdk_display_sync (display);
-+
-+ gdk_error_trap_pop_ignored ();
-+
-+ free (data);
-+
-+ decor_update_blur_property (d, w, lh,
-+ top, top_stretch_offset,
-+ bottom, bottom_stretch_offset,
-+ left, left_stretch_offset,
-+ right, right_stretch_offset);
-+}
-+
-+static void
-+meta_get_corner_radius (const MetaFrameGeometry *fgeom,
-+ int *top_left_radius,
-+ int *top_right_radius,
-+ int *bottom_left_radius,
-+ int *bottom_right_radius)
-+{
-+ *top_left_radius = fgeom->top_left_corner_rounded_radius;
-+ *top_right_radius = fgeom->top_right_corner_rounded_radius;
-+ *bottom_left_radius = fgeom->bottom_left_corner_rounded_radius;
-+ *bottom_right_radius = fgeom->bottom_right_corner_rounded_radius;
-+}
-+
-+static int
-+radius_to_width (int radius,
-+ int i)
-+{
-+ float r1 = sqrt (radius) + radius;
-+ float r2 = r1 * r1 - (r1 - (i + 0.5)) * (r1 - (i + 0.5));
-+
-+ return floor (0.5f + r1 - sqrt (r2));
-+}
-+
-+static Region
-+meta_get_top_border_region (const MetaFrameGeometry *fgeom,
-+ int width)
-+{
-+ Region corners_xregion;
-+ Region border_xregion;
-+ XRectangle xrect;
-+ int top_left_radius;
-+ int top_right_radius;
-+ int bottom_left_radius;
-+ int bottom_right_radius;
-+ int w;
-+ int i;
-+ int height;
-+
-+ corners_xregion = XCreateRegion ();
-+
-+ meta_get_corner_radius (fgeom, &top_left_radius, &top_right_radius,
-+ &bottom_left_radius, &bottom_right_radius);
-+
-+ width = width - fgeom->borders.invisible.left - fgeom->borders.invisible.right;
-+ height = fgeom->borders.visible.top;
-+
-+ if (top_left_radius)
-+ {
-+ for (i = 0; i < top_left_radius; ++i)
-+ {
-+ w = radius_to_width (top_left_radius, i);
-+
-+ xrect.x = 0;
-+ xrect.y = i;
-+ xrect.width = w;
-+ xrect.height = 1;
-+
-+ XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion);
-+ }
-+ }
-+
-+ if (top_right_radius)
-+ {
-+ for (i = 0; i < top_right_radius; ++i)
-+ {
-+ w = radius_to_width (top_right_radius, i);
-+
-+ xrect.x = width - w;
-+ xrect.y = i;
-+ xrect.width = w;
-+ xrect.height = 1;
-+
-+ XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion);
-+ }
-+ }
-+
-+ border_xregion = XCreateRegion ();
-+
-+ xrect.x = 0;
-+ xrect.y = 0;
-+ xrect.width = width;
-+ xrect.height = height;
-+
-+ XUnionRectWithRegion (&xrect, border_xregion, border_xregion);
-+
-+ XSubtractRegion (border_xregion, corners_xregion, border_xregion);
-+
-+ XDestroyRegion (corners_xregion);
-+
-+ return border_xregion;
-+}
-+
-+static Region
-+meta_get_bottom_border_region (const MetaFrameGeometry *fgeom,
-+ int width)
-+{
-+ Region corners_xregion;
-+ Region border_xregion;
-+ XRectangle xrect;
-+ int top_left_radius;
-+ int top_right_radius;
-+ int bottom_left_radius;
-+ int bottom_right_radius;
-+ int w;
-+ int i;
-+ int height;
-+
-+ corners_xregion = XCreateRegion ();
-+
-+ meta_get_corner_radius (fgeom, &top_left_radius, &top_right_radius,
-+ &bottom_left_radius, &bottom_right_radius);
-+
-+ width = width - fgeom->borders.invisible.left - fgeom->borders.invisible.right;
-+ height = fgeom->borders.visible.bottom;
-+
-+ if (bottom_left_radius)
-+ {
-+ for (i = 0; i < bottom_left_radius; ++i)
-+ {
-+ w = radius_to_width (bottom_left_radius, i);
-+
-+ xrect.x = 0;
-+ xrect.y = height - i - 1;
-+ xrect.width = w;
-+ xrect.height = 1;
-+
-+ XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion);
-+ }
-+ }
-+
-+ if (bottom_right_radius)
-+ {
-+ for (i = 0; i < bottom_right_radius; ++i)
-+ {
-+ w = radius_to_width (bottom_right_radius, i);
-+
-+ xrect.x = width - w;
-+ xrect.y = height - i - 1;
-+ xrect.width = w;
-+ xrect.height = 1;
-+
-+ XUnionRectWithRegion (&xrect, corners_xregion, corners_xregion);
-+ }
-+ }
-+
-+ border_xregion = XCreateRegion ();
-+
-+ xrect.x = 0;
-+ xrect.y = 0;
-+ xrect.width = width;
-+ xrect.height = height;
-+
-+ XUnionRectWithRegion (&xrect, border_xregion, border_xregion);
-+
-+ XSubtractRegion (border_xregion, corners_xregion, border_xregion);
-+
-+ XDestroyRegion (corners_xregion);
-+
-+ return border_xregion;
-+}
-+
-+static Region
-+meta_get_left_border_region (const MetaFrameGeometry *fgeom,
-+ int height)
-+{
-+ Region border_xregion;
-+ XRectangle xrect;
-+
-+ border_xregion = XCreateRegion ();
-+
-+ xrect.x = 0;
-+ xrect.y = 0;
-+ xrect.width = fgeom->borders.visible.left;
-+ xrect.height = height - fgeom->borders.total.top - fgeom->borders.total.bottom;
-+
-+ XUnionRectWithRegion (&xrect, border_xregion, border_xregion);
-+
-+ return border_xregion;
-+}
-+
-+static Region
-+meta_get_right_border_region (const MetaFrameGeometry *fgeom,
-+ int height)
-+{
-+ Region border_xregion;
-+ XRectangle xrect;
-+
-+ border_xregion = XCreateRegion ();
-+
-+ xrect.x = 0;
-+ xrect.y = 0;
-+ xrect.width = fgeom->borders.visible.right;
-+ xrect.height = height - fgeom->borders.total.top - fgeom->borders.total.bottom;
-+
-+ XUnionRectWithRegion (&xrect, border_xregion, border_xregion);
-+
-+ return border_xregion;
-+}
-+
-+static MetaButtonState
-+meta_button_state (int state)
-+{
-+ if (state & IN_EVENT_WINDOW)
-+ {
-+ if (state & PRESSED_EVENT_WINDOW)
-+ return META_BUTTON_STATE_PRESSED;
-+
-+ return META_BUTTON_STATE_PRELIGHT;
-+ }
-+
-+ return META_BUTTON_STATE_NORMAL;
-+}
-+
-+static MetaButtonType
-+meta_function_to_type (MetaButtonFunction function)
-+{
-+ switch (function)
-+ {
-+ case META_BUTTON_FUNCTION_MENU:
-+ return META_BUTTON_TYPE_MENU;
-+ case META_BUTTON_FUNCTION_MINIMIZE:
-+ return META_BUTTON_TYPE_MINIMIZE;
-+ case META_BUTTON_FUNCTION_MAXIMIZE:
-+ return META_BUTTON_TYPE_MAXIMIZE;
-+ case META_BUTTON_FUNCTION_CLOSE:
-+ return META_BUTTON_TYPE_CLOSE;
-+ case META_BUTTON_FUNCTION_SHADE:
-+ return META_BUTTON_TYPE_SHADE;
-+ case META_BUTTON_FUNCTION_ABOVE:
-+ return META_BUTTON_TYPE_ABOVE;
-+ case META_BUTTON_FUNCTION_STICK:
-+ return META_BUTTON_TYPE_STICK;
-+ case META_BUTTON_FUNCTION_UNSHADE:
-+ return META_BUTTON_TYPE_UNSHADE;
-+ case META_BUTTON_FUNCTION_UNABOVE:
-+ return META_BUTTON_TYPE_UNABOVE;
-+ case META_BUTTON_FUNCTION_UNSTICK:
-+ return META_BUTTON_TYPE_UNSTICK;
-+ default:
-+ break;
-+ }
-+
-+ return META_BUTTON_TYPE_LAST;
-+}
-+
-+static MetaButtonState
-+meta_button_state_for_button_type (decor_t *d,
-+ MetaButtonType type)
-+{
-+ switch (type)
-+ {
-+ case META_BUTTON_TYPE_LEFT_LEFT_BACKGROUND:
-+ type = meta_function_to_type (meta_button_layout.left_buttons[0]);
-+ break;
-+ case META_BUTTON_TYPE_LEFT_MIDDLE_BACKGROUND:
-+ type = meta_function_to_type (meta_button_layout.left_buttons[1]);
-+ break;
-+ case META_BUTTON_TYPE_LEFT_RIGHT_BACKGROUND:
-+ type = meta_function_to_type (meta_button_layout.left_buttons[2]);
-+ break;
-+ case META_BUTTON_TYPE_RIGHT_LEFT_BACKGROUND:
-+ type = meta_function_to_type (meta_button_layout.right_buttons[0]);
-+ break;
-+ case META_BUTTON_TYPE_RIGHT_MIDDLE_BACKGROUND:
-+ type = meta_function_to_type (meta_button_layout.right_buttons[1]);
-+ break;
-+ case META_BUTTON_TYPE_RIGHT_RIGHT_BACKGROUND:
-+ type = meta_function_to_type (meta_button_layout.right_buttons[2]);
-+ default:
-+ break;
-+ }
-+
-+ switch (type)
-+ {
-+ case META_BUTTON_TYPE_CLOSE:
-+ return meta_button_state (d->button_states[BUTTON_CLOSE]);
-+ case META_BUTTON_TYPE_MAXIMIZE:
-+ return meta_button_state (d->button_states[BUTTON_MAX]);
-+ case META_BUTTON_TYPE_MINIMIZE:
-+ return meta_button_state (d->button_states[BUTTON_MIN]);
-+ case META_BUTTON_TYPE_MENU:
-+ return meta_button_state (d->button_states[BUTTON_MENU]);
-+ case META_BUTTON_TYPE_SHADE:
-+ return meta_button_state (d->button_states[BUTTON_SHADE]);
-+ case META_BUTTON_TYPE_ABOVE:
-+ return meta_button_state (d->button_states[BUTTON_ABOVE]);
-+ case META_BUTTON_TYPE_STICK:
-+ return meta_button_state (d->button_states[BUTTON_STICK]);
-+ case META_BUTTON_TYPE_UNSHADE:
-+ return meta_button_state (d->button_states[BUTTON_UNSHADE]);
-+ case META_BUTTON_TYPE_UNABOVE:
-+ return meta_button_state (d->button_states[BUTTON_UNABOVE]);
-+ case META_BUTTON_TYPE_UNSTICK:
-+ return meta_button_state (d->button_states[BUTTON_UNSTICK]);
-+ default:
-+ break;
-+ }
-+
-+ return META_BUTTON_STATE_NORMAL;
-+}
-+
-+static void
-+meta_get_decoration_geometry (decor_t *d,
-+ MetaTheme *theme,
-+ MetaFrameFlags *flags,
-+ MetaFrameGeometry *fgeom,
-+ MetaButtonLayout *button_layout,
-+ MetaFrameType frame_type)
-+{
-+ GdkScreen *screen;
-+ MetaStyleInfo *style_info;
-+ gint client_width;
-+ gint client_height;
-+
-+ if (!(frame_type < META_FRAME_TYPE_LAST))
-+ frame_type = META_FRAME_TYPE_NORMAL;
-+
-+ if (meta_button_layout_set)
-+ {
-+ *button_layout = meta_button_layout;
-+ }
-+ else
-+ {
-+ gint i;
-+
-+ button_layout->left_buttons[0] = META_BUTTON_FUNCTION_MENU;
-+
-+ for (i = 1; i < MAX_BUTTONS_PER_CORNER; ++i)
-+ button_layout->left_buttons[i] = META_BUTTON_FUNCTION_LAST;
-+
-+ button_layout->right_buttons[0] = META_BUTTON_FUNCTION_MINIMIZE;
-+ button_layout->right_buttons[1] = META_BUTTON_FUNCTION_MAXIMIZE;
-+ button_layout->right_buttons[2] = META_BUTTON_FUNCTION_CLOSE;
-+
-+ for (i = 3; i < MAX_BUTTONS_PER_CORNER; ++i)
-+ button_layout->right_buttons[i] = META_BUTTON_FUNCTION_LAST;
-+ }
-+
-+ *flags = 0;
-+
-+ if (d->actions & WNCK_WINDOW_ACTION_CLOSE)
-+ *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_DELETE;
-+
-+ if (d->actions & WNCK_WINDOW_ACTION_MINIMIZE)
-+ *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_MINIMIZE;
-+
-+ if (d->actions & WNCK_WINDOW_ACTION_MAXIMIZE)
-+ *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_MAXIMIZE;
-+
-+ *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_MENU;
-+
-+ if (d->actions & WNCK_WINDOW_ACTION_RESIZE)
-+ {
-+ if (!(d->state & WNCK_WINDOW_STATE_MAXIMIZED_VERTICALLY))
-+ *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_VERTICAL_RESIZE;
-+ if (!(d->state & WNCK_WINDOW_STATE_MAXIMIZED_HORIZONTALLY))
-+ *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_HORIZONTAL_RESIZE;
-+ }
-+
-+ if (d->actions & WNCK_WINDOW_ACTION_MOVE)
-+ *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_MOVE;
-+
-+ if (d->actions & WNCK_WINDOW_ACTION_MAXIMIZE)
-+ *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_MAXIMIZE;
-+
-+ if (d->actions & WNCK_WINDOW_ACTION_SHADE)
-+ *flags |= (MetaFrameFlags ) META_FRAME_ALLOWS_SHADE;
-+
-+ if (d->active)
-+ *flags |= (MetaFrameFlags ) META_FRAME_HAS_FOCUS;
-+
-+ if ((d->state & META_MAXIMIZED) == META_MAXIMIZED)
-+ *flags |= (MetaFrameFlags ) META_FRAME_MAXIMIZED;
-+
-+ if (d->state & WNCK_WINDOW_STATE_STICKY)
-+ *flags |= (MetaFrameFlags ) META_FRAME_STUCK;
-+
-+ if (d->state & WNCK_WINDOW_STATE_FULLSCREEN)
-+ *flags |= (MetaFrameFlags ) META_FRAME_FULLSCREEN;
-+
-+ if (d->state & WNCK_WINDOW_STATE_SHADED)
-+ *flags |= (MetaFrameFlags ) META_FRAME_SHADED;
-+
-+ if (d->state & WNCK_WINDOW_STATE_ABOVE)
-+ *flags |= (MetaFrameFlags ) META_FRAME_ABOVE;
-+
-+ client_width = d->border_layout.top.x2 - d->border_layout.top.x1;
-+ client_width -= d->context->right_space + d->context->left_space;
-+
-+ if (d->border_layout.rotation)
-+ client_height = d->border_layout.left.x2 - d->border_layout.left.x1;
-+ else
-+ client_height = d->border_layout.left.y2 - d->border_layout.left.y1;
-+
-+ screen = gtk_widget_get_screen (d->frame->style_window_rgba);
-+ style_info = meta_theme_create_style_info (screen, NULL);
-+
-+ meta_theme_calc_geometry (theme, style_info, frame_type, d->frame->text_height,
-+ *flags, client_width, client_height,
-+ button_layout, fgeom);
-+
-+ meta_style_info_unref (style_info);
-+}
-+
-+void
-+meta_draw_window_decoration (decor_t *d)
-+{
-+ GdkDisplay *display;
-+ GdkScreen *screen;
-+ Display *xdisplay;
-+ cairo_surface_t *surface;
-+ Picture src;
-+ MetaButtonState button_states [META_BUTTON_TYPE_LAST];
-+ MetaButtonLayout button_layout;
-+ MetaFrameGeometry fgeom;
-+ MetaFrameFlags flags;
-+ MetaFrameType frame_type;
-+ MetaTheme *theme;
-+ MetaStyleInfo *style_info;
-+ GtkStyleContext *context;
-+ cairo_t *cr;
-+ gint i;
-+ Region top_region;
-+ Region bottom_region;
-+ Region left_region;
-+ Region right_region;
-+ gdouble meta_active_opacity;
-+ gdouble meta_inactive_opacity;
-+ gboolean meta_active_shade_opacity;
-+ gboolean meta_inactive_shade_opacity;
-+ double alpha;
-+ gboolean shade_alpha;
-+ MetaFrameStyle *frame_style;
-+ GtkWidget *style_window;
-+ GdkRGBA bg_rgba;
-+
-+ if (!d->surface || !d->picture)
-+ return;
-+
-+ display = gdk_display_get_default ();
-+ xdisplay = gdk_x11_display_get_xdisplay (display);
-+
-+ top_region = NULL;
-+ bottom_region = NULL;
-+ left_region = NULL;
-+ right_region = NULL;
-+
-+ g_object_get (settings, "metacity-active-opacity", &meta_active_opacity, NULL);
-+ g_object_get (settings, "metacity-inactive-opacity", &meta_inactive_opacity, NULL);
-+ g_object_get (settings, "metacity-active-shade-opacity", &meta_active_shade_opacity, NULL);
-+ g_object_get (settings, "metacity-inactive-shade-opacity", &meta_inactive_shade_opacity, NULL);
-+
-+ alpha = (d->active) ? meta_active_opacity : meta_inactive_opacity;
-+ shade_alpha = (d->active) ? meta_active_shade_opacity : meta_inactive_shade_opacity;
-+
-+ if (decoration_alpha == 1.0)
-+ alpha = 1.0;
-+
-+ if (cairo_xlib_surface_get_depth (d->surface) == 32)
-+ style_window = d->frame->style_window_rgba;
-+ else
-+ style_window = d->frame->style_window_rgb;
-+
-+ context = gtk_widget_get_style_context (style_window);
-+
-+ cr = cairo_create (d->buffer_surface ? d->buffer_surface : d->surface);
-+
-+ cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
-+
-+ theme = meta_theme_get_current ();
-+
-+ frame_type = meta_frame_type_from_string (d->frame->type);
-+
-+ if (frame_type == META_FRAME_TYPE_LAST)
-+ frame_type = META_FRAME_TYPE_NORMAL;
-+
-+ meta_get_decoration_geometry (d, theme, &flags, &fgeom, &button_layout,
-+ frame_type);
-+
-+ if ((d->prop_xid || !d->buffer_surface) && !d->frame_window)
-+ draw_shadow_background (d, cr, d->shadow, d->context);
-+
-+ for (i = 0; i < META_BUTTON_TYPE_LAST; ++i)
-+ button_states[i] = meta_button_state_for_button_type (d, i);
-+
-+ frame_style = meta_theme_get_frame_style (theme, frame_type, flags);
-+
-+ gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, &bg_rgba);
-+ bg_rgba.alpha = 1.0;
-+
-+ if (frame_style->window_background_color)
-+ {
-+ meta_color_spec_render (frame_style->window_background_color,
-+ context, &bg_rgba);
-+
-+ bg_rgba.alpha = frame_style->window_background_alpha / 255.0;
-+ }
-+
-+ /* Draw something that will be almost invisible to user. This is hacky way
-+ * to fix invisible decorations. */
-+ cairo_set_source_rgba (cr, 0, 0, 0, 0.01);
-+ cairo_rectangle (cr, 0, 0, 1, 1);
-+ cairo_fill (cr);
-+ /* ------------ */
-+
-+ cairo_destroy (cr);
-+
-+ if (d->frame_window)
-+ surface = create_surface (fgeom.width, fgeom.height, d->frame->style_window_rgb);
-+ else
-+ surface = create_surface (fgeom.width, fgeom.height, d->frame->style_window_rgba);
-+
-+ cr = cairo_create (surface);
-+ gdk_cairo_set_source_rgba (cr, &bg_rgba);
-+ cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
-+
-+ src = XRenderCreatePicture (xdisplay, cairo_xlib_surface_get_drawable (surface),
-+ get_format_for_surface (d, surface), 0, NULL);
-+
-+ screen = gtk_widget_get_screen (d->frame->style_window_rgba);
-+ style_info = meta_theme_create_style_info (screen, NULL);
-+
-+ cairo_paint (cr);
-+ meta_theme_draw_frame (theme, style_info, cr, frame_type, flags,
-+ fgeom.width - fgeom.borders.total.left - fgeom.borders.total.right,
-+ fgeom.height - fgeom.borders.total.top - fgeom.borders.total.bottom,
-+ d->layout, d->frame->text_height, &button_layout,
-+ button_states, d->icon_pixbuf, NULL);
-+
-+ meta_style_info_unref (style_info);
-+
-+ if (fgeom.borders.visible.top)
-+ {
-+ top_region = meta_get_top_border_region (&fgeom, fgeom.width);
-+
-+ decor_blend_border_picture (xdisplay, d->context, src,
-+ fgeom.borders.invisible.left,
-+ fgeom.borders.invisible.top,
-+ d->picture, &d->border_layout,
-+ BORDER_TOP, top_region,
-+ alpha * 0xffff, shade_alpha, 0);
-+ }
-+
-+ if (fgeom.borders.visible.bottom)
-+ {
-+ bottom_region = meta_get_bottom_border_region (&fgeom, fgeom.width);
-+
-+ decor_blend_border_picture (xdisplay, d->context, src,
-+ fgeom.borders.invisible.left,
-+ fgeom.height - fgeom.borders.total.bottom,
-+ d->picture, &d->border_layout,
-+ BORDER_BOTTOM, bottom_region,
-+ alpha * 0xffff, shade_alpha, 0);
-+ }
-+
-+ if (fgeom.borders.visible.left)
-+ {
-+ left_region = meta_get_left_border_region (&fgeom, fgeom.height);
-+
-+ decor_blend_border_picture (xdisplay, d->context, src,
-+ fgeom.borders.invisible.left,
-+ fgeom.borders.total.top,
-+ d->picture, &d->border_layout,
-+ BORDER_LEFT, left_region,
-+ alpha * 0xffff, shade_alpha, 0);
-+ }
-+
-+ if (fgeom.borders.visible.right)
-+ {
-+ right_region = meta_get_right_border_region (&fgeom, fgeom.height);
-+
-+ decor_blend_border_picture (xdisplay, d->context, src,
-+ fgeom.width - fgeom.borders.total.right,
-+ fgeom.borders.total.top,
-+ d->picture, &d->border_layout,
-+ BORDER_RIGHT, right_region,
-+ alpha * 0xffff, shade_alpha, 0);
-+ }
-+
-+ cairo_destroy (cr);
-+ cairo_surface_destroy (surface);
-+ XRenderFreePicture (xdisplay, src);
-+
-+ copy_to_front_buffer (d);
-+
-+ if (d->frame_window)
-+ {
-+ GdkWindow *gdk_frame_window;
-+ GdkPixbuf *pixbuf;
-+
-+ gdk_frame_window = gtk_widget_get_window (d->decor_window);
-+
-+ pixbuf = gdk_pixbuf_get_from_surface (d->surface, 0, 0, d->width, d->height);
-+ gtk_image_set_from_pixbuf (GTK_IMAGE (d->decor_image), pixbuf);
-+ g_object_unref (pixbuf);
-+
-+ gdk_window_move_resize (gdk_frame_window,
-+ d->context->left_corner_space - 1,
-+ d->context->top_corner_space - 1,
-+ d->width,
-+ d->height);
-+
-+ gdk_window_lower (gdk_frame_window);
-+ }
-+
-+ if (d->prop_xid)
-+ {
-+ /* translate from frame to client window space */
-+ if (top_region)
-+ XOffsetRegion (top_region, -fgeom.borders.total.left, -fgeom.borders.total.top);
-+ if (bottom_region)
-+ XOffsetRegion (bottom_region, -fgeom.borders.total.left, 0);
-+ if (left_region)
-+ XOffsetRegion (left_region, -fgeom.borders.total.left, 0);
-+
-+ decor_update_meta_window_property (d, theme, flags, frame_type,
-+ top_region, bottom_region,
-+ left_region, right_region);
-+
-+ d->prop_xid = 0;
-+ }
-+
-+ if (top_region)
-+ XDestroyRegion (top_region);
-+ if (bottom_region)
-+ XDestroyRegion (bottom_region);
-+ if (left_region)
-+ XDestroyRegion (left_region);
-+ if (right_region)
-+ XDestroyRegion (right_region);
-+}
-+
-+static void
-+meta_calc_button_size (decor_t *d)
-+{
-+ MetaTheme *theme;
-+ MetaFrameType frame_type;
-+ MetaFrameFlags flags;
-+ MetaFrameGeometry fgeom;
-+ MetaButtonLayout button_layout;
-+ gint i, min_x, x, y, w, h, width;
-+
-+ if (!d->context)
-+ {
-+ d->button_width = 0;
-+ return;
-+ }
-+
-+ theme = meta_theme_get_current ();
-+
-+ frame_type = meta_frame_type_from_string (d->frame->type);
-+ if (!(frame_type < META_FRAME_TYPE_LAST))
-+ frame_type = META_FRAME_TYPE_NORMAL;
-+
-+ meta_get_decoration_geometry (d, theme, &flags, &fgeom, &button_layout,
-+ frame_type);
-+
-+ width = d->border_layout.top.x2 - d->border_layout.top.x1 -
-+ d->context->left_space - d->context->right_space +
-+ fgeom.borders.total.left + fgeom.borders.total.right;
-+
-+ min_x = width;
-+
-+ for (i = 0; i < 3; ++i)
-+ {
-+ static guint button_actions[3] = {
-+ WNCK_WINDOW_ACTION_CLOSE,
-+ WNCK_WINDOW_ACTION_MAXIMIZE,
-+ WNCK_WINDOW_ACTION_MINIMIZE
-+ };
-+
-+ if (d->actions & button_actions[i])
-+ {
-+ if (meta_get_button_position (d, i, width, 256, &x, &y, &w, &h))
-+ {
-+ if (x > width / 2 && x < min_x)
-+ min_x = x;
-+ }
-+ }
-+ }
-+
-+ d->button_width = width - min_x;
-+}
-+
-+static MetaButtonFunction
-+button_to_meta_button_function (gint i)
-+{
-+ switch (i)
-+ {
-+ case BUTTON_MENU:
-+ return META_BUTTON_FUNCTION_MENU;
-+ case BUTTON_MIN:
-+ return META_BUTTON_FUNCTION_MINIMIZE;
-+ case BUTTON_MAX:
-+ return META_BUTTON_FUNCTION_MAXIMIZE;
-+ case BUTTON_CLOSE:
-+ return META_BUTTON_FUNCTION_CLOSE;
-+ case BUTTON_SHADE:
-+ return META_BUTTON_FUNCTION_SHADE;
-+ case BUTTON_ABOVE:
-+ return META_BUTTON_FUNCTION_ABOVE;
-+ case BUTTON_STICK:
-+ return META_BUTTON_FUNCTION_STICK;
-+ case BUTTON_UNSHADE:
-+ return META_BUTTON_FUNCTION_UNSHADE;
-+ case BUTTON_UNABOVE:
-+ return META_BUTTON_FUNCTION_UNABOVE;
-+ case BUTTON_UNSTICK:
-+ return META_BUTTON_FUNCTION_UNSTICK;
-+ default:
-+ break;
-+ }
-+
-+ return META_BUTTON_FUNCTION_LAST;
-+}
-+
-+gboolean
-+meta_get_button_position (decor_t *d,
-+ gint i,
-+ gint width,
-+ gint height,
-+ gint *x,
-+ gint *y,
-+ gint *w,
-+ gint *h)
-+{
-+ MetaButtonLayout button_layout;
-+ MetaFrameGeometry fgeom;
-+ MetaFrameType frame_type;
-+ MetaFrameFlags flags;
-+ MetaTheme *theme;
-+ MetaButtonFunction button_function;
-+ MetaButtonSpace *space;
-+
-+ if (!d->context)
-+ {
-+ /* undecorated windows implicitly have no buttons */
-+ return FALSE;
-+ }
-+
-+ theme = meta_theme_get_current ();
-+
-+ frame_type = meta_frame_type_from_string (d->frame->type);
-+ if (!(frame_type < META_FRAME_TYPE_LAST))
-+ frame_type = META_FRAME_TYPE_NORMAL;
-+
-+ meta_get_decoration_geometry (d, theme, &flags, &fgeom, &button_layout,
-+ frame_type);
-+
-+ button_function = button_to_meta_button_function (i);
-+ if (!meta_button_present (&button_layout, button_function))
-+ return FALSE;
-+
-+ switch (i)
-+ {
-+ case BUTTON_MENU:
-+ space = &fgeom.menu_rect;
-+ break;
-+ case BUTTON_MIN:
-+ space = &fgeom.min_rect;
-+ break;
-+ case BUTTON_MAX:
-+ space = &fgeom.max_rect;
-+ break;
-+ case BUTTON_CLOSE:
-+ space = &fgeom.close_rect;
-+ break;
-+ case BUTTON_SHADE:
-+ space = &fgeom.shade_rect;
-+ break;
-+ case BUTTON_ABOVE:
-+ space = &fgeom.above_rect;
-+ break;
-+ case BUTTON_STICK:
-+ space = &fgeom.stick_rect;
-+ break;
-+ case BUTTON_UNSHADE:
-+ space = &fgeom.unshade_rect;
-+ break;
-+ case BUTTON_UNABOVE:
-+ space = &fgeom.unabove_rect;
-+ break;
-+ case BUTTON_UNSTICK:
-+ space = &fgeom.unstick_rect;
-+ break;
-+ default:
-+ return FALSE;
-+ }
-+
-+ if (!space->clickable.width && !space->clickable.height)
-+ return FALSE;
-+
-+ *x = space->clickable.x;
-+ *y = space->clickable.y;
-+ *w = space->clickable.width;
-+ *h = space->clickable.height;
-+
-+ if (d->frame_window)
-+ {
-+ *x += d->frame->win_extents.left + 4;
-+ *y += d->frame->win_extents.top + 2;
-+ }
-+
-+ return TRUE;
-+}
-+
-+gfloat
-+meta_get_title_scale (decor_frame_t *frame)
-+{
-+ MetaTheme *theme;
-+ MetaFrameType type;
-+ MetaFrameFlags flags;
-+
-+ theme = meta_theme_get_current ();
-+ type = meta_frame_type_from_string (frame->type);
-+ flags = 0xc33; /* fixme */
-+
-+ if (type == META_FRAME_TYPE_LAST)
-+ return 1.0f;
-+
-+ gfloat scale = meta_theme_get_title_scale (theme, type, flags);
-+
-+ return scale;
-+}
-+
-+gboolean
-+meta_calc_decoration_size (decor_t *d,
-+ gint w,
-+ gint h,
-+ gint name_width,
-+ gint *width,
-+ gint *height)
-+{
-+ decor_layout_t layout;
-+ decor_context_t *context;
-+ decor_shadow_t *shadow;
-+
-+ if (!d->decorated)
-+ return FALSE;
-+
-+ if ((d->state & META_MAXIMIZED) == META_MAXIMIZED)
-+ {
-+ if (!d->frame_window)
-+ {
-+ if (d->active)
-+ {
-+ context = &d->frame->max_window_context_active;
-+ shadow = d->frame->max_border_shadow_active;
-+ }
-+ else
-+ {
-+ context = &d->frame->max_window_context_inactive;
-+ shadow = d->frame->max_border_shadow_inactive;
-+ }
-+ }
-+ else
-+ {
-+ context = &d->frame->max_window_context_no_shadow;
-+ shadow = d->frame->max_border_no_shadow;
-+ }
-+ }
-+ else
-+ {
-+ if (!d->frame_window)
-+ {
-+ if (d->active)
-+ {
-+ context = &d->frame->window_context_active;
-+ shadow = d->frame->border_shadow_active;
-+ }
-+ else
-+ {
-+ context = &d->frame->window_context_inactive;
-+ shadow = d->frame->border_shadow_inactive;
-+ }
-+ }
-+ else
-+ {
-+ context = &d->frame->window_context_no_shadow;
-+ shadow = d->frame->border_no_shadow;
-+ }
-+ }
-+
-+ if (!d->frame_window)
-+ {
-+ decor_get_best_layout (context, w, h, &layout);
-+
-+ if (context != d->context || memcmp (&layout, &d->border_layout, sizeof (layout)))
-+ {
-+ *width = layout.width;
-+ *height = layout.height;
-+
-+ d->border_layout = layout;
-+ d->context = context;
-+ d->shadow = shadow;
-+
-+ meta_calc_button_size (d);
-+
-+ return TRUE;
-+ }
-+ }
-+ else
-+ {
-+ if ((d->state & META_MAXIMIZED) == META_MAXIMIZED)
-+ decor_get_default_layout (context, d->client_width,
-+ d->client_height - d->frame->titlebar_height,
-+ &layout);
-+ else
-+ decor_get_default_layout (context, d->client_width,
-+ d->client_height, &layout);
-+
-+ *width = layout.width;
-+ *height = layout.height;
-+
-+ d->border_layout = layout;
-+ d->shadow = shadow;
-+ d->context = context;
-+
-+ meta_calc_button_size (d);
-+
-+ return TRUE;
-+ }
-+
-+ return FALSE;
-+}
-+
-+#define TOP_RESIZE_HEIGHT 2
-+#define RESIZE_EXTENDS 15
-+
-+void
-+meta_get_event_window_position (decor_t *d,
-+ gint i,
-+ gint j,
-+ gint width,
-+ gint height,
-+ gint *x,
-+ gint *y,
-+ gint *w,
-+ gint *h)
-+{
-+ MetaButtonLayout button_layout;
-+ MetaFrameGeometry fgeom;
-+ MetaFrameFlags flags;
-+ MetaTheme *theme;
-+
-+ theme = meta_theme_get_current ();
-+
-+ meta_get_decoration_geometry (d, theme, &flags, &fgeom, &button_layout,
-+ meta_frame_type_from_string (d->frame->type));
-+
-+ width += fgeom.borders.total.right + fgeom.borders.total.left;
-+ height += fgeom.borders.total.top + fgeom.borders.total.bottom;
-+
-+ switch (i)
-+ {
-+ case 2: /* bottom */
-+ switch (j)
-+ {
-+ case 2: /* bottom right */
-+ *x = width - fgeom.borders.total.right - RESIZE_EXTENDS;
-+ *y = height - fgeom.borders.total.bottom - RESIZE_EXTENDS;
-+
-+ if (d->frame_window)
-+ {
-+ *x += d->frame->win_extents.left + 2;
-+ *y += d->frame->win_extents.top + 2;
-+ }
-+
-+ *w = fgeom.borders.total.right + RESIZE_EXTENDS;
-+ *h = fgeom.borders.total.bottom + RESIZE_EXTENDS;
-+ break;
-+ case 1: /* bottom */
-+ *x = fgeom.borders.total.left + RESIZE_EXTENDS;
-+ *y = height - fgeom.borders.total.bottom;
-+
-+ if (d->frame_window)
-+ *y += d->frame->win_extents.top + 2;
-+
-+ *w = width - fgeom.borders.total.left - fgeom.borders.total.right - (2 * RESIZE_EXTENDS);
-+ *h = fgeom.borders.total.bottom;
-+ break;
-+ case 0: /* bottom left */
-+ default:
-+ *x = 0;
-+ *y = height - fgeom.borders.total.bottom - RESIZE_EXTENDS;
-+
-+ if (d->frame_window)
-+ {
-+ *x += d->frame->win_extents.left + 4;
-+ *y += d->frame->win_extents.bottom + 2;
-+ }
-+
-+ *w = fgeom.borders.total.left + RESIZE_EXTENDS;
-+ *h = fgeom.borders.total.bottom + RESIZE_EXTENDS;
-+ break;
-+ }
-+ break;
-+ case 1: /* middle */
-+ switch (j)
-+ {
-+ case 2: /* right */
-+ *x = width - fgeom.borders.total.right;
-+ *y = fgeom.borders.total.top + RESIZE_EXTENDS;
-+
-+ if (d->frame_window)
-+ *x += d->frame->win_extents.left + 2;
-+
-+ *w = fgeom.borders.total.right;
-+ *h = height - fgeom.borders.total.top - fgeom.borders.total.bottom - (2 * RESIZE_EXTENDS);
-+ break;
-+ case 1: /* middle */
-+ *x = fgeom.borders.total.left;
-+ *y = fgeom.title_rect.y + TOP_RESIZE_HEIGHT;
-+ *w = width - fgeom.borders.total.left - fgeom.borders.total.right;
-+ *h = height - fgeom.top_titlebar_edge - fgeom.borders.total.bottom;
-+ break;
-+ case 0: /* left */
-+ default:
-+ *x = 0;
-+ *y = fgeom.borders.total.top + RESIZE_EXTENDS;
-+
-+ if (d->frame_window)
-+ *x += d->frame->win_extents.left + 4;
-+
-+ *w = fgeom.borders.total.left;
-+ *h = height - fgeom.borders.total.top - fgeom.borders.total.bottom - (2 * RESIZE_EXTENDS);
-+ break;
-+ }
-+ break;
-+ case 0: /* top */
-+ default:
-+ switch (j)
-+ {
-+ case 2: /* top right */
-+ *x = width - fgeom.borders.total.right - RESIZE_EXTENDS;
-+ *y = 0;
-+
-+ if (d->frame_window)
-+ {
-+ *x += d->frame->win_extents.left + 2;
-+ *y += d->frame->win_extents.top + 2 - fgeom.title_rect.height;
-+ }
-+
-+ *w = fgeom.borders.total.right + RESIZE_EXTENDS;
-+ *h = fgeom.borders.total.top + RESIZE_EXTENDS;
-+ break;
-+ case 1: /* top */
-+ *x = fgeom.borders.total.left + RESIZE_EXTENDS;
-+ *y = 0;
-+
-+ if (d->frame_window)
-+ *y += d->frame->win_extents.top + 2;
-+
-+ *w = width - fgeom.borders.total.left - fgeom.borders.total.right - (2 * RESIZE_EXTENDS);
-+ *h = fgeom.borders.total.top - fgeom.title_rect.height;
-+ break;
-+ case 0: /* top left */
-+ default:
-+ *x = 0;
-+ *y = 0;
-+
-+ if (d->frame_window)
-+ {
-+ *x += d->frame->win_extents.left + 4;
-+ *y += d->frame->win_extents.top + 2 - fgeom.title_rect.height;
-+ }
-+
-+ *w = fgeom.borders.total.left + RESIZE_EXTENDS;
-+ *h = fgeom.borders.total.top + RESIZE_EXTENDS;
-+ break;
-+ }
-+ break;
-+ }
-+
-+ if (!(flags & META_FRAME_ALLOWS_VERTICAL_RESIZE))
-+ {
-+ /* turn off top and bottom event windows */
-+ if (i == 0 || i == 2)
-+ *w = *h = 0;
-+ }
-+
-+ if (!(flags & META_FRAME_ALLOWS_HORIZONTAL_RESIZE))
-+ {
-+ /* turn off left and right event windows */
-+ if (j == 0 || j == 2)
-+ *w = *h = 0;
-+ }
-+}
-+
-+static MetaButtonFunction
-+meta_button_function_from_string (const char *str)
-+{
-+ if (strcmp (str, "menu") == 0)
-+ return META_BUTTON_FUNCTION_MENU;
-+ else if (strcmp (str, "appmenu") == 0)
-+ return META_BUTTON_FUNCTION_APPMENU;
-+ else if (strcmp (str, "minimize") == 0)
-+ return META_BUTTON_FUNCTION_MINIMIZE;
-+ else if (strcmp (str, "maximize") == 0)
-+ return META_BUTTON_FUNCTION_MAXIMIZE;
-+ else if (strcmp (str, "close") == 0)
-+ return META_BUTTON_FUNCTION_CLOSE;
-+ else if (strcmp (str, "shade") == 0)
-+ return META_BUTTON_FUNCTION_SHADE;
-+ else if (strcmp (str, "above") == 0)
-+ return META_BUTTON_FUNCTION_ABOVE;
-+ else if (strcmp (str, "stick") == 0)
-+ return META_BUTTON_FUNCTION_STICK;
-+ else if (strcmp (str, "unshade") == 0)
-+ return META_BUTTON_FUNCTION_UNSHADE;
-+ else if (strcmp (str, "unabove") == 0)
-+ return META_BUTTON_FUNCTION_UNABOVE;
-+ else if (strcmp (str, "unstick") == 0)
-+ return META_BUTTON_FUNCTION_UNSTICK;
-+ else
-+ return META_BUTTON_FUNCTION_LAST;
-+}
-+
-+static MetaButtonFunction
-+meta_button_opposite_function (MetaButtonFunction ofwhat)
-+{
-+ switch (ofwhat)
-+ {
-+ case META_BUTTON_FUNCTION_SHADE:
-+ return META_BUTTON_FUNCTION_UNSHADE;
-+ case META_BUTTON_FUNCTION_UNSHADE:
-+ return META_BUTTON_FUNCTION_SHADE;
-+
-+ case META_BUTTON_FUNCTION_ABOVE:
-+ return META_BUTTON_FUNCTION_UNABOVE;
-+ case META_BUTTON_FUNCTION_UNABOVE:
-+ return META_BUTTON_FUNCTION_ABOVE;
-+
-+ case META_BUTTON_FUNCTION_STICK:
-+ return META_BUTTON_FUNCTION_UNSTICK;
-+ case META_BUTTON_FUNCTION_UNSTICK:
-+ return META_BUTTON_FUNCTION_STICK;
-+
-+ default:
-+ return META_BUTTON_FUNCTION_LAST;
-+ }
-+}
-+
-+static void
-+meta_initialize_button_layout (MetaButtonLayout *layout)
-+{
-+ int i;
-+
-+ for (i = 0; i < MAX_BUTTONS_PER_CORNER; ++i)
-+ {
-+ layout->left_buttons[i] = META_BUTTON_FUNCTION_LAST;
-+ layout->right_buttons[i] = META_BUTTON_FUNCTION_LAST;
-+ layout->left_buttons_has_spacer[i] = FALSE;
-+ layout->right_buttons_has_spacer[i] = FALSE;
-+ }
-+}
-+
-+void
-+meta_update_button_layout (const char *value)
-+{
-+ MetaButtonLayout new_layout;
-+ MetaButtonFunction f;
-+ char **sides;
-+ int i;
-+
-+ meta_initialize_button_layout (&new_layout);
-+
-+ sides = g_strsplit (value, ":", 2);
-+
-+ if (sides[0] != NULL)
-+ {
-+ char **buttons;
-+ int b;
-+ gboolean used[META_BUTTON_FUNCTION_LAST];
-+
-+ for (i = 0; i < META_BUTTON_FUNCTION_LAST; ++i)
-+ used[i] = FALSE;
-+
-+ buttons = g_strsplit (sides[0], ",", -1);
-+
-+ i = b = 0;
-+ while (buttons[b] != NULL)
-+ {
-+ f = meta_button_function_from_string (buttons[b]);
-+ if (i > 0 && strcmp ("spacer", buttons[b]) == 0)
-+ {
-+ new_layout.left_buttons_has_spacer[i - 1] = TRUE;
-+ f = meta_button_opposite_function (f);
-+
-+ if (f != META_BUTTON_FUNCTION_LAST)
-+ new_layout.left_buttons_has_spacer[i - 2] = TRUE;
-+ }
-+ else
-+ {
-+ if (f != META_BUTTON_FUNCTION_LAST && !used[f])
-+ {
-+ used[f] = TRUE;
-+ new_layout.left_buttons[i++] = f;
-+
-+ f = meta_button_opposite_function (f);
-+
-+ if (f != META_BUTTON_FUNCTION_LAST)
-+ new_layout.left_buttons[i++] = f;
-+
-+ }
-+ else
-+ {
-+ fprintf (stderr, "%s: Ignoring unknown or already-used "
-+ "button name \"%s\"\n", program_name, buttons[b]);
-+ }
-+ }
-+ ++b;
-+ }
-+
-+ new_layout.left_buttons[i] = META_BUTTON_FUNCTION_LAST;
-+
-+ g_strfreev (buttons);
-+
-+ if (sides[1] != NULL)
-+ {
-+ for (i = 0; i < META_BUTTON_FUNCTION_LAST; ++i)
-+ used[i] = FALSE;
-+
-+ buttons = g_strsplit (sides[1], ",", -1);
-+
-+ i = b = 0;
-+ while (buttons[b] != NULL)
-+ {
-+ f = meta_button_function_from_string (buttons[b]);
-+ if (i > 0 && strcmp ("spacer", buttons[b]) == 0)
-+ {
-+ new_layout.right_buttons_has_spacer[i - 1] = TRUE;
-+ f = meta_button_opposite_function (f);
-+ if (f != META_BUTTON_FUNCTION_LAST)
-+ new_layout.right_buttons_has_spacer[i - 2] = TRUE;
-+ }
-+ else
-+ {
-+ if (f != META_BUTTON_FUNCTION_LAST && !used[f])
-+ {
-+ used[f] = TRUE;
-+ new_layout.right_buttons[i++] = f;
-+
-+ f = meta_button_opposite_function (f);
-+
-+ if (f != META_BUTTON_FUNCTION_LAST)
-+ new_layout.right_buttons[i++] = f;
-+ }
-+ else
-+ {
-+ fprintf (stderr, "%s: Ignoring unknown or "
-+ "already-used button name \"%s\"\n",
-+ program_name, buttons[b]);
-+ }
-+ }
-+ ++b;
-+ }
-+
-+ new_layout.right_buttons[i] = META_BUTTON_FUNCTION_LAST;
-+
-+ g_strfreev (buttons);
-+ }
-+ }
-+
-+ g_strfreev (sides);
-+
-+ /* Invert the button layout for RTL languages */
-+ if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
-+ {
-+ MetaButtonLayout rtl_layout;
-+ int j;
-+
-+ meta_initialize_button_layout (&rtl_layout);
-+
-+ i = 0;
-+ while (new_layout.left_buttons[i] != META_BUTTON_FUNCTION_LAST)
-+ ++i;
-+
-+ for (j = 0; j < i; ++j)
-+ {
-+ rtl_layout.right_buttons[j] = new_layout.left_buttons[i - j - 1];
-+ if (j == 0)
-+ rtl_layout.right_buttons_has_spacer[i - 1] = new_layout.left_buttons_has_spacer[i - j - 1];
-+ else
-+ rtl_layout.right_buttons_has_spacer[j - 1] = new_layout.left_buttons_has_spacer[i - j - 1];
-+ }
-+
-+ i = 0;
-+ while (new_layout.right_buttons[i] != META_BUTTON_FUNCTION_LAST)
-+ ++i;
-+
-+ for (j = 0; j < i; ++j)
-+ {
-+ rtl_layout.left_buttons[j] = new_layout.right_buttons[i - j - 1];
-+ if (j == 0)
-+ rtl_layout.left_buttons_has_spacer[i - 1] = new_layout.right_buttons_has_spacer[i - j - 1];
-+ else
-+ rtl_layout.left_buttons_has_spacer[j - 1] = new_layout.right_buttons_has_spacer[i - j - 1];
-+ }
-+
-+ new_layout = rtl_layout;
-+ }
-+
-+ meta_button_layout = new_layout;
-+}
-+
-+void
-+meta_update_border_extents (decor_frame_t *frame)
-+{
-+ MetaTheme *theme;
-+ GdkScreen *screen;
-+ MetaStyleInfo *style_info;
-+ MetaFrameBorders borders;
-+ MetaFrameType frame_type;
-+ gint top_height;
-+ gint bottom_height;
-+ gint left_width;
-+ gint right_width;
-+
-+ gwd_decor_frame_ref (frame);
-+
-+ frame_type = meta_frame_type_from_string (frame->type);
-+ if (!(frame_type < META_FRAME_TYPE_LAST))
-+ frame_type = META_FRAME_TYPE_NORMAL;
-+
-+ theme = meta_theme_get_current ();
-+
-+ screen = gtk_widget_get_screen (frame->style_window_rgba);
-+ style_info = meta_theme_create_style_info (screen, NULL);
-+
-+ meta_theme_get_frame_borders (theme, style_info, frame_type, frame->text_height,
-+ 0, &borders);
-+
-+ top_height = borders.visible.top;
-+ bottom_height = borders.visible.bottom;
-+ left_width = borders.visible.left;
-+ right_width = borders.visible.right;
-+
-+ frame->win_extents.top = frame->win_extents.top;
-+ frame->win_extents.bottom = bottom_height;
-+ frame->win_extents.left = left_width;
-+ frame->win_extents.right = right_width;
-+
-+ frame->titlebar_height = top_height - frame->win_extents.top;
-+
-+ meta_theme_get_frame_borders (theme, style_info, frame_type, frame->text_height,
-+ META_FRAME_MAXIMIZED, &borders);
-+
-+ top_height = borders.visible.top;
-+ bottom_height = borders.visible.bottom;
-+ left_width = borders.visible.left;
-+ right_width = borders.visible.right;
-+
-+ frame->max_win_extents.top = frame->win_extents.top;
-+ frame->max_win_extents.bottom = bottom_height;
-+ frame->max_win_extents.left = left_width;
-+ frame->max_win_extents.right = right_width;
-+
-+ frame->max_titlebar_height = top_height - frame->max_win_extents.top;
-+
-+ meta_style_info_unref (style_info);
-+
-+ gwd_decor_frame_unref (frame);
-+}
-+
-+#endif /* HAVE_METACITY_3_16_0 */
-+#endif /* USE_METACITY */
-diff --git a/gtk/window-decorator/metacity.c b/gtk/window-decorator/metacity.c
-index 2487319..0af4193 100644
---- a/gtk/window-decorator/metacity.c
-+++ b/gtk/window-decorator/metacity.c
-@@ -26,6 +26,7 @@
- #include "gtk-window-decorator.h"
-
- #ifdef USE_METACITY
-+#ifndef HAVE_METACITY_3_16_0
-
- static void
- decor_update_meta_window_property (decor_t *d,
-@@ -1637,4 +1638,5 @@ meta_update_border_extents (decor_frame_t *frame)
- gwd_decor_frame_unref (frame);
- }
-
--#endif
-+#endif /* HAVE_METACITY_3_16_0 */
-+#endif /* USE_METACITY */
-diff --git a/gtk/window-decorator/settings.c b/gtk/window-decorator/settings.c
-index 5594492..956cb4d 100644
---- a/gtk/window-decorator/settings.c
-+++ b/gtk/window-decorator/settings.c
-@@ -45,11 +45,14 @@ init_settings (GWDSettingsWritable *writable,
- #ifdef USE_GSETTINGS
- #define STORAGE_USED
- GSettings *compiz = gwd_get_org_compiz_gwd_settings ();
-+ GSettings *metacity = gwd_get_org_gnome_metacity_settings ();
- GSettings *mutter = gwd_get_org_gnome_mutter_settings ();
- GSettings *gnome = gwd_get_org_gnome_desktop_wm_preferences_settings ();
-- storage = gwd_settings_storage_gsettings_new (gnome, mutter, compiz, writable);
-+
-+ storage = gwd_settings_storage_gsettings_new (gnome, metacity, mutter, compiz, writable);
-
- gwd_connect_org_compiz_gwd_settings (compiz, storage);
-+ gwd_connect_org_gnome_metacity_settings (metacity, storage);
- gwd_connect_org_gnome_mutter_settings (mutter, storage);
- gwd_connect_org_gnome_desktop_wm_preferences_settings (gnome, storage);
- #endif
-diff --git a/gtk/window-decorator/tests/CMakeLists.txt b/gtk/window-decorator/tests/CMakeLists.txt
-index 7bf6019..37ff0e6 100644
---- a/gtk/window-decorator/tests/CMakeLists.txt
-+++ b/gtk/window-decorator/tests/CMakeLists.txt
-@@ -75,6 +75,21 @@ if (COMPIZ_TEST_GTK_WINDOW_DECORATOR_FOUND)
-
- add_gsettings_schema_to_recompilation_list (compiz_gwd_gsettings_org_gnome_desktop_wm_preferences_schema)
-
-+ set (_metacity_gschema_name org.gnome.metacity)
-+ set (_metacity_gschema_filename ${_metacity_gschema_name}.gschema.xml)
-+ set (_metacity_gschema_filepath ${CMAKE_CURRENT_SOURCE_DIR}/${_metacity_gschema_filename})
-+ set (_metacity_gschema_generated_location ${CMAKE_BINARY_DIR}/generated/glib-2.0/schemas/${_metacity_gschema_filename})
-+
-+ add_custom_command (OUTPUT ${_metacity_gschema_generated_location}
-+ COMMAND cp -r ${_metacity_gschema_filepath} ${_metacity_gschema_generated_location}
-+ DEPENDS ${_metacity_gschema_filepath}
-+ VERBATIM)
-+
-+ add_custom_target (compiz_gwd_gsettings_org_gnome_metacity_schema ALL
-+ DEPENDS ${_metacity_gschema_generated_location})
-+
-+ add_gsettings_schema_to_recompilation_list (compiz_gwd_gsettings_org_gnome_metacity_schema)
-+
- set (_mutter_gschema_name org.gnome.mutter)
- set (_mutter_gschema_filename ${_mutter_gschema_name}.gschema.xml)
- set (_mutter_gschema_filepath ${CMAKE_CURRENT_SOURCE_DIR}/${_mutter_gschema_filename})
-diff --git a/gtk/window-decorator/tests/org.gnome.metacity.gschema.xml b/gtk/window-decorator/tests/org.gnome.metacity.gschema.xml
-new file mode 100644
-index 0000000..81730b6
---- /dev/null
-+++ b/gtk/window-decorator/tests/org.gnome.metacity.gschema.xml
-@@ -0,0 +1,10 @@
-+<?xml version="1.0" encoding="UTF-8"?>
-+<schemalist>
-+ <schema path="/org/gnome/metacity/" id="org.gnome.metacity" gettext-domain="@GETTEXT_DOMAIN">
-+ <key type="s" name="theme">
-+ <default>'Adwaita'</default>
-+ <summary>Current theme</summary>
-+ <description>The theme determines the appearance of window borders, titlebar, and so forth.</description>
-+ </key>
-+ </schema>
-+</schemalist>
-diff --git a/gtk/window-decorator/tests/test_gwd_settings.cpp b/gtk/window-decorator/tests/test_gwd_settings.cpp
-index 26693f1..7037c2a 100644
---- a/gtk/window-decorator/tests/test_gwd_settings.cpp
-+++ b/gtk/window-decorator/tests/test_gwd_settings.cpp
-@@ -1535,6 +1535,7 @@ TEST_F (GWDSettingsStorageGSettingsTest, TestNoDeathOnConnectingSignalToNULLObje
- boost::bind (gwd_settings_storage_unref, _1));
-
- gwd_connect_org_compiz_gwd_settings (NULL, mStorage.get ());
-+ gwd_connect_org_gnome_metacity_settings (NULL, mStorage.get ());
- gwd_connect_org_gnome_mutter_settings (NULL, mStorage.get ());
- gwd_connect_org_gnome_desktop_wm_preferences_settings (NULL, mStorage.get ());
-
-@@ -1554,10 +1555,12 @@ class GWDSettingsStorageGSettingsFactoryWrapper :
-
- /* We do not need to keep a reference to these */
- mGWDSettings = gwd_get_org_compiz_gwd_settings ();
-+ mMetacitySettings = gwd_get_org_gnome_mutter_settings ();
- mMutterSettings = gwd_get_org_gnome_mutter_settings ();
- mDesktopSettings = gwd_get_org_gnome_desktop_wm_preferences_settings ();
-
- mStorage.reset (gwd_settings_storage_gsettings_new (mDesktopSettings,
-+ mMetacitySettings,
- mMutterSettings,
- mGWDSettings,
- writable),
-@@ -1655,6 +1658,7 @@ class GWDSettingsStorageGSettingsFactoryWrapper :
- {
- mStorage.reset ();
- mGWDSettings = NULL;
-+ mMetacitySettings = NULL;
- mMutterSettings = NULL;
- mDesktopSettings = NULL;
- gsettingsEnv.TearDownEnv ();
-@@ -1664,6 +1668,7 @@ class GWDSettingsStorageGSettingsFactoryWrapper :
- private:
-
- GSettings *mGWDSettings;
-+ GSettings *mMetacitySettings;
- GSettings *mMutterSettings;
- GSettings *mDesktopSettings;
- boost::shared_ptr <GWDSettingsStorage> mStorage;
---
-2.3.7
-
diff --git a/0002-Remove-function-declarations-from-gtk-window-decorat.patch b/0002-Remove-function-declarations-from-gtk-window-decorat.patch
deleted file mode 100644
index 3cfd49480f55..000000000000
--- a/0002-Remove-function-declarations-from-gtk-window-decorat.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-From b946d9f2d198fc97f9cfa885a1a9f5509a3cbe70 Mon Sep 17 00:00:00 2001
-From: Xiao-Long Chen <chenxiaolong@cxl.epac.to>
-Date: Fri, 1 May 2015 16:46:04 -0400
-Subject: [PATCH 2/2] Remove function declarations from gtk-window-decorator.h
- to prevent conflicts between metacity 3.14 and 3.16 bridge
-
----
- gtk/window-decorator/gtk-window-decorator.h | 16 ----------------
- 1 file changed, 16 deletions(-)
-
-diff --git a/gtk/window-decorator/gtk-window-decorator.h b/gtk/window-decorator/gtk-window-decorator.h
-index 35b3c12..33c42d1 100644
---- a/gtk/window-decorator/gtk-window-decorator.h
-+++ b/gtk/window-decorator/gtk-window-decorator.h
-@@ -719,18 +719,6 @@ meta_get_frame_type_for_decor_type (const gchar *frame_type);
- void
- meta_draw_window_decoration (decor_t *d);
-
--void
--meta_get_decoration_geometry (decor_t *d,
-- MetaTheme *theme,
-- MetaFrameFlags *flags,
-- MetaFrameGeometry *fgeom,
-- MetaButtonLayout *button_layout,
-- MetaFrameType frame_type,
-- GdkRectangle *clip);
--
--void
--meta_calc_button_size (decor_t *d);
--
- gboolean
- meta_calc_decoration_size (decor_t *d,
- gint w,
-@@ -749,10 +737,6 @@ meta_get_button_position (decor_t *d,
- gint *w,
- gint *h);
-
--gboolean
--meta_button_present (MetaButtonLayout *button_layout,
-- MetaButtonFunction function);
--
- void
- meta_get_event_window_position (decor_t *d,
- gint i,
---
-2.3.7
-
diff --git a/PKGBUILD b/PKGBUILD
index b153b1f2842f..0f12f37dcef3 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -13,7 +13,7 @@ pkgname=compiz-ubuntu
epoch=1
_actual_ver=0.9.12.1
-_extra_ver=+15.10.20150511
+_extra_ver=+15.10.20150627.1
if [[ "${_use_ppa}" != true ]]; then
_ubuntu_rel=0ubuntu1
@@ -55,18 +55,14 @@ source+=(compiz.reset
0001-Fix-cmake-install-directory.patch
0002-Fix-python-install-command.patch
0003-Use-Python-2.patch
- 0004-Disable-Werror.patch
- 0001-Add-metacity-3.16-support.patch
- 0002-Remove-function-declarations-from-gtk-window-decorat.patch)
-sha512sums=('3218acbd78f77036e60a649bff64c056681039de6e28d43e500e9ed84298435d8de98a016f9be858ed6f75474edb35a394d51ec84132e311465084f64925667d'
- '50ac0c1dd682d5bdf6ff8a51f00b99245699fe5c643da75558bc93220e300b902103f70e18299d18fb0e9e2bd09d1a16155c9d8bbf45943ae35dd34661b14e0e'
+ 0004-Disable-Werror.patch)
+sha512sums=('9b9a67a6a03527aab7fae21cd4baf2bdc89efd6f6abcfa1b65c5ee67ecfb789ce4772e3c497b7f969d721c58872c0a6e46f45429d50a2faabaf81a26b9bb2e5c'
+ 'ecff9b2a47fddff78301220bee67cb5432a9fcb060de1326b9d001c12740c23fbbc8a5e774c37664afb94d12b7068f83973968ca1222c6a27902b4d9d138d063'
'5f4b38c5fe3af9de0fe7897b9fdd04184dff9bf448f21ef19d9ae1b224c972061d8b183aa01cf8dcdf4fb37bb3466233ce53a6dfbbe51b0ff04f17568d2dc7ff'
'94b139716f74cfb26276dbc0c5a73aa1d6f591e888b976210e7523de83e782a76992350d08b8054c8a04eeeb5273130cdeaaffd155ee3e9800921b7541cbdd82'
'1107fd002e1123fd52535f0016ee241c12d719a62c0a301a97338a230a73267b43982e0d23250ecac09b3a4b0ae78710fa9e04d84d5729ee6ac7293935579706'
'247c393a1c84becea57ccae6e1c6ed8c0eae3f874627677f3944dca0197565b6b12912357ad4f025a5a876f294338cb79d498484392aabaf4bfa22e5a2c08b24'
- '1ec09ac2bbfe242670f9b51842c58bbe9b379f7a1bfeec12157b5ba3ea3142c88eb62462968f4378c64d75fa4148dca6123583399f93e2b6990c094d386f0951'
- '4913dd84ae21514b761b2710d015ae091d5909f5ceccabb17f334afd25af3142bb4768417c549a2ab5f83bb4541fd561bd4a653ad4b2396d51a17c2d6c215c91'
- '151983a93d74aac2d5fc23042e1c352a50478f663fae9e11739e0e3ea2139f2c0dfa6307cad4074a2319f3b1ce7be7d2cf73f37633bb2e4a12619b8b85757db8')
+ '1ec09ac2bbfe242670f9b51842c58bbe9b379f7a1bfeec12157b5ba3ea3142c88eb62462968f4378c64d75fa4148dca6123583399f93e2b6990c094d386f0951')
prepare() {
cd "${_archive_dir}"
@@ -85,17 +81,11 @@ prepare() {
# Don't treat warnings as errors
patch -p1 -i ../0004-Disable-Werror.patch
- # Add support for metacity 3.16's API
- patch -p1 -i ../0001-Add-metacity-3.16-support.patch
- patch -p1 -i ../0002-Remove-function-declarations-from-gtk-window-decorat.patch
-
# Apply Ubuntu patches
if [[ "${_use_ppa}" != true ]]; then
patch -p1 -i ../compiz_${_actual_ver}${_extra_ver}-${_ubuntu_rel}.diff
fi
- sed -i '/100_workaround_virtualbox_hang.patch/d' debian/patches/series
-
for i in $(grep -v '#' debian/patches/series); do
msg "Applying ${i}"
patch -p1 -i "debian/patches/${i}"