summaryrefslogtreecommitdiffstats
path: root/kwin/killwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kwin/killwindow.cpp')
-rw-r--r--kwin/killwindow.cpp112
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