killwindow.cpp00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "killwindow.h"
00016 #include <qcursor.h>
00017 #include <X11/Xlib.h>
00018 #include <X11/keysym.h>
00019 #include <X11/keysymdef.h>
00020 #include <X11/cursorfont.h>
00021
00022 namespace KWinInternal
00023 {
00024
00025 KillWindow::KillWindow( Workspace* ws )
00026 : workspace( ws )
00027 {
00028 }
00029
00030 KillWindow::~KillWindow()
00031 {
00032 }
00033
00034 void KillWindow::start()
00035 {
00036 static Cursor kill_cursor = 0;
00037 if (!kill_cursor)
00038 kill_cursor = XCreateFontCursor(qt_xdisplay(), XC_pirate);
00039
00040 if (XGrabPointer(qt_xdisplay(), qt_xrootwin(), False,
00041 ButtonPressMask | ButtonReleaseMask |
00042 PointerMotionMask |
00043 EnterWindowMask | LeaveWindowMask,
00044 GrabModeAsync, GrabModeAsync, None,
00045 kill_cursor, CurrentTime) == GrabSuccess)
00046 {
00047 XGrabKeyboard(qt_xdisplay(), qt_xrootwin(), False,
00048 GrabModeAsync, GrabModeAsync, CurrentTime);
00049
00050 XEvent ev;
00051 int return_pressed = 0;
00052 int escape_pressed = 0;
00053 int button_released = 0;
00054
00055 grabXServer();
00056
00057 while (!return_pressed && !escape_pressed && !button_released)
00058 {
00059 XMaskEvent(qt_xdisplay(), KeyPressMask | ButtonPressMask |
00060 ButtonReleaseMask | PointerMotionMask, &ev);
00061
00062 if (ev.type == KeyPress)
00063 {
00064 int kc = XKeycodeToKeysym(qt_xdisplay(), ev.xkey.keycode, 0);
00065 int mx = 0;
00066 int my = 0;
00067 return_pressed = (kc == XK_Return) || (kc == XK_space);
00068 escape_pressed = (kc == XK_Escape);
00069 if (kc == XK_Left) mx = -10;
00070 if (kc == XK_Right) mx = 10;
00071 if (kc == XK_Up) my = -10;
00072 if (kc == XK_Down) my = 10;
00073 if (ev.xkey.state & ControlMask)
00074 {
00075 mx /= 10;
00076 my /= 10;
00077 }
00078 QCursor::setPos(QCursor::pos()+QPoint(mx, my));
00079 }
00080
00081 if (ev.type == ButtonRelease)
00082 {
00083 button_released = (ev.xbutton.button == Button1);
00084 if ( ev.xbutton.button == Button3 )
00085 {
00086 escape_pressed = TRUE;
00087 break;
00088 }
00089 if( ev.xbutton.button == Button1 || ev.xbutton.button == Button2 )
00090 workspace->killWindowId(ev.xbutton.subwindow);
00091 }
00092 continue;
00093 }
00094 if (return_pressed)
00095 {
00096 Window root, child;
00097 int dummy1, dummy2, dummy3, dummy4;
00098 unsigned int dummy5;
00099 if( XQueryPointer( qt_xdisplay(), qt_xrootwin(), &root, &child,
00100 &dummy1, &dummy2, &dummy3, &dummy4, &dummy5 ) == true
00101 && child != None )
00102 workspace->killWindowId( child );
00103 }
00104
00105 ungrabXServer();
00106
00107 XUngrabKeyboard(qt_xdisplay(), CurrentTime);
00108 XUngrabPointer(qt_xdisplay(), CurrentTime);
00109 }
00110 }
00111
00112 }
|