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 - * Copyright © 2006 Volker Krause - * - * 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 - */ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "decorator.h" -#include "options.h" -#include "utils.h" - -#include - -#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 ::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 ::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 ::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 ::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 (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 (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 (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 (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 (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 (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 ::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 - * Copyright © 2006 Volker Krause - * - * 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 - */ - -#ifndef _DECORATOR_H -#define _DECORATOR_H - -#include - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include - -#include - -#define DBUS_API_SUBJECT_TO_CHANGE -#include - -#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 mClients; - QMap mFrames; - QMap 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 - -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 - * Copyright © 2006 Volker Krause - * - * 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 - */ - -#include -#include - -#include -#include -#include -#include - -#include "decorator.h" - -static const KCmdLineOptions options[] = { - { "replace", "Replace existing window decorator", 0 }, - { "sm-disable", "Disable connection to session manager", 0 }, - { "opacity ", "Decoration opacity", "0.75" }, - { "no-opacity-shade", "No decoration opacity shading", 0 }, - { "active-opacity ", "Active decoration opacity", "1.0" }, - { "no-active-opacity-shade", "No active decoration opacity shading", 0 }, - { "blur ", "Blur type", "none" }, - KCmdLineLastOption -}; - -#include -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 - * Copyright © 2006 Volker Krause - * - * 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 - */ - -#include "options.h" - -#include -#include - -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 - * Copyright © 2006 Volker Krause - * - * 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 - */ - -#ifndef _OPTIONS_H -#define _OPTIONS_H - -#include - -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 - * Copyright © 2006 Volker Krause - * - * 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 - */ - -#include "utils.h" - -#include - -#include -#include -#include - -#include - -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 (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 (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 - * Copyright © 2006 Volker Krause - * - * 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 - */ - -#ifndef _UTILS_H -#define _UTILS_H - -#include -#include -#include - -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 - * Copyright © 2006 Volker Krause - * - * 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 - */ - -#include "window.h" -#include "decorator.h" -#include "options.h" -#include "utils.h" - -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -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 (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 (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 rects = region->rects (); - QMemArray ::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 (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 (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 - * Copyright © 2006 Volker Krause - * - * 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 - */ - -#ifndef _WINDOW_H -#define _WINDOW_H - -#include - -#include -#include - -#include - -#include - -#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 - * Copyright © 2006 Novell, Inc. - * Copyright © 2006 Volker Krause - * - * 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 - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include "decorator.h" -#include "options.h" -#include "utils.h" - -#include "kwinadaptor.h" - -#include - -#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 ::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 ::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 stringReply; - QDBusReply doubleReply; - QDBusReply 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 ::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 (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 (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 (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 (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 ::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 - * Copyright © 2006 Novell, Inc. - * Copyright © 2006 Volker Krause - * - * 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 - */ - -#ifndef _DECORATOR_H -#define _DECORATOR_H - -#include - -#include -#include -#include - -#include - -#include -#include -#include - -#include - -#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 mClients; - QMap 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 - -****************************************************************** - -This file is part of the KDE project. - -Copyright (C) 1999, 2000 Daniel M. Duley -Copyright (C) 2003 Lubos Lunak - -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 -#include -#include -#include -#include -#include - -#include -#include - -#include - -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 - -****************************************************************** - -This file is part of the KDE project. - -Copyright (C) 1999, 2000 Daniel M. Duley -Copyright (C) 2003 Lubos Lunak - -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 -#include - -#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 - * Copyright © 2006 Novell, Inc. - * Copyright © 2006 Volker Krause - * - * 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 - */ - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "decorator.h" -#include "utils.h" - -#include -#include - - - -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 ", 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 - * Copyright © 2006 Novell, Inc. - * Copyright © 2006 Volker Krause - * - * 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 - */ - -#include "options.h" - -#include -#include -#include - -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 - * Copyright © 2006 Novell, Inc. - * Copyright © 2006 Volker Krause - * - * 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 - */ - -#ifndef _OPTIONS_H -#define _OPTIONS_H - -#include - -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 @@ - - - - - - - - - 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 - -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 -#include -#include - -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 - -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 -#include -#include - -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 - * - * 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 - */ - -#include "switcher.h" -#include "utils.h" -#include "decorator.h" - -#include -#include -#include -#include - -#include - -#include -#include - -#include - -#include -#include - -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 - * - * 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 - */ - -#ifndef _SWITCHER_H -#define _SWITCHER_H - -#include -#include -#include -#include -#include - -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 - * Copyright © 2006 Novell, Inc. - * Copyright © 2006 Volker Krause - * - * 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 - */ - -#include "utils.h" - -#include -#include -#include - -#include -#include - -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 (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 (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 - * Copyright © 2006 Novell, Inc. - * Copyright © 2006 Volker Krause - * - * 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 - */ - -#ifndef _UTILS_H -#define _UTILS_H - -#include -#include -#include - -#include - -#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 - * Copyright © 2006 Novell, Inc. - * Copyright © 2006 Volker Krause - * - * 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 - */ - -#include "window.h" -#include "decorator.h" -#include "options.h" -#include "utils.h" - -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#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 - (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 - (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 (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 (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 (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 (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 (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 (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 (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 -KWD::Window::clientGroupItems () const -{ - QList 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(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 children = widget->children (); - - foreach (QObject *obj, children) - { - QWidget *child; - - if (!obj->isWidgetType ()) - continue; - - child = static_cast (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 (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 (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 - * Copyright © 2006 Novell, Inc. - * Copyright © 2006 Volker Krause - * - * 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 - */ - -#ifndef _WINDOW_H -#define _WINDOW_H - -#include -#include -#include - -#include -#include -#include - -#include - -#include - -#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 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 @@ - - - - - - - - - - - - - - - - - - - - core - - - _ - - - - - - $(screen) - - - - - - - - - - - - - - - - - - - - - _ - - - - - - - - - - - - - - - - - - - - - - - - - - #000000ff - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Bool - - - Int - - - Double - - - Bool - - - - - Int - - - String - - - List - - - String - - - - - - - ( - - - - - - - - - - match - - - ) - - - - - - - - - - - = - - , - - - - - - - - - - , - - - - - - - - - - , - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ff - - - - - - - - - - - - - 0000 - - - - - - - - - - - - - - 00 - - - - - - - - - - - - - - - - - - - - - - | - - - - - - 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 @@ - - - <_short>Kconfig - <_long>Kconfig Control Backend - - 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 @@ - - - - - - - - - - - - - - - [ - - - - - - - - - - ] - - - = - - - - - - - - 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 -#include -#include -#include -#include - -#include - -#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 \