diff options
| author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 | 
|---|---|---|
| committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 | 
| commit | 4aed2c8219774f5d797760606b8489a92ddc5163 (patch) | |
| tree | 3f8c130f7d269626bf6a9447407ef6c35954426a /kwin/killwindow.cpp | |
| download | tdebase-4aed2c8219774f5d797760606b8489a92ddc5163.tar.gz tdebase-4aed2c8219774f5d797760606b8489a92ddc5163.zip | |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebase@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kwin/killwindow.cpp')
| -rw-r--r-- | kwin/killwindow.cpp | 112 | 
1 files changed, 112 insertions, 0 deletions
| diff --git a/kwin/killwindow.cpp b/kwin/killwindow.cpp new file mode 100644 index 000000000..6d0152349 --- /dev/null +++ b/kwin/killwindow.cpp @@ -0,0 +1,112 @@ +/***************************************************************** + KWin - the KDE window manager + This file is part of the KDE project. + +Copyright (C) 1999, 2000 Matthias Ettrich <ettrich@kde.org> +Copyright (C) 2003 Lubos Lunak <l.lunak@kde.org> + +You can Freely distribute this program under the GNU General Public +License. See the file "COPYING" for the exact licensing terms. +******************************************************************/ + +//#ifndef QT_CLEAN_NAMESPACE +//#define QT_CLEAN_NAMESPACE +//#endif +#include "killwindow.h" +#include <qcursor.h> +#include <X11/Xlib.h> +#include <X11/keysym.h> +#include <X11/keysymdef.h> +#include <X11/cursorfont.h> + +namespace KWinInternal +{ + +KillWindow::KillWindow( Workspace* ws ) +    : workspace( ws ) +    { +    } + +KillWindow::~KillWindow() +    { +    } + +void KillWindow::start()  +    { +    static Cursor kill_cursor = 0; +    if (!kill_cursor) +        kill_cursor = XCreateFontCursor(qt_xdisplay(), XC_pirate); + +    if (XGrabPointer(qt_xdisplay(), qt_xrootwin(), False, +                     ButtonPressMask | ButtonReleaseMask | +                     PointerMotionMask | +                     EnterWindowMask | LeaveWindowMask, +                     GrabModeAsync, GrabModeAsync, None, +                     kill_cursor, CurrentTime) == GrabSuccess)  +        { +        XGrabKeyboard(qt_xdisplay(), qt_xrootwin(), False, +                      GrabModeAsync, GrabModeAsync, CurrentTime); + +        XEvent ev; +        int return_pressed  = 0; +        int escape_pressed  = 0; +        int button_released = 0; + +        grabXServer(); + +        while (!return_pressed && !escape_pressed && !button_released)  +            { +            XMaskEvent(qt_xdisplay(), KeyPressMask | ButtonPressMask | +                       ButtonReleaseMask | PointerMotionMask, &ev); + +            if (ev.type == KeyPress)     +                { +                int kc = XKeycodeToKeysym(qt_xdisplay(), ev.xkey.keycode, 0); +                int mx = 0; +                int my = 0; +                return_pressed = (kc == XK_Return) || (kc == XK_space); +                escape_pressed = (kc == XK_Escape); +                if (kc == XK_Left)  mx = -10; +                if (kc == XK_Right) mx = 10; +                if (kc == XK_Up)    my = -10; +                if (kc == XK_Down)  my = 10; +                if (ev.xkey.state & ControlMask)  +                    { +                    mx /= 10; +                    my /= 10; +                    } +                QCursor::setPos(QCursor::pos()+QPoint(mx, my)); +                } + +            if (ev.type == ButtonRelease)  +                { +                button_released = (ev.xbutton.button == Button1); +                if ( ev.xbutton.button == Button3 )  +                    { +                    escape_pressed = TRUE; +                    break; +                    } +                if( ev.xbutton.button == Button1 || ev.xbutton.button == Button2 ) +                    workspace->killWindowId(ev.xbutton.subwindow); +                } +            continue; +            } +        if (return_pressed)  +            { +            Window root, child; +            int dummy1, dummy2, dummy3, dummy4; +            unsigned int dummy5; +            if( XQueryPointer( qt_xdisplay(), qt_xrootwin(), &root, &child, +                &dummy1, &dummy2, &dummy3, &dummy4, &dummy5 ) == true +                && child != None ) +                workspace->killWindowId( child ); +            } + +        ungrabXServer(); + +        XUngrabKeyboard(qt_xdisplay(), CurrentTime); +        XUngrabPointer(qt_xdisplay(), CurrentTime); +        } +    } + +} // namespace | 
