diff --git a/killwindow.cpp b/killwindow.cpp new file mode 100644 index 0000000000..df6b447061 --- /dev/null +++ b/killwindow.cpp @@ -0,0 +1,81 @@ +/***************************************************************** +kwin - the KDE window manager + +Copyright (C) 1999, 2000 Matthias Ettrich +******************************************************************/ + +#define QT_CLEAN_NAMESPACE +#include "killwindow.h" +#include +#include +#include +#include + +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; + + XGrabServer(qt_xdisplay()); + + 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); + workspace->killWindowAtPosition(ev.xbutton.x_root, ev.xbutton.y_root); + } + continue; + } + if (return_pressed) + workspace->killWindowAtPosition(QCursor::pos().x(), QCursor::pos().y()); + + XUngrabServer(qt_xdisplay()); + + XUngrabKeyboard(qt_xdisplay(), CurrentTime); + XUngrabPointer(qt_xdisplay(), CurrentTime); + } +} +