10921 lines
286 KiB
Diff
10921 lines
286 KiB
Diff
diff -uprN compiz-0.8.8-orig/compiz-kconfig.pc.in compiz-0.8.8/compiz-kconfig.pc.in
|
|
--- compiz-0.8.8-orig/compiz-kconfig.pc.in 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/compiz-kconfig.pc.in 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,7 +0,0 @@
|
|
-prefix=@prefix@
|
|
-xsltdir=@datarootdir@/compiz
|
|
-kcfgdir=@kcfgdir@
|
|
-
|
|
-Name: compiz-kconfig
|
|
-Description: Kconfig plugin for compiz
|
|
-Version: @VERSION@
|
|
diff -uprN compiz-0.8.8-orig/configure.ac compiz-0.8.8/configure.ac
|
|
--- compiz-0.8.8-orig/configure.ac 2013-04-19 11:25:07.375310000 +0200
|
|
+++ compiz-0.8.8/configure.ac 2013-04-19 11:37:51.368916779 +0200
|
|
@@ -400,174 +400,6 @@ if test "$use_mate_keybindings" = yes; t
|
|
AC_DEFINE(USE_MATE_KEYBINDINGS, 1, [Install custom keybindings])
|
|
fi
|
|
|
|
-AC_ARG_ENABLE(kde,
|
|
- [ --disable-kde Disable kde window decorator],
|
|
- [use_kde=$enableval], [use_kde=yes])
|
|
-
|
|
-if test "x$use_kde" = "xyes"; then
|
|
- qt_incdirs="$QTINC /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/lib/qt3/include /usr/lib/qt/include /usr/share/qt3/include"
|
|
- qt_libdirs="$QTLIB /usr/local/qt/lib /usr/lib/qt /usr/lib /usr/X11R6/lib/X11/qt /usr/X11R6/lib/qt /usr/lib/qt3/lib /usr/lib/qt/lib /usr/share/qt3/lib"
|
|
-
|
|
- if test -n "$QTDIR" ; then
|
|
- qt_incdirs="$QTDIR/include $qt_incdirs"
|
|
- qt_libdirs="$QTDIR/lib $qt_libdirs"
|
|
- fi
|
|
-
|
|
- qt_test_include="qstyle.h"
|
|
- qt_test_library="libqt-mt.so"
|
|
-
|
|
- dnl Check for Qt headers
|
|
- AC_MSG_CHECKING([for Qt headers])
|
|
- qt_incdir="no"
|
|
- for it in $qt_incdirs ; do
|
|
- if test -r "$it/$qt_test_include" ; then
|
|
- qt_incdir="$it"
|
|
- break
|
|
- fi
|
|
- done
|
|
- AC_MSG_RESULT([$qt_incdir])
|
|
-
|
|
- dnl Check for Qt libraries
|
|
- AC_MSG_CHECKING([for Qt libraries])
|
|
- qt_libdir="no"
|
|
- for qt_check in $qt_libdirs ; do
|
|
- if test -r "$qt_check/$qt_test_library" ; then
|
|
- qt_libdir="$qt_check"
|
|
- break
|
|
- fi
|
|
- done
|
|
- AC_MSG_RESULT([$qt_libdir])
|
|
-
|
|
- use_kde=no;
|
|
- if test "x$qt_libdir" != "xno" ; then
|
|
- if test "x$qt_incdir" != "xno" ; then
|
|
- use_kde=yes;
|
|
- fi
|
|
- fi
|
|
-
|
|
- QT_CXXFLAGS="-I$qt_incdir"
|
|
- QT_LIBS="-L$qt_libdir"
|
|
-
|
|
- if test "x$use_kde" = xyes; then
|
|
- kdedir=`kde-config --prefix --expandvars 2>/dev/null`
|
|
- kdelibs=`kde-config --install lib --expandvars 2>/dev/null`
|
|
- kdeincs=`kde-config --install include --expandvars 2>/dev/null`
|
|
- if test -d "$kdelibs"; then
|
|
- PKG_CHECK_MODULES(KDE_WINDOW_DECORATOR,
|
|
- dbus-1 xdamage xcomposite,
|
|
- [use_kde=yes], [use_kde=no])
|
|
-
|
|
- KDE_CFLAGS="$QT_CXXFLAGS -I$kdeincs"
|
|
- KDE_LIBS="$QT_LIBS -L$kdelibs -lkdecore -lkdecorations -ldbus-qt-1"
|
|
-
|
|
- QT_MOC=$QTDIR/bin/moc
|
|
- DCOPIDL=$kdedir/bin/dcopidl
|
|
- DCOPIDL2CPP=$kdedir/bin/dcopidl2cpp
|
|
- else
|
|
- use_kde=no;
|
|
- fi
|
|
- fi
|
|
-fi
|
|
-
|
|
-AM_CONDITIONAL(USE_KDE, test "x$use_kde" = "xyes")
|
|
-if test "$use_kde" = yes; then
|
|
- AC_DEFINE(USE_KDE, 1, [Build kde window decorator])
|
|
-fi
|
|
-
|
|
-AC_SUBST(KDE_CFLAGS)
|
|
-AC_SUBST(KDE_LIBS)
|
|
-AC_SUBST(QT_MOC)
|
|
-AC_SUBST(DCOPIDL)
|
|
-AC_SUBST(DCOPIDL2CPP)
|
|
-
|
|
-AC_ARG_ENABLE(kde4,
|
|
- [ --disable-kde4 Disable kde4 window decorator],
|
|
- [use_kde4=$enableval], [use_kde4=yes])
|
|
-
|
|
-if test "x$use_kde4" = "xyes"; then
|
|
-
|
|
- kde4dir=`kde4-config --prefix --expandvars 2>/dev/null`
|
|
- kde4libs=`kde4-config --install lib --expandvars 2>/dev/null`
|
|
- kde4incs=`kde4-config --install include --expandvars 2>/dev/null`
|
|
-
|
|
- kde4_test_includes="kdecoration.h kcommondecoration.h kdecorationbridge.h plasma/framesvg.h"
|
|
-
|
|
- dnl Check for KWin headers
|
|
- AC_MSG_CHECKING([for KWin headers])
|
|
-
|
|
- kde4_notfound=""
|
|
- for file in $kde4_test_includes ; do
|
|
- status=" $file"
|
|
- for it in $kde4incs ; do
|
|
- if test -r "$it/$file" ; then
|
|
- status=""
|
|
- break;
|
|
- fi
|
|
- done
|
|
- kde4_notfound="$kde4_notfound$status"
|
|
- done
|
|
- if test -z "$kde4_notfound" ; then
|
|
- kde4_notfound="yes"
|
|
- else
|
|
- kde4_notfound="$kde4_notfound not found"
|
|
- kde4libs=""
|
|
- fi
|
|
-
|
|
- AC_MSG_RESULT([$kde4_notfound])
|
|
-
|
|
- if test -d "$kde4libs"; then
|
|
- PKG_CHECK_MODULES(KDE4_WINDOW_DECORATOR,
|
|
- dbus-1 xdamage xext xcomposite QtCore >= 4.5.0 QtGui QtDBus,
|
|
- [use_kde4=yes], [use_kde4=no])
|
|
-
|
|
- KDE4_CFLAGS="-I$kde4incs"
|
|
- KDE4_LIBS="-L$kde4libs -lkdecore -lkdecorations -lkdeui -lplasma"
|
|
-
|
|
- QT4_MOC=`pkg-config QtGui --variable=moc_location`
|
|
- QDBUSXML2CPP=`pkg-config QtGui --variable=exec_prefix`"/bin/qdbusxml2cpp"
|
|
- else
|
|
- use_kde4=no;
|
|
- fi
|
|
-fi
|
|
-
|
|
-AM_CONDITIONAL(USE_KDE4, test "x$use_kde4" = "xyes")
|
|
-if test "$use_kde4" = yes; then
|
|
- AC_DEFINE(USE_KDE4, 1, [Build kde4 window decorator])
|
|
-fi
|
|
-
|
|
-AC_SUBST(KDE4_CFLAGS)
|
|
-AC_SUBST(KDE4_LIBS)
|
|
-AC_SUBST(QT4_MOC)
|
|
-AC_SUBST(QDBUSXML2CPP)
|
|
-
|
|
-AC_ARG_ENABLE(kconfig,
|
|
- [ --disable-kconfig Disable kconfig plugin],
|
|
- [use_kconfig=$enableval], [use_kconfig=yes])
|
|
-
|
|
-if test "x$use_kde" != "xyes"; then
|
|
- use_kconfig=no;
|
|
-fi
|
|
-
|
|
-if test "x$use_kconfig" = "xyes"; then
|
|
- KCONFIG_CFLAGS=$KDE_CFLAGS
|
|
- KCONFIG_LIBS=$KDE_LIBS
|
|
- KDE_KCFG_DIR=`kde-config --install kcfg --expandvars 2>/dev/null`
|
|
- KDE_KCONFIG_DIR=`kde-config --install config --expandvars 2>/dev/null`
|
|
-fi
|
|
-
|
|
-AM_CONDITIONAL(USE_KCONFIG, test "x$use_kconfig" = "xyes")
|
|
-if test "$use_kconfig" = yes; then
|
|
- AC_DEFINE(USE_KCONFIG, 1, [Build kconfig plugin])
|
|
-fi
|
|
-
|
|
-AC_SUBST(KCONFIG_CFLAGS)
|
|
-AC_SUBST(KCONFIG_LIBS)
|
|
-AC_SUBST(KDE_KCFG_DIR)
|
|
-AC_SUBST(KDE_KCONFIG_DIR)
|
|
-
|
|
-kcfgdir=$KDE_KCFG_DIR
|
|
-AC_SUBST(kcfgdir)
|
|
-
|
|
AC_ARG_WITH(max-desktops,
|
|
[ --with-max-desktops Max reasonable desktops],
|
|
[MAX_DESKTOPS=$withval],
|
|
@@ -620,7 +452,6 @@ compiz.pc
|
|
compiz-cube.pc
|
|
compiz-scale.pc
|
|
compiz-mateconf.pc
|
|
-compiz-kconfig.pc
|
|
Makefile
|
|
src/Makefile
|
|
libdecoration/Makefile
|
|
@@ -631,9 +462,6 @@ images/Makefile
|
|
gtk/Makefile
|
|
gtk/window-decorator/Makefile
|
|
gtk/mate/Makefile
|
|
-kde/Makefile
|
|
-kde/window-decorator/Makefile
|
|
-kde/window-decorator-kde4/Makefile
|
|
po/Makefile.in
|
|
metadata/Makefile
|
|
])
|
|
@@ -642,7 +470,6 @@ echo ""
|
|
echo "the following optional plugins will be compiled:"
|
|
echo " glib: $use_glib"
|
|
echo " mateconf: $use_mateconf"
|
|
-echo " kconfig: $use_kconfig"
|
|
echo " dbus: $use_dbus"
|
|
echo " annotate: $use_annotate"
|
|
echo " svg: $use_librsvg"
|
|
@@ -653,6 +480,4 @@ echo "and the following optional feature
|
|
echo " gtk: $use_gtk"
|
|
echo " marco: $use_marco"
|
|
echo " mate: $use_mate"
|
|
-echo " kde: $use_kde"
|
|
-echo " kde4: $use_kde4"
|
|
echo ""
|
|
diff -uprN compiz-0.8.8-orig/kde/Makefile.am compiz-0.8.8/kde/Makefile.am
|
|
--- compiz-0.8.8-orig/kde/Makefile.am 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/Makefile.am 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1 +0,0 @@
|
|
-SUBDIRS = window-decorator window-decorator-kde4
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator/decorator.cpp compiz-0.8.8/kde/window-decorator/decorator.cpp
|
|
--- compiz-0.8.8-orig/kde/window-decorator/decorator.cpp 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator/decorator.cpp 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,1055 +0,0 @@
|
|
-/*
|
|
- * Copyright © 2006 Novell, Inc.
|
|
- * Copyright © 2006 Dennis Kasprzyk <onestone@beryl-project.org>
|
|
- * Copyright © 2006 Volker Krause <vkrause@kde.org>
|
|
- *
|
|
- * 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., 51 Franklin Street, Fifth Floor, Boston,
|
|
- * MA 02110-1301, USA.
|
|
- *
|
|
- * Author: David Reveman <davidr@novell.com>
|
|
- */
|
|
-
|
|
-#include <qglobal.h>
|
|
-
|
|
-#include <dcopclient.h>
|
|
-#include <kcmdlineargs.h>
|
|
-#include <kconfig.h>
|
|
-#include <kdebug.h>
|
|
-#include <kglobal.h>
|
|
-#include <kwinmodule.h>
|
|
-#include <klocale.h>
|
|
-#include <kcommondecoration.h>
|
|
-#include <kwin.h>
|
|
-#include <qwidgetlist.h>
|
|
-#include <qpoint.h>
|
|
-
|
|
-#include <X11/Xlib.h>
|
|
-#include <X11/extensions/Xcomposite.h>
|
|
-
|
|
-#include "decorator.h"
|
|
-#include "options.h"
|
|
-#include "utils.h"
|
|
-
|
|
-#include <stdio.h>
|
|
-
|
|
-#define SHADOW_RADIUS 8.0
|
|
-#define SHADOW_OPACITY 0.5
|
|
-#define SHADOW_OFFSET_X 1
|
|
-#define SHADOW_OFFSET_Y 1
|
|
-#define SHADOW_COLOR_RED 0x0000
|
|
-#define SHADOW_COLOR_GREEN 0x0000
|
|
-#define SHADOW_COLOR_BLUE 0x0000
|
|
-
|
|
-#define DBUS_DEST "org.freedesktop.compiz"
|
|
-#define DBUS_PATH "/org/freedesktop/compiz/decoration/display"
|
|
-#define DBUS_INTERFACE "org.freedesktop.compiz"
|
|
-#define DBUS_METHOD_GET "get"
|
|
-
|
|
-double decorationOpacity = 0.75;
|
|
-bool decorationOpacityShade = false;
|
|
-double activeDecorationOpacity = 1.0;
|
|
-bool activeDecorationOpacityShade = false;
|
|
-int blurType = BLUR_TYPE_NONE;
|
|
-
|
|
-decor_context_t KWD::Decorator::mDefaultContext;
|
|
-decor_extents_t KWD::Decorator::mDefaultBorder;
|
|
-decor_shadow_t *KWD::Decorator::mNoBorderShadow = 0;
|
|
-decor_shadow_t *KWD::Decorator::mDefaultShadow = 0;
|
|
-KWD::PluginManager *KWD::Decorator::mPlugins = 0;
|
|
-KWD::Options *KWD::Decorator::mOptions = 0;
|
|
-NETRootInfo *KWD::Decorator::mRootInfo;
|
|
-WId KWD::Decorator::mActiveId;
|
|
-decor_shadow_options_t KWD::Decorator::mShadowOptions;
|
|
-
|
|
-extern Time qt_x_time;
|
|
-
|
|
-struct _cursor cursors[3][3] = {
|
|
- { C (top_left_corner), C (top_side), C (top_right_corner) },
|
|
- { C (left_side), C (left_ptr), C (right_side) },
|
|
- { C (bottom_left_corner), C (bottom_side), C (bottom_right_corner) }
|
|
-};
|
|
-
|
|
-KWD::PluginManager::PluginManager (KConfig *config): KDecorationPlugins (config)
|
|
-{
|
|
- defaultPlugin = "kwin3_plastik";
|
|
-}
|
|
-
|
|
-static DBusHandlerResult
|
|
-dbusHandleMessage (DBusConnection *connection,
|
|
- DBusMessage *message,
|
|
- void *userData)
|
|
-{
|
|
- KWD::Decorator *d = (KWD::Decorator *) userData;
|
|
- char **path;
|
|
- const char *interface, *member;
|
|
- DBusHandlerResult result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
|
|
-
|
|
- interface = dbus_message_get_interface (message);
|
|
- member = dbus_message_get_member (message);
|
|
-
|
|
- (void) connection;
|
|
-
|
|
- if (!interface || !member)
|
|
- return result;
|
|
-
|
|
- if (!dbus_message_is_signal (message, interface, member))
|
|
- return result;
|
|
-
|
|
- if (strcmp (member, "changed"))
|
|
- return result;
|
|
-
|
|
- if (!dbus_message_get_path_decomposed (message, &path))
|
|
- return result;
|
|
-
|
|
- if (!path[0] || !path[1] || !path[2] || !path[3] || !path[4] || !path[5])
|
|
- {
|
|
- dbus_free_string_array (path);
|
|
- return result;
|
|
- }
|
|
-
|
|
- if (!strcmp (path[0], "org") &&
|
|
- !strcmp (path[1], "freedesktop") &&
|
|
- !strcmp (path[2], "compiz") &&
|
|
- !strcmp (path[3], "decoration") &&
|
|
- !strcmp (path[4], "display"))
|
|
- {
|
|
- decor_shadow_options_t opt = *d->shadowOptions ();
|
|
-
|
|
- result = DBUS_HANDLER_RESULT_HANDLED;
|
|
-
|
|
- if (strcmp (path[5], "shadow_radius") == 0)
|
|
- {
|
|
- dbus_message_get_args (message, NULL,
|
|
- DBUS_TYPE_DOUBLE, &opt.shadow_radius,
|
|
- DBUS_TYPE_INVALID);
|
|
- }
|
|
- else if (strcmp (path[5], "shadow_opacity") == 0)
|
|
- {
|
|
- dbus_message_get_args (message, NULL,
|
|
- DBUS_TYPE_DOUBLE, &opt.shadow_opacity,
|
|
- DBUS_TYPE_INVALID);
|
|
- }
|
|
- else if (strcmp (path[5], "shadow_color") == 0)
|
|
- {
|
|
- DBusError error;
|
|
- char *str;
|
|
-
|
|
- dbus_error_init (&error);
|
|
-
|
|
- dbus_message_get_args (message, &error,
|
|
- DBUS_TYPE_STRING, &str,
|
|
- DBUS_TYPE_INVALID);
|
|
-
|
|
- if (!dbus_error_is_set (&error))
|
|
- {
|
|
- int c[4];
|
|
-
|
|
- if (sscanf (str, "#%2x%2x%2x%2x",
|
|
- &c[0], &c[1], &c[2], &c[3]) == 4)
|
|
- {
|
|
- opt.shadow_color[0] = c[0] << 8 | c[0];
|
|
- opt.shadow_color[1] = c[1] << 8 | c[1];
|
|
- opt.shadow_color[2] = c[2] << 8 | c[2];
|
|
- }
|
|
- }
|
|
-
|
|
- dbus_error_free (&error);
|
|
- }
|
|
- else if (strcmp (path[5], "shadow_x_offset") == 0)
|
|
- {
|
|
- dbus_message_get_args (message, NULL,
|
|
- DBUS_TYPE_INT32, &opt.shadow_offset_x,
|
|
- DBUS_TYPE_INVALID);
|
|
- }
|
|
- else if (strcmp (path[5], "shadow_y_offset") == 0)
|
|
- {
|
|
- dbus_message_get_args (message, NULL,
|
|
- DBUS_TYPE_INT32, &opt.shadow_offset_y,
|
|
- DBUS_TYPE_INVALID);
|
|
- }
|
|
-
|
|
- d->changeShadowOptions (&opt);
|
|
- }
|
|
-
|
|
- dbus_free_string_array (path);
|
|
-
|
|
- return result;
|
|
-}
|
|
-
|
|
-KWD::Decorator::Decorator (void) : DCOPObject ("KWinInterface"),
|
|
- KApplication (),
|
|
- mConfig (0),
|
|
- mKWinModule (new KWinModule (this, KWinModule::INFO_ALL)),
|
|
- mDBusQtConnection (this),
|
|
- mCompositeWindow (0)
|
|
-{
|
|
- XSetWindowAttributes attr;
|
|
- DCOPClient *client;
|
|
- int i, j;
|
|
-
|
|
- mRootInfo = new NETRootInfo (qt_xdisplay (), 0);
|
|
-
|
|
- mActiveId = 0;
|
|
-
|
|
- Atoms::init ();
|
|
-
|
|
- mConfig = new KConfig ("kwinrc");
|
|
- mConfig->setGroup ("Style");
|
|
-
|
|
- mOptions = new KWD::Options (mConfig);
|
|
- mPlugins = new PluginManager (mConfig);
|
|
-
|
|
- for (i = 0; i < 3; i++)
|
|
- {
|
|
- for (j = 0; j < 3; j++)
|
|
- {
|
|
- if (cursors[i][j].shape != XC_left_ptr)
|
|
- cursors[i][j].cursor =
|
|
- XCreateFontCursor (qt_xdisplay (), cursors[i][j].shape);
|
|
- }
|
|
- }
|
|
-
|
|
- client = dcopClient ();
|
|
- client->registerAs ("kwin", false);
|
|
- client->setDefaultObject ("KWinInterface");
|
|
-
|
|
- mShadowOptions.shadow_radius = SHADOW_RADIUS;
|
|
- mShadowOptions.shadow_opacity = SHADOW_OPACITY;
|
|
- mShadowOptions.shadow_offset_x = SHADOW_OFFSET_X;
|
|
- mShadowOptions.shadow_offset_y = SHADOW_OFFSET_Y;
|
|
- mShadowOptions.shadow_color[0] = SHADOW_COLOR_RED;
|
|
- mShadowOptions.shadow_color[1] = SHADOW_COLOR_GREEN;
|
|
- mShadowOptions.shadow_color[2] = SHADOW_COLOR_BLUE;
|
|
-
|
|
- attr.override_redirect = True;
|
|
-
|
|
- mCompositeWindow = XCreateWindow (qt_xdisplay (), qt_xrootwin (),
|
|
- -ROOT_OFF_X, -ROOT_OFF_Y, 1, 1, 0,
|
|
- CopyFromParent,
|
|
- CopyFromParent,
|
|
- CopyFromParent,
|
|
- CWOverrideRedirect, &attr);
|
|
-
|
|
- XCompositeRedirectSubwindows (qt_xdisplay (), mCompositeWindow,
|
|
- CompositeRedirectManual);
|
|
-
|
|
- XMapWindow (qt_xdisplay (), mCompositeWindow);
|
|
-}
|
|
-
|
|
-KWD::Decorator::~Decorator (void)
|
|
-{
|
|
- QMap <WId, KWD::Window *>::ConstIterator it;
|
|
-
|
|
- for (it = mClients.begin (); it != mClients.end (); it++)
|
|
- delete (*it);
|
|
-
|
|
- if (mDecorNormal)
|
|
- delete mDecorNormal;
|
|
-
|
|
- if (mDecorActive)
|
|
- delete mDecorActive;
|
|
-
|
|
- XDestroyWindow (qt_xdisplay (), mCompositeWindow);
|
|
-
|
|
- delete mOptions;
|
|
- delete mPlugins;
|
|
- delete mConfig;
|
|
- delete mKWinModule;
|
|
- delete mRootInfo;
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Decorator::enableDecorations (Time timestamp,
|
|
- int damageEvent)
|
|
-{
|
|
- QValueList <WId>::ConstIterator it;
|
|
- DBusError error;
|
|
-
|
|
- mDmSnTimestamp = timestamp;
|
|
- mDamageEvent = damageEvent;
|
|
-
|
|
- if (!pluginManager ()->loadPlugin (""))
|
|
- return false;
|
|
-
|
|
- dbus_error_init (&error);
|
|
-
|
|
- mDBusConnection = dbus_bus_get (DBUS_BUS_SESSION, &error);
|
|
- if (!dbus_error_is_set (&error))
|
|
- {
|
|
- dbus_bus_add_match (mDBusConnection, "type='signal'", &error);
|
|
-
|
|
- dbus_connection_add_filter (mDBusConnection,
|
|
- dbusHandleMessage,
|
|
- this, NULL);
|
|
-
|
|
- mDBusQtConnection.dbus_connection_setup_with_qt_main (mDBusConnection);
|
|
-
|
|
- updateAllShadowOptions ();
|
|
- }
|
|
-
|
|
- dbus_error_free (&error);
|
|
-
|
|
- updateShadow ();
|
|
-
|
|
- mDecorNormal = new KWD::Window (mCompositeWindow, qt_xrootwin (),
|
|
- 0, Window::Default);
|
|
- mDecorActive = new KWD::Window (mCompositeWindow, qt_xrootwin (),
|
|
- 0, Window::DefaultActive);
|
|
-
|
|
- connect (mKWinModule, SIGNAL (windowAdded (WId)),
|
|
- SLOT (handleWindowAdded (WId)));
|
|
- connect (mKWinModule, SIGNAL (windowRemoved (WId)),
|
|
- SLOT (handleWindowRemoved (WId)));
|
|
- connect (mKWinModule, SIGNAL (activeWindowChanged (WId)),
|
|
- SLOT (handleActiveWindowChanged (WId)));
|
|
- connect (mKWinModule,
|
|
- SIGNAL (windowChanged (WId, const unsigned long *)),
|
|
- SLOT (handleWindowChanged (WId, const unsigned long *)));
|
|
-
|
|
- connect (&mIdleTimer, SIGNAL (timeout ()), SLOT (processDamage ()));
|
|
-
|
|
- mActiveId = mKWinModule->activeWindow ();
|
|
-
|
|
- it = mKWinModule->windows ().begin ();
|
|
- for (; it != mKWinModule->windows ().end (); it++)
|
|
- handleWindowAdded ((*it));
|
|
-
|
|
- connect (this, SIGNAL (appearanceChanged ()), SLOT (reconfigure ()));
|
|
-
|
|
- (void) QApplication::desktop (); // trigger creation of desktop widget
|
|
-
|
|
- // select for client messages
|
|
- XSelectInput (qt_xdisplay(), qt_xrootwin (),
|
|
- StructureNotifyMask | PropertyChangeMask);
|
|
-
|
|
- return true;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::updateDefaultShadow (KWD::Window *w)
|
|
-{
|
|
- bool uniqueHorzShape, uniqueVertShape;
|
|
-
|
|
- if (mDefaultShadow)
|
|
- {
|
|
- decor_shadow_destroy (qt_xdisplay (), mDefaultShadow);
|
|
- mDefaultShadow = NULL;
|
|
- }
|
|
-
|
|
- w->getShapeInfo (&uniqueHorzShape, &uniqueVertShape);
|
|
-
|
|
- /* only return shadow if decoration doesn't use a unique shape */
|
|
- if (uniqueHorzShape || uniqueVertShape)
|
|
- return;
|
|
-
|
|
- mDefaultContext = *w->context ();
|
|
- mDefaultBorder = *w->border ();
|
|
- mDefaultShadow = w->shadow ();
|
|
-
|
|
- if (mDefaultShadow)
|
|
- decor_shadow_reference (mDefaultShadow);
|
|
-}
|
|
-
|
|
-DBusMessage *
|
|
-KWD::Decorator::sendAndBlockForShadowOptionReply (const char *path)
|
|
-{
|
|
- DBusMessage *message;
|
|
-
|
|
- message = dbus_message_new_method_call (NULL,
|
|
- path,
|
|
- DBUS_INTERFACE,
|
|
- DBUS_METHOD_GET);
|
|
- if (message)
|
|
- {
|
|
- DBusMessage *reply;
|
|
- DBusError error;
|
|
-
|
|
- dbus_message_set_destination (message, DBUS_DEST);
|
|
-
|
|
- dbus_error_init (&error);
|
|
- reply = dbus_connection_send_with_reply_and_block (mDBusConnection,
|
|
- message, -1,
|
|
- &error);
|
|
- dbus_message_unref (message);
|
|
-
|
|
- if (!dbus_error_is_set (&error))
|
|
- return reply;
|
|
- }
|
|
-
|
|
- return NULL;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::updateAllShadowOptions (void)
|
|
-{
|
|
- DBusMessage *reply;
|
|
-
|
|
- reply = sendAndBlockForShadowOptionReply (DBUS_PATH "/shadow_radius");
|
|
- if (reply)
|
|
- {
|
|
- dbus_message_get_args (reply, NULL,
|
|
- DBUS_TYPE_DOUBLE, &mShadowOptions.shadow_radius,
|
|
- DBUS_TYPE_INVALID);
|
|
-
|
|
- dbus_message_unref (reply);
|
|
- }
|
|
-
|
|
- reply = sendAndBlockForShadowOptionReply (DBUS_PATH "/shadow_opacity");
|
|
- if (reply)
|
|
- {
|
|
- dbus_message_get_args (reply, NULL,
|
|
- DBUS_TYPE_DOUBLE, &mShadowOptions.shadow_opacity,
|
|
- DBUS_TYPE_INVALID);
|
|
- dbus_message_unref (reply);
|
|
- }
|
|
-
|
|
- reply = sendAndBlockForShadowOptionReply (DBUS_PATH "/shadow_color");
|
|
- if (reply)
|
|
- {
|
|
- DBusError error;
|
|
- char *str;
|
|
-
|
|
- dbus_error_init (&error);
|
|
-
|
|
- dbus_message_get_args (reply, &error,
|
|
- DBUS_TYPE_STRING, &str,
|
|
- DBUS_TYPE_INVALID);
|
|
-
|
|
- if (!dbus_error_is_set (&error))
|
|
- {
|
|
- int c[4];
|
|
-
|
|
- if (sscanf (str, "#%2x%2x%2x%2x", &c[0], &c[1], &c[2], &c[3]) == 4)
|
|
- {
|
|
- mShadowOptions.shadow_color[0] = c[0] << 8 | c[0];
|
|
- mShadowOptions.shadow_color[1] = c[1] << 8 | c[1];
|
|
- mShadowOptions.shadow_color[2] = c[2] << 8 | c[2];
|
|
- }
|
|
- }
|
|
-
|
|
- dbus_error_free (&error);
|
|
-
|
|
- dbus_message_unref (reply);
|
|
- }
|
|
-
|
|
- reply = sendAndBlockForShadowOptionReply (DBUS_PATH "/shadow_x_offset");
|
|
- if (reply)
|
|
- {
|
|
- dbus_message_get_args (reply, NULL,
|
|
- DBUS_TYPE_INT32, &mShadowOptions.shadow_offset_x,
|
|
- DBUS_TYPE_INVALID);
|
|
- dbus_message_unref (reply);
|
|
- }
|
|
-
|
|
- reply = sendAndBlockForShadowOptionReply (DBUS_PATH "/shadow_y_offset");
|
|
- if (reply)
|
|
- {
|
|
- dbus_message_get_args (reply, NULL,
|
|
- DBUS_TYPE_INT32, &mShadowOptions.shadow_offset_y,
|
|
- DBUS_TYPE_INVALID);
|
|
- dbus_message_unref (reply);
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::changeShadowOptions (decor_shadow_options_t *opt)
|
|
-{
|
|
- QMap <WId, KWD::Window *>::ConstIterator it;
|
|
-
|
|
- if (!memcmp (opt, &mShadowOptions, sizeof (decor_shadow_options_t)))
|
|
- return;
|
|
-
|
|
- mShadowOptions = *opt;
|
|
-
|
|
- updateShadow ();
|
|
-
|
|
- mDecorNormal->reloadDecoration ();
|
|
- mDecorActive->reloadDecoration ();
|
|
-
|
|
- for (it = mClients.constBegin (); it != mClients.constEnd (); it++)
|
|
- it.data ()->reloadDecoration ();
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::updateShadow (void)
|
|
-{
|
|
- Display *xdisplay = qt_xdisplay ();
|
|
- Screen *xscreen = ScreenOfDisplay (xdisplay, qt_xscreen ());
|
|
- decor_context_t context;
|
|
-
|
|
- if (mDefaultShadow)
|
|
- {
|
|
- decor_shadow_destroy (xdisplay, mDefaultShadow);
|
|
- mDefaultShadow = NULL;
|
|
- }
|
|
-
|
|
- if (mNoBorderShadow)
|
|
- decor_shadow_destroy (xdisplay, mNoBorderShadow);
|
|
-
|
|
- mNoBorderShadow = decor_shadow_create (xdisplay,
|
|
- xscreen,
|
|
- 1, 1,
|
|
- 0,
|
|
- 0,
|
|
- 0,
|
|
- 0,
|
|
- 0, 0, 0, 0,
|
|
- &mShadowOptions,
|
|
- &context,
|
|
- decor_draw_simple,
|
|
- 0);
|
|
-
|
|
- if (mNoBorderShadow)
|
|
- {
|
|
- decor_extents_t extents = { 0, 0, 0, 0 };
|
|
- long data[256];
|
|
- decor_quad_t quads[N_QUADS_MAX];
|
|
- int nQuad;
|
|
- decor_layout_t layout;
|
|
-
|
|
- decor_get_default_layout (&context, 1, 1, &layout);
|
|
-
|
|
- nQuad = decor_set_lSrStSbS_window_quads (quads, &context, &layout);
|
|
-
|
|
- decor_quads_to_property (data, mNoBorderShadow->pixmap,
|
|
- &extents, &extents,
|
|
- 0, 0, quads, nQuad);
|
|
-
|
|
- KWD::trapXError ();
|
|
- XChangeProperty (qt_xdisplay (), qt_xrootwin (),
|
|
- Atoms::netWindowDecorBare,
|
|
- XA_INTEGER,
|
|
- 32, PropModeReplace, (unsigned char *) data,
|
|
- BASE_PROP_SIZE + QUAD_PROP_SIZE * nQuad);
|
|
- KWD::popXError ();
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::processDamage (void)
|
|
-{
|
|
- QMap <WId, KWD::Window *>::ConstIterator it;
|
|
-
|
|
- mDecorNormal->processDamage ();
|
|
- mDecorActive->processDamage ();
|
|
-
|
|
- for (it = mClients.constBegin (); it != mClients.constEnd (); it++)
|
|
- it.data ()->processDamage ();
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Decorator::x11EventFilter (XEvent *xevent)
|
|
-{
|
|
- KWD::Window *client;
|
|
- int status;
|
|
-
|
|
- switch (xevent->type) {
|
|
- case MapNotify: {
|
|
- XMapEvent *xme = reinterpret_cast <XMapEvent *> (xevent);
|
|
-
|
|
- if (mWindows.contains (xme->window))
|
|
- client = mWindows[xme->window];
|
|
- else if (mDecorNormal->winId () == xme->window)
|
|
- client = mDecorNormal;
|
|
- else if (mDecorActive->winId () == xme->window)
|
|
- client = mDecorActive;
|
|
- else
|
|
- break;
|
|
-
|
|
- if (client->handleMap ())
|
|
- {
|
|
- if (!mIdleTimer.isActive ())
|
|
- mIdleTimer.start (0, TRUE);
|
|
- }
|
|
- } break;
|
|
- case ConfigureNotify: {
|
|
- XConfigureEvent *xce = reinterpret_cast <XConfigureEvent *> (xevent);
|
|
-
|
|
- if (mFrames.contains (xce->window))
|
|
- mFrames[xce->window]->updateFrame (xce->window);
|
|
-
|
|
- if (mWindows.contains (xce->window))
|
|
- client = mWindows[xce->window];
|
|
- else if (mDecorNormal->winId () == xce->window)
|
|
- client = mDecorNormal;
|
|
- else if (mDecorActive->winId () == xce->window)
|
|
- client = mDecorActive;
|
|
- else
|
|
- break;
|
|
-
|
|
- if (client->handleConfigure (QSize (xce->width, xce->height)))
|
|
- {
|
|
- if (!mIdleTimer.isActive ())
|
|
- mIdleTimer.start (0, TRUE);
|
|
- }
|
|
- } break;
|
|
- case SelectionRequest:
|
|
- decor_handle_selection_request (qt_xdisplay (), xevent, mDmSnTimestamp);
|
|
- break;
|
|
- case SelectionClear:
|
|
- status = decor_handle_selection_clear (qt_xdisplay (),
|
|
- xevent, 0);
|
|
- if (status == DECOR_SELECTION_GIVE_UP)
|
|
- KApplication::exit (0);
|
|
-
|
|
- break;
|
|
- case PropertyNotify:
|
|
- if (xevent->xproperty.atom == Atoms::netFrameWindow)
|
|
- {
|
|
- handleWindowAdded (xevent->xproperty.window);
|
|
- }
|
|
- else if (xevent->xproperty.atom == Atoms::switchSelectWindow)
|
|
- {
|
|
- if (!mClients.contains (xevent->xproperty.window))
|
|
- {
|
|
- handleWindowAdded (xevent->xproperty.window);
|
|
- }
|
|
- else
|
|
- {
|
|
- WId id;
|
|
-
|
|
- if (KWD::readWindowProperty (xevent->xproperty.window,
|
|
- Atoms::switchSelectWindow,
|
|
- (long *) &id))
|
|
- mClients[xevent->xproperty.window]->updateSelected (id);
|
|
- }
|
|
- }
|
|
- else if (xevent->xproperty.atom == Atoms::netWmWindowOpacity)
|
|
- {
|
|
- if (mClients.contains (xevent->xproperty.window))
|
|
- mClients[xevent->xproperty.window]->updateOpacity ();
|
|
- }
|
|
- break;
|
|
- case EnterNotify:
|
|
- {
|
|
- XCrossingEvent *xce = reinterpret_cast <XCrossingEvent *> (xevent);
|
|
- QWidget *widget, *child;
|
|
-
|
|
- if (!mFrames.contains (xce->window))
|
|
- break;
|
|
-
|
|
- client = mFrames[xce->window];
|
|
-
|
|
- widget = client->decoration ()->widget ();
|
|
- child = widget->childAt (xce->x, xce->y, true);
|
|
- if (child)
|
|
- {
|
|
- QEvent qe (QEvent::Enter);
|
|
-
|
|
- QApplication::sendEvent (child, &qe);
|
|
-
|
|
- client->setActiveChild (child);
|
|
- client->updateCursor (QPoint (xce->x, xce->y));
|
|
- }
|
|
- } break;
|
|
- case LeaveNotify:
|
|
- {
|
|
- XCrossingEvent *xce = reinterpret_cast <XCrossingEvent *> (xevent);
|
|
-
|
|
- if (mFrames.contains (xce->window))
|
|
- {
|
|
- QEvent qe (QEvent::Leave);
|
|
-
|
|
- client = mFrames[xce->window];
|
|
-
|
|
- QApplication::sendEvent (client->activeChild (), &qe);
|
|
-
|
|
- XUndefineCursor (qt_xdisplay (), client->frameId ());
|
|
- }
|
|
- } break;
|
|
- case MotionNotify:
|
|
- {
|
|
- XMotionEvent *xme = reinterpret_cast < XMotionEvent * >(xevent);
|
|
- QWidget *widget, *child;
|
|
-
|
|
- if (!mFrames.contains (xme->window))
|
|
- break;
|
|
-
|
|
- client = mFrames[xme->window];
|
|
-
|
|
- widget = client->decoration ()->widget ();
|
|
- child = widget->childAt (xme->x, xme->y, true);
|
|
- if (child)
|
|
- {
|
|
- QPoint qp (xme->x, xme->y);
|
|
-
|
|
- if (child != client->activeChild ())
|
|
- {
|
|
- QEvent qee (QEvent::Enter);
|
|
- QEvent qle (QEvent::Leave);
|
|
-
|
|
- if (client->activeChild ())
|
|
- QApplication::sendEvent (client->activeChild (), &qle);
|
|
-
|
|
- QApplication::sendEvent (child, &qee);
|
|
-
|
|
- client->setActiveChild (child);
|
|
- }
|
|
-
|
|
- if (widget != child)
|
|
- qp -= QPoint (child->pos ().x (), child->pos ().y ());
|
|
-
|
|
- QMouseEvent qme (QEvent::MouseMove, qp, Qt::NoButton, Qt::NoButton);
|
|
-
|
|
- QApplication::sendEvent (child, &qme);
|
|
-
|
|
- client->updateCursor (QPoint (xme->x, xme->y));
|
|
- }
|
|
- } break;
|
|
- case ButtonPress:
|
|
- case ButtonRelease:
|
|
- {
|
|
- XButtonEvent *xbe = reinterpret_cast <XButtonEvent *>(xevent);
|
|
- QWidget *widget, *child;
|
|
-
|
|
- if (!mFrames.contains (xbe->window))
|
|
- break;
|
|
-
|
|
- client = mFrames[xbe->window];
|
|
-
|
|
- widget = client->decoration ()->widget ();
|
|
- child = widget->childAt (xbe->x, xbe->y, true);
|
|
-
|
|
- if (child)
|
|
- {
|
|
- XButtonEvent xbe2 = *xbe;
|
|
-
|
|
- xbe2.window = child->winId ();
|
|
- if (widget != child)
|
|
- {
|
|
- xbe2.x = xbe->x - child->pos ().x ();
|
|
- xbe2.y = xbe->y - child->pos ().y ();
|
|
- }
|
|
-
|
|
- QApplication::x11ProcessEvent ((XEvent *) &xbe2);
|
|
-
|
|
- return true;
|
|
- }
|
|
- } break;
|
|
- case ClientMessage:
|
|
- if (xevent->xclient.message_type == Atoms::toolkitActionAtom)
|
|
- {
|
|
- unsigned long action;
|
|
-
|
|
- action = xevent->xclient.data.l[0];
|
|
- if (action == Atoms::toolkitActionWindowMenuAtom)
|
|
- {
|
|
- if (mClients.contains (xevent->xclient.window))
|
|
- {
|
|
- QPoint pos;
|
|
-
|
|
- client = mClients[xevent->xclient.window];
|
|
-
|
|
- if (xevent->xclient.data.l[2])
|
|
- {
|
|
- pos = QPoint (xevent->xclient.data.l[3],
|
|
- xevent->xclient.data.l[4]);
|
|
- }
|
|
- else
|
|
- {
|
|
- pos = client->clientGeometry ().topLeft ();
|
|
- }
|
|
-
|
|
- client->showWindowMenu (pos);
|
|
- }
|
|
- }
|
|
- else if (action == Atoms::toolkitActionForceQuitDialogAtom)
|
|
- {
|
|
- if (mClients.contains (xevent->xclient.window))
|
|
- {
|
|
- Time timestamp = xevent->xclient.data.l[1];
|
|
-
|
|
- client = mClients[xevent->xclient.window];
|
|
-
|
|
- if (xevent->xclient.data.l[2])
|
|
- client->showKillProcessDialog (timestamp);
|
|
- else
|
|
- client->hideKillProcessDialog ();
|
|
- }
|
|
- }
|
|
- }
|
|
- break;
|
|
- default:
|
|
- if (xevent->type == mDamageEvent + XDamageNotify)
|
|
- {
|
|
- XDamageNotifyEvent *xde =
|
|
- reinterpret_cast <XDamageNotifyEvent *>(xevent);
|
|
-
|
|
- if (mWindows.contains (xde->drawable))
|
|
- client = mWindows[xde->drawable];
|
|
- else if (mDecorNormal->winId () == xde->drawable)
|
|
- client = mDecorNormal;
|
|
- else if (mDecorActive->winId () == xde->drawable)
|
|
- client = mDecorActive;
|
|
- else
|
|
- break;
|
|
-
|
|
- client->addDamageRect (xde->area.x,
|
|
- xde->area.y,
|
|
- xde->area.width,
|
|
- xde->area.height);
|
|
-
|
|
- if (client->pixmapId ())
|
|
- {
|
|
- if (!mIdleTimer.isActive ())
|
|
- mIdleTimer.start (0, TRUE);
|
|
- }
|
|
-
|
|
- return true;
|
|
- }
|
|
- break;
|
|
- }
|
|
-
|
|
- return KApplication::x11EventFilter (xevent);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::reconfigure (void)
|
|
-{
|
|
- unsigned long changed;
|
|
-
|
|
- mConfig->reparseConfiguration ();
|
|
-
|
|
- changed = mOptions->updateSettings ();
|
|
- if (mPlugins->reset (changed))
|
|
- {
|
|
- QMap < WId, KWD::Window * >::ConstIterator it;
|
|
-
|
|
- updateShadow ();
|
|
-
|
|
- mDecorNormal->reloadDecoration ();
|
|
- mDecorActive->reloadDecoration ();
|
|
-
|
|
- for (it = mClients.constBegin (); it != mClients.constEnd (); it++)
|
|
- it.data ()->reloadDecoration ();
|
|
-
|
|
- mPlugins->destroyPreviousPlugin ();
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::handleWindowAdded (WId id)
|
|
-{
|
|
- QMap <WId, KWD::Window *>::ConstIterator it;
|
|
- KWD::Window *client = 0;
|
|
- WId select, frame = 0;
|
|
- KWD::Window::Type type;
|
|
- unsigned int width, height, border, depth;
|
|
- int x, y;
|
|
- XID root;
|
|
- QWidgetList *widgets;
|
|
-
|
|
- /* avoid adding any of our own top level windows */
|
|
- widgets = QApplication::topLevelWidgets ();
|
|
- if (widgets)
|
|
- {
|
|
- for (QWidgetListIt it (*widgets); it.current (); ++it)
|
|
- {
|
|
- if (it.current ()->winId () == id)
|
|
- {
|
|
- delete widgets;
|
|
- return;
|
|
- }
|
|
- }
|
|
-
|
|
- delete widgets;
|
|
- }
|
|
-
|
|
- KWD::trapXError ();
|
|
- XGetGeometry (qt_xdisplay (), id, &root, &x, &y, &width, &height,
|
|
- &border, &depth);
|
|
- if (KWD::popXError ())
|
|
- return;
|
|
-
|
|
- KWD::readWindowProperty (id, Atoms::netFrameWindow, (long *) &frame);
|
|
- if (KWD::readWindowProperty (id, Atoms::switchSelectWindow,
|
|
- (long *) &select))
|
|
- {
|
|
- type = KWD::Window::Switcher;
|
|
- }
|
|
- else
|
|
- {
|
|
- KWin::WindowInfo wInfo = KWin::windowInfo (id, NET::WMWindowType, 0);
|
|
-
|
|
- switch (wInfo.windowType (~0)) {
|
|
- case NET::Normal:
|
|
- case NET::Dialog:
|
|
- case NET::Toolbar:
|
|
- case NET::Menu:
|
|
- case NET::Utility:
|
|
- case NET::Splash:
|
|
- case NET::Unknown:
|
|
- /* decorate these window types */
|
|
- break;
|
|
- default:
|
|
- return;
|
|
- }
|
|
-
|
|
- type = KWD::Window::Normal;
|
|
- }
|
|
-
|
|
- KWD::trapXError ();
|
|
- XSelectInput (qt_xdisplay (), id, StructureNotifyMask | PropertyChangeMask);
|
|
- KWD::popXError ();
|
|
-
|
|
- if (frame)
|
|
- {
|
|
- if (!mClients.contains (id))
|
|
- {
|
|
- client = new KWD::Window (mCompositeWindow, id, frame, type,
|
|
- x, y,
|
|
- width + border * 2,
|
|
- height + border * 2);
|
|
-
|
|
- mClients.insert (id, client);
|
|
- mWindows.insert (client->winId (), client);
|
|
- mFrames.insert (frame, client);
|
|
- }
|
|
- else
|
|
- {
|
|
- client = mClients[id];
|
|
- mFrames.remove (client->frameId ());
|
|
- mFrames.insert (frame, client);
|
|
-
|
|
- client->updateFrame (frame);
|
|
- }
|
|
- }
|
|
- else if (type == KWD::Window::Switcher)
|
|
- {
|
|
- if (!mClients.contains (id))
|
|
- {
|
|
- client = new KWD::Window (mCompositeWindow, id, 0, type,
|
|
- x, y,
|
|
- width + border * 2,
|
|
- height + border * 2);
|
|
- mClients.insert (id, client);
|
|
- mWindows.insert (client->winId (), client);
|
|
- }
|
|
- }
|
|
- else
|
|
- {
|
|
- if (mClients.contains (id))
|
|
- client = mClients[id];
|
|
-
|
|
- if (client)
|
|
- {
|
|
- mClients.remove (client->windowId ());
|
|
- mWindows.remove (client->winId ());
|
|
- mFrames.remove (client->frameId ());
|
|
-
|
|
- delete client;
|
|
- }
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::handleWindowRemoved (WId id)
|
|
-{
|
|
- KWD::Window *window = 0;
|
|
-
|
|
- if (mClients.contains (id))
|
|
- window = mClients[id];
|
|
- else if (mFrames.contains (id))
|
|
- window = mFrames[id];
|
|
-
|
|
- if (window)
|
|
- {
|
|
- mClients.remove (window->windowId ());
|
|
- mWindows.remove (window->winId ());
|
|
- mFrames.remove (window->frameId ());
|
|
-
|
|
- delete window;
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::handleActiveWindowChanged (WId id)
|
|
-{
|
|
- if (id != mActiveId)
|
|
- {
|
|
- KWD::Window *newActiveWindow = 0;
|
|
- KWD::Window *oldActiveWindow = 0;
|
|
-
|
|
- if (mClients.contains (id))
|
|
- newActiveWindow = mClients[id];
|
|
-
|
|
- if (mClients.contains (mActiveId))
|
|
- oldActiveWindow = mClients[mActiveId];
|
|
-
|
|
- mActiveId = id;
|
|
-
|
|
- if (oldActiveWindow)
|
|
- oldActiveWindow->handleActiveChange ();
|
|
-
|
|
- if (newActiveWindow)
|
|
- newActiveWindow->handleActiveChange ();
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::handleWindowChanged (WId id,
|
|
- const unsigned long *properties)
|
|
-{
|
|
- KWD::Window *client;
|
|
-
|
|
- if (!mClients.contains (id))
|
|
- return;
|
|
-
|
|
- client = mClients[id];
|
|
-
|
|
- if (properties[0] & NET::WMName)
|
|
- client->updateName ();
|
|
- if (properties[0] & NET::WMVisibleName)
|
|
- client->updateName ();
|
|
- if (properties[0] & NET::WMState)
|
|
- client->updateState ();
|
|
- if (properties[0] & NET::WMIcon)
|
|
- client->updateIcons ();
|
|
- if (properties[0] & NET::WMGeometry)
|
|
- client->updateWindowGeometry ();
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::sendClientMessage (WId eventWid,
|
|
- WId wid,
|
|
- Atom atom,
|
|
- Atom value,
|
|
- long data1,
|
|
- long data2,
|
|
- long data3)
|
|
-{
|
|
- XEvent ev;
|
|
- long mask = 0;
|
|
-
|
|
- memset (&ev, 0, sizeof (ev));
|
|
-
|
|
- ev.xclient.type = ClientMessage;
|
|
- ev.xclient.window = wid;
|
|
- ev.xclient.message_type = atom;
|
|
- ev.xclient.format = 32;
|
|
-
|
|
- ev.xclient.data.l[0] = value;
|
|
- ev.xclient.data.l[1] = qt_x_time;
|
|
- ev.xclient.data.l[2] = data1;
|
|
- ev.xclient.data.l[3] = data2;
|
|
- ev.xclient.data.l[4] = data3;
|
|
-
|
|
- if (eventWid == qt_xrootwin ())
|
|
- mask = SubstructureRedirectMask | SubstructureNotifyMask;
|
|
-
|
|
- KWD::trapXError ();
|
|
- XSendEvent (qt_xdisplay (), eventWid, false, mask, &ev);
|
|
- KWD::popXError ();
|
|
-}
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator/decorator.h compiz-0.8.8/kde/window-decorator/decorator.h
|
|
--- compiz-0.8.8-orig/kde/window-decorator/decorator.h 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator/decorator.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,183 +0,0 @@
|
|
-/*
|
|
- * Copyright © 2006 Novell, Inc.
|
|
- * Copyright © 2006 Dennis Kasprzyk <onestone@beryl-project.org>
|
|
- * Copyright © 2006 Volker Krause <vkrause@kde.org>
|
|
- *
|
|
- * 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., 51 Franklin Street, Fifth Floor, Boston,
|
|
- * MA 02110-1301, USA.
|
|
- *
|
|
- * Author: David Reveman <davidr@novell.com>
|
|
- */
|
|
-
|
|
-#ifndef _DECORATOR_H
|
|
-#define _DECORATOR_H
|
|
-
|
|
-#include <kapplication.h>
|
|
-
|
|
-#include <X11/Xlib.h>
|
|
-#include <X11/Xatom.h>
|
|
-#include <X11/cursorfont.h>
|
|
-
|
|
-#include <qtimer.h>
|
|
-
|
|
-#include <fixx11h.h>
|
|
-#include <kconfig.h>
|
|
-#include <kdecoration_plugins_p.h>
|
|
-#include <kdecoration_p.h>
|
|
-#include <netwm.h>
|
|
-
|
|
-#include <decoration.h>
|
|
-
|
|
-#define DBUS_API_SUBJECT_TO_CHANGE
|
|
-#include <dbus/connection.h>
|
|
-
|
|
-#include "window.h"
|
|
-#include "KWinInterface.h"
|
|
-
|
|
-#define ROOT_OFF_X 8192
|
|
-#define ROOT_OFF_Y 8192
|
|
-
|
|
-#define C(name) { 0, XC_ ## name }
|
|
-
|
|
-struct _cursor {
|
|
- Cursor cursor;
|
|
- unsigned int shape;
|
|
-};
|
|
-
|
|
-extern struct _cursor cursors[3][3];
|
|
-
|
|
-extern double decorationOpacity;
|
|
-extern bool decorationOpacityShade;
|
|
-extern double activeDecorationOpacity;
|
|
-extern bool activeDecorationOpacityShade;
|
|
-
|
|
-#define BLUR_TYPE_NONE 0
|
|
-#define BLUR_TYPE_TITLEBAR 1
|
|
-#define BLUR_TYPE_ALL 2
|
|
-
|
|
-extern int blurType;
|
|
-
|
|
-class KConfig;
|
|
-class KWinModule;
|
|
-
|
|
-namespace KWD
|
|
-{
|
|
- class Options;
|
|
-
|
|
-class PluginManager:public KDecorationPlugins {
|
|
- public:
|
|
- PluginManager (KConfig *config);
|
|
- virtual bool provides (Requirement)
|
|
- {
|
|
- return false;
|
|
- }
|
|
- };
|
|
-
|
|
-
|
|
-class Decorator:public KApplication, public KWinInterface {
|
|
- Q_OBJECT public:
|
|
- Decorator (void);
|
|
- ~Decorator (void);
|
|
-
|
|
- static NETRootInfo *rootInfo (void)
|
|
- {
|
|
- return mRootInfo;
|
|
- }
|
|
- static PluginManager *pluginManager (void)
|
|
- {
|
|
- return mPlugins;
|
|
- }
|
|
- static KWD::Options *options (void)
|
|
- {
|
|
- return mOptions;
|
|
- }
|
|
- static WId activeId (void)
|
|
- {
|
|
- return mActiveId;
|
|
- }
|
|
- static decor_shadow_options_t *shadowOptions (void)
|
|
- {
|
|
- return &mShadowOptions;
|
|
- }
|
|
- static decor_shadow_t *defaultWindowShadow (decor_context_t *context,
|
|
- decor_extents_t *border)
|
|
- {
|
|
- if (!mDefaultShadow)
|
|
- return NULL;
|
|
-
|
|
- if (memcmp (border, &mDefaultBorder, sizeof (decor_extents_t)) != 0)
|
|
- return NULL;
|
|
-
|
|
- *context = mDefaultContext;
|
|
- return mDefaultShadow;
|
|
- }
|
|
- static void sendClientMessage (WId eventWid,
|
|
- WId wid,
|
|
- Atom atom,
|
|
- Atom value,
|
|
- long data1 = 0,
|
|
- long data2 = 0,
|
|
- long data3 = 0);
|
|
- static void updateDefaultShadow (KWD::Window *w);
|
|
-
|
|
- bool enableDecorations (Time timestamp, int damageEvent);
|
|
- bool x11EventFilter (XEvent *xevent);
|
|
- void changeShadowOptions (decor_shadow_options_t *opt);
|
|
-
|
|
- public slots:
|
|
- void reconfigure (void);
|
|
-
|
|
- private:
|
|
- DBusMessage *sendAndBlockForShadowOptionReply (const char *path);
|
|
- WId fetchFrame (WId window);
|
|
- void updateShadow (void);
|
|
- void updateAllShadowOptions (void);
|
|
-
|
|
- private slots:
|
|
- void handleWindowAdded (WId id);
|
|
- void handleWindowRemoved (WId id);
|
|
- void handleActiveWindowChanged (WId id);
|
|
- void handleWindowChanged (WId id,
|
|
- const unsigned long *properties);
|
|
- void processDamage (void);
|
|
-
|
|
- private:
|
|
- static PluginManager *mPlugins;
|
|
- static KWD::Options *mOptions;
|
|
- static decor_extents_t mDefaultBorder;
|
|
- static decor_context_t mDefaultContext;
|
|
- static decor_shadow_t *mDefaultShadow;
|
|
- static decor_shadow_t *mNoBorderShadow;
|
|
- static decor_shadow_options_t mShadowOptions;
|
|
- static NETRootInfo *mRootInfo;
|
|
- static WId mActiveId;
|
|
-
|
|
- KWD::Window *mDecorNormal;
|
|
- KWD::Window *mDecorActive;
|
|
- QMap <WId, KWD::Window *>mClients;
|
|
- QMap <WId, KWD::Window *>mFrames;
|
|
- QMap <WId, KWD::Window *>mWindows;
|
|
- KConfig *mConfig;
|
|
- Time mDmSnTimestamp;
|
|
- int mDamageEvent;
|
|
- QTimer mIdleTimer;
|
|
- KWinModule *mKWinModule;
|
|
- DBusConnection *mDBusConnection;
|
|
- DBusQt::Connection mDBusQtConnection;
|
|
- WId mCompositeWindow;
|
|
- };
|
|
-}
|
|
-
|
|
-#endif
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator/KWinInterface.h compiz-0.8.8/kde/window-decorator/KWinInterface.h
|
|
--- compiz-0.8.8-orig/kde/window-decorator/KWinInterface.h 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator/KWinInterface.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,17 +0,0 @@
|
|
-// taken from KWin
|
|
-
|
|
-#ifndef KWIN_INTERFACE_H
|
|
-#define KWIN_INTERFACE_H
|
|
-
|
|
-#include <dcopobject.h>
|
|
-
|
|
-class KWinInterface:virtual public DCOPObject
|
|
-{
|
|
- K_DCOP
|
|
-
|
|
- k_dcop:
|
|
-
|
|
- virtual ASYNC reconfigure () = 0;
|
|
-};
|
|
-
|
|
-#endif
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator/main.cpp compiz-0.8.8/kde/window-decorator/main.cpp
|
|
--- compiz-0.8.8-orig/kde/window-decorator/main.cpp 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator/main.cpp 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,143 +0,0 @@
|
|
-/*
|
|
- * Copyright © 2006 Novell, Inc.
|
|
- * Copyright © 2006 Dennis Kasprzyk <onestone@beryl-project.org>
|
|
- * Copyright © 2006 Volker Krause <vkrause@kde.org>
|
|
- *
|
|
- * 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., 51 Franklin Street, Fifth Floor, Boston,
|
|
- * MA 02110-1301, USA.
|
|
- *
|
|
- * Author: David Reveman <davidr@novell.com>
|
|
- */
|
|
-
|
|
-#include <X11/Xlib.h>
|
|
-#include <X11/extensions/Xdamage.h>
|
|
-
|
|
-#include <fixx11h.h>
|
|
-#include <kapplication.h>
|
|
-#include <kcmdlineargs.h>
|
|
-#include <klocale.h>
|
|
-
|
|
-#include "decorator.h"
|
|
-
|
|
-static const KCmdLineOptions options[] = {
|
|
- { "replace", "Replace existing window decorator", 0 },
|
|
- { "sm-disable", "Disable connection to session manager", 0 },
|
|
- { "opacity <value>", "Decoration opacity", "0.75" },
|
|
- { "no-opacity-shade", "No decoration opacity shading", 0 },
|
|
- { "active-opacity <value>", "Active decoration opacity", "1.0" },
|
|
- { "no-active-opacity-shade", "No active decoration opacity shading", 0 },
|
|
- { "blur <type>", "Blur type", "none" },
|
|
- KCmdLineLastOption
|
|
-};
|
|
-
|
|
-#include <kdebug.h>
|
|
-int
|
|
-main (int argc, char **argv)
|
|
-{
|
|
- KWD::Decorator *app;
|
|
- KCmdLineArgs *args;
|
|
- int status;
|
|
- int event, error;
|
|
- Time timestamp;
|
|
-
|
|
- KLocale::setMainCatalogue("kwin");
|
|
-
|
|
- KCmdLineArgs::init (argc, argv,
|
|
- "kde-window-decorator",
|
|
- "KWD",
|
|
- "KDE Window Decorator",
|
|
- "0.0.1");
|
|
- KCmdLineArgs::addCmdLineOptions (options);
|
|
- args = KCmdLineArgs::parsedArgs ();
|
|
-
|
|
- if (args->isSet ("opacity"))
|
|
- decorationOpacity = args->getOption ("opacity").toDouble ();
|
|
-
|
|
- if (args->isSet ("-opacity-shade"))
|
|
- decorationOpacityShade = true;
|
|
-
|
|
- if (args->isSet ("active-opacity"))
|
|
- activeDecorationOpacity =
|
|
- args->getOption ("active-opacity").toDouble ();
|
|
-
|
|
- if (args->isSet ("-active-opacity-shade"))
|
|
- activeDecorationOpacityShade = true;
|
|
-
|
|
- if (args->isSet ("blur"))
|
|
- {
|
|
- QString blur = args->getOption ("blur");
|
|
-
|
|
- if (blur == QString ("titlebar"))
|
|
- blurType = BLUR_TYPE_TITLEBAR;
|
|
- else if (blur == QString ("all"))
|
|
- blurType = BLUR_TYPE_ALL;
|
|
- }
|
|
-
|
|
- app = new KWD::Decorator ();
|
|
-
|
|
- if (args->isSet ("sm-disable"))
|
|
- app->disableSessionManagement ();
|
|
-
|
|
- if (!XDamageQueryExtension (qt_xdisplay (), &event, &error))
|
|
- {
|
|
- fprintf (stderr,
|
|
- "%s: Damage extension is missing on display \"%s\"\n",
|
|
- argv[0], DisplayString (qt_xdisplay ()));
|
|
-
|
|
- return 1;
|
|
- }
|
|
-
|
|
- status = decor_acquire_dm_session (qt_xdisplay (), qt_xscreen (), "kwd",
|
|
- args->isSet ("replace"),
|
|
- ×tamp);
|
|
- if (status != DECOR_ACQUIRE_STATUS_SUCCESS)
|
|
- {
|
|
- if (status == DECOR_ACQUIRE_STATUS_FAILED)
|
|
- {
|
|
- fprintf (stderr,
|
|
- "%s: Could not acquire decoration manager "
|
|
- "selection on screen %d display \"%s\"\n",
|
|
- argv[0], qt_xscreen (), DisplayString (qt_xdisplay ()));
|
|
- }
|
|
- else if (status == DECOR_ACQUIRE_STATUS_OTHER_DM_RUNNING)
|
|
- {
|
|
- fprintf (stderr,
|
|
- "%s: Screen %d on display \"%s\" already "
|
|
- "has a decoration manager; try using the "
|
|
- "--replace option to replace the current "
|
|
- "decoration manager.\n",
|
|
- argv[0], qt_xscreen (), DisplayString (qt_xdisplay ()));
|
|
- }
|
|
-
|
|
- return 1;
|
|
- }
|
|
-
|
|
- decor_set_dm_check_hint (qt_xdisplay (), qt_xscreen ());
|
|
-
|
|
- if (!app->enableDecorations (timestamp, event))
|
|
- {
|
|
- fprintf (stderr,
|
|
- "%s: Could not enable decorations on display \"%s\"\n",
|
|
- argv[0], DisplayString (qt_xdisplay ()));
|
|
-
|
|
- return 1;
|
|
- }
|
|
-
|
|
- status = app->exec ();
|
|
-
|
|
- delete app;
|
|
-
|
|
- return status;
|
|
-}
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator/Makefile.am compiz-0.8.8/kde/window-decorator/Makefile.am
|
|
--- compiz-0.8.8-orig/kde/window-decorator/Makefile.am 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator/Makefile.am 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,44 +0,0 @@
|
|
-if USE_KDE
|
|
-
|
|
-BUILDSOURCES = \
|
|
- decorator.moc.cpp \
|
|
- window.moc.cpp \
|
|
- KWinInterface_skel.cpp
|
|
-
|
|
-kde_window_decorator_DEPENDENCIES = \
|
|
- $(top_builddir)/libdecoration/libdecoration.la
|
|
-kde_window_decorator_LDADD = \
|
|
- $(top_builddir)/libdecoration/libdecoration.la \
|
|
- @KDE_WINDOW_DECORATOR_LIBS@ @KDE_LIBS@
|
|
-dist_kde_window_decorator_SOURCES = \
|
|
- main.cpp \
|
|
- utils.cpp \
|
|
- utils.h \
|
|
- decorator.cpp \
|
|
- decorator.h \
|
|
- window.cpp \
|
|
- window.h \
|
|
- options.cpp \
|
|
- options.h \
|
|
- KWinInterface.h
|
|
-
|
|
-nodist_kde_window_decorator_SOURCES = $(BUILDSOURCES)
|
|
-
|
|
-kde_window_decorator_program = kde-window-decorator
|
|
-
|
|
-INCLUDES = -I$(top_srcdir)/include @KDE_WINDOW_DECORATOR_CFLAGS@ @KDE_CFLAGS@
|
|
-
|
|
-bin_PROGRAMS = $(kde_window_decorator_program)
|
|
-
|
|
-%.moc.cpp: %.h
|
|
- $(QT_MOC) $< > $@
|
|
-
|
|
-%.kidl: %.h
|
|
- $(DCOPIDL) $< > $@
|
|
-
|
|
-%_skel.cpp: %.kidl
|
|
- $(DCOPIDL2CPP) $< > $@
|
|
-
|
|
-CLEANFILES = $(BUILDSOURCES) KWinInterface_skel.* KWinInterface_stub.*
|
|
-
|
|
-endif
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator/options.cpp compiz-0.8.8/kde/window-decorator/options.cpp
|
|
--- compiz-0.8.8-orig/kde/window-decorator/options.cpp 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator/options.cpp 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,187 +0,0 @@
|
|
-/*
|
|
- * Copyright © 2006 Novell, Inc.
|
|
- * Copyright © 2006 Dennis Kasprzyk <onestone@beryl-project.org>
|
|
- * Copyright © 2006 Volker Krause <vkrause@kde.org>
|
|
- *
|
|
- * 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., 51 Franklin Street, Fifth Floor, Boston,
|
|
- * MA 02110-1301, USA.
|
|
- *
|
|
- * Author: David Reveman <davidr@novell.com>
|
|
- */
|
|
-
|
|
-#include "options.h"
|
|
-
|
|
-#include <kconfig.h>
|
|
-#include <kdecoration_p.h>
|
|
-
|
|
-KWD::Options::Options (KConfig *config): KDecorationOptions (), mConfig (config)
|
|
-{
|
|
- d = new KDecorationOptionsPrivate;
|
|
- updateSettings ();
|
|
-}
|
|
-
|
|
-unsigned long
|
|
-KWD::Options::updateSettings (void)
|
|
-{
|
|
- unsigned long changed = 0;
|
|
-
|
|
- changed |= d->updateKWinSettings (mConfig);
|
|
-
|
|
- mConfig->setGroup ("Windows");
|
|
-
|
|
- OpTitlebarDblClick =
|
|
- windowOperation (mConfig->readEntry ("TitlebarDoubleClickCommand",
|
|
- "Shade"), true);
|
|
- d->OpMaxButtonLeftClick =
|
|
- windowOperation (mConfig->readEntry ("MaximizeButtonLeftClickCommand",
|
|
- "Maximize"), true);
|
|
- d->OpMaxButtonMiddleClick =
|
|
- windowOperation (mConfig->readEntry ("MaximizeButtonMiddleClickCommand",
|
|
- "Maximize (vertical only)"), true);
|
|
- d->OpMaxButtonRightClick =
|
|
- windowOperation (mConfig->readEntry ("MaximizeButtonRightClickCommand",
|
|
- "Maximize (horizontal only)"),
|
|
- true);
|
|
-
|
|
- mConfig->setGroup ("MouseBindings");
|
|
-
|
|
- CmdActiveTitlebar1 =
|
|
- mouseCommand (mConfig->readEntry ("CommandActiveTitlebar1",
|
|
- "Raise"), true);
|
|
- CmdActiveTitlebar2 =
|
|
- mouseCommand (mConfig->readEntry ("CommandActiveTitlebar2",
|
|
- "Lower"), true);
|
|
- CmdActiveTitlebar3 =
|
|
- mouseCommand (mConfig->readEntry ("CommandActiveTitlebar3",
|
|
- "Operations menu"), true);
|
|
- CmdInactiveTitlebar1 =
|
|
- mouseCommand (mConfig->readEntry ("CommandInactiveTitlebar1",
|
|
- "Activate and raise"), true);
|
|
- CmdInactiveTitlebar2 =
|
|
- mouseCommand (mConfig->readEntry ("CommandInactiveTitlebar2",
|
|
- "Activate and lower"), true);
|
|
- CmdInactiveTitlebar3 =
|
|
- mouseCommand (mConfig->readEntry ("CommandInactiveTitlebar3",
|
|
- "Operations menu"), true);
|
|
-
|
|
- CmdTitlebarWheel =
|
|
- mouseWheelCommand (mConfig->readEntry ("CommandTitlebarWheel",
|
|
- "Nothing"));
|
|
-
|
|
- return changed;
|
|
-}
|
|
-
|
|
-// restricted should be true for operations that the user may not be able to
|
|
-// repeat if the window is moved out of the workspace (e.g. if the user moves
|
|
-// a window by the titlebar, and moves it too high beneath Kicker at the top
|
|
-// edge, they may not be able to move it back, unless they know about Alt+LMB)
|
|
-KDecorationDefines::WindowOperation
|
|
-KWD::Options::windowOperation (const QString &name, bool restricted)
|
|
-{
|
|
- if (name == "Move")
|
|
- return restricted ? KWD::Options::MoveOp :
|
|
- KWD::Options::UnrestrictedMoveOp;
|
|
- else if (name == "Resize")
|
|
- return restricted ? KWD::Options::ResizeOp :
|
|
- KWD::Options::UnrestrictedResizeOp;
|
|
- else if (name == "Maximize")
|
|
- return KWD::Options::MaximizeOp;
|
|
- else if (name == "Minimize")
|
|
- return KWD::Options::MinimizeOp;
|
|
- else if (name == "Close")
|
|
- return KWD::Options::CloseOp;
|
|
- else if (name == "OnAllDesktops")
|
|
- return KWD::Options::OnAllDesktopsOp;
|
|
- else if (name == "Shade")
|
|
- return KWD::Options::ShadeOp;
|
|
- else if (name == "Operations")
|
|
- return KWD::Options::OperationsOp;
|
|
- else if (name == "Maximize (vertical only)")
|
|
- return KWD::Options::VMaximizeOp;
|
|
- else if (name == "Maximize (horizontal only)")
|
|
- return KWD::Options::HMaximizeOp;
|
|
- else if (name == "Lower")
|
|
- return KWD::Options::LowerOp;
|
|
- return KWD::Options::NoOp;
|
|
-}
|
|
-
|
|
-KWD::Options::MouseCommand
|
|
-KWD::Options::mouseCommand (const QString &name,
|
|
- bool restricted)
|
|
-{
|
|
- QString lowerName = name.lower ();
|
|
-
|
|
- if (lowerName == "raise") return MouseRaise;
|
|
- if (lowerName == "lower") return MouseLower;
|
|
- if (lowerName == "operations menu") return MouseOperationsMenu;
|
|
- if (lowerName == "toggle raise and lower") return MouseToggleRaiseAndLower;
|
|
- if (lowerName == "activate and raise") return MouseActivateAndRaise;
|
|
- if (lowerName == "activate and lower") return MouseActivateAndLower;
|
|
- if (lowerName == "activate") return MouseActivate;
|
|
- if (lowerName == "activate, raise and pass click")
|
|
- return MouseActivateRaiseAndPassClick;
|
|
- if (lowerName == "activate and pass click")
|
|
- return MouseActivateAndPassClick;
|
|
- if (lowerName == "activate, raise and move")
|
|
- return restricted ? MouseActivateRaiseAndMove :
|
|
- MouseActivateRaiseAndUnrestrictedMove;
|
|
- if (lowerName == "move")
|
|
- return restricted ? MouseMove : MouseUnrestrictedMove;
|
|
- if (lowerName == "resize")
|
|
- return restricted ? MouseResize : MouseUnrestrictedResize;
|
|
- if (lowerName == "shade") return MouseShade;
|
|
- if (lowerName == "minimize") return MouseMinimize;
|
|
- if (lowerName == "nothing") return MouseNothing;
|
|
-
|
|
- return MouseNothing;
|
|
-}
|
|
-
|
|
-KWD::Options::MouseWheelCommand
|
|
-KWD::Options::mouseWheelCommand (const QString &name)
|
|
-{
|
|
- QString lowerName = name.lower ();
|
|
-
|
|
- if (lowerName == "raise/lower") return MouseWheelRaiseLower;
|
|
- if (lowerName == "shade/unshade") return MouseWheelShadeUnshade;
|
|
- if (lowerName == "maximize/restore") return MouseWheelMaximizeRestore;
|
|
- if (lowerName == "above/below") return MouseWheelAboveBelow;
|
|
- if (lowerName == "previous/next desktop")
|
|
- return MouseWheelPreviousNextDesktop;
|
|
- if (lowerName == "change opacity") return MouseWheelChangeOpacity;
|
|
-
|
|
- return MouseWheelNothing;
|
|
-}
|
|
-
|
|
-KWD::Options::MouseCommand
|
|
-KWD::Options::wheelToMouseCommand (MouseWheelCommand com,
|
|
- int delta)
|
|
-{
|
|
- switch (com) {
|
|
- case MouseWheelRaiseLower:
|
|
- return delta > 0 ? MouseRaise : MouseLower;
|
|
- case MouseWheelShadeUnshade:
|
|
- return delta > 0 ? MouseSetShade : MouseUnsetShade;
|
|
- case MouseWheelMaximizeRestore:
|
|
- return delta > 0 ? MouseMaximize : MouseRestore;
|
|
- case MouseWheelAboveBelow:
|
|
- return delta > 0 ? MouseAbove : MouseBelow;
|
|
- case MouseWheelPreviousNextDesktop:
|
|
- return delta > 0 ? MousePreviousDesktop : MouseNextDesktop;
|
|
- case MouseWheelChangeOpacity:
|
|
- return delta > 0 ? MouseOpacityMore : MouseOpacityLess;
|
|
- default:
|
|
- return MouseNothing;
|
|
- }
|
|
-}
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator/options.h compiz-0.8.8/kde/window-decorator/options.h
|
|
--- compiz-0.8.8-orig/kde/window-decorator/options.h 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator/options.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,140 +0,0 @@
|
|
-/*
|
|
- * Copyright © 2006 Novell, Inc.
|
|
- * Copyright © 2006 Dennis Kasprzyk <onestone@beryl-project.org>
|
|
- * Copyright © 2006 Volker Krause <vkrause@kde.org>
|
|
- *
|
|
- * 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., 51 Franklin Street, Fifth Floor, Boston,
|
|
- * MA 02110-1301, USA.
|
|
- *
|
|
- * Author: David Reveman <davidr@novell.com>
|
|
- */
|
|
-
|
|
-#ifndef _OPTIONS_H
|
|
-#define _OPTIONS_H
|
|
-
|
|
-#include <kdecoration.h>
|
|
-
|
|
-class KConfig;
|
|
-
|
|
-namespace KWD
|
|
-{
|
|
-
|
|
-class Options : public KDecorationOptions
|
|
- {
|
|
- public:
|
|
- enum MouseCommand
|
|
- {
|
|
- MouseRaise,
|
|
- MouseLower,
|
|
- MouseOperationsMenu,
|
|
- MouseToggleRaiseAndLower,
|
|
- MouseActivateAndRaise,
|
|
- MouseActivateAndLower,
|
|
- MouseActivate,
|
|
- MouseActivateRaiseAndPassClick,
|
|
- MouseActivateAndPassClick,
|
|
- MouseMove,
|
|
- MouseUnrestrictedMove,
|
|
- MouseActivateRaiseAndMove,
|
|
- MouseActivateRaiseAndUnrestrictedMove,
|
|
- MouseResize,
|
|
- MouseUnrestrictedResize,
|
|
- MouseShade,
|
|
- MouseSetShade,
|
|
- MouseUnsetShade,
|
|
- MouseMaximize,
|
|
- MouseRestore,
|
|
- MouseMinimize,
|
|
- MouseNextDesktop,
|
|
- MousePreviousDesktop,
|
|
- MouseAbove,
|
|
- MouseBelow,
|
|
- MouseOpacityMore,
|
|
- MouseOpacityLess,
|
|
- MouseNothing
|
|
- };
|
|
- enum MouseWheelCommand
|
|
- {
|
|
- MouseWheelRaiseLower,
|
|
- MouseWheelShadeUnshade,
|
|
- MouseWheelMaximizeRestore,
|
|
- MouseWheelAboveBelow,
|
|
- MouseWheelPreviousNextDesktop,
|
|
- MouseWheelChangeOpacity,
|
|
- MouseWheelNothing
|
|
- };
|
|
-
|
|
- Options (KConfig *config);
|
|
-
|
|
- virtual unsigned long updateSettings (void);
|
|
-
|
|
- WindowOperation operationTitlebarDblClick (void)
|
|
- {
|
|
- return OpTitlebarDblClick;
|
|
- }
|
|
-
|
|
- MouseCommand commandActiveTitlebar1 (void)
|
|
- {
|
|
- return CmdActiveTitlebar1;
|
|
- }
|
|
- MouseCommand commandActiveTitlebar2 (void)
|
|
- {
|
|
- return CmdActiveTitlebar2;
|
|
- }
|
|
- MouseCommand commandActiveTitlebar3 (void)
|
|
- {
|
|
- return CmdActiveTitlebar3;
|
|
- }
|
|
- MouseCommand commandInactiveTitlebar1 (void)
|
|
- {
|
|
- return CmdInactiveTitlebar1;
|
|
- }
|
|
- MouseCommand commandInactiveTitlebar2 (void)
|
|
- {
|
|
- return CmdInactiveTitlebar2;
|
|
- }
|
|
- MouseCommand commandInactiveTitlebar3 (void)
|
|
- {
|
|
- return CmdInactiveTitlebar3;
|
|
- }
|
|
-
|
|
- MouseCommand operationTitlebarMouseWheel (int delta)
|
|
- {
|
|
- return wheelToMouseCommand (CmdTitlebarWheel, delta);
|
|
- }
|
|
-
|
|
- private:
|
|
- static KDecorationDefines::WindowOperation
|
|
- windowOperation (const QString &name, bool restricted);
|
|
- MouseCommand mouseCommand (const QString &name, bool restricted);
|
|
- MouseWheelCommand mouseWheelCommand (const QString &name);
|
|
- MouseCommand wheelToMouseCommand (MouseWheelCommand com, int delta);
|
|
-
|
|
- private:
|
|
- KDecorationDefines::WindowOperation OpTitlebarDblClick;
|
|
- MouseCommand CmdActiveTitlebar1;
|
|
- MouseCommand CmdActiveTitlebar2;
|
|
- MouseCommand CmdActiveTitlebar3;
|
|
- MouseCommand CmdInactiveTitlebar1;
|
|
- MouseCommand CmdInactiveTitlebar2;
|
|
- MouseCommand CmdInactiveTitlebar3;
|
|
- MouseWheelCommand CmdTitlebarWheel;
|
|
-
|
|
- KConfig *mConfig;
|
|
- };
|
|
-
|
|
-}
|
|
-
|
|
-#endif
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator/utils.cpp compiz-0.8.8/kde/window-decorator/utils.cpp
|
|
--- compiz-0.8.8-orig/kde/window-decorator/utils.cpp 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator/utils.cpp 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,205 +0,0 @@
|
|
-/*
|
|
- * Copyright © 2006 Novell, Inc.
|
|
- * Copyright © 2006 Dennis Kasprzyk <onestone@beryl-project.org>
|
|
- * Copyright © 2006 Volker Krause <vkrause@kde.org>
|
|
- *
|
|
- * 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., 51 Franklin Street, Fifth Floor, Boston,
|
|
- * MA 02110-1301, USA.
|
|
- *
|
|
- * Author: David Reveman <davidr@novell.com>
|
|
- */
|
|
-
|
|
-#include "utils.h"
|
|
-
|
|
-#include <qt.h>
|
|
-
|
|
-#include <decoration.h>
|
|
-#include <X11/Xlib.h>
|
|
-#include <X11/Xatom.h>
|
|
-
|
|
-#include <stdlib.h>
|
|
-
|
|
-static int trappedErrorCode = 0;
|
|
-
|
|
-namespace KWD
|
|
-{
|
|
- namespace Atoms
|
|
- {
|
|
- Atom switchSelectWindow;
|
|
- Atom netWmWindowOpacity;
|
|
- Atom netFrameWindow;
|
|
- Atom netWindowDecor;
|
|
- Atom netWindowDecorNormal;
|
|
- Atom netWindowDecorActive;
|
|
- Atom netWindowDecorBare;
|
|
- Atom wmTakeFocus;
|
|
- Atom netWmContextHelp;
|
|
- Atom wmProtocols;
|
|
- Atom toolkitActionAtom;
|
|
- Atom toolkitActionWindowMenuAtom;
|
|
- Atom toolkitActionForceQuitDialogAtom;
|
|
- Atom compizWindowBlurDecor;
|
|
- }
|
|
-}
|
|
-
|
|
-static int (*oldErrorHandler) (Display *display, XErrorEvent *error);
|
|
-
|
|
-static int
|
|
-xErrorHandler (Display *display,
|
|
- XErrorEvent *error)
|
|
-{
|
|
- (void) display;
|
|
-
|
|
- trappedErrorCode = error->error_code;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::trapXError (void)
|
|
-{
|
|
- trappedErrorCode = 0;
|
|
- oldErrorHandler = XSetErrorHandler (xErrorHandler);
|
|
-}
|
|
-
|
|
-int
|
|
-KWD::popXError (void)
|
|
-{
|
|
- XSync (qt_xdisplay(), false);
|
|
- XSetErrorHandler (oldErrorHandler);
|
|
-
|
|
- return trappedErrorCode;
|
|
-}
|
|
-
|
|
-void *
|
|
-KWD::readXProperty (WId window,
|
|
- Atom property,
|
|
- Atom type,
|
|
- int *items)
|
|
-{
|
|
- long offset = 0, length = 2048L;
|
|
- Atom actualType;
|
|
- int format;
|
|
- unsigned long nItems, bytesRemaining;
|
|
- unsigned char *data = 0l;
|
|
- int result;
|
|
-
|
|
- KWD::trapXError ();
|
|
- result = XGetWindowProperty (qt_xdisplay (), window, property, offset,
|
|
- length, false, type,
|
|
- &actualType, &format, &nItems,
|
|
- &bytesRemaining, &data);
|
|
-
|
|
- if (KWD::popXError ())
|
|
- return NULL;
|
|
-
|
|
- if (result == Success && actualType == type && format == 32 && nItems > 0)
|
|
- {
|
|
- if (items)
|
|
- *items = nItems;
|
|
-
|
|
- return reinterpret_cast <void *>(data);
|
|
- }
|
|
-
|
|
- if (data)
|
|
- XFree (data);
|
|
-
|
|
- if (items)
|
|
- *items = 0;
|
|
-
|
|
- return NULL;
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::readWindowProperty (long window,
|
|
- long property,
|
|
- long *value)
|
|
-{
|
|
- void *data = readXProperty (window, property, XA_WINDOW, NULL);
|
|
-
|
|
- if (data)
|
|
- {
|
|
- if (value)
|
|
- *value = *reinterpret_cast <int *>(data);
|
|
-
|
|
- XFree (data);
|
|
-
|
|
- return true;
|
|
- }
|
|
-
|
|
- return false;
|
|
-}
|
|
-
|
|
-unsigned short
|
|
-KWD::readPropertyShort (WId id,
|
|
- Atom property,
|
|
- unsigned short defaultValue)
|
|
-{
|
|
- Atom actual;
|
|
- int result, format;
|
|
- unsigned long n, left;
|
|
- unsigned char *data;
|
|
-
|
|
- KWD::trapXError ();
|
|
- result = XGetWindowProperty (qt_xdisplay (), id, property,
|
|
- 0L, 1L, FALSE, XA_CARDINAL, &actual, &format,
|
|
- &n, &left, &data);
|
|
- if (KWD::popXError ())
|
|
- return defaultValue;
|
|
-
|
|
- if (result == Success && n && data)
|
|
- {
|
|
- unsigned int value;
|
|
-
|
|
- memcpy (&value, data, sizeof (unsigned int));
|
|
-
|
|
- XFree (data);
|
|
-
|
|
- return value >> 16;
|
|
- }
|
|
-
|
|
- return defaultValue;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Atoms::init (void)
|
|
-{
|
|
- Display *xdisplay = qt_xdisplay ();
|
|
-
|
|
- netFrameWindow = XInternAtom (xdisplay, "_NET_FRAME_WINDOW", false);
|
|
- netWindowDecor = XInternAtom (xdisplay, DECOR_WINDOW_ATOM_NAME, false);
|
|
- netWindowDecorNormal =
|
|
- XInternAtom (xdisplay, DECOR_NORMAL_ATOM_NAME, false);
|
|
- netWindowDecorActive =
|
|
- XInternAtom (xdisplay, DECOR_ACTIVE_ATOM_NAME, false);
|
|
- netWindowDecorBare =
|
|
- XInternAtom (xdisplay, DECOR_BARE_ATOM_NAME, false);
|
|
- switchSelectWindow =
|
|
- XInternAtom (xdisplay, DECOR_SWITCH_WINDOW_ATOM_NAME, false);
|
|
- wmTakeFocus = XInternAtom (xdisplay, "WM_TAKE_FOCUS", false);
|
|
- netWmContextHelp =
|
|
- XInternAtom (xdisplay, "_NET_WM_CONTEXT_HELP", false);
|
|
- wmProtocols = XInternAtom (xdisplay, "WM_PROTOCOLS", false);
|
|
- netWmWindowOpacity =
|
|
- XInternAtom (xdisplay, "_NET_WM_WINDOW_OPACITY", false);
|
|
- toolkitActionAtom = XInternAtom (xdisplay, "_COMPIZ_TOOLKIT_ACTION", false);
|
|
- toolkitActionWindowMenuAtom =
|
|
- XInternAtom (xdisplay, "_COMPIZ_TOOLKIT_ACTION_WINDOW_MENU", false);
|
|
- toolkitActionForceQuitDialogAtom =
|
|
- XInternAtom (xdisplay, "_COMPIZ_TOOLKIT_ACTION_FORCE_QUIT_DIALOG",
|
|
- false);
|
|
- compizWindowBlurDecor =
|
|
- XInternAtom (xdisplay, DECOR_BLUR_ATOM_NAME, false);
|
|
-}
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator/utils.h compiz-0.8.8/kde/window-decorator/utils.h
|
|
--- compiz-0.8.8-orig/kde/window-decorator/utils.h 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator/utils.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,63 +0,0 @@
|
|
-/*
|
|
- * Copyright © 2006 Novell, Inc.
|
|
- * Copyright © 2006 Dennis Kasprzyk <onestone@beryl-project.org>
|
|
- * Copyright © 2006 Volker Krause <vkrause@kde.org>
|
|
- *
|
|
- * 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., 51 Franklin Street, Fifth Floor, Boston,
|
|
- * MA 02110-1301, USA.
|
|
- *
|
|
- * Author: David Reveman <davidr@novell.com>
|
|
- */
|
|
-
|
|
-#ifndef _UTILS_H
|
|
-#define _UTILS_H
|
|
-
|
|
-#include <X11/Xlib.h>
|
|
-#include <fixx11h.h>
|
|
-#include <qwidget.h>
|
|
-
|
|
-namespace KWD
|
|
-{
|
|
- namespace Atoms
|
|
- {
|
|
- extern Atom switchSelectWindow;
|
|
- extern Atom netWmWindowOpacity;
|
|
- extern Atom netFrameWindow;
|
|
- extern Atom netWindowDecor;
|
|
- extern Atom netWindowDecorNormal;
|
|
- extern Atom netWindowDecorActive;
|
|
- extern Atom netWindowDecorBare;
|
|
- extern Atom wmTakeFocus;
|
|
- extern Atom netWmContextHelp;
|
|
- extern Atom wmProtocols;
|
|
- extern Atom toolkitActionAtom;
|
|
- extern Atom toolkitActionWindowMenuAtom;
|
|
- extern Atom toolkitActionForceQuitDialogAtom;
|
|
- extern Atom compizWindowBlurDecor;
|
|
-
|
|
- void init (void);
|
|
- }
|
|
-
|
|
- void trapXError (void);
|
|
- int popXError (void);
|
|
- bool eventFilter (void *message, long *result);
|
|
- void *readXProperty (WId window, Atom property, Atom type, int *items);
|
|
- bool readWindowProperty (long wId, long property, long *value);
|
|
- unsigned short readPropertyShort (WId id,
|
|
- Atom property,
|
|
- unsigned short defaultValue);
|
|
-}
|
|
-
|
|
-#endif
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator/window.cpp compiz-0.8.8/kde/window-decorator/window.cpp
|
|
--- compiz-0.8.8-orig/kde/window-decorator/window.cpp 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator/window.cpp 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,2091 +0,0 @@
|
|
-/*
|
|
- * Copyright © 2006 Novell, Inc.
|
|
- * Copyright © 2006 Dennis Kasprzyk <onestone@beryl-project.org>
|
|
- * Copyright © 2006 Volker Krause <vkrause@kde.org>
|
|
- *
|
|
- * 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., 51 Franklin Street, Fifth Floor, Boston,
|
|
- * MA 02110-1301, USA.
|
|
- *
|
|
- * Author: David Reveman <davidr@novell.com>
|
|
- */
|
|
-
|
|
-#include "window.h"
|
|
-#include "decorator.h"
|
|
-#include "options.h"
|
|
-#include "utils.h"
|
|
-
|
|
-#include <X11/Xlib.h>
|
|
-#include <X11/extensions/shape.h>
|
|
-#include <X11/extensions/Xcomposite.h>
|
|
-#include <X11/Xregion.h>
|
|
-
|
|
-#include <fixx11h.h>
|
|
-
|
|
-#include <kdebug.h>
|
|
-#include <kglobal.h>
|
|
-#include <kglobalsettings.h>
|
|
-#include <kiconloader.h>
|
|
-#include <kdecoration.h>
|
|
-#include <kwin.h>
|
|
-#include <klocale.h>
|
|
-#include <kprocess.h>
|
|
-#include <kstandarddirs.h>
|
|
-
|
|
-#include <qapplication.h>
|
|
-#include <qlayout.h>
|
|
-#include <qevent.h>
|
|
-#include <qpainter.h>
|
|
-#include <qobjectlist.h>
|
|
-#include <qwidget.h>
|
|
-#include <qstring.h>
|
|
-#include <qtimer.h>
|
|
-#include <qcursor.h>
|
|
-#include <qpopupmenu.h>
|
|
-
|
|
-KWD::Window::Window (WId parentId,
|
|
- WId clientId,
|
|
- WId frame,
|
|
- Type type,
|
|
- int x,
|
|
- int y,
|
|
- int w,
|
|
- int h): QWidget (0, 0),
|
|
- mType (type),
|
|
- mParentId (parentId),
|
|
- mFrame (0),
|
|
- mClientId (clientId),
|
|
- mSelectedId (0),
|
|
- mDecor (0),
|
|
- mPixmap (0),
|
|
- mDamageId (0),
|
|
- mShadow (0),
|
|
- mPicture (0),
|
|
- mTexturePicture (0),
|
|
- mDecorationPicture (0),
|
|
- mUpdateProperty (false),
|
|
- mShapeSet (false),
|
|
- mUniqueHorzShape (false),
|
|
- mUniqueVertShape (false),
|
|
- mPopup (0),
|
|
- mAdvancedMenu (0),
|
|
- mDesktopMenu (0),
|
|
- mMapped (false),
|
|
- mPendingMap (0),
|
|
- mPendingConfigure (0),
|
|
- mProcessKiller (0)
|
|
-{
|
|
- memset (&mBorder, 0, sizeof (mBorder));
|
|
-
|
|
- if (mType == Normal || mType == Switcher)
|
|
- {
|
|
- KWin::WindowInfo wInfo = KWin::windowInfo (mClientId, NET::WMState |
|
|
- NET::WMVisibleName, 0);
|
|
-
|
|
- mState = wInfo.state ();
|
|
-
|
|
- if (mType == Normal)
|
|
- {
|
|
- mName = wInfo.visibleName ();
|
|
-
|
|
- mIcons = QIconSet (KWin::icon (mClientId, 16, 16, TRUE),
|
|
- KWin::icon (mClientId, 32, 32, TRUE));
|
|
- mOpacity = readPropertyShort (mClientId, Atoms::netWmWindowOpacity,
|
|
- 0xffff);
|
|
- }
|
|
- else
|
|
- {
|
|
- mIcons = QIconSet ();
|
|
- mName = QString ("");
|
|
- }
|
|
-
|
|
- updateFrame (frame);
|
|
-
|
|
- mGeometry = QRect (x, y, w, h);
|
|
-
|
|
- getWindowProtocols ();
|
|
- }
|
|
- else
|
|
- {
|
|
- mIcons = QIconSet ();
|
|
- mName = QString ("");
|
|
- mGeometry = QRect (50, 50, 30, 1);
|
|
- }
|
|
-
|
|
- setGeometry (QRect (mGeometry.x () + ROOT_OFF_X,
|
|
- mGeometry.y () + ROOT_OFF_Y,
|
|
- mGeometry.width (), mGeometry.height ()));
|
|
-
|
|
- createDecoration ();
|
|
-
|
|
- mActiveChild = NULL;
|
|
-}
|
|
-
|
|
-KWD::Window::~Window (void)
|
|
-{
|
|
- if (mShadow)
|
|
- decor_shadow_destroy (qt_xdisplay (), mShadow);
|
|
-
|
|
- if (mPicture)
|
|
- XRenderFreePicture (qt_xdisplay (), mPicture);
|
|
-
|
|
- if (mPixmap)
|
|
- XFreePixmap (qt_xdisplay (), mPixmap);
|
|
-
|
|
- if (mTexturePicture)
|
|
- XRenderFreePicture (qt_xdisplay (), mTexturePicture);
|
|
-
|
|
- if (mDecorationPicture)
|
|
- XRenderFreePicture (qt_xdisplay (), mDecorationPicture);
|
|
-
|
|
- if (mDecor)
|
|
- delete mDecor;
|
|
-
|
|
- if (mPopup)
|
|
- delete mPopup;
|
|
-
|
|
- if (mProcessKiller)
|
|
- delete mProcessKiller;
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isActive (void) const
|
|
-{
|
|
- if (mType == DefaultActive)
|
|
- return true;
|
|
-
|
|
- if (mType == Switcher)
|
|
- return true;
|
|
-
|
|
- return Decorator::activeId () == mClientId;
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isCloseable (void) const
|
|
-{
|
|
- KWin::WindowInfo wInfo;
|
|
-
|
|
- if (mType != Normal)
|
|
- return false;
|
|
-
|
|
- wInfo = KWin::windowInfo (mClientId, NET::WMPid, NET::WM2AllowedActions);
|
|
- return wInfo.actionSupported (NET::ActionClose);
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isMaximizable (void) const
|
|
-{
|
|
- KWin::WindowInfo wInfo;
|
|
-
|
|
- if (mType != Normal)
|
|
- return false;
|
|
-
|
|
- wInfo = KWin::windowInfo (mClientId, NET::WMPid, NET::WM2AllowedActions);
|
|
- return wInfo.actionSupported (NET::ActionMax);
|
|
-}
|
|
-
|
|
-KDecoration::MaximizeMode
|
|
-KWD::Window::maximizeMode (void) const
|
|
-{
|
|
- MaximizeMode mode = MaximizeRestore;
|
|
-
|
|
- if (mType != Normal)
|
|
- return mode;
|
|
-
|
|
- mode =
|
|
- ((mState & NET::MaxVert) ? MaximizeVertical : MaximizeRestore) |
|
|
- ((mState & NET::MaxHoriz) ? MaximizeHorizontal : MaximizeRestore);
|
|
-
|
|
- return mode;
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isMinimizable (void) const
|
|
-{
|
|
- KWin::WindowInfo wInfo;
|
|
-
|
|
- if (mType != Normal)
|
|
- return false;
|
|
-
|
|
- wInfo = KWin::windowInfo (mClientId, NET::WMPid, NET::WM2AllowedActions);
|
|
- return wInfo.actionSupported (NET::ActionMinimize);
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::providesContextHelp (void) const
|
|
-{
|
|
- if (mType != Normal)
|
|
- return false;
|
|
-
|
|
- return mSupportContextHelp;
|
|
-}
|
|
-
|
|
-int
|
|
-KWD::Window::desktop (void) const
|
|
-{
|
|
- KWin::WindowInfo wInfo = KWin::windowInfo (mClientId, NET::WMDesktop, 0);
|
|
-
|
|
- return wInfo.desktop ();
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isModal (void) const
|
|
-{
|
|
- return mState & NET::Modal;
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isShadeable (void) const
|
|
-{
|
|
- KWin::WindowInfo wInfo = KWin::windowInfo (mClientId, NET::WMPid,
|
|
- NET::WM2AllowedActions);
|
|
-
|
|
- return wInfo.actionSupported (NET::ActionShade);
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isShade (void) const
|
|
-{
|
|
- if (mType != Normal)
|
|
- return false;
|
|
-
|
|
- return (mState & NET::Shaded);
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isSetShade (void) const
|
|
-{
|
|
- return isShade ();
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::keepAbove (void) const
|
|
-{
|
|
- if (mType != Normal)
|
|
- return false;
|
|
-
|
|
- return (mState & NET::KeepAbove);
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::keepBelow (void) const
|
|
-{
|
|
- if (mType != Normal)
|
|
- return false;
|
|
-
|
|
- return (mState & NET::KeepBelow);
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isMovable (void) const
|
|
-{
|
|
- KWin::WindowInfo wInfo = KWin::windowInfo (mClientId, NET::WMPid,
|
|
- NET::WM2AllowedActions);
|
|
-
|
|
- return wInfo.actionSupported (NET::ActionMove);
|
|
-}
|
|
-
|
|
-NET::WindowType
|
|
-KWD::Window::windowType (unsigned long mask) const
|
|
-{
|
|
- KWin::WindowInfo wInfo = KWin::windowInfo (mClientId, NET::WMWindowType, 0);
|
|
-
|
|
- return wInfo.windowType (mask);
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isResizable (void) const
|
|
-{
|
|
- KWin::WindowInfo wInfo = KWin::windowInfo (mClientId, NET::WMPid,
|
|
- NET::WM2AllowedActions);
|
|
-
|
|
- return wInfo.actionSupported (NET::ActionResize);
|
|
-}
|
|
-
|
|
-QIconSet
|
|
-KWD::Window::icon (void) const
|
|
-{
|
|
- return mIcons;
|
|
-}
|
|
-
|
|
-QString
|
|
-KWD::Window::caption (void) const
|
|
-{
|
|
- return mName;
|
|
-}
|
|
-
|
|
-/* TODO: We should use libtaskmanager, which is part of kdebase to create
|
|
- the window menu instead but the headers for that library are currently
|
|
- not installed. If kdebase could install those headers, we wouldn't have
|
|
- to have our own window menu implementaion here. */
|
|
-void
|
|
-KWD::Window::showWindowMenu (QPoint pos)
|
|
-{
|
|
- if (!mPopup)
|
|
- {
|
|
- mPopup = new QPopupMenu ();
|
|
- mPopup->setCheckable (true);
|
|
- mPopup->setFont (KGlobalSettings::menuFont ());
|
|
-
|
|
- mAdvancedMenu = new QPopupMenu (mPopup);
|
|
- mAdvancedMenu->setCheckable (true);
|
|
- mAdvancedMenu->setFont (KGlobalSettings::menuFont ());
|
|
-
|
|
- connect (mAdvancedMenu, SIGNAL (activated (int)),
|
|
- SLOT (handlePopupActivated (int)));
|
|
-
|
|
- mAdvancedMenu->insertItem (SmallIconSet ("up"),
|
|
- i18n ("Keep &Above Others"),
|
|
- Options::KeepAboveOp);
|
|
- mAdvancedMenu->insertItem (SmallIconSet ("down"),
|
|
- i18n ("Keep &Below Others"),
|
|
- Options::KeepBelowOp);
|
|
- mAdvancedMenu->insertItem (SmallIconSet ("window_fullscreen"),
|
|
- i18n ("&Fullscreen"),
|
|
- Options::FullScreenOp);
|
|
-
|
|
- mPopup->insertItem (i18n ("Ad&vanced"), mAdvancedMenu);
|
|
-
|
|
- mDesktopMenu = new QPopupMenu (mPopup);
|
|
- mDesktopMenu->setCheckable (true);
|
|
- mDesktopMenu->setFont (KGlobalSettings::menuFont ());
|
|
-
|
|
- connect (mDesktopMenu, SIGNAL (activated (int)),
|
|
- SLOT (handleDesktopPopupActivated (int)));
|
|
-
|
|
- mPopup->insertItem (i18n ("To &Desktop"), mDesktopMenu, Options::NoOp);
|
|
-
|
|
- mPopup->insertItem (SmallIconSet ("move"), i18n ("&Move"),
|
|
- Options::MoveOp);
|
|
- mPopup->insertItem (i18n ("Re&size"), Options::ResizeOp);
|
|
-
|
|
- mPopup->insertItem (i18n ("Mi&nimize"), Options::MinimizeOp);
|
|
- mPopup->insertItem (i18n ("Ma&ximize"), Options::MaximizeOp);
|
|
- mPopup->insertItem (i18n ("Sh&ade"), Options::ShadeOp);
|
|
-
|
|
- mPopup->insertSeparator ();
|
|
-
|
|
- mPopup->insertItem (SmallIconSet ("fileclose"), i18n ("&Close"),
|
|
- Options::CloseOp);
|
|
-
|
|
- connect (mPopup, SIGNAL (aboutToShow ()),
|
|
- SLOT (handlePopupAboutToShow ()));
|
|
- connect (mPopup, SIGNAL (activated (int)),
|
|
- SLOT (handlePopupActivated (int)));
|
|
- }
|
|
-
|
|
- mPopup->exec (pos);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::showWindowMenu (const QRect &pos)
|
|
-{
|
|
- showWindowMenu (pos.bottomLeft ());
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::processMousePressEvent (QMouseEvent *qme)
|
|
-{
|
|
- Options::MouseCommand com = Options::MouseNothing;
|
|
- bool active = isActive ();
|
|
-
|
|
- if (!mSupportTakeFocus)
|
|
- active = TRUE;
|
|
-
|
|
- switch (qme->button ()) {
|
|
- case Qt::LeftButton:
|
|
- com = active ? Decorator::options ()->commandActiveTitlebar1 () :
|
|
- Decorator::options()->commandInactiveTitlebar1 ();
|
|
- break;
|
|
- case Qt::MidButton:
|
|
- com = active ? Decorator::options ()->commandActiveTitlebar2 () :
|
|
- Decorator::options()->commandInactiveTitlebar2 ();
|
|
- break;
|
|
- case Qt::RightButton:
|
|
- com = active ? Decorator::options ()->commandActiveTitlebar3 () :
|
|
- Decorator::options()->commandInactiveTitlebar3 ();
|
|
- default:
|
|
- break;
|
|
- }
|
|
-
|
|
- if (qme->button () == Qt::LeftButton)
|
|
- {
|
|
- // actions where it's not possible to get the matching release event
|
|
- if (com != Options::MouseOperationsMenu &&
|
|
- com != Options::MouseMinimize)
|
|
- {
|
|
- moveWindow (qme);
|
|
- return;
|
|
- }
|
|
- }
|
|
-
|
|
- performMouseCommand (com, qme);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::performWindowOperation (WindowOperation wo)
|
|
-{
|
|
- switch (wo) {
|
|
- case KDecoration::MaximizeOp:
|
|
- maximize (maximizeMode () == KDecoration::MaximizeFull ?
|
|
- KDecoration::MaximizeRestore : KDecoration::MaximizeFull);
|
|
- break;
|
|
- case KDecoration::HMaximizeOp:
|
|
- maximize (maximizeMode () ^ KDecoration::MaximizeHorizontal);
|
|
- break;
|
|
- case KDecoration::VMaximizeOp:
|
|
- maximize (maximizeMode () ^ KDecoration::MaximizeVertical);
|
|
- break;
|
|
- case KDecoration::MinimizeOp:
|
|
- minimize ();
|
|
- break;
|
|
- case KDecoration::ShadeOp:
|
|
- setShade (!isShade ());
|
|
- break;
|
|
- case KDecoration::CloseOp:
|
|
- closeWindow ();
|
|
- break;
|
|
- case KDecoration::KeepAboveOp:
|
|
- setKeepAbove (!keepAbove ());
|
|
- break;
|
|
- case KDecoration::KeepBelowOp:
|
|
- setKeepBelow (!keepBelow ());
|
|
- break;
|
|
- case KDecoration::FullScreenOp:
|
|
- if (mState & NET::FullScreen)
|
|
- KWin::clearState (mClientId, NET::FullScreen);
|
|
- else
|
|
- KWin::setState (mClientId, NET::FullScreen);
|
|
- break;
|
|
- case KDecoration::MoveOp:
|
|
- Decorator::rootInfo ()->moveResizeRequest (mClientId,
|
|
- mGeometry.x () +
|
|
- mGeometry.width () / 2,
|
|
- mGeometry.y () +
|
|
- mGeometry.height () / 2,
|
|
- NET::KeyboardMove);
|
|
- break;
|
|
- case KDecoration::ResizeOp:
|
|
- Decorator::rootInfo ()->moveResizeRequest (mClientId,
|
|
- mGeometry.x () +
|
|
- mGeometry.width () / 2,
|
|
- mGeometry.y () +
|
|
- mGeometry.height () / 2,
|
|
- NET::KeyboardSize);
|
|
- default:
|
|
- break;
|
|
- }
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isPreview (void) const
|
|
-{
|
|
- return false;
|
|
-}
|
|
-
|
|
-QRect
|
|
-KWD::Window::geometry (void) const
|
|
-{
|
|
- QRect rect = QWidget::geometry ();
|
|
-
|
|
- return QRect (rect.x () - ROOT_OFF_X,
|
|
- rect.y () - ROOT_OFF_Y,
|
|
- rect.width (),
|
|
- rect.height ());
|
|
-}
|
|
-
|
|
-QRect
|
|
-KWD::Window::iconGeometry (void) const
|
|
-{
|
|
- return QRect ();
|
|
-}
|
|
-
|
|
-QRect
|
|
-KWD::Window::clientGeometry (void)
|
|
-{
|
|
- QRect frame = geometry ();
|
|
-
|
|
- return QRect (frame.x () + mBorder.left,
|
|
- frame.y () + mBorder.top,
|
|
- frame.width () - mBorder.left - mBorder.right,
|
|
- frame.height () - mBorder.top - mBorder.bottom);
|
|
-}
|
|
-
|
|
-QRegion
|
|
-KWD::Window::unobscuredRegion (const QRegion & r) const
|
|
-{
|
|
- return r;
|
|
-}
|
|
-
|
|
-QWidget *
|
|
-KWD::Window::workspaceWidget (void) const
|
|
-{
|
|
- return const_cast <Window *> (this);
|
|
-}
|
|
-
|
|
-WId
|
|
-KWD::Window::windowId (void) const
|
|
-{
|
|
- return mClientId;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::closeWindow (void)
|
|
-{
|
|
- Decorator::rootInfo ()->closeWindowRequest (mClientId);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::maximize (MaximizeMode mode)
|
|
-{
|
|
- KWin::setState (mClientId,
|
|
- ((mode & MaximizeVertical) ? NET::MaxVert : 0) |
|
|
- ((mode & MaximizeHorizontal) ? NET::MaxHoriz : 0));
|
|
- KWin::clearState (mClientId,
|
|
- ((mode & MaximizeVertical) ? 0 : NET::MaxVert) |
|
|
- ((mode & MaximizeHorizontal) ? 0 : NET::MaxHoriz));
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::minimize (void)
|
|
-{
|
|
- KWin::iconifyWindow (mClientId, false);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::showContextHelp (void)
|
|
-{
|
|
- if (mSupportContextHelp)
|
|
- KWD::Decorator::sendClientMessage (mClientId, mClientId,
|
|
- Atoms::wmProtocols,
|
|
- Atoms::netWmContextHelp);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::titlebarDblClickOperation (void)
|
|
-{
|
|
- WindowOperation op;
|
|
-
|
|
- op = KWD::Decorator::options ()->operationTitlebarDblClick ();
|
|
- performWindowOperation (op);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::setDesktop (int desktop)
|
|
-{
|
|
- KWin::setOnDesktop (mClientId, desktop);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::setKeepBelow (bool set)
|
|
-{
|
|
- if (set)
|
|
- {
|
|
- KWin::clearState (mClientId, NET::KeepAbove);
|
|
- KWin::setState (mClientId, NET::KeepBelow);
|
|
- }
|
|
- else
|
|
- {
|
|
- KWin::clearState (mClientId, NET::KeepBelow);
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::setKeepAbove (bool set)
|
|
-{
|
|
- if (set)
|
|
- {
|
|
- KWin::clearState (mClientId, NET::KeepBelow);
|
|
- KWin::setState (mClientId, NET::KeepAbove);
|
|
- }
|
|
- else
|
|
- {
|
|
- KWin::clearState (mClientId, NET::KeepAbove);
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::setShade (bool set)
|
|
-{
|
|
- if (set)
|
|
- KWin::setState (mClientId, NET::Shaded);
|
|
- else
|
|
- KWin::clearState (mClientId, NET::Shaded);
|
|
-
|
|
- mDecor->shadeChange ();
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::titlebarMouseWheelOperation (int delta)
|
|
-{
|
|
- Options::MouseCommand com;
|
|
-
|
|
- com = Decorator::options()->operationTitlebarMouseWheel (delta);
|
|
- performMouseCommand (com, 0);
|
|
-}
|
|
-
|
|
-int
|
|
-KWD::Window::currentDesktop (void) const
|
|
-{
|
|
- return KWin::currentDesktop ();
|
|
-}
|
|
-
|
|
-QWidget *
|
|
-KWD::Window::initialParentWidget (void) const
|
|
-{
|
|
- return const_cast <Window *> (this);
|
|
-}
|
|
-
|
|
-Qt::WFlags
|
|
-KWD::Window::initialWFlags (void) const
|
|
-{
|
|
- return 0;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::helperShowHide (bool)
|
|
-{
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::grabXServer (bool)
|
|
-{
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::createDecoration (void)
|
|
-{
|
|
- KDecoration *decor;
|
|
-
|
|
- if (mDecor)
|
|
- return;
|
|
-
|
|
- decor = Decorator::pluginManager ()->createDecoration (this);
|
|
- decor->init ();
|
|
-
|
|
- mDecor = decor;
|
|
-
|
|
- if (mType == Normal && mFrame)
|
|
- {
|
|
- KWD::trapXError ();
|
|
- XSelectInput (qt_xdisplay (), mFrame,
|
|
- StructureNotifyMask | PropertyChangeMask |
|
|
- ButtonPressMask | ButtonReleaseMask | PointerMotionMask |
|
|
- EnterWindowMask | LeaveWindowMask);
|
|
- if (KWD::popXError ())
|
|
- return;
|
|
- }
|
|
-
|
|
- resizeDecoration (true);
|
|
-}
|
|
-
|
|
-static void
|
|
-fillQRegion (Display *xdisplay,
|
|
- Picture picture,
|
|
- int clipX1,
|
|
- int clipY1,
|
|
- int clipX2,
|
|
- int clipY2,
|
|
- int xOff,
|
|
- int yOff,
|
|
- QRegion *region)
|
|
-{
|
|
- static XRenderColor white = { 0xffff, 0xffff, 0xffff, 0xffff };
|
|
- QMemArray <QRect> rects = region->rects ();
|
|
- QMemArray <QRect>::ConstIterator it;
|
|
- int x1, y1, x2, y2;
|
|
-
|
|
- for (it = rects.begin (); it != rects.end (); it++)
|
|
- {
|
|
- x1 = it->x ();
|
|
- y1 = it->y ();
|
|
- x2 = x1 + it->width ();
|
|
- y2 = y1 + it->height ();
|
|
-
|
|
- if (x1 < clipX1)
|
|
- x1 = clipX1;
|
|
- if (y1 < clipY1)
|
|
- y1 = clipY1;
|
|
- if (x2 > clipX2)
|
|
- x2 = clipX2;
|
|
- if (y2 > clipY2)
|
|
- y2 = clipY2;
|
|
-
|
|
- if (x1 < x2 && y1 < y2)
|
|
- XRenderFillRectangle (xdisplay, PictOpSrc, picture, &white,
|
|
- xOff + x1,
|
|
- yOff + y1,
|
|
- x2 - x1,
|
|
- y2 - y1);
|
|
- }
|
|
-}
|
|
-
|
|
-static void
|
|
-drawBorderShape (Display *xdisplay,
|
|
- Pixmap pixmap,
|
|
- Picture picture,
|
|
- int width,
|
|
- int height,
|
|
- decor_context_t *c,
|
|
- void *closure)
|
|
-{
|
|
- static XRenderColor clear = { 0x0000, 0x0000, 0x0000, 0x0000 };
|
|
- static XRenderColor white = { 0xffff, 0xffff, 0xffff, 0xffff };
|
|
- KWD::Window *w = (KWD::Window *) closure;
|
|
- QRegion *shape;
|
|
- bool uniqueHorzShade;
|
|
- bool uniqueVertShade;
|
|
- int xOffLeft, yOffTop, xOffRight, yOffBottom;
|
|
- QRect rect = w->geometry ();
|
|
- int x1, y1, x2, y2;
|
|
-
|
|
- (void) pixmap;
|
|
-
|
|
- XRenderFillRectangle (xdisplay, PictOpSrc, picture, &clear,
|
|
- 0, 0, width, height);
|
|
-
|
|
- shape = w->getShape ();
|
|
- w->getShapeInfo (&uniqueHorzShade, &uniqueVertShade);
|
|
-
|
|
- xOffLeft = c->left_space - c->extents.left;
|
|
- yOffTop = c->top_space - c->extents.top;
|
|
-
|
|
- xOffRight = c->left_space - c->extents.left;
|
|
- yOffBottom = c->top_space - c->extents.top;
|
|
-
|
|
- x1 = c->left_space;
|
|
- y1 = c->top_space;
|
|
- x2 = width - c->right_space;
|
|
- y2 = height - c->bottom_space;
|
|
-
|
|
- if (shape)
|
|
- {
|
|
- if (uniqueHorzShade && uniqueVertShade)
|
|
- {
|
|
- fillQRegion (xdisplay, picture,
|
|
- 0, 0,
|
|
- rect.width (), rect.height (),
|
|
- xOffLeft, yOffTop, shape);
|
|
- }
|
|
- else
|
|
- {
|
|
- if (!uniqueHorzShade)
|
|
- xOffRight = x2 - (rect.width () - c->extents.right);
|
|
-
|
|
- if (!uniqueVertShade)
|
|
- yOffBottom = y2 - (rect.height () - c->extents.bottom);
|
|
-
|
|
- if (uniqueHorzShade)
|
|
- {
|
|
- fillQRegion (xdisplay, picture,
|
|
- 0, 0,
|
|
- rect.width (), c->extents.top,
|
|
- xOffLeft, yOffTop, shape);
|
|
- fillQRegion (xdisplay, picture,
|
|
- 0, rect.height () - c->extents.bottom,
|
|
- rect.width (), rect.height (),
|
|
- xOffLeft, yOffBottom, shape);
|
|
- }
|
|
- else
|
|
- {
|
|
- fillQRegion (xdisplay, picture,
|
|
- 0, 0,
|
|
- c->extents.left, c->extents.top,
|
|
- xOffLeft, yOffTop, shape);
|
|
- fillQRegion (xdisplay, picture,
|
|
- rect.width () - c->extents.right, 0,
|
|
- rect.width (), c->extents.top,
|
|
- xOffRight, yOffTop, shape);
|
|
- fillQRegion (xdisplay, picture,
|
|
- 0, rect.height () - c->extents.bottom,
|
|
- c->extents.left, rect.height (),
|
|
- xOffLeft, yOffBottom, shape);
|
|
- fillQRegion (xdisplay, picture,
|
|
- rect.width () - c->extents.right,
|
|
- rect.height () - c->extents.bottom,
|
|
- rect.width (), rect.height (),
|
|
- xOffRight, yOffBottom, shape);
|
|
-
|
|
- y1 -= c->extents.top;
|
|
- y2 += c->extents.bottom;
|
|
- }
|
|
-
|
|
- if (uniqueVertShade)
|
|
- {
|
|
- fillQRegion (xdisplay, picture,
|
|
- 0, c->extents.top,
|
|
- c->extents.left,
|
|
- rect.height () - c->extents.bottom,
|
|
- xOffLeft, yOffTop, shape);
|
|
- fillQRegion (xdisplay, picture,
|
|
- rect.width () - c->extents.right, c->extents.top,
|
|
- rect.width (),
|
|
- rect.height () - c->extents.bottom,
|
|
- xOffRight, yOffTop, shape);
|
|
- }
|
|
- else
|
|
- {
|
|
- x1 -= c->extents.left;
|
|
- x2 += c->extents.right;
|
|
- }
|
|
- }
|
|
- }
|
|
- else
|
|
- {
|
|
- x1 -= c->extents.left;
|
|
- x2 += c->extents.right;
|
|
- y1 -= c->extents.top;
|
|
- y2 += c->extents.bottom;
|
|
- }
|
|
-
|
|
- XRenderFillRectangle (xdisplay, PictOpSrc, picture, &white,
|
|
- x1,
|
|
- y1,
|
|
- x2 - x1,
|
|
- y2 - y1);
|
|
-}
|
|
-
|
|
-static void
|
|
-cornersFromQRegion (QRegion *region,
|
|
- int width,
|
|
- int height,
|
|
- int left,
|
|
- int right,
|
|
- int top,
|
|
- int bottom,
|
|
- int *leftCorner,
|
|
- int *rightCorner,
|
|
- int *topCorner,
|
|
- int *bottomCorner)
|
|
-{
|
|
- QRegion l, r, t, b;
|
|
-
|
|
- l = QRegion (0, top, left, height - top - bottom) - *region;
|
|
- r = QRegion (width - right, top, right, height - top - bottom) - *region;
|
|
- t = QRegion (0, 0, width, top) - *region;
|
|
- b = QRegion (0, height - bottom, width, bottom) - *region;
|
|
-
|
|
- if (l.isEmpty ())
|
|
- *leftCorner = left;
|
|
- else
|
|
- *leftCorner = left -
|
|
- (l.boundingRect ().x () + l.boundingRect ().width ());
|
|
-
|
|
- if (r.isEmpty ())
|
|
- *rightCorner = right;
|
|
- else
|
|
- *rightCorner = r.boundingRect ().x () - width + right;
|
|
-
|
|
- if (t.isEmpty ())
|
|
- *topCorner = top;
|
|
- else
|
|
- *topCorner = top -
|
|
- (t.boundingRect ().y () + t.boundingRect ().height ());
|
|
-
|
|
- if (b.isEmpty ())
|
|
- *bottomCorner = bottom;
|
|
- else
|
|
- *bottomCorner = b.boundingRect ().y () - height + bottom;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::updateShadow (void)
|
|
-{
|
|
- Display *xdisplay = qt_xdisplay ();
|
|
- Screen *xscreen = ScreenOfDisplay (xdisplay, qt_xscreen ());
|
|
- XRenderPictFormat *xformat;
|
|
- int leftCorner, rightCorner, topCorner, bottomCorner;
|
|
-
|
|
- if (mShadow)
|
|
- {
|
|
- decor_shadow_destroy (qt_xdisplay (), mShadow);
|
|
- mShadow = NULL;
|
|
- }
|
|
-
|
|
- if (mShapeSet)
|
|
- {
|
|
- cornersFromQRegion (&mShape,
|
|
- mGeometry.width () + mBorder.left + mBorder.right,
|
|
- mGeometry.height () + mBorder.top + mBorder.bottom,
|
|
- mBorder.left,
|
|
- mBorder.right,
|
|
- mBorder.top,
|
|
- mBorder.bottom,
|
|
- &leftCorner,
|
|
- &rightCorner,
|
|
- &topCorner,
|
|
- &bottomCorner);
|
|
- }
|
|
- else
|
|
- {
|
|
- leftCorner = mBorder.left;
|
|
- rightCorner = mBorder.right;
|
|
- topCorner = mBorder.top;
|
|
- bottomCorner = mBorder.bottom;
|
|
- }
|
|
-
|
|
- /* use default shadow if such exist */
|
|
- if (!mUniqueHorzShape && !mUniqueVertShape)
|
|
- {
|
|
- mShadow = Decorator::defaultWindowShadow (&mContext, &mBorder);
|
|
- if (mShadow)
|
|
- decor_shadow_reference (mShadow);
|
|
- }
|
|
-
|
|
- if (!mShadow)
|
|
- {
|
|
- mShadow = decor_shadow_create (xdisplay,
|
|
- xscreen,
|
|
- mUniqueHorzShape ?
|
|
- mGeometry.width () : 1,
|
|
- mUniqueVertShape ?
|
|
- mGeometry.height () : 1,
|
|
- mBorder.left,
|
|
- mBorder.right,
|
|
- mBorder.top,
|
|
- mBorder.bottom,
|
|
- leftCorner,
|
|
- rightCorner,
|
|
- topCorner,
|
|
- bottomCorner,
|
|
- KWD::Decorator::shadowOptions (),
|
|
- &mContext,
|
|
- drawBorderShape,
|
|
- (void *) this);
|
|
-
|
|
- if (mType == Default)
|
|
- KWD::Decorator::updateDefaultShadow (this);
|
|
- }
|
|
-
|
|
- /* create new layout */
|
|
- if (mType == Normal || mType == Switcher)
|
|
- decor_get_best_layout (&mContext,
|
|
- mGeometry.width (),
|
|
- mGeometry.height (),
|
|
- &mLayout);
|
|
- else
|
|
- decor_get_default_layout (&mContext,
|
|
- mGeometry.width (),
|
|
- mGeometry.height (),
|
|
- &mLayout);
|
|
-
|
|
- if (mDecorationPicture)
|
|
- XRenderFreePicture (qt_xdisplay (), mDecorationPicture);
|
|
-
|
|
- if (mTexturePicture)
|
|
- XRenderFreePicture (qt_xdisplay (), mTexturePicture);
|
|
-
|
|
- if (!mTexturePixmapBuffer.isNull ())
|
|
- mTexturePixmapBuffer.resize (0, 0);
|
|
-
|
|
- if (!mTexturePixmap.isNull ())
|
|
- mTexturePixmap.resize (0, 0);
|
|
-
|
|
- mTexturePixmap = QPixmap (mLayout.width, mLayout.height, 32);
|
|
- mTexturePixmapBuffer = QPixmap (mLayout.width, mLayout.height, 32);
|
|
-
|
|
- xformat = XRenderFindStandardFormat (qt_xdisplay (),
|
|
- PictStandardARGB32);
|
|
-
|
|
- mDecorationPicture =
|
|
- XRenderCreatePicture (qt_xdisplay (),
|
|
- mTexturePixmap.handle (),
|
|
- xformat, 0, NULL);
|
|
- mTexturePicture =
|
|
- XRenderCreatePicture (qt_xdisplay (),
|
|
- mTexturePixmapBuffer.handle (),
|
|
- xformat, 0, NULL);
|
|
-
|
|
- decor_fill_picture_extents_with_shadow (qt_xdisplay (),
|
|
- mShadow,
|
|
- &mContext,
|
|
- mTexturePicture,
|
|
- &mLayout);
|
|
-
|
|
- if (mPixmap)
|
|
- mDecor->widget ()->repaint ();
|
|
-
|
|
- mUpdateProperty = true;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::setMask (const QRegion ®, int)
|
|
-{
|
|
- QRegion top, bottom, left, right;
|
|
- bool uniqueHorzShape, uniqueVertShape;
|
|
-
|
|
- if (mShapeSet && reg == mShape)
|
|
- return;
|
|
-
|
|
- mShape = reg;
|
|
- mShapeSet = true;
|
|
-
|
|
- if (mFrame)
|
|
- {
|
|
- QRegion r;
|
|
-
|
|
- r = reg - QRegion (mBorder.left, mBorder.top,
|
|
- mGeometry.width (), mGeometry.height ());
|
|
-
|
|
- KWD::trapXError ();
|
|
- XShapeCombineRegion (qt_xdisplay (),
|
|
- mFrame,
|
|
- ShapeInput,
|
|
- 0,
|
|
- 0,
|
|
- r.handle (),
|
|
- ShapeSet);
|
|
- KWD::popXError ();
|
|
- }
|
|
-
|
|
- top = QRegion (mBorder.left, 0,
|
|
- mGeometry.width (), mBorder.top) - reg;
|
|
- bottom = QRegion (mBorder.left, mGeometry.height () + mBorder.top,
|
|
- mGeometry.width (), mBorder.bottom) - reg;
|
|
- left = QRegion (0, mBorder.top, mBorder.left,
|
|
- mGeometry.height ()) - reg;
|
|
- right = QRegion (mBorder.left + mGeometry.width (), mBorder.top,
|
|
- mBorder.right, mGeometry.height ()) - reg;
|
|
-
|
|
- uniqueHorzShape = !top.isEmpty () || !bottom.isEmpty ();
|
|
- uniqueVertShape = !left.isEmpty () || !right.isEmpty ();
|
|
-
|
|
- if (uniqueHorzShape || mUniqueHorzShape ||
|
|
- uniqueVertShape || mUniqueVertShape)
|
|
- {
|
|
- mUniqueHorzShape = uniqueHorzShape;
|
|
- mUniqueVertShape = uniqueVertShape;
|
|
-
|
|
- if (mPixmap)
|
|
- updateShadow ();
|
|
- }
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::resizeDecoration (bool force)
|
|
-{
|
|
- int w, h;
|
|
-
|
|
- mDecor->borders (mBorder.left, mBorder.right, mBorder.top, mBorder.bottom);
|
|
-
|
|
- w = mGeometry.width () + mBorder.left + mBorder.right;
|
|
- h = mGeometry.height () + mBorder.top + mBorder.bottom;
|
|
-
|
|
- if (!force)
|
|
- {
|
|
- if (w == width () && h == height ())
|
|
- return FALSE;
|
|
- }
|
|
-
|
|
- /* reset shape */
|
|
- mShapeSet = false;
|
|
- mUniqueHorzShape = false;
|
|
- mUniqueVertShape = false;
|
|
-
|
|
- if (mType != Normal && mType != Switcher)
|
|
- {
|
|
- Display *xdisplay = qt_xdisplay ();
|
|
- Screen *xscreen = ScreenOfDisplay (xdisplay, qt_xscreen ());
|
|
- decor_shadow_t *tmpShadow;
|
|
- decor_context_t c;
|
|
-
|
|
- /* XXX: we have to create a temporary shadow to get the client
|
|
- geometry. libdecoration should be fixed so it's able to just
|
|
- fill out a context struct and not necessarily generate a
|
|
- shadow for this purpose. */
|
|
- tmpShadow = decor_shadow_create (xdisplay,
|
|
- xscreen,
|
|
- 1, 1,
|
|
- mBorder.left,
|
|
- mBorder.right,
|
|
- mBorder.top,
|
|
- mBorder.bottom,
|
|
- mBorder.left,
|
|
- mBorder.right,
|
|
- mBorder.top,
|
|
- mBorder.bottom,
|
|
- KWD::Decorator::shadowOptions (),
|
|
- &c,
|
|
- decor_draw_simple,
|
|
- (void *) 0);
|
|
-
|
|
- decor_shadow_destroy (xdisplay, tmpShadow);
|
|
-
|
|
- w = c.left_corner_space + 1 + c.right_corner_space;
|
|
-
|
|
- /* most styles render something useful at least 30 px width */
|
|
- if (w < 30)
|
|
- w = 30;
|
|
-
|
|
- mGeometry = QRect (50, 50, w,
|
|
- c.top_corner_space + 1 + c.bottom_corner_space);
|
|
- }
|
|
-
|
|
- w = mGeometry.width () + mBorder.left + mBorder.right;
|
|
- h = mGeometry.height () + mBorder.top + mBorder.bottom;
|
|
-
|
|
- if (mPixmap)
|
|
- {
|
|
- XFreePixmap (qt_xdisplay (), mPixmap);
|
|
- mPixmap = None;
|
|
- }
|
|
-
|
|
- if (mPicture)
|
|
- {
|
|
- XRenderFreePicture (qt_xdisplay (), mPicture);
|
|
- mPicture = 0;
|
|
- }
|
|
-
|
|
- if (w != width() || h != height())
|
|
- {
|
|
- mPendingConfigure = 1;
|
|
- }
|
|
-
|
|
- setGeometry (QRect (mGeometry.x () + ROOT_OFF_X - mBorder.left,
|
|
- mGeometry.y () + ROOT_OFF_Y - mBorder.top,
|
|
- w, h));
|
|
-
|
|
- mSize = QSize (w, h);
|
|
-
|
|
- if (!mMapped)
|
|
- {
|
|
- mPendingMap = 1;
|
|
-
|
|
- XReparentWindow (qt_xdisplay (), winId (), mParentId, 0, 0);
|
|
-
|
|
- show ();
|
|
-
|
|
- mMapped = true;
|
|
-
|
|
- if (mDamageId != winId ())
|
|
- {
|
|
- mDamageId = winId ();
|
|
- XDamageCreate (qt_xdisplay (), mDamageId,
|
|
- XDamageReportRawRectangles);
|
|
- }
|
|
- }
|
|
-
|
|
- mDecor->resize (QSize (w, h));
|
|
- mDecor->widget ()->show ();
|
|
- mDecor->widget ()->repaint ();
|
|
-
|
|
- return TRUE;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::rebindPixmap (void)
|
|
-{
|
|
- XRenderPictFormat *xformat;
|
|
- QPaintEvent *e;
|
|
-
|
|
- if (mPicture)
|
|
- XRenderFreePicture (qt_xdisplay (), mPicture);
|
|
-
|
|
- if (mPixmap)
|
|
- XFreePixmap (qt_xdisplay (), mPixmap);
|
|
-
|
|
- mPixmap = XCompositeNameWindowPixmap (qt_xdisplay (), winId ());
|
|
-
|
|
- xformat = XRenderFindVisualFormat (qt_xdisplay (),
|
|
- (Visual *) x11Visual ());
|
|
-
|
|
- mPicture = XRenderCreatePicture (qt_xdisplay (), mPixmap,
|
|
- xformat, 0, NULL);
|
|
-
|
|
- updateShadow ();
|
|
-
|
|
- e = new QPaintEvent (mDecor->widget ()->rect (), false);
|
|
- QApplication::postEvent (mDecor->widget (), e);
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::handleMap (void)
|
|
-{
|
|
- if (!mPendingMap)
|
|
- return FALSE;
|
|
-
|
|
- mPendingMap = 0;
|
|
- if (mPendingConfigure)
|
|
- return FALSE;
|
|
-
|
|
- rebindPixmap ();
|
|
-
|
|
- return TRUE;
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::handleConfigure (QSize size)
|
|
-{
|
|
- if (!mPendingConfigure)
|
|
- return FALSE;
|
|
-
|
|
- if (size != mSize)
|
|
- return FALSE;
|
|
-
|
|
- mPendingConfigure = 0;
|
|
- if (mPendingConfigure || mPendingMap)
|
|
- return FALSE;
|
|
-
|
|
- rebindPixmap ();
|
|
-
|
|
- return TRUE;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::updateBlurProperty (int topOffset,
|
|
- int bottomOffset,
|
|
- int leftOffset,
|
|
- int rightOffset)
|
|
-{
|
|
- Atom atom = Atoms::compizWindowBlurDecor;
|
|
- QRegion topQRegion, bottomQRegion, leftQRegion, rightQRegion;
|
|
- Region topRegion = NULL;
|
|
- Region bottomRegion = NULL;
|
|
- Region leftRegion = NULL;
|
|
- Region rightRegion = NULL;
|
|
- int size = 0;
|
|
- int w, h;
|
|
-
|
|
- w = mGeometry.width () + mContext.extents.left + mContext.extents.right;
|
|
- h = mGeometry.height () + mContext.extents.top + mContext.extents.bottom;
|
|
-
|
|
- if (blurType != BLUR_TYPE_NONE)
|
|
- {
|
|
- QRegion r, shape = QRegion (0, 0, w, h);
|
|
-
|
|
- if (mShapeSet)
|
|
- shape = mShape;
|
|
-
|
|
- r = QRegion (0, 0, w, mContext.extents.top);
|
|
- topQRegion = r.intersect (shape);
|
|
- if (!topQRegion.isEmpty ())
|
|
- {
|
|
- topQRegion.translate (-mContext.extents.left,
|
|
- -mContext.extents.top);
|
|
- topRegion = topQRegion.handle ();
|
|
- }
|
|
-
|
|
- if (blurType == BLUR_TYPE_ALL)
|
|
- {
|
|
- r = QRegion (0, h - mContext.extents.bottom,
|
|
- w, mContext.extents.bottom);
|
|
- bottomQRegion = r.intersect (shape);
|
|
- if (!bottomQRegion.isEmpty ())
|
|
- {
|
|
- bottomQRegion.translate (-mContext.extents.left,
|
|
- -(h - mContext.extents.bottom));
|
|
- bottomRegion = bottomQRegion.handle ();
|
|
- }
|
|
-
|
|
- r = QRegion (0, mContext.extents.top,
|
|
- mContext.extents.left, mGeometry.height ());
|
|
- leftQRegion = r.intersect (shape);
|
|
- if (!leftQRegion.isEmpty ())
|
|
- {
|
|
- leftQRegion.translate (-mContext.extents.left,
|
|
- -mContext.extents.top);
|
|
- leftRegion = leftQRegion.handle ();
|
|
- }
|
|
-
|
|
- r = QRegion (w - mContext.extents.right, mContext.extents.top,
|
|
- mContext.extents.right, mGeometry.height ());
|
|
- rightQRegion = r.intersect (shape);
|
|
- if (!rightQRegion.isEmpty ())
|
|
- {
|
|
- rightQRegion.translate (-(w - mContext.extents.right),
|
|
- -mContext.extents.top);
|
|
- rightRegion = rightQRegion.handle ();
|
|
- }
|
|
- }
|
|
- }
|
|
-
|
|
- if (topRegion)
|
|
- size += topRegion->numRects;
|
|
- if (bottomRegion)
|
|
- size += bottomRegion->numRects;
|
|
- if (leftRegion)
|
|
- size += leftRegion->numRects;
|
|
- if (rightRegion)
|
|
- size += rightRegion->numRects;
|
|
-
|
|
- if (size)
|
|
- {
|
|
- long data[size * 6 + 2];
|
|
-
|
|
- decor_region_to_blur_property (data, 4, 0,
|
|
- mGeometry.width (),
|
|
- mGeometry.height (),
|
|
- topRegion, topOffset,
|
|
- bottomRegion, bottomOffset,
|
|
- leftRegion, leftOffset,
|
|
- rightRegion, rightOffset);
|
|
-
|
|
- KWD::trapXError ();
|
|
- XChangeProperty (qt_xdisplay (), mClientId, atom,
|
|
- XA_INTEGER,
|
|
- 32, PropModeReplace, (unsigned char *) data,
|
|
- 2 + size * 6);
|
|
- KWD::popXError ();
|
|
- }
|
|
- else
|
|
- {
|
|
- KWD::trapXError ();
|
|
- XDeleteProperty (qt_xdisplay (), mClientId, atom);
|
|
- KWD::popXError ();
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::updateProperty (void)
|
|
-{
|
|
- Atom atom = Atoms::netWindowDecor;
|
|
- decor_extents_t maxExtents;
|
|
- long data[256];
|
|
- decor_quad_t quads[N_QUADS_MAX];
|
|
- int nQuad;
|
|
- int lh, rh;
|
|
- int w;
|
|
- int minWidth;
|
|
- unsigned int saveState;
|
|
-
|
|
- if (mType == Default)
|
|
- atom = Atoms::netWindowDecorNormal;
|
|
- else if (mType == DefaultActive)
|
|
- atom = Atoms::netWindowDecorActive;
|
|
-
|
|
- saveState = mState;
|
|
- mState = NET::MaxVert | NET::MaxHoriz;
|
|
- mDecor->borders (maxExtents.left, maxExtents.right,
|
|
- maxExtents.top, maxExtents.bottom);
|
|
- mState = saveState;
|
|
- mDecor->borders (mBorder.left, mBorder.right, mBorder.top, mBorder.bottom);
|
|
-
|
|
- if (mLayout.rotation)
|
|
- lh = mLayout.left.x2 - mLayout.left.x1;
|
|
- else
|
|
- lh = mLayout.left.y2 - mLayout.left.y1;
|
|
-
|
|
- if (mLayout.rotation)
|
|
- rh = mLayout.right.x2 - mLayout.right.x1;
|
|
- else
|
|
- rh = mLayout.right.y2 - mLayout.right.y1;
|
|
-
|
|
- w = mLayout.top.x2 - mLayout.top.x1 - mContext.left_space -
|
|
- mContext.right_space;
|
|
-
|
|
- if (mType == Normal || mType == Switcher)
|
|
- {
|
|
- int topXOffset = w / 2;
|
|
- QWidget *widget = mDecor->widget ();
|
|
- int x;
|
|
-
|
|
- x = w - mContext.left_space - mContext.left_corner_space;
|
|
- if (x > topXOffset)
|
|
- topXOffset = x;
|
|
-
|
|
- if (widget)
|
|
- {
|
|
- const QObjectList *children = widget->children ();
|
|
-
|
|
- if (children)
|
|
- {
|
|
- QWidget *child;
|
|
-
|
|
- for (QObjectListIt it(*children); it.current (); ++it)
|
|
- {
|
|
- if (!it.current ()->isWidgetType ())
|
|
- continue;
|
|
-
|
|
- child = static_cast <QWidget *> (it.current ());
|
|
-
|
|
- x = child->x () - mBorder.left - 2;
|
|
- if (x > w / 2 && x < topXOffset)
|
|
- topXOffset = x;
|
|
- }
|
|
- }
|
|
- }
|
|
-
|
|
- nQuad = decor_set_lXrXtXbX_window_quads (quads,
|
|
- &mContext,
|
|
- &mLayout,
|
|
- lh / 2,
|
|
- rh / 2,
|
|
- topXOffset,
|
|
- w / 2);
|
|
-
|
|
- updateBlurProperty (topXOffset, w / 2, lh / 2, rh / 2);
|
|
-
|
|
- minWidth = mContext.left_corner_space + 1 + mContext.right_corner_space;
|
|
- }
|
|
- else
|
|
- {
|
|
- nQuad = decor_set_lSrStSbS_window_quads (quads, &mContext, &mLayout);
|
|
-
|
|
- minWidth = 1;
|
|
- }
|
|
-
|
|
- decor_quads_to_property (data, mTexturePixmap.handle (),
|
|
- &mBorder, &maxExtents,
|
|
- minWidth, 0,
|
|
- quads, nQuad);
|
|
-
|
|
- KWD::trapXError ();
|
|
- XChangeProperty (qt_xdisplay (), mClientId, atom,
|
|
- XA_INTEGER,
|
|
- 32, PropModeReplace, (unsigned char *) data,
|
|
- BASE_PROP_SIZE + QUAD_PROP_SIZE * nQuad);
|
|
- KWD::popXError ();
|
|
-
|
|
- mUpdateProperty = false;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::handleActiveChange (void)
|
|
-{
|
|
- mDecor->activeChange ();
|
|
- resizeDecoration ();
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::updateFrame (WId frame)
|
|
-{
|
|
- mFrame = frame;
|
|
-
|
|
- KWD::trapXError ();
|
|
- XSelectInput (qt_xdisplay (), mFrame,
|
|
- StructureNotifyMask | PropertyChangeMask |
|
|
- ButtonPressMask | ButtonReleaseMask | PointerMotionMask |
|
|
- EnterWindowMask | LeaveWindowMask);
|
|
- KWD::popXError ();
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::updateSelected (WId selectedId)
|
|
-{
|
|
- mSelectedId = selectedId;
|
|
-
|
|
- updateName ();
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::updateWindowGeometry (void)
|
|
-{
|
|
- KWin::WindowInfo wInfo = KWin::windowInfo (mClientId, NET::WMGeometry);
|
|
- QRect geometry = wInfo.geometry ();
|
|
-
|
|
- if (mGeometry.width () != geometry.width () ||
|
|
- mGeometry.height () != geometry.height ())
|
|
- {
|
|
- mGeometry = geometry;
|
|
-
|
|
- if (resizeDecoration ())
|
|
- return;
|
|
- }
|
|
- else
|
|
- {
|
|
- mGeometry = geometry;
|
|
- }
|
|
-
|
|
- move (mGeometry.x () + ROOT_OFF_X - mBorder.left,
|
|
- mGeometry.y () + ROOT_OFF_Y - mBorder.top);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::reloadDecoration (void)
|
|
-{
|
|
- delete mDecor;
|
|
- mDecor = 0;
|
|
-
|
|
- mMapped = false;
|
|
- mShapeSet = false;
|
|
-
|
|
- if (mShadow)
|
|
- {
|
|
- decor_shadow_destroy (qt_xdisplay (), mShadow);
|
|
- mShadow = NULL;
|
|
- }
|
|
-
|
|
- createDecoration ();
|
|
-}
|
|
-
|
|
-Cursor
|
|
-KWD::Window::positionToCursor (QPoint pos)
|
|
-{
|
|
- switch (mDecor->mousePosition (pos)) {
|
|
- case PositionCenter:
|
|
- return cursors[1][1].cursor;
|
|
- case PositionLeft:
|
|
- return cursors[1][0].cursor;
|
|
- case PositionRight:
|
|
- return cursors[1][2].cursor;
|
|
- case PositionTop:
|
|
- return cursors[0][1].cursor;
|
|
- case PositionBottom:
|
|
- return cursors[2][1].cursor;
|
|
- case PositionTopLeft:
|
|
- return cursors[0][0].cursor;
|
|
- case PositionTopRight:
|
|
- return cursors[0][2].cursor;
|
|
- case PositionBottomLeft:
|
|
- return cursors[2][0].cursor;
|
|
- case PositionBottomRight:
|
|
- return cursors[2][2].cursor;
|
|
- default:
|
|
- break;
|
|
- }
|
|
-
|
|
- return cursors[1][1].cursor;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::updateCursor (QPoint pos)
|
|
-{
|
|
- KWD::trapXError ();
|
|
- XDefineCursor (qt_xdisplay (), mFrame, positionToCursor (pos));
|
|
- KWD::popXError ();
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::getWindowProtocols (void)
|
|
-{
|
|
- Atom *p;
|
|
- int n;
|
|
- int status;
|
|
-
|
|
- mSupportTakeFocus = false;
|
|
- mSupportContextHelp = false;
|
|
-
|
|
- KWD::trapXError ();
|
|
- status = XGetWMProtocols (qt_xdisplay (), mClientId, &p, &n);
|
|
- if (KWD::popXError ())
|
|
- return;
|
|
-
|
|
- if (status)
|
|
- {
|
|
- int i;
|
|
-
|
|
- for (i = 0; i < n; i++)
|
|
- {
|
|
- if (p[i] == Atoms::wmTakeFocus)
|
|
- mSupportTakeFocus = true;
|
|
- else if (p[i] == Atoms::netWmContextHelp)
|
|
- mSupportContextHelp = true;
|
|
- }
|
|
-
|
|
- if (n > 0)
|
|
- XFree (p);
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::handlePopupActivated (int id)
|
|
-{
|
|
- WindowOperation op = static_cast <WindowOperation> (id);
|
|
-
|
|
- performWindowOperation (op);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::handleDesktopPopupActivated (int id)
|
|
-{
|
|
- if (id)
|
|
- setDesktop (id);
|
|
- else
|
|
- KWin::setOnAllDesktops (mClientId, true);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::handlePopupAboutToShow (void)
|
|
-{
|
|
- int numberOfDesktops;
|
|
-
|
|
- numberOfDesktops = KWin::numberOfDesktops ();
|
|
- if (numberOfDesktops > 1)
|
|
- {
|
|
- NETRootInfo *rootInfo = Decorator::rootInfo ();
|
|
- QString name;
|
|
- int id, i;
|
|
- int winDesktop = desktop ();
|
|
-
|
|
- mDesktopMenu->clear ();
|
|
-
|
|
- id = mDesktopMenu->insertItem (i18n ("&All Desktops"), 0);
|
|
-
|
|
- mDesktopMenu->setItemChecked (id, (winDesktop == NET::OnAllDesktops));
|
|
- mDesktopMenu->insertSeparator ();
|
|
-
|
|
- for (i = 1; i <= numberOfDesktops; i++)
|
|
- {
|
|
- QString name;
|
|
-
|
|
- name =
|
|
- QString ("&%1 ").arg (i) +
|
|
- QString (rootInfo->desktopName (i)).replace ('&', "&&");
|
|
-
|
|
- id = mDesktopMenu->insertItem (name, i);
|
|
- mDesktopMenu->setItemChecked (id, (winDesktop == i));
|
|
- }
|
|
-
|
|
- mPopup->setItemVisible (Options::NoOp, true);
|
|
- }
|
|
- else
|
|
- {
|
|
- mPopup->setItemVisible (Options::NoOp, false);
|
|
- }
|
|
-
|
|
- mPopup->setItemEnabled (Options::ResizeOp, isResizable ());
|
|
- mPopup->setItemEnabled (Options::MoveOp, isMovable ());
|
|
-
|
|
- mPopup->setItemEnabled (Options::MaximizeOp, isMaximizable ());
|
|
- mPopup->setItemChecked (Options::MaximizeOp,
|
|
- maximizeMode () == MaximizeFull);
|
|
-
|
|
- mPopup->setItemChecked (Options::ShadeOp, isShade ());
|
|
- mPopup->setItemEnabled (Options::ShadeOp, isShadeable ());
|
|
-
|
|
- mAdvancedMenu->setItemChecked (Options::KeepAboveOp, keepAbove ());
|
|
- mAdvancedMenu->setItemChecked (Options::KeepBelowOp, keepBelow ());
|
|
- mAdvancedMenu->setItemChecked (Options::FullScreenOp,
|
|
- mState & NET::FullScreen);
|
|
-
|
|
- mPopup->setItemEnabled (Options::MinimizeOp, isMinimizable ());
|
|
- mPopup->setItemEnabled (Options::CloseOp, isCloseable ());
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::updateState (void)
|
|
-{
|
|
- KWin::WindowInfo wInfo = KWin::windowInfo (mClientId, NET::WMState, 0);
|
|
- unsigned long newState = wInfo.state ();
|
|
- unsigned long stateChange = mState ^ newState;
|
|
-
|
|
- mState = newState;
|
|
-
|
|
- if (stateChange & NET::Max)
|
|
- {
|
|
- mDecor->maximizeChange ();
|
|
- resizeDecoration (false);
|
|
- }
|
|
-
|
|
- if (stateChange & NET::KeepAbove && !(mState & NET::KeepAbove))
|
|
- mDecor->emitKeepAboveChanged (mState & NET::KeepAbove);
|
|
- if (stateChange & NET::KeepBelow && !(mState & NET::KeepBelow))
|
|
- mDecor->emitKeepBelowChanged (mState & NET::KeepBelow);
|
|
- if (stateChange & NET::KeepAbove && mState & NET::KeepAbove)
|
|
- mDecor->emitKeepAboveChanged (mState & NET::KeepAbove);
|
|
- if (stateChange & NET::KeepBelow && mState & NET::KeepBelow)
|
|
- mDecor->emitKeepBelowChanged (mState & NET::KeepBelow);
|
|
- if (stateChange & NET::Shaded)
|
|
- mDecor->shadeChange ();
|
|
- if (stateChange & NET::Sticky)
|
|
- mDecor->desktopChange ();
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::updateName (void)
|
|
-{
|
|
- KWin::WindowInfo wInfo;
|
|
- WId window;
|
|
-
|
|
- if (mType == Switcher)
|
|
- {
|
|
- if (!mSelectedId)
|
|
- return;
|
|
- window = mSelectedId;
|
|
- }
|
|
- else
|
|
- window = mClientId;
|
|
-
|
|
- wInfo = KWin::windowInfo (window, NET::WMVisibleName, 0);
|
|
-
|
|
- mName = wInfo.visibleName ();
|
|
-
|
|
- mDecor->captionChange ();
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::updateIcons (void)
|
|
-{
|
|
- mIcons = QIconSet (KWin::icon (mClientId, 16, 16, TRUE),
|
|
- KWin::icon (mClientId, 32, 32, TRUE));
|
|
- mDecor->iconChange ();
|
|
-}
|
|
-
|
|
-NET::Direction
|
|
-KWD::Window::positionToDirection (int pos)
|
|
-{
|
|
- switch (pos) {
|
|
- case PositionLeft:
|
|
- return NET::Left;
|
|
- case PositionRight:
|
|
- return NET::Right;
|
|
- case PositionTop:
|
|
- return NET::Top;
|
|
- case PositionBottom:
|
|
- return NET::Bottom;
|
|
- case PositionTopLeft:
|
|
- return NET::TopLeft;
|
|
- case PositionTopRight:
|
|
- return NET::TopRight;
|
|
- case PositionBottomLeft:
|
|
- return NET::BottomLeft;
|
|
- case PositionBottomRight:
|
|
- return NET::BottomRight;
|
|
- default:
|
|
- break;
|
|
- }
|
|
-
|
|
- return NET::Move;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::moveWindow (QMouseEvent *qme)
|
|
-{
|
|
- NET::Direction direction;
|
|
-
|
|
- direction = positionToDirection (mDecor->mousePosition (qme->pos ()));
|
|
-
|
|
- XUngrabPointer (qt_xdisplay (), CurrentTime);
|
|
- XUngrabKeyboard (qt_xdisplay (), CurrentTime);
|
|
-
|
|
- Decorator::rootInfo ()->restackRequest (mClientId, None, Above);
|
|
- Decorator::rootInfo ()->moveResizeRequest (mClientId,
|
|
- qme->globalX (),
|
|
- qme->globalY (),
|
|
- direction);
|
|
-}
|
|
-
|
|
-#define OPACITY_STEP (0xffff / 10)
|
|
-
|
|
-void
|
|
-KWD::Window::performMouseCommand (Options::MouseCommand command,
|
|
- QMouseEvent *qme)
|
|
-{
|
|
- switch (command) {
|
|
- case Options::MouseRaise:
|
|
- KWin::raiseWindow (mClientId);
|
|
- break;
|
|
- case Options::MouseLower:
|
|
- KWin::lowerWindow (mClientId);
|
|
- break;
|
|
- case Options::MouseShade :
|
|
- setShade (!isShade ());
|
|
- break;
|
|
- case Options::MouseSetShade:
|
|
- setShade (true);
|
|
- break;
|
|
- case Options::MouseUnsetShade:
|
|
- setShade (false);
|
|
- break;
|
|
- case Options::MouseOperationsMenu:
|
|
- {
|
|
- QPoint mp (0, 0);
|
|
-
|
|
- if (qme)
|
|
- mp = QPoint (qme->globalX (), qme->globalY ());
|
|
-
|
|
- showWindowMenu (mp);
|
|
- } break;
|
|
- case Options::MouseMaximize:
|
|
- maximize (KDecoration::MaximizeFull);
|
|
- break;
|
|
- case Options::MouseRestore:
|
|
- maximize (KDecoration::MaximizeRestore);
|
|
- break;
|
|
- case Options::MouseMinimize:
|
|
- minimize ();
|
|
- break;
|
|
- case Options::MouseAbove:
|
|
- if (keepBelow ())
|
|
- setKeepBelow (false);
|
|
- else
|
|
- setKeepAbove (true);
|
|
- break;
|
|
- case Options::MouseBelow:
|
|
- if (keepAbove ())
|
|
- setKeepAbove (false);
|
|
- else
|
|
- setKeepBelow (true);
|
|
- break;
|
|
- case Options::MousePreviousDesktop:
|
|
- break;
|
|
- case Options::MouseNextDesktop:
|
|
- break;
|
|
- case Options::MouseOpacityMore:
|
|
- {
|
|
- int opacity = mOpacity;
|
|
-
|
|
- if (opacity < 0xffff)
|
|
- {
|
|
- opacity += OPACITY_STEP;
|
|
- if (opacity > 0xffff)
|
|
- opacity = 0xffff;
|
|
-
|
|
- Decorator::sendClientMessage (qt_xrootwin (),
|
|
- mClientId,
|
|
- Atoms::netWmWindowOpacity,
|
|
- (opacity << 16) | opacity);
|
|
- }
|
|
- } break;
|
|
- case Options::MouseOpacityLess:
|
|
- {
|
|
- int opacity = mOpacity;
|
|
-
|
|
- if (opacity > OPACITY_STEP)
|
|
- {
|
|
- opacity -= OPACITY_STEP;
|
|
- if (opacity < OPACITY_STEP)
|
|
- opacity = OPACITY_STEP;
|
|
-
|
|
- Decorator::sendClientMessage (qt_xrootwin (),
|
|
- mClientId,
|
|
- Atoms::netWmWindowOpacity,
|
|
- (opacity << 16) | opacity);
|
|
- }
|
|
- } break;
|
|
- case Options::MouseActivateRaiseAndMove:
|
|
- case Options::MouseActivateRaiseAndUnrestrictedMove:
|
|
- case Options::MouseMove:
|
|
- case Options::MouseUnrestrictedMove:
|
|
- case Options::MouseResize:
|
|
- case Options::MouseUnrestrictedResize:
|
|
- if (qme)
|
|
- moveWindow (qme);
|
|
- case Options::MouseNothing:
|
|
- default:
|
|
- break;
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::processDamage (void)
|
|
-{
|
|
- QRegion r1, r2;
|
|
- int xOff, yOff, w;
|
|
- double alpha;
|
|
- int shade_alpha;
|
|
-
|
|
- if (isActive ())
|
|
- {
|
|
- alpha = activeDecorationOpacity;
|
|
- shade_alpha = activeDecorationOpacityShade;
|
|
- }
|
|
- else
|
|
- {
|
|
- alpha = decorationOpacity;
|
|
- shade_alpha = decorationOpacityShade;
|
|
- }
|
|
-
|
|
- if (!mPixmap)
|
|
- return;
|
|
-
|
|
- if (mDamage.isEmpty ())
|
|
- return;
|
|
-
|
|
- if (mShapeSet)
|
|
- mDamage = mShape.intersect (mDamage);
|
|
-
|
|
- w = mGeometry.width () + mContext.extents.left + mContext.extents.right;
|
|
-
|
|
- if (mType == Switcher)
|
|
- shade_alpha = 0;
|
|
-
|
|
- xOff = 0;
|
|
- yOff = 0;
|
|
-
|
|
- r1 = QRegion (xOff, yOff, w, mContext.extents.top);
|
|
- r2 = r1.intersect (mDamage);
|
|
-
|
|
- if (!r2.isEmpty ())
|
|
- {
|
|
- r2.translate (-xOff, -yOff);
|
|
-
|
|
- decor_blend_border_picture (qt_xdisplay (),
|
|
- &mContext,
|
|
- mPicture,
|
|
- xOff, xOff,
|
|
- mTexturePicture,
|
|
- &mLayout,
|
|
- BORDER_TOP,
|
|
- r2.handle (),
|
|
- (unsigned short) (alpha * 0xffff),
|
|
- shade_alpha,
|
|
- TRUE);
|
|
- }
|
|
-
|
|
- xOff = 0;
|
|
- yOff = mContext.extents.top + mGeometry.height ();
|
|
-
|
|
- r1 = QRegion (xOff, yOff, w, mContext.extents.bottom);
|
|
- r2 = r1.intersect (mDamage);
|
|
-
|
|
- if (!r2.isEmpty ())
|
|
- {
|
|
- r2.translate (-xOff, -yOff);
|
|
-
|
|
- decor_blend_border_picture (qt_xdisplay (),
|
|
- &mContext,
|
|
- mPicture,
|
|
- xOff, yOff,
|
|
- mTexturePicture,
|
|
- &mLayout,
|
|
- BORDER_BOTTOM,
|
|
- r2.handle (),
|
|
- (unsigned short) (alpha * 0xffff),
|
|
- shade_alpha,
|
|
- TRUE);
|
|
- }
|
|
-
|
|
- xOff = 0;
|
|
- yOff = mContext.extents.top;
|
|
-
|
|
- r1 = QRegion (xOff, yOff, mContext.extents.left, mGeometry.height ());
|
|
- r2 = r1.intersect (mDamage);
|
|
-
|
|
- if (!r2.isEmpty ())
|
|
- {
|
|
- r2.translate (-xOff, -yOff);
|
|
-
|
|
- decor_blend_border_picture (qt_xdisplay (),
|
|
- &mContext,
|
|
- mPicture,
|
|
- xOff, yOff,
|
|
- mTexturePicture,
|
|
- &mLayout,
|
|
- BORDER_LEFT,
|
|
- r2.handle (),
|
|
- (unsigned short) (alpha * 0xffff),
|
|
- shade_alpha,
|
|
- TRUE);
|
|
- }
|
|
-
|
|
- xOff = mContext.extents.left + mGeometry.width ();
|
|
- yOff = mContext.extents.top;
|
|
-
|
|
- r1 = QRegion (xOff, yOff, mContext.extents.right, mGeometry.height ());
|
|
- r2 = r1.intersect (mDamage);
|
|
-
|
|
- if (!r2.isEmpty ())
|
|
- {
|
|
- r2.translate (-xOff, -yOff);
|
|
-
|
|
- decor_blend_border_picture (qt_xdisplay (),
|
|
- &mContext,
|
|
- mPicture,
|
|
- xOff, yOff,
|
|
- mTexturePicture,
|
|
- &mLayout,
|
|
- BORDER_RIGHT,
|
|
- r2.handle (),
|
|
- (unsigned short) (alpha * 0xffff),
|
|
- shade_alpha,
|
|
- TRUE);
|
|
- }
|
|
-
|
|
- mDamage = QRegion ();
|
|
-
|
|
- XRenderComposite (qt_xdisplay (),
|
|
- PictOpSrc,
|
|
- mTexturePicture,
|
|
- None,
|
|
- mDecorationPicture,
|
|
- 0, 0,
|
|
- 0, 0,
|
|
- 0, 0,
|
|
- mTexturePixmap.width (),
|
|
- mTexturePixmap.height ());
|
|
-
|
|
- if (mUpdateProperty)
|
|
- {
|
|
- if (mType == Switcher)
|
|
- {
|
|
- QPainter p (this);
|
|
- unsigned long pixel;
|
|
- QColor bg = p.backgroundColor ();
|
|
-
|
|
- pixel = (((int) (alpha * 0xff) << 24) |
|
|
- ((int) (alpha * bg.red ()) << 16) |
|
|
- ((int) (alpha * bg.green ()) << 8) |
|
|
- ((int) (alpha * bg.blue ()) << 0));
|
|
-
|
|
- KWD::trapXError ();
|
|
- XSetWindowBackground (qt_xdisplay (), mClientId, pixel);
|
|
- XClearWindow (qt_xdisplay (), mClientId);
|
|
- KWD::popXError ();
|
|
- }
|
|
-
|
|
- updateProperty ();
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::handleProcessKillerExited (void)
|
|
-{
|
|
- if (mProcessKiller)
|
|
- {
|
|
- delete mProcessKiller;
|
|
- mProcessKiller = NULL;
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::showKillProcessDialog (Time timestamp)
|
|
-{
|
|
- KWin::WindowInfo kWinInfo =
|
|
- KWin::windowInfo (mClientId, 0,
|
|
- NET::WM2WindowClass | NET::WM2ClientMachine);
|
|
- NETWinInfo wInfo = NETWinInfo (qt_xdisplay(), mClientId,
|
|
- qt_xrootwin (), NET::WMPid);
|
|
- QCString clientMachine, resourceClass;
|
|
- pid_t pid;
|
|
- char buf[257];
|
|
-
|
|
- if (mProcessKiller)
|
|
- return;
|
|
-
|
|
- clientMachine = kWinInfo.clientMachine ();
|
|
- resourceClass = kWinInfo.windowClassClass ();
|
|
- pid = wInfo.pid ();
|
|
-
|
|
- if (gethostname (buf, sizeof (buf) - 1) == 0)
|
|
- {
|
|
- if (strcmp (buf, clientMachine) == 0)
|
|
- clientMachine = "localhost";
|
|
- }
|
|
-
|
|
- mProcessKiller = new KProcess (this);
|
|
-
|
|
- *mProcessKiller << KStandardDirs::findExe ("kwin_killer_helper") <<
|
|
- "--pid" << QCString ().setNum (pid) <<
|
|
- "--hostname" << clientMachine <<
|
|
- "--windowname" << mName.utf8 () <<
|
|
- "--applicationname" << resourceClass <<
|
|
- "--wid" << QCString ().setNum (mClientId) <<
|
|
- "--timestamp" << QCString ().setNum (timestamp);
|
|
-
|
|
- connect (mProcessKiller, SIGNAL (processExited (KProcess *)),
|
|
- SLOT (handleProcessKillerExited ()));
|
|
-
|
|
- if (!mProcessKiller->start (KProcess::NotifyOnExit))
|
|
- {
|
|
- delete mProcessKiller;
|
|
- mProcessKiller = NULL;
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::hideKillProcessDialog (void)
|
|
-{
|
|
- handleProcessKillerExited ();
|
|
-}
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator/window.h compiz-0.8.8/kde/window-decorator/window.h
|
|
--- compiz-0.8.8-orig/kde/window-decorator/window.h 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator/window.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,243 +0,0 @@
|
|
-/*
|
|
- * Copyright © 2006 Novell, Inc.
|
|
- * Copyright © 2006 Dennis Kasprzyk <onestone@beryl-project.org>
|
|
- * Copyright © 2006 Volker Krause <vkrause@kde.org>
|
|
- *
|
|
- * 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., 51 Franklin Street, Fifth Floor, Boston,
|
|
- * MA 02110-1301, USA.
|
|
- *
|
|
- * Author: David Reveman <davidr@novell.com>
|
|
- */
|
|
-
|
|
-#ifndef _WINDOW_H
|
|
-#define _WINDOW_H
|
|
-
|
|
-#include <kdecoration_p.h>
|
|
-
|
|
-#include <qpixmap.h>
|
|
-#include <qwidget.h>
|
|
-
|
|
-#include <decoration.h>
|
|
-
|
|
-#include <X11/extensions/Xdamage.h>
|
|
-
|
|
-#include "utils.h"
|
|
-#include "options.h"
|
|
-
|
|
-class KProcess;
|
|
-class KDecoration;
|
|
-class QPopupMenu;
|
|
-
|
|
-namespace KWD
|
|
-{
|
|
-class Window:public QWidget, public KDecorationBridge {
|
|
- Q_OBJECT public:
|
|
-
|
|
- enum Type
|
|
- {
|
|
- Normal,
|
|
- Switcher,
|
|
- Default,
|
|
- DefaultActive
|
|
- };
|
|
-
|
|
- public:
|
|
- Window (WId parentId, WId clientId, WId frame, Type type,
|
|
- int x = 0, int y = 0, int w = 1, int h = 1);
|
|
- ~Window (void);
|
|
-
|
|
- virtual bool isActive (void) const;
|
|
- virtual bool isCloseable (void) const;
|
|
- virtual bool isMaximizable (void) const;
|
|
- virtual MaximizeMode maximizeMode (void) const;
|
|
- virtual bool isMinimizable (void) const;
|
|
- virtual bool providesContextHelp (void) const;
|
|
- virtual int desktop (void) const;
|
|
- virtual bool isModal (void) const;
|
|
- virtual bool isShadeable (void) const;
|
|
- virtual bool isShade (void) const;
|
|
- virtual bool isSetShade (void) const;
|
|
- virtual bool keepAbove (void) const;
|
|
- virtual bool keepBelow (void) const;
|
|
- virtual bool isMovable (void) const;
|
|
- virtual bool isResizable (void) const;
|
|
- virtual NET::WindowType
|
|
- windowType (unsigned long supported_types) const;
|
|
- virtual QIconSet icon (void) const;
|
|
- virtual QString caption (void) const;
|
|
- virtual void processMousePressEvent (QMouseEvent *);
|
|
- virtual void showWindowMenu (const QRect &);
|
|
- virtual void showWindowMenu (QPoint);
|
|
- virtual void performWindowOperation (WindowOperation);
|
|
- virtual void setMask (const QRegion &, int);
|
|
- virtual bool isPreview (void) const;
|
|
- virtual QRect geometry (void) const;
|
|
- virtual QRect iconGeometry (void) const;
|
|
- virtual QRegion unobscuredRegion (const QRegion & r) const;
|
|
- virtual QWidget *workspaceWidget (void) const;
|
|
- virtual WId windowId (void) const;
|
|
- virtual void closeWindow (void);
|
|
- virtual void maximize (MaximizeMode mode);
|
|
- virtual void minimize (void);
|
|
- virtual void showContextHelp (void);
|
|
- virtual void setDesktop (int desktop);
|
|
- virtual void titlebarDblClickOperation (void);
|
|
- virtual void titlebarMouseWheelOperation (int delta);
|
|
- virtual void setShade (bool set);
|
|
- virtual void setKeepAbove (bool);
|
|
- virtual void setKeepBelow (bool);
|
|
- virtual int currentDesktop (void) const;
|
|
- virtual QWidget *initialParentWidget (void) const;
|
|
- virtual Qt::WFlags initialWFlags (void) const;
|
|
- virtual void helperShowHide (bool);
|
|
- virtual void grabXServer (bool grab);
|
|
-
|
|
- void handleActiveChange (void);
|
|
- void updateFrame (WId frame);
|
|
- void updateWindowGeometry (void);
|
|
- void updateCursor (QPoint pos);
|
|
- void updateSelected (WId selected);
|
|
- WId frameId (void) const
|
|
- {
|
|
- return mFrame;
|
|
- }
|
|
- KDecoration *decoration (void) const
|
|
- {
|
|
- return mDecor;
|
|
- }
|
|
- QWidget *activeChild (void) const
|
|
- {
|
|
- return mActiveChild;
|
|
- }
|
|
- void setActiveChild (QWidget * child)
|
|
- {
|
|
- mActiveChild = child;
|
|
- }
|
|
- QRegion *getShape (void)
|
|
- {
|
|
- if (mShapeSet)
|
|
- return &mShape;
|
|
-
|
|
- return NULL;
|
|
- }
|
|
- void getShapeInfo (bool *horz, bool *vert)
|
|
- {
|
|
- *horz = mUniqueHorzShape;
|
|
- *vert = mUniqueVertShape;
|
|
- }
|
|
- void moveWindow (QMouseEvent *qme);
|
|
- void reloadDecoration (void);
|
|
- void updateState (void);
|
|
- void updateName (void);
|
|
- void updateIcons (void);
|
|
- void updateOpacity (void)
|
|
- {
|
|
- mOpacity = readPropertyShort (mClientId, Atoms::netWmWindowOpacity,
|
|
- 0xffff);
|
|
- }
|
|
- Drawable pixmapId (void) const
|
|
- {
|
|
- return mPixmap;
|
|
- }
|
|
- void addDamageRect (int x, int y, int w, int h)
|
|
- {
|
|
- mDamage += QRegion (x, y, w, h);
|
|
- }
|
|
- bool handleMap (void);
|
|
- bool handleConfigure (QSize size);
|
|
- void processDamage (void);
|
|
- decor_context_t *context (void)
|
|
- {
|
|
- return &mContext;
|
|
- }
|
|
- decor_shadow_t *shadow (void)
|
|
- {
|
|
- return mShadow;
|
|
- }
|
|
- decor_extents_t *border (void)
|
|
- {
|
|
- return &mBorder;
|
|
- }
|
|
- QRect clientGeometry (void);
|
|
- void showKillProcessDialog (Time timestamp);
|
|
- void hideKillProcessDialog (void);
|
|
-
|
|
- private:
|
|
- void createDecoration (void);
|
|
- void updateShadow (void);
|
|
- bool resizeDecoration (bool force = false);
|
|
- void updateBlurProperty (int topOffset,
|
|
- int bottomOffset,
|
|
- int leftOffset,
|
|
- int rightOffset);
|
|
- void updateProperty (void);
|
|
- void getWindowProtocols (void);
|
|
- void performMouseCommand (KWD::Options::MouseCommand command,
|
|
- QMouseEvent *qme);
|
|
- NET::Direction positionToDirection (int pos);
|
|
- Cursor positionToCursor (QPoint pos);
|
|
- void rebindPixmap (void);
|
|
-
|
|
-
|
|
- private slots:
|
|
- void handlePopupActivated (int id);
|
|
- void handleDesktopPopupActivated (int id);
|
|
- void handlePopupAboutToShow (void);
|
|
- void handleProcessKillerExited (void);
|
|
-
|
|
- private:
|
|
- Type mType;
|
|
- WId mParentId;
|
|
- WId mFrame;
|
|
- WId mClientId;
|
|
- WId mSelectedId;
|
|
- QRect mGeometry;
|
|
- QString mName;
|
|
- QIconSet mIcons;
|
|
- decor_extents_t mBorder;
|
|
- unsigned short mOpacity;
|
|
- KDecoration *mDecor;
|
|
- QPixmap mTexturePixmap;
|
|
- QPixmap mTexturePixmapBuffer;
|
|
- Pixmap mPixmap;
|
|
- QRegion mDamage;
|
|
- WId mDamageId;
|
|
- decor_layout_t mLayout;
|
|
- decor_context_t mContext;
|
|
- decor_shadow_t *mShadow;
|
|
- Picture mPicture;
|
|
- Picture mTexturePicture;
|
|
- Picture mDecorationPicture;
|
|
- bool mUpdateProperty;
|
|
- bool mShapeSet;
|
|
- bool mUniqueHorzShape;
|
|
- bool mUniqueVertShape;
|
|
- QRegion mShape;
|
|
- QWidget *mActiveChild;
|
|
- bool mSupportTakeFocus;
|
|
- bool mSupportContextHelp;
|
|
- QPopupMenu *mPopup;
|
|
- QPopupMenu *mAdvancedMenu;
|
|
- QPopupMenu *mDesktopMenu;
|
|
- unsigned long mState;
|
|
- bool mMapped;
|
|
- int mPendingMap;
|
|
- int mPendingConfigure;
|
|
- QSize mSize;
|
|
- KProcess *mProcessKiller;
|
|
- };
|
|
-}
|
|
-
|
|
-#endif
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator-kde4/decorator.cpp compiz-0.8.8/kde/window-decorator-kde4/decorator.cpp
|
|
--- compiz-0.8.8-orig/kde/window-decorator-kde4/decorator.cpp 2010-12-14 14:56:09.000000000 +0100
|
|
+++ compiz-0.8.8/kde/window-decorator-kde4/decorator.cpp 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,890 +0,0 @@
|
|
-/*
|
|
- * Copyright © 2008 Dennis Kasprzyk <onestone@opencompositing.org>
|
|
- * Copyright © 2006 Novell, Inc.
|
|
- * Copyright © 2006 Volker Krause <vkrause@kde.org>
|
|
- *
|
|
- * 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., 51 Franklin Street, Fifth Floor, Boston,
|
|
- * MA 02110-1301, USA.
|
|
- *
|
|
- * Author: David Reveman <davidr@novell.com>
|
|
- */
|
|
-
|
|
-#include <KDE/KCmdLineArgs>
|
|
-#include <KDE/KConfig>
|
|
-#include <KDE/KConfigGroup>
|
|
-#include <KDE/KGlobal>
|
|
-#include <kwindowsystem.h>
|
|
-#include <KDE/KLocale>
|
|
-#include <KDE/Plasma/Theme>
|
|
-#include <kcommondecoration.h>
|
|
-#include <kwindowsystem.h>
|
|
-
|
|
-#include <QPoint>
|
|
-#include <QList>
|
|
-#include <QX11Info>
|
|
-
|
|
-#include <X11/Xlib.h>
|
|
-#include <X11/extensions/Xcomposite.h>
|
|
-
|
|
-#include "decorator.h"
|
|
-#include "options.h"
|
|
-#include "utils.h"
|
|
-
|
|
-#include "kwinadaptor.h"
|
|
-
|
|
-#include <stdio.h>
|
|
-
|
|
-#define SHADOW_RADIUS 8.0
|
|
-#define SHADOW_OPACITY 0.5
|
|
-#define SHADOW_OFFSET_X 1
|
|
-#define SHADOW_OFFSET_Y 1
|
|
-#define SHADOW_COLOR_RED 0x0000
|
|
-#define SHADOW_COLOR_GREEN 0x0000
|
|
-#define SHADOW_COLOR_BLUE 0x0000
|
|
-
|
|
-#define DBUS_DEST "org.freedesktop.compiz"
|
|
-#define DBUS_SIGNAL_PATH "/org/freedesktop/compiz/decoration/display"
|
|
-#define DBUS_QUERY_PATH "/org/freedesktop/compiz/decoration/allscreens"
|
|
-#define DBUS_INTERFACE "org.freedesktop.compiz"
|
|
-#define DBUS_METHOD_GET "get"
|
|
-#define DBUS_SIGNAL_CHANGED "changed"
|
|
-
|
|
-int blurType = BLUR_TYPE_NONE;
|
|
-
|
|
-decor_shadow_t *KWD::Decorator::mNoBorderShadow = 0;
|
|
-KWD::PluginManager *KWD::Decorator::mPlugins = 0;
|
|
-KWD::Options *KWD::Decorator::mOptions = 0;
|
|
-NETRootInfo *KWD::Decorator::mRootInfo;
|
|
-WId KWD::Decorator::mActiveId;
|
|
-decor_shadow_options_t KWD::Decorator::mShadowOptions;
|
|
-
|
|
-struct _cursor cursors[3][3] = {
|
|
- { C (top_left_corner), C (top_side), C (top_right_corner) },
|
|
- { C (left_side), C (left_ptr), C (right_side) },
|
|
- { C (bottom_left_corner), C (bottom_side), C (bottom_right_corner) }
|
|
-};
|
|
-
|
|
-KWD::PluginManager::PluginManager (KSharedConfigPtr config):
|
|
- KWD::KDecorationPlugins (config)
|
|
-{
|
|
- defaultPlugin = (QPixmap::defaultDepth() > 8) ?
|
|
- "kwin3_oxygen" : "kwin3_plastik";
|
|
-}
|
|
-
|
|
-
|
|
-KWD::Decorator::Decorator () :
|
|
- KApplication (),
|
|
- mConfig (0),
|
|
- mCompositeWindow (0),
|
|
- mSwitcher (0)
|
|
-{
|
|
- XSetWindowAttributes attr;
|
|
- int i, j;
|
|
- QDBusConnection dbus = QDBusConnection::sessionBus();
|
|
-
|
|
- mRootInfo = new NETRootInfo (QX11Info::display(), 0);
|
|
-
|
|
- mActiveId = 0;
|
|
-
|
|
- KConfigGroup cfg (KSharedConfig::openConfig("plasmarc"), QString("Theme"));
|
|
- Plasma::Theme::defaultTheme ()->setThemeName (cfg.readEntry ("name"));
|
|
-
|
|
- Atoms::init ();
|
|
-
|
|
- (void *) new KWinAdaptor (this);
|
|
- dbus.registerObject ("/KWin", this);
|
|
- dbus.connect (QString (), "/KWin", "org.kde.KWin", "reloadConfig", this,
|
|
- SLOT (reconfigure ()));
|
|
-
|
|
- dbus.connect (QString (), DBUS_SIGNAL_PATH "/shadow_radius",
|
|
- DBUS_INTERFACE, DBUS_SIGNAL_CHANGED, this,
|
|
- SLOT (shadowRadiusChanged (double)));
|
|
-
|
|
- dbus.connect (QString (), DBUS_SIGNAL_PATH "/shadow_opacity",
|
|
- DBUS_INTERFACE, DBUS_SIGNAL_CHANGED, this,
|
|
- SLOT (shadowOpacityChanged (double)));
|
|
-
|
|
- dbus.connect (QString (), DBUS_SIGNAL_PATH "/shadow_x_offset",
|
|
- DBUS_INTERFACE, DBUS_SIGNAL_CHANGED, this,
|
|
- SLOT (shadowXOffsetChanged (int)));
|
|
-
|
|
- dbus.connect (QString (), DBUS_SIGNAL_PATH "/shadow_y_offset",
|
|
- DBUS_INTERFACE, DBUS_SIGNAL_CHANGED, this,
|
|
- SLOT (shadowYOffsetChanged (int)));
|
|
-
|
|
- dbus.connect (QString (), DBUS_SIGNAL_PATH "/shadow_color",
|
|
- DBUS_INTERFACE, DBUS_SIGNAL_CHANGED, this,
|
|
- SLOT (shadowColorChanged (QString)));
|
|
-
|
|
- mConfig = new KConfig ("kwinrc");
|
|
-
|
|
- mOptions = new KWD::Options (mConfig);
|
|
- mPlugins = new PluginManager (KSharedConfig::openConfig("kwinrc"));
|
|
-
|
|
- mShadowOptions.shadow_radius = SHADOW_RADIUS;
|
|
- mShadowOptions.shadow_opacity = SHADOW_OPACITY;
|
|
- mShadowOptions.shadow_offset_x = SHADOW_OFFSET_X;
|
|
- mShadowOptions.shadow_offset_y = SHADOW_OFFSET_Y;
|
|
- mShadowOptions.shadow_color[0] = SHADOW_COLOR_RED;
|
|
- mShadowOptions.shadow_color[1] = SHADOW_COLOR_GREEN;
|
|
- mShadowOptions.shadow_color[2] = SHADOW_COLOR_BLUE;
|
|
-
|
|
- for (i = 0; i < 3; i++)
|
|
- {
|
|
- for (j = 0; j < 3; j++)
|
|
- {
|
|
- if (cursors[i][j].shape != XC_left_ptr)
|
|
- cursors[i][j].cursor =
|
|
- XCreateFontCursor (QX11Info::display(), cursors[i][j].shape);
|
|
- }
|
|
- }
|
|
-
|
|
- attr.override_redirect = True;
|
|
-
|
|
- mCompositeWindow = XCreateWindow (QX11Info::display(), QX11Info::appRootWindow(),
|
|
- -ROOT_OFF_X, -ROOT_OFF_Y, 1, 1, 0,
|
|
- CopyFromParent,
|
|
- CopyFromParent,
|
|
- CopyFromParent,
|
|
- CWOverrideRedirect, &attr);
|
|
-
|
|
- long data = 1;
|
|
- XChangeProperty (QX11Info::display(), mCompositeWindow, Atoms::enlightmentDesktop,
|
|
- XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &data, 1);
|
|
-
|
|
- XCompositeRedirectSubwindows (QX11Info::display(), mCompositeWindow,
|
|
- CompositeRedirectManual);
|
|
-
|
|
- XMapWindow (QX11Info::display(), mCompositeWindow);
|
|
-}
|
|
-
|
|
-KWD::Decorator::~Decorator (void)
|
|
-{
|
|
- QMap <WId, KWD::Window *>::ConstIterator it;
|
|
-
|
|
- for (it = mClients.begin (); it != mClients.end (); it++)
|
|
- delete (*it);
|
|
-
|
|
- if (mDecorNormal)
|
|
- delete mDecorNormal;
|
|
-
|
|
- if (mDecorActive)
|
|
- delete mDecorActive;
|
|
-
|
|
- if (mSwitcher)
|
|
- delete mSwitcher;
|
|
-
|
|
- XDestroyWindow (QX11Info::display(), mCompositeWindow);
|
|
-
|
|
- delete mOptions;
|
|
- delete mPlugins;
|
|
- delete mConfig;
|
|
- delete mRootInfo;
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Decorator::enableDecorations (Time timestamp)
|
|
-{
|
|
- QList <WId>::ConstIterator it;
|
|
-
|
|
- mDmSnTimestamp = timestamp;
|
|
-
|
|
- if (!pluginManager ()->loadPlugin (""))
|
|
- return false;
|
|
-
|
|
- updateAllShadowOptions ();
|
|
-
|
|
- KWD::trapXError ();
|
|
- (void) QApplication::desktop (); // trigger creation of desktop widget
|
|
- KWD::popXError ();
|
|
-
|
|
- updateShadow ();
|
|
-
|
|
- mDecorNormal = new KWD::Window (mCompositeWindow, QX11Info::appRootWindow(),
|
|
- 0, Window::Default);
|
|
- mDecorActive = new KWD::Window (mCompositeWindow, QX11Info::appRootWindow(),
|
|
- 0, Window::DefaultActive);
|
|
-
|
|
- mActiveId = KWindowSystem::activeWindow ();
|
|
-
|
|
- connect (KWindowSystem::self (), SIGNAL (windowAdded (WId)),
|
|
- SLOT (handleWindowAdded (WId)));
|
|
- connect (KWindowSystem::self (), SIGNAL (windowRemoved (WId)),
|
|
- SLOT (handleWindowRemoved (WId)));
|
|
- connect (KWindowSystem::self (), SIGNAL (activeWindowChanged (WId)),
|
|
- SLOT (handleActiveWindowChanged (WId)));
|
|
- connect (KWindowSystem::self (),
|
|
- SIGNAL (windowChanged (WId, const unsigned long *)),
|
|
- SLOT (handleWindowChanged (WId, const unsigned long *)));
|
|
-
|
|
- foreach (WId id, KWindowSystem::windows ())
|
|
- handleWindowAdded (id);
|
|
-
|
|
- connect (Plasma::Theme::defaultTheme (), SIGNAL (themeChanged ()),
|
|
- SLOT (plasmaThemeChanged ()));
|
|
-
|
|
- // select for client messages
|
|
- XSelectInput (QX11Info::display(), QX11Info::appRootWindow(),
|
|
- StructureNotifyMask | PropertyChangeMask);
|
|
-
|
|
- return true;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::updateAllShadowOptions (void)
|
|
-{
|
|
- QDBusInterface *compiz;
|
|
- QDBusReply<QString> stringReply;
|
|
- QDBusReply<double> doubleReply;
|
|
- QDBusReply<int> intReply;
|
|
- int c[4];
|
|
-
|
|
- compiz = new QDBusInterface (DBUS_DEST, DBUS_QUERY_PATH "/shadow_radius",
|
|
- DBUS_INTERFACE);
|
|
- doubleReply = compiz->call (DBUS_METHOD_GET);
|
|
- delete compiz;
|
|
-
|
|
- if (doubleReply.isValid ())
|
|
- mShadowOptions.shadow_radius = doubleReply.value ();
|
|
-
|
|
- compiz = new QDBusInterface (DBUS_DEST, DBUS_QUERY_PATH "/shadow_opacity",
|
|
- DBUS_INTERFACE);
|
|
- doubleReply = compiz->call (DBUS_METHOD_GET);
|
|
- delete compiz;
|
|
-
|
|
- if (doubleReply.isValid ())
|
|
- mShadowOptions.shadow_opacity = doubleReply.value ();
|
|
-
|
|
- compiz = new QDBusInterface (DBUS_DEST, DBUS_QUERY_PATH "/shadow_x_offset",
|
|
- DBUS_INTERFACE);
|
|
- intReply = compiz->call (DBUS_METHOD_GET);
|
|
- delete compiz;
|
|
-
|
|
- if (intReply.isValid ())
|
|
- mShadowOptions.shadow_offset_x = intReply.value ();
|
|
-
|
|
- compiz = new QDBusInterface (DBUS_DEST, DBUS_QUERY_PATH "/shadow_y_offset",
|
|
- DBUS_INTERFACE);
|
|
- intReply = compiz->call (DBUS_METHOD_GET);
|
|
- delete compiz;
|
|
-
|
|
- if (intReply.isValid ())
|
|
- mShadowOptions.shadow_offset_y = intReply.value ();
|
|
- else
|
|
- mShadowOptions.shadow_offset_y = SHADOW_OFFSET_Y;
|
|
-
|
|
- compiz = new QDBusInterface (DBUS_DEST, DBUS_QUERY_PATH "/shadow_color",
|
|
- DBUS_INTERFACE);
|
|
- stringReply = compiz->call (DBUS_METHOD_GET);
|
|
- delete compiz;
|
|
-
|
|
- if (stringReply.isValid () &&
|
|
- sscanf (stringReply.value ().toAscii ().data (), "#%2x%2x%2x%2x",
|
|
- &c[0], &c[1], &c[2], &c[3]) == 4)
|
|
- {
|
|
- mShadowOptions.shadow_color[0] = c[0] << 8 | c[0];
|
|
- mShadowOptions.shadow_color[1] = c[1] << 8 | c[1];
|
|
- mShadowOptions.shadow_color[2] = c[2] << 8 | c[2];
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::changeShadowOptions (decor_shadow_options_t *opt)
|
|
-{
|
|
- QMap <WId, KWD::Window *>::ConstIterator it;
|
|
-
|
|
- if (!memcmp (opt, &mShadowOptions, sizeof (decor_shadow_options_t)))
|
|
- return;
|
|
-
|
|
- mShadowOptions = *opt;
|
|
-
|
|
- updateShadow ();
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::updateShadow (void)
|
|
-{
|
|
- Display *xdisplay = QX11Info::display();
|
|
- Screen *xscreen;
|
|
- decor_context_t context;
|
|
-
|
|
- xscreen = ScreenOfDisplay (xdisplay, QX11Info::appScreen ());
|
|
-
|
|
- if (mNoBorderShadow)
|
|
- decor_shadow_destroy (xdisplay, mNoBorderShadow);
|
|
-
|
|
- mNoBorderShadow = decor_shadow_create (xdisplay,
|
|
- xscreen,
|
|
- 1, 1,
|
|
- 0,
|
|
- 0,
|
|
- 0,
|
|
- 0,
|
|
- 0, 0, 0, 0,
|
|
- &mShadowOptions,
|
|
- &context,
|
|
- decor_draw_simple,
|
|
- 0);
|
|
-
|
|
- if (mNoBorderShadow)
|
|
- {
|
|
- decor_extents_t extents = { 0, 0, 0, 0 };
|
|
- long data[256];
|
|
- decor_quad_t quads[N_QUADS_MAX];
|
|
- int nQuad;
|
|
- decor_layout_t layout;
|
|
-
|
|
- decor_get_default_layout (&context, 1, 1, &layout);
|
|
-
|
|
- nQuad = decor_set_lSrStSbS_window_quads (quads, &context, &layout);
|
|
-
|
|
- decor_quads_to_property (data, mNoBorderShadow->pixmap,
|
|
- &extents, &extents,
|
|
- 0, 0, quads, nQuad);
|
|
-
|
|
- KWD::trapXError ();
|
|
- XChangeProperty (QX11Info::display(), QX11Info::appRootWindow(),
|
|
- Atoms::netWindowDecorBare,
|
|
- XA_INTEGER,
|
|
- 32, PropModeReplace, (unsigned char *) data,
|
|
- BASE_PROP_SIZE + QUAD_PROP_SIZE * nQuad);
|
|
- KWD::popXError ();
|
|
- }
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Decorator::x11EventFilter (XEvent *xevent)
|
|
-{
|
|
- KWD::Window *client;
|
|
- int status;
|
|
-
|
|
- switch (xevent->type) {
|
|
- case ConfigureNotify: {
|
|
- XConfigureEvent *xce = reinterpret_cast <XConfigureEvent *> (xevent);
|
|
-
|
|
- if (mFrames.contains (xce->window))
|
|
- mFrames[xce->window]->updateFrame (xce->window);
|
|
-
|
|
- } break;
|
|
- case SelectionRequest:
|
|
- decor_handle_selection_request (QX11Info::display(), xevent, mDmSnTimestamp);
|
|
- break;
|
|
- case SelectionClear:
|
|
- status = decor_handle_selection_clear (QX11Info::display(),
|
|
- xevent, 0);
|
|
- if (status == DECOR_SELECTION_GIVE_UP)
|
|
- KApplication::exit (0);
|
|
-
|
|
- break;
|
|
- case PropertyNotify:
|
|
- if (xevent->xproperty.atom == Atoms::netFrameWindow)
|
|
- {
|
|
- handleWindowAdded (xevent->xproperty.window);
|
|
- }
|
|
- else if (xevent->xproperty.atom == Atoms::switchSelectWindow)
|
|
- {
|
|
- WId id = xevent->xproperty.window;
|
|
-
|
|
- if (!mSwitcher || mSwitcher->xid () != id)
|
|
- handleWindowAdded (id);
|
|
- mSwitcher->update ();
|
|
- }
|
|
- else if (xevent->xproperty.atom == Atoms::netWmWindowOpacity)
|
|
- {
|
|
- if (mClients.contains (xevent->xproperty.window))
|
|
- mClients[xevent->xproperty.window]->updateOpacity ();
|
|
- }
|
|
- break;
|
|
- case EnterNotify:
|
|
- {
|
|
- XCrossingEvent *xce = reinterpret_cast <XCrossingEvent *> (xevent);
|
|
- QWidget *child;
|
|
-
|
|
- if (!mFrames.contains (xce->window))
|
|
- break;
|
|
-
|
|
- client = mFrames[xce->window];
|
|
-
|
|
- if (!client->decorWidget ())
|
|
- break;
|
|
-
|
|
- child = client->childAt (xce->x, xce->y);
|
|
- if (child)
|
|
- {
|
|
- QEvent qe (QEvent::Enter);
|
|
-
|
|
- QApplication::sendEvent (child, &qe);
|
|
-
|
|
- client->setActiveChild (child);
|
|
- client->updateCursor (QPoint (xce->x, xce->y));
|
|
- }
|
|
- } break;
|
|
- case LeaveNotify:
|
|
- {
|
|
- XCrossingEvent *xce = reinterpret_cast <XCrossingEvent *> (xevent);
|
|
-
|
|
- if (mFrames.contains (xce->window))
|
|
- {
|
|
- QEvent qe (QEvent::Leave);
|
|
-
|
|
- client = mFrames[xce->window];
|
|
-
|
|
- if (client->activeChild ())
|
|
- QApplication::sendEvent (client->activeChild (), &qe);
|
|
-
|
|
- XUndefineCursor (QX11Info::display(), client->frameId ());
|
|
- }
|
|
- } break;
|
|
- case MotionNotify:
|
|
- {
|
|
- XMotionEvent *xme = reinterpret_cast < XMotionEvent * >(xevent);
|
|
- QWidget *child;
|
|
-
|
|
- if (!mFrames.contains (xme->window))
|
|
- break;
|
|
-
|
|
- client = mFrames[xme->window];
|
|
-
|
|
- if (!client->decorWidget ())
|
|
- break;
|
|
-
|
|
- child = client->childAt (xme->x, xme->y);
|
|
-
|
|
- if (child)
|
|
- {
|
|
- QPoint qp (xme->x, xme->y);
|
|
-
|
|
- if (child != client->activeChild ())
|
|
- {
|
|
- QEvent qee (QEvent::Enter);
|
|
- QEvent qle (QEvent::Leave);
|
|
-
|
|
- if (client->activeChild ())
|
|
- QApplication::sendEvent (client->activeChild (), &qle);
|
|
-
|
|
- QApplication::sendEvent (child, &qee);
|
|
-
|
|
- client->setActiveChild (child);
|
|
- }
|
|
-
|
|
- if (client->decorWidget () != child)
|
|
- qp = child->mapFrom (client->decorWidget (), qp);
|
|
-
|
|
- QMouseEvent qme (QEvent::MouseMove, qp, Qt::NoButton,
|
|
- Qt::NoButton, Qt::NoModifier);
|
|
-
|
|
- QApplication::sendEvent (child, &qme);
|
|
-
|
|
- client->updateCursor (QPoint (xme->x, xme->y));
|
|
- }
|
|
- } break;
|
|
- case ButtonPress:
|
|
- case ButtonRelease:
|
|
- {
|
|
- XButtonEvent *xbe = reinterpret_cast <XButtonEvent *>(xevent);
|
|
- QWidget *child;
|
|
-
|
|
- if (!mFrames.contains (xbe->window))
|
|
- break;
|
|
-
|
|
- client = mFrames[xbe->window];
|
|
-
|
|
- if (!client->decorWidget ())
|
|
- break;
|
|
-
|
|
- child = client->childAt (xbe->x, xbe->y);
|
|
-
|
|
- if (child)
|
|
- {
|
|
- XButtonEvent xbe2 = *xbe;
|
|
- xbe2.window = child->winId ();
|
|
-
|
|
- QPoint p;
|
|
-
|
|
- p = client->mapToChildAt (QPoint (xbe->x, xbe->y));
|
|
- xbe2.x = p.x ();
|
|
- xbe2.y = p.y ();
|
|
-
|
|
- p = child->mapToGlobal(p);
|
|
- xbe2.x_root = p.x ();
|
|
- xbe2.y_root = p.y ();
|
|
-
|
|
- client->setFakeRelease (false);
|
|
- QApplication::x11ProcessEvent ((XEvent *) &xbe2);
|
|
-
|
|
- /* We won't get a button release event, because of the screengrabs
|
|
- in compiz */
|
|
- if (client->getFakeRelease () && xevent->type == ButtonPress)
|
|
- {
|
|
- xbe2.type = ButtonRelease;
|
|
- QApplication::x11ProcessEvent ((XEvent *) &xbe2);
|
|
- }
|
|
-
|
|
- return true;
|
|
- }
|
|
- } break;
|
|
- case ClientMessage:
|
|
- if (xevent->xclient.message_type == Atoms::toolkitActionAtom)
|
|
- {
|
|
- unsigned long action;
|
|
-
|
|
- action = xevent->xclient.data.l[0];
|
|
- if (action == Atoms::toolkitActionWindowMenuAtom)
|
|
- {
|
|
- if (mClients.contains (xevent->xclient.window))
|
|
- {
|
|
- QPoint pos;
|
|
-
|
|
- client = mClients[xevent->xclient.window];
|
|
-
|
|
- if (xevent->xclient.data.l[2])
|
|
- {
|
|
- pos = QPoint (xevent->xclient.data.l[3],
|
|
- xevent->xclient.data.l[4]);
|
|
- }
|
|
- else
|
|
- {
|
|
- pos = client->clientGeometry ().topLeft ();
|
|
- }
|
|
-
|
|
- client->showWindowMenu (pos);
|
|
- }
|
|
- }
|
|
- else if (action == Atoms::toolkitActionForceQuitDialogAtom)
|
|
- {
|
|
- if (mClients.contains (xevent->xclient.window))
|
|
- {
|
|
- Time timestamp = xevent->xclient.data.l[1];
|
|
-
|
|
- client = mClients[xevent->xclient.window];
|
|
-
|
|
- if (xevent->xclient.data.l[2])
|
|
- client->showKillProcessDialog (timestamp);
|
|
- else
|
|
- client->hideKillProcessDialog ();
|
|
- }
|
|
- }
|
|
- }
|
|
- break;
|
|
- default:
|
|
- break;
|
|
- }
|
|
-
|
|
- return KApplication::x11EventFilter (xevent);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::reconfigure (void)
|
|
-{
|
|
- unsigned long changed;
|
|
-
|
|
- mConfig->reparseConfiguration ();
|
|
-
|
|
- changed = mOptions->updateSettings ();
|
|
- if (mPlugins->reset (changed))
|
|
- {
|
|
- QMap < WId, KWD::Window * >::ConstIterator it;
|
|
-
|
|
- updateShadow ();
|
|
-
|
|
- mDecorNormal->reloadDecoration ();
|
|
- mDecorActive->reloadDecoration ();
|
|
-
|
|
- for (it = mClients.constBegin (); it != mClients.constEnd (); it++)
|
|
- it.value ()->reloadDecoration ();
|
|
-
|
|
- mPlugins->destroyPreviousPlugin ();
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::handleWindowAdded (WId id)
|
|
-{
|
|
- QMap <WId, KWD::Window *>::ConstIterator it;
|
|
- KWD::Window *client = 0;
|
|
- WId select, frame = 0;
|
|
- KWD::Window::Type type = KWD::Window::Normal;
|
|
- unsigned int width, height, border, depth;
|
|
- int x, y;
|
|
- XID root;
|
|
- QWidgetList widgets;
|
|
-
|
|
- /* avoid adding any of our own top level windows */
|
|
- foreach (QWidget *widget, QApplication::topLevelWidgets()) {
|
|
- if (widget->winId() == id)
|
|
- return;
|
|
- }
|
|
-
|
|
- KWD::trapXError ();
|
|
- XGetGeometry (QX11Info::display(), id, &root, &x, &y, &width, &height,
|
|
- &border, &depth);
|
|
- if (KWD::popXError ())
|
|
- return;
|
|
-
|
|
- KWD::readWindowProperty (id, Atoms::netFrameWindow, (long *) &frame);
|
|
-
|
|
- if (KWD::readWindowProperty (id, Atoms::switchSelectWindow,
|
|
- (long *) &select))
|
|
- {
|
|
- if (!mSwitcher)
|
|
- mSwitcher = new Switcher (mCompositeWindow, id);
|
|
- if (mSwitcher->xid () != id)
|
|
- {
|
|
- delete mSwitcher;
|
|
- mSwitcher = new Switcher (mCompositeWindow, id);
|
|
- }
|
|
- frame = None;
|
|
- }
|
|
- else
|
|
- {
|
|
- KWindowInfo wInfo = KWindowSystem::windowInfo (id, NET::WMWindowType, 0);
|
|
-
|
|
- switch (wInfo.windowType (~0)) {
|
|
- case NET::Normal:
|
|
- case NET::Dialog:
|
|
- case NET::Toolbar:
|
|
- case NET::Menu:
|
|
- case NET::Utility:
|
|
- case NET::Splash:
|
|
- case NET::Unknown:
|
|
- /* decorate these window types */
|
|
- break;
|
|
- default:
|
|
- return;
|
|
- }
|
|
-
|
|
- type = KWD::Window::Normal;
|
|
- }
|
|
-
|
|
- KWD::trapXError ();
|
|
- XSelectInput (QX11Info::display(), id, StructureNotifyMask | PropertyChangeMask);
|
|
- KWD::popXError ();
|
|
-
|
|
- if (frame)
|
|
- {
|
|
- if (!mClients.contains (id))
|
|
- {
|
|
- client = new KWD::Window (mCompositeWindow, id, frame, type,
|
|
- x, y,
|
|
- width + border * 2,
|
|
- height + border * 2);
|
|
-
|
|
- mClients.insert (id, client);
|
|
- mFrames.insert (frame, client);
|
|
- }
|
|
- else
|
|
- {
|
|
- client = mClients[id];
|
|
- mFrames.remove (client->frameId ());
|
|
- mFrames.insert (frame, client);
|
|
-
|
|
- client->updateFrame (frame);
|
|
- }
|
|
- }
|
|
- else
|
|
- {
|
|
- if (mClients.contains (id))
|
|
- client = mClients[id];
|
|
-
|
|
- if (client)
|
|
- {
|
|
- mClients.remove (client->windowId ());
|
|
- mFrames.remove (client->frameId ());
|
|
-
|
|
- delete client;
|
|
- }
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::handleWindowRemoved (WId id)
|
|
-{
|
|
- KWD::Window *window = 0;
|
|
-
|
|
- if (mClients.contains (id))
|
|
- window = mClients[id];
|
|
- else if (mFrames.contains (id))
|
|
- window = mFrames[id];
|
|
-
|
|
- if (window)
|
|
- {
|
|
- mClients.remove (window->windowId ());
|
|
- mFrames.remove (window->frameId ());
|
|
- delete window;
|
|
- }
|
|
-
|
|
- if (mSwitcher && mSwitcher->xid () == id)
|
|
- {
|
|
- delete mSwitcher;
|
|
- mSwitcher = NULL;
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::handleActiveWindowChanged (WId id)
|
|
-{
|
|
- if (id != mActiveId)
|
|
- {
|
|
- KWD::Window *newActiveWindow = 0;
|
|
- KWD::Window *oldActiveWindow = 0;
|
|
-
|
|
- if (mClients.contains (id))
|
|
- newActiveWindow = mClients[id];
|
|
-
|
|
- if (mClients.contains (mActiveId))
|
|
- oldActiveWindow = mClients[mActiveId];
|
|
-
|
|
- mActiveId = id;
|
|
-
|
|
- if (oldActiveWindow)
|
|
- oldActiveWindow->handleActiveChange ();
|
|
-
|
|
- if (newActiveWindow)
|
|
- newActiveWindow->handleActiveChange ();
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::handleWindowChanged (WId id,
|
|
- const unsigned long *properties)
|
|
-{
|
|
- KWD::Window *client;
|
|
-
|
|
- if (mSwitcher && mSwitcher->xid () == id)
|
|
- {
|
|
- if (properties[0] & NET::WMGeometry)
|
|
- mSwitcher->updateGeometry ();
|
|
- return;
|
|
- }
|
|
-
|
|
- if (!mClients.contains (id))
|
|
- return;
|
|
-
|
|
- client = mClients[id];
|
|
-
|
|
- if (properties[0] & NET::WMName)
|
|
- client->updateName ();
|
|
- if (properties[0] & NET::WMVisibleName)
|
|
- client->updateName ();
|
|
- if (properties[0] & NET::WMState)
|
|
- client->updateState ();
|
|
- if (properties[0] & NET::WMIcon)
|
|
- client->updateIcons ();
|
|
- if (properties[0] & NET::WMGeometry)
|
|
- client->updateWindowGeometry ();
|
|
-
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::sendClientMessage (WId eventWid,
|
|
- WId wid,
|
|
- Atom atom,
|
|
- Atom value,
|
|
- long data1,
|
|
- long data2,
|
|
- long data3)
|
|
-{
|
|
- XEvent ev;
|
|
- long mask = 0;
|
|
-
|
|
- memset (&ev, 0, sizeof (ev));
|
|
-
|
|
- ev.xclient.type = ClientMessage;
|
|
- ev.xclient.window = wid;
|
|
- ev.xclient.message_type = atom;
|
|
- ev.xclient.format = 32;
|
|
-
|
|
- ev.xclient.data.l[0] = value;
|
|
- ev.xclient.data.l[1] = QX11Info::appTime();
|
|
- ev.xclient.data.l[2] = data1;
|
|
- ev.xclient.data.l[3] = data2;
|
|
- ev.xclient.data.l[4] = data3;
|
|
-
|
|
- if (eventWid == QX11Info::appRootWindow())
|
|
- mask = SubstructureRedirectMask | SubstructureNotifyMask;
|
|
-
|
|
- KWD::trapXError ();
|
|
- XSendEvent (QX11Info::display(), eventWid, false, mask, &ev);
|
|
- KWD::popXError ();
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::shadowRadiusChanged (double value)
|
|
-{
|
|
- decor_shadow_options_t opt = *shadowOptions ();
|
|
-
|
|
- opt.shadow_radius = value;
|
|
-
|
|
- changeShadowOptions (&opt);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::shadowOpacityChanged (double value)
|
|
-{
|
|
- decor_shadow_options_t opt = *shadowOptions ();
|
|
-
|
|
- opt.shadow_opacity = value;
|
|
-
|
|
- changeShadowOptions (&opt);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::shadowXOffsetChanged (int value)
|
|
-{
|
|
- decor_shadow_options_t opt = *shadowOptions ();
|
|
-
|
|
- opt.shadow_offset_x = value;
|
|
-
|
|
- changeShadowOptions (&opt);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::shadowYOffsetChanged (int value)
|
|
-{
|
|
- decor_shadow_options_t opt = *shadowOptions ();
|
|
-
|
|
- opt.shadow_offset_y = value;
|
|
-
|
|
- changeShadowOptions (&opt);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::shadowColorChanged (QString value)
|
|
-{
|
|
- decor_shadow_options_t opt = *shadowOptions ();
|
|
-
|
|
- int c[4];
|
|
-
|
|
- if (sscanf (value.toAscii().data(), "#%2x%2x%2x%2x",
|
|
- &c[0], &c[1], &c[2], &c[3]) == 4)
|
|
- {
|
|
- opt.shadow_color[0] = c[0] << 8 | c[0];
|
|
- opt.shadow_color[1] = c[1] << 8 | c[1];
|
|
- opt.shadow_color[2] = c[2] << 8 | c[2];
|
|
- }
|
|
-
|
|
- changeShadowOptions (&opt);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Decorator::plasmaThemeChanged ()
|
|
-{
|
|
- if (mSwitcher)
|
|
- {
|
|
- WId win = mSwitcher->xid();
|
|
- delete mSwitcher;
|
|
- mSwitcher = new Switcher (mCompositeWindow, win);
|
|
- }
|
|
-}
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator-kde4/decorator.h compiz-0.8.8/kde/window-decorator-kde4/decorator.h
|
|
--- compiz-0.8.8-orig/kde/window-decorator-kde4/decorator.h 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator-kde4/decorator.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,164 +0,0 @@
|
|
-/*
|
|
- * Copyright © 2008 Dennis Kasprzyk <onestone@opencompositing.org>
|
|
- * Copyright © 2006 Novell, Inc.
|
|
- * Copyright © 2006 Volker Krause <vkrause@kde.org>
|
|
- *
|
|
- * 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., 51 Franklin Street, Fifth Floor, Boston,
|
|
- * MA 02110-1301, USA.
|
|
- *
|
|
- * Author: David Reveman <davidr@novell.com>
|
|
- */
|
|
-
|
|
-#ifndef _DECORATOR_H
|
|
-#define _DECORATOR_H
|
|
-
|
|
-#include <kapplication.h>
|
|
-
|
|
-#include <X11/Xlib.h>
|
|
-#include <X11/Xatom.h>
|
|
-#include <X11/cursorfont.h>
|
|
-
|
|
-#include <QTimer>
|
|
-
|
|
-#include <fixx11h.h>
|
|
-#include <KDE/KConfig>
|
|
-#include <netwm.h>
|
|
-
|
|
-#include <decoration.h>
|
|
-
|
|
-#include "window.h"
|
|
-#include "switcher.h"
|
|
-#include "kdecoration_plugins.h"
|
|
-#include "utils.h"
|
|
-
|
|
-#define ROOT_OFF_X 8192
|
|
-#define ROOT_OFF_Y 8192
|
|
-
|
|
-#define C(name) { 0, XC_ ## name }
|
|
-
|
|
-struct _cursor {
|
|
- Cursor cursor;
|
|
- unsigned int shape;
|
|
-};
|
|
-
|
|
-extern struct _cursor cursors[3][3];
|
|
-
|
|
-#define BLUR_TYPE_NONE 0
|
|
-#define BLUR_TYPE_TITLEBAR 1
|
|
-#define BLUR_TYPE_ALL 2
|
|
-
|
|
-extern int blurType;
|
|
-
|
|
-class KConfig;
|
|
-class KWindowSystem;
|
|
-
|
|
-namespace KWD
|
|
-{
|
|
- class Options;
|
|
-
|
|
-class PluginManager:public KDecorationPlugins {
|
|
- public:
|
|
- PluginManager (KSharedConfigPtr config);
|
|
- virtual bool provides (Requirement)
|
|
- {
|
|
- return false;
|
|
- }
|
|
- };
|
|
-
|
|
-
|
|
-class Decorator:public KApplication {
|
|
- Q_OBJECT public:
|
|
-
|
|
- Decorator ();
|
|
- ~Decorator (void);
|
|
-
|
|
- static NETRootInfo *rootInfo (void)
|
|
- {
|
|
- return mRootInfo;
|
|
- }
|
|
- static PluginManager *pluginManager (void)
|
|
- {
|
|
- return mPlugins;
|
|
- }
|
|
- static KWD::Options *options (void)
|
|
- {
|
|
- return mOptions;
|
|
- }
|
|
- static WId activeId (void)
|
|
- {
|
|
- return mActiveId;
|
|
- }
|
|
- static decor_shadow_options_t *shadowOptions (void)
|
|
- {
|
|
- return &mShadowOptions;
|
|
- }
|
|
-
|
|
- static void sendClientMessage (WId eventWid,
|
|
- WId wid,
|
|
- Atom atom,
|
|
- Atom value,
|
|
- long data1 = 0,
|
|
- long data2 = 0,
|
|
- long data3 = 0);
|
|
-
|
|
- bool enableDecorations (Time timestamp);
|
|
- bool x11EventFilter (XEvent *xevent);
|
|
- void changeShadowOptions (decor_shadow_options_t *opt);
|
|
-
|
|
- public slots:
|
|
- void reconfigure (void);
|
|
-
|
|
- private:
|
|
- WId fetchFrame (WId window);
|
|
- void updateShadow (void);
|
|
- void updateAllShadowOptions (void);
|
|
-
|
|
- private slots:
|
|
- void handleWindowAdded (WId id);
|
|
- void handleWindowRemoved (WId id);
|
|
- void handleActiveWindowChanged (WId id);
|
|
- void handleWindowChanged (WId id,
|
|
- const unsigned long *properties);
|
|
-
|
|
- void shadowRadiusChanged (double value);
|
|
- void shadowOpacityChanged (double value);
|
|
- void shadowXOffsetChanged (int value);
|
|
- void shadowYOffsetChanged (int value);
|
|
- void shadowColorChanged (QString value);
|
|
-
|
|
- void plasmaThemeChanged ();
|
|
-
|
|
- private:
|
|
- static PluginManager *mPlugins;
|
|
- static KWD::Options *mOptions;
|
|
- static decor_shadow_t *mNoBorderShadow;
|
|
- static decor_shadow_options_t mShadowOptions;
|
|
- static NETRootInfo *mRootInfo;
|
|
- static WId mActiveId;
|
|
-
|
|
- KWD::Window *mDecorNormal;
|
|
- KWD::Window *mDecorActive;
|
|
- QMap <WId, KWD::Window *>mClients;
|
|
- QMap <WId, KWD::Window *>mFrames;
|
|
- KConfig *mConfig;
|
|
- Time mDmSnTimestamp;
|
|
-
|
|
- WId mCompositeWindow;
|
|
-
|
|
- Switcher *mSwitcher;
|
|
- };
|
|
-}
|
|
-
|
|
-#endif
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator-kde4/kdecoration_plugins.cpp compiz-0.8.8/kde/window-decorator-kde4/kdecoration_plugins.cpp
|
|
--- compiz-0.8.8-orig/kde/window-decorator-kde4/kdecoration_plugins.cpp 2010-05-21 13:17:43.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator-kde4/kdecoration_plugins.cpp 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,212 +0,0 @@
|
|
-/*****************************************************************
|
|
-
|
|
-This file is a copy of the KWin internal API. It allows the KDE4
|
|
-window decorator the loading of KWin decoration plugins.
|
|
-
|
|
-Copyright © 2008 Dennis Kasprzyk <onestone@opencompositing.org>
|
|
-
|
|
-******************************************************************
|
|
-
|
|
-This file is part of the KDE project.
|
|
-
|
|
-Copyright (C) 1999, 2000 Daniel M. Duley <mosfet@kde.org>
|
|
-Copyright (C) 2003 Lubos Lunak <l.lunak@kde.org>
|
|
-
|
|
-Permission is hereby granted, free of charge, to any person obtaining a
|
|
-copy of this software and associated documentation files (the "Software"),
|
|
-to deal in the Software without restriction, including without limitation
|
|
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
-and/or sell copies of the Software, and to permit persons to whom the
|
|
-Software is furnished to do so, subject to the following conditions:
|
|
-
|
|
-The above copyright notice and this permission notice shall be included in
|
|
-all copies or substantial portions of the Software.
|
|
-
|
|
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
-THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
-DEALINGS IN THE SOFTWARE.
|
|
-******************************************************************/
|
|
-
|
|
-#include "kdecoration_plugins.h"
|
|
-
|
|
-#include <kconfig.h>
|
|
-#include <kdebug.h>
|
|
-#include <klocale.h>
|
|
-#include <klibloader.h>
|
|
-#include <kconfiggroup.h>
|
|
-#include <assert.h>
|
|
-
|
|
-#include <QDir>
|
|
-#include <QFile>
|
|
-
|
|
-#include <kdecorationfactory.h>
|
|
-
|
|
-KWD::KDecorationPlugins::KDecorationPlugins(const KSharedConfigPtr &cfg)
|
|
- : create_ptr( NULL ),
|
|
- library( NULL ),
|
|
- fact( NULL ),
|
|
- old_library( NULL ),
|
|
- old_fact( NULL ),
|
|
- pluginStr( "kwin3_undefined " ),
|
|
- config( cfg )
|
|
- {
|
|
- }
|
|
-
|
|
-KWD::KDecorationPlugins::~KDecorationPlugins()
|
|
- {
|
|
- if(library)
|
|
- {
|
|
- assert( fact != NULL );
|
|
- delete fact;
|
|
- library->unload();
|
|
- }
|
|
- if(old_library)
|
|
- {
|
|
- assert( old_fact != NULL );
|
|
- delete old_fact;
|
|
- old_library->unload();
|
|
- }
|
|
- }
|
|
-
|
|
-QString KWD::KDecorationPlugins::currentPlugin()
|
|
- {
|
|
- return pluginStr;
|
|
- }
|
|
-
|
|
-bool KWD::KDecorationPlugins::reset( unsigned long changed )
|
|
- {
|
|
- QString oldPlugin = pluginStr;
|
|
- config->reparseConfiguration();
|
|
- bool ret = false;
|
|
- if(( !loadPlugin( "" ) && library ) // "" = read the one in cfg file
|
|
- || oldPlugin == pluginStr )
|
|
- { // no new plugin loaded, reset the old one
|
|
- assert( fact != NULL );
|
|
- ret = fact->reset( changed );
|
|
- }
|
|
- return ret || oldPlugin != pluginStr;
|
|
- }
|
|
-
|
|
-KDecorationFactory* KWD::KDecorationPlugins::factory()
|
|
- {
|
|
- return fact;
|
|
- }
|
|
-
|
|
-// convenience
|
|
-KDecoration* KWD::KDecorationPlugins::createDecoration( KDecorationBridge* bridge )
|
|
- {
|
|
- if( fact != NULL )
|
|
- return fact->createDecoration( bridge );
|
|
- return NULL;
|
|
- }
|
|
-
|
|
-// returns true if plugin was loaded successfully
|
|
-bool KWD::KDecorationPlugins::loadPlugin( QString nameStr )
|
|
- {
|
|
- if( nameStr.isEmpty())
|
|
- {
|
|
- KConfigGroup group( config, QString("Style") );
|
|
- nameStr = group.readEntry("PluginLib", defaultPlugin );
|
|
- }
|
|
- // make sure people can switch between HEAD and kwin_iii branch
|
|
- if( nameStr.startsWith( "kwin_" ))
|
|
- nameStr = "kwin3_" + nameStr.mid( 5 );
|
|
-
|
|
- KLibrary *oldLibrary = library;
|
|
- KDecorationFactory* oldFactory = fact;
|
|
-
|
|
- QString path = KLibLoader::findLibrary(nameStr);
|
|
- kDebug() << "kwin : path " << path << " for " << nameStr;
|
|
-
|
|
- // If the plugin was not found, try to find the default
|
|
- if (path.isEmpty())
|
|
- {
|
|
- nameStr = defaultPlugin;
|
|
- path = KLibLoader::findLibrary(nameStr);
|
|
- }
|
|
-
|
|
- // If no library was found, exit kwin with an error message
|
|
- if (path.isEmpty())
|
|
- {
|
|
- error( i18n("No window decoration plugin library was found." ));
|
|
- return false;
|
|
- }
|
|
-
|
|
- // Check if this library is not already loaded.
|
|
- if(pluginStr == nameStr)
|
|
- return true;
|
|
-
|
|
- // Try loading the requested plugin
|
|
- library = KLibLoader::self()->library(path);
|
|
-
|
|
- // If that fails, fall back to the default plugin
|
|
- if (!library)
|
|
- {
|
|
- kDebug() << " could not load library, try default plugin again";
|
|
- nameStr = defaultPlugin;
|
|
- if ( pluginStr == nameStr )
|
|
- return true;
|
|
- path = KLibLoader::findLibrary(nameStr);
|
|
- if (!path.isEmpty())
|
|
- library = KLibLoader::self()->library(path);
|
|
- }
|
|
-
|
|
- if (!library)
|
|
- {
|
|
- error( i18n("The default decoration plugin is corrupt "
|
|
- "and could not be loaded." ));
|
|
- return false;
|
|
- }
|
|
-
|
|
- create_ptr = NULL;
|
|
- KLibrary::void_function_ptr create_func = library->resolveFunction("create_factory");
|
|
- if(create_func)
|
|
- create_ptr = (KDecorationFactory* (*)())create_func;
|
|
-
|
|
- if(!create_ptr)
|
|
- {
|
|
- error( i18n( "The library %1 is not a KWin plugin.", path ));
|
|
- library->unload();
|
|
- return false;
|
|
- }
|
|
- fact = create_ptr();
|
|
- fact->checkRequirements( this ); // let it check what is supported
|
|
-
|
|
- pluginStr = nameStr;
|
|
-
|
|
- // For clients in kdeartwork
|
|
- QString catalog = nameStr;
|
|
- catalog.replace( "kwin3_", "kwin_" );
|
|
- KGlobal::locale()->insertCatalog( catalog );
|
|
- // For KCommonDecoration based clients
|
|
- KGlobal::locale()->insertCatalog( "kwin_lib" );
|
|
- // For clients in kdebase
|
|
- KGlobal::locale()->insertCatalog( "kwin_clients" );
|
|
- // For clients in kdeartwork
|
|
- KGlobal::locale()->insertCatalog( "kwin_art_clients" );
|
|
-
|
|
- old_library = oldLibrary; // save for delayed destroying
|
|
- old_fact = oldFactory;
|
|
-
|
|
- return true;
|
|
-}
|
|
-
|
|
-void KWD::KDecorationPlugins::destroyPreviousPlugin()
|
|
-{
|
|
- // Destroy the old plugin
|
|
- if(old_library)
|
|
- {
|
|
- delete old_fact;
|
|
- old_fact = NULL;
|
|
- old_library->unload();
|
|
- old_library = NULL;
|
|
- }
|
|
-}
|
|
-
|
|
-void KWD::KDecorationPlugins::error( const QString& )
|
|
- {
|
|
- }
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator-kde4/kdecoration_plugins.h compiz-0.8.8/kde/window-decorator-kde4/kdecoration_plugins.h
|
|
--- compiz-0.8.8-orig/kde/window-decorator-kde4/kdecoration_plugins.h 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator-kde4/kdecoration_plugins.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,90 +0,0 @@
|
|
-/*****************************************************************
|
|
-
|
|
-This file is a copy of the KWin internal API. It allows the KDE4
|
|
-window decorator the loading of KWin decoration plugins.
|
|
-
|
|
-Copyright © 2008 Dennis Kasprzyk <onestone@opencompositing.org>
|
|
-
|
|
-******************************************************************
|
|
-
|
|
-This file is part of the KDE project.
|
|
-
|
|
-Copyright (C) 1999, 2000 Daniel M. Duley <mosfet@kde.org>
|
|
-Copyright (C) 2003 Lubos Lunak <l.lunak@kde.org>
|
|
-
|
|
-Permission is hereby granted, free of charge, to any person obtaining a
|
|
-copy of this software and associated documentation files (the "Software"),
|
|
-to deal in the Software without restriction, including without limitation
|
|
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
-and/or sell copies of the Software, and to permit persons to whom the
|
|
-Software is furnished to do so, subject to the following conditions:
|
|
-
|
|
-The above copyright notice and this permission notice shall be included in
|
|
-all copies or substantial portions of the Software.
|
|
-
|
|
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
-THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
-DEALINGS IN THE SOFTWARE.
|
|
-******************************************************************/
|
|
-
|
|
-#ifndef KWD_KDECORATION_PLUGINS_H
|
|
-#define KWD_KDECORATION_PLUGINS_H
|
|
-
|
|
-//
|
|
-// This header file is internal. I mean it.
|
|
-//
|
|
-
|
|
-
|
|
-#include <QtGui/QWidget>
|
|
-#include <ksharedconfig.h>
|
|
-
|
|
-#include "kdecoration.h"
|
|
-
|
|
-class KLibrary;
|
|
-class KDecoration;
|
|
-class KDecorationBridge;
|
|
-class KDecorationFactory;
|
|
-
|
|
-namespace KWD
|
|
-{
|
|
-
|
|
-class KDecorationPlugins
|
|
- : public KDecorationProvides
|
|
- {
|
|
- public:
|
|
- KDecorationPlugins(const KSharedConfigPtr &cfg);
|
|
- virtual ~KDecorationPlugins();
|
|
- bool loadPlugin( QString name );
|
|
- void destroyPreviousPlugin();
|
|
- KDecorationFactory* factory();
|
|
- KDecoration* createDecoration( KDecorationBridge* );
|
|
- QString currentPlugin();
|
|
- bool reset( unsigned long changed ); // returns true if decorations need to be recreated
|
|
- protected:
|
|
- virtual void error( const QString& error_msg );
|
|
- QString defaultPlugin; // FRAME normalne protected?
|
|
- private:
|
|
- KDecorationFactory* (*create_ptr)();
|
|
- KLibrary *library;
|
|
- KDecorationFactory* fact;
|
|
- KLibrary *old_library;
|
|
- KDecorationFactory* old_fact;
|
|
- QString pluginStr;
|
|
- KSharedConfigPtr config;
|
|
- };
|
|
-
|
|
-/*
|
|
-
|
|
- Plugins API:
|
|
- KDecorationFactory* create_factory(); - called once after loading
|
|
-
|
|
-*/
|
|
-}
|
|
-
|
|
-/** @} */
|
|
-
|
|
-#endif
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator-kde4/main.cpp compiz-0.8.8/kde/window-decorator-kde4/main.cpp
|
|
--- compiz-0.8.8-orig/kde/window-decorator-kde4/main.cpp 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator-kde4/main.cpp 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,135 +0,0 @@
|
|
-/*
|
|
- * Copyright © 2008 Dennis Kasprzyk <onestone@opencompositing.org>
|
|
- * Copyright © 2006 Novell, Inc.
|
|
- * Copyright © 2006 Volker Krause <vkrause@kde.org>
|
|
- *
|
|
- * 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., 51 Franklin Street, Fifth Floor, Boston,
|
|
- * MA 02110-1301, USA.
|
|
- *
|
|
- * Author: David Reveman <davidr@novell.com>
|
|
- */
|
|
-
|
|
-#include <X11/Xlib.h>
|
|
-#include <X11/extensions/Xdamage.h>
|
|
-
|
|
-#include <fixx11h.h>
|
|
-#include <KDE/KApplication>
|
|
-#include <KDE/KCmdLineArgs>
|
|
-#include <KDE/KAboutData>
|
|
-#include <KDE/KDebug>
|
|
-#include <KDE/KLocale>
|
|
-
|
|
-#include "decorator.h"
|
|
-#include "utils.h"
|
|
-
|
|
-#include <QX11Info>
|
|
-#include <QtDBus/QtDBus>
|
|
-
|
|
-
|
|
-
|
|
-int
|
|
-main (int argc, char **argv)
|
|
-{
|
|
- KWD::Decorator *app;
|
|
- KCmdLineArgs *args;
|
|
- KCmdLineOptions options;
|
|
- int status;
|
|
- Time timestamp;
|
|
- QString appname;
|
|
-
|
|
- options.add ("replace", ki18n ("Replace existing window decorator"));
|
|
- options.add ("sm-disable", ki18n ("Disable connection to session manager"));
|
|
- options.add ("blur <type>", ki18n ("Blur type (none/titlebar/all)"), "none");
|
|
-
|
|
- KAboutData about("kde-window-decorator", "kwin", ki18n ("KDE Window Decorator"),
|
|
- "0.0.1", KLocalizedString(), KAboutData::License_GPL,
|
|
- KLocalizedString(), KLocalizedString(), "http://www.compiz.org",
|
|
- "dev@lists.compiz-fusion.org");
|
|
- KCmdLineArgs::init (argc, argv,
|
|
- "kde-window-decorator",
|
|
- "kwin",
|
|
- ki18n ("KDE Window Decorator"),
|
|
- "0.0.1");
|
|
- KCmdLineArgs::addCmdLineOptions (options);
|
|
- args = KCmdLineArgs::parsedArgs ();
|
|
-
|
|
- if (args->isSet ("blur"))
|
|
- {
|
|
- QString blur = args->getOption ("blur");
|
|
-
|
|
- if (blur == QString ("titlebar"))
|
|
- blurType = BLUR_TYPE_TITLEBAR;
|
|
- else if (blur == QString ("all"))
|
|
- blurType = BLUR_TYPE_ALL;
|
|
- }
|
|
-
|
|
- app = new KWD::Decorator ();
|
|
-
|
|
- if (args->isSet ("sm-disable"))
|
|
- app->disableSessionManagement ();
|
|
-
|
|
- status = decor_acquire_dm_session (QX11Info::display(),
|
|
- QX11Info::appScreen (),
|
|
- "kwd", args->isSet ("replace"),
|
|
- ×tamp);
|
|
- if (status != DECOR_ACQUIRE_STATUS_SUCCESS)
|
|
- {
|
|
- if (status == DECOR_ACQUIRE_STATUS_FAILED)
|
|
- {
|
|
- fprintf (stderr,
|
|
- "%s: Could not acquire decoration manager "
|
|
- "selection on screen %d display \"%s\"\n",
|
|
- argv[0], QX11Info::appScreen (),
|
|
- DisplayString (QX11Info::display()));
|
|
- }
|
|
- else if (status == DECOR_ACQUIRE_STATUS_OTHER_DM_RUNNING)
|
|
- {
|
|
- fprintf (stderr,
|
|
- "%s: Screen %d on display \"%s\" already "
|
|
- "has a decoration manager; try using the "
|
|
- "--replace option to replace the current "
|
|
- "decoration manager.\n",
|
|
- argv[0], QX11Info::appScreen (),
|
|
- DisplayString (QX11Info::display()));
|
|
- }
|
|
-
|
|
- return 1;
|
|
- }
|
|
-
|
|
- decor_set_dm_check_hint (QX11Info::display(), QX11Info::appScreen ());
|
|
-
|
|
- if (!app->enableDecorations (timestamp))
|
|
- {
|
|
- fprintf (stderr,
|
|
- "%s: Could not enable decorations on display \"%s\"\n",
|
|
- argv[0], DisplayString (QX11Info::display()));
|
|
-
|
|
- return 1;
|
|
- }
|
|
-
|
|
- if (QX11Info::appScreen () == 0)
|
|
- appname = "org.kde.kwin";
|
|
- else
|
|
- appname.sprintf("org.kde.kwin-screen-%d", QX11Info::appScreen ());
|
|
-
|
|
- QDBusConnection::sessionBus ().interface ()->registerService
|
|
- (appname, QDBusConnectionInterface::DontQueueService);
|
|
-
|
|
- status = app->exec ();
|
|
-
|
|
- delete app;
|
|
-
|
|
- return status;
|
|
-}
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator-kde4/Makefile.am compiz-0.8.8/kde/window-decorator-kde4/Makefile.am
|
|
--- compiz-0.8.8-orig/kde/window-decorator-kde4/Makefile.am 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator-kde4/Makefile.am 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,58 +0,0 @@
|
|
-if USE_KDE4
|
|
-
|
|
-BUILDSOURCES = \
|
|
- decorator.moc.cpp \
|
|
- window.moc.cpp \
|
|
- paintredirector.moc.cpp \
|
|
- kwinadaptor.moc.cpp \
|
|
- kwinadaptor.cpp \
|
|
- kwinadaptor.h
|
|
-
|
|
-kde4_window_decorator_DEPENDENCIES = \
|
|
- $(top_builddir)/libdecoration/libdecoration.la
|
|
-kde4_window_decorator_LDADD = \
|
|
- $(top_builddir)/libdecoration/libdecoration.la \
|
|
- @KDE4_WINDOW_DECORATOR_LIBS@ @KDE4_LIBS@ -ldl
|
|
-
|
|
-nodist_kde4_window_decorator_SOURCES = \
|
|
- $(BUILDSOURCES)
|
|
-
|
|
-dist_kde4_window_decorator_SOURCES = \
|
|
- main.cpp \
|
|
- utils.cpp \
|
|
- utils.h \
|
|
- decorator.cpp \
|
|
- decorator.h \
|
|
- window.cpp \
|
|
- window.h \
|
|
- options.cpp \
|
|
- options.h \
|
|
- kdecoration_plugins.cpp \
|
|
- kdecoration_plugins.h \
|
|
- switcher.cpp \
|
|
- switcher.h \
|
|
- paintredirector.cpp \
|
|
- paintredirector.h \
|
|
- org.kde.KWin.xml
|
|
-
|
|
-kde4_window_decorator_program = kde4-window-decorator
|
|
-
|
|
-INCLUDES = -I$(top_srcdir)/include -I$(top_builddir)/include @KDE4_WINDOW_DECORATOR_CFLAGS@ @KDE4_CFLAGS@
|
|
-
|
|
-bin_PROGRAMS = $(kde4_window_decorator_program)
|
|
-
|
|
-%.moc.cpp: %.h
|
|
- $(QT4_MOC) $< > $@
|
|
-
|
|
-kwinadaptor.h: kwinadaptor.cpp
|
|
-
|
|
-kwinadaptor.cpp: org.kde.KWin.xml
|
|
- $(QDBUSXML2CPP) -a kwinadaptor -i decorator.h -l KWD::Decorator $<
|
|
-
|
|
-# make sure kwinadaptor.h is built before any of the dist_SOURCES uses it
|
|
-main.cpp: kwinadaptor.h
|
|
-
|
|
-CLEANFILES = $(BUILDSOURCES)
|
|
-EXTRA_DIST = org.kde.KWin.xml
|
|
-
|
|
-endif
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator-kde4/options.cpp compiz-0.8.8/kde/window-decorator-kde4/options.cpp
|
|
--- compiz-0.8.8-orig/kde/window-decorator-kde4/options.cpp 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator-kde4/options.cpp 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,186 +0,0 @@
|
|
-/*
|
|
- * Copyright © 2008 Dennis Kasprzyk <onestone@opencompositing.org>
|
|
- * Copyright © 2006 Novell, Inc.
|
|
- * Copyright © 2006 Volker Krause <vkrause@kde.org>
|
|
- *
|
|
- * 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., 51 Franklin Street, Fifth Floor, Boston,
|
|
- * MA 02110-1301, USA.
|
|
- *
|
|
- * Author: David Reveman <davidr@novell.com>
|
|
- */
|
|
-
|
|
-#include "options.h"
|
|
-
|
|
-#include <KDE/KConfig>
|
|
-#include <KDE/KConfigGroup>
|
|
-#include <kdecoration.h>
|
|
-
|
|
-KWD::Options::Options (KConfig *config): KDecorationOptions (), mConfig (config)
|
|
-{
|
|
- updateSettings ();
|
|
-}
|
|
-
|
|
-unsigned long
|
|
-KWD::Options::updateSettings (void)
|
|
-{
|
|
- unsigned long changed = 0;
|
|
- KConfigGroup config = mConfig->group("Windows");
|
|
-
|
|
- changed |= KDecorationOptions::updateSettings (mConfig);
|
|
-
|
|
- OpTitlebarDblClick =
|
|
- windowOperation (config.readEntry ("TitlebarDoubleClickCommand",
|
|
- "Shade"), true);
|
|
- setOpMaxButtonLeftClick (
|
|
- windowOperation (config.readEntry ("MaximizeButtonLeftClickCommand",
|
|
- "Maximize"), true));
|
|
- setOpMaxButtonMiddleClick (
|
|
- windowOperation (config.readEntry ("MaximizeButtonMiddleClickCommand",
|
|
- "Maximize (vertical only)"), true));
|
|
- setOpMaxButtonRightClick (
|
|
- windowOperation (config.readEntry ("MaximizeButtonRightClickCommand",
|
|
- "Maximize (horizontal only)"),
|
|
- true));
|
|
-
|
|
- config = mConfig->group("MouseBindings");
|
|
-
|
|
- CmdActiveTitlebar1 =
|
|
- mouseCommand (config.readEntry ("CommandActiveTitlebar1",
|
|
- "Raise"), true);
|
|
- CmdActiveTitlebar2 =
|
|
- mouseCommand (config.readEntry ("CommandActiveTitlebar2",
|
|
- "Lower"), true);
|
|
- CmdActiveTitlebar3 =
|
|
- mouseCommand (config.readEntry ("CommandActiveTitlebar3",
|
|
- "Operations menu"), true);
|
|
- CmdInactiveTitlebar1 =
|
|
- mouseCommand (config.readEntry ("CommandInactiveTitlebar1",
|
|
- "Activate and raise"), true);
|
|
- CmdInactiveTitlebar2 =
|
|
- mouseCommand (config.readEntry ("CommandInactiveTitlebar2",
|
|
- "Activate and lower"), true);
|
|
- CmdInactiveTitlebar3 =
|
|
- mouseCommand (config.readEntry ("CommandInactiveTitlebar3",
|
|
- "Operations menu"), true);
|
|
-
|
|
- CmdTitlebarWheel =
|
|
- mouseWheelCommand (config.readEntry ("CommandTitlebarWheel",
|
|
- "Nothing"));
|
|
-
|
|
- return changed;
|
|
-}
|
|
-
|
|
-// restricted should be true for operations that the user may not be able to
|
|
-// repeat if the window is moved out of the workspace (e.g. if the user moves
|
|
-// a window by the titlebar, and moves it too high beneath Kicker at the top
|
|
-// edge, they may not be able to move it back, unless they know about Alt+LMB)
|
|
-KDecorationDefines::WindowOperation
|
|
-KWD::Options::windowOperation (const QString &name, bool restricted)
|
|
-{
|
|
- if (name == "Move")
|
|
- return restricted ? KWD::Options::MoveOp :
|
|
- KWD::Options::UnrestrictedMoveOp;
|
|
- else if (name == "Resize")
|
|
- return restricted ? KWD::Options::ResizeOp :
|
|
- KWD::Options::UnrestrictedResizeOp;
|
|
- else if (name == "Maximize")
|
|
- return KWD::Options::MaximizeOp;
|
|
- else if (name == "Minimize")
|
|
- return KWD::Options::MinimizeOp;
|
|
- else if (name == "Close")
|
|
- return KWD::Options::CloseOp;
|
|
- else if (name == "OnAllDesktops")
|
|
- return KWD::Options::OnAllDesktopsOp;
|
|
- else if (name == "Shade")
|
|
- return KWD::Options::ShadeOp;
|
|
- else if (name == "Operations")
|
|
- return KWD::Options::OperationsOp;
|
|
- else if (name == "Maximize (vertical only)")
|
|
- return KWD::Options::VMaximizeOp;
|
|
- else if (name == "Maximize (horizontal only)")
|
|
- return KWD::Options::HMaximizeOp;
|
|
- else if (name == "Lower")
|
|
- return KWD::Options::LowerOp;
|
|
- return KWD::Options::NoOp;
|
|
-}
|
|
-
|
|
-KWD::Options::MouseCommand
|
|
-KWD::Options::mouseCommand (const QString &name,
|
|
- bool restricted)
|
|
-{
|
|
- QString lowerName = name.toLower ();
|
|
-
|
|
- if (lowerName == "raise") return MouseRaise;
|
|
- if (lowerName == "lower") return MouseLower;
|
|
- if (lowerName == "operations menu") return MouseOperationsMenu;
|
|
- if (lowerName == "toggle raise and lower") return MouseToggleRaiseAndLower;
|
|
- if (lowerName == "activate and raise") return MouseActivateAndRaise;
|
|
- if (lowerName == "activate and lower") return MouseActivateAndLower;
|
|
- if (lowerName == "activate") return MouseActivate;
|
|
- if (lowerName == "activate, raise and pass click")
|
|
- return MouseActivateRaiseAndPassClick;
|
|
- if (lowerName == "activate and pass click")
|
|
- return MouseActivateAndPassClick;
|
|
- if (lowerName == "activate, raise and move")
|
|
- return restricted ? MouseActivateRaiseAndMove :
|
|
- MouseActivateRaiseAndUnrestrictedMove;
|
|
- if (lowerName == "move")
|
|
- return restricted ? MouseMove : MouseUnrestrictedMove;
|
|
- if (lowerName == "resize")
|
|
- return restricted ? MouseResize : MouseUnrestrictedResize;
|
|
- if (lowerName == "shade") return MouseShade;
|
|
- if (lowerName == "minimize") return MouseMinimize;
|
|
- if (lowerName == "nothing") return MouseNothing;
|
|
-
|
|
- return MouseNothing;
|
|
-}
|
|
-
|
|
-KWD::Options::MouseWheelCommand
|
|
-KWD::Options::mouseWheelCommand (const QString &name)
|
|
-{
|
|
- QString lowerName = name.toLower ();
|
|
-
|
|
- if (lowerName == "raise/lower") return MouseWheelRaiseLower;
|
|
- if (lowerName == "shade/unshade") return MouseWheelShadeUnshade;
|
|
- if (lowerName == "maximize/restore") return MouseWheelMaximizeRestore;
|
|
- if (lowerName == "above/below") return MouseWheelAboveBelow;
|
|
- if (lowerName == "previous/next desktop")
|
|
- return MouseWheelPreviousNextDesktop;
|
|
- if (lowerName == "change opacity") return MouseWheelChangeOpacity;
|
|
-
|
|
- return MouseWheelNothing;
|
|
-}
|
|
-
|
|
-KWD::Options::MouseCommand
|
|
-KWD::Options::wheelToMouseCommand (MouseWheelCommand com,
|
|
- int delta)
|
|
-{
|
|
- switch (com) {
|
|
- case MouseWheelRaiseLower:
|
|
- return delta > 0 ? MouseRaise : MouseLower;
|
|
- case MouseWheelShadeUnshade:
|
|
- return delta > 0 ? MouseSetShade : MouseUnsetShade;
|
|
- case MouseWheelMaximizeRestore:
|
|
- return delta > 0 ? MouseMaximize : MouseRestore;
|
|
- case MouseWheelAboveBelow:
|
|
- return delta > 0 ? MouseAbove : MouseBelow;
|
|
- case MouseWheelPreviousNextDesktop:
|
|
- return delta > 0 ? MousePreviousDesktop : MouseNextDesktop;
|
|
- case MouseWheelChangeOpacity:
|
|
- return delta > 0 ? MouseOpacityMore : MouseOpacityLess;
|
|
- default:
|
|
- return MouseNothing;
|
|
- }
|
|
-}
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator-kde4/options.h compiz-0.8.8/kde/window-decorator-kde4/options.h
|
|
--- compiz-0.8.8-orig/kde/window-decorator-kde4/options.h 2010-05-21 13:17:43.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator-kde4/options.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,140 +0,0 @@
|
|
-/*
|
|
- * Copyright © 2008 Dennis Kasprzyk <onestone@opencompositing.org>
|
|
- * Copyright © 2006 Novell, Inc.
|
|
- * Copyright © 2006 Volker Krause <vkrause@kde.org>
|
|
- *
|
|
- * 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., 51 Franklin Street, Fifth Floor, Boston,
|
|
- * MA 02110-1301, USA.
|
|
- *
|
|
- * Author: David Reveman <davidr@novell.com>
|
|
- */
|
|
-
|
|
-#ifndef _OPTIONS_H
|
|
-#define _OPTIONS_H
|
|
-
|
|
-#include <kdecoration.h>
|
|
-
|
|
-class KConfig;
|
|
-
|
|
-namespace KWD
|
|
-{
|
|
-
|
|
-class Options : public KDecorationOptions
|
|
- {
|
|
- public:
|
|
- enum MouseCommand
|
|
- {
|
|
- MouseRaise,
|
|
- MouseLower,
|
|
- MouseOperationsMenu,
|
|
- MouseToggleRaiseAndLower,
|
|
- MouseActivateAndRaise,
|
|
- MouseActivateAndLower,
|
|
- MouseActivate,
|
|
- MouseActivateRaiseAndPassClick,
|
|
- MouseActivateAndPassClick,
|
|
- MouseMove,
|
|
- MouseUnrestrictedMove,
|
|
- MouseActivateRaiseAndMove,
|
|
- MouseActivateRaiseAndUnrestrictedMove,
|
|
- MouseResize,
|
|
- MouseUnrestrictedResize,
|
|
- MouseShade,
|
|
- MouseSetShade,
|
|
- MouseUnsetShade,
|
|
- MouseMaximize,
|
|
- MouseRestore,
|
|
- MouseMinimize,
|
|
- MouseNextDesktop,
|
|
- MousePreviousDesktop,
|
|
- MouseAbove,
|
|
- MouseBelow,
|
|
- MouseOpacityMore,
|
|
- MouseOpacityLess,
|
|
- MouseNothing
|
|
- };
|
|
- enum MouseWheelCommand
|
|
- {
|
|
- MouseWheelRaiseLower,
|
|
- MouseWheelShadeUnshade,
|
|
- MouseWheelMaximizeRestore,
|
|
- MouseWheelAboveBelow,
|
|
- MouseWheelPreviousNextDesktop,
|
|
- MouseWheelChangeOpacity,
|
|
- MouseWheelNothing
|
|
- };
|
|
-
|
|
- Options (KConfig *config);
|
|
-
|
|
- virtual unsigned long updateSettings (void);
|
|
-
|
|
- WindowOperation operationTitlebarDblClick (void)
|
|
- {
|
|
- return OpTitlebarDblClick;
|
|
- }
|
|
-
|
|
- MouseCommand commandActiveTitlebar1 (void)
|
|
- {
|
|
- return CmdActiveTitlebar1;
|
|
- }
|
|
- MouseCommand commandActiveTitlebar2 (void)
|
|
- {
|
|
- return CmdActiveTitlebar2;
|
|
- }
|
|
- MouseCommand commandActiveTitlebar3 (void)
|
|
- {
|
|
- return CmdActiveTitlebar3;
|
|
- }
|
|
- MouseCommand commandInactiveTitlebar1 (void)
|
|
- {
|
|
- return CmdInactiveTitlebar1;
|
|
- }
|
|
- MouseCommand commandInactiveTitlebar2 (void)
|
|
- {
|
|
- return CmdInactiveTitlebar2;
|
|
- }
|
|
- MouseCommand commandInactiveTitlebar3 (void)
|
|
- {
|
|
- return CmdInactiveTitlebar3;
|
|
- }
|
|
-
|
|
- MouseCommand operationTitlebarMouseWheel (int delta)
|
|
- {
|
|
- return wheelToMouseCommand (CmdTitlebarWheel, delta);
|
|
- }
|
|
-
|
|
- private:
|
|
- static KDecorationDefines::WindowOperation
|
|
- windowOperation (const QString &name, bool restricted);
|
|
- MouseCommand mouseCommand (const QString &name, bool restricted);
|
|
- MouseWheelCommand mouseWheelCommand (const QString &name);
|
|
- MouseCommand wheelToMouseCommand (MouseWheelCommand com, int delta);
|
|
-
|
|
- private:
|
|
- KDecorationDefines::WindowOperation OpTitlebarDblClick;
|
|
- MouseCommand CmdActiveTitlebar1;
|
|
- MouseCommand CmdActiveTitlebar2;
|
|
- MouseCommand CmdActiveTitlebar3;
|
|
- MouseCommand CmdInactiveTitlebar1;
|
|
- MouseCommand CmdInactiveTitlebar2;
|
|
- MouseCommand CmdInactiveTitlebar3;
|
|
- MouseWheelCommand CmdTitlebarWheel;
|
|
-
|
|
- KConfig *mConfig;
|
|
- };
|
|
-
|
|
-}
|
|
-
|
|
-#endif
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator-kde4/org.kde.KWin.xml compiz-0.8.8/kde/window-decorator-kde4/org.kde.KWin.xml
|
|
--- compiz-0.8.8-orig/kde/window-decorator-kde4/org.kde.KWin.xml 2010-05-21 13:17:43.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator-kde4/org.kde.KWin.xml 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,10 +0,0 @@
|
|
-<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
|
|
-"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
|
|
-<node>
|
|
- <interface name="org.kde.KWin">
|
|
- <method name="reconfigure">
|
|
- <annotation name="org.freedesktop.DBus.Method.NoReply" value="true"/>
|
|
- </method>
|
|
- <signal name="reloadConfig"/>
|
|
- </interface>
|
|
-</node>
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator-kde4/paintredirector.cpp compiz-0.8.8/kde/window-decorator-kde4/paintredirector.cpp
|
|
--- compiz-0.8.8-orig/kde/window-decorator-kde4/paintredirector.cpp 2010-05-21 13:17:43.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator-kde4/paintredirector.cpp 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,124 +0,0 @@
|
|
-/*****************************************************************
|
|
-This file is part of the KDE project.
|
|
-
|
|
-Copyright (C) 2009 Lubos Lunak <l.lunak@kde.org>
|
|
-
|
|
-Permission is hereby granted, free of charge, to any person obtaining a
|
|
-copy of this software and associated documentation files (the "Software"),
|
|
-to deal in the Software without restriction, including without limitation
|
|
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
-and/or sell copies of the Software, and to permit persons to whom the
|
|
-Software is furnished to do so, subject to the following conditions:
|
|
-
|
|
-The above copyright notice and this permission notice shall be included in
|
|
-all copies or substantial portions of the Software.
|
|
-
|
|
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
-THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
-DEALINGS IN THE SOFTWARE.
|
|
-******************************************************************/
|
|
-
|
|
-#include "paintredirector.h"
|
|
-
|
|
-#include <kdebug.h>
|
|
-#include <qevent.h>
|
|
-#include <qpainter.h>
|
|
-
|
|
-namespace KWin
|
|
-{
|
|
-
|
|
-PaintRedirector::PaintRedirector( QWidget* w )
|
|
- : widget( w )
|
|
- , recursionCheck( false )
|
|
- {
|
|
- timer.setSingleShot( true );
|
|
- connect( &timer, SIGNAL( timeout()), SIGNAL( paintPending()));
|
|
- added( w );
|
|
- }
|
|
-
|
|
-QPixmap PaintRedirector::performPendingPaint()
|
|
- {
|
|
- //qDebug() << "### performing paint, pending:" << pending.boundingRect();
|
|
- QPixmap pixmap( pending.boundingRect().size());
|
|
- pixmap.fill( Qt::transparent );
|
|
- recursionCheck = true;
|
|
- // do not use DrawWindowBackground, it's ok to be transparent
|
|
- widget->render( &pixmap, QPoint(), pending.boundingRect(), QWidget::DrawChildren );
|
|
- recursionCheck = false;
|
|
- pending = QRegion();
|
|
- return pixmap;
|
|
- }
|
|
-
|
|
-bool PaintRedirector::isToolTip( QWidget *object ) const
|
|
- {
|
|
- // ### We need a more reliable way of doing this
|
|
- return object->windowFlags() & Qt::ToolTip;
|
|
- }
|
|
-
|
|
-bool PaintRedirector::eventFilter( QObject* o, QEvent* e )
|
|
- {
|
|
- switch( e->type())
|
|
- {
|
|
- case QEvent::ChildAdded:
|
|
- {
|
|
- QChildEvent* c = static_cast< QChildEvent* >( e );
|
|
- if( c->child()->isWidgetType() && !isToolTip( static_cast< QWidget* >( c->child() ) ) )
|
|
- added( static_cast< QWidget* >( c->child()));
|
|
- break;
|
|
- }
|
|
- case QEvent::ChildRemoved:
|
|
- {
|
|
- QChildEvent* c = static_cast< QChildEvent* >( e );
|
|
- if( c->child()->isWidgetType())
|
|
- removed( static_cast< QWidget* >( c->child()));
|
|
- break;
|
|
- }
|
|
- case QEvent::Paint:
|
|
- {
|
|
- if( !recursionCheck )
|
|
- {
|
|
- QPaintEvent* pe = static_cast< QPaintEvent* >( e );
|
|
- QWidget* w = static_cast< QWidget* >( o );
|
|
- pending |= pe->region().translated( w->mapTo( widget, QPoint( 0, 0 )));
|
|
- timer.start( 0 );
|
|
- return true; // filter out
|
|
- }
|
|
- }
|
|
- default:
|
|
- break;
|
|
- }
|
|
- return false;
|
|
- }
|
|
-
|
|
-QRegion PaintRedirector::pendingRegion() const
|
|
- {
|
|
- return pending;
|
|
- }
|
|
-
|
|
-void PaintRedirector::added( QWidget* w )
|
|
- {
|
|
- w->installEventFilter( this );
|
|
- foreach( QObject* o, w->children())
|
|
- {
|
|
- if( o->isWidgetType() && !isToolTip( static_cast< QWidget* >( o ) ) )
|
|
- added( static_cast< QWidget* >( o ));
|
|
- }
|
|
- }
|
|
-
|
|
-void PaintRedirector::removed( QWidget* w )
|
|
- {
|
|
- foreach( QObject* o, w->children())
|
|
- {
|
|
- if( o->isWidgetType())
|
|
- removed( static_cast< QWidget* >( o ));
|
|
- }
|
|
- w->installEventFilter( this );
|
|
- }
|
|
-
|
|
-} // namespace
|
|
-
|
|
-//#include "paintredirector.moc"
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator-kde4/paintredirector.h compiz-0.8.8/kde/window-decorator-kde4/paintredirector.h
|
|
--- compiz-0.8.8-orig/kde/window-decorator-kde4/paintredirector.h 2010-05-21 13:17:43.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator-kde4/paintredirector.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,60 +0,0 @@
|
|
-/*****************************************************************
|
|
-This file is part of the KDE project.
|
|
-
|
|
-Copyright (C) 2009 Lubos Lunak <l.lunak@kde.org>
|
|
-
|
|
-Permission is hereby granted, free of charge, to any person obtaining a
|
|
-copy of this software and associated documentation files (the "Software"),
|
|
-to deal in the Software without restriction, including without limitation
|
|
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
-and/or sell copies of the Software, and to permit persons to whom the
|
|
-Software is furnished to do so, subject to the following conditions:
|
|
-
|
|
-The above copyright notice and this permission notice shall be included in
|
|
-all copies or substantial portions of the Software.
|
|
-
|
|
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
-THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
-DEALINGS IN THE SOFTWARE.
|
|
-******************************************************************/
|
|
-
|
|
-#ifndef PAINTREDIRECTOR_H
|
|
-#define PAINTREDIRECTOR_H
|
|
-
|
|
-#include <qregion.h>
|
|
-#include <qtimer.h>
|
|
-#include <qwidget.h>
|
|
-
|
|
-namespace KWin
|
|
-{
|
|
-
|
|
-// This class redirects all painting of a given widget (including its children)
|
|
-// into a paint device (QPixmap).
|
|
-class PaintRedirector
|
|
- : public QObject
|
|
- {
|
|
- Q_OBJECT
|
|
- public:
|
|
- PaintRedirector( QWidget* widget );
|
|
- QPixmap performPendingPaint();
|
|
- virtual bool eventFilter( QObject* o, QEvent* e );
|
|
- QRegion pendingRegion() const;
|
|
- signals:
|
|
- void paintPending();
|
|
- private:
|
|
- void added( QWidget* widget );
|
|
- void removed( QWidget* widget );
|
|
- bool isToolTip( QWidget* widget ) const;
|
|
- QWidget* widget;
|
|
- QRegion pending;
|
|
- bool recursionCheck;
|
|
- QTimer timer;
|
|
- };
|
|
-
|
|
-} // namespace
|
|
-
|
|
-#endif
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator-kde4/switcher.cpp compiz-0.8.8/kde/window-decorator-kde4/switcher.cpp
|
|
--- compiz-0.8.8-orig/kde/window-decorator-kde4/switcher.cpp 2010-11-23 10:55:14.000000000 +0100
|
|
+++ compiz-0.8.8/kde/window-decorator-kde4/switcher.cpp 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,308 +0,0 @@
|
|
-/*
|
|
- * Copyright © 2008 Dennis Kasprzyk <onestone@opencompositing.org>
|
|
- *
|
|
- * 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., 51 Franklin Street, Fifth Floor, Boston,
|
|
- * MA 02110-1301, USA.
|
|
- *
|
|
- * Author: Dennis Kasprzyk <onestone@opencompositing.org>
|
|
- */
|
|
-
|
|
-#include "switcher.h"
|
|
-#include "utils.h"
|
|
-#include "decorator.h"
|
|
-
|
|
-#include <X11/Xlib.h>
|
|
-#include <X11/Xatom.h>
|
|
-#include <X11/extensions/Xcomposite.h>
|
|
-#include <X11/Xregion.h>
|
|
-
|
|
-#include <fixx11h.h>
|
|
-
|
|
-#include <KDE/Plasma/FrameSvg>
|
|
-#include <KDE/Plasma/Theme>
|
|
-
|
|
-#include <kwindowsystem.h>
|
|
-
|
|
-#include <QString>
|
|
-#include <QPainter>
|
|
-
|
|
-KWD::Switcher::Switcher (WId parentId, WId id):
|
|
- mId (id),
|
|
- mX11Pixmap (0),
|
|
- mX11BackgroundPixmap (0)
|
|
-{
|
|
- QPalette palette;
|
|
- long prop[4];
|
|
- QColor color;
|
|
- color = Plasma::Theme::defaultTheme ()->color (Plasma::Theme::TextColor);
|
|
-
|
|
- mBackground = new Plasma::FrameSvg();
|
|
- mBackground->setImagePath ("dialogs/background");
|
|
- mBackground->setEnabledBorders(Plasma::FrameSvg::AllBorders);
|
|
-
|
|
- mBorder.left = mBackground->marginSize(Plasma::LeftMargin);
|
|
- mBorder.right = mBackground->marginSize(Plasma::RightMargin);
|
|
- mBorder.top = mBackground->marginSize(Plasma::TopMargin);
|
|
- mBorder.bottom = mBackground->marginSize(Plasma::BottomMargin) +
|
|
- Plasma::Theme::defaultTheme ()->fontMetrics ().height () + 10;
|
|
-
|
|
- mContext.extents.left = mBorder.left;
|
|
- mContext.extents.right = mBorder.right;
|
|
- mContext.extents.top = mBorder.top;
|
|
- mContext.extents.bottom = mBorder.bottom;
|
|
-
|
|
- mContext.left_space = mBorder.left;
|
|
- mContext.right_space = mBorder.right;
|
|
- mContext.top_space = mBorder.top;
|
|
- mContext.bottom_space = mBorder.bottom;
|
|
-
|
|
- mContext.left_corner_space = 0;
|
|
- mContext.right_corner_space = 0;
|
|
- mContext.top_corner_space = 0;
|
|
- mContext.bottom_corner_space = 0;
|
|
-
|
|
- updateGeometry ();
|
|
-
|
|
- prop[0] = (color.red () * 256) + color.red ();
|
|
- prop[1] = (color.green () * 256) + color.green ();
|
|
- prop[2] = (color.blue () * 256) + color.blue ();
|
|
- prop[3] = (color.alpha () * 256) + color.alpha ();
|
|
-
|
|
- KWD::trapXError ();
|
|
- XChangeProperty (QX11Info::display (), id, Atoms::switchFgColor, XA_INTEGER,
|
|
- 32, PropModeReplace, (unsigned char *) prop, 4);
|
|
- KWD::popXError ();
|
|
-}
|
|
-
|
|
-KWD::Switcher::~Switcher ()
|
|
-{
|
|
- if (mX11Pixmap)
|
|
- XFreePixmap (QX11Info::display (), mX11Pixmap);
|
|
- if (mX11BackgroundPixmap)
|
|
- XFreePixmap (QX11Info::display (), mX11BackgroundPixmap);
|
|
- delete mBackground;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Switcher::updateGeometry ()
|
|
-{
|
|
- int x, y;
|
|
- unsigned int width, height, border, depth;
|
|
- XID root;
|
|
-
|
|
- XGetGeometry (QX11Info::display (), mId, &root, &x, &y, &width, &height,
|
|
- &border, &depth);
|
|
-
|
|
- mGeometry = QRect (x, y, width, height);
|
|
-
|
|
- KWD::readWindowProperty (mId, Atoms::switchSelectWindow,
|
|
- (long *)&mSelected);
|
|
-
|
|
- if (mX11Pixmap)
|
|
- XFreePixmap (QX11Info::display (), mX11Pixmap);
|
|
- if (mX11BackgroundPixmap)
|
|
- XFreePixmap (QX11Info::display (), mX11BackgroundPixmap);
|
|
-
|
|
- mX11Pixmap = XCreatePixmap (QX11Info::display (),
|
|
- QX11Info::appRootWindow (),
|
|
- width + mBorder.left + mBorder.right,
|
|
- height + mBorder.top + mBorder.bottom, 32);
|
|
-
|
|
- mX11BackgroundPixmap = XCreatePixmap (QX11Info::display (),
|
|
- QX11Info::appRootWindow (),
|
|
- width, height, 32);
|
|
-
|
|
- mPixmap = QPixmap::fromX11Pixmap (mX11Pixmap, QPixmap::ExplicitlyShared);
|
|
- mBackgroundPixmap = QPixmap::fromX11Pixmap (mX11BackgroundPixmap,
|
|
- QPixmap::ExplicitlyShared);
|
|
-
|
|
- redrawPixmap ();
|
|
- update ();
|
|
-
|
|
- decor_get_default_layout (&mContext,
|
|
- mGeometry.width (),
|
|
- mGeometry.height (),
|
|
- &mDecorLayout);
|
|
-
|
|
- updateWindowProperties ();
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Switcher::redrawPixmap ()
|
|
-{
|
|
- QPainter p (&mPixmap);
|
|
- QPainter bp (&mBackgroundPixmap);
|
|
-
|
|
- const int contentWidth = mPixmap.width ();
|
|
- const int contentHeight = mPixmap.height ();
|
|
-
|
|
- mPixmap.fill (Qt::transparent);
|
|
-
|
|
- p.setCompositionMode (QPainter::CompositionMode_Source);
|
|
- p.setRenderHint (QPainter::SmoothPixmapTransform);
|
|
-
|
|
- mBackground->resizeFrame (QSizeF (contentWidth, contentHeight));
|
|
- mBackground->paintFrame (&p, QRect (0, 0, contentWidth, contentHeight));
|
|
-
|
|
- bp.setCompositionMode (QPainter::CompositionMode_Source);
|
|
- bp.drawPixmap (0, 0, mPixmap, mBorder.left, mBorder.top,
|
|
- mGeometry.width (), mGeometry.height ());
|
|
-
|
|
- XSetWindowBackgroundPixmap (QX11Info::display (), mId,
|
|
- mX11BackgroundPixmap);
|
|
-
|
|
- XClearWindow (QX11Info::display (), mId);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Switcher::update ()
|
|
-{
|
|
- QFontMetrics fm = Plasma::Theme::defaultTheme ()->fontMetrics ();
|
|
- QFont font (Plasma::Theme::defaultTheme ()->
|
|
- font (Plasma::Theme::DefaultFont));
|
|
- QString name;
|
|
- QPainter p (&mPixmap);
|
|
-
|
|
- KWD::readWindowProperty (mId, Atoms::switchSelectWindow,
|
|
- (long *)&mSelected);
|
|
-
|
|
- name = KWindowSystem::windowInfo
|
|
- (mSelected, NET::WMVisibleName, 0).visibleName ();
|
|
-
|
|
- while (fm.width (name) > mGeometry.width ())
|
|
- {
|
|
- name.truncate (name.length () - 6);
|
|
- name += "...";
|
|
- }
|
|
-
|
|
- p.setCompositionMode (QPainter::CompositionMode_Source);
|
|
-
|
|
- mBackground->paintFrame (&p, QRect (mBorder.left,
|
|
- mBorder.top +
|
|
- mGeometry.height () + 5,
|
|
- mGeometry.width (),
|
|
- fm.height ()));
|
|
-
|
|
- p.setFont (font);
|
|
- p.setPen (Plasma::Theme::defaultTheme ()->color(Plasma::Theme::TextColor));
|
|
-
|
|
- p.drawText ((mPixmap.width () - fm.width (name)) / 2,
|
|
- mBorder.top + mGeometry.height () + 5 + fm.ascent (), name);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Switcher::updateWindowProperties ()
|
|
-{
|
|
- long data[256];
|
|
- decor_quad_t quads[N_QUADS_MAX];
|
|
- int nQuad;
|
|
- int lh, rh;
|
|
- int w;
|
|
-
|
|
- lh = mDecorLayout.left.y2 - mDecorLayout.left.y1;
|
|
- rh = mDecorLayout.right.y2 - mDecorLayout.right.y1;
|
|
-
|
|
- w = mDecorLayout.top.x2 - mDecorLayout.top.x1 - mContext.left_space -
|
|
- mContext.right_space;
|
|
-
|
|
- nQuad = decor_set_lXrXtXbX_window_quads (quads, &mContext, &mDecorLayout,
|
|
- lh / 2, rh / 2, w, w / 2);
|
|
- decor_quads_to_property (data, mX11Pixmap,
|
|
- &mBorder, &mBorder,
|
|
- 0, 0,
|
|
- quads, nQuad);
|
|
-
|
|
- KWD::trapXError ();
|
|
- XChangeProperty (QX11Info::display(), mId, Atoms::netWindowDecor,
|
|
- XA_INTEGER, 32, PropModeReplace, (unsigned char *) data,
|
|
- BASE_PROP_SIZE + QUAD_PROP_SIZE * nQuad);
|
|
- KWD::popXError ();
|
|
-
|
|
- updateBlurProperty (lh / 2, rh / 2, w / 2, w / 2);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Switcher::updateBlurProperty (int topOffset,
|
|
- int bottomOffset,
|
|
- int leftOffset,
|
|
- int rightOffset)
|
|
-{
|
|
- Atom atom = Atoms::compizWindowBlurDecor;
|
|
- QRegion topQRegion, bottomQRegion, leftQRegion, rightQRegion;
|
|
- Region topRegion = NULL;
|
|
- Region bottomRegion = NULL;
|
|
- Region leftRegion = NULL;
|
|
- Region rightRegion = NULL;
|
|
- int size = 0;
|
|
- int w, h;
|
|
-
|
|
- w = mGeometry.width () + mContext.extents.left + mContext.extents.right;
|
|
- h = mGeometry.height () + mContext.extents.top + mContext.extents.bottom;
|
|
-
|
|
- if (blurType != BLUR_TYPE_NONE)
|
|
- {
|
|
- QRegion r;
|
|
-
|
|
- topQRegion = QRegion (-mContext.extents.left, -mContext.extents.top,
|
|
- w, mContext.extents.top);
|
|
- topRegion = topQRegion.handle ();
|
|
-
|
|
- bottomQRegion = QRegion (-mContext.extents.left, 0,
|
|
- w, mContext.extents.bottom);
|
|
- bottomRegion = bottomQRegion.handle ();
|
|
-
|
|
- leftQRegion = QRegion (-mContext.extents.left, 0,
|
|
- mContext.extents.left, mGeometry.height ());
|
|
- leftRegion = leftQRegion.handle ();
|
|
-
|
|
- rightQRegion = QRegion (0, 0, mContext.extents.right,
|
|
- mGeometry.height ());
|
|
- rightRegion = rightQRegion.handle ();
|
|
- }
|
|
-
|
|
- if (topRegion)
|
|
- size += topRegion->numRects;
|
|
- if (bottomRegion)
|
|
- size += bottomRegion->numRects;
|
|
- if (leftRegion)
|
|
- size += leftRegion->numRects;
|
|
- if (rightRegion)
|
|
- size += rightRegion->numRects;
|
|
-
|
|
- if (size)
|
|
- {
|
|
- long data[size * 6 + 2];
|
|
-
|
|
- decor_region_to_blur_property (data, 4, 0,
|
|
- mGeometry.width (),
|
|
- mGeometry.height (),
|
|
- topRegion, topOffset,
|
|
- bottomRegion, bottomOffset,
|
|
- leftRegion, leftOffset,
|
|
- rightRegion, rightOffset);
|
|
-
|
|
- KWD::trapXError ();
|
|
- XChangeProperty (QX11Info::display (), mId, atom, XA_INTEGER,
|
|
- 32, PropModeReplace, (unsigned char *) data,
|
|
- 2 + size * 6);
|
|
- KWD::popXError ();
|
|
- }
|
|
- else
|
|
- {
|
|
- KWD::trapXError ();
|
|
- XDeleteProperty (QX11Info::display (), mId, atom);
|
|
- KWD::popXError ();
|
|
- }
|
|
-}
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator-kde4/switcher.h compiz-0.8.8/kde/window-decorator-kde4/switcher.h
|
|
--- compiz-0.8.8-orig/kde/window-decorator-kde4/switcher.h 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator-kde4/switcher.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,86 +0,0 @@
|
|
-/*
|
|
- * Copyright © 2008 Dennis Kasprzyk <onestone@opencompositing.org>
|
|
- *
|
|
- * 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., 51 Franklin Street, Fifth Floor, Boston,
|
|
- * MA 02110-1301, USA.
|
|
- *
|
|
- * Author: Dennis Kasprzyk <onestone@opencompositing.org>
|
|
- */
|
|
-
|
|
-#ifndef _SWITCHER_H
|
|
-#define _SWITCHER_H
|
|
-
|
|
-#include <QPixmap>
|
|
-#include <QRect>
|
|
-#include <QX11Info>
|
|
-#include <decoration.h>
|
|
-#include <fixx11h.h>
|
|
-
|
|
-namespace Plasma
|
|
-{
|
|
-class FrameSvg;
|
|
-}
|
|
-
|
|
-class QSpacerItem;
|
|
-class QLabel;
|
|
-class QVBoxLayout;
|
|
-
|
|
-namespace KWD
|
|
-{
|
|
-
|
|
-class Switcher
|
|
-{
|
|
-
|
|
- public:
|
|
- Switcher (WId parentId, WId id);
|
|
- ~Switcher ();
|
|
-
|
|
- void update ();
|
|
- void updateGeometry ();
|
|
-
|
|
- WId xid () const
|
|
- {
|
|
- return mId;
|
|
- }
|
|
-
|
|
- private:
|
|
- void updateWindowProperties ();
|
|
- void updateBlurProperty (int topOffset,
|
|
- int bottomOffset,
|
|
- int leftOffset,
|
|
- int rightOffset);
|
|
- void redrawPixmap ();
|
|
-
|
|
- private:
|
|
-
|
|
- WId mId;
|
|
- WId mSelected;
|
|
-
|
|
- QRect mGeometry;
|
|
-
|
|
- Plasma::FrameSvg *mBackground;
|
|
- QPixmap mPixmap;
|
|
- Pixmap mX11Pixmap;
|
|
- QPixmap mBackgroundPixmap;
|
|
- Pixmap mX11BackgroundPixmap;
|
|
-
|
|
- decor_layout_t mDecorLayout;
|
|
- decor_context_t mContext;
|
|
- decor_extents_t mBorder;
|
|
-};
|
|
-
|
|
-}
|
|
-
|
|
-#endif
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator-kde4/utils.cpp compiz-0.8.8/kde/window-decorator-kde4/utils.cpp
|
|
--- compiz-0.8.8-orig/kde/window-decorator-kde4/utils.cpp 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator-kde4/utils.cpp 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,209 +0,0 @@
|
|
-/*
|
|
- * Copyright © 2008 Dennis Kasprzyk <onestone@opencompositing.org>
|
|
- * Copyright © 2006 Novell, Inc.
|
|
- * Copyright © 2006 Volker Krause <vkrause@kde.org>
|
|
- *
|
|
- * 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., 51 Franklin Street, Fifth Floor, Boston,
|
|
- * MA 02110-1301, USA.
|
|
- *
|
|
- * Author: David Reveman <davidr@novell.com>
|
|
- */
|
|
-
|
|
-#include "utils.h"
|
|
-
|
|
-#include <decoration.h>
|
|
-#include <X11/Xlib.h>
|
|
-#include <X11/Xatom.h>
|
|
-
|
|
-#include <stdlib.h>
|
|
-#include <QX11Info>
|
|
-
|
|
-static int trappedErrorCode = 0;
|
|
-
|
|
-namespace KWD
|
|
-{
|
|
- namespace Atoms
|
|
- {
|
|
- Atom switchSelectWindow;
|
|
- Atom switchFgColor;
|
|
- Atom netWmWindowOpacity;
|
|
- Atom netFrameWindow;
|
|
- Atom netWindowDecor;
|
|
- Atom netWindowDecorNormal;
|
|
- Atom netWindowDecorActive;
|
|
- Atom netWindowDecorBare;
|
|
- Atom wmTakeFocus;
|
|
- Atom netWmContextHelp;
|
|
- Atom wmProtocols;
|
|
- Atom toolkitActionAtom;
|
|
- Atom toolkitActionWindowMenuAtom;
|
|
- Atom toolkitActionForceQuitDialogAtom;
|
|
- Atom compizWindowBlurDecor;
|
|
- Atom enlightmentDesktop;
|
|
- }
|
|
-}
|
|
-
|
|
-static int (*oldErrorHandler) (Display *display, XErrorEvent *error);
|
|
-
|
|
-static int
|
|
-xErrorHandler (Display *display,
|
|
- XErrorEvent *error)
|
|
-{
|
|
- (void) display;
|
|
-
|
|
- trappedErrorCode = error->error_code;
|
|
-
|
|
- return 0;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::trapXError (void)
|
|
-{
|
|
- trappedErrorCode = 0;
|
|
- oldErrorHandler = XSetErrorHandler (xErrorHandler);
|
|
-}
|
|
-
|
|
-int
|
|
-KWD::popXError (void)
|
|
-{
|
|
- XSync (QX11Info::display(), false);
|
|
- XSetErrorHandler (oldErrorHandler);
|
|
-
|
|
- return trappedErrorCode;
|
|
-}
|
|
-
|
|
-void *
|
|
-KWD::readXProperty (WId window,
|
|
- Atom property,
|
|
- Atom type,
|
|
- int *items)
|
|
-{
|
|
- long offset = 0, length = 2048L;
|
|
- Atom actualType;
|
|
- int format;
|
|
- unsigned long nItems, bytesRemaining;
|
|
- unsigned char *data = 0l;
|
|
- int result;
|
|
-
|
|
- KWD::trapXError ();
|
|
- result = XGetWindowProperty (QX11Info::display(), window, property, offset,
|
|
- length, false, type,
|
|
- &actualType, &format, &nItems,
|
|
- &bytesRemaining, &data);
|
|
-
|
|
- if (KWD::popXError ())
|
|
- return NULL;
|
|
-
|
|
- if (result == Success && actualType == type && format == 32 && nItems > 0)
|
|
- {
|
|
- if (items)
|
|
- *items = nItems;
|
|
-
|
|
- return reinterpret_cast <void *>(data);
|
|
- }
|
|
-
|
|
- if (data)
|
|
- XFree (data);
|
|
-
|
|
- if (items)
|
|
- *items = 0;
|
|
-
|
|
- return NULL;
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::readWindowProperty (long window,
|
|
- long property,
|
|
- long *value)
|
|
-{
|
|
- void *data = readXProperty (window, property, XA_WINDOW, NULL);
|
|
-
|
|
- if (data)
|
|
- {
|
|
- if (value)
|
|
- *value = *reinterpret_cast <int *>(data);
|
|
-
|
|
- XFree (data);
|
|
-
|
|
- return true;
|
|
- }
|
|
-
|
|
- return false;
|
|
-}
|
|
-
|
|
-unsigned short
|
|
-KWD::readPropertyShort (WId id,
|
|
- Atom property,
|
|
- unsigned short defaultValue)
|
|
-{
|
|
- Atom actual;
|
|
- int result, format;
|
|
- unsigned long n, left;
|
|
- unsigned char *data;
|
|
-
|
|
- KWD::trapXError ();
|
|
- result = XGetWindowProperty (QX11Info::display(), id, property,
|
|
- 0L, 1L, FALSE, XA_CARDINAL, &actual, &format,
|
|
- &n, &left, &data);
|
|
- if (KWD::popXError ())
|
|
- return defaultValue;
|
|
-
|
|
- if (result == Success && n && data)
|
|
- {
|
|
- unsigned int value;
|
|
-
|
|
- memcpy (&value, data, sizeof (unsigned int));
|
|
-
|
|
- XFree (data);
|
|
-
|
|
- return value >> 16;
|
|
- }
|
|
-
|
|
- return defaultValue;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Atoms::init (void)
|
|
-{
|
|
- Display *xdisplay = QX11Info::display();
|
|
-
|
|
- netFrameWindow = XInternAtom (xdisplay, "_NET_FRAME_WINDOW", false);
|
|
- netWindowDecor = XInternAtom (xdisplay, DECOR_WINDOW_ATOM_NAME, false);
|
|
- netWindowDecorNormal =
|
|
- XInternAtom (xdisplay, DECOR_NORMAL_ATOM_NAME, false);
|
|
- netWindowDecorActive =
|
|
- XInternAtom (xdisplay, DECOR_ACTIVE_ATOM_NAME, false);
|
|
- netWindowDecorBare =
|
|
- XInternAtom (xdisplay, DECOR_BARE_ATOM_NAME, false);
|
|
- switchSelectWindow =
|
|
- XInternAtom (xdisplay, DECOR_SWITCH_WINDOW_ATOM_NAME, false);
|
|
- switchFgColor =
|
|
- XInternAtom (xdisplay, DECOR_SWITCH_FOREGROUND_COLOR_ATOM_NAME, false);
|
|
- wmTakeFocus = XInternAtom (xdisplay, "WM_TAKE_FOCUS", false);
|
|
- netWmContextHelp =
|
|
- XInternAtom (xdisplay, "_NET_WM_CONTEXT_HELP", false);
|
|
- wmProtocols = XInternAtom (xdisplay, "WM_PROTOCOLS", false);
|
|
- netWmWindowOpacity =
|
|
- XInternAtom (xdisplay, "_NET_WM_WINDOW_OPACITY", false);
|
|
- toolkitActionAtom = XInternAtom (xdisplay, "_COMPIZ_TOOLKIT_ACTION", false);
|
|
- toolkitActionWindowMenuAtom =
|
|
- XInternAtom (xdisplay, "_COMPIZ_TOOLKIT_ACTION_WINDOW_MENU", false);
|
|
- toolkitActionForceQuitDialogAtom =
|
|
- XInternAtom (xdisplay, "_COMPIZ_TOOLKIT_ACTION_FORCE_QUIT_DIALOG",
|
|
- false);
|
|
- compizWindowBlurDecor =
|
|
- XInternAtom (xdisplay, DECOR_BLUR_ATOM_NAME, false);
|
|
- enlightmentDesktop = XInternAtom (xdisplay, "ENLIGHTENMENT_DESKTOP", false);
|
|
-}
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator-kde4/utils.h compiz-0.8.8/kde/window-decorator-kde4/utils.h
|
|
--- compiz-0.8.8-orig/kde/window-decorator-kde4/utils.h 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator-kde4/utils.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,71 +0,0 @@
|
|
-/*
|
|
- * Copyright © 2008 Dennis Kasprzyk <onestone@opencompositing.org>
|
|
- * Copyright © 2006 Novell, Inc.
|
|
- * Copyright © 2006 Volker Krause <vkrause@kde.org>
|
|
- *
|
|
- * 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., 51 Franklin Street, Fifth Floor, Boston,
|
|
- * MA 02110-1301, USA.
|
|
- *
|
|
- * Author: David Reveman <davidr@novell.com>
|
|
- */
|
|
-
|
|
-#ifndef _UTILS_H
|
|
-#define _UTILS_H
|
|
-
|
|
-#include <X11/Xlib.h>
|
|
-#include <fixx11h.h>
|
|
-#include <QWidget>
|
|
-
|
|
-#include <qglobal.h>
|
|
-
|
|
-#if (QT_VERSION >= QT_VERSION_CHECK(4, 5, 0))
|
|
- #define QT_45
|
|
-#endif
|
|
-
|
|
-namespace KWD
|
|
-{
|
|
- namespace Atoms
|
|
- {
|
|
- extern Atom switchSelectWindow;
|
|
- extern Atom switchFgColor;
|
|
- extern Atom netWmWindowOpacity;
|
|
- extern Atom netFrameWindow;
|
|
- extern Atom netWindowDecor;
|
|
- extern Atom netWindowDecorNormal;
|
|
- extern Atom netWindowDecorActive;
|
|
- extern Atom netWindowDecorBare;
|
|
- extern Atom wmTakeFocus;
|
|
- extern Atom netWmContextHelp;
|
|
- extern Atom wmProtocols;
|
|
- extern Atom toolkitActionAtom;
|
|
- extern Atom toolkitActionWindowMenuAtom;
|
|
- extern Atom toolkitActionForceQuitDialogAtom;
|
|
- extern Atom compizWindowBlurDecor;
|
|
- extern Atom enlightmentDesktop;
|
|
-
|
|
- void init (void);
|
|
- }
|
|
-
|
|
- void trapXError (void);
|
|
- int popXError (void);
|
|
- bool eventFilter (void *message, long *result);
|
|
- void *readXProperty (WId window, Atom property, Atom type, int *items);
|
|
- bool readWindowProperty (long wId, long property, long *value);
|
|
- unsigned short readPropertyShort (WId id,
|
|
- Atom property,
|
|
- unsigned short defaultValue);
|
|
-}
|
|
-
|
|
-#endif
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator-kde4/window.cpp compiz-0.8.8/kde/window-decorator-kde4/window.cpp
|
|
--- compiz-0.8.8-orig/kde/window-decorator-kde4/window.cpp 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator-kde4/window.cpp 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,1884 +0,0 @@
|
|
-/*
|
|
- * Copyright © 2009 Dennis Kasprzyk <onestone@compiz-fusion.org>
|
|
- * Copyright © 2006 Novell, Inc.
|
|
- * Copyright © 2006 Volker Krause <vkrause@kde.org>
|
|
- *
|
|
- * 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., 51 Franklin Street, Fifth Floor, Boston,
|
|
- * MA 02110-1301, USA.
|
|
- *
|
|
- * Author: David Reveman <davidr@novell.com>
|
|
- */
|
|
-
|
|
-#include "window.h"
|
|
-#include "decorator.h"
|
|
-#include "options.h"
|
|
-#include "utils.h"
|
|
-
|
|
-#include <X11/Xlib.h>
|
|
-#include <X11/extensions/shape.h>
|
|
-#include <X11/extensions/Xcomposite.h>
|
|
-#include <X11/Xregion.h>
|
|
-
|
|
-#include <fixx11h.h>
|
|
-
|
|
-#include <KDE/KGlobal>
|
|
-#include <KDE/KGlobalSettings>
|
|
-#include <KDE/KIconLoader>
|
|
-#include <kdecoration.h>
|
|
-#include <kwindowsystem.h>
|
|
-#include <KDE/KLocale>
|
|
-#include <KDE/KStandardDirs>
|
|
-#include <KDE/KAction>
|
|
-#include <KDE/KActionCollection>
|
|
-#include <KDE/KIcon>
|
|
-
|
|
-#include <QApplication>
|
|
-#include <QEvent>
|
|
-#include <QWidget>
|
|
-#include <QString>
|
|
-#include <QTimer>
|
|
-#include <QMenu>
|
|
-#include <QX11Info>
|
|
-#include <QObjectList>
|
|
-#include <QVector>
|
|
-#include <QProcess>
|
|
-#include <QStyle>
|
|
-#include <QPainter>
|
|
-
|
|
-#include "paintredirector.h"
|
|
-
|
|
-KWD::Window::Window (WId parentId,
|
|
- WId clientId,
|
|
- WId frame,
|
|
- Type type,
|
|
- int x,
|
|
- int y,
|
|
- int w,
|
|
- int h) :
|
|
- mType (type),
|
|
- mParentId (parentId),
|
|
- mFrame (0),
|
|
- mClientId (clientId),
|
|
- mSelectedId (0),
|
|
- mDecor (0),
|
|
- mPixmap (0),
|
|
- mUpdateProperty (false),
|
|
- mShapeSet (false),
|
|
- mPopup (0),
|
|
- mAdvancedMenu (0),
|
|
- mOpacityMenu (0),
|
|
- mDesktopMenu (0),
|
|
- mProcessKiller (this),
|
|
- mKeys (this),
|
|
- mResizeOpAction (0),
|
|
- mMoveOpAction (0),
|
|
- mMaximizeOpAction (0),
|
|
- mShadeOpAction (0),
|
|
- mKeepAboveOpAction (0),
|
|
- mKeepBelowOpAction (0),
|
|
- mFullScreenOpAction (0),
|
|
- mMinimizeOpAction (0),
|
|
- mCloseOpAction (0),
|
|
- mDesktopOpAction (0),
|
|
- mPaintRedirector (0)
|
|
-{
|
|
- memset (&mBorder, 0, sizeof (mBorder));
|
|
-
|
|
- if (mType == Normal)
|
|
- {
|
|
- KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMState |
|
|
- NET::WMVisibleName, 0);
|
|
-
|
|
- mState = wInfo.state ();
|
|
-
|
|
- if (mType == Normal)
|
|
- {
|
|
- mName = wInfo.visibleName ();
|
|
-
|
|
- mIcon = KWindowSystem::icon (mClientId, 32, 32, true,
|
|
- KWindowSystem::NETWM |
|
|
- KWindowSystem::WMHints );
|
|
-
|
|
- mMiniIcon = KWindowSystem::icon (mClientId, 16, 16, true,
|
|
- KWindowSystem::NETWM |
|
|
- KWindowSystem::WMHints );
|
|
-
|
|
- if (mIcon.isNull ())
|
|
- {
|
|
- mIcon = KWindowSystem::icon (mClientId, 32, 32, true,
|
|
- KWindowSystem::ClassHint |
|
|
- KWindowSystem::XApp );
|
|
- mMiniIcon = KWindowSystem::icon (mClientId, 16, 16, true,
|
|
- KWindowSystem::ClassHint |
|
|
- KWindowSystem::XApp );
|
|
- }
|
|
-
|
|
- mOpacity = readPropertyShort (mClientId, Atoms::netWmWindowOpacity,
|
|
- 0xffff);
|
|
- }
|
|
- else
|
|
- {
|
|
- mIcon = QPixmap ();
|
|
- mMiniIcon = QPixmap ();
|
|
- mName = QString ("");
|
|
- }
|
|
-
|
|
- updateFrame (frame);
|
|
-
|
|
- mGeometry = QRect (x, y, w, h);
|
|
-
|
|
- getWindowProtocols ();
|
|
- }
|
|
- else
|
|
- {
|
|
- mIcon = QPixmap ();
|
|
- mMiniIcon = QPixmap ();
|
|
- mName = QString ("");
|
|
- mGeometry = QRect (50, 50, 30, 1);
|
|
- }
|
|
-
|
|
- createDecoration ();
|
|
-
|
|
- mActiveChild = NULL;
|
|
-}
|
|
-
|
|
-KWD::Window::~Window (void)
|
|
-{
|
|
- if (mPixmap)
|
|
- XFreePixmap (QX11Info::display(), mPixmap);
|
|
-
|
|
- if (mDecor)
|
|
- delete mDecor;
|
|
-
|
|
- if (mPopup)
|
|
- delete mPopup;
|
|
-
|
|
- if (mPaintRedirector)
|
|
- delete mPaintRedirector;
|
|
-
|
|
- if (mProcessKiller.state () == QProcess::Running)
|
|
- {
|
|
- mProcessKiller.terminate ();
|
|
- mProcessKiller.waitForFinished (10000);
|
|
- if (mProcessKiller.state () == QProcess::Running)
|
|
- {
|
|
- mProcessKiller.kill ();
|
|
- mProcessKiller.waitForFinished (5000);
|
|
- }
|
|
- }
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isActive (void) const
|
|
-{
|
|
- if (mType == DefaultActive)
|
|
- return true;
|
|
-
|
|
- return Decorator::activeId () == mClientId;
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isCloseable (void) const
|
|
-{
|
|
- KWindowInfo wInfo;
|
|
-
|
|
- if (mType != Normal)
|
|
- return false;
|
|
-
|
|
- wInfo = KWindowSystem::windowInfo (mClientId, NET::WMPid,
|
|
- NET::WM2AllowedActions);
|
|
- return wInfo.actionSupported (NET::ActionClose);
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isMaximizable (void) const
|
|
-{
|
|
- KWindowInfo wInfo;
|
|
-
|
|
- if (mType != Normal)
|
|
- return false;
|
|
-
|
|
- wInfo = KWindowSystem::windowInfo (mClientId, NET::WMPid,
|
|
- NET::WM2AllowedActions);
|
|
- return wInfo.actionSupported (NET::ActionMax);
|
|
-}
|
|
-
|
|
-KDecoration::MaximizeMode
|
|
-KWD::Window::maximizeMode (void) const
|
|
-{
|
|
- MaximizeMode mode = MaximizeRestore;
|
|
-
|
|
- if (mType != Normal)
|
|
- return mode;
|
|
-
|
|
- mode =
|
|
- ((mState & NET::MaxVert) ? MaximizeVertical : MaximizeRestore) |
|
|
- ((mState & NET::MaxHoriz) ? MaximizeHorizontal : MaximizeRestore);
|
|
-
|
|
- return mode;
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isMinimizable (void) const
|
|
-{
|
|
- KWindowInfo wInfo;
|
|
-
|
|
- if (mType != Normal)
|
|
- return false;
|
|
-
|
|
- wInfo = KWindowSystem::windowInfo (mClientId, NET::WMPid,
|
|
- NET::WM2AllowedActions);
|
|
- return wInfo.actionSupported (NET::ActionMinimize);
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::providesContextHelp (void) const
|
|
-{
|
|
- if (mType != Normal)
|
|
- return false;
|
|
-
|
|
- return mSupportContextHelp;
|
|
-}
|
|
-
|
|
-int
|
|
-KWD::Window::desktop (void) const
|
|
-{
|
|
- KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId,
|
|
- NET::WMDesktop, 0);
|
|
-
|
|
- return wInfo.desktop ();
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isModal (void) const
|
|
-{
|
|
- return mState & NET::Modal;
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isShadeable (void) const
|
|
-{
|
|
- KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMPid,
|
|
- NET::WM2AllowedActions);
|
|
-
|
|
- return wInfo.actionSupported (NET::ActionShade);
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isShade (void) const
|
|
-{
|
|
- if (mType != Normal)
|
|
- return false;
|
|
-
|
|
- return (mState & NET::Shaded);
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isSetShade (void) const
|
|
-{
|
|
- return isShade ();
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::keepAbove (void) const
|
|
-{
|
|
- if (mType != Normal)
|
|
- return false;
|
|
-
|
|
- return (mState & NET::KeepAbove);
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::keepBelow (void) const
|
|
-{
|
|
- if (mType != Normal)
|
|
- return false;
|
|
-
|
|
- return (mState & NET::KeepBelow);
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isMovable (void) const
|
|
-{
|
|
- KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMPid,
|
|
- NET::WM2AllowedActions);
|
|
-
|
|
- return wInfo.actionSupported (NET::ActionMove);
|
|
-}
|
|
-
|
|
-NET::WindowType
|
|
-KWD::Window::windowType (unsigned long mask) const
|
|
-{
|
|
- KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId,
|
|
- NET::WMWindowType, 0);
|
|
-
|
|
- return wInfo.windowType (mask);
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isResizable (void) const
|
|
-{
|
|
- KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMPid,
|
|
- NET::WM2AllowedActions);
|
|
-
|
|
- return wInfo.actionSupported (NET::ActionResize);
|
|
-}
|
|
-
|
|
-QIcon
|
|
-KWD::Window::icon (void) const
|
|
-{
|
|
- QIcon icon (mIcon);
|
|
- icon.addPixmap (mMiniIcon);
|
|
- return icon;
|
|
-}
|
|
-
|
|
-QString
|
|
-KWD::Window::caption (void) const
|
|
-{
|
|
- return mName;
|
|
-}
|
|
-
|
|
-/* TODO: We should use libtaskmanager, which is part of kdebase to create
|
|
- the window menu instead but the headers for that library are currently
|
|
- not installed. If kdebase could install those headers, we wouldn't have
|
|
- to have our own window menu implementaion here. */
|
|
-void
|
|
-KWD::Window::showWindowMenu (const QPoint &pos)
|
|
-{
|
|
- if (!mPopup)
|
|
- {
|
|
- QAction *action;
|
|
- const int levels[] = { 100, 90, 75, 50, 25, 10 };
|
|
-
|
|
- mPopup = new QMenu ();
|
|
- mPopup->setFont (KGlobalSettings::menuFont ());
|
|
-
|
|
- connect (mPopup, SIGNAL (aboutToShow ()),
|
|
- SLOT (handlePopupAboutToShow ()));
|
|
- connect (mPopup, SIGNAL (triggered (QAction*)),
|
|
- SLOT (handlePopupActivated (QAction*)));
|
|
-
|
|
- mAdvancedMenu = new QMenu (mPopup);
|
|
- mAdvancedMenu->setFont (KGlobalSettings::menuFont ());
|
|
-
|
|
- mKeepAboveOpAction = mAdvancedMenu->addAction (i18n ("Keep &Above Others"));
|
|
- mKeepAboveOpAction->setIcon (KIcon ("go-up"));
|
|
- KAction *kaction = qobject_cast<KAction*>
|
|
- (mKeys.action ("Window Above Other Windows"));
|
|
- if (kaction != 0)
|
|
- mKeepAboveOpAction->setShortcut (kaction->globalShortcut ().primary ());
|
|
- mKeepAboveOpAction->setCheckable (true);
|
|
- mKeepAboveOpAction->setData (KDecorationDefines::KeepAboveOp);
|
|
-
|
|
- mKeepBelowOpAction = mAdvancedMenu->addAction (i18n ("Keep &Below Others"));
|
|
- mKeepBelowOpAction->setIcon (KIcon ("go-down"));
|
|
- kaction = qobject_cast<KAction*>
|
|
- (mKeys.action ("Window Below Other Windows"));
|
|
- if (kaction != 0)
|
|
- mKeepBelowOpAction->setShortcut (kaction->globalShortcut ().primary ());
|
|
- mKeepBelowOpAction->setCheckable (true);
|
|
- mKeepBelowOpAction->setData (KDecorationDefines::KeepBelowOp);
|
|
-
|
|
- mFullScreenOpAction = mAdvancedMenu->addAction (i18n ("&Fullscreen"));
|
|
- mFullScreenOpAction->setIcon (KIcon ("view-fullscreen"));
|
|
- kaction = qobject_cast<KAction*> (mKeys.action ("Window Fullscreen"));
|
|
- if (kaction != 0)
|
|
- mFullScreenOpAction->setShortcut (kaction->globalShortcut ().primary ());
|
|
- mFullScreenOpAction->setCheckable (true);
|
|
- mFullScreenOpAction->setData (KDecorationDefines::FullScreenOp);
|
|
-
|
|
- action = mPopup->addMenu (mAdvancedMenu);
|
|
- action->setText (i18n ("Ad&vanced"));
|
|
-
|
|
- mOpacityMenu = new QMenu (mPopup);
|
|
- mOpacityMenu->setFont (KGlobalSettings::menuFont ());
|
|
-
|
|
- connect (mOpacityMenu, SIGNAL (triggered (QAction*)),
|
|
- SLOT (handleOpacityPopupActivated (QAction*)));
|
|
-
|
|
-
|
|
- for( unsigned int i = 0; i < sizeof (levels) / sizeof (levels[0]); ++i)
|
|
- {
|
|
- action = mOpacityMenu->addAction
|
|
- (QString::number (levels[i]) + "%");
|
|
- action->setCheckable (true);
|
|
- action->setData (levels[i]);
|
|
- }
|
|
- action = mPopup->addMenu (mOpacityMenu);
|
|
- action->setText (i18n ("&Opacity"));
|
|
-
|
|
-
|
|
- mDesktopMenu = new QMenu (mPopup);
|
|
- mDesktopMenu->setFont (KGlobalSettings::menuFont ());
|
|
-
|
|
- connect (mDesktopMenu, SIGNAL (triggered (QAction*)),
|
|
- SLOT (handleDesktopPopupActivated (QAction*)));
|
|
-
|
|
- mDesktopOpAction = mPopup->addMenu (mDesktopMenu);
|
|
- mDesktopOpAction->setText (i18n ("To &Desktop"));
|
|
-
|
|
- mMoveOpAction = mPopup->addAction (i18n ("&Move"));
|
|
- mMoveOpAction->setIcon (KIcon ("move"));
|
|
- kaction = qobject_cast<KAction*> (mKeys.action ("Window Move"));
|
|
- if (kaction != 0)
|
|
- mMoveOpAction->setShortcut (kaction->globalShortcut ().primary ());
|
|
- mMoveOpAction->setData (KDecorationDefines::MoveOp);
|
|
-
|
|
- mResizeOpAction = mPopup->addAction (i18n ("Re&size"));
|
|
- kaction = qobject_cast<KAction*> (mKeys.action("Window Resize"));
|
|
- if (kaction != 0)
|
|
- mResizeOpAction->setShortcut (kaction->globalShortcut ().primary ());
|
|
- mResizeOpAction->setData (KDecorationDefines::ResizeOp);
|
|
-
|
|
- mMinimizeOpAction = mPopup->addAction (i18n ("Mi&nimize"));
|
|
- kaction = qobject_cast<KAction*> (mKeys.action ("Window Minimize"));
|
|
- if (kaction != 0)
|
|
- mMinimizeOpAction->setShortcut (kaction->globalShortcut ().primary ());
|
|
- mMinimizeOpAction->setData (KDecorationDefines::MinimizeOp);
|
|
-
|
|
- mMaximizeOpAction = mPopup->addAction (i18n ("Ma&ximize"));
|
|
- kaction = qobject_cast<KAction*> (mKeys.action ("Window Maximize"));
|
|
- if (kaction != 0)
|
|
- mMaximizeOpAction->setShortcut (kaction->globalShortcut ().primary ());
|
|
- mMaximizeOpAction->setCheckable (true);
|
|
- mMaximizeOpAction->setData (KDecorationDefines::MaximizeOp);
|
|
-
|
|
- mShadeOpAction = mPopup->addAction (i18n ("Sh&ade"));
|
|
- kaction = qobject_cast<KAction*> (mKeys.action ("Window Shade"));
|
|
- if (kaction != 0)
|
|
- mShadeOpAction->setShortcut (kaction->globalShortcut ().primary ());
|
|
- mShadeOpAction->setCheckable (true);
|
|
- mShadeOpAction->setData (KDecorationDefines::ShadeOp);
|
|
-
|
|
- mPopup->addSeparator ();
|
|
-
|
|
- mCloseOpAction = mPopup->addAction (i18n("&Close"));
|
|
- mCloseOpAction->setIcon (KIcon ("window-close" ));
|
|
- kaction = qobject_cast<KAction*> (mKeys.action("Window Close"));
|
|
- if (kaction != 0)
|
|
- mCloseOpAction->setShortcut (kaction->globalShortcut ().primary ());
|
|
- mCloseOpAction->setData (KDecorationDefines::CloseOp);
|
|
- }
|
|
-
|
|
- QPoint pnt = mDecor->widget ()->mapFromGlobal (pos);
|
|
-
|
|
- pnt += QPoint (mGeometry.x () - mBorder.left - mPadding.left,
|
|
- mGeometry.y () - mBorder.top - mPadding.top);
|
|
-
|
|
- mPopup->exec (pnt);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::showWindowMenu (const QRect &pos)
|
|
-{
|
|
- showWindowMenu (pos.bottomLeft ());
|
|
-}
|
|
-
|
|
-KWD::Options::MouseCommand
|
|
-KWD::Window::buttonToCommand (Qt::MouseButtons button)
|
|
-{
|
|
- Options::MouseCommand com = Options::MouseNothing;
|
|
- bool active = isActive ();
|
|
-
|
|
- if (!mSupportTakeFocus)
|
|
- active = true;
|
|
-
|
|
- switch (button) {
|
|
- case Qt::LeftButton:
|
|
- com = active ? Decorator::options ()->commandActiveTitlebar1 () :
|
|
- Decorator::options()->commandInactiveTitlebar1 ();
|
|
- break;
|
|
- case Qt::MidButton:
|
|
- com = active ? Decorator::options ()->commandActiveTitlebar2 () :
|
|
- Decorator::options()->commandInactiveTitlebar2 ();
|
|
- break;
|
|
- case Qt::RightButton:
|
|
- com = active ? Decorator::options ()->commandActiveTitlebar3 () :
|
|
- Decorator::options()->commandInactiveTitlebar3 ();
|
|
- default:
|
|
- break;
|
|
- }
|
|
-
|
|
- return com;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::processMousePressEvent (QMouseEvent *qme)
|
|
-{
|
|
- Options::MouseCommand com = buttonToCommand (qme->button ());
|
|
-
|
|
- if (qme->button () == Qt::LeftButton)
|
|
- {
|
|
- // actions where it's not possible to get the matching release event
|
|
- if (com != Options::MouseOperationsMenu &&
|
|
- com != Options::MouseMinimize)
|
|
- {
|
|
- moveWindow (qme);
|
|
- return;
|
|
- }
|
|
- }
|
|
-
|
|
- performMouseCommand (com, qme);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::performWindowOperation (WindowOperation wo)
|
|
-{
|
|
- switch (wo) {
|
|
- case KDecoration::MaximizeOp:
|
|
- maximize (maximizeMode () == KDecoration::MaximizeFull ?
|
|
- KDecoration::MaximizeRestore : KDecoration::MaximizeFull);
|
|
- break;
|
|
- case KDecoration::HMaximizeOp:
|
|
- maximize (maximizeMode () ^ KDecoration::MaximizeHorizontal);
|
|
- break;
|
|
- case KDecoration::VMaximizeOp:
|
|
- maximize (maximizeMode () ^ KDecoration::MaximizeVertical);
|
|
- break;
|
|
- case KDecoration::MinimizeOp:
|
|
- minimize ();
|
|
- break;
|
|
- case KDecoration::ShadeOp:
|
|
- setShade (!isShade ());
|
|
- break;
|
|
- case KDecoration::CloseOp:
|
|
- closeWindow ();
|
|
- break;
|
|
- case KDecoration::KeepAboveOp:
|
|
- setKeepAbove (!keepAbove ());
|
|
- break;
|
|
- case KDecoration::KeepBelowOp:
|
|
- setKeepBelow (!keepBelow ());
|
|
- break;
|
|
- case KDecoration::FullScreenOp:
|
|
- if (mState & NET::FullScreen)
|
|
- KWindowSystem::clearState (mClientId, NET::FullScreen);
|
|
- else
|
|
- KWindowSystem::setState (mClientId, NET::FullScreen);
|
|
- break;
|
|
- case KDecoration::MoveOp:
|
|
- Decorator::rootInfo ()->moveResizeRequest (mClientId,
|
|
- mGeometry.x () +
|
|
- mGeometry.width () / 2,
|
|
- mGeometry.y () +
|
|
- mGeometry.height () / 2,
|
|
- NET::KeyboardMove);
|
|
- break;
|
|
- case KDecoration::ResizeOp:
|
|
- Decorator::rootInfo ()->moveResizeRequest (mClientId,
|
|
- mGeometry.x () +
|
|
- mGeometry.width () / 2,
|
|
- mGeometry.y () +
|
|
- mGeometry.height () / 2,
|
|
- NET::KeyboardSize);
|
|
- default:
|
|
- break;
|
|
- }
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isPreview (void) const
|
|
-{
|
|
- return false;
|
|
-}
|
|
-
|
|
-QRect
|
|
-KWD::Window::geometry (void) const
|
|
-{
|
|
- QRect rect = mGeometry;
|
|
-
|
|
- return QRect (rect.x () - ROOT_OFF_X,
|
|
- rect.y () - ROOT_OFF_Y,
|
|
- rect.width (),
|
|
- rect.height ());
|
|
-}
|
|
-
|
|
-QRect
|
|
-KWD::Window::iconGeometry (void) const
|
|
-{
|
|
- return QRect ();
|
|
-}
|
|
-
|
|
-QRect
|
|
-KWD::Window::clientGeometry (void)
|
|
-{
|
|
- return mGeometry;
|
|
-
|
|
- QRect frame = geometry ();
|
|
-
|
|
- return QRect (frame.x () + mBorder.left,
|
|
- frame.y () + mBorder.top,
|
|
- frame.width () - mBorder.left - mBorder.right,
|
|
- frame.height () - mBorder.top - mBorder.bottom);
|
|
-}
|
|
-
|
|
-QRegion
|
|
-KWD::Window::unobscuredRegion (const QRegion & r) const
|
|
-{
|
|
- return r;
|
|
-}
|
|
-
|
|
-WId
|
|
-KWD::Window::windowId (void) const
|
|
-{
|
|
- return mClientId;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::closeWindow (void)
|
|
-{
|
|
- Decorator::rootInfo ()->closeWindowRequest (mClientId);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::maximize (MaximizeMode mode)
|
|
-{
|
|
- KWindowSystem::setState (mClientId,
|
|
- ((mode & MaximizeVertical) ? NET::MaxVert : 0) |
|
|
- ((mode & MaximizeHorizontal) ? NET::MaxHoriz : 0));
|
|
- KWindowSystem::clearState (mClientId,
|
|
- ((mode & MaximizeVertical) ? 0 : NET::MaxVert) |
|
|
- ((mode & MaximizeHorizontal) ? 0 : NET::MaxHoriz));
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::minimize (void)
|
|
-{
|
|
- KWindowSystem::minimizeWindow (mClientId, false);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::showContextHelp (void)
|
|
-{
|
|
- if (mSupportContextHelp)
|
|
- KWD::Decorator::sendClientMessage (mClientId, mClientId,
|
|
- Atoms::wmProtocols,
|
|
- Atoms::netWmContextHelp);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::titlebarDblClickOperation (void)
|
|
-{
|
|
- WindowOperation op;
|
|
-
|
|
- op = KWD::Decorator::options ()->operationTitlebarDblClick ();
|
|
- performWindowOperation (op);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::setDesktop (int desktop)
|
|
-{
|
|
- KWindowSystem::setOnDesktop (mClientId, desktop);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::setKeepBelow (bool set)
|
|
-{
|
|
- if (set)
|
|
- {
|
|
- KWindowSystem::clearState (mClientId, NET::KeepAbove);
|
|
- KWindowSystem::setState (mClientId, NET::KeepBelow);
|
|
- }
|
|
- else
|
|
- {
|
|
- KWindowSystem::clearState (mClientId, NET::KeepBelow);
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::setKeepAbove (bool set)
|
|
-{
|
|
- if (set)
|
|
- {
|
|
- KWindowSystem::clearState (mClientId, NET::KeepBelow);
|
|
- KWindowSystem::setState (mClientId, NET::KeepAbove);
|
|
- }
|
|
- else
|
|
- {
|
|
- KWindowSystem::clearState (mClientId, NET::KeepAbove);
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::setShade (bool set)
|
|
-{
|
|
- if (set)
|
|
- KWindowSystem::setState (mClientId, NET::Shaded);
|
|
- else
|
|
- KWindowSystem::clearState (mClientId, NET::Shaded);
|
|
-
|
|
- mDecor->shadeChange ();
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::titlebarMouseWheelOperation (int delta)
|
|
-{
|
|
- Options::MouseCommand com;
|
|
-
|
|
- com = Decorator::options()->operationTitlebarMouseWheel (delta);
|
|
- performMouseCommand (com, 0);
|
|
-}
|
|
-
|
|
-int
|
|
-KWD::Window::currentDesktop (void) const
|
|
-{
|
|
- return KWindowSystem::currentDesktop ();
|
|
-}
|
|
-
|
|
-QWidget *
|
|
-KWD::Window::initialParentWidget (void) const
|
|
-{
|
|
- return 0;
|
|
-}
|
|
-
|
|
-Qt::WFlags
|
|
-KWD::Window::initialWFlags (void) const
|
|
-{
|
|
- return 0;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::grabXServer (bool)
|
|
-{
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::compositingActive (void) const
|
|
-{
|
|
- return true;
|
|
-}
|
|
-
|
|
-#if KDE_IS_VERSION(4,3,90)
|
|
-
|
|
-QRect
|
|
-KWD::Window::transparentRect () const
|
|
-{
|
|
- return QRect ();
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::isClientGroupActive ()
|
|
-{
|
|
- return false;
|
|
-}
|
|
-
|
|
-QList<ClientGroupItem>
|
|
-KWD::Window::clientGroupItems () const
|
|
-{
|
|
- QList<ClientGroupItem> items;
|
|
-
|
|
- QIcon icon (mIcon);
|
|
- icon.addPixmap (mMiniIcon);
|
|
-
|
|
- items.append (ClientGroupItem (mName, icon));
|
|
-
|
|
- return items;
|
|
-}
|
|
-
|
|
-long
|
|
-KWD::Window::itemId (int index)
|
|
-{
|
|
- return (long) mClientId;
|
|
-}
|
|
-
|
|
-int
|
|
-KWD::Window::visibleClientGroupItem ()
|
|
-{
|
|
- return 0;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::setVisibleClientGroupItem (int index)
|
|
-{
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::moveItemInClientGroup (int index, int before)
|
|
-{
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::moveItemToClientGroup (long itemId, int before)
|
|
-{
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::removeFromClientGroup (int index, const QRect& newGeom)
|
|
-{
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::closeClientGroupItem (int index)
|
|
-{
|
|
- closeWindow ();
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::closeAllInClientGroup ()
|
|
-{
|
|
- closeWindow ();
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::displayClientMenu (int index, const QPoint& pos)
|
|
-{
|
|
- showWindowMenu (pos);
|
|
-}
|
|
-
|
|
-KDecorationDefines::WindowOperation
|
|
-KWD::Window::buttonToWindowOperation(Qt::MouseButtons button)
|
|
-{
|
|
- Options::MouseCommand com = buttonToCommand (button);
|
|
-
|
|
- if (com == Options::MouseOperationsMenu)
|
|
- return KDecorationDefines::OperationsOp;
|
|
-
|
|
- return KDecorationDefines::NoOp;
|
|
-}
|
|
-
|
|
-#endif
|
|
-
|
|
-void
|
|
-KWD::Window::createDecoration (void)
|
|
-{
|
|
- KDecoration *decor;
|
|
-
|
|
- if (mDecor)
|
|
- return;
|
|
-
|
|
- decor = Decorator::pluginManager ()->createDecoration (this);
|
|
- decor->init ();
|
|
-
|
|
- mDecor = decor;
|
|
-
|
|
- mDecor->widget ()->installEventFilter (this);
|
|
-
|
|
- mPaintRedirector = new KWin::PaintRedirector (mDecor->widget ());
|
|
- connect (mPaintRedirector, SIGNAL (paintPending()),
|
|
- this, SLOT (decorRepaintPending ()));
|
|
-
|
|
- mPadding.top = mPadding.bottom = mPadding.left = mPadding.right = 0;
|
|
-
|
|
- if (KDecorationUnstable *deco2 = dynamic_cast<KDecorationUnstable*>(decor))
|
|
- deco2->padding (mPadding.left, mPadding.right, mPadding.top, mPadding.bottom);
|
|
-
|
|
- XReparentWindow (QX11Info::display(), mDecor->widget ()->winId (), mParentId, 0, 0);
|
|
-
|
|
- //decor->widget()->move(-mPadding.left, -mPadding.top);
|
|
-
|
|
- if (mType == Normal && mFrame)
|
|
- {
|
|
- KWD::trapXError ();
|
|
- XSelectInput (QX11Info::display(), mFrame,
|
|
- StructureNotifyMask | PropertyChangeMask |
|
|
- ButtonPressMask | ButtonReleaseMask | PointerMotionMask |
|
|
- EnterWindowMask | LeaveWindowMask);
|
|
- if (KWD::popXError ())
|
|
- return;
|
|
- }
|
|
-
|
|
- resizeDecoration (true);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::setMask (const QRegion ®ion, int)
|
|
-{
|
|
- if (region.isEmpty ())
|
|
- {
|
|
- mShapeSet = false;
|
|
- return;
|
|
- }
|
|
-
|
|
- if (mShapeSet && region == mShape)
|
|
- return;
|
|
-
|
|
- mShape = region;
|
|
- mShapeSet = true;
|
|
-
|
|
- if (mFrame)
|
|
- {
|
|
- QRegion r = region.translated (-mPadding.left, -mPadding.top);
|
|
-
|
|
- r -= QRegion (mBorder.left, mBorder.top,
|
|
- mGeometry.width (), mGeometry.height ());
|
|
-
|
|
- KWD::trapXError ();
|
|
- XShapeCombineRegion (QX11Info::display(),
|
|
- mFrame,
|
|
- ShapeInput,
|
|
- 0,
|
|
- 0,
|
|
- r.handle (),
|
|
- ShapeSet);
|
|
- KWD::popXError ();
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::resizeDecoration (bool force)
|
|
-{
|
|
- int w, h;
|
|
-
|
|
- mDecor->borders (mBorder.left, mBorder.right, mBorder.top, mBorder.bottom);
|
|
-
|
|
- mExtents.left = mBorder.left + mPadding.left;
|
|
- mExtents.right = mBorder.right + mPadding.right;
|
|
- mExtents.top = mBorder.top + mPadding.top;
|
|
- mExtents.bottom = mBorder.bottom + mPadding.bottom;
|
|
-
|
|
- if (mType != Normal)
|
|
- {
|
|
- mGeometry = QRect (50, 50, 100, 100);
|
|
- }
|
|
-
|
|
- w = mGeometry.width () + mExtents.left + mExtents.right;
|
|
- h = mGeometry.height () + mExtents.top + mExtents.bottom;
|
|
-
|
|
- if (!force)
|
|
- {
|
|
- if (w == decorWidget ()->width () && h == decorWidget ()->height ())
|
|
- return;
|
|
- }
|
|
-
|
|
- /* reset shape */
|
|
- mShapeSet = false;
|
|
-
|
|
- if (mPixmap)
|
|
- {
|
|
- XFreePixmap (QX11Info::display(), mPixmap);
|
|
- mPixmap = None;
|
|
- }
|
|
-
|
|
- mDecor->resize (QSize (w, h));
|
|
- mDecor->widget ()->show ();
|
|
- mDecor->widget ()->update ();
|
|
-
|
|
- mPixmap = XCreatePixmap (QX11Info::display(),
|
|
- QX11Info::appRootWindow (),
|
|
- qMax (w, mGeometry.height ()),
|
|
- mExtents.top + mExtents.bottom +
|
|
- mExtents.left + mExtents.right, 32);
|
|
-
|
|
- mPixmapQt = QPixmap::fromX11Pixmap (mPixmap, QPixmap::ExplicitlyShared);
|
|
-
|
|
- mPixmapQt.fill (Qt::transparent);
|
|
-
|
|
- mUpdateProperty = true;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::updateBlurProperty (int topOffset,
|
|
- int bottomOffset,
|
|
- int leftOffset,
|
|
- int rightOffset)
|
|
-{
|
|
- Atom atom = Atoms::compizWindowBlurDecor;
|
|
- QRegion topQRegion, bottomQRegion, leftQRegion, rightQRegion;
|
|
- Region topRegion = NULL;
|
|
- Region bottomRegion = NULL;
|
|
- Region leftRegion = NULL;
|
|
- Region rightRegion = NULL;
|
|
- int size = 0;
|
|
- int w, h;
|
|
-
|
|
- w = mGeometry.width () + mBorder.left + mBorder.right;
|
|
- h = mGeometry.height () + mBorder.top + mBorder.bottom;
|
|
-
|
|
- if (blurType != BLUR_TYPE_NONE)
|
|
- {
|
|
- QRegion r, shape = QRegion (0, 0, w, h);
|
|
-
|
|
- if (mShapeSet)
|
|
- shape = mShape.translated (-mPadding.left, -mPadding.top);
|
|
-
|
|
- r = QRegion (0, 0, w, mBorder.top);
|
|
- topQRegion = r.intersect (shape);
|
|
- if (!topQRegion.isEmpty ())
|
|
- {
|
|
- topQRegion.translate (-mBorder.left,
|
|
- -mBorder.top);
|
|
- topRegion = topQRegion.handle ();
|
|
- }
|
|
-
|
|
- if (blurType == BLUR_TYPE_ALL)
|
|
- {
|
|
- r = QRegion (0, h - mBorder.bottom,
|
|
- w, mBorder.bottom);
|
|
- bottomQRegion = r.intersect (shape);
|
|
- if (!bottomQRegion.isEmpty ())
|
|
- {
|
|
- bottomQRegion.translate (-mBorder.left,
|
|
- -(h - mBorder.bottom));
|
|
- bottomRegion = bottomQRegion.handle ();
|
|
- }
|
|
-
|
|
- r = QRegion (0, mBorder.top,
|
|
- mBorder.left, mGeometry.height ());
|
|
- leftQRegion = r.intersect (shape);
|
|
- if (!leftQRegion.isEmpty ())
|
|
- {
|
|
- leftQRegion.translate (-mBorder.left,
|
|
- -mBorder.top);
|
|
- leftRegion = leftQRegion.handle ();
|
|
- }
|
|
-
|
|
- r = QRegion (w - mBorder.right, mBorder.top,
|
|
- mBorder.right, mGeometry.height ());
|
|
- rightQRegion = r.intersect (shape);
|
|
- if (!rightQRegion.isEmpty ())
|
|
- {
|
|
- rightQRegion.translate (-(w - mBorder.right),
|
|
- -mBorder.top);
|
|
- rightRegion = rightQRegion.handle ();
|
|
- }
|
|
- }
|
|
- }
|
|
-
|
|
- if (topRegion)
|
|
- size += topRegion->numRects;
|
|
- if (bottomRegion)
|
|
- size += bottomRegion->numRects;
|
|
- if (leftRegion)
|
|
- size += leftRegion->numRects;
|
|
- if (rightRegion)
|
|
- size += rightRegion->numRects;
|
|
-
|
|
- if (size)
|
|
- {
|
|
- long data[size * 6 + 2];
|
|
-
|
|
- decor_region_to_blur_property (data, 4, 0,
|
|
- mGeometry.width (),
|
|
- mGeometry.height (),
|
|
- topRegion, topOffset,
|
|
- bottomRegion, bottomOffset,
|
|
- leftRegion, leftOffset,
|
|
- rightRegion, rightOffset);
|
|
-
|
|
- KWD::trapXError ();
|
|
- XChangeProperty (QX11Info::display(), mClientId, atom,
|
|
- XA_INTEGER,
|
|
- 32, PropModeReplace, (unsigned char *) data,
|
|
- 2 + size * 6);
|
|
- KWD::popXError ();
|
|
- }
|
|
- else
|
|
- {
|
|
- KWD::trapXError ();
|
|
- XDeleteProperty (QX11Info::display(), mClientId, atom);
|
|
- KWD::popXError ();
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::updateProperty (void)
|
|
-{
|
|
- Atom atom = Atoms::netWindowDecor;
|
|
- decor_extents_t maxExtents;
|
|
- long data[256];
|
|
- decor_quad_t quads[N_QUADS_MAX];
|
|
- int nQuad = 0;
|
|
- int left, right, top, bottom, width, height;
|
|
- unsigned int saveState;
|
|
-
|
|
- if (mType == Default)
|
|
- atom = Atoms::netWindowDecorNormal;
|
|
- else if (mType == DefaultActive)
|
|
- atom = Atoms::netWindowDecorActive;
|
|
-
|
|
- saveState = mState;
|
|
- mState = NET::MaxVert | NET::MaxHoriz;
|
|
- mDecor->borders (maxExtents.left, maxExtents.right,
|
|
- maxExtents.top, maxExtents.bottom);
|
|
- mState = saveState;
|
|
- mDecor->borders (mBorder.left, mBorder.right, mBorder.top, mBorder.bottom);
|
|
-
|
|
- left = mExtents.left;
|
|
- right = mExtents.right;
|
|
- top = mExtents.top;
|
|
- bottom = mExtents.bottom;
|
|
- width = mGeometry.width ();
|
|
- height = mGeometry.height ();
|
|
-
|
|
- if (mType == Normal)
|
|
- {
|
|
- decor_quad_t *q = quads;
|
|
- int n = 0;
|
|
-
|
|
- int topXOffset = width;
|
|
- QWidget *widget = mDecor->widget ();
|
|
- int x;
|
|
-
|
|
- if (widget)
|
|
- {
|
|
- const QList<QObject*> children = widget->children ();
|
|
-
|
|
- foreach (QObject *obj, children)
|
|
- {
|
|
- QWidget *child;
|
|
-
|
|
- if (!obj->isWidgetType ())
|
|
- continue;
|
|
-
|
|
- child = static_cast <QWidget *> (obj);
|
|
-
|
|
- x = child->x () - mExtents.left - 2;
|
|
- if (x > width / 2 && x < topXOffset)
|
|
- topXOffset = x;
|
|
- }
|
|
- }
|
|
-
|
|
- // top quads
|
|
- n = decor_set_horz_quad_line (q, left, topXOffset, right,
|
|
- width - topXOffset - 1, -top, 0, GRAVITY_NORTH,
|
|
- left + right + width, -(width - topXOffset - 1),
|
|
- GRAVITY_EAST, 0, 0);
|
|
-
|
|
- q += n; nQuad += n;
|
|
-
|
|
- // bottom quads
|
|
- n = decor_set_horz_quad_line (q, left, width / 2, right, (width / 2) - 1, 0,
|
|
- bottom, GRAVITY_SOUTH, left + right + width,
|
|
- -((width / 2) - 1), GRAVITY_EAST, 0, top);
|
|
-
|
|
- q += n; nQuad += n;
|
|
-
|
|
- // left quads
|
|
- n = decor_set_vert_quad_row (q, 0, height / 2, 0, (height / 2) - 1, -left, 0,
|
|
- GRAVITY_WEST, height, -((height / 2) - 1),
|
|
- GRAVITY_SOUTH, 0, top + bottom, 1);
|
|
-
|
|
- q += n; nQuad += n;
|
|
-
|
|
- // right quads
|
|
- n = decor_set_vert_quad_row (q, 0, height / 2, 0, (height / 2) - 1, 0, right,
|
|
- GRAVITY_EAST, height, -((height / 2) - 1),
|
|
- GRAVITY_SOUTH, 0, top + bottom + left, 1);
|
|
-
|
|
- q += n; nQuad += n;
|
|
-
|
|
- updateBlurProperty (topXOffset, width / 2, height / 2, height / 2);
|
|
- }
|
|
- else
|
|
- {
|
|
- decor_quad_t *q = quads;
|
|
- int n = 0;
|
|
-
|
|
- // top
|
|
- n = decor_set_horz_quad_line (q, left, 0, right, 0, -top, 0,
|
|
- GRAVITY_NORTH, left + right + width,
|
|
- width / 2, 0, 0, 0);
|
|
-
|
|
- q += n; nQuad += n;
|
|
-
|
|
- // bottom
|
|
- n = decor_set_horz_quad_line (q, left, 0, right, 0, 0, bottom,
|
|
- GRAVITY_SOUTH, left + right + width,
|
|
- width / 2, 0, 0, top);
|
|
-
|
|
- q += n; nQuad += n;
|
|
-
|
|
- // left
|
|
- n = decor_set_vert_quad_row (q, 0, 0, 0, 0, -left, 0, GRAVITY_WEST,
|
|
- height, height / 2, 0, 0, top + bottom, 1);
|
|
-
|
|
- q += n; nQuad += n;
|
|
-
|
|
- // right
|
|
- n = decor_set_vert_quad_row (q, 0, 0, 0, 0, 0, right, GRAVITY_EAST,
|
|
- height, height / 2, 0, 0, top + bottom + left, 1);
|
|
-
|
|
- q += n; nQuad += n;
|
|
- }
|
|
-
|
|
- decor_quads_to_property (data, mPixmap,
|
|
- &mBorder, &maxExtents,
|
|
- 1, 0,
|
|
- quads, nQuad);
|
|
-
|
|
- KWD::trapXError ();
|
|
- XChangeProperty (QX11Info::display(), mClientId, atom,
|
|
- XA_INTEGER,
|
|
- 32, PropModeReplace, (unsigned char *) data,
|
|
- BASE_PROP_SIZE + QUAD_PROP_SIZE * nQuad);
|
|
- KWD::popXError ();
|
|
-
|
|
- mUpdateProperty = false;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::handleActiveChange (void)
|
|
-{
|
|
- mDecor->activeChange ();
|
|
- resizeDecoration ();
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::updateFrame (WId frame)
|
|
-{
|
|
- mFrame = frame;
|
|
-
|
|
- KWD::trapXError ();
|
|
- XSelectInput (QX11Info::display(), mFrame,
|
|
- StructureNotifyMask | PropertyChangeMask |
|
|
- ButtonPressMask | ButtonReleaseMask | PointerMotionMask |
|
|
- EnterWindowMask | LeaveWindowMask);
|
|
- KWD::popXError ();
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::updateSelected (WId selectedId)
|
|
-{
|
|
- mSelectedId = selectedId;
|
|
-
|
|
- updateName ();
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::updateWindowGeometry (void)
|
|
-{
|
|
- KWD::trapXError ();
|
|
- KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMGeometry);
|
|
- KWD::popXError ();
|
|
-
|
|
- if (!wInfo.valid ())
|
|
- return;
|
|
-
|
|
- QRect geometry = wInfo.geometry ();
|
|
- int w, h;
|
|
-
|
|
- w = mGeometry.width () + mBorder.left + mBorder.right;
|
|
- h = mGeometry.height () + mBorder.top + mBorder.bottom;
|
|
-
|
|
- if (mGeometry.width () != geometry.width () ||
|
|
- mGeometry.height () != geometry.height ())
|
|
- {
|
|
- mGeometry = geometry;
|
|
- resizeDecoration ();
|
|
- }
|
|
- else if (mGeometry.x () != geometry.x () ||
|
|
- mGeometry.y () != geometry.y ())
|
|
- {
|
|
- mGeometry = geometry;
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::reloadDecoration (void)
|
|
-{
|
|
- delete mDecor;
|
|
- mDecor = 0;
|
|
-
|
|
- delete mPaintRedirector;
|
|
- mPaintRedirector = 0;
|
|
-
|
|
- mShapeSet = false;
|
|
-
|
|
- createDecoration ();
|
|
-}
|
|
-
|
|
-Cursor
|
|
-KWD::Window::positionToCursor (QPoint pos)
|
|
-{
|
|
- switch (mDecor->mousePosition (pos + QPoint (mPadding.left, mPadding.top))) {
|
|
- case PositionCenter:
|
|
- return cursors[1][1].cursor;
|
|
- case PositionLeft:
|
|
- return cursors[1][0].cursor;
|
|
- case PositionRight:
|
|
- return cursors[1][2].cursor;
|
|
- case PositionTop:
|
|
- return cursors[0][1].cursor;
|
|
- case PositionBottom:
|
|
- return cursors[2][1].cursor;
|
|
- case PositionTopLeft:
|
|
- return cursors[0][0].cursor;
|
|
- case PositionTopRight:
|
|
- return cursors[0][2].cursor;
|
|
- case PositionBottomLeft:
|
|
- return cursors[2][0].cursor;
|
|
- case PositionBottomRight:
|
|
- return cursors[2][2].cursor;
|
|
- default:
|
|
- break;
|
|
- }
|
|
-
|
|
- return cursors[1][1].cursor;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::updateCursor (QPoint pos)
|
|
-{
|
|
- KWD::trapXError ();
|
|
- XDefineCursor (QX11Info::display(), mFrame, positionToCursor (pos));
|
|
- KWD::popXError ();
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::getWindowProtocols (void)
|
|
-{
|
|
- Atom *p;
|
|
- int n;
|
|
- int status;
|
|
-
|
|
- mSupportTakeFocus = false;
|
|
- mSupportContextHelp = false;
|
|
-
|
|
- KWD::trapXError ();
|
|
- status = XGetWMProtocols (QX11Info::display(), mClientId, &p, &n);
|
|
- if (KWD::popXError ())
|
|
- return;
|
|
-
|
|
- if (status)
|
|
- {
|
|
- int i;
|
|
-
|
|
- for (i = 0; i < n; i++)
|
|
- {
|
|
- if (p[i] == Atoms::wmTakeFocus)
|
|
- mSupportTakeFocus = true;
|
|
- else if (p[i] == Atoms::netWmContextHelp)
|
|
- mSupportContextHelp = true;
|
|
- }
|
|
-
|
|
- if (n > 0)
|
|
- XFree (p);
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::handlePopupActivated (QAction * action)
|
|
-{
|
|
- WindowOperation op = static_cast <WindowOperation> (action->data().toInt());
|
|
-
|
|
- performWindowOperation (op);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::handleOpacityPopupActivated (QAction *action)
|
|
-{
|
|
- int op = action->data().toInt();
|
|
-
|
|
- op = op * 0xffff / 100;
|
|
-
|
|
- if (op != mOpacity)
|
|
- Decorator::sendClientMessage (QX11Info::appRootWindow(), mClientId,
|
|
- Atoms::netWmWindowOpacity,
|
|
- (op << 16) | op);
|
|
-}
|
|
-
|
|
-
|
|
-void
|
|
-KWD::Window::handleDesktopPopupActivated (QAction *action)
|
|
-{
|
|
-
|
|
- if (action->data().toInt())
|
|
- setDesktop (action->data().toInt());
|
|
- else
|
|
- KWindowSystem::setOnAllDesktops (mClientId, true);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::handlePopupAboutToShow (void)
|
|
-{
|
|
- int numberOfDesktops;
|
|
-
|
|
- numberOfDesktops = KWindowSystem::numberOfDesktops ();
|
|
- if (numberOfDesktops > 1)
|
|
- {
|
|
- NETRootInfo *rootInfo = Decorator::rootInfo ();
|
|
- QString name;
|
|
- int i;
|
|
- int winDesktop = desktop ();
|
|
- QAction *action;
|
|
- const int BASE = 10;
|
|
-
|
|
- mDesktopMenu->clear ();
|
|
-
|
|
- action = mDesktopMenu->addAction (i18n ("&All Desktops"));
|
|
- action->setData (0);
|
|
- action->setCheckable (true);
|
|
-
|
|
-
|
|
- action->setChecked (winDesktop == NET::OnAllDesktops);
|
|
- mDesktopMenu->addSeparator ();
|
|
-
|
|
- for (i = 1; i <= numberOfDesktops; i++)
|
|
- {
|
|
- QString basic_name ("%1 %2");
|
|
- if (i < BASE)
|
|
- basic_name.prepend ('&');
|
|
-
|
|
- basic_name = basic_name.arg (i).arg (
|
|
- QString (rootInfo->desktopName (i)).replace
|
|
- ('&', "&&"));
|
|
-
|
|
- action = mDesktopMenu->addAction (basic_name);
|
|
- action->setData (i);
|
|
- action->setCheckable (true);
|
|
- action->setChecked (winDesktop == i);
|
|
- }
|
|
-
|
|
- mDesktopOpAction->setVisible (true);
|
|
- }
|
|
- else
|
|
- {
|
|
- mDesktopOpAction->setVisible (false);
|
|
- }
|
|
-
|
|
- mResizeOpAction->setEnabled (isResizable ());
|
|
- mMoveOpAction->setEnabled (isMovable ());
|
|
-
|
|
- mMaximizeOpAction->setEnabled (isMaximizable ());
|
|
- mMaximizeOpAction->setChecked (maximizeMode () == MaximizeFull);
|
|
-
|
|
- mShadeOpAction->setChecked (isShade ());
|
|
- mShadeOpAction->setEnabled (isShadeable ());
|
|
-
|
|
- mKeepAboveOpAction->setChecked (keepAbove ());
|
|
- mKeepBelowOpAction->setChecked (keepBelow ());
|
|
- mFullScreenOpAction->setChecked (mState & NET::FullScreen);
|
|
-
|
|
- mMinimizeOpAction->setEnabled (isMinimizable ());
|
|
- mCloseOpAction->setEnabled (isCloseable ());
|
|
-
|
|
- foreach (QAction* action, mOpacityMenu->actions ())
|
|
- {
|
|
- if(action->data ().toInt () ==
|
|
- qRound ((float)mOpacity * 100.0 / 0xffff))
|
|
- action->setChecked( true );
|
|
- else
|
|
- action->setChecked( false );
|
|
- }
|
|
-
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::updateState (void)
|
|
-{
|
|
- KWindowInfo wInfo = KWindowSystem::windowInfo (mClientId, NET::WMState, 0);
|
|
-
|
|
- unsigned long newState = wInfo.state ();
|
|
- unsigned long stateChange = mState ^ newState;
|
|
-
|
|
- mState = newState;
|
|
-
|
|
- if (stateChange & NET::Max)
|
|
- {
|
|
- mDecor->maximizeChange ();
|
|
- resizeDecoration (false);
|
|
- }
|
|
-
|
|
- if (stateChange & NET::KeepAbove && !(mState & NET::KeepAbove))
|
|
- mDecor->emitKeepAboveChanged (mState & NET::KeepAbove);
|
|
- if (stateChange & NET::KeepBelow && !(mState & NET::KeepBelow))
|
|
- mDecor->emitKeepBelowChanged (mState & NET::KeepBelow);
|
|
- if (stateChange & NET::KeepAbove && mState & NET::KeepAbove)
|
|
- mDecor->emitKeepAboveChanged (mState & NET::KeepAbove);
|
|
- if (stateChange & NET::KeepBelow && mState & NET::KeepBelow)
|
|
- mDecor->emitKeepBelowChanged (mState & NET::KeepBelow);
|
|
- if (stateChange & NET::Shaded)
|
|
- mDecor->shadeChange ();
|
|
- if (stateChange & NET::Sticky)
|
|
- mDecor->desktopChange ();
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::updateName (void)
|
|
-{
|
|
- KWindowInfo wInfo;
|
|
-
|
|
- wInfo = KWindowSystem::windowInfo (mClientId, NET::WMVisibleName, 0);
|
|
-
|
|
- mName = wInfo.visibleName ();
|
|
-
|
|
- mDecor->captionChange ();
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::updateIcons (void)
|
|
-{
|
|
- mIcon = KWindowSystem::icon (mClientId, 32, 32, true,
|
|
- KWindowSystem::NETWM |
|
|
- KWindowSystem::WMHints);
|
|
-
|
|
- mMiniIcon = KWindowSystem::icon (mClientId, 16, 16, true,
|
|
- KWindowSystem::NETWM |
|
|
- KWindowSystem::WMHints);
|
|
-
|
|
- if (mIcon.isNull ())
|
|
- {
|
|
- mIcon = KWindowSystem::icon (mClientId, 32, 32, true,
|
|
- KWindowSystem::ClassHint |
|
|
- KWindowSystem::XApp );
|
|
- mMiniIcon = KWindowSystem::icon (mClientId, 16, 16, true,
|
|
- KWindowSystem::ClassHint |
|
|
- KWindowSystem::XApp );
|
|
- }
|
|
-
|
|
- mDecor->iconChange ();
|
|
-}
|
|
-
|
|
-NET::Direction
|
|
-KWD::Window::positionToDirection (int pos)
|
|
-{
|
|
- switch (pos) {
|
|
- case PositionLeft:
|
|
- return NET::Left;
|
|
- case PositionRight:
|
|
- return NET::Right;
|
|
- case PositionTop:
|
|
- return NET::Top;
|
|
- case PositionBottom:
|
|
- return NET::Bottom;
|
|
- case PositionTopLeft:
|
|
- return NET::TopLeft;
|
|
- case PositionTopRight:
|
|
- return NET::TopRight;
|
|
- case PositionBottomLeft:
|
|
- return NET::BottomLeft;
|
|
- case PositionBottomRight:
|
|
- return NET::BottomRight;
|
|
- default:
|
|
- break;
|
|
- }
|
|
-
|
|
- return NET::Move;
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::moveWindow (QMouseEvent *qme)
|
|
-{
|
|
- NET::Direction direction;
|
|
-
|
|
- direction = positionToDirection (mDecor->mousePosition (qme->pos ()));
|
|
-
|
|
- QPoint p (mGeometry.x () - mExtents.left, mGeometry.y () - mExtents.top);
|
|
- p += qme->pos ();
|
|
-
|
|
- XUngrabPointer (QX11Info::display(), CurrentTime);
|
|
- XUngrabKeyboard (QX11Info::display(), CurrentTime);
|
|
-
|
|
- Decorator::rootInfo ()->restackRequest (mClientId, NET::FromApplication,
|
|
- None, Above,
|
|
- QX11Info::appTime());
|
|
-
|
|
- Decorator::rootInfo ()->moveResizeRequest (mClientId,
|
|
- p.x (),
|
|
- p.y (),
|
|
- direction);
|
|
- mFakeRelease = true;
|
|
-
|
|
-}
|
|
-
|
|
-#define OPACITY_STEP (0xffff / 10)
|
|
-
|
|
-void
|
|
-KWD::Window::performMouseCommand (Options::MouseCommand command,
|
|
- QMouseEvent *qme)
|
|
-{
|
|
- switch (command) {
|
|
- case Options::MouseRaise:
|
|
- KWindowSystem::raiseWindow (mClientId);
|
|
- break;
|
|
- case Options::MouseLower:
|
|
- KWindowSystem::lowerWindow (mClientId);
|
|
- break;
|
|
- case Options::MouseShade :
|
|
- setShade (!isShade ());
|
|
- break;
|
|
- case Options::MouseSetShade:
|
|
- setShade (true);
|
|
- break;
|
|
- case Options::MouseUnsetShade:
|
|
- setShade (false);
|
|
- break;
|
|
- case Options::MouseOperationsMenu:
|
|
- showWindowMenu (mDecor->widget ()->mapToGlobal (qme->pos ()));
|
|
- break;
|
|
- case Options::MouseMaximize:
|
|
- maximize (KDecoration::MaximizeFull);
|
|
- break;
|
|
- case Options::MouseRestore:
|
|
- maximize (KDecoration::MaximizeRestore);
|
|
- break;
|
|
- case Options::MouseMinimize:
|
|
- minimize ();
|
|
- break;
|
|
- case Options::MouseAbove:
|
|
- if (keepBelow ())
|
|
- setKeepBelow (false);
|
|
- else
|
|
- setKeepAbove (true);
|
|
- break;
|
|
- case Options::MouseBelow:
|
|
- if (keepAbove ())
|
|
- setKeepAbove (false);
|
|
- else
|
|
- setKeepBelow (true);
|
|
- break;
|
|
- case Options::MousePreviousDesktop:
|
|
- break;
|
|
- case Options::MouseNextDesktop:
|
|
- break;
|
|
- case Options::MouseOpacityMore:
|
|
- {
|
|
- int opacity = mOpacity;
|
|
-
|
|
- if (opacity < 0xffff)
|
|
- {
|
|
- opacity += OPACITY_STEP;
|
|
- if (opacity > 0xffff)
|
|
- opacity = 0xffff;
|
|
-
|
|
- Decorator::sendClientMessage (QX11Info::appRootWindow(),
|
|
- mClientId,
|
|
- Atoms::netWmWindowOpacity,
|
|
- (opacity << 16) | opacity);
|
|
- }
|
|
- } break;
|
|
- case Options::MouseOpacityLess:
|
|
- {
|
|
- int opacity = mOpacity;
|
|
-
|
|
- if (opacity > OPACITY_STEP)
|
|
- {
|
|
- opacity -= OPACITY_STEP;
|
|
- if (opacity < OPACITY_STEP)
|
|
- opacity = OPACITY_STEP;
|
|
-
|
|
- Decorator::sendClientMessage (QX11Info::appRootWindow(),
|
|
- mClientId,
|
|
- Atoms::netWmWindowOpacity,
|
|
- (opacity << 16) | opacity);
|
|
- }
|
|
- } break;
|
|
- case Options::MouseActivateRaiseAndMove:
|
|
- case Options::MouseActivateRaiseAndUnrestrictedMove:
|
|
- case Options::MouseMove:
|
|
- case Options::MouseUnrestrictedMove:
|
|
- case Options::MouseResize:
|
|
- case Options::MouseUnrestrictedResize:
|
|
- if (qme)
|
|
- moveWindow (qme);
|
|
- case Options::MouseNothing:
|
|
- default:
|
|
- break;
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::showKillProcessDialog (Time timestamp)
|
|
-{
|
|
- KWindowInfo kWinInfo =
|
|
- KWindowSystem::windowInfo (mClientId, 0, NET::WM2WindowClass |
|
|
- NET::WM2ClientMachine);
|
|
- NETWinInfo wInfo = NETWinInfo (QX11Info::display(), mClientId,
|
|
- QX11Info::appRootWindow(), NET::WMPid);
|
|
- QByteArray clientMachine, resourceClass;
|
|
- pid_t pid;
|
|
- char buf[257];
|
|
-
|
|
- if (mProcessKiller.state () == QProcess::Running)
|
|
- return;
|
|
-
|
|
- clientMachine = kWinInfo.clientMachine ();
|
|
- resourceClass = kWinInfo.windowClassClass ();
|
|
- pid = wInfo.pid ();
|
|
-
|
|
- if (gethostname (buf, sizeof (buf) - 1) == 0)
|
|
- {
|
|
- if (strcmp (buf, clientMachine) == 0)
|
|
- clientMachine = "localhost";
|
|
- }
|
|
-
|
|
- mProcessKiller.start (KStandardDirs::findExe ("kwin_killer_helper"),
|
|
- QStringList () << "--pid" << QByteArray ().setNum (pid) <<
|
|
- "--hostname" << clientMachine <<
|
|
- "--windowname" << mName.toUtf8 () <<
|
|
- "--applicationname" << resourceClass <<
|
|
- "--wid" << QByteArray ().setNum ((unsigned int) mClientId) <<
|
|
- "--timestamp" << QByteArray ().setNum ((unsigned int) timestamp),
|
|
- QIODevice::NotOpen);
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::hideKillProcessDialog (void)
|
|
-{
|
|
- if (mProcessKiller.state () == QProcess::Running)
|
|
- {
|
|
- mProcessKiller.terminate ();
|
|
- }
|
|
-}
|
|
-
|
|
-void
|
|
-KWD::Window::decorRepaintPending ()
|
|
-{
|
|
- if (!mPaintRedirector || !mPixmap)
|
|
- return;
|
|
-
|
|
- QRegion reg = mPaintRedirector->pendingRegion();
|
|
- if (reg.isEmpty())
|
|
- return;
|
|
-
|
|
- QRect bBox = reg.boundingRect();
|
|
-
|
|
- if (mShapeSet)
|
|
- reg &= mShape;
|
|
-
|
|
- int l = mExtents.left;
|
|
- int r = mExtents.right;
|
|
- int t = mExtents.top;
|
|
- int b = mExtents.bottom;
|
|
- int w = mGeometry.width ();
|
|
- int h = mGeometry.height ();
|
|
-
|
|
- QRect top = QRect (0, 0, w + l + r, t);
|
|
- QRect bottom = QRect (0, t + h, w + l + r, b);
|
|
- QRect left = QRect (0, t, l, h);
|
|
- QRect right = QRect (l + w, t, r, h);
|
|
-
|
|
- QRegion rtop = reg & top;
|
|
- QRegion rbottom = reg & bottom;
|
|
- QRegion rleft = reg & left;
|
|
- QRegion rright = reg & right;
|
|
-
|
|
- QPixmap p = mPaintRedirector->performPendingPaint();
|
|
-
|
|
- QPainter pt (&mPixmapQt);
|
|
- pt.setCompositionMode( QPainter::CompositionMode_Source );
|
|
-
|
|
- QRect bb, pb;
|
|
-
|
|
- // Top
|
|
- if (!rtop.isEmpty ())
|
|
- {
|
|
- bb = rtop.boundingRect();
|
|
- pb = bb;
|
|
- pb.moveTo (bb.topLeft () - bBox.topLeft ());
|
|
- pt.resetTransform ();
|
|
- pt.setClipRegion( reg );
|
|
- pt.drawPixmap( bb.topLeft(), p, pb );
|
|
- }
|
|
-
|
|
- // Bottom
|
|
- if (!rbottom.isEmpty ())
|
|
- {
|
|
- bb = rbottom.boundingRect();
|
|
- pb = bb;
|
|
- pb.moveTo (bb.topLeft () - bBox.topLeft ());
|
|
- pt.resetTransform ();
|
|
- pt.translate(0, -h);
|
|
- pt.setClipRegion( reg );
|
|
- pt.drawPixmap( bb.topLeft(), p, pb );
|
|
- }
|
|
-
|
|
- // Left
|
|
- if (!rleft.isEmpty ())
|
|
- {
|
|
- bb = rleft.boundingRect();
|
|
- pb = bb;
|
|
- pb.moveTo (bb.topLeft () - bBox.topLeft ());
|
|
- pt.resetTransform ();
|
|
- pt.translate(0, t + b);
|
|
- pt.rotate (90);
|
|
- pt.scale (1.0, -1.0);
|
|
- pt.translate(0, -t);
|
|
- pt.setClipRegion( reg );
|
|
- pt.drawPixmap( bb.topLeft(), p, pb );
|
|
- }
|
|
-
|
|
- // Right
|
|
- if (!rright.isEmpty ())
|
|
- {
|
|
- bb = rright.boundingRect();
|
|
- pb = bb;
|
|
- pb.moveTo (bb.topLeft () - bBox.topLeft ());
|
|
- pt.resetTransform ();
|
|
- pt.translate(0, t + b + l);
|
|
- pt.rotate (90);
|
|
- pt.scale (1.0, -1.0);
|
|
- pt.translate(- (l + w), -t);
|
|
- pt.setClipRegion( reg );
|
|
- pt.drawPixmap( bb.topLeft(), p, pb );
|
|
- }
|
|
-
|
|
-
|
|
-
|
|
- if (mUpdateProperty)
|
|
- updateProperty ();
|
|
-}
|
|
-
|
|
-QWidget *
|
|
-KWD::Window::decorWidget (void) const
|
|
-{
|
|
- if (!mDecor)
|
|
- return 0;
|
|
- return mDecor->widget ();
|
|
-}
|
|
-
|
|
-QWidget *
|
|
-KWD::Window::childAt (int x, int y) const
|
|
-{
|
|
- if (!mDecor)
|
|
- return 0;
|
|
-
|
|
- QWidget *child = mDecor->widget ()->childAt (x + mPadding.left, y + mPadding.top);
|
|
- return (child)? child : decorWidget ();
|
|
-}
|
|
-
|
|
-QPoint
|
|
-KWD::Window::mapToChildAt (QPoint p) const
|
|
-{
|
|
- if (!mDecor)
|
|
- return p;
|
|
- if (childAt (p.x (), p.y ()) == decorWidget ())
|
|
- return p + QPoint (mPadding.left, mPadding.right);
|
|
- return childAt (p.x (), p.y ())->mapFrom (decorWidget (), p + QPoint (mPadding.left, mPadding.right));
|
|
-}
|
|
-
|
|
-bool
|
|
-KWD::Window::eventFilter (QObject* o, QEvent* e)
|
|
-{
|
|
- if (mDecor == NULL || o != mDecor->widget ())
|
|
- return false;
|
|
- if (e->type() == QEvent::Resize)
|
|
- {
|
|
- QResizeEvent* ev = static_cast<QResizeEvent*> (e);
|
|
- // Filter out resize events that inform about size different than frame size.
|
|
- // This will ensure that mDecor->width() etc. and mDecor->widget()->width() will be in sync.
|
|
- // These events only seem to be delayed events from initial resizing before show() was called
|
|
- // on the decoration widget.
|
|
- if (ev->size () != (mGeometry.size () + QSize (mExtents.left + mExtents.right,
|
|
- mExtents.top + mExtents.bottom)))
|
|
- {
|
|
- int w = mGeometry.width () + mExtents.left + mExtents.right;
|
|
- int h = mGeometry.height () + mExtents.top + mExtents.bottom;
|
|
-
|
|
- mDecor->resize (QSize (w, h));
|
|
- return true;
|
|
- }
|
|
- // HACK: Avoid decoration redraw delays. On resize Qt sets WA_WStateConfigPending
|
|
- // which delays all painting until a matching ConfigureNotify event comes.
|
|
- // But this process itself is the window manager, so it's not needed
|
|
- // to wait for that event, the geometry is known.
|
|
- // Note that if Qt in the future changes how this flag is handled and what it
|
|
- // triggers then this may potentionally break things. See mainly QETWidget::translateConfigEvent().
|
|
- mDecor->widget()->setAttribute( Qt::WA_WState_ConfigPending, false );
|
|
- mDecor->widget()->update();
|
|
- return false;
|
|
- }
|
|
- return false;
|
|
-}
|
|
diff -uprN compiz-0.8.8-orig/kde/window-decorator-kde4/window.h compiz-0.8.8/kde/window-decorator-kde4/window.h
|
|
--- compiz-0.8.8-orig/kde/window-decorator-kde4/window.h 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/kde/window-decorator-kde4/window.h 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,276 +0,0 @@
|
|
-/*
|
|
- * Copyright © 2008 Dennis Kasprzyk <onestone@opencompositing.org>
|
|
- * Copyright © 2006 Novell, Inc.
|
|
- * Copyright © 2006 Volker Krause <vkrause@kde.org>
|
|
- *
|
|
- * 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., 51 Franklin Street, Fifth Floor, Boston,
|
|
- * MA 02110-1301, USA.
|
|
- *
|
|
- * Author: David Reveman <davidr@novell.com>
|
|
- */
|
|
-
|
|
-#ifndef _WINDOW_H
|
|
-#define _WINDOW_H
|
|
-
|
|
-#include <kdecorationbridge.h>
|
|
-#include <KDE/KActionCollection>
|
|
-#include <kdeversion.h>
|
|
-
|
|
-#include <qpixmap.h>
|
|
-#include <qwidget.h>
|
|
-#include <qprocess.h>
|
|
-
|
|
-#include <decoration.h>
|
|
-
|
|
-#include <X11/extensions/Xdamage.h>
|
|
-
|
|
-#include "utils.h"
|
|
-#include "options.h"
|
|
-
|
|
-class QProcess;
|
|
-class KDecoration;
|
|
-class KActionCollection;
|
|
-class QMenu;
|
|
-
|
|
-namespace KWin
|
|
-{
|
|
- class PaintRedirector;
|
|
-}
|
|
-
|
|
-namespace KWD
|
|
-{
|
|
-class Window: public QObject, public KDecorationBridgeUnstable {
|
|
- Q_OBJECT public:
|
|
-
|
|
- enum Type
|
|
- {
|
|
- Normal,
|
|
- Default,
|
|
- DefaultActive
|
|
- };
|
|
-
|
|
- public:
|
|
- Window (WId parentId, WId clientId, WId frame, Type type,
|
|
- int x = 0, int y = 0, int w = 1, int h = 1);
|
|
- ~Window (void);
|
|
-
|
|
- virtual bool isActive (void) const;
|
|
- virtual bool isCloseable (void) const;
|
|
- virtual bool isMaximizable (void) const;
|
|
- virtual MaximizeMode maximizeMode (void) const;
|
|
- virtual bool isMinimizable (void) const;
|
|
- virtual bool providesContextHelp (void) const;
|
|
- virtual int desktop (void) const;
|
|
- virtual bool isModal (void) const;
|
|
- virtual bool isShadeable (void) const;
|
|
- virtual bool isShade (void) const;
|
|
- virtual bool isSetShade (void) const;
|
|
- virtual bool keepAbove (void) const;
|
|
- virtual bool keepBelow (void) const;
|
|
- virtual bool isMovable (void) const;
|
|
- virtual bool isResizable (void) const;
|
|
- virtual NET::WindowType
|
|
- windowType (unsigned long supported_types) const;
|
|
- virtual QIcon icon (void) const;
|
|
- virtual QString caption (void) const;
|
|
- virtual void processMousePressEvent (QMouseEvent *);
|
|
- virtual void showWindowMenu (const QRect &);
|
|
- virtual void showWindowMenu (const QPoint &);
|
|
- virtual void performWindowOperation (WindowOperation);
|
|
- virtual void setMask (const QRegion &, int);
|
|
- virtual bool isPreview (void) const;
|
|
- virtual QRect geometry (void) const;
|
|
- virtual QRect iconGeometry (void) const;
|
|
- virtual QRegion unobscuredRegion (const QRegion & r) const;
|
|
- virtual WId windowId (void) const;
|
|
- virtual void closeWindow (void);
|
|
- virtual void maximize (MaximizeMode mode);
|
|
- virtual void minimize (void);
|
|
- virtual void showContextHelp (void);
|
|
- virtual void setDesktop (int desktop);
|
|
- virtual void titlebarDblClickOperation (void);
|
|
- virtual void titlebarMouseWheelOperation (int delta);
|
|
- virtual void setShade (bool set);
|
|
- virtual void setKeepAbove (bool);
|
|
- virtual void setKeepBelow (bool);
|
|
- virtual int currentDesktop (void) const;
|
|
- virtual QWidget *initialParentWidget (void) const;
|
|
- virtual Qt::WFlags initialWFlags (void) const;
|
|
- virtual void grabXServer (bool grab);
|
|
-
|
|
- /* unstable API */
|
|
- virtual bool compositingActive () const;
|
|
-#if KDE_IS_VERSION(4,3,90)
|
|
- virtual QRect transparentRect () const;
|
|
-
|
|
- virtual bool isClientGroupActive ();
|
|
- virtual QList<ClientGroupItem> clientGroupItems () const;
|
|
- virtual long itemId (int index);
|
|
- virtual int visibleClientGroupItem ();
|
|
- virtual void setVisibleClientGroupItem (int index);
|
|
- virtual void moveItemInClientGroup (int index, int before);
|
|
- virtual void moveItemToClientGroup (long itemId, int before);
|
|
- virtual void removeFromClientGroup (int index, const QRect& newGeom);
|
|
- virtual void closeClientGroupItem (int index);
|
|
- virtual void closeAllInClientGroup ();
|
|
- virtual void displayClientMenu (int index, const QPoint& pos);
|
|
-
|
|
- virtual WindowOperation
|
|
- buttonToWindowOperation(Qt::MouseButtons button);
|
|
-#endif
|
|
- virtual bool eventFilter (QObject* o, QEvent* e);
|
|
-
|
|
- void handleActiveChange (void);
|
|
- void updateFrame (WId frame);
|
|
- void updateWindowGeometry (void);
|
|
- void updateCursor (QPoint pos);
|
|
- void updateSelected (WId selected);
|
|
-
|
|
- WId frameId (void) const
|
|
- {
|
|
- return mFrame;
|
|
- }
|
|
-
|
|
- KDecoration *decoration (void) const
|
|
- {
|
|
- return mDecor;
|
|
- }
|
|
-
|
|
- QWidget *decorWidget (void) const;
|
|
- QWidget *childAt (int x, int y) const;
|
|
- QPoint mapToChildAt (QPoint p) const;
|
|
-
|
|
- QWidget *activeChild (void) const
|
|
- {
|
|
- return mActiveChild;
|
|
- }
|
|
-
|
|
- void setActiveChild (QWidget * child)
|
|
- {
|
|
- mActiveChild = child;
|
|
- }
|
|
-
|
|
- void moveWindow (QMouseEvent *qme);
|
|
- void reloadDecoration (void);
|
|
- void updateState (void);
|
|
- void updateName (void);
|
|
- void updateIcons (void);
|
|
- void updateOpacity (void)
|
|
- {
|
|
- mOpacity = readPropertyShort (mClientId, Atoms::netWmWindowOpacity,
|
|
- 0xffff);
|
|
- }
|
|
- Drawable pixmapId (void) const
|
|
- {
|
|
- return mPixmap;
|
|
- }
|
|
-
|
|
- bool handleMap (void);
|
|
- bool handleConfigure (QSize size);
|
|
-
|
|
- decor_extents_t *border (void)
|
|
- {
|
|
- return &mBorder;
|
|
- }
|
|
-
|
|
- QRect clientGeometry (void);
|
|
- void showKillProcessDialog (Time timestamp);
|
|
- void hideKillProcessDialog (void);
|
|
-
|
|
- void setFakeRelease (bool fakeRelease)
|
|
- {
|
|
- mFakeRelease = fakeRelease;
|
|
- }
|
|
-
|
|
- bool getFakeRelease ()
|
|
- {
|
|
- return mFakeRelease;
|
|
- }
|
|
-
|
|
-
|
|
- private:
|
|
- void createDecoration (void);
|
|
- void resizeDecoration (bool force = false);
|
|
- void updateBlurProperty (int topOffset,
|
|
- int bottomOffset,
|
|
- int leftOffset,
|
|
- int rightOffset);
|
|
- void updateProperty (void);
|
|
- void getWindowProtocols (void);
|
|
-
|
|
- Options::MouseCommand buttonToCommand (Qt::MouseButtons button);
|
|
- void performMouseCommand (KWD::Options::MouseCommand command,
|
|
- QMouseEvent *qme);
|
|
- NET::Direction positionToDirection (int pos);
|
|
- Cursor positionToCursor (QPoint pos);
|
|
-
|
|
- private slots:
|
|
- void handlePopupActivated (QAction *action);
|
|
- void handleOpacityPopupActivated (QAction *action);
|
|
- void handleDesktopPopupActivated (QAction *action);
|
|
- void handlePopupAboutToShow (void);
|
|
-
|
|
- void decorRepaintPending ();
|
|
-
|
|
- private:
|
|
- Type mType;
|
|
- WId mParentId;
|
|
- WId mFrame;
|
|
- WId mClientId;
|
|
- WId mSelectedId;
|
|
- QRect mGeometry;
|
|
- QString mName;
|
|
- QPixmap mIcon;
|
|
- QPixmap mMiniIcon;
|
|
- decor_extents_t mBorder;
|
|
- decor_extents_t mPadding;
|
|
- decor_extents_t mExtents;
|
|
- unsigned short mOpacity;
|
|
- KDecoration *mDecor;
|
|
- Pixmap mPixmap;
|
|
- QPixmap mPixmapQt;
|
|
- bool mUpdateProperty;
|
|
- bool mShapeSet;
|
|
- QRegion mShape;
|
|
- QWidget *mActiveChild;
|
|
- bool mSupportTakeFocus;
|
|
- bool mSupportContextHelp;
|
|
- QMenu *mPopup;
|
|
- QMenu *mAdvancedMenu;
|
|
- QMenu *mOpacityMenu;
|
|
- QMenu *mDesktopMenu;
|
|
- unsigned long mState;
|
|
-
|
|
- QProcess mProcessKiller;
|
|
- KActionCollection mKeys;
|
|
- bool mFakeRelease;
|
|
-
|
|
- QAction *mResizeOpAction;
|
|
- QAction *mMoveOpAction;
|
|
- QAction *mMaximizeOpAction;
|
|
- QAction *mShadeOpAction;
|
|
- QAction *mKeepAboveOpAction;
|
|
- QAction *mKeepBelowOpAction;
|
|
- QAction *mFullScreenOpAction;
|
|
- QAction *mNoBorderOpAction;
|
|
- QAction *mMinimizeOpAction;
|
|
- QAction *mCloseOpAction;
|
|
- QAction *mDesktopOpAction;
|
|
-
|
|
- KWin::PaintRedirector *mPaintRedirector;
|
|
- };
|
|
-}
|
|
-
|
|
-#endif
|
|
diff -uprN compiz-0.8.8-orig/Makefile.am compiz-0.8.8/Makefile.am
|
|
--- compiz-0.8.8-orig/Makefile.am 2013-04-19 11:25:07.306309000 +0200
|
|
+++ compiz-0.8.8/Makefile.am 2013-04-19 11:45:47.724650591 +0200
|
|
@@ -1,4 +1,4 @@
|
|
-SUBDIRS = include src libdecoration plugins images gtk kde po metadata
|
|
+SUBDIRS = include src libdecoration plugins images gtk po metadata
|
|
|
|
EXTRA_DIST = \
|
|
COPYING \
|
|
@@ -18,17 +18,12 @@ if USE_MATECONF
|
|
mateconfdata = compiz-mateconf.pc
|
|
endif
|
|
|
|
-if USE_KCONFIG
|
|
-kconfigdata = compiz-kconfig.pc
|
|
-endif
|
|
-
|
|
pkgconfigdir = $(libdir)/pkgconfig
|
|
pkgconfig_DATA = \
|
|
compiz.pc \
|
|
compiz-cube.pc \
|
|
compiz-scale.pc \
|
|
- $(mateconfdata) \
|
|
- $(kconfigdata)
|
|
+ $(mateconfdata)
|
|
|
|
# Some custom targets to make it easier to release things.
|
|
# Use either:
|
|
diff -uprN compiz-0.8.8-orig/metadata/kcfg.xslt compiz-0.8.8/metadata/kcfg.xslt
|
|
--- compiz-0.8.8-orig/metadata/kcfg.xslt 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/metadata/kcfg.xslt 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,322 +0,0 @@
|
|
-<!--
|
|
- Copyright © 2007 Dennis Kasprzyk
|
|
- Copyright © 2007 Novell, Inc.
|
|
-
|
|
- Permission to use, copy, modify, distribute, and sell this software
|
|
- and its documentation for any purpose is hereby granted without
|
|
- fee, provided that the above copyright notice appear in all copies
|
|
- and that both that copyright notice and this permission notice
|
|
- appear in supporting documentation, and that the name of
|
|
- Dennis Kasprzyk not be used in advertising or publicity pertaining to
|
|
- distribution of the software without specific, written prior permission.
|
|
- Dennis Kasprzyk makes no representations about the suitability of this
|
|
- software for any purpose. It is provided "as is" without express or
|
|
- implied warranty.
|
|
-
|
|
- DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
- INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
|
|
- NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
|
- CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
- OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
|
- NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
|
- WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
-
|
|
- Authors: Dennis Kasprzyk <onestone@deltatauchi.de>
|
|
- David Reveman <davidr@novell.com>
|
|
- -->
|
|
-
|
|
-<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
|
|
-
|
|
- <xsl:output method="xml" indent="yes"/>
|
|
-
|
|
- <xsl:template match="/compiz">
|
|
- <kcfg>
|
|
- <kcfgfile name="compizrc">
|
|
- <parameter name="screen"/>
|
|
- </kcfgfile>
|
|
- <xsl:for-each select="/compiz/*/display | /compiz/*/screen">
|
|
- <group>
|
|
- <xsl:variable name="group">
|
|
- <xsl:choose>
|
|
- <xsl:when test="ancestor::plugin">
|
|
- <xsl:value-of select="ancestor::plugin/@name"/>
|
|
- </xsl:when>
|
|
- <xsl:otherwise>
|
|
- <xsl:text>core</xsl:text>
|
|
- </xsl:otherwise>
|
|
- </xsl:choose>
|
|
- <xsl:text>_</xsl:text>
|
|
- <xsl:value-of select="name()"/>
|
|
- </xsl:variable>
|
|
- <xsl:attribute name='name'>
|
|
- <xsl:value-of select="$group"/>
|
|
- <xsl:if test="name() = 'screen'">
|
|
- <xsl:text>$(screen)</xsl:text>
|
|
- </xsl:if>
|
|
- </xsl:attribute>
|
|
- <xsl:for-each select="option[not(@read_only='true') and not(@type='action')]">
|
|
- <xsl:call-template name="print_option">
|
|
- <xsl:with-param name="group" select="$group"/>
|
|
- </xsl:call-template>
|
|
- </xsl:for-each>
|
|
- </group>
|
|
- </xsl:for-each>
|
|
- </kcfg>
|
|
- </xsl:template>
|
|
-
|
|
- <xsl:template name="print_option">
|
|
- <xsl:param name="group"/>
|
|
- <entry>
|
|
- <xsl:variable name="ktype">
|
|
- <xsl:call-template name="print_type"/>
|
|
- </xsl:variable>
|
|
- <xsl:attribute name='name'>
|
|
- <xsl:value-of select="$group"/>
|
|
- <xsl:text>_</xsl:text>
|
|
- <xsl:value-of select="@name"/>
|
|
- </xsl:attribute>
|
|
- <xsl:attribute name='key'>
|
|
- <xsl:value-of select="@name"/>
|
|
- </xsl:attribute>
|
|
- <xsl:attribute name='type'>
|
|
- <xsl:value-of select="$ktype"/>
|
|
- </xsl:attribute>
|
|
- <label><xsl:value-of select="short[not(@xml:lang)]/text()"/></label>
|
|
- <whatsthis>
|
|
- <xsl:value-of select="long[not(@xml:lang)]/text()"/>
|
|
- <xsl:if test="$ktype = 'Int'">
|
|
- <xsl:call-template name="print_info"/>
|
|
- </xsl:if>
|
|
- </whatsthis>
|
|
- <xsl:choose>
|
|
- <xsl:when test="@type = 'color'">
|
|
- <default>
|
|
- <xsl:choose>
|
|
- <xsl:when test="default">
|
|
- <xsl:for-each select="default[1]">
|
|
- <xsl:call-template name="print_color"/>
|
|
- </xsl:for-each>
|
|
- </xsl:when>
|
|
- <xsl:otherwise>
|
|
- <xsl:text>#000000ff</xsl:text>
|
|
- </xsl:otherwise>
|
|
- </xsl:choose>
|
|
- </default>
|
|
- </xsl:when>
|
|
- <xsl:when test="@type = 'edge'">
|
|
- <default>
|
|
- <xsl:for-each select="default[1]">
|
|
- <xsl:call-template name="print_edge_list"/>
|
|
- </xsl:for-each>
|
|
- </default>
|
|
- </xsl:when>
|
|
- <xsl:when test="$ktype = 'IntList' or $ktype = 'StringList'">
|
|
- <default>
|
|
- <xsl:choose>
|
|
- <xsl:when test="@type = 'color'">
|
|
- <xsl:for-each select="default[1]">
|
|
- <xsl:call-template name="print_color_list"/>
|
|
- </xsl:for-each>
|
|
- </xsl:when>
|
|
- <xsl:otherwise>
|
|
- <xsl:for-each select="default[1]">
|
|
- <xsl:call-template name="print_value_list"/>
|
|
- </xsl:for-each>
|
|
- </xsl:otherwise>
|
|
- </xsl:choose>
|
|
- </default>
|
|
- </xsl:when>
|
|
- <xsl:otherwise>
|
|
- <default>
|
|
- <xsl:if test="default/text()">
|
|
- <xsl:value-of select="default/text()"/>
|
|
- </xsl:if>
|
|
- </default>
|
|
- </xsl:otherwise>
|
|
- </xsl:choose>
|
|
- <xsl:if test="contains('Int,Double', $ktype)">
|
|
- <xsl:if test="min/text()">
|
|
- <min><xsl:value-of select="min/text()"/></min>
|
|
- </xsl:if>
|
|
- <xsl:if test="max/text()">
|
|
- <max><xsl:value-of select="max/text()"/></max>
|
|
- </xsl:if>
|
|
- </xsl:if>
|
|
- </entry>
|
|
- </xsl:template>
|
|
-
|
|
- <xsl:template name="print_type">
|
|
- <xsl:param name="type">
|
|
- <xsl:value-of select="@type"/>
|
|
- </xsl:param>
|
|
- <xsl:choose>
|
|
- <xsl:when test="$type = 'bool'">
|
|
- <xsl:text>Bool</xsl:text>
|
|
- </xsl:when>
|
|
- <xsl:when test="$type = 'int'">
|
|
- <xsl:text>Int</xsl:text>
|
|
- </xsl:when>
|
|
- <xsl:when test="$type = 'float'">
|
|
- <xsl:text>Double</xsl:text>
|
|
- </xsl:when>
|
|
- <xsl:when test="$type = 'bell'">
|
|
- <xsl:text>Bool</xsl:text>
|
|
- </xsl:when>
|
|
- <xsl:when test="$type = 'list'">
|
|
- <xsl:choose>
|
|
- <xsl:when test="type/text() = 'int'">
|
|
- <xsl:text>Int</xsl:text>
|
|
- </xsl:when>
|
|
- <xsl:otherwise>
|
|
- <xsl:text>String</xsl:text>
|
|
- </xsl:otherwise>
|
|
- </xsl:choose>
|
|
- <xsl:text>List</xsl:text>
|
|
- </xsl:when>
|
|
- <xsl:otherwise>
|
|
- <xsl:text>String</xsl:text>
|
|
- </xsl:otherwise>
|
|
- </xsl:choose>
|
|
- </xsl:template>
|
|
-
|
|
- <xsl:template name="print_info">
|
|
- <xsl:variable name="info">
|
|
- <xsl:text> (</xsl:text>
|
|
- <xsl:choose>
|
|
- <xsl:when test="contains('int,float',@type) and not(desc/value/text())">
|
|
- <xsl:value-of select="min/text()"/> - <xsl:value-of select="max/text()"/>
|
|
- </xsl:when>
|
|
- <xsl:when test="@type='int' and desc/value/text()">
|
|
- <xsl:call-template name="print_int_desc_list"/>
|
|
- </xsl:when>
|
|
- <xsl:when test="@type = 'match'">
|
|
- <xsl:text>match</xsl:text>
|
|
- </xsl:when>
|
|
- </xsl:choose>
|
|
- <xsl:text>)</xsl:text>
|
|
- </xsl:variable>
|
|
- <xsl:if test="not(contains($info,' ()'))">
|
|
- <xsl:value-of select="$info"/>
|
|
- </xsl:if>
|
|
- </xsl:template>
|
|
-
|
|
- <xsl:template name="print_int_desc_list">
|
|
- <xsl:variable name="list">
|
|
- <xsl:for-each select="desc">
|
|
- <xsl:value-of select="value/text()"/>
|
|
- <xsl:text> = </xsl:text>
|
|
- <xsl:value-of select="name/text()"/>
|
|
- <xsl:text>, </xsl:text>
|
|
- </xsl:for-each>
|
|
- </xsl:variable>
|
|
- <xsl:value-of select="substring($list,1,string-length($list) - 2)"/>
|
|
- </xsl:template>
|
|
-
|
|
- <xsl:template name="print_value_list">
|
|
- <xsl:variable name="list">
|
|
- <xsl:for-each select="value">
|
|
- <xsl:value-of select="text()"/>
|
|
- <xsl:text>,</xsl:text>
|
|
- </xsl:for-each>
|
|
- </xsl:variable>
|
|
- <xsl:value-of select="substring($list,1,string-length($list) - 1)"/>
|
|
- </xsl:template>
|
|
-
|
|
- <xsl:template name="print_color_list">
|
|
- <xsl:variable name="list">
|
|
- <xsl:for-each select="value">
|
|
- <xsl:call-template name="print_color"/>
|
|
- <xsl:text>,</xsl:text>
|
|
- </xsl:for-each>
|
|
- </xsl:variable>
|
|
- <xsl:value-of select="substring($list,1,string-length($list) - 1)"/>
|
|
- </xsl:template>
|
|
-
|
|
- <!--
|
|
- generates the #00aabbcc color value out of the compiz
|
|
- metadata color description
|
|
- -->
|
|
- <xsl:template name="print_color">
|
|
- <xsl:variable name="red">
|
|
- <xsl:call-template name="get_hex_num">
|
|
- <xsl:with-param name="value" select="red/text()"/>
|
|
- </xsl:call-template>
|
|
- </xsl:variable>
|
|
- <xsl:variable name="green">
|
|
- <xsl:call-template name="get_hex_num">
|
|
- <xsl:with-param name="value" select="green/text()"/>
|
|
- </xsl:call-template>
|
|
- </xsl:variable>
|
|
- <xsl:variable name="blue">
|
|
- <xsl:call-template name="get_hex_num">
|
|
- <xsl:with-param name="value" select="blue/text()"/>
|
|
- </xsl:call-template>
|
|
- </xsl:variable>
|
|
- <xsl:variable name="alpha">
|
|
- <xsl:choose>
|
|
- <xsl:when test="alpha/text()">
|
|
- <xsl:call-template name="get_hex_num">
|
|
- <xsl:with-param name="value" select="alpha/text()"/>
|
|
- </xsl:call-template>
|
|
- </xsl:when>
|
|
- <xsl:otherwise>
|
|
- <xsl:text>ff</xsl:text>
|
|
- </xsl:otherwise>
|
|
- </xsl:choose>
|
|
- </xsl:variable>
|
|
- <xsl:value-of select="concat('#',concat($red,concat($green,concat($blue,$alpha))))"/>
|
|
- </xsl:template>
|
|
-
|
|
- <!--
|
|
- converts a decimal number in the range of 0-65535 or
|
|
- a hex number in the range of 0x0000 - 0xffff to a hex number in the
|
|
- range of 00 - ff
|
|
- -->
|
|
- <xsl:template name="get_hex_num">
|
|
- <xsl:param name="value"/>
|
|
- <xsl:choose>
|
|
- <xsl:when test="starts-with($value,'0x')">
|
|
- <xsl:variable name="number">
|
|
- <xsl:text>0000</xsl:text>
|
|
- <xsl:value-of select="substring-after($value,'0x')"/>
|
|
- </xsl:variable>
|
|
- <xsl:value-of select="substring(concat('000',$number),string-length($number),2)"/>
|
|
- </xsl:when>
|
|
- <xsl:when test="string-length($value)">
|
|
- <xsl:variable name="number">
|
|
- <xsl:call-template name="to_hex">
|
|
- <xsl:with-param name="decimal_number" select="$value"/>
|
|
- </xsl:call-template>
|
|
- </xsl:variable>
|
|
- <xsl:value-of select="substring(concat('000',$number),string-length($number),2)"/>
|
|
- </xsl:when>
|
|
- <xsl:otherwise>
|
|
- <xsl:text>00</xsl:text>
|
|
- </xsl:otherwise>
|
|
- </xsl:choose>
|
|
- </xsl:template>
|
|
-
|
|
- <!-- converts a decimal number to a hex number -->
|
|
- <xsl:variable name="hex_digits" select="'0123456789abcdef'"/>
|
|
-
|
|
- <xsl:template name="to_hex">
|
|
- <xsl:param name="decimal_number"/>
|
|
- <xsl:if test="$decimal_number >= 16">
|
|
- <xsl:call-template name="to_hex">
|
|
- <xsl:with-param name="decimal_number" select="floor($decimal_number div 16)" />
|
|
- </xsl:call-template>
|
|
- </xsl:if>
|
|
- <xsl:value-of select="substring($hex_digits, ($decimal_number mod 16) + 1, 1)" />
|
|
- </xsl:template>
|
|
-
|
|
- <xsl:template name="print_edge_list">
|
|
- <xsl:variable name="list">
|
|
- <xsl:for-each select="edge">
|
|
- <xsl:value-of select="@name"/>
|
|
- <xsl:text> | </xsl:text>
|
|
- </xsl:for-each>
|
|
- </xsl:variable>
|
|
- <xsl:value-of select="substring($list,1,string-length($list) - 3)"/>
|
|
- </xsl:template>
|
|
-
|
|
-</xsl:stylesheet>
|
|
diff -uprN compiz-0.8.8-orig/metadata/kconfig.xml.in compiz-0.8.8/metadata/kconfig.xml.in
|
|
--- compiz-0.8.8-orig/metadata/kconfig.xml.in 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/metadata/kconfig.xml.in 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,6 +0,0 @@
|
|
-<compiz>
|
|
- <plugin name="kconfig">
|
|
- <_short>Kconfig</_short>
|
|
- <_long>Kconfig Control Backend</_long>
|
|
- </plugin>
|
|
-</compiz>
|
|
diff -uprN compiz-0.8.8-orig/metadata/kconfig.xslt compiz-0.8.8/metadata/kconfig.xslt
|
|
--- compiz-0.8.8-orig/metadata/kconfig.xslt 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/metadata/kconfig.xslt 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,59 +0,0 @@
|
|
-<!--
|
|
- Copyright © 2007 Novell, Inc.
|
|
-
|
|
- Permission to use, copy, modify, distribute, and sell this software
|
|
- and its documentation for any purpose is hereby granted without
|
|
- fee, provided that the above copyright notice appear in all copies
|
|
- and that both that copyright notice and this permission notice
|
|
- appear in supporting documentation, and that the name of
|
|
- Novell, Inc. not be used in advertising or publicity pertaining to
|
|
- distribution of the software without specific, written prior permission.
|
|
- Novell, Inc. makes no representations about the suitability of this
|
|
- software for any purpose. It is provided "as is" without express or
|
|
- implied warranty.
|
|
-
|
|
- NOVELL, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
- INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
|
|
- NO EVENT SHALL NOVELL, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
|
- CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
- OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
|
- NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
|
- WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
-
|
|
- Author: David Reveman <davidr@novell.com>
|
|
- -->
|
|
-
|
|
-<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
|
|
-
|
|
-<xsl:output method="text"/>
|
|
-
|
|
-<xsl:template match="/kcfg">
|
|
- <xsl:for-each select="/kcfg/group">
|
|
- <xsl:variable name="prefix">
|
|
- <xsl:value-of select="substring(@name,1,string-length(@name) - 9)"/>
|
|
- </xsl:variable>
|
|
- <xsl:variable name="suffix">
|
|
- <xsl:value-of select="substring(@name,string-length(@name) - 8,string-length(@name))"/>
|
|
- </xsl:variable>
|
|
- <xsl:text>[</xsl:text>
|
|
- <xsl:choose>
|
|
- <xsl:when test="$suffix = '$(screen)'">
|
|
- <xsl:value-of select="$prefix"/>
|
|
- <xsl:value-of select="$screen"/>
|
|
- </xsl:when>
|
|
- <xsl:otherwise>
|
|
- <xsl:value-of select="@name"/>
|
|
- </xsl:otherwise>
|
|
- </xsl:choose>
|
|
- <xsl:text>] </xsl:text>
|
|
- <xsl:for-each select="entry">
|
|
- <xsl:value-of select="@key"/>
|
|
- <xsl:text>=</xsl:text>
|
|
- <xsl:value-of select="default/text()"/>
|
|
- <xsl:text> </xsl:text>
|
|
- </xsl:for-each>
|
|
- <xsl:text> </xsl:text>
|
|
- </xsl:for-each>
|
|
-</xsl:template>
|
|
-
|
|
-</xsl:stylesheet>
|
|
diff -uprN compiz-0.8.8-orig/metadata/Makefile.am compiz-0.8.8/metadata/Makefile.am
|
|
--- compiz-0.8.8-orig/metadata/Makefile.am 2013-04-19 11:25:07.364310000 +0200
|
|
+++ compiz-0.8.8/metadata/Makefile.am 2013-04-19 11:52:17.717558999 +0200
|
|
@@ -15,7 +15,6 @@ xml_in_files = \
|
|
matecompat.xml.in \
|
|
ini.xml.in \
|
|
inotify.xml.in \
|
|
- kconfig.xml.in \
|
|
minimize.xml.in \
|
|
move.xml.in \
|
|
obs.xml.in \
|
|
@@ -57,30 +56,6 @@ schemas_stylesheets = schemas.xslt
|
|
|
|
endif
|
|
|
|
-if USE_KCONFIG
|
|
-kde_kcfgdir = $(DESTDIR)$(KDE_KCFG_DIR)
|
|
-kde_kcfg_files = $(patsubst %.xml.in,compiz-%.kcfg,$(xml_in_files))
|
|
-
|
|
-kde_kcfg_stylesheets = kcfg.xslt
|
|
-
|
|
-%.kcfg: $(xml_files)
|
|
- xsltproc -o $@ $(srcdir)/kcfg.xslt $(subst compiz-,,$*).xml;
|
|
-
|
|
-kde_configdir = $(DESTDIR)$(KDE_KCONFIG_DIR)
|
|
-kde_config_files = compizrc
|
|
-
|
|
-compizrc: $(kde_kcfg_files)
|
|
- xsltproc --stringparam screen 0 $(srcdir)/kconfig.xslt \
|
|
- $(kde_kcfg_files) > $@;
|
|
-
|
|
-kde_config_stylesheets = kconfig.xslt
|
|
-
|
|
-endif
|
|
-
|
|
-noinst_DATA = \
|
|
- $(kde_kcfg_files) \
|
|
- $(kde_config_files)
|
|
-
|
|
install-data-local:
|
|
if USE_MATECONF
|
|
if MATECONF_SCHEMAS_INSTALL
|
|
@@ -89,38 +64,11 @@ if MATECONF_SCHEMAS_INSTALL
|
|
fi
|
|
endif
|
|
endif
|
|
-if USE_KCONFIG
|
|
- if mkdir -p $(kde_kcfgdir) && test -w $(kde_kcfgdir); then ( \
|
|
- $(INSTALL) -m 644 $(kde_kcfg_files) $(kde_kcfgdir) \
|
|
- ); \
|
|
- fi
|
|
- if mkdir -p $(kde_configdir) && test -w $(kde_configdir); then ( \
|
|
- $(INSTALL) -m 644 $(kde_config_files) $(kde_configdir) \
|
|
- ); \
|
|
- fi
|
|
-endif
|
|
-
|
|
-uninstall-local:
|
|
-if USE_KCONFIG
|
|
- if test -w $(kde_kcfgdir); then ( \
|
|
- for file in $(kde_kcfg_files); do \
|
|
- rm -f $(kde_kcfgdir)/$$file; \
|
|
- done \
|
|
- ); \
|
|
- fi
|
|
- if test -w $(kde_configdir); then ( \
|
|
- for file in $(kde_config_files); do \
|
|
- rm -f $(kde_configdir)/$$file; \
|
|
- done \
|
|
- ); \
|
|
- fi
|
|
-endif
|
|
|
|
xsltdir = $(stylesheetdir)
|
|
xslt_files = \
|
|
- $(schemas_stylesheets) \
|
|
- $(kde_kcfg_stylesheets) \
|
|
- $(kde_config_stylesheets)
|
|
+ $(schemas_stylesheets)
|
|
+
|
|
xslt_DATA = $(xslt_files)
|
|
|
|
EXTRA_DIST = \
|
|
@@ -131,6 +79,4 @@ EXTRA_DIST = \
|
|
DISTCLEANFILES = \
|
|
$(xml_files) \
|
|
core.xml.in \
|
|
- $(schema_files) \
|
|
- $(kde_kcfg_files) \
|
|
- $(kde_config_files)
|
|
+ $(schema_files)
|
|
diff -uprN compiz-0.8.8-orig/plugins/kconfig.cpp compiz-0.8.8/plugins/kconfig.cpp
|
|
--- compiz-0.8.8-orig/plugins/kconfig.cpp 2010-05-21 13:18:14.000000000 +0200
|
|
+++ compiz-0.8.8/plugins/kconfig.cpp 1970-01-01 01:00:00.000000000 +0100
|
|
@@ -1,752 +0,0 @@
|
|
-/*
|
|
- * Copyright © 2007 Novell, 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.
|
|
- */
|
|
-
|
|
-#include <kglobal.h>
|
|
-#include <kstandarddirs.h>
|
|
-#include <kapplication.h>
|
|
-#include <ksimpleconfig.h>
|
|
-#include <qfile.h>
|
|
-
|
|
-#include <compiz-core.h>
|
|
-
|
|
-#define COMPIZ_KCONFIG_RC "compizrc"
|
|
-
|
|
-static KInstance *kInstance;
|
|
-
|
|
-static CompMetadata kconfigMetadata;
|
|
-
|
|
-static int corePrivateIndex;
|
|
-
|
|
-typedef struct _KconfigCore {
|
|
- KConfig *config;
|
|
-
|
|
- CompTimeoutHandle syncHandle;
|
|
- CompTimeoutHandle reloadHandle;
|
|
- CompFileWatchHandle fileWatch;
|
|
-
|
|
- InitPluginForObjectProc initPluginForObject;
|
|
- SetOptionForPluginProc setOptionForPlugin;
|
|
-} KconfigCore;
|
|
-
|
|
-#define GET_KCONFIG_CORE(c) \
|
|
- ((KconfigCore *) (c)->base.privates[corePrivateIndex].ptr)
|
|
-
|
|
-#define KCONFIG_CORE(c) \
|
|
- KconfigCore *kc = GET_KCONFIG_CORE (c)
|
|
-
|
|
-
|
|
-static void
|
|
-kconfigRcChanged (const char *name,
|
|
- void *closure);
|
|
-
|
|
-static Bool
|
|
-kconfigRcSync (void *closure)
|
|
-{
|
|
- KCONFIG_CORE (&core);
|
|
-
|
|
- kc->config->sync ();
|
|
-
|
|
- kc->syncHandle = 0;
|
|
-
|
|
- return FALSE;
|
|
-}
|
|
-
|
|
-static bool
|
|
-kconfigValueToBool (CompOptionType type,
|
|
- CompOptionValue *value)
|
|
-{
|
|
- switch (type) {
|
|
- case CompOptionTypeBool:
|
|
- return (value->b) ? true : false;
|
|
- case CompOptionTypeBell:
|
|
- return (value->action.bell) ? true : false;
|
|
- default:
|
|
- break;
|
|
- }
|
|
-
|
|
- return false;
|
|
-}
|
|
-
|
|
-static QString
|
|
-kconfigValueToString (CompObject *object,
|
|
- CompOptionType type,
|
|
- CompOptionValue *value)
|
|
-{
|
|
- QString str;
|
|
-
|
|
- switch (type) {
|
|
- case CompOptionTypeBool:
|
|
- str = QString::number (value->b ? TRUE : FALSE);
|
|
- break;
|
|
- case CompOptionTypeFloat:
|
|
- str = QString::number (value->f);
|
|
- break;
|
|
- case CompOptionTypeString:
|
|
- str = QString (value->s);
|
|
- break;
|
|
- case CompOptionTypeColor: {
|
|
- char *color;
|
|
-
|
|
- color = colorToString (value->c);
|
|
- if (color)
|
|
- {
|
|
- str = QString (color);
|
|
- free (color);
|
|
- }
|
|
- } break;
|
|
- case CompOptionTypeKey: {
|
|
- char *action = NULL;
|
|
-
|
|
- while (object && object->type != COMP_OBJECT_TYPE_DISPLAY)
|
|
- object = object->parent;
|
|
-
|
|
- if (object)
|
|
- action = keyActionToString (GET_CORE_DISPLAY (object),
|
|
- &value->action);
|
|
- if (action)
|
|
- {
|
|
- str = QString (action);
|
|
- free (action);
|
|
- }
|
|
- } break;
|
|
- case CompOptionTypeButton: {
|
|
- char *action = NULL;
|
|
-
|
|
- while (object && object->type != COMP_OBJECT_TYPE_DISPLAY)
|
|
- object = object->parent;
|
|
-
|
|
- if (object)
|
|
- action = buttonActionToString (GET_CORE_DISPLAY (object),
|
|
- &value->action);
|
|
- if (action)
|
|
- {
|
|
- str = QString (action);
|
|
- free (action);
|
|
- }
|
|
- } break;
|
|
- case CompOptionTypeEdge: {
|
|
- char *edge;
|
|
-
|
|
- edge = edgeMaskToString (value->action.edgeMask);
|
|
- if (edge)
|
|
- {
|
|
- str = QString (edge);
|
|
- free (edge);
|
|
- }
|
|
- } break;
|
|
- case CompOptionTypeBell:
|
|
- str = QString::number (value->action.bell ? TRUE : FALSE);
|
|
- break;
|
|
- case CompOptionTypeMatch: {
|
|
- char *match;
|
|
-
|
|
- match = matchToString (&value->match);
|
|
- if (match)
|
|
- {
|
|
- str = QString (match);
|
|
- free (match);
|
|
- }
|
|
- }
|
|
- default:
|
|
- break;
|
|
- }
|
|
-
|
|
- return str;
|
|
-}
|
|
-
|
|
-static QString
|
|
-kconfigObjectString (CompObject *object)
|
|
-{
|
|
- QString objectName (QString (compObjectTypeName (object->type)));
|
|
- char *name;
|
|
-
|
|
- name = compObjectName (object);
|
|
- if (name)
|
|
- {
|
|
- objectName += name;
|
|
- free (name);
|
|
- }
|
|
-
|
|
- return objectName;
|
|
-}
|
|
-
|
|
-static void
|
|
-kconfigSetOption (CompObject *object,
|
|
- CompOption *o,
|
|
- const char *plugin)
|
|
-{
|
|
- QString group (QString (plugin) + "_" + kconfigObjectString (object));
|
|
-
|
|
- KCONFIG_CORE (&core);
|
|
-
|
|
- kc->config->setGroup (group);
|
|
-
|
|
- switch (o->type) {
|
|
- case CompOptionTypeBool:
|
|
- case CompOptionTypeBell:
|
|
- kc->config->writeEntry (o->name,
|
|
- kconfigValueToBool (o->type, &o->value));
|
|
- break;
|
|
- case CompOptionTypeInt:
|
|
- kc->config->writeEntry (o->name, o->value.i);
|
|
- break;
|
|
- case CompOptionTypeFloat:
|
|
- kc->config->writeEntry (o->name, (double) o->value.f);
|
|
- break;
|
|
- case CompOptionTypeString:
|
|
- case CompOptionTypeColor:
|
|
- case CompOptionTypeKey:
|
|
- case CompOptionTypeButton:
|
|
- case CompOptionTypeEdge:
|
|
- case CompOptionTypeMatch:
|
|
- kc->config->writeEntry (o->name,
|
|
- kconfigValueToString (object, o->type,
|
|
- &o->value));
|
|
- break;
|
|
- case CompOptionTypeList: {
|
|
- int i;
|
|
-
|
|
- switch (o->value.list.type) {
|
|
- case CompOptionTypeInt: {
|
|
- QValueList< int > list;
|
|
-
|
|
- for (i = 0; i < o->value.list.nValue; i++)
|
|
- list += o->value.list.value[i].i;
|
|
-
|
|
- kc->config->writeEntry (o->name, list);
|
|
- } break;
|
|
- case CompOptionTypeBool:
|
|
- case CompOptionTypeFloat:
|
|
- case CompOptionTypeString:
|
|
- case CompOptionTypeColor:
|
|
- case CompOptionTypeKey:
|
|
- case CompOptionTypeButton:
|
|
- case CompOptionTypeEdge:
|
|
- case CompOptionTypeBell:
|
|
- case CompOptionTypeMatch: {
|
|
- QStringList list;
|
|
-
|
|
- for (i = 0; i < o->value.list.nValue; i++)
|
|
- list += kconfigValueToString (object,
|
|
- o->value.list.type,
|
|
- &o->value.list.value[i]);
|
|
-
|
|
- kc->config->writeEntry (o->name, list);
|
|
- } break;
|
|
- case CompOptionTypeAction:
|
|
- case CompOptionTypeList:
|
|
- break;
|
|
- }
|
|
- } break;
|
|
- case CompOptionTypeAction:
|
|
- return;
|
|
- }
|
|
-
|
|
- if (!kc->syncHandle)
|
|
- kc->syncHandle = compAddTimeout (0, 0, kconfigRcSync, 0);
|
|
-}
|
|
-
|
|
-static Bool
|
|
-kconfigStringToValue (CompObject *object,
|
|
- QString str,
|
|
- CompOptionType type,
|
|
- CompOptionValue *value)
|
|
-{
|
|
- switch (type) {
|
|
- case CompOptionTypeBool:
|
|
- value->b = str.toInt () ? TRUE : FALSE;
|
|
- break;
|
|
- case CompOptionTypeFloat:
|
|
- value->f = str.toFloat ();
|
|
- break;
|
|
- case CompOptionTypeString:
|
|
- value->s = strdup (str.ascii ());
|
|
- if (!value->s)
|
|
- return FALSE;
|
|
- break;
|
|
- case CompOptionTypeColor:
|
|
- if (!stringToColor (str.ascii (), value->c))
|
|
- return FALSE;
|
|
- break;
|
|
- case CompOptionTypeKey:
|
|
- while (object && object->type != COMP_OBJECT_TYPE_DISPLAY)
|
|
- object = object->parent;
|
|
-
|
|
- if (!object)
|
|
- return FALSE;
|
|
-
|
|
- stringToKeyAction (GET_CORE_DISPLAY (object), str.ascii (),
|
|
- &value->action);
|
|
- break;
|
|
- case CompOptionTypeButton:
|
|
- while (object && object->type != COMP_OBJECT_TYPE_DISPLAY)
|
|
- object = object->parent;
|
|
-
|
|
- if (!object)
|
|
- return FALSE;
|
|
-
|
|
- stringToButtonAction (GET_CORE_DISPLAY (object), str.ascii (),
|
|
- &value->action);
|
|
- break;
|
|
- case CompOptionTypeEdge:
|
|
- value->action.edgeMask = stringToEdgeMask (str.ascii ());
|
|
- break;
|
|
- case CompOptionTypeBell:
|
|
- value->action.bell = str.toInt () ? TRUE : FALSE;
|
|
- break;
|
|
- case CompOptionTypeMatch:
|
|
- matchInit (&value->match);
|
|
- matchAddFromString (&value->match, str.ascii ());
|
|
- break;
|
|
- default:
|
|
- return FALSE;
|
|
- }
|
|
-
|
|
- return TRUE;
|
|
-}
|
|
-
|
|
-static void
|
|
-kconfigBoolToValue (bool b,
|
|
- CompOptionType type,
|
|
- CompOptionValue *value)
|
|
-{
|
|
- switch (type) {
|
|
- case CompOptionTypeBool:
|
|
- value->b = (b) ? TRUE : FALSE;
|
|
- break;
|
|
- case CompOptionTypeBell:
|
|
- value->action.bell = (b) ? TRUE : FALSE;
|
|
- default:
|
|
- break;
|
|
- }
|
|
-}
|
|
-
|
|
-static Bool
|
|
-kconfigReadOptionValue (CompObject *object,
|
|
- KConfig *config,
|
|
- CompOption *o,
|
|
- CompOptionValue *value)
|
|
-{
|
|
- compInitOptionValue (value);
|
|
-
|
|
- switch (o->type) {
|
|
- case CompOptionTypeBool:
|
|
- case CompOptionTypeBell:
|
|
- kconfigBoolToValue (config->readBoolEntry (o->name), o->type, value);
|
|
- break;
|
|
- case CompOptionTypeInt:
|
|
- value->i = config->readNumEntry (o->name);
|
|
- break;
|
|
- case CompOptionTypeFloat:
|
|
- value->f = config->readDoubleNumEntry (o->name);
|
|
- break;
|
|
- case CompOptionTypeString:
|
|
- case CompOptionTypeColor:
|
|
- case CompOptionTypeKey:
|
|
- case CompOptionTypeButton:
|
|
- case CompOptionTypeEdge:
|
|
- case CompOptionTypeMatch:
|
|
- if (!kconfigStringToValue (object,
|
|
- config->readEntry (o->name), o->type,
|
|
- value))
|
|
- return FALSE;
|
|
- break;
|
|
- case CompOptionTypeList: {
|
|
- int n, i;
|
|
-
|
|
- value->list.value = NULL;
|
|
- value->list.nValue = 0;
|
|
- value->list.type = o->value.list.type;
|
|
-
|
|
- switch (o->value.list.type) {
|
|
- case CompOptionTypeInt: {
|
|
- QValueList< int > list;
|
|
-
|
|
- list = config->readIntListEntry (o->name);
|
|
-
|
|
- n = list.size ();
|
|
- if (n)
|
|
- {
|
|
- value->list.value = (CompOptionValue *)
|
|
- malloc (sizeof (CompOptionValue) * n);
|
|
- if (value->list.value)
|
|
- {
|
|
- for (i = 0; i < n; i++)
|
|
- value->list.value[i].i = list[i];
|
|
-
|
|
- value->list.nValue = n;
|
|
- }
|
|
- }
|
|
- } break;
|
|
- case CompOptionTypeBool:
|
|
- case CompOptionTypeFloat:
|
|
- case CompOptionTypeString:
|
|
- case CompOptionTypeColor:
|
|
- case CompOptionTypeKey:
|
|
- case CompOptionTypeButton:
|
|
- case CompOptionTypeEdge:
|
|
- case CompOptionTypeBell:
|
|
- case CompOptionTypeMatch: {
|
|
- QStringList list;
|
|
-
|
|
- list = config->readListEntry (o->name);
|
|
-
|
|
- n = list.size ();
|
|
- if (n)
|
|
- {
|
|
- value->list.value = (CompOptionValue *)
|
|
- malloc (sizeof (CompOptionValue) * n);
|
|
- if (value->list.value)
|
|
- {
|
|
- for (i = 0; i < n; i++)
|
|
- {
|
|
- if (!kconfigStringToValue (object,
|
|
- list[i],
|
|
- value->list.type,
|
|
- &value->list.value[i]))
|
|
- break;
|
|
-
|
|
- value->list.nValue++;
|
|
- }
|
|
-
|
|
- if (value->list.nValue != n)
|
|
- {
|
|
- compFiniOptionValue (value, o->type);
|
|
- return FALSE;
|
|
- }
|
|
- }
|
|
- }
|
|
- } break;
|
|
- case CompOptionTypeList:
|
|
- case CompOptionTypeAction:
|
|
- return FALSE;
|
|
- }
|
|
- } break;
|
|
- case CompOptionTypeAction:
|
|
- return FALSE;
|
|
- break;
|
|
- }
|
|
-
|
|
- return TRUE;
|
|
-}
|
|
-
|
|
-static void
|
|
-kconfigGetOption (CompObject *object,
|
|
- CompOption *o,
|
|
- const char *plugin)
|
|
-{
|
|
- QString group (QString (plugin) + "_" +
|
|
- kconfigObjectString (object));
|
|
- const QString name (o->name);
|
|
-
|
|
- KCONFIG_CORE (&core);
|
|
-
|
|
- kc->config->setGroup (group);
|
|
-
|
|
- if (kc->config->hasKey (name))
|
|
- {
|
|
- CompOptionValue value;
|
|
-
|
|
- if (kconfigReadOptionValue (object, kc->config, o, &value))
|
|
- {
|
|
- (*core.setOptionForPlugin) (object, plugin, o->name, &value);
|
|
- compFiniOptionValue (&value, o->type);
|
|
- }
|
|
- }
|
|
- else
|
|
- {
|
|
- kconfigSetOption (object, o, plugin);
|
|
- }
|
|
-}
|
|
-
|
|
-static CompBool
|
|
-kconfigReloadObjectTree (CompObject *object,
|
|
- void *closure);
|
|
-
|
|
-static CompBool
|
|
-kconfigReloadObjectsWithType (CompObjectType type,
|
|
- CompObject *parent,
|
|
- void *closure)
|
|
-{
|
|
- compObjectForEach (parent, type, kconfigReloadObjectTree, closure);
|
|
-
|
|
- return TRUE;
|
|
-}
|
|
-
|
|
-static CompBool
|
|
-kconfigReloadObjectTree (CompObject *object,
|
|
- void *closure)
|
|
-{
|
|
- CompPlugin *p = (CompPlugin *) closure;
|
|
- CompOption *option;
|
|
- int nOption;
|
|
-
|
|
- option = (*p->vTable->getObjectOptions) (p, object, &nOption);
|
|
- while (nOption--)
|
|
- kconfigGetOption (object, option++, p->vTable->name);
|
|
-
|
|
- compObjectForEachType (object, kconfigReloadObjectsWithType, closure);
|
|
-
|
|
- return TRUE;
|
|
-}
|
|
-
|
|
-static Bool
|
|
-kconfigRcReload (void *closure)
|
|
-{
|
|
- CompPlugin *p;
|
|
-
|
|
- KCONFIG_CORE (&core);
|
|
-
|
|
- kc->config->reparseConfiguration ();
|
|
-
|
|
- for (p = getPlugins (); p; p = p->next)
|
|
- {
|
|
- if (!p->vTable->getObjectOptions)
|
|
- continue;
|
|
-
|
|
- kconfigReloadObjectTree (&core.base, (void *) p);
|
|
- }
|
|
-
|
|
- kc->reloadHandle = 0;
|
|
-
|
|
- return FALSE;
|
|
-}
|
|
-
|
|
-static void
|
|
-kconfigRcChanged (const char *name,
|
|
- void *closure)
|
|
-{
|
|
- if (strcmp (name, COMPIZ_KCONFIG_RC) == 0)
|
|
- {
|
|
- KCONFIG_CORE (&core);
|
|
-
|
|
- if (!kc->reloadHandle)
|
|
- kc->reloadHandle = compAddTimeout (0, 0, kconfigRcReload, closure);
|
|
- }
|
|
-}
|
|
-
|
|
-static CompBool
|
|
-kconfigSetOptionForPlugin (CompObject *object,
|
|
- const char *plugin,
|
|
- const char *name,
|
|
- CompOptionValue *value)
|
|
-{
|
|
- CompBool status;
|
|
-
|
|
- KCONFIG_CORE (&core);
|
|
-
|
|
- UNWRAP (kc, &core, setOptionForPlugin);
|
|
- status = (*core.setOptionForPlugin) (object, plugin, name, value);
|
|
- WRAP (kc, &core, setOptionForPlugin, kconfigSetOptionForPlugin);
|
|
-
|
|
- if (status && !kc->reloadHandle)
|
|
- {
|
|
- CompPlugin *p;
|
|
-
|
|
- p = findActivePlugin (plugin);
|
|
- if (p && p->vTable->getObjectOptions)
|
|
- {
|
|
- CompOption *option;
|
|
- int nOption;
|
|
-
|
|
- option = (*p->vTable->getObjectOptions) (p, object, &nOption);
|
|
- option = compFindOption (option, nOption, name, 0);
|
|
- if (option)
|
|
- kconfigSetOption (object, option, p->vTable->name);
|
|
- }
|
|
- }
|
|
-
|
|
- return status;
|
|
-}
|
|
-
|
|
-static CompBool
|
|
-kconfigInitPluginForObject (CompPlugin *p,
|
|
- CompObject *o)
|
|
-{
|
|
- CompBool status;
|
|
-
|
|
- KCONFIG_CORE (&core);
|
|
-
|
|
- UNWRAP (kc, &core, initPluginForObject);
|
|
- status = (*core.initPluginForObject) (p, o);
|
|
- WRAP (kc, &core, initPluginForObject, kconfigInitPluginForObject);
|
|
-
|
|
- if (status && p->vTable->getObjectOptions)
|
|
- {
|
|
- CompOption *option;
|
|
- int nOption;
|
|
-
|
|
- option = (*p->vTable->getObjectOptions) (p, o, &nOption);
|
|
- while (nOption--)
|
|
- kconfigGetOption (o, option++, p->vTable->name);
|
|
- }
|
|
-
|
|
- return status;
|
|
-}
|
|
-
|
|
-static Bool
|
|
-kconfigInitCore (CompPlugin *p,
|
|
- CompCore *c)
|
|
-{
|
|
- KconfigCore *kc;
|
|
- QString dir;
|
|
-
|
|
- if (!checkPluginABI ("core", CORE_ABIVERSION))
|
|
- return FALSE;
|
|
-
|
|
- kc = new KconfigCore;
|
|
- if (!kc)
|
|
- return FALSE;
|
|
-
|
|
- kc->config = new KConfig (COMPIZ_KCONFIG_RC);
|
|
- if (!kc->config)
|
|
- {
|
|
- delete kc;
|
|
- return FALSE;
|
|
- }
|
|
-
|
|
- kc->reloadHandle = compAddTimeout (0, 0, kconfigRcReload, 0);
|
|
- kc->syncHandle = 0;
|
|
- kc->fileWatch = 0;
|
|
-
|
|
- dir = KGlobal::dirs ()->saveLocation ("config", QString::null, false);
|
|
-
|
|
- if (QFile::exists (dir))
|
|
- {
|
|
- kc->fileWatch = addFileWatch (dir.ascii (), ~0, kconfigRcChanged, 0);
|
|
- }
|
|
- else
|
|
- {
|
|
- compLogMessage ("kconfig", CompLogLevelWarn, "Bad access \"%s\"",
|
|
- dir.ascii ());
|
|
- }
|
|
-
|
|
- WRAP (kc, c, initPluginForObject, kconfigInitPluginForObject);
|
|
- WRAP (kc, c, setOptionForPlugin, kconfigSetOptionForPlugin);
|
|
-
|
|
- c->base.privates[corePrivateIndex].ptr = kc;
|
|
-
|
|
- return TRUE;
|
|
-}
|
|
-
|
|
-static void
|
|
-kconfigFiniCore (CompPlugin *p,
|
|
- CompCore *c)
|
|
-{
|
|
- KCONFIG_CORE (c);
|
|
-
|
|
- UNWRAP (kc, c, initPluginForObject);
|
|
- UNWRAP (kc, c, setOptionForPlugin);
|
|
-
|
|
- if (kc->reloadHandle)
|
|
- compRemoveTimeout (kc->reloadHandle);
|
|
-
|
|
- if (kc->syncHandle)
|
|
- {
|
|
- compRemoveTimeout (kc->syncHandle);
|
|
- kconfigRcSync (0);
|
|
- }
|
|
-
|
|
- if (kc->fileWatch)
|
|
- removeFileWatch (kc->fileWatch);
|
|
-
|
|
- delete kc->config;
|
|
- delete kc;
|
|
-}
|
|
-
|
|
-static CompBool
|
|
-kconfigInitObject (CompPlugin *p,
|
|
- CompObject *o)
|
|
-{
|
|
- static InitPluginObjectProc dispTab[] = {
|
|
- (InitPluginObjectProc) kconfigInitCore
|
|
- };
|
|
-
|
|
- RETURN_DISPATCH (o, dispTab, ARRAY_SIZE (dispTab), TRUE, (p, o));
|
|
-}
|
|
-
|
|
-static void
|
|
-kconfigFiniObject (CompPlugin *p,
|
|
- CompObject *o)
|
|
-{
|
|
- static FiniPluginObjectProc dispTab[] = {
|
|
- (FiniPluginObjectProc) kconfigFiniCore
|
|
- };
|
|
-
|
|
- DISPATCH (o, dispTab, ARRAY_SIZE (dispTab), (p, o));
|
|
-}
|
|
-
|
|
-static Bool
|
|
-kconfigInit (CompPlugin *p)
|
|
-{
|
|
- if (!compInitPluginMetadataFromInfo (&kconfigMetadata, p->vTable->name,
|
|
- 0, 0, 0, 0))
|
|
- return FALSE;
|
|
-
|
|
- corePrivateIndex = allocateCorePrivateIndex ();
|
|
- if (corePrivateIndex < 0)
|
|
- {
|
|
- compFiniMetadata (&kconfigMetadata);
|
|
- return FALSE;
|
|
- }
|
|
-
|
|
- kInstance = new KInstance ("compiz-kconfig");
|
|
- if (!kInstance)
|
|
- {
|
|
- freeCorePrivateIndex (corePrivateIndex);
|
|
- compFiniMetadata (&kconfigMetadata);
|
|
- return FALSE;
|
|
- }
|
|
-
|
|
- compAddMetadataFromFile (&kconfigMetadata, p->vTable->name);
|
|
-
|
|
- return TRUE;
|
|
-}
|
|
-
|
|
-static void
|
|
-kconfigFini (CompPlugin *p)
|
|
-{
|
|
- delete kInstance;
|
|
-
|
|
- freeCorePrivateIndex (corePrivateIndex);
|
|
- compFiniMetadata (&kconfigMetadata);
|
|
-}
|
|
-
|
|
-static CompMetadata *
|
|
-kconfigGetMetadata (CompPlugin *plugin)
|
|
-{
|
|
- return &kconfigMetadata;
|
|
-}
|
|
-
|
|
-CompPluginVTable kconfigVTable = {
|
|
- "kconfig",
|
|
- kconfigGetMetadata,
|
|
- kconfigInit,
|
|
- kconfigFini,
|
|
- kconfigInitObject,
|
|
- kconfigFiniObject,
|
|
- 0, /* GetObjectOptions */
|
|
- 0 /* SetObjectOption */
|
|
-};
|
|
-
|
|
-CompPluginVTable *
|
|
-getCompPluginInfo20070830 (void)
|
|
-{
|
|
- return &kconfigVTable;
|
|
-}
|
|
diff -uprN compiz-0.8.8-orig/plugins/Makefile.am compiz-0.8.8/plugins/Makefile.am
|
|
--- compiz-0.8.8-orig/plugins/Makefile.am 2013-04-19 11:25:07.365310000 +0200
|
|
+++ compiz-0.8.8/plugins/Makefile.am 2013-04-19 11:57:09.395494418 +0200
|
|
@@ -108,13 +108,6 @@ libmateconf_la_SOURCES = mateconf.c
|
|
libmateconf_module = libmateconf.la
|
|
endif
|
|
|
|
-if USE_KCONFIG
|
|
-libkconfig_la_LDFLAGS = -module -avoid-version -no-undefined
|
|
-libkconfig_la_LIBADD = @KCONFIG_LIBS@
|
|
-libkconfig_la_SOURCES = kconfig.cpp
|
|
-libkconfig_module = libkconfig.la
|
|
-endif
|
|
-
|
|
if DBUS_PLUGIN
|
|
libdbus_la_LDFLAGS = -module -avoid-version -no-undefined
|
|
libdbus_la_LIBADD = @DBUS_LIBS@
|
|
@@ -141,7 +134,6 @@ INCLUDES = \
|
|
@LIBRSVG_CFLAGS@ \
|
|
@ANNOTATE_CFLAGS@ \
|
|
@MATECONF_CFLAGS@ \
|
|
- @KCONFIG_CFLAGS@ \
|
|
@DBUS_CFLAGS@ \
|
|
@GLIB_CFLAGS@ \
|
|
@FUSE_CFLAGS@ \
|
|
@@ -160,7 +152,6 @@ moduledir = $(plugindir)
|
|
module_LTLIBRARIES = \
|
|
$(libglib_module) \
|
|
$(libmateconf_module) \
|
|
- $(libkconfig_module) \
|
|
libdecoration.la \
|
|
libwobbly.la \
|
|
libfade.la \
|