[Foresight-commits] Source: bash=4.2.48-1 bbswitch-kmod=0.8-1 bumblebee=3.2.1-5 claws-mail=3.10.1-0.1 epdb=0.14_8dd629ee-1 flashplayer=11.2.202.359-0.1 group-desktop-platform=2.5.5+2014.07.10-0.1 gsettings-desktop-schemas=3.3.2-1 guayadeque=0.3.7-1 httpd=2.2.27-1 kernel=3.10.48-1 lftp=4.5.2-1 metacity=2.30.3-0.4 npapi-vlc=2.1.3-3 openssl=0.9.8g-4 primus=07481761+2014.06.09-1 rar=5.1.0-1 unetbootin=608-1 unrar=5.1.6-0.1 vlc=2.1.3-1

4 views
Skip to first unread message

repos-...@foresightlinux.org

unread,
Sep 25, 2014, 3:06:00 PM9/25/14
to foresigh...@lists.foresightlinux.org
================================
bash:source=4.2.48-1 (previous: 4.2.29-1)
cvc rdiff bash -1 /foresight.rpath.org@fl:2-qa/4.2.48-1
================================
4.2.48-1 Tomas Forsman (tfor...@foresightlinux.se) Thu Sep 25 14:38:08 2014
Promote to fl:2-qa

bash42-042: new
bash42-034: new
bash42-040: new
bash42-032: new
bash42-033: new
bash42-048: new
bash.recipe: changed
Index: bash.recipe
====================================================================
contents(sha1)
inode(mtime owner group)
--- bash.recipe /foresight.rpath.org@fl:2-qa/4.2.29-1
+++ bash.recipe /foresight.rpath.org@fl:2-qa/4.2.48-1
@@ -7,7 +7,7 @@
class Bash(CPackageRecipe):
name = 'bash'
baseversion = '4.2'
- patchlevel = '29'
+ patchlevel = '48'
version = '.'.join((baseversion, patchlevel))

# autoconf needed by bash-2.05a-interpreter.patch's change to configure.in


bash42-037: new
bash42-039: new
bash42-046: new
bash42-044: new
bash42-045: new
bash42-036: new
bash42-043: new
bash42-038: new
bash42-031: new
bash42-035: new
bash42-047: new
bash42-030: new
bash42-041: new

================================
bbswitch-kmod:source=0.8-1 (previous: 0.7-2)
cvc rdiff bbswitch-kmod -1 /foresight.rpath.org@fl:2-qa-kernel/0.8-1
================================
0.8-1 Tomas Forsman (tfor...@foresightlinux.se) Thu Sep 25 14:38:08 2014
Promote to fl:2-qa

bbswitch-kmod.recipe: changed
Index: bbswitch-kmod.recipe
====================================================================
contents(sha1)
inode(mtime owner group)
--- bbswitch-kmod.recipe /foresight.rpath.org@fl:2-qa-kernel/0.7-2
+++ bbswitch-kmod.recipe /foresight.rpath.org@fl:2-qa-kernel/0.8-1
@@ -6,7 +6,7 @@
loadSuperClass('kernelmodulepackage')
class Bbswitch(KernelModulePackageRecipe):
name = 'bbswitch-kmod'
- version = '0.7'
+ version = '0.8'

moduleDir = 'updates'



v0.8.tar.gz: new
v0.7.tar.gz: removed

================================
bumblebee:source=3.2.1-5 (previous: 3.1-3)
cvc rdiff bumblebee -1 /foresight.rpath.org@fl:2-qa/3.2.1-5
================================
3.2.1-5 Tomas Forsman (tfor...@foresightlinux.se) Thu Sep 25 14:38:08 2014
Promote to fl:2-qa

bumblebee-conf.patch: new
--- /dev/null
+++ bumblebee-conf.patch
@@ -0,0 +20 @@
+--- bumblebee/bumblebee-3.2.1/conf/bumblebee.conf.in 2013-04-26 11:49:03.010174177 -0400
++++ bumblebee/bumblebee-3.2.1/conf/bumblebee.conf.in-patch 2014-06-09 21:27:26.006580141 -0400
+@@ -19,7 +19,7 @@
+ # The Driver used by Bumblebee server. If this value is not set (or empty),
+ # auto-detection is performed. The available drivers are nvidia and nouveau
+ # (See also the driver-specific sections below)
+-Driver=@CONF_DRIVER@
++Driver=nvidia
+ # Directory with a dummy config file to pass as a -configdir to secondary X
+ XorgConfDir=@XCONFDDIR@
+
+@@ -52,7 +52,7 @@
+ ## Section with nvidia driver specific options, only parsed if Driver=nvidia
+ [driver-nvidia]
+ # Module name to load, defaults to Driver if empty or unset
+-KernelDriver=@CONF_DRIVER_MODULE_NVIDIA@
++KernelDriver=nvidia
+ PMMethod=@CONF_PM_METHOD@
+ # colon-separated path to the nvidia libraries
+ LibraryPath=@CONF_LDPATH_NVIDIA@

bumblebee-3.2.1.tar.gz: new
nvidia-conf.patch: new
--- /dev/null
+++ nvidia-conf.patch
@@ -0,0 +18 @@
+--- bumblebee/bumblebee-3.2.1/conf/xorg.conf.nvidia 2013-04-26 11:49:03.010174177 -0400
++++ bumblebee/bumblebee-3.2.1/conf/xorg.conf.nvidia-patch 2014-06-09 09:35:53.370932500 -0400
+@@ -1,3 +1,6 @@
++Section "Files"
++EndSection
++
+ Section "ServerLayout"
+ Identifier "Layout0"
+ Option "AutoAddDevices" "false"
+@@ -32,3 +35,8 @@
+ Option "UseEDID" "false"
+ Option "UseDisplayDevice" "none"
+ EndSection
++
++Section "Screen"
++ Identifier "Screen1"
++ Device "Device1"
++EndSection

bumblebee.recipe: changed
Index: bumblebee.recipe
====================================================================
contents(size sha1)
inode(mtime)
--- bumblebee.recipe /foresight.rpath.org@fl:2-qa/3.1-3
+++ bumblebee.recipe /foresight.rpath.org@fl:2-qa/3.2.1-5
@@ -1,12 +1,12 @@
#
-# Copyright (c) 2012-2013 The Foresight Linux Project
+# Copyright (c) 2012-2014 The Foresight Linux Project
# This file is distributed under the terms of the MIT License.
# A copy is available at http://www.foresightlinux.org/licenses/mit-license/
#

class Bumblebee(AutoPackageRecipe):
name = 'bumblebee'
- version = '3.1'
+ version = '3.2.1'

buildRequires = [
'glib:devel',
@@ -18,15 +18,14 @@

def unpack(r):
r.addArchive('http://bumblebee-project.org/')
-
+ r.addPatch('nvidia-conf.patch')
+ r.addPatch('bumblebee-conf.patch')

def configure(r):
- r.Configure('CONF_DRIVER=nvidia CONF_DRIVER_MODULE_NVIDIA=nvidia-current CONF_LDPATH_NVIDIA=/usr/lib64/xorg.nvidia.3d/:/usr/lib/xorg.nvidia.3d/ CONF_MODPATH_NVIDIA=/usr/lib64/xorg/modules/updates/drivers/:/usr/lib64/xorg/modules')
-
+ r.Configure('CONF_DRIVER=nvidia CONF_DRIVER_MODULE_NVIDIA=nvidia CONF_LDPATH_NVIDIA=/usr/lib64/xorg.nvidia.3d/:/usr/lib/xorg.nvidia.3d/ CONF_MODPATH_NVIDIA=/usr/lib64/xorg/modules/updates/drivers/:/usr/lib64/xorg/modules --without-pidfile --with-udev-rules=/usr/lib/udev/rules.d/ CONF_PRIMUS_LD_PATH=/usr/lib/primus:/usr/lib64/primus')

def policy(r):
r.Move('scripts/sysvinit/bumblebeed', '%(initdir)s/bumblebeed', mode = 0755)
-
+ r.Move('scripts/bash_completion/bumblebee', '%(datadir)s/bash_completion.d/optirun', mode = 0755)
r.UtilizeUser('bumblebee', '%(initdir)s/bumblebeed')
r.UtilizeGroup('bumblebee', '%(initdir)s/bumblebeed')
-


bumblebee-3.1.tar.gz: removed

================================
claws-mail:source=3.10.1-0.1 (previous: 3.10.0-0.1)
cvc rdiff claws-mail -1 /foresight.rpath.org@fl:devel//2-qa/3.10.1-0.1
================================
3.10.1-0.1 Tomas Forsman (tfor...@foresightlinux.se) Thu Sep 25 14:38:08 2014
Promote to fl:2-qa

claws-mail.recipe: changed
Index: claws-mail.recipe
====================================================================
contents(sha1)
inode(mtime)
--- claws-mail.recipe /foresight.rpath.org@fl:devel//2-qa/3.10.0-0.1
+++ claws-mail.recipe /foresight.rpath.org@fl:devel//2-qa/3.10.1-0.1
@@ -5,7 +5,7 @@
#
class ClawsMail(AutoPackageRecipe):
name = 'claws-mail'
- version = '3.10.0'
+ version = '3.10.1'
buildRequires = [
'aspell:devel',
'aspell:runtime',


claws-mail-3.10.1.tar.xz: new
claws-mail-3.10.0.tar.xz: removed

================================
epdb:source=0.14_8dd629ee-1 (previous: tip_e731345-1)
cvc rdiff epdb -1 /foresight.rpath.org@fl:2-qa/0.14_8dd629ee-1
================================
0.14_8dd629ee-1 Tomas Forsman (tfor...@foresightlinux.se) Thu Sep 25 14:38:08 2014
Promote to fl:2-qa

epdb.recipe: changed
Index: epdb.recipe
====================================================================
contents(size sha1)
inode(mtime owner group)
--- epdb.recipe /foresight.rpath.org@fl:2-qa/tip_e731345-1
+++ epdb.recipe /foresight.rpath.org@fl:2-qa/0.14_8dd629ee-1
@@ -7,12 +7,11 @@

class Epdb(PackageRecipe):
name = 'epdb'
- version = 'tip'
- tag = 'e731345'
+ version = '0.14'
+ tag = '8dd629ee'

if tag:
version += '_' + tag
-

buildRequires = [
'python:devel',
@@ -20,10 +19,5 @@
]

def setup(r):
- if r.tag:
- r.addMercurialSnapshot('https://bitbucket.org/rpathsync/%(name)s/',
- tag=r.tag)
- else:
- r.addArchive('http://bitbucket.org/dugan/%(name)s/get/%(version)s.tar.bz2')
-
+ r.addGitSnapshot('https://github.com/sassoftware/epdb.git', tag=r.tag)
r.PythonSetup()


epdb.git--master--8dd629ee.tar.bz2: new
--e731345.tar.bz2: removed

================================
flashplayer:source=11.2.202.359-0.1 (previous: 11.2.202.335-0.1)
cvc rdiff flashplayer -1 /foresight.rpath.org@fl:devel//2-qa/11.2.202.359-0.1
================================
11.2.202.359-0.1 Tomas Forsman (tfor...@foresightlinux.se) Thu Sep 25 14:38:08 2014
Promote to fl:2-qa

flashplayer.recipe: changed
Index: flashplayer.recipe
====================================================================
contents(sha1)
inode(mtime)
--- flashplayer.recipe /foresight.rpath.org@fl:devel//2-qa/11.2.202.335-0.1
+++ flashplayer.recipe /foresight.rpath.org@fl:devel//2-qa/11.2.202.359-0.1
@@ -1,6 +1,6 @@
class FlashPlayer(PackageRecipe):
name = "flashplayer"
- version = "11.2.202.335"
+ version = "11.2.202.359"

buildRequires = [ 'glibc:devel', 'zlib:devel', 'fontconfig:devel',
'freetype:devel', 'glib:devel', 'gtk:devel',



================================
group-desktop-platform:source=2.5.5+2014.07.10-0.1 (previous: 2.5.5+2014.06.02-0.1)
cvc rdiff group-desktop-platform -1 /foresight.rpath.org@fl:devel//2-qa/2.5.5+2014.07.10-0.1
================================
2.5.5+2014.07.10-0.1 Tomas Forsman (tfor...@foresightlinux.se) Thu Sep 25 14:38:08 2014
Promote to fl:2-qa

group-desktop-platform.recipe: changed
Index: group-desktop-platform.recipe
====================================================================
contents(size sha1)
inode(mtime)
--- group-desktop-platform.recipe /foresight.rpath.org@fl:devel//2-qa/2.5.5+2014.06.02-0.1
+++ group-desktop-platform.recipe /foresight.rpath.org@fl:devel//2-qa/2.5.5+2014.07.10-0.1
@@ -383,7 +383,7 @@
elif Arch.x86_64:
kernelFlavor = 'kernel.smp'

- kVersion = r.foresightLinuxKernelLabel+'/3.10.41-1-1'
+ kVersion = r.foresightLinuxKernelLabel+'/3.10.48-1-1'
r.replace('kernel', kVersion, newFlavor = kernelFlavor)

# libs we want in all editions
@@ -5021,6 +5021,7 @@
'gummiboot',
'nss_db',
'bumblebee',
+ 'primus',
'VirtualGL',
('libjpeg-turbo', 'libjpeg-turbo'),
('turbojpeg', 'libjpeg-turbo'),
@@ -5094,6 +5095,7 @@
'python-sandman',
'nzbget',
'srm',
+ 'npapi-vlc',
]:
r.flAdd(p, groupName='group-supported-stuff-extra')




================================
gsettings-desktop-schemas:source=3.3.2-1 (previous: 0.1.1-1)
cvc rdiff gsettings-desktop-schemas -1 /foresight.rpath.org@fl:2-qa/3.3.2-1
================================
3.3.2-1 Tomas Forsman (tfor...@foresightlinux.se) Thu Sep 25 14:38:08 2014
Promote to fl:2-qa

gsettings-desktop-schemas-3.3.2.tar.xz: new
gsettings-desktop-schemas.recipe: changed
Index: gsettings-desktop-schemas.recipe
====================================================================
contents(sha1)
inode(mtime owner group)
--- gsettings-desktop-schemas.recipe /foresight.rpath.org@fl:2-qa/0.1.1-1
+++ gsettings-desktop-schemas.recipe /foresight.rpath.org@fl:2-qa/3.3.2-1
@@ -8,7 +8,7 @@
class GSettingsDesktopSchemas(GnomePackageRecipe):

name = 'gsettings-desktop-schemas'
- version = '0.1.1'
+ version = '3.3.2'

buildRequires = []



gsettings-desktop-schemas-0.1.1.tar.bz2: removed

================================
guayadeque:source=0.3.7-1 (previous: 0.3.5-1)
cvc rdiff guayadeque -1 /foresight.rpath.org@fl:2-qa/0.3.7-1
================================
0.3.7-1 Tomas Forsman (tfor...@foresightlinux.se) Thu Sep 25 14:38:08 2014
Promote to fl:2-qa

guayadeque-0.3.7.tar.bz2: new
guayadeque.recipe: changed
Index: guayadeque.recipe
====================================================================
contents(sha1)
inode(mtime owner group)
--- guayadeque.recipe /foresight.rpath.org@fl:2-qa/0.3.5-1
+++ guayadeque.recipe /foresight.rpath.org@fl:2-qa/0.3.7-1
@@ -9,7 +9,7 @@
name = 'guayadeque'
#revision = 'r1735'
#version = '0.3.2+' + revision
- version = '0.3.5'
+ version = '0.3.7'

buildRequires = ['cmake:runtime', 'curl:devel', 'dbus:devel', 'desktop-file-utils:runtime', 'flac:devel', 'gcc-c++:runtime', 'gettext:runtime', 'glib:devel', 'gstreamer:devel', 'libstdc++:devel', 'libxml2:devel', 'mp4v2:devel', 'openssl:devel', 'pkgconfig:devel', 'sqlite:devel', 'taglib:devel', 'wxWidgets:devel', 'wxWidgets:runtime', 'zlib:devel', 'gdk-pixbuf:devel', 'libgpod:devel', 'libpng:devel', 'atk:devel', 'cairo:devel', 'fontconfig:devel', 'freetype:devel', 'gtk:devel', 'libdbusmenu-glib:devel', 'pango:devel']



guayadeque-0.3.5.tar.bz2: removed

================================
httpd:source=2.2.27-1 (previous: 2.2.24-7)
cvc rdiff httpd -1 /foresight.rpath.org@fl:2-qa/2.2.27-1
================================
2.2.27-1 Tomas Forsman (tfor...@foresightlinux.se) Thu Sep 25 14:38:08 2014
Promote to fl:2-qa

httpd-2.2.27.tar.bz2: new
httpd.recipe: changed
Index: httpd.recipe
====================================================================
contents(sha1)
inode(mtime)
--- httpd.recipe /foresight.rpath.org@fl:2-qa/2.2.24-7
+++ httpd.recipe /foresight.rpath.org@fl:2-qa/2.2.27-1
@@ -7,7 +7,7 @@
#loadSuperClass('rpmpackage')
class Httpd(CPackageRecipe):
name = 'httpd'
- version = '2.2.24'
+ version = '2.2.27'

buildRequires = [ 'db:devel', 'expat:devel', 'findutils:runtime',
'perl:runtime', 'pkgconfig:devel', 'e2fsprogs:devel',


httpd-2.2.24.tar.bz2: removed

================================
kernel:source=3.10.48-1 (previous: 3.10.41-1)
cvc rdiff kernel -1 /foresight.rpath.org@fl:2-qa-kernel/3.10.48-1
================================
3.10.48-1 Tomas Forsman (tfor...@foresightlinux.se) Thu Sep 25 14:38:08 2014
Promote to fl:2-qa

kernel.recipe: changed
Index: kernel.recipe
====================================================================
contents(sha1)
inode(mtime)
--- kernel.recipe /foresight.rpath.org@fl:2-qa-kernel/3.10.41-1
+++ kernel.recipe /foresight.rpath.org@fl:2-qa-kernel/3.10.48-1
@@ -1,6 +1,6 @@
#
# Copyright (c) 2005-2009 rPath, Inc.
-# 2008-2013 The Foresight Linux Project
+# 2008-2014 The Foresight Linux Project
# This file is distributed under the terms of the MIT License.
# A copy is available at http://www.foresightlinux.org/licenses/mit-license/
#
@@ -8,7 +8,7 @@
loadSuperClass('kernelpackage')
class Kernel(KernelPackageRecipe):
name = 'kernel'
- version = '3.10.41'
+ version = '3.10.48'
#version = '3.13.3'
kS = version.split('.')
vMajor = kS[0]


linux-3.10.48.tar.xz: new
linux-3.10.41.tar.xz: removed

================================
lftp:source=4.5.2-1 (previous: 4.5.1-1)
cvc rdiff lftp -1 /foresight.rpath.org@fl:2-qa/4.5.2-1
================================
4.5.2-1 Tomas Forsman (tfor...@foresightlinux.se) Thu Sep 25 14:38:08 2014
Promote to fl:2-qa

lftp.recipe: changed
Index: lftp.recipe
====================================================================
contents(sha1)
inode(mtime)
--- lftp.recipe /foresight.rpath.org@fl:2-qa/4.5.1-1
+++ lftp.recipe /foresight.rpath.org@fl:2-qa/4.5.2-1
@@ -6,7 +6,7 @@

class Lftp(AutoPackageRecipe):
name = 'lftp'
- version = '4.5.1'
+ version = '4.5.2'

buildRequires = [
'dante:devel',


lftp-4.5.2.tar.xz: new
lftp-4.5.1.tar.xz: removed

================================
metacity:source=2.30.3-0.4 (previous: 2.30.3-0.2)
cvc rdiff metacity -1 /foresight.rpath.org@fl:devel//2-qa/2.30.3-0.4
================================
2.30.3-0.4 Tomas Forsman (tfor...@foresightlinux.se) Thu Sep 25 14:38:08 2014
Promote to fl:2-qa

metacity-2.30.3-1.fc14.src.rpm: new
13_better_support_for_button_layout.patch: new
--- /dev/null
+++ 13_better_support_for_button_layout.patch
@@ -0,0 +125 @@
+Description: Corrected support for buttons backgrounds with transparency
+ Added 'no background' if there is only one button and backgrounds no more
+ overlap if transparency used.
+ Corrected bug with left button clickable region when window is
+ maximized
+Origin: Ubuntu
+Bug: https://bugzilla.gnome.org/show_bug.cgi?id=608511
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/metacity/+bug/535088
+Author: Nicolas Desfontaine <no...@free.fr>
+
+Index: metacity-2.30.1/src/ui/theme.c
+===================================================================
+--- metacity-2.30.1.orig/src/ui/theme.c 2009-05-02 12:23:00.000000000 +1000
++++ metacity-2.30.1/src/ui/theme.c 2010-06-02 09:52:36.032513731 +1000
+@@ -704,8 +704,14 @@
+
+ for (i = 0; i < n_left; i++)
+ {
+- if (i == 0) /* prefer left background if only one button */
+- left_bg_rects[i] = &fgeom->left_left_background;
++ if (i == 0) /* For the first button (From left to right) */
++ {
++ if (n_left > 1) /* Set left_left_background
++ if we have more than one button */
++ left_bg_rects[i] = &fgeom->left_left_background;
++ else /* No background if we have only one single button */
++ left_bg_rects[i] = &fgeom->left_single_background;
++ }
+ else if (i == (n_left - 1))
+ left_bg_rects[i] = &fgeom->left_right_background;
+ else
+@@ -714,15 +720,20 @@
+
+ for (i = 0; i < n_right; i++)
+ {
+- /* prefer right background if only one button */
+- if (i == (n_right - 1))
+- right_bg_rects[i] = &fgeom->right_right_background;
++ if (i == (n_right - 1)) /* For the first button (From right to left) */
++ {
++ if (n_right > 1) /* Set right_right_background
++ if we have more than one button */
++ right_bg_rects[i] = &fgeom->right_right_background;
++ else /* No background if we have only one single button */
++ right_bg_rects[i] = &fgeom->right_single_background;
++ }
+ else if (i == 0)
+ right_bg_rects[i] = &fgeom->right_left_background;
+ else
+ right_bg_rects[i] = &fgeom->right_middle_backgrounds[i - 1];
+ }
+-
++
+ /* Be sure buttons fit */
+ while (n_left > 0 || n_right > 0)
+ {
+@@ -838,9 +849,9 @@
+ if (flags & META_FRAME_MAXIMIZED)
+ {
+ rect->clickable.x = rect->visible.x;
+- rect->clickable.y = 0;
+- rect->clickable.width = rect->visible.width;
+- rect->clickable.height = button_height + button_y;
++ rect->clickable.y = rect->visible.y;
++ rect->clickable.width = button_width;
++ rect->clickable.height = button_height;
+
+ if (i == n_right - 1)
+ rect->clickable.width += layout->right_titlebar_edge + layout->right_width + layout->button_border.right;
+@@ -876,23 +887,13 @@
+
+ if (flags & META_FRAME_MAXIMIZED)
+ {
+- if (i==0)
+- {
+- rect->clickable.x = 0;
+- rect->clickable.width = button_width + x;
+- }
+- else
+- {
+- rect->clickable.x = rect->visible.x;
+- rect->clickable.width = button_width;
+- }
+-
+- rect->clickable.y = 0;
+- rect->clickable.height = button_height + button_y;
+- }
+- else
+- g_memmove (&(rect->clickable), &(rect->visible), sizeof(rect->clickable));
+-
++ rect->clickable.x = rect->visible.x;
++ rect->clickable.y = rect->visible.y;
++ rect->clickable.width = button_width;
++ rect->clickable.height = button_height;
++ }
++ else
++ g_memmove (&(rect->clickable), &(rect->visible), sizeof(rect->clickable));
+
+ x = rect->visible.x + rect->visible.width + layout->button_border.right;
+ if (left_buttons_has_spacer[i])
+@@ -4525,7 +4526,7 @@
+ /* MIDDLE_BACKGROUND type may get drawn more than once */
+ if ((j == META_BUTTON_TYPE_RIGHT_MIDDLE_BACKGROUND ||
+ j == META_BUTTON_TYPE_LEFT_MIDDLE_BACKGROUND) &&
+- middle_bg_offset < MAX_MIDDLE_BACKGROUNDS)
++ (middle_bg_offset < (MAX_MIDDLE_BACKGROUNDS - 1)))
+ {
+ ++middle_bg_offset;
+ }
+Index: metacity-2.30.1/src/ui/theme.h
+===================================================================
+--- metacity-2.30.1.orig/src/ui/theme.h 2009-05-02 12:23:00.000000000 +1000
++++ metacity-2.30.1/src/ui/theme.h 2010-06-02 09:52:36.032513731 +1000
+@@ -200,9 +200,11 @@
+ MetaButtonSpace unstick_rect;
+
+ #define MAX_MIDDLE_BACKGROUNDS (MAX_BUTTONS_PER_CORNER - 2)
++ GdkRectangle left_single_background;
+ GdkRectangle left_left_background;
+ GdkRectangle left_middle_backgrounds[MAX_MIDDLE_BACKGROUNDS];
+ GdkRectangle left_right_background;
++ GdkRectangle right_single_background;
+ GdkRectangle right_left_background;
+ GdkRectangle right_middle_backgrounds[MAX_MIDDLE_BACKGROUNDS];
+ GdkRectangle right_right_background;

metacity-key-list-binding.patch: new
--- /dev/null
+++ metacity-key-list-binding.patch
@@ -0,0 +109 @@
+commit 8875e73765ac0279d5f58a95598db04c3a51ecfa
+Author: Owen W. Taylor <ota...@fishsoup.net>
+Date: Thu Feb 18 14:04:05 2010 -0500
+
+ Fix crash on startup with list bindings
+
+ When we are reading bindings initially, update_list_binding() needs
+ to be passed the correct "string list type" since we are calling
+ it with a list of strings instead of a list of GConfValue.
+
+ https://bugzilla.gnome.org/show_bug.cgi?id=609101
+
+diff --git a/src/core/prefs.c b/src/core/prefs.c
+index 702add8..55a56d1 100644
+--- a/src/core/prefs.c
++++ b/src/core/prefs.c
+@@ -126,11 +126,20 @@ static gboolean handle_preference_update_enum (const gchar *key, GConfValue *val
+
+ static gboolean update_key_binding (const char *name,
+ const char *value);
+-static gboolean find_and_update_list_binding (MetaKeyPref *bindings,
+- const char *name,
+- GSList *value);
+-static gboolean update_key_list_binding (const char *name,
+- GSList *value);
++
++typedef enum
++ {
++ META_LIST_OF_STRINGS,
++ META_LIST_OF_GCONFVALUE_STRINGS
++ } MetaStringListType;
++
++static gboolean find_and_update_list_binding (MetaKeyPref *bindings,
++ const char *name,
++ GSList *value,
++ MetaStringListType type_of_value);
++static gboolean update_key_list_binding (const char *name,
++ GSList *value,
++ MetaStringListType type_of_value);
+ static gboolean update_command (const char *name,
+ const char *value);
+ static gboolean update_workspace_name (const char *name,
+@@ -145,12 +154,6 @@ static char* gconf_key_for_workspace_name (int i);
+
+ static void queue_changed (MetaPreference pref);
+
+-typedef enum
+- {
+- META_LIST_OF_STRINGS,
+- META_LIST_OF_GCONFVALUE_STRINGS
+- } MetaStringListType;
+-
+ static gboolean update_list_binding (MetaKeyPref *binding,
+ GSList *value,
+ MetaStringListType type_of_value);
+@@ -1149,7 +1152,7 @@ change_notify (GConfClient *client,
+
+ list = value ? gconf_value_get_list (value) : NULL;
+
+- if (update_key_list_binding (key, list))
++ if (update_key_list_binding (key, list, META_LIST_OF_GCONFVALUE_STRINGS))
+ queue_changed (META_PREF_KEYBINDINGS);
+ }
+ else
+@@ -1919,7 +1922,7 @@ init_bindings (void)
+ {
+ list_val = gconf_client_get_list (default_client, key, GCONF_VALUE_STRING, NULL);
+
+- update_key_list_binding (key, list_val);
++ update_key_list_binding (key, list_val, META_LIST_OF_STRINGS);
+ g_slist_foreach (list_val, (GFunc)g_free, NULL);
+ g_slist_free (list_val);
+ }
+@@ -2304,9 +2307,10 @@ update_key_binding (const char *name,
+ }
+
+ static gboolean
+-find_and_update_list_binding (MetaKeyPref *bindings,
+- const char *name,
+- GSList *value)
++find_and_update_list_binding (MetaKeyPref *bindings,
++ const char *name,
++ GSList *value,
++ MetaStringListType type_of_value)
+ {
+ const char *key;
+ int i;
+@@ -2327,16 +2331,17 @@ find_and_update_list_binding (MetaKeyPref *bindings,
+ g_free (name_without_suffix);
+
+ if (bindings[i].name)
+- return update_list_binding (&bindings[i], value, META_LIST_OF_GCONFVALUE_STRINGS);
++ return update_list_binding (&bindings[i], value, type_of_value);
+ else
+ return FALSE;
+ }
+
+ static gboolean
+-update_key_list_binding (const char *name,
+- GSList *value)
++update_key_list_binding (const char *name,
++ GSList *value,
++ MetaStringListType type_of_value)
+ {
+- return find_and_update_list_binding (key_bindings, name, value);
++ return find_and_update_list_binding (key_bindings, name, value, type_of_value);
+ }
+
+ static gboolean

15_show_maximized_titlebars.patch: new
--- /dev/null
+++ 15_show_maximized_titlebars.patch
@@ -0,0 +255 @@
+From: Aurelien Gateau <aurelie...@canonical.com>
+Date: Thu, 16 Dec 2010 11:17:14 +0100
+Subject: [PATCH] Added an option to make it possible to hide maximized titlebars
+
+
+
+bzr-revid: aurelie...@canonical.com-20101216101714-tyht142o66k25uaj
+
+diff --git a/src/ui/frames.c b/src/ui/frames.c
+index f5ea044..622201f 100644
+--- a/src/ui/frames.c
++++ b/src/ui/frames.c
+@@ -93,7 +93,7 @@
+
+ static void meta_frames_font_changed (MetaFrames *frames);
+ static void meta_frames_button_layout_changed (MetaFrames *frames);
+-
++static void meta_frames_show_maximized_titlebars_changed (MetaFrames *frames);
+
+ static GdkRectangle* control_rect (MetaFrameControl control,
+ MetaFrameGeometry *fgeom);
+@@ -195,6 +195,9 @@
+ case META_PREF_BUTTON_LAYOUT:
+ meta_frames_button_layout_changed (META_FRAMES (data));
+ break;
++ case META_PREF_SHOW_MAXIMIZED_TITLEBARS:
++ meta_frames_show_maximized_titlebars_changed (META_FRAMES (data));
++ break;
+ default:
+ break;
+ }
+@@ -421,6 +424,16 @@
+ {
+ g_hash_table_foreach (frames->frames,
+ queue_draw_func, frames);
++}
++
++void meta_frames_show_maximized_titlebars_changed (MetaFrames *frames)
++{
++ MetaTheme *theme = meta_theme_get_current ();
++ if (theme)
++ {
++ meta_theme_set_show_maximized_titlebars (theme,
++ meta_prefs_get_show_maximized_titlebars ());
++ }
+ }
+
+ static void
+diff --git a/src/core/prefs.c b/src/core/prefs.c
+index 405f401..06da206 100644
+--- a/src/core/prefs.c
++++ b/src/core/prefs.c
+@@ -99,6 +99,7 @@
+ static gboolean resize_with_right_button = FALSE;
+ static gboolean force_fullscreen = TRUE;
+ static gboolean hide_decorator_tooltip = FALSE;
++static gboolean show_maximized_titlebars = TRUE;
+
+ static MetaVisualBellType visual_bell_type = META_VISUAL_BELL_FULLSCREEN_FLASH;
+ static MetaButtonLayout button_layout;
+@@ -419,6 +420,11 @@
+ &hide_decorator_tooltip,
+ FALSE,
+ },
++ { "/apps/metacity/general/show_maximized_titlebars",
++ META_PREF_SHOW_MAXIMIZED_TITLEBARS,
++ &show_maximized_titlebars,
++ FALSE,
++ },
+ { NULL, 0, NULL, FALSE },
+ };
+
+@@ -1273,6 +1279,12 @@
+ meta_prefs_get_hide_decorator_tooltip (void)
+ {
+ return hide_decorator_tooltip;
++}
++
++gboolean
++meta_prefs_get_show_maximized_titlebars (void)
++{
++ return show_maximized_titlebars;
+ }
+
+ const char*
+@@ -1770,6 +1782,9 @@
+
+ case META_PREF_HIDE_DECORATOR_TOOLTIP:
+ return "HIDE_DECORATOR_TOOLTIP";
++
++ case META_PREF_SHOW_MAXIMIZED_TITLEBARS:
++ return "META_PREF_SHOW_MAXIMIZED_TITLEBARS";
+ }
+
+ return "(unknown)";
+diff --git a/src/ui/ui.c b/src/ui/ui.c
+index 9fdf346..fadb90f 100644
+--- a/src/ui/ui.c
++++ b/src/ui/ui.c
+@@ -881,6 +881,12 @@
+ gboolean force_reload)
+ {
+ meta_theme_set_current (name, force_reload);
++ MetaTheme *theme = meta_theme_get_current ();
++ if (theme)
++ {
++ meta_theme_set_show_maximized_titlebars (theme,
++ meta_prefs_get_show_maximized_titlebars ());
++ }
+ meta_invalidate_default_icons ();
+ }
+
+diff --git a/src/include/prefs.h b/src/include/prefs.h
+index 30d63b8..73296b9 100644
+--- a/src/include/prefs.h
++++ b/src/include/prefs.h
+@@ -61,7 +61,8 @@
+ META_PREF_COMPOSITING_MANAGER,
+ META_PREF_RESIZE_WITH_RIGHT_BUTTON,
+ META_PREF_FORCE_FULLSCREEN,
+- META_PREF_HIDE_DECORATOR_TOOLTIP
++ META_PREF_HIDE_DECORATOR_TOOLTIP,
++ META_PREF_SHOW_MAXIMIZED_TITLEBARS
+ } MetaPreference;
+
+ typedef void (* MetaPrefsChangedFunc) (MetaPreference pref,
+@@ -82,6 +83,7 @@
+ MetaFocusNewWindows meta_prefs_get_focus_new_windows (void);
+ gboolean meta_prefs_get_raise_on_click (void);
+ gboolean meta_prefs_get_hide_decorator_tooltip (void);
++gboolean meta_prefs_get_show_maximized_titlebars (void);
+ const char* meta_prefs_get_theme (void);
+ /* returns NULL if GTK default should be used */
+ const PangoFontDescription* meta_prefs_get_titlebar_font (void);
+diff --git a/src/ui/theme.c b/src/ui/theme.c
+index b6a5f62..32d162d 100644
+--- a/src/ui/theme.c
++++ b/src/ui/theme.c
+@@ -406,7 +406,8 @@
+ int *top_height,
+ int *bottom_height,
+ int *left_width,
+- int *right_width)
++ int *right_width,
++ MetaTheme *theme)
+ {
+ int buttons_height, title_height;
+
+@@ -441,6 +442,9 @@
+ else
+ *bottom_height = layout->bottom_height;
+ }
++
++ if ((flags & META_FRAME_MAXIMIZED) && !theme->show_maximized_titlebars)
++ *top_height = 0;
+
+ if (flags & META_FRAME_FULLSCREEN)
+ {
+@@ -614,7 +618,8 @@
+ &fgeom->top_height,
+ &fgeom->bottom_height,
+ &fgeom->left_width,
+- &fgeom->right_width);
++ &fgeom->right_width,
++ theme);
+
+ width = client_width + fgeom->left_width + fgeom->right_width;
+
+@@ -4847,6 +4852,9 @@
+ theme->quark_icon_height = g_quark_from_static_string ("icon_height");
+ theme->quark_title_width = g_quark_from_static_string ("title_width");
+ theme->quark_title_height = g_quark_from_static_string ("title_height");
++
++ theme->show_maximized_titlebars = TRUE;
++
+ return theme;
+ }
+
+@@ -5271,7 +5279,8 @@
+ text_height,
+ flags,
+ top_height, bottom_height,
+- left_width, right_width);
++ left_width, right_width,
++ theme);
+ }
+
+ void
+@@ -6635,3 +6644,9 @@
+ return 1;
+ }
+ }
++
++void
++meta_theme_set_show_maximized_titlebars (MetaTheme *theme, gboolean show)
++{
++ theme->show_maximized_titlebars = show;
++}
+diff --git a/src/metacity.schemas.in.in b/src/metacity.schemas.in.in
+index 97cd280..e7eb082 100644
+--- a/src/metacity.schemas.in.in
++++ b/src/metacity.schemas.in.in
+@@ -36,6 +36,20 @@
+ with the middle button while holding down the key given in
+ "mouse_button_modifier"; set it to false to make it work the
+ opposite way around.
++ </long>
++ </locale>
++ </schema>
++
++ <schema>
++ <key>/schemas/apps/metacity/general/show_maximized_titlebars</key>
++ <applyto>/apps/metacity/general/show_maximized_titlebars</applyto>
++ <owner>metacity</owner>
++ <type>bool</type>
++ <default>true</default>
++ <locale name="C">
++ <short>Whether to show title bars for maximized windows</short>
++ <long>
++ Set this to false to hide title bars for maximized windows.
+ </long>
+ </locale>
+ </schema>
+diff --git a/src/ui/theme.h b/src/ui/theme.h
+index 39d9e21..8d90e64 100644
+--- a/src/ui/theme.h
++++ b/src/ui/theme.h
+@@ -821,6 +821,8 @@
+ GQuark quark_icon_height;
+ GQuark quark_title_width;
+ GQuark quark_title_height;
++
++ gboolean show_maximized_titlebars;
+ };
+
+ struct _MetaPositionExprEnv
+@@ -854,7 +856,8 @@
+ int *top_height,
+ int *bottom_height,
+ int *left_width,
+- int *right_width);
++ int *right_width,
++ MetaTheme *theme);
+ void meta_frame_layout_calc_geometry (const MetaFrameLayout *layout,
+ int text_height,
+ MetaFrameFlags flags,
+@@ -1175,6 +1178,8 @@
+
+ guint meta_theme_earliest_version_with_button (MetaButtonType type);
+
++void meta_theme_set_show_maximized_titlebars (MetaTheme *theme, gboolean);
++
+
+ #define META_THEME_ALLOWS(theme, feature) (theme->format_version >= feature)
+

metacity-2.21.13-dont-move-windows.patch: new
--- /dev/null
+++ metacity-2.21.13-dont-move-windows.patch
@@ -0,0 +30 @@
+Index: src/core/window.c
+===================================================================
+--- src/core/window.c (revision 3554)
++++ src/core/window.c (working copy)
+@@ -2882,8 +2882,23 @@
+ /* Get window on current or given workspace */
+ if (workspace == NULL)
+ workspace = window->screen->active_workspace;
+- if (!meta_window_located_on_workspace (window, workspace))
+- meta_window_change_workspace (window, workspace);
++
++ /* For non-transient windows, we just set up a pulsing indicator,
++ rather than move windows or workspaces.
++ See http://bugzilla.gnome.org/show_bug.cgi?id=482354 */
++ if (window->xtransient_for == None &&
++ !meta_window_located_on_workspace (window, workspace))
++ {
++ meta_window_set_demands_attention (window);
++ /* We've marked it as demanding, don't need to do anything else. */
++ return;
++ }
++ else if (window->xtransient_for != None)
++ {
++ /* Move transients to current workspace - preference dialogs should appear over
++ the source window. */
++ meta_window_change_workspace (window, workspace);
++ }
+
+ if (window->shaded)
+ meta_window_unshade (window, timestamp);

metacity-2.28-empty-keybindings.patch: new
--- /dev/null
+++ metacity-2.28-empty-keybindings.patch
@@ -0,0 +40 @@
+From 857ac4b0682dec32ba55e4080fa7ec560a2481a0 Mon Sep 17 00:00:00 2001
+From: "Owen W. Taylor" <ota...@fishsoup.net>
+Date: Fri, 20 Nov 2009 10:19:03 -0500
+Subject: [PATCH] Accept an empty string as well as "disabled" for
+ keybindings
+
+Treat the empty string the same as "disabled" for GConf keybinding
+keys. gnome-keybinding-properties was changed to write disabled
+keys as the empty string a year or so ago.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=559816
+---
+ src/ui/ui.c | 4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/ui/ui.c b/src/ui/ui.c
+index 78aa353..ef9fcfc 100644
+--- a/src/ui/ui.c
++++ b/src/ui/ui.c
+@@ -954,7 +954,7 @@ meta_ui_parse_accelerator (const char *accel,
+ *keycode = 0;
+ *mask = 0;
+
+- if (strcmp (accel, "disabled") == 0)
++ if (!accel[0] || strcmp (accel, "disabled") == 0)
+ return TRUE;
+
+ meta_ui_accelerator_parse (accel, &gdk_sym, &gdk_code, &gdk_mask);
+@@ -1041,7 +1041,7 @@ meta_ui_parse_modifier (const char *accel,
+
+ *mask = 0;
+
+- if (accel == NULL || strcmp (accel, "disabled") == 0)
++ if (accel == NULL || !accel[0] || strcmp (accel, "disabled") == 0)
+ return TRUE;
+
+ meta_ui_accelerator_parse (accel, &gdk_sym, &gdk_code, &gdk_mask);
+--
+1.7.9
+

metacity-support-above-tab.patch: new
--- /dev/null
+++ metacity-support-above-tab.patch
@@ -0,0 +602 @@
+commit c262e3d65a37abedc507705cddfec72c901c321f
+Author: Derek Poon <gnom...@acrotect.com>
+Date: Sun May 2 11:27:25 2010 -0400
+
+ Update keybindings when XKB keyboard layout changes
+
+ * Select for XKB keyboard notification events explicitly; since GTK+
+ has selected for XKB events, delivery of old-school MappingNotify
+ events is disabled.
+
+ * Fix a bug where once a keycode was loaded for a key binding,
+ it would never be reassigned; we want to laod new keycodes for
+ all bindings that have a key symbol rather than a fixed
+ keycode.
+
+ [ With fixes from Owen W. Taylor <ota...@fishsoup.net> ]
+
+ https://bugzilla.gnome.org/show_bug.cgi?id=565540
+
+diff --git a/src/core/display.c b/src/core/display.c
+index 4c7b4c0..b59571d 100644
+--- a/src/core/display.c
++++ b/src/core/display.c
+@@ -2391,6 +2391,10 @@ event_callback (XEvent *event,
+ meta_bell_notify (display, xkb_ev);
+ }
+ break;
++ case XkbNewKeyboardNotify:
++ case XkbMapNotify:
++ meta_display_process_mapping_event (display, event);
++ break;
+ }
+ }
+ #endif
+diff --git a/src/core/keybindings.c b/src/core/keybindings.c
+index 63596bb..f6c276a 100644
+--- a/src/core/keybindings.c
++++ b/src/core/keybindings.c
+@@ -262,9 +262,11 @@ reload_keycodes (MetaDisplay *display)
+ i = 0;
+ while (i < display->n_key_bindings)
+ {
+- if (display->key_bindings[i].keycode == 0)
++ if (display->key_bindings[i].keysym != 0)
++ {
+ display->key_bindings[i].keycode = XKeysymToKeycode (
+ display->xdisplay, display->key_bindings[i].keysym);
++ }
+
+ ++i;
+ }
+@@ -504,6 +506,22 @@ void
+ meta_display_process_mapping_event (MetaDisplay *display,
+ XEvent *event)
+ {
++#ifdef HAVE_XKB
++ if (event->type == display->xkb_base_event_type)
++ {
++ meta_topic (META_DEBUG_KEYBINDINGS,
++ "XKB mapping changed, will redo keybindings\n");
++
++ reload_keymap (display);
++ reload_modmap (display);
++
++ reload_keycodes (display);
++ reload_modifiers (display);
++
++ regrab_key_bindings (display);
++ }
++ else
++#endif
+ if (event->xmapping.request == MappingModifier)
+ {
+ meta_topic (META_DEBUG_KEYBINDINGS,
+@@ -589,6 +607,14 @@ meta_display_init_keys (MetaDisplay *display)
+ /* Keys are actually grabbed in meta_screen_grab_keys() */
+
+ meta_prefs_add_listener (bindings_changed_callback, display);
++
++#ifdef HAVE_XKB
++ /* meta_display_init_keys() should have already called XkbQueryExtension() */
++ if (display->xkb_base_event_type != -1)
++ XkbSelectEvents (display->xdisplay, XkbUseCoreKbd,
++ XkbNewKeyboardNotifyMask | XkbMapNotifyMask,
++ XkbNewKeyboardNotifyMask | XkbMapNotifyMask);
++#endif
+ }
+
+ void
+
+commit ba2e5f7f541446931299814bafa642d09047f386
+Author: Owen W. Taylor <ota...@fishsoup.net>
+Date: Sun May 2 11:35:33 2010 -0400
+
+ Unify keymap-reloading code branches
+
+ Simplify the keymap loading logic by unifying the different
+ branches; in the reorganization this patch fixes a bug where when
+ we got a MappingKeyboard event we wouldn't update virtual modifiers
+ correctly.
+
+ Based on a patch by Thomas Thurman <tthu...@gnome.org>
+
+ https://bugzilla.gnome.org/show_bug.cgi?id=565540
+
+diff --git a/src/core/keybindings.c b/src/core/keybindings.c
+index f6c276a..1659c02 100644
+--- a/src/core/keybindings.c
++++ b/src/core/keybindings.c
+@@ -506,19 +506,17 @@ void
+ meta_display_process_mapping_event (MetaDisplay *display,
+ XEvent *event)
+ {
++ gboolean keymap_changed = FALSE;
++ gboolean modmap_changed = FALSE;
++
+ #ifdef HAVE_XKB
+ if (event->type == display->xkb_base_event_type)
+ {
+ meta_topic (META_DEBUG_KEYBINDINGS,
+ "XKB mapping changed, will redo keybindings\n");
+
+- reload_keymap (display);
+- reload_modmap (display);
+-
+- reload_keycodes (display);
+- reload_modifiers (display);
+-
+- regrab_key_bindings (display);
++ keymap_changed = TRUE;
++ modmap_changed = TRUE;
+ }
+ else
+ #endif
+@@ -527,21 +525,32 @@ meta_display_process_mapping_event (MetaDisplay *display,
+ meta_topic (META_DEBUG_KEYBINDINGS,
+ "Received MappingModifier event, will reload modmap and redo keybindings\n");
+
+- reload_modmap (display);
+-
+- reload_modifiers (display);
+-
+- regrab_key_bindings (display);
++ modmap_changed = TRUE;
+ }
+ else if (event->xmapping.request == MappingKeyboard)
+ {
+ meta_topic (META_DEBUG_KEYBINDINGS,
+ "Received MappingKeyboard event, will reload keycodes and redo keybindings\n");
+
+- reload_keymap (display);
++ keymap_changed = TRUE;
++ }
++
++ /* Now to do the work itself */
++
++ if (keymap_changed || modmap_changed)
++ {
++ if (keymap_changed)
++ reload_keymap (display);
++
++ /* Deciphering the modmap depends on the loaded keysyms to find out
++ * what modifiers is Super and so forth, so we need to reload it
++ * even when only the keymap changes */
+ reload_modmap (display);
+-
+- reload_keycodes (display);
++
++ if (keymap_changed)
++ reload_keycodes (display);
++
++ reload_modifiers (display);
+
+ regrab_key_bindings (display);
+ }
+
+commit 859d214a04c29ec839d5552f3e13dff937260083
+Author: Owen W. Taylor <ota...@fishsoup.net>
+Date: Mon Nov 22 18:21:47 2010 -0500
+
+ Add an "Above_Tab" pseudo-keysym
+
+ We want switching between the windows of an application to be an easily
+ accessible operation. The convenient and memorable keybinding is the
+ key above the tab key - but the keysym for that key isn't consistent
+ across different keyboard layouts.
+
+ Add code that figures out the key from the XKB geometry and a magic
+ keysym name "Above_Tab" that refers to this key and switch
+ the default binding for cycle_group to <Alt>Above_Tab.
+
+ https://bugzilla.gnome.org/show_bug.cgi?id=635569
+
+diff --git a/src/Makefile.am b/src/Makefile.am
+index bd3420f..ef9a3a0 100644
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -17,6 +17,7 @@ metacity_SOURCES= \
+ compositor/compositor-xrender.c \
+ compositor/compositor-xrender.h \
+ include/compositor.h \
++ core/above-tab-keycode.c \
+ core/constraints.c \
+ core/constraints.h \
+ core/core.c \
+diff --git a/src/core/above-tab-keycode.c b/src/core/above-tab-keycode.c
+new file mode 100644
+index 0000000..56966ab
+--- /dev/null
++++ b/src/core/above-tab-keycode.c
+@@ -0,0 +1,241 @@
++/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
++
++/* Find the keycode for the key above the tab key */
++/*
++ * Copyright 2010 Red Hat, Inc.
++ *
++ * 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, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
++ * 02111-1307, USA.
++ */
++
++/* The standard cycle-windows keybinding should be the key above the
++ * tab key. This will have a different keysym on different keyboards -
++ * it's the ` (grave) key on US keyboards but something else on many
++ * other national layouts. So we need to figure out the keycode for
++ * this key without reference to key symbol.
++ *
++ * The "correct" way to do this is to get the XKB geometry from the
++ * X server, find the Tab key, find the key above the Tab key in the
++ * same section and use the keycode for that key. This is what I
++ * implemented here, but unfortunately, fetching the geometry is rather
++ * slow (It could take 20ms or more.)
++ *
++ * If you looking for a way to optimize Mutter startup performance:
++ * On all Linux systems using evdev the key above TAB will have
++ * keycode 49. (KEY_GRAVE=41 + the 8 code point offset between
++ * evdev keysyms and X keysyms.) So a configure option
++ * --with-above-tab-keycode=49 could be added that bypassed this
++ * code. It wouldn't work right for displaying Mutter remotely
++ * to a non-Linux X server, but that is pretty rare.
++ */
++
++#include <config.h>
++
++#include <string.h>
++
++#include "display-private.h"
++
++#include <X11/keysym.h>
++
++#ifdef HAVE_XKB
++#include <X11/XKBlib.h>
++#include <X11/extensions/XKBgeom.h>
++
++static guint
++compute_above_tab_keycode (Display *xdisplay)
++{
++ XkbDescPtr keyboard;
++ XkbGeometryPtr geometry;
++ int i, j, k;
++ int tab_keycode;
++ char *tab_name;
++ XkbSectionPtr tab_section;
++ XkbBoundsRec tab_bounds;
++ XkbKeyPtr best_key = NULL;
++ guint best_keycode = (guint)-1;
++ int best_x_dist = G_MAXINT;
++ int best_y_dist = G_MAXINT;
++
++ /* We need only the Names and the Geometry, but asking for these results
++ * in the Keyboard information retrieval failing for unknown reasons.
++ * (Testing with xorg-1.9.1.) So we ask for a part that we don't need
++ * as well.
++ */
++ keyboard = XkbGetKeyboard (xdisplay,
++ XkbGBN_ClientSymbolsMask | XkbGBN_KeyNamesMask | XkbGBN_GeometryMask,
++ XkbUseCoreKbd);
++
++ geometry = keyboard->geom;
++
++ /* There could potentially be multiple keys with the Tab keysym on the keyboard;
++ * but XKeysymToKeycode() returns us the one that the alt-Tab binding will
++ * use which is good enough
++ */
++ tab_keycode = XKeysymToKeycode (xdisplay, XK_Tab);
++ if (tab_keycode == 0 || tab_keycode < keyboard->min_key_code || tab_keycode > keyboard->max_key_code)
++ goto out;
++
++ /* The keyboard geometry is stored by key "name" rather than keycode.
++ * (Key names are 4-character strings like like TAB or AE01.) We use the
++ * 'names' part of the keyboard description to map keycode to key name.
++ *
++ * XKB has a "key aliases" feature where a single keyboard key can have
++ * multiple names (with separate sets of aliases in the 'names' part and
++ * in the 'geometry' part), but I don't really understand it or how it is used,
++ * so I'm ignoring it here.
++ */
++
++ tab_name = keyboard->names->keys[tab_keycode].name; /* Not NULL terminated! */
++
++ /* First, iterate through the keyboard geometry to find the tab key; the keyboard
++ * geometry has a three-level heirarchy of section > row > key
++ */
++ for (i = 0; i < geometry->num_sections; i++)
++ {
++ XkbSectionPtr section = &geometry->sections[i];
++ for (j = 0; j < section->num_rows; j++)
++ {
++ int x = 0;
++ int y = 0;
++
++ XkbRowPtr row = &section->rows[j];
++ for (k = 0; k < row->num_keys; k++)
++ {
++ XkbKeyPtr key = &row->keys[k];
++ XkbShapePtr shape = XkbKeyShape (geometry, key);
++
++ if (row->vertical)
++ y += key->gap;
++ else
++ x += key->gap;
++
++ if (strncmp (key->name.name, tab_name, XkbKeyNameLength) == 0)
++ {
++ tab_section = section;
++ tab_bounds = shape->bounds;
++ tab_bounds.x1 += row->left + x;
++ tab_bounds.x2 += row->left + x;
++ tab_bounds.y1 += row->top + y;
++ tab_bounds.y2 += row->top + y;
++
++ goto found_tab;
++ }
++
++ if (row->vertical)
++ y += (shape->bounds.y2 - shape->bounds.y1);
++ else
++ x += (shape->bounds.x2 - shape->bounds.x1);
++ }
++ }
++ }
++
++ /* No tab key found */
++ goto out;
++
++ found_tab:
++
++ /* Now find the key that:
++ * - Is in the same section as the Tab key
++ * - Has a horizontal center in the Tab key's horizonal bounds
++ * - Is above the Tab key at a distance closer than any other key
++ * - In case of ties, has its horizontal center as close as possible
++ * to the Tab key's horizontal center
++ */
++ for (j = 0; j < tab_section->num_rows; j++)
++ {
++ int x = 0;
++ int y = 0;
++
++ XkbRowPtr row = &tab_section->rows[j];
++ for (k = 0; k < row->num_keys; k++)
++ {
++ XkbKeyPtr key = &row->keys[k];
++ XkbShapePtr shape = XkbKeyShape(geometry, key);
++ XkbBoundsRec bounds = shape->bounds;
++ int x_center;
++ int x_dist, y_dist;
++
++ if (row->vertical)
++ y += key->gap;
++ else
++ x += key->gap;
++
++ bounds.x1 += row->left + x;
++ bounds.x2 += row->left + x;
++ bounds.y1 += row->top + y;
++ bounds.y2 += row->top + y;
++
++ y_dist = tab_bounds.y1 - bounds.y2;
++ if (y_dist < 0)
++ continue;
++
++ x_center = (bounds.x1 + bounds.x2) / 2;
++ if (x_center < tab_bounds.x1 || x_center > tab_bounds.x2)
++ continue;
++
++ x_dist = ABS (x_center - (tab_bounds.x1 + tab_bounds.x2) / 2);
++
++ if (y_dist < best_y_dist ||
++ (y_dist == best_y_dist && x_dist < best_x_dist))
++ {
++ best_key = key;
++ best_x_dist = x_dist;
++ best_y_dist = y_dist;
++ }
++
++ if (row->vertical)
++ y += (shape->bounds.y2 - shape->bounds.y1);
++ else
++ x += (shape->bounds.x2 - shape->bounds.x1);
++ }
++ }
++
++ if (best_key == NULL)
++ goto out;
++
++ /* Now we need to resolve the name of the best key back to a keycode */
++ for (i = keyboard->min_key_code; i < keyboard->max_key_code; i++)
++ {
++ if (strncmp (best_key->name.name, keyboard->names->keys[i].name, XkbKeyNameLength) == 0)
++ {
++ best_keycode = i;
++ break;
++ }
++ }
++
++ out:
++ XkbFreeKeyboard (keyboard, 0, True);
++
++ return best_keycode;
++}
++#else /* !HAVE_XKB */
++static guint
++compute_above_tab_keycode (Display *xdisplay)
++{
++ return XKeysymToKeycode (xdisplay, XK_grave);
++}
++#endif /* HAVE_XKB */
++
++guint
++meta_display_get_above_tab_keycode (MetaDisplay *display)
++{
++ if (display->above_tab_keycode == 0) /* not yet computed */
++ display->above_tab_keycode = compute_above_tab_keycode (display->xdisplay);
++
++ if (display->above_tab_keycode == (guint)-1) /* failed to compute */
++ return 0;
++ else
++ return display->above_tab_keycode;
++}
+diff --git a/src/core/display-private.h b/src/core/display-private.h
+index 19287f3..cc304c3 100644
+--- a/src/core/display-private.h
++++ b/src/core/display-private.h
+@@ -207,6 +207,7 @@ struct _MetaDisplay
+ KeySym *keymap;
+ int keysyms_per_keycode;
+ XModifierKeymap *modmap;
++ unsigned int above_tab_keycode;
+ unsigned int ignored_modifier_mask;
+ unsigned int num_lock_mask;
+ unsigned int scroll_lock_mask;
+@@ -497,4 +498,7 @@ void meta_display_queue_autoraise_callback (MetaDisplay *display,
+ MetaWindow *window);
+ void meta_display_remove_autoraise_callback (MetaDisplay *display);
+
++/* In above-tab-keycode.c */
++guint meta_display_get_above_tab_keycode (MetaDisplay *display);
++
+ #endif
+diff --git a/src/core/keybindings.c b/src/core/keybindings.c
+index 1659c02..8ea6b41 100644
+--- a/src/core/keybindings.c
++++ b/src/core/keybindings.c
+@@ -138,6 +138,10 @@ reload_keymap (MetaDisplay *display)
+ if (display->keymap)
+ meta_XFree (display->keymap);
+
++ /* This is expensive to compute, so we'll lazily load if and when we first
++ * need it */
++ display->above_tab_keycode = 0;
++
+ display->keymap = XGetKeyboardMapping (display->xdisplay,
+ display->min_keycode,
+ display->max_keycode -
+@@ -249,6 +253,16 @@ reload_modmap (MetaDisplay *display)
+ display->meta_mask);
+ }
+
++static guint
++keysym_to_keycode (MetaDisplay *display,
++ guint keysym)
++{
++ if (keysym == META_KEY_ABOVE_TAB)
++ return meta_display_get_above_tab_keycode (display);
++ else
++ return XKeysymToKeycode (display->xdisplay, keysym);
++}
++
+ static void
+ reload_keycodes (MetaDisplay *display)
+ {
+@@ -264,8 +278,8 @@ reload_keycodes (MetaDisplay *display)
+ {
+ if (display->key_bindings[i].keysym != 0)
+ {
+- display->key_bindings[i].keycode = XKeysymToKeycode (
+- display->xdisplay, display->key_bindings[i].keysym);
++ display->key_bindings[i].keycode =
++ keysym_to_keycode (display, display->key_bindings[i].keysym);
+ }
+
+ ++i;
+diff --git a/src/include/all-keybindings.h b/src/include/all-keybindings.h
+index 378a7ac..0759ec3 100644
+--- a/src/include/all-keybindings.h
++++ b/src/include/all-keybindings.h
+@@ -167,7 +167,7 @@ keybind (switch_panels_backward, handle_switch, META_TAB_LIST_DOCKS,
+ "using a popup window"))
+
+ keybind (cycle_group, handle_cycle, META_TAB_LIST_GROUP,
+- BINDING_REVERSES, "<Alt>F6",
++ BINDING_REVERSES, "<Alt>Above_Tab",
+ _("Move between windows of an application immediately"))
+ keybind (cycle_group_backward, handle_cycle, META_TAB_LIST_GROUP,
+ REVERSES_AND_REVERSED, NULL,
+diff --git a/src/include/ui.h b/src/include/ui.h
+index 6d98de8..386581e 100644
+--- a/src/include/ui.h
++++ b/src/include/ui.h
+@@ -185,6 +185,12 @@ void meta_ui_set_current_theme (const char *name,
+ gboolean force_reload);
+ gboolean meta_ui_have_a_theme (void);
+
++/* Not a real key symbol but means "key above the tab key"; this is
++ * used as the default keybinding for cycle_group.
++ * 0x2xxxxxxx is a range not used by GDK or X. the remaining digits are
++ * randomly chosen */
++#define META_KEY_ABOVE_TAB 0x2f7259c9
++
+ gboolean meta_ui_parse_accelerator (const char *accel,
+ unsigned int *keysym,
+ unsigned int *keycode,
+diff --git a/src/ui/ui.c b/src/ui/ui.c
+index 960e702..5ef4f52 100644
+--- a/src/ui/ui.c
++++ b/src/ui/ui.c
+@@ -896,14 +896,50 @@ meta_ui_accelerator_parse (const char *accel,
+ guint *keycode,
+ GdkModifierType *keymask)
+ {
++ const char *above_tab;
++
+ if (accel[0] == '0' && accel[1] == 'x')
+ {
+ *keysym = 0;
+ *keycode = (guint) strtoul (accel, NULL, 16);
+ *keymask = 0;
++
++ return;
+ }
+- else
+- gtk_accelerator_parse (accel, keysym, keymask);
++
++ /* The key name 'Above_Tab' is special - it's not an actual keysym name,
++ * but rather refers to the key above the tab key. In order to use
++ * the GDK parsing for modifiers in combination with it, we substitute
++ * it with 'Tab' temporarily before calling gtk_accelerator_parse().
++ */
++#define is_word_character(c) (g_ascii_isalnum(c) || ((c) == '_'))
++#define ABOVE_TAB "Above_Tab"
++#define ABOVE_TAB_LEN 9
++
++ above_tab = strstr (accel, ABOVE_TAB);
++ if (above_tab &&
++ (above_tab == accel || !is_word_character (above_tab[-1])) &&
++ !is_word_character (above_tab[ABOVE_TAB_LEN]))
++ {
++ char *before = g_strndup (accel, above_tab - accel);
++ char *after = g_strdup (above_tab + ABOVE_TAB_LEN);
++ char *replaced = g_strconcat (before, "Tab", after, NULL);
++
++ gtk_accelerator_parse (replaced, NULL, keymask);
++
++ g_free (before);
++ g_free (after);
++ g_free (replaced);
++
++ *keysym = META_KEY_ABOVE_TAB;
++ return;
++ }
++
++#undef is_word_character
++#undef ABOVE_TAB
++#undef ABOVE_TAB_LEN
++
++ gtk_accelerator_parse (accel, keysym, keymask);
+ }
+
+ gboolean

metacity-uninitialized-variables.patch: new
--- /dev/null
+++ metacity-uninitialized-variables.patch
@@ -0,0 +36 @@
+From c20b4ec662ab19bb380e045d73e0a9bb781b4286 Mon Sep 17 00:00:00 2001
+From: Vincent Untz <vu...@gnome.org>
+Date: Mon, 24 May 2010 15:55:55 +0200
+Subject: [PATCH] Fix uninitialized variables
+
+---
+ src/core/window.c | 6 ++++++
+ 1 files changed, 6 insertions(+), 0 deletions(-)
+
+diff --git a/src/core/window.c b/src/core/window.c
+index 9af5283..695ef71 100644
+--- a/src/core/window.c
++++ b/src/core/window.c
+@@ -4001,6 +4001,9 @@ meta_window_begin_wireframe (MetaWindow *window)
+ MetaRectangle new_xor;
+ int display_width, display_height;
+
++ display_width = 0;
++ display_height = 0;
++
+ meta_window_get_client_root_coords (window,
+ &window->display->grab_wireframe_rect);
+
+@@ -4027,6 +4030,9 @@ meta_window_update_wireframe (MetaWindow *window,
+ MetaRectangle new_xor;
+ int display_width, display_height;
+
++ display_width = 0;
++ display_height = 0;
++
+ window->display->grab_wireframe_rect.x = x;
+ window->display->grab_wireframe_rect.y = y;
+ window->display->grab_wireframe_rect.width = width;
+--
+1.7.0.3
+

11_hide_tooltip_on_decorator.patch: new
--- /dev/null
+++ 11_hide_tooltip_on_decorator.patch
@@ -0,0 +89 @@
+Description: add a gconf key (/desktop/gnome/interface/hide_decorator_tooltip)
+ to disable tooltip in decorator bar. If key not present, show the tooltip.
+Origin: Ubuntu
+Bug: https://bugzilla.gnome.org/show_bug.cgi?id=609555
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/metacity/+bug/519856
+
+Index: metacity-2.30.2/src/core/prefs.c
+===================================================================
+--- metacity-2.30.2.orig/src/core/prefs.c 2010-09-20 14:23:03.000000000 +0200
++++ metacity-2.30.2/src/core/prefs.c 2010-09-20 14:23:08.180736001 +0200
+@@ -98,6 +98,7 @@
+ static gboolean compositing_manager = FALSE;
+ static gboolean resize_with_right_button = FALSE;
+ static gboolean force_fullscreen = TRUE;
++static gboolean hide_decorator_tooltip = FALSE;
+
+ static MetaVisualBellType visual_bell_type = META_VISUAL_BELL_FULLSCREEN_FLASH;
+ static MetaButtonLayout button_layout;
+@@ -413,6 +414,11 @@
+ &resize_with_right_button,
+ FALSE,
+ },
++ { "/desktop/gnome/interface/hide_decorator_tooltip",
++ META_PREF_HIDE_DECORATOR_TOOLTIP,
++ &hide_decorator_tooltip,
++ FALSE,
++ },
+ { NULL, 0, NULL, FALSE },
+ };
+
+@@ -1263,6 +1269,12 @@
+ return raise_on_click;
+ }
+
++gboolean
++meta_prefs_get_hide_decorator_tooltip (void)
++{
++ return hide_decorator_tooltip;
++}
++
+ const char*
+ meta_prefs_get_theme (void)
+ {
+@@ -1755,6 +1767,9 @@
+
+ case META_PREF_FORCE_FULLSCREEN:
+ return "FORCE_FULLSCREEN";
++
++ case META_PREF_HIDE_DECORATOR_TOOLTIP:
++ return "HIDE_DECORATOR_TOOLTIP";
+ }
+
+ return "(unknown)";
+Index: metacity-2.30.2/src/include/prefs.h
+===================================================================
+--- metacity-2.30.2.orig/src/include/prefs.h 2010-09-04 18:09:53.000000000 +0200
++++ metacity-2.30.2/src/include/prefs.h 2010-09-20 14:23:08.180736001 +0200
+@@ -60,7 +60,8 @@
+ META_PREF_CURSOR_SIZE,
+ META_PREF_COMPOSITING_MANAGER,
+ META_PREF_RESIZE_WITH_RIGHT_BUTTON,
+- META_PREF_FORCE_FULLSCREEN
++ META_PREF_FORCE_FULLSCREEN,
++ META_PREF_HIDE_DECORATOR_TOOLTIP
+ } MetaPreference;
+
+ typedef void (* MetaPrefsChangedFunc) (MetaPreference pref,
+@@ -80,6 +81,7 @@
+ MetaFocusMode meta_prefs_get_focus_mode (void);
+ MetaFocusNewWindows meta_prefs_get_focus_new_windows (void);
+ gboolean meta_prefs_get_raise_on_click (void);
++gboolean meta_prefs_get_hide_decorator_tooltip (void);
+ const char* meta_prefs_get_theme (void);
+ /* returns NULL if GTK default should be used */
+ const PangoFontDescription* meta_prefs_get_titlebar_font (void);
+Index: metacity-2.30.2/src/ui/frames.c
+===================================================================
+--- metacity-2.30.2.orig/src/ui/frames.c 2010-09-15 17:58:27.000000000 +0200
++++ metacity-2.30.2/src/ui/frames.c 2010-09-20 14:24:15.596736001 +0200
+@@ -1100,6 +1100,9 @@
+ if (frame == NULL)
+ return;
+
++ if (meta_prefs_get_hide_decorator_tooltip ())
++ return;
++
+ XQueryPointer (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
+ frame->xwindow,
+ &root, &child,

metacity-2.18.2-handle-keybindings-during-mouse-only-grab.patch: new
--- /dev/null
+++ metacity-2.18.2-handle-keybindings-during-mouse-only-grab.patch
@@ -0,0 +277 @@
+--- metacity-2.18.2/src/keybindings.c.orig 2007-05-04 19:33:25.000000000 -0400
++++ metacity-2.18.2/src/keybindings.c 2007-05-04 19:23:54.000000000 -0400
+@@ -1574,7 +1574,7 @@
+ return NULL;
+ }
+
+-static void
++static int
+ process_event (MetaKeyBinding *bindings,
+ int n_bindings,
+ const MetaKeyHandler *handlers,
+@@ -1588,13 +1588,13 @@
+
+ /* we used to have release-based bindings but no longer. */
+ if (event->type == KeyRelease)
+- return;
++ return FALSE;
+
+ i = 0;
+ while (i < n_bindings)
+ {
+ if (bindings[i].keycode == event->xkey.keycode &&
+- ((event->xkey.state & ~(display->ignored_modifier_mask)) ==
++ ((event->xkey.state & 0xff & ~(display->ignored_modifier_mask)) ==
+ bindings[i].mask) &&
+ event->type == KeyPress)
+ {
+@@ -1628,7 +1628,7 @@
+
+ (* handler->func) (display, screen, window, event,
+ &bindings[i]);
+- return;
++ return TRUE;
+ }
+
+ ++i;
+@@ -1636,6 +1636,7 @@
+
+ meta_topic (META_DEBUG_KEYBINDINGS,
+ "No handler found for this event in this binding table\n");
++ return FALSE;
+ }
+
+ void
+@@ -1645,6 +1646,7 @@
+ {
+ KeySym keysym;
+ gboolean handled;
++ gboolean keep_grab;
+ gboolean all_keys_grabbed;
+ const char *str;
+ MetaScreen *screen;
+@@ -1683,109 +1685,102 @@
+ str ? str : "none", event->xkey.state,
+ window ? window->desc : "(no window)");
+
++ keep_grab = TRUE;
+ all_keys_grabbed = window ? window->all_keys_grabbed : screen->all_keys_grabbed;
+- if (!all_keys_grabbed)
++ if (all_keys_grabbed)
+ {
+- /* Do the normal keybindings */
+- process_event (display->screen_bindings,
+- display->n_screen_bindings,
+- screen_handlers,
+- display, screen, NULL, event, keysym);
+-
+- if (window)
+- process_event (display->window_bindings,
+- display->n_window_bindings,
+- window_handlers,
+- display, screen, window, event, keysym);
+-
+- return;
+- }
+-
+- if (display->grab_op == META_GRAB_OP_NONE)
+- return;
+-
+- /* If we get here we have a global grab, because
+- * we're in some special keyboard mode such as window move
+- * mode.
+- */
+-
+- handled = FALSE;
+-
+- if (window ? (window == display->grab_window) :
+- (screen == display->grab_screen))
+- {
+- switch (display->grab_op)
++ if (display->grab_op == META_GRAB_OP_NONE)
++ return;
++ /* If we get here we have a global grab, because
++ * we're in some special keyboard mode such as window move
++ * mode.
++ */
++ if (window ? (window == display->grab_window) :
++ (screen == display->grab_screen))
+ {
+- case META_GRAB_OP_MOVING:
+- case META_GRAB_OP_RESIZING_SE:
+- case META_GRAB_OP_RESIZING_S:
+- case META_GRAB_OP_RESIZING_SW:
+- case META_GRAB_OP_RESIZING_N:
+- case META_GRAB_OP_RESIZING_NE:
+- case META_GRAB_OP_RESIZING_NW:
+- case META_GRAB_OP_RESIZING_W:
+- case META_GRAB_OP_RESIZING_E:
+- meta_topic (META_DEBUG_KEYBINDINGS,
+- "Processing event for mouse-only move/resize\n");
+- g_assert (window != NULL);
+- handled = process_mouse_move_resize_grab (display, screen,
+- window, event, keysym);
+- break;
+-
+- case META_GRAB_OP_KEYBOARD_MOVING:
+- meta_topic (META_DEBUG_KEYBINDINGS,
+- "Processing event for keyboard move\n");
+- g_assert (window != NULL);
+- handled = process_keyboard_move_grab (display, screen,
+- window, event, keysym);
+- break;
+-
+- case META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN:
+- case META_GRAB_OP_KEYBOARD_RESIZING_S:
+- case META_GRAB_OP_KEYBOARD_RESIZING_N:
+- case META_GRAB_OP_KEYBOARD_RESIZING_W:
+- case META_GRAB_OP_KEYBOARD_RESIZING_E:
+- case META_GRAB_OP_KEYBOARD_RESIZING_SE:
+- case META_GRAB_OP_KEYBOARD_RESIZING_NE:
+- case META_GRAB_OP_KEYBOARD_RESIZING_SW:
+- case META_GRAB_OP_KEYBOARD_RESIZING_NW:
+- meta_topic (META_DEBUG_KEYBINDINGS,
+- "Processing event for keyboard resize\n");
+- g_assert (window != NULL);
+- handled = process_keyboard_resize_grab (display, screen,
+- window, event, keysym);
+- break;
++ switch (display->grab_op)
++ {
++ case META_GRAB_OP_MOVING:
++ case META_GRAB_OP_RESIZING_SE:
++ case META_GRAB_OP_RESIZING_S:
++ case META_GRAB_OP_RESIZING_SW:
++ case META_GRAB_OP_RESIZING_N:
++ case META_GRAB_OP_RESIZING_NE:
++ case META_GRAB_OP_RESIZING_NW:
++ case META_GRAB_OP_RESIZING_W:
++ case META_GRAB_OP_RESIZING_E:
++ meta_topic (META_DEBUG_KEYBINDINGS,
++ "Processing event for mouse-only move/resize\n");
++ g_assert (window != NULL);
++ keep_grab = process_mouse_move_resize_grab (display, screen,
++ window, event, keysym);
++ break;
++
++ case META_GRAB_OP_KEYBOARD_MOVING:
++ meta_topic (META_DEBUG_KEYBINDINGS,
++ "Processing event for keyboard move\n");
++ g_assert (window != NULL);
++ keep_grab = process_keyboard_move_grab (display, screen,
++ window, event, keysym);
++ break;
++
++ case META_GRAB_OP_KEYBOARD_RESIZING_UNKNOWN:
++ case META_GRAB_OP_KEYBOARD_RESIZING_S:
++ case META_GRAB_OP_KEYBOARD_RESIZING_N:
++ case META_GRAB_OP_KEYBOARD_RESIZING_W:
++ case META_GRAB_OP_KEYBOARD_RESIZING_E:
++ case META_GRAB_OP_KEYBOARD_RESIZING_SE:
++ case META_GRAB_OP_KEYBOARD_RESIZING_NE:
++ case META_GRAB_OP_KEYBOARD_RESIZING_SW:
++ case META_GRAB_OP_KEYBOARD_RESIZING_NW:
++ meta_topic (META_DEBUG_KEYBINDINGS,
++ "Processing event for keyboard resize\n");
++ g_assert (window != NULL);
++ keep_grab = process_keyboard_resize_grab (display, screen,
++ window, event, keysym);
++ break;
++
++ case META_GRAB_OP_KEYBOARD_TABBING_NORMAL:
++ case META_GRAB_OP_KEYBOARD_TABBING_DOCK:
++ case META_GRAB_OP_KEYBOARD_TABBING_GROUP:
++ case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL:
++ case META_GRAB_OP_KEYBOARD_ESCAPING_DOCK:
++ case META_GRAB_OP_KEYBOARD_ESCAPING_GROUP:
++ meta_topic (META_DEBUG_KEYBINDINGS,
++ "Processing event for keyboard tabbing/cycling\n");
++ keep_grab = process_tab_grab (display, screen, event, keysym);
++ break;
++
++ case META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING:
++ meta_topic (META_DEBUG_KEYBINDINGS,
++ "Processing event for keyboard workspace switching\n");
++ keep_grab = process_workspace_switch_grab (display, screen, event, keysym);
++ break;
+
+- case META_GRAB_OP_KEYBOARD_TABBING_NORMAL:
+- case META_GRAB_OP_KEYBOARD_TABBING_DOCK:
+- case META_GRAB_OP_KEYBOARD_TABBING_GROUP:
+- case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL:
+- case META_GRAB_OP_KEYBOARD_ESCAPING_DOCK:
+- case META_GRAB_OP_KEYBOARD_ESCAPING_GROUP:
+- meta_topic (META_DEBUG_KEYBINDINGS,
+- "Processing event for keyboard tabbing/cycling\n");
+- handled = process_tab_grab (display, screen, event, keysym);
+- break;
+-
+- case META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING:
++ default:
++ break;
++ }
++ }
++ if (!keep_grab)
++ {
+ meta_topic (META_DEBUG_KEYBINDINGS,
+- "Processing event for keyboard workspace switching\n");
+- handled = process_workspace_switch_grab (display, screen, event, keysym);
+- break;
+-
+- default:
+- break;
++ "Ending grab op %u on key event sym %s\n",
++ display->grab_op, XKeysymToString (keysym));
++ meta_display_end_grab_op (display, event->xkey.time);
++ return;
+ }
+ }
+-
+- /* end grab if a key that isn't used gets pressed */
+- if (!handled)
+- {
+- meta_topic (META_DEBUG_KEYBINDINGS,
+- "Ending grab op %u on key event sym %s\n",
+- display->grab_op, XKeysymToString (keysym));
+- meta_display_end_grab_op (display, event->xkey.time);
+- }
++ /* Do the normal keybindings */
++ handled = process_event (display->screen_bindings,
++ display->n_screen_bindings,
++ screen_handlers,
++ display, screen, NULL, event, keysym);
++
++ if (!all_keys_grabbed && !handled && window)
++ handled = process_event (display->window_bindings,
++ display->n_window_bindings,
++ window_handlers,
++ display, screen, window, event, keysym);
+ }
+
+ static gboolean
+@@ -1822,13 +1817,10 @@
+ else
+ display->grab_was_cancelled = TRUE;
+
+- /* End grab, since this was an "unhandled" keypress */
++ /* End grab */
+ return FALSE;
+ }
+
+- /* The keypress really isn't handled but we just want to ignore it, so
+- * treat it as handled.
+- */
+ return TRUE;
+ }
+
+--- metacity-2.18.2/src/workspace.c.orig 2007-05-04 19:33:30.000000000 -0400
++++ metacity-2.18.2/src/workspace.c 2007-05-04 19:02:16.000000000 -0400
+@@ -321,7 +321,7 @@
+ */
+ if (move_window && (move_window->workspace != workspace))
+ {
+- meta_workspace_remove_window (workspace, move_window);
++ meta_workspace_remove_window (old, move_window);
+ meta_workspace_add_window (workspace, move_window);
+ }
+ }

06_Add_UXD_shadows_and_borders.patch: new
--- /dev/null
+++ 06_Add_UXD_shadows_and_borders.patch
@@ -0,0 +404 @@
+From a5442fe19432509eda44901093b45e97f72e04c0 Mon Sep 17 00:00:00 2001
+From: Sam Spilsbury <smsp...@gmail.com>
+Date: Thu, 13 Jan 2011 11:59:40 +0800
+Subject: [PATCH] Add UXD shadows and borders
+
+---
+ src/ui/theme-parser.c | 520 ++++++++++++++++++++------------
+ src/ui/theme.c | 63 ++++
+ src/ui/theme.h | 112 ++++++--
+ 3 files changed, 482 insertions(+), 215 deletions(-)
+
+diff --git a/src/ui/theme-parser.c b/src/ui/theme-parser.c
+index c56e318..aef6cee 100644
+--- a/src/ui/theme-parser.c
++++ b/src/ui/theme-parser.c
+@@ -67,6 +67,8 @@ typedef enum
+ STATE_FRAME_STYLE,
+ STATE_PIECE,
+ STATE_BUTTON,
++ STATE_SHADOW,
++ STATE_PADDING,
+ /* style set */
+ STATE_FRAME_STYLE_SET,
+ STATE_FRAME,
+@@ -173,6 +175,20 @@ static void parse_button_element (GMarkupParseContext *context,
+ ParseInfo *info,
+ GError **error);
+
++static void parse_shadow_element (GMarkupParseContext *context,
++ const gchar *element_name,
++ const gchar **attribute_names,
++ const gchar **attribute_values,
++ ParseInfo *info,
++ GError **error);
++
++static void parse_padding_element (GMarkupParseContext *context,
++ const gchar *element_name,
++ const gchar **attribute_names,
++ const gchar **attribute_values,
++ ParseInfo *info,
++ GError **error);
++
+ static void parse_menu_icon_element (GMarkupParseContext *context,
+ const gchar *element_name,
+ const gchar **attribute_names,
+@@ -2924,9 +2940,76 @@ parse_style_element (GMarkupParseContext *context,
+ meta_draw_op_list_ref (op_list);
+ info->op_list = op_list;
+ }
+-
++
+ push_state (info, STATE_BUTTON);
+ }
++ else if (ELEMENT_IS ("shadow"))
++ {
++ const char *shadow_radius = NULL;
++ const char *shadow_opacity = NULL;
++ const char *shadow_color = NULL;
++ const char *shadow_x_offset = NULL;
++ const char *shadow_y_offset = NULL;
++ double shadow_radius_v, shadow_opacity_v;
++ int shadow_x_offset_v, shadow_y_offset_v;
++ MetaColorSpec *shadow_color_v;
++
++ if (!locate_attributes (context, element_name, attribute_names, attribute_values,
++ error,
++ "radius", &shadow_radius,
++ "opacity", &shadow_opacity,
++ "color", &shadow_color,
++ "x_offset", &shadow_x_offset,
++ "y_offset", &shadow_y_offset,
++ NULL))
++ return;
++
++ parse_double (shadow_radius, &shadow_radius_v, context, error);
++ parse_double (shadow_opacity, &shadow_opacity_v, context, error);
++ parse_positive_integer (shadow_x_offset, &shadow_x_offset_v, context, info->theme, error);
++ parse_positive_integer (shadow_y_offset, &shadow_y_offset_v, context, info->theme, error);
++ shadow_color_v = parse_color (info->theme, shadow_color, error);
++
++ if (!info->style->shadow_properties)
++ info->style->shadow_properties = meta_shadow_properties_new ();
++
++ info->style->shadow_properties->unity_shadow_radius = shadow_radius_v;
++ info->style->shadow_properties->unity_shadow_opacity = shadow_opacity_v;
++ info->style->shadow_properties->unity_shadow_x_offset = shadow_x_offset_v;
++ info->style->shadow_properties->unity_shadow_y_offset = shadow_y_offset_v;
++ info->style->shadow_properties->unity_shadow_color = shadow_color_v;
++
++ push_state (info, STATE_SHADOW);
++
++ }
++ else if (ELEMENT_IS ("padding"))
++ {
++ const char *left = NULL;
++ const char *bottom = NULL;
++ const char *right = NULL;
++ int left_v, right_v, bottom_v;
++
++ if (!locate_attributes (context, element_name, attribute_names, attribute_values,
++ error,
++ "left", &left,
++ "right", &right,
++ "bottom", &bottom,
++ NULL))
++ return;
++
++ parse_positive_integer (left, &left_v, context, info->theme, error);
++ parse_positive_integer (right, &right_v, context, info->theme, error);
++ parse_positive_integer (bottom, &bottom_v, context, info->theme, error);
++
++ if (!info->style->invisible_grab_area_properties)
++ info->style->invisible_grab_area_properties = meta_invisible_grab_area_properties_new ();
++
++ info->style->invisible_grab_area_properties->left = left_v;
++ info->style->invisible_grab_area_properties->right = right_v;
++ info->style->invisible_grab_area_properties->bottom = bottom_v;
++
++ push_state (info, STATE_PADDING);
++ }
+ else
+ {
+ set_error (error, context,
+@@ -3205,6 +3288,38 @@ parse_button_element (GMarkupParseContext *context,
+ }
+
+ static void
++parse_shadow_element (GMarkupParseContext *context,
++ const gchar *element_name,
++ const gchar **attribute_names,
++ const gchar **attribute_values,
++ ParseInfo *info,
++ GError **error)
++{
++ g_return_if_fail (peek_state (info) == STATE_SHADOW);
++
++ set_error (error, context,
++ G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE,
++ _("Element <%s> is not allowed below <%s>"),
++ element_name, "shadow");
++}
++
++static void
++parse_padding_element (GMarkupParseContext *context,
++ const gchar *element_name,
++ const gchar **attribute_names,
++ const gchar **attribute_values,
++ ParseInfo *info,
++ GError **error)
++{
++ g_return_if_fail (peek_state (info) == STATE_PADDING);
++
++ set_error (error, context,
++ G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE,
++ _("Element <%s> is not allowed below <%s>"),
++ element_name, "padding");
++}
++
++static void
+ parse_menu_icon_element (GMarkupParseContext *context,
+ const gchar *element_name,
+ const gchar **attribute_names,
+@@ -3355,6 +3469,16 @@ start_element_handler (GMarkupParseContext *context,
+ attribute_names, attribute_values,
+ info, error);
+ break;
++ case STATE_SHADOW:
++ parse_shadow_element (context, element_name,
++ attribute_names, attribute_values,
++ info, error);
++ break;
++ case STATE_PADDING:
++ parse_padding_element (context, element_name,
++ attribute_names, attribute_values,
++ info, error);
++ break;
+ case STATE_MENU_ICON:
+ parse_menu_icon_element (context, element_name,
+ attribute_names, attribute_values,
+@@ -3624,6 +3748,14 @@ end_element_handler (GMarkupParseContext *context,
+ }
+ pop_state (info);
+ break;
++ case STATE_SHADOW:
++ g_assert (info->style);
++ pop_state (info);
++ break;
++ case STATE_PADDING:
++ g_assert (info->style);
++ pop_state (info);
++ break;
+ case STATE_MENU_ICON:
+ g_assert (info->theme);
+ if (info->op_list != NULL)
+@@ -3848,6 +3980,12 @@ text_handler (GMarkupParseContext *context,
+ case STATE_BUTTON:
+ NO_TEXT ("button");
+ break;
++ case STATE_SHADOW:
++ NO_TEXT ("shadow");
++ break;
++ case STATE_PADDING:
++ NO_TEXT ("padding");
++ break;
+ case STATE_MENU_ICON:
+ NO_TEXT ("menu_icon");
+ break;
+
+diff --git a/src/ui/theme.c b/src/ui/theme.c
+index 1397fc6..dfa5e9f 100644
+--- a/src/ui/theme.c
++++ b/src/ui/theme.c
+@@ -1051,6 +1051,51 @@ meta_alpha_gradient_spec_free (MetaAlphaGradientSpec *spec)
+ g_free (spec);
+ }
+
++MetaShadowProperties*
++meta_shadow_properties_new (void)
++{
++ MetaShadowProperties *properties;
++
++ properties = g_new0 (MetaShadowProperties, 1);
++
++ if (properties)
++ {
++ properties->unity_shadow_radius = 0.0f;
++ properties->unity_shadow_x_offset = 0;
++ properties->unity_shadow_y_offset = 0;
++ properties->unity_shadow_color = NULL;
++ }
++
++ return properties;
++}
++
++void
++meta_shadow_properties_free (MetaShadowProperties *properties)
++{
++ g_return_if_fail (properties != NULL);
++
++ meta_color_spec_free (properties->unity_shadow_color);
++ g_free (properties);
++}
++
++MetaInvisibleGrabAreaProperties*
++meta_invisible_grab_area_properties_new (void)
++{
++ MetaInvisibleGrabAreaProperties *properties;
++
++ properties = g_new0 (MetaInvisibleGrabAreaProperties, 1);
++
++ return properties;
++}
++
++void
++meta_invisible_grab_area_properties_free (MetaInvisibleGrabAreaProperties *properties)
++{
++ g_return_if_fail (properties != NULL);
++
++ g_free (properties);
++}
++
+ MetaColorSpec*
+ meta_color_spec_new (MetaColorSpecType type)
+ {
+@@ -4149,6 +4194,12 @@ meta_frame_style_unref (MetaFrameStyle *style)
+ if (style->parent)
+ meta_frame_style_unref (style->parent);
+
++ if (style->shadow_properties)
++ meta_shadow_properties_free (style->shadow_properties);
++
++ if (style->invisible_grab_area_properties)
++ meta_invisible_grab_area_properties_free (style->invisible_grab_area_properties);
++
+ DEBUG_FILL_STRUCT (style);
+ g_free (style);
+ }
+@@ -4581,6 +4632,18 @@ meta_frame_style_draw (MetaFrameStyle *style,
+ button_states, mini_icon, icon);
+ }
+
++MetaShadowProperties *
++meta_frame_style_get_shadow_properties (MetaFrameStyle *style)
++{
++ return style->shadow_properties;
++}
++
++
++MetaInvisibleGrabAreaProperties * meta_frame_style_get_invisible_grab_area_properties (MetaFrameStyle *style)
++{
++ return style->invisible_grab_area_properties;
++}
++
+ MetaFrameStyleSet*
+ meta_frame_style_set_new (MetaFrameStyleSet *parent)
+ {
+diff --git a/src/ui/theme.h b/src/ui/theme.h
+index ddf777d..88d3bf0 100644
+--- a/src/ui/theme.h
++++ b/src/ui/theme.h
+@@ -34,7 +34,7 @@ typedef struct _MetaFrameStyleSet MetaFrameStyleSet;
+ typedef struct _MetaDrawOp MetaDrawOp;
+ typedef struct _MetaDrawOpList MetaDrawOpList;
+ typedef struct _MetaGradientSpec MetaGradientSpec;
+-typedef struct _MetaAlphaGradientSpec MetaAlphaGradientSpec;
++typedef struct _MetaAlphaGradientSpec MetaAlphaGradientSpec;
+ typedef struct _MetaColorSpec MetaColorSpec;
+ typedef struct _MetaFrameLayout MetaFrameLayout;
+ typedef struct _MetaButtonSpace MetaButtonSpace;
+@@ -42,6 +42,54 @@ typedef struct _MetaFrameGeometry MetaFrameGeometry;
+ typedef struct _MetaTheme MetaTheme;
+ typedef struct _MetaPositionExprEnv MetaPositionExprEnv;
+ typedef struct _MetaDrawInfo MetaDrawInfo;
++typedef struct _MetaShadowProperties MetaShadowProperties;
++typedef struct _MetaInvisibleGrabAreaProperties MetaInvisibleGrabAreaProperties;
++
++struct _MetaShadowProperties
++{
++ /**
++ * Radius of the shadow
++ */
++ double unity_shadow_radius;
++
++ /**
++ * Opacity of the shadow
++ */
++ double unity_shadow_opacity;
++
++ /**
++ * Color of the shadow
++ */
++ MetaColorSpec *unity_shadow_color;
++ /**
++ * Shadow X Offset
++ */
++ guint8 unity_shadow_x_offset;
++ /**
++ * Shadow Y Offset
++ */
++ guint8 unity_shadow_y_offset;
++};
++
++struct _MetaInvisibleGrabAreaProperties
++{
++ /**
++ * Left padding
++ */
++ guint8 left;
++ /**
++ * Right padding
++ */
++ guint8 right;
++ /**
++ * Bottom padding
++ */
++ guint8 bottom;
++ /**
++ * Top padding
++ */
++ guint8 top;
++};
+
+ #define META_THEME_ERROR (g_quark_from_static_string ("meta-theme-error"))
+
+@@ -693,6 +741,15 @@ struct _MetaFrameStyle
+ * Transparency of the window background. 0=transparent; 255=opaque.
+ */
+ guint8 window_background_alpha;
++ /**
++ * Shadow
++ */
++ MetaShadowProperties *shadow_properties;
++ /**
++ * Padding (eg invisible grab area)
++ */
++ MetaInvisibleGrabAreaProperties *invisible_grab_area_properties;
++
+ };
+
+ /* Kinds of frame...
+@@ -946,6 +1003,11 @@ MetaAlphaGradientSpec* meta_alpha_gradient_spec_new (MetaGradientType typ
+ int n_alphas);
+ void meta_alpha_gradient_spec_free (MetaAlphaGradientSpec *spec);
+
++MetaShadowProperties* meta_shadow_properties_new (void);
++void meta_shadow_properties_free (MetaShadowProperties *);
++
++MetaInvisibleGrabAreaProperties* meta_invisible_grab_area_properties_new (void);
++void meta_invisible_grab_area_properties_free (MetaInvisibleGrabAreaProperties *);
+
+ MetaFrameStyle* meta_frame_style_new (MetaFrameStyle *parent);
+ void meta_frame_style_ref (MetaFrameStyle *style);
+@@ -983,6 +1045,8 @@ void meta_frame_style_draw_with_style (MetaFrameStyle *style,
+ GdkPixbuf *mini_icon,
+ GdkPixbuf *icon);
+
++MetaShadowProperties * meta_frame_style_get_shadow_properties (MetaFrameStyle *style);
++MetaInvisibleGrabAreaProperties * meta_frame_style_get_invisible_grab_area_properties (MetaFrameStyle *style);
+
+ gboolean meta_frame_style_validate (MetaFrameStyle *style,
+ guint current_theme_version,
+--
+1.7.2.3
+

metacity-2.4.13.90-ctrlaltdel.patch: new
--- /dev/null
+++ metacity-2.4.13.90-ctrlaltdel.patch
@@ -0,0 +61 @@
+--- metacity-2.4.13.90/src/metacity.schemas.in.ctrlaltdel 2003-01-16 15:11:47.000000000 -0500
++++ metacity-2.4.13.90/src/metacity.schemas.in 2003-01-16 15:13:41.000000000 -0500
+@@ -1549,8 +1549,31 @@
+ </schema>
+
+ <schema>
+- <key>/schemas/apps/metacity/global_keybindings/run_command</key>
++ <key>/schemas/apps/metacity/global_keybindings/run_command_1</key>
+ <applyto>/apps/metacity/global_keybindings/run_command_1</applyto>
++ <owner>metacity</owner>
++ <type>string</type>
++ <default>&lt;Ctrl&gt;&lt;Alt&gt;Delete</default>
++ <locale name="C">
++ <short>Run a defined command</short>
++ <long>
++ The keybinding that runs the correspondingly-numbered
++ command in /apps/metacity/keybinding_commands
++
++ The format looks like "&lt;Control&gt;a" or
++ "&lt;Shift&gt;&lt;Alt&gt;F1.
++
++ The parser is fairly liberal and allows lower or upper case,
++ and also abbreviations such as "&lt;Ctl&gt;" and
++ "&lt;Ctrl&gt;". If you set the option to the special string
++ "disabled", then there will be no keybinding for this
++ action.
++ </long>
++ </locale>
++ </schema>
++
++ <schema>
++ <key>/schemas/apps/metacity/global_keybindings/run_command</key>
+ <applyto>/apps/metacity/global_keybindings/run_command_2</applyto>
+ <applyto>/apps/metacity/global_keybindings/run_command_3</applyto>
+ <applyto>/apps/metacity/global_keybindings/run_command_4</applyto>
+@@ -1586,8 +1609,24 @@
+ <!-- commands to run with the run_command keybindings -->
+
+ <schema>
+- <key>/schemas/apps/metacity/keybinding_commands/command</key>
++ <key>/schemas/apps/metacity/keybinding_commands/command_1</key>
+ <applyto>/apps/metacity/keybinding_commands/command_1</applyto>
++ <owner>metacity</owner>
++ <type>string</type>
++ <default>gnome-session-save --kill</default>
++ <locale name="C">
++ <short>Commands to run in response to keybindings</short>
++ <long>
++ The /apps/metacity/global_keybindings/run_command_N
++ keys define keybindings that correspond to these commands.
++ Pressing the keybinding for run_command_N will
++ execute command_N.
++ </long>
++ </locale>
++ </schema>
++
++ <schema>
++ <key>/schemas/apps/metacity/keybinding_commands/command</key>
+ <applyto>/apps/metacity/keybinding_commands/command_2</applyto>
+ <applyto>/apps/metacity/keybinding_commands/command_3</applyto>
+ <applyto>/apps/metacity/keybinding_commands/command_4</applyto>

16-capture-before-unmap.patch: new
--- /dev/null
+++ 16-capture-before-unmap.patch
@@ -0,0 +679 @@
+Description: Add an optional feature that makes metacity save in a window property
+ a pixmap of each window before it is unmapped.
+Author: Ugo Riboni <ugo.r...@canonical.com>
+Forwarded: not-needed
+Bug: https://bugs.launchpad.net/unity-2d/+bug/696864
+
+Index: metacity-2.30.3/src/Makefile.am
+===================================================================
+--- metacity-2.30.3.orig/src/Makefile.am 2010-09-04 18:09:52.000000000 +0200
++++ metacity-2.30.3/src/Makefile.am 2011-04-14 13:01:28.691553256 +0200
+@@ -96,7 +96,9 @@
+ ui/theme.h \
+ ui/themewidget.c \
+ ui/themewidget.h \
+- ui/ui.c \
++ ui/ui.c \
++ core/capture.c \
++ core/capture.h \
+ include/all-keybindings.h
+
+ # by setting libmetacity_private_la_CFLAGS, the files shared with
+Index: metacity-2.30.3/src/core/atomnames.h
+===================================================================
+--- metacity-2.30.3.orig/src/core/atomnames.h 2010-09-04 18:09:52.000000000 +0200
++++ metacity-2.30.3/src/core/atomnames.h 2011-04-14 13:01:28.691553256 +0200
+@@ -71,6 +71,8 @@
+ item(VERSION)
+ item(ATOM_PAIR)
+
++item(_METACITY_WINDOW_CAPTURE)
++
+ /* Oddities: These are used, and we need atoms for them,
+ * but when we need all _NET_WM hints (i.e. when we're making
+ * lists of which _NET_WM hints we support in order to advertise
+Index: metacity-2.30.3/src/core/capture.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ metacity-2.30.3/src/core/capture.c 2011-04-14 13:01:28.691553256 +0200
+@@ -0,0 +1,231 @@
++/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
++
++/*
++ * Copyright (C) 2011 Canonical
++ *
++ * 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, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
++ * 02111-1307, USA.
++ */
++
++#define _GNU_SOURCE
++
++#include <config.h>
++
++#ifdef HAVE_COMPOSITE_EXTENSIONS
++
++#include <stdlib.h>
++
++#include <gdk/gdk.h>
++
++#include "display.h"
++#include "screen.h"
++#include "screen-private.h"
++#include "frame.h"
++#include "errors.h"
++#include "window.h"
++#include "display.h"
++#include "display-private.h"
++#include "xprops.h"
++#include "prefs.h"
++
++#include <X11/Xlib.h>
++#include <X11/X.h>
++#include <X11/Xatom.h>
++#include <X11/extensions/Xcomposite.h>
++
++#include "capture.h"
++
++/* All the following defines are copied directly from the
++ xrender compositor. They are needed to check at runtime
++ if the composite extensions are enabled on a specific
++ display. */
++
++#if COMPOSITE_MAJOR > 0 || COMPOSITE_MINOR >= 2
++#define HAVE_NAME_WINDOW_PIXMAP 1
++#endif
++
++#ifdef HAVE_COMPOSITE_EXTENSIONS
++static inline gboolean
++composite_at_least_version (MetaDisplay *display,
++ int maj, int min)
++{
++ static int major = -1;
++ static int minor = -1;
++
++ if (major == -1)
++ meta_display_get_compositor_version (display, &major, &minor);
++
++ return (major > maj || (major == maj && minor >= min));
++}
++
++#define have_name_window_pixmap(display) \
++ composite_at_least_version (display, 0, 2)
++
++#endif
++
++/* Notice that this is essentially the same that the xrender compositor
++ does, except that we use CompositeRedirectAutomatic instead of
++ CompositeRedirectManual. */
++void
++capture_enable_redirection_screen (MetaScreen *screen)
++{
++ screen->capture_enabled = FALSE;
++
++#ifdef HAVE_COMPOSITE_EXTENSIONS
++ MetaDisplay *display = meta_screen_get_display (screen);
++ Display *xdisplay = meta_display_get_xdisplay (display);
++
++ int screen_number = meta_screen_get_screen_number (screen);
++ Window xroot = meta_screen_get_xroot (screen);
++
++ gdk_error_trap_push ();
++ XCompositeRedirectSubwindows (xdisplay, xroot,
++ CompositeRedirectAutomatic);
++ XSync (xdisplay, FALSE);
++
++ if (gdk_error_trap_pop ())
++ {
++ g_warning ("Can't enable window redirection on screen %i",
++ screen_number);
++ return;
++ }
++ else screen->capture_enabled = TRUE;
++#endif
++}
++
++void
++capture_disable_redirection_screen (MetaScreen *screen)
++{
++#ifdef HAVE_COMPOSITE_EXTENSIONS
++ if (screen->capture_enabled)
++ {
++ MetaDisplay *display = meta_screen_get_display (screen);
++ Display *xdisplay = meta_display_get_xdisplay (display);
++ Window xroot = meta_screen_get_xroot (screen);
++
++ XCompositeUnredirectSubwindows (xdisplay, xroot,
++ CompositeRedirectAutomatic);
++ screen->capture_enabled = FALSE;
++ }
++#endif
++}
++
++/* Get our own copy of the backing pixmap for the window
++ via XCompositeNameWindowPixmap.
++ This is much simpler than what the xrender compositor
++ does but it's suitable for our purpose. */
++static Pixmap
++get_window_pixmap (MetaWindow *window)
++{
++#ifdef HAVE_COMPOSITE_EXTENSIONS
++ Pixmap pixmap;
++ MetaDisplay *display = meta_window_get_display (window);
++ Display *xdisplay = meta_display_get_xdisplay (display);
++ MetaFrame *frame = meta_window_get_frame (window);
++
++ Window xid = (frame) ? meta_frame_get_xwindow (frame) :
++ meta_window_get_xwindow (window);
++
++#ifdef HAVE_NAME_WINDOW_PIXMAP
++ if (have_name_window_pixmap (display))
++ {
++ meta_error_trap_push (display);
++ pixmap = XCompositeNameWindowPixmap(xdisplay, xid);
++ meta_error_trap_pop (display, FALSE);
++ return pixmap;
++ }
++ else
++#endif
++ return None;
++#endif
++}
++
++void
++capture_create_for_window (MetaWindow *window)
++{
++ MetaScreen *screen = meta_window_get_screen(window);
++ if (!screen->capture_enabled) return;
++
++ Pixmap pixmap;
++ Window xwindow = meta_window_get_xwindow(window);
++ MetaDisplay *display = meta_window_get_display(window);
++ Display *xdisplay = meta_display_get_xdisplay(display);
++
++ pixmap = get_window_pixmap (window);
++ meta_topic(META_DEBUG_CAPTURE, "Captured pixmap %lu for window %lu\n", xwindow, pixmap);
++ if (pixmap != None)
++ {
++ meta_error_trap_push (display);
++ int success = XChangeProperty (xdisplay, xwindow,
++ display->atom__METACITY_WINDOW_CAPTURE,
++ XA_PIXMAP,
++ 32, PropModeReplace, (guchar*) &pixmap, 1);
++ meta_error_trap_pop (display, FALSE);
++ if (!success) meta_warning("Failed to save capture property on window %lu\n", xwindow);
++ }
++}
++
++void
++capture_cleanup_for_window (MetaWindow *window)
++{
++ MetaScreen *screen = meta_window_get_screen(window);
++ if (!screen->capture_enabled) return;
++
++ Pixmap pixmap;
++ Window xwindow = meta_window_get_xwindow(window);
++ MetaDisplay *display = meta_window_get_display(window);
++ Display *xdisplay = meta_display_get_xdisplay(display);
++
++ meta_topic(META_DEBUG_CAPTURE, "Cleaning up property for window %lu\n", xwindow);
++ meta_error_trap_push (display);
++ if (meta_prop_get_pixmap(display, xwindow,
++ display->atom__METACITY_WINDOW_CAPTURE,
++ &pixmap))
++ {
++ /* Delete the property before freeing the pixmap, to avoid people
++ accessing it and getting a bad pixmap */
++ XDeleteProperty(xdisplay, xwindow,
++ display->atom__METACITY_WINDOW_CAPTURE);
++ XFreePixmap(xdisplay, pixmap);
++ }
++ meta_error_trap_pop (display, FALSE);
++}
++
++void
++capture_enable_redirection_display (MetaDisplay *display)
++{
++ meta_topic(META_DEBUG_CAPTURE, "Enabling window redirection for capture.");
++ GSList *list = meta_display_get_screens(display);
++ for (; list != NULL; list = list->next)
++ {
++ MetaScreen *screen = list->data;
++ capture_enable_redirection_screen (screen);
++ }
++}
++
++void
++capture_disable_redirection_display (MetaDisplay *display)
++{
++ meta_topic(META_DEBUG_CAPTURE, "Disabling window redirection for capture.");
++ GSList *list = meta_display_get_screens(display);
++ for (; list != NULL; list = list->next)
++ {
++ MetaScreen *screen = list->data;
++ capture_disable_redirection_screen (screen);
++ }
++}
++
++#endif /* HAVE_COMPOSITE_EXTENSIONS */
++
+Index: metacity-2.30.3/src/core/capture.h
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ metacity-2.30.3/src/core/capture.h 2011-04-14 13:01:28.691553256 +0200
+@@ -0,0 +1,97 @@
++/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
++
++/*
++ * Copyright (C) 2011 Canonical
++ *
++ * 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, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
++ * 02111-1307, USA.
++ */
++
++/** \file capture.h Capture windows before unmapping
++ *
++ * This module implements the bulk of the functionality for the
++ * "capture before unmapping" feature.
++ * Essentially metacity unmaps the windows when they are sent to
++ * another workspace or minimized. This prevents clients from
++ * getting screenshots of these windows (for display in task switchers
++ * for example).
++ *
++ * By using these functions, it is possible to capture a pixmap
++ * of the current state of the window and save it into a property on the
++ * window itself (and conversely, destroy that pixmap and the property
++ * when not needed anymore).
++ * The interested clients can then read the property on unmapped windows
++ * and retrieve the pixmap for their own use.
++ */
++
++#ifndef META_CAPTURE_H_
++#define META_CAPTURE_H_
++
++#include "types.h"
++
++/**
++ * Activates window redirection on all screens on the display, so that
++ * we can use NameWindowPixmap to capture window pixmaps.
++ *
++ * \param screen The display where to enable redirection
++ */
++void capture_enable_redirection_display (MetaDisplay *display);
++
++/**
++ * Disables window redirection on all screens on the display.
++ *
++ * \param screen The display where to disable redirection
++ */
++void capture_disable_redirection_display (MetaDisplay *display);
++
++/**
++ * Activates window redirection on the screen.
++ * This needs the composite extension to be enabled on the screen.
++ *
++ * \param screen The screen where to enable redirection
++ */
++void capture_enable_redirection_screen (MetaScreen *screen);
++
++/**
++ * Disables window redirection on the screen.
++ *
++ * \param screen The screen where to disable redirection
++ */
++void capture_disable_redirection_screen (MetaScreen *screen);
++
++/**
++ * Gets a pixmap of the current state of window, then
++ * save it into a custom property (_METACITY_WINDOW_CAPTURE) on
++ * the window itself.
++ * Note that the pixmap is still owned by the server and needs
++ * to be destroyed when not needed anymore (typically when the
++ * window is mapped again or is destroyed) by calling capture_cleanup_for_window.
++ *
++ * \param window The window to capture and save the pixmap for.
++ */
++void capture_create_for_window(MetaWindow *window);
++
++/**
++ * If the window has the _METACITY_WINDOW_CAPTURE property, then free the
++ * pixmap stored into it and delete the property too.
++ * Always use this to cleanup windows where you called capture_create_for_window
++ * when you don't need the capture anymore or when the window is destryed to
++ * avoid pixmap leaks.
++ *
++ * \param window The window where to clean up the capture.
++ */
++void capture_cleanup_for_window(MetaWindow *window);
++
++#endif
+Index: metacity-2.30.3/src/core/display.c
+===================================================================
+--- metacity-2.30.3.orig/src/core/display.c 2011-04-14 13:01:25.531592982 +0200
++++ metacity-2.30.3/src/core/display.c 2011-04-14 13:01:28.699553155 +0200
+@@ -48,6 +48,7 @@
+ #include "bell.h"
+ #include "effects.h"
+ #include "compositor.h"
++#include "capture.h"
+ #include <X11/Xatom.h>
+ #include <X11/cursorfont.h>
+ #ifdef HAVE_SOLARIS_XINERAMA
+@@ -723,6 +724,8 @@
+ the code */
+ if (meta_prefs_get_compositing_manager ())
+ enable_compositor (the_display, FALSE);
++ else if (meta_prefs_get_capture_before_unmap())
++ capture_enable_redirection_display(the_display);
+
+ meta_display_grab (the_display);
+
+@@ -924,6 +927,11 @@
+
+ if (display->compositor)
+ meta_compositor_destroy (display->compositor);
++
++ /* Cycle through all the screens and if in any of them the
++ "capture before unmap" feature was enabled, disable it.
++ */
++ capture_disable_redirection_display(display);
+
+ g_free (display);
+ the_display = NULL;
+Index: metacity-2.30.3/src/core/prefs.c
+===================================================================
+--- metacity-2.30.3.orig/src/core/prefs.c 2011-04-14 13:01:28.295558234 +0200
++++ metacity-2.30.3/src/core/prefs.c 2011-04-14 13:02:15.962958972 +0200
+@@ -65,7 +65,6 @@
+ #define KEY_WORKSPACE_NAME_DIRECTORY "/apps/metacity/workspace_names"
+ #define KEY_WORKSPACE_NAME_PREFIX "/apps/metacity/workspace_names/name_"
+
+-
+ #ifdef HAVE_GCONF
+ static GConfClient *default_client = NULL;
+ static GList *changes = NULL;
+@@ -100,6 +99,7 @@
+ static gboolean force_fullscreen = TRUE;
+ static gboolean hide_decorator_tooltip = FALSE;
+ static gboolean show_maximized_titlebars = TRUE;
++static gboolean capture_before_unmap = FALSE;
+
+ static MetaVisualBellType visual_bell_type = META_VISUAL_BELL_FULLSCREEN_FLASH;
+ static MetaButtonLayout button_layout;
+@@ -425,6 +425,11 @@
+ &show_maximized_titlebars,
+ FALSE,
+ },
++ { "/apps/metacity/general/capture_before_unmap",
++ META_PREF_CAPTURE_BEFORE_UNMAP,
++ &capture_before_unmap,
++ FALSE,
++ },
+ { NULL, 0, NULL, FALSE },
+ };
+
+@@ -1785,6 +1790,9 @@
+
+ case META_PREF_SHOW_MAXIMIZED_TITLEBARS:
+ return "META_PREF_SHOW_MAXIMIZED_TITLEBARS";
++
++ case META_PREF_CAPTURE_BEFORE_UNMAP:
++ return "CAPTURE_BEFORE_UNMAP";
+ }
+
+ return "(unknown)";
+@@ -2735,6 +2743,12 @@
+ return compositing_manager;
+ }
+
++gboolean
++meta_prefs_get_capture_before_unmap (void)
++{
++ return capture_before_unmap;
++}
++
+ guint
+ meta_prefs_get_mouse_button_resize (void)
+ {
+Index: metacity-2.30.3/src/core/screen-private.h
+===================================================================
+--- metacity-2.30.3.orig/src/core/screen-private.h 2010-09-04 18:09:53.000000000 +0200
++++ metacity-2.30.3/src/core/screen-private.h 2011-04-14 13:01:28.707553054 +0200
+@@ -133,6 +133,9 @@
+
+ /* Managed by compositor.c */
+ gpointer compositor_data;
++
++ /* Managed by capture.c */
++ gboolean capture_enabled;
+ };
+
+ MetaScreen* meta_screen_new (MetaDisplay *display,
+Index: metacity-2.30.3/src/core/screen.c
+===================================================================
+--- metacity-2.30.3.orig/src/core/screen.c 2010-09-04 18:09:53.000000000 +0200
++++ metacity-2.30.3/src/core/screen.c 2011-04-14 13:01:28.711553004 +0200
+@@ -585,6 +585,11 @@
+
+ screen->stack = meta_stack_new (screen);
+
++ /* This will be set to TRUE later if we are configured for
++ capture and if we actually manage to enable window
++ redirection for this screen. */
++ screen->capture_enabled = FALSE;
++
+ meta_prefs_add_listener (prefs_changed_callback, screen);
+
+ #ifdef HAVE_STARTUP_NOTIFICATION
+Index: metacity-2.30.3/src/core/util.c
+===================================================================
+--- metacity-2.30.3.orig/src/core/util.c 2010-09-04 18:09:53.000000000 +0200
++++ metacity-2.30.3/src/core/util.c 2011-04-14 13:01:28.715552954 +0200
+@@ -321,6 +321,8 @@
+ return "COMPOSITOR";
+ case META_DEBUG_EDGE_RESISTANCE:
+ return "EDGE_RESISTANCE";
++ case META_DEBUG_CAPTURE:
++ return "CAPTURE";
+ }
+
+ return "WM";
+Index: metacity-2.30.3/src/core/window.c
+===================================================================
+--- metacity-2.30.3.orig/src/core/window.c 2011-04-14 13:01:25.171597508 +0200
++++ metacity-2.30.3/src/core/window.c 2011-04-14 13:01:28.727552803 +0200
+@@ -45,6 +45,7 @@
+ #include "constraints.h"
+ #include "compositor.h"
+ #include "effects.h"
++#include "capture.h"
+
+ #include <X11/Xatom.h>
+ #include <string.h>
+@@ -974,6 +975,10 @@
+
+ meta_verbose ("Unmanaging 0x%lx\n", window->xwindow);
+
++ /* Avoid leaking server side the captured pixmaps when
++ the windows to which they belong are closed */
++ capture_cleanup_for_window(window);
++
+ if (window->display->compositor)
+ meta_compositor_free_window (window->display->compositor, window);
+
+@@ -1471,6 +1476,9 @@
+
+ if (!showing)
+ {
++ /* Capture the window pixmap before starting the minimize effect */
++ capture_create_for_window (window);
++
+ gboolean on_workspace;
+
+ on_workspace = meta_window_located_on_workspace (window,
+@@ -1518,6 +1526,10 @@
+ else
+ {
+ meta_window_show (window);
++
++ /* After the window has completely finished showing, destroy
++ the captured pixmap and clean the window property */
++ capture_cleanup_for_window (window);
+ }
+ }
+
+Index: metacity-2.30.3/src/core/xprops.c
+===================================================================
+--- metacity-2.30.3.orig/src/core/xprops.c 2010-09-04 18:09:53.000000000 +0200
++++ metacity-2.30.3/src/core/xprops.c 2011-04-14 13:01:28.727552803 +0200
+@@ -554,6 +554,20 @@
+ return TRUE;
+ }
+
++static gboolean
++pixmap_from_results (GetPropertyResults *results,
++ Pixmap *pixmap_p)
++{
++ if (!validate_or_free_results (results, 32, XA_PIXMAP, TRUE))
++ return FALSE;
++
++ *pixmap_p = *(Pixmap*) results->prop;
++ XFree (results->prop);
++ results->prop = NULL;
++
++ return TRUE;
++}
++
+ #ifdef HAVE_XSYNC
+ static gboolean
+ counter_from_results (GetPropertyResults *results,
+@@ -590,6 +604,23 @@
+ }
+
+ gboolean
++meta_prop_get_pixmap (MetaDisplay *display,
++ Window xwindow,
++ Atom xatom,
++ Pixmap *pixmap_p)
++{
++ GetPropertyResults results;
++
++ *pixmap_p = None;
++
++ if (!get_property (display, xwindow, xatom, XA_PIXMAP,
++ &results))
++ return FALSE;
++
++ return pixmap_from_results (&results, pixmap_p);
++}
++
++gboolean
+ meta_prop_get_cardinal (MetaDisplay *display,
+ Window xwindow,
+ Atom xatom,
+Index: metacity-2.30.3/src/include/prefs.h
+===================================================================
+--- metacity-2.30.3.orig/src/include/prefs.h 2011-04-14 13:01:28.299558183 +0200
++++ metacity-2.30.3/src/include/prefs.h 2011-04-14 13:02:15.294967371 +0200
+@@ -62,7 +62,8 @@
+ META_PREF_RESIZE_WITH_RIGHT_BUTTON,
+ META_PREF_FORCE_FULLSCREEN,
+ META_PREF_HIDE_DECORATOR_TOOLTIP,
+- META_PREF_SHOW_MAXIMIZED_TITLEBARS
++ META_PREF_SHOW_MAXIMIZED_TITLEBARS,
++ META_PREF_CAPTURE_BEFORE_UNMAP
+ } MetaPreference;
+
+ typedef void (* MetaPrefsChangedFunc) (MetaPreference pref,
+@@ -121,6 +122,8 @@
+ gboolean meta_prefs_get_compositing_manager (void);
+ gboolean meta_prefs_get_force_fullscreen (void);
+
++gboolean meta_prefs_get_capture_before_unmap (void);
++
+ /**
+ * Sets whether the compositor is turned on.
+ *
+Index: metacity-2.30.3/src/include/util.h
+===================================================================
+--- metacity-2.30.3.orig/src/include/util.h 2010-09-04 18:09:53.000000000 +0200
++++ metacity-2.30.3/src/include/util.h 2011-04-14 13:01:28.731552752 +0200
+@@ -72,7 +72,8 @@
+ META_DEBUG_RESIZING = 1 << 18,
+ META_DEBUG_SHAPES = 1 << 19,
+ META_DEBUG_COMPOSITOR = 1 << 20,
+- META_DEBUG_EDGE_RESISTANCE = 1 << 21
++ META_DEBUG_EDGE_RESISTANCE = 1 << 21,
++ META_DEBUG_CAPTURE = 1 << 22
+ } MetaDebugTopic;
+
+ void meta_topic_real (MetaDebugTopic topic,
+Index: metacity-2.30.3/src/include/xprops.h
+===================================================================
+--- metacity-2.30.3.orig/src/include/xprops.h 2010-09-04 18:09:53.000000000 +0200
++++ metacity-2.30.3/src/include/xprops.h 2011-04-14 13:01:28.731552752 +0200
+@@ -111,6 +111,10 @@
+ Window xwindow,
+ Atom xatom,
+ Window *window_p);
++gboolean meta_prop_get_pixmap (MetaDisplay *display,
++ Window xwindow,
++ Atom xatom,
++ Pixmap *pixmap_p);
+ gboolean meta_prop_get_cardinal (MetaDisplay *display,
+ Window xwindow,
+ Atom xatom,
+Index: metacity-2.30.3/src/metacity.schemas.in.in
+===================================================================
+--- metacity-2.30.3.orig/src/metacity.schemas.in.in 2011-04-14 13:01:28.347557580 +0200
++++ metacity-2.30.3/src/metacity.schemas.in.in 2011-04-14 13:02:42.246628506 +0200
+@@ -337,6 +337,26 @@
+ </schema>
+
+ <schema>
++ <key>/schemas/apps/metacity/general/capture_before_unmap</key>
++ <applyto>/apps/metacity/general/capture_before_unmap</applyto>
++ <owner>metacity</owner>
++ <type>bool</type>
++ <default>false</default>
++ <locale name="C">
++ <short>Capture Before Unmap</short>
++ <long>
++ Determines whether or not before a window is unmapped (e.g. when
++ it is sent to another workspace or minimized) a pixmap of the
++ current state of the window is captured and stored in a property
++ on the window itself. This allows interested clients (e.g.
++ workspace switchers) to be able to display previews of any window.
++ Note that this is incompatible with compositing_manager and
++ will be ignored if compositing_manager is enabled.
++ </long>
++ </locale>
++ </schema>
++
++ <schema>
+ <key>/schemas/apps/metacity/general/audible_bell</key>
+ <applyto>/apps/metacity/general/audible_bell</applyto>
+ <owner>metacity</owner>

11_hide_tooltip_on_decorator.patch: removed
06_Add_UXD_shadows_and_borders.patch: removed
15_show_maximized_titlebars.patch: removed
metacity-2.18.2-handle-keybindings-during-mouse-only-grab.patch: removed
metacity-uninitialized-variables.patch: removed
metacity-key-list-binding.patch: removed
16-capture-before-unmap.patch: removed
metacity-2.30.3-1.fc14.src.rpm: removed
metacity-support-above-tab.patch: removed
metacity-2.4.13.90-ctrlaltdel.patch: removed
13_better_support_for_button_layout.patch: removed

================================
npapi-vlc:source=2.1.3-3
cvc rdiff npapi-vlc -1 /foresight.rpath.org@fl:2-qa/2.1.3-3
================================
2.1.3-3 Tomas Forsman (tfor...@foresightlinux.se) Thu Sep 25 14:38:08 2014
Promote to fl:2-qa

npapi-vlc.git--master--2.1.3.tar.bz2: new
npapi-vlc.recipe: new
--- /dev/null
+++ npapi-vlc.recipe
@@ -0,0 +40 @@
+#
+# Copyright (c) 2013-2014 The Foresight Linux Project
+# This file is distributed under the terms of the MIT License.
+# A copy is available at http://www.foresightlinux.org/licenses/mit-license/
+#
+
+class NpapiVlc(AutoPackageRecipe):
+ name = 'npapi-vlc'
+ version = '2.1.3'
+ tag = '2.1.3'
+
+
+ buildRequires = [
+ 'atk:devel',
+ 'autoconf:runtime',
+ 'automake:runtime',
+ 'cairo:devel',
+ 'fontconfig:devel',
+ 'freetype:devel',
+ 'gdk-pixbuf:devel',
+ 'git:runtime',
+ 'glib:devel',
+ 'gtk:devel',
+ 'intltool:devel',
+ 'libICE:devel',
+ 'libstdc++:devel',
+ 'libtool:runtime',
+ 'libX11:devel',
+ 'libxcb:devel',
+ 'pango:devel',
+ 'pkgconfig:devel',
+ 'vlc:devel',
+ 'xulrunner:devel',
+ ]
+
+ def unpack(r):
+ r.addGitSnapshot('http://git.videolan.org/git/npapi-vlc.git', tag=r.tag)
+ r.Run('./autogen.sh')
+
+ r.Requires('vlc:runtime', 'npapi-vlc:lib')


================================
openssl:source=0.9.8g-4 (previous: 0.9.8g-3)
cvc rdiff openssl -1 /foresight.rpath.org@fl:2-qa/0.9.8g-4
================================
0.9.8g-4 Tomas Forsman (tfor...@foresightlinux.se) Thu Sep 25 14:38:08 2014
Promote to fl:2-qa

openssl-0.9.8g-soversion.patch: new
--- /dev/null
+++ openssl-0.9.8g-soversion.patch
@@ -0,0 +49 @@
+Define and use a soname -- because we have to care about binary
+compatibility, we have to increment the soname in order to allow
+this version to co-exist with another versions and have everything
+work right.
+
+diff -up openssl-0.9.8g/Configure.soversion openssl-0.9.8g/Configure
+--- openssl-0.9.8g/Configure.soversion 2007-12-03 14:41:19.000000000 +0100
++++ openssl-0.9.8g/Configure 2007-12-03 14:41:19.000000000 +0100
+@@ -1371,7 +1371,7 @@ while (<IN>)
+ elsif ($shared_extension ne "" && $shared_extension =~ /^\.s([ol])\.[^\.]*\.[^\.]*$/)
+ {
+ my $sotmp = $1;
+- s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp.\$(SHLIB_MAJOR) .s$sotmp/;
++ s/^SHARED_LIBS_LINK_EXTS=.*/SHARED_LIBS_LINK_EXTS=.s$sotmp.\$(SHLIB_SONAMEVER) .s$sotmp/;
+ }
+ elsif ($shared_extension ne "" && $shared_extension =~ /^\.[^\.]*\.[^\.]*\.dylib$/)
+ {
+diff -up openssl-0.9.8g/Makefile.org.soversion openssl-0.9.8g/Makefile.org
+--- openssl-0.9.8g/Makefile.org.soversion 2007-12-03 14:41:19.000000000 +0100
++++ openssl-0.9.8g/Makefile.org 2007-12-03 14:41:19.000000000 +0100
+@@ -10,6 +10,7 @@ SHLIB_VERSION_HISTORY=
+ SHLIB_MAJOR=
+ SHLIB_MINOR=
+ SHLIB_EXT=
++SHLIB_SONAMEVER=7
+ PLATFORM=dist
+ OPTIONS=
+ CONFIGURE_ARGS=
+@@ -277,10 +278,9 @@ clean-shared:
+ link-shared:
+ @ set -e; for i in ${SHLIBDIRS}; do \
+ $(MAKE) -f $(HERE)/Makefile.shared -e $(BUILDENV) \
+- LIBNAME=$$i LIBVERSION=${SHLIB_MAJOR}.${SHLIB_MINOR} \
++ LIBNAME=$$i LIBVERSION=${SHLIB_SONAMEVER} \
+ LIBCOMPATVERSIONS=";${SHLIB_VERSION_HISTORY}" \
+ symlink.$(SHLIB_TARGET); \
+- libs="$$libs -l$$i"; \
+ done
+
+ build-shared: do_$(SHLIB_TARGET) link-shared
+@@ -291,7 +291,7 @@ do_$(SHLIB_TARGET):
+ libs="$(LIBKRB5) $$libs"; \
+ fi; \
+ $(CLEARENV) && $(MAKE) -f Makefile.shared -e $(BUILDENV) \
+- LIBNAME=$$i LIBVERSION=${SHLIB_MAJOR}.${SHLIB_MINOR} \
++ LIBNAME=$$i LIBVERSION=${SHLIB_SONAMEVER} \
+ LIBCOMPATVERSIONS=";${SHLIB_VERSION_HISTORY}" \
+ LIBDEPS="$$libs $(EX_LIBS)" \
+ link_a.$(SHLIB_TARGET); \

openssl.git--OpenSSL_0_9_8-stable--HEAD.tar.bz2: new
openssl.recipe: changed
Index: openssl.recipe
====================================================================
contents(size sha1)
inode(mtime owner group)
--- openssl.recipe /foresight.rpath.org@fl:2-qa/0.9.8g-3
+++ openssl.recipe /foresight.rpath.org@fl:2-qa/0.9.8g-4
@@ -4,22 +4,10 @@
# A copy is available at http://www.rpath.com/permanent/mit-license.html
#

-loadSuperClass('rpmpackage')
-class OpenSSL(RPMPackageRecipe, CPackageRecipe):
+class OpenSSL(CPackageRecipe):
name = 'openssl'
version = '0.9.8g'
certsdir = '%(sysconfdir)s/ssl/certs'
-
- isUpdate = True
- distroVersion = '10'
- rpmRelease = '12.fc10'
-
- rpmPatches = [
- 'openssl-0.9.8a-link-krb5.patch',
- 'openssl-0.9.8g-ipv6-apps.patch',
- 'openssl-0.9.8g-shlib-version.patch',
- 'openssl-0.9.8g-soversion.patch',
- ]

buildRequires = [ 'perl:runtime',
'sed:runtime', 'mktemp:runtime', 'zlib:devel' ]
@@ -28,42 +16,25 @@

buildRequires.append('zlib:devel')

- # XXX
- # XXX this has to be built under an rpl2 context (as newer binutils doesn't
- # XXX like this too much ... (using it would force defaulting to no-asm ...)
- # XXX
-
def setup(r):
r.disableParallelMake()
r.macros.solibbase = re.sub('[a-zA-Z]*', '', r.version)
r.macros.certsdir = r.certsdir

- # Add back signature verification if CNY-2420 is fixed
- r.addArchive('http://www.openssl.org/source/') #, keyid='9C58A66D')
-
- for patch in r.rpmPatches:
- r.addPatch(patch, rpm=r.srpm)
-
- for patch in [ 'openssl-0.9.8-flags-priority.dif',
- 'non-exec-stack.diff',
- 'openssl-0.9.8a.ca-app-segfault.bug128655.dif',
- 'bswap.diff',
- 'openssl-0.9.8g-fix_dh_for_certain_moduli.patch',
- 'openssl-CVE-2008-0891.patch', # RPL-2569
- 'openssl-CVE-2008-1672.patch', # RPL-2569
- 'openssl-0.9.8g-CVE-2008-5077.patch', # RPL-2942
- 'openssl-CVE-2009-0590.patch', # RPL-2997
- 'openssl-CVE-2009-0789.patch',
- 'openssl-CVE-2009-1377.patch',
- 'openssl-CVE-2009-1378.patch',
- 'openssl-CVE-2009-1379.patch',
- 'openssl-CVE-2009-1386.patch', # RPL-3287 RPL-3288
- 'openssl-CVE-2009-1387.patch',
- ]:
- r.addPatch(patch)
+ r.addGitSnapshot('git://git.openssl.org/openssl.git',
+ branch='OpenSSL_0_9_8-stable')

# RPL-2519
r.addPatch('openssl-0.9.8g-Configure-libresolv.patch')
+
+ # Other adjustments from RH for better compatibility:
+ r.addPatch('openssl-0.9.8a-link-krb5.patch')
+ r.addPatch('openssl-0.9.8g-shlib-version.patch')
+ r.addPatch('openssl-0.9.8g-soversion.patch')
+
+ # Other patches we have carried
+ r.addPatch('non-exec-stack.diff')
+ r.addPatch('bswap.diff')

#Replace the country code in the stock openssl.cnf with --
r.Replace('AU', '--', 'apps/openssl.cnf')
@@ -71,50 +42,7 @@
#Add a script for generating dummy certificates, useful for initscripts
r.addSource('gendummycert.sh', mode=0755, dest='%(bindir)s/')

- # RPL-3157
- r.addPatch('CVE-2009-4355.patch')
-
- # TLS renegotiation fix
- r.addPatch('CVE-2009-3555.patch')
-
- # RPL-3191
- r.addPatch('openssl-0.9.8g-CVE-2010-0433.patch')
- r.addPatch('openssl-0.9.8g-CVE-2009-3245.patch')
-
- # PFM-909
- r.addPatch('openssl-0.9.8g-CVE-2010-4180.patch')
- # RPL-3287 RPL-3288
- r.addPatch('openssl-CVE-2010-0740.patch')
-
- # XXXX [legacy hell]
- # the commented patches bellow don't apply straight :( ...
- for patch in [ 'CVE-2010-2939.patch',
- 'CVE-2010-3864.patch',
- # Only 0.9.8h through 0.9.8q are affected by bellow one
- # 'CVE-2011-0014.patch',
- 'block_diginotar.patch',
- 'block_digicert_malaysia.patch',
- 'CVE-2011-1945.patch',
- 'CVE-2011-3210.patch',
- #'CVE-2011-4108.patch',
- 'CVE-2011-4109.patch',
- # 'CVE-2011-4619.patch',
- 'CVE-2011-4576.patch',
- # 'CVE-2011-4577.patch',
- 'dtls-fragment-alert.patch',
- # 'CVE-2012-0050.patch',
- # 'CVE-2012-0884.patch',
- # 'CVE-2012-1165.patch',
- 'CVE-2012-2110.patch',
- 'CVE-2012-2131.patch',
- 'CVE-2012-2333.patch',
- # 'CVE-2013-0169.patch',
- 'CVE-2013-0166.patch',
- ]:
- r.addPatch('http://patch-tracker.debian.org/patch/series/dl/openssl/0.9.8o-4squeeze14/%s' % patch)
-
r.addPatch('openssl-0.9.7-beta5-version-add-engines.patch')
- r.addPatch('openssl-0.9.8a-enginesdir.patch')

r.macros.sslflags = ''



openssl-0.9.8g-shlib-version.patch: new
--- /dev/null
+++ openssl-0.9.8g-shlib-version.patch
@@ -0,0 +12 @@
+diff -up openssl-0.9.8g/crypto/opensslv.h.shlib-version openssl-0.9.8g/crypto/opensslv.h
+--- openssl-0.9.8g/crypto/opensslv.h.shlib-version 2007-12-13 17:57:40.000000000 +0100
++++ openssl-0.9.8g/crypto/opensslv.h 2008-01-25 17:10:13.000000000 +0100
+@@ -83,7 +83,7 @@
+ * should only keep the versions that are binary compatible with the current.
+ */
+ #define SHLIB_VERSION_HISTORY ""
+-#define SHLIB_VERSION_NUMBER "0.9.8"
++#define SHLIB_VERSION_NUMBER "0.9.8g"
+
+
+ #endif /* HEADER_OPENSSLV_H */

openssl-0.9.8a-link-krb5.patch: new
--- /dev/null
+++ openssl-0.9.8a-link-krb5.patch
@@ -0,0 +11 @@
+--- openssl-0.9.8a/Makefile.org.link-krb5 2005-07-05 07:14:21.000000000 +0200
++++ openssl-0.9.8a/Makefile.org 2005-11-07 18:00:08.000000000 +0100
+@@ -266,7 +266,7 @@
+
+ do_$(SHLIB_TARGET):
+ @ set -e; libs='-L. ${SHLIBDEPS}'; for i in ${SHLIBDIRS}; do \
+- if [ "${SHLIBDIRS}" = "ssl" -a -n "$(LIBKRB5)" ]; then \
++ if [ "$$i" = "ssl" -a -n "$(LIBKRB5)" ]; then \
+ libs="$(LIBKRB5) $$libs"; \
+ fi; \
+ $(CLEARENV) && $(MAKE) -f Makefile.shared -e $(BUILDENV) \

openssl-CVE-2009-1387.patch: removed
CVE-2012-2333.patch: removed
openssl-0.9.8g-12.fc10.src.rpm: removed
CVE-2012-2110.patch: removed
CVE-2012-2131.patch: removed
CVE-2013-0166.patch: removed
CVE-2009-4355.patch: removed
openssl-0.9.8g-CVE-2009-3245.patch: removed
openssl-0.9.8g-CVE-2010-4180.patch: removed
CVE-2011-4576.patch: removed
block_diginotar.patch: removed
dtls-fragment-alert.patch: removed
openssl-CVE-2009-0590.patch: removed
openssl-CVE-2009-1378.patch: removed
openssl-0.9.8a-enginesdir.patch: removed
openssl-CVE-2008-1672.patch: removed
CVE-2011-3210.patch: removed
CVE-2011-4109.patch: removed
CVE-2011-1945.patch: removed
CVE-2009-0590.patch: removed
openssl-CVE-2009-1386.patch: removed
openssl-CVE-2010-0740.patch: removed
openssl-CVE-2009-1377.patch: removed
openssl-CVE-2008-0891.patch: removed
openssl-0.9.8g.tar.gz: removed
openssl-0.9.8g-CVE-2008-5077.patch: removed
block_digicert_malaysia.patch: removed
CVE-2010-3864.patch: removed
openssl-CVE-2009-0789.patch: removed
openssl-CVE-2009-1379.patch: removed
CVE-2010-2939.patch: removed
openssl-0.9.8g-CVE-2010-0433.patch: removed
CVE-2009-3555.patch: removed
CVE-2008-5077.patch: removed

================================
primus:source=07481761+2014.06.09-1
cvc rdiff primus -1 /foresight.rpath.org@fl:2-qa/07481761+2014.06.09-1
================================
07481761+2014.06.09-1 Tomas Forsman (tfor...@foresightlinux.se) Thu Sep 25 14:38:08 2014
Promote to fl:2-qa

primus.git--master--HEAD.tar.bz2: new
primus.recipe: new
--- /dev/null
+++ primus.recipe
@@ -0,0 +19 @@
+#
+# Copyright (c) 2013 The Foresight Linux Project
+# This file is distributed under the terms of the MIT License.
+# A copy is available at http://www.foresightlinux.org/licenses/mit-license/
+#
+import datetime
+class Primus(AutoPackageRecipe):
+ name = 'primus'
+ version = '07481761' + '+' + datetime.date.today().strftime("%Y.%m.%d")
+
+ buildRequires = ['libX11:devel', 'libstdc++:devel', 'Mesa:devel']
+
+ def setup(r):
+ r.addGitSnapshot('https://github.com/amonakov/primus.git')
+ r.Make()
+ r.Run(''' sed -e "s#^PRIMUS_libGL=.*#PRIMUS_libGL='/usr/\%(libdir)s/primus'#" primusrun ''')
+ r.Install('lib/libGL.so.1', '%(libdir)s/primus/')
+ r.Install('primusrun', '%(bindir)s/', mode=0755)
+ r.Install('primus.bash-completion', '%(datadir)s/bash_completion.d/primusrun')


================================
rar:source=5.1.0-1 (previous: 5.1.b4-1)
cvc rdiff rar -1 /foresight.rpath.org@fl:2-qa/5.1.0-1
================================
5.1.0-1 Tomas Forsman (tfor...@foresightlinux.se) Thu Sep 25 14:38:08 2014
Promote to fl:2-qa

rarlinux-5.1.0.tar.gz: new
rar.recipe: changed
Index: rar.recipe
====================================================================
contents(size sha1)
inode(mtime)
--- rar.recipe /foresight.rpath.org@fl:2-qa/5.1.b4-1
+++ rar.recipe /foresight.rpath.org@fl:2-qa/5.1.0-1
@@ -9,7 +9,7 @@
buildRequires=[ ]

name = 'rar'
- version = '5.1.b4'
+ version = '5.1.0'

def unpack(r):
r.addArchive('http://www.rarlab.com/rar/rarlinux-%(version)s.tar.gz')


rarlinux-5.1.b4.tar.gz: removed

================================
unetbootin:source=608-1 (previous: 584-1)
cvc rdiff unetbootin -1 /foresight.rpath.org@fl:2-qa/608-1
================================
608-1 Tomas Forsman (tfor...@foresightlinux.se) Thu Sep 25 14:38:08 2014
Promote to fl:2-qa

unetbootin-source-608.tar.gz: new
unetbootin.recipe: changed
Index: unetbootin.recipe
====================================================================
contents(sha1)
inode(mtime)
--- unetbootin.recipe /foresight.rpath.org@fl:2-qa/584-1
+++ unetbootin.recipe /foresight.rpath.org@fl:2-qa/608-1
@@ -6,7 +6,7 @@

class Unetbootin(CPackageRecipe):
name = 'unetbootin'
- version = '584'
+ version = '608'

buildRequires = ['make:runtime', 'qt4:devel', 'libgcc:devellib', 'libstdc++:devel', 'desktop-file-utils:runtime', 'gcc:runtime']



unetbootin-source-584.tar.gz: removed

================================
unrar:source=5.1.6-0.1 (previous: 5.1.5-0.1)
cvc rdiff unrar -1 /foresight.rpath.org@fl:devel//2-qa/5.1.6-0.1
================================
5.1.6-0.1 Tomas Forsman (tfor...@foresightlinux.se) Thu Sep 25 14:38:08 2014
Promote to fl:2-qa

unrar.recipe: changed
Index: unrar.recipe
====================================================================
contents(sha1)
inode(mtime)
--- unrar.recipe /foresight.rpath.org@fl:devel//2-qa/5.1.5-0.1
+++ unrar.recipe /foresight.rpath.org@fl:devel//2-qa/5.1.6-0.1
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2012-2013 The Foresight Linux Project
+# Copyright (c) 2012-2014 The Foresight Linux Project
# Copyright (c) 2007 rPath, Inc.
# This file is distributed under the terms of the MIT License.
# A copy is available at http://www.foresightlinux.org/licenses/mit-license/
@@ -7,7 +7,7 @@

class unRAR(CPackageRecipe):
name = 'unrar'
- version = '5.1.5'
+ version = '5.1.6'

buildRequires = [ 'libstdc++:devel', ]



unrarsrc-5.1.6.tar.gz: new
unrarsrc-5.1.5.tar.gz: removed

================================
vlc:source=2.1.3-1 (previous: 2.0.9-1)
cvc rdiff vlc -1 /foresight.rpath.org@fl:2-qa/2.1.3-1
================================
2.1.3-1 Tomas Forsman (tfor...@foresightlinux.se) Thu Sep 25 14:38:08 2014
Promote to fl:2-qa

vlc.recipe: changed
Index: vlc.recipe
====================================================================
contents(size sha1)
inode(mtime)
--- vlc.recipe /foresight.rpath.org@fl:2-qa/2.0.9-1
+++ vlc.recipe /foresight.rpath.org@fl:2-qa/2.1.3-1
@@ -122,7 +122,7 @@
]

name = "vlc"
- version = "2.0.9"
+ version = "2.1.3"

packageSummary = 'VLC media player is a highly portable multimedia player'
packageDescription = 'VLC media player is a highly portable multimedia player supporting most audio and video formats (H.264, Ogg, DivX, MKV, TS, MPEG-2, mp3, MPEG-4, aac, ...) from files, physical media (DVDs, VCD, Audio-CD), TV capture cards and many network streaming protocols.'
@@ -162,6 +162,7 @@
' --with-tuning=no'
' --disable-optimizations'
' --disable-rpath'
+ ' --disable-mmx'
' --with-binary-version=%(version)s'
)



vlc-2.1.3.tar.xz: new
vlc-2.0.9.tar.xz: removed

Committed by: tforsman
_______________________________________________
Foresight-commits mailing list
Foresigh...@lists.foresightlinux.org
https://lists.foresightlinux.org/mailman/listinfo/foresight-commits
Reply all
Reply to author
Forward
0 new messages