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