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