1/* 2 * Functions related to captive-mode ctwm. 3 */ 4 5#include "ctwm.h" 6 7#include <stdlib.h> 8 9#include "captive.h" 10#include "cursor.h" 11#include "events.h" 12#include "functions_internal.h" 13#include "screen.h" 14 15 16/* 17 * Pulling a window into the ctwm it was invoked from. 18 */ 19DFHANDLER(adoptwindow) 20{ 21 AdoptWindow(); 22} 23 24 25/* 26 * Interactively moving a window between ctwm's. 27 */ 28DFHANDLER(hypermove) 29{ 30 bool cont = true; 31 Window root = RootWindow(dpy, Scr->screen); 32 Cursor cursor; 33 Window captive_root; 34 35 if(tmp_win->iswinbox || tmp_win->iswspmgr) { 36 XBell(dpy, 0); 37 return; 38 } 39 40 { 41 CaptiveCTWM cctwm = GetCaptiveCTWMUnderPointer(); 42 cursor = MakeStringCursor(cctwm.name); 43 free(cctwm.name); 44 captive_root = cctwm.root; 45 } 46 47 XGrabPointer(dpy, root, True, 48 ButtonPressMask | ButtonMotionMask | ButtonReleaseMask, 49 GrabModeAsync, GrabModeAsync, root, cursor, CurrentTime); 50 while(cont) { 51 XMaskEvent(dpy, ButtonPressMask | ButtonMotionMask | 52 ButtonReleaseMask, &Event); 53 switch(Event.xany.type) { 54 case ButtonPress: 55 cont = false; 56 break; 57 58 case ButtonRelease: { 59 CaptiveCTWM cctwm = GetCaptiveCTWMUnderPointer(); 60 cont = false; 61 free(cctwm.name); 62 if(cctwm.root == Scr->Root) { 63 break; 64 } 65 if(cctwm.root == Scr->XineramaRoot) { 66 break; 67 } 68 SetNoRedirect(tmp_win->w); 69 XUngrabButton(dpy, AnyButton, AnyModifier, tmp_win->w); 70 XReparentWindow(dpy, tmp_win->w, cctwm.root, 0, 0); 71 XMapWindow(dpy, tmp_win->w); 72 break; 73 } 74 75 case MotionNotify: { 76 CaptiveCTWM cctwm = GetCaptiveCTWMUnderPointer(); 77 if(cctwm.root != captive_root) { 78 unsigned int chmask; 79 80 XFreeCursor(dpy, cursor); 81 cursor = MakeStringCursor(cctwm.name); 82 captive_root = cctwm.root; 83 84 chmask = (ButtonPressMask | ButtonMotionMask 85 | ButtonReleaseMask); 86 XChangeActivePointerGrab(dpy, chmask, 87 cursor, CurrentTime); 88 } 89 free(cctwm.name); 90 break; 91 } 92 } 93 } 94 95 ButtonPressed = -1; 96 XUngrabPointer(dpy, CurrentTime); 97 XFreeCursor(dpy, cursor); 98 99 return; 100} 101