killwindow.cpp
00001 /***************************************************************** 00002 KWin - the KDE window manager 00003 This file is part of the KDE project. 00004 00005 Copyright (C) 1999, 2000 Matthias Ettrich <ettrich@kde.org> 00006 Copyright (C) 2003 Lubos Lunak <l.lunak@kde.org> 00007 00008 You can Freely distribute this program under the GNU General Public 00009 License. See the file "COPYING" for the exact licensing terms. 00010 ******************************************************************/ 00011 00012 //#ifndef QT_CLEAN_NAMESPACE 00013 //#define QT_CLEAN_NAMESPACE 00014 //#endif 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 } // namespace