62 unsigned long nitems, bytesafter;
70 XrmDatabase db = NULL;
79 char **cliargv = NULL;
83 if(!XGetCommand(
dpy, window, &cliargv, &cliargc)) {
88 XrmParseCommand(&db,
table, 1,
"ctwm", &cliargc, cliargv);
90 XFreeStringList(cliargv);
106 status = XrmGetResource(db,
"ctwm.redirect",
"Ctwm.Redirect", &str_type,
108 if((status == True) && (value.size != 0)) {
111 Atom XA_WM_CTWM_ROOT_name;
114 asprintf(&atomname,
"WM_CTWM_ROOT_%s", value.addr);
121 XA_WM_CTWM_ROOT_name = XInternAtom(
dpy, atomname, True);
130 if(XA_WM_CTWM_ROOT_name != None) {
131 gpret = XGetWindowProperty(
dpy,
Scr->Root, XA_WM_CTWM_ROOT_name,
132 0L, 1L, False, AnyPropertyType,
133 &actual_type, &actual_format,
134 &nitems, &bytesafter,
135 (
unsigned char **)&prop);
143 && actual_type == XA_WINDOW && actual_format == 32 &&
145 Window newroot = *prop;
146 XWindowAttributes dummy_wa;
148 if(XGetWindowAttributes(
dpy, newroot, &dummy_wa)) {
150 XReparentWindow(
dpy, window, newroot, 0, 0);
151 XMapWindow(
dpy, window);
167 status = XrmGetResource(db,
"ctwm.rootWindow",
"Ctwm.RootWindow", &str_type,
169 if((status == True) && (value.size != 0)) {
171 unsigned long int scanned;
174 if(sscanf(rootw,
"%lx", &scanned) == 1) {
175 Window newroot = scanned;
176 XWindowAttributes dummy_wa;
178 if(XGetWindowAttributes(
dpy, newroot, &dummy_wa)) {
179 XReparentWindow(
dpy, window, newroot, 0, 0);
180 XMapWindow(
dpy, window);
187 XrmDestroyDatabase(db);
202 unsigned char *prop, *p;
203 unsigned long bytesafter;
212 root = RootWindow(
dpy, scrnum);
213 if(XGetWindowProperty(
dpy,
root, XA_WM_CTWMSLIST, 0L, 512,
214 False, XA_STRING, &actual_type, &actual_format, &
len,
215 &bytesafter, &prop) != Success) {
226 l += strlen((
char *)p) + 1;
227 p += strlen((
char *)p) + 1;
230 ret = calloc(count + 1,
sizeof(
char *));
236 ret [i++] = strdup((
char *) p);
237 l += strlen((
char *)p) + 1;
238 p += strlen((
char *)p) + 1;
311 char **clist, **cl, **newclist;
314 int scrnum =
Scr->screen;
315 Window croot =
Scr->Root;
319 for(i = 0; i < 32; i++) {
337 if(!strncmp(*cl,
"ctwm-", 5)) {
339 r = sscanf(*cl,
"ctwm-%d", &n);
344 if((n < 0) || (n > 31)) {
359 if(!strcmp(*cl, cptname)) {
360 fprintf(stderr,
"A captive ctwm with name %s is already running\n",
373 for(i = 0; i < 32; i++) {
379 fprintf(stderr,
"Cannot find a suitable name for captive ctwm\n");
382 asprintf(&rcname,
"ctwm-%d", i);
385 rcname = strdup(cptname);
387 fprintf(stderr,
"strdup() for rcname failed!\n");
394 newclist = calloc(count + 2,
sizeof(
char *));
395 for(i = 0; i < count; i++) {
396 newclist[i] = strdup(clist[i]);
398 newclist[count] = strdup(rcname);
399 newclist[count + 1] = NULL;
405 root = RootWindow(
dpy, scrnum);
406 asprintf(&atomname,
"WM_CTWM_ROOT_%s", rcname);
410 PropModeReplace, (
unsigned char *) &croot, 1);
526 unsigned long bytesafter;
531 if(XGetWindowProperty(
dpy, window, XA_WM_CTWM_ROOT, 0L, 1L,
532 False, XA_WINDOW, &actual_type, &actual_format, &
len,
533 &bytesafter, (
unsigned char **)&prop) != Success) {
619 unsigned long bytesafter;
624 if(XGetWindowProperty(
dpy, window, XA_WM_NOREDIRECT, 0L, 1L,
625 False, XA_STRING, &actual_type, &actual_format, &
len,
626 &bytesafter, &prop) != Success) {
692 unsigned long data [2];
695 unsigned long bytesafter;
700 Window
root, parent, child, *children;
701 unsigned int nchildren, key_buttons;
702 int root_x, root_y, win_x, win_y;
704 bool savedRestartPreviousState;
706 localroot = w = RootWindow(
dpy,
Scr->screen);
707 XGrabPointer(
dpy, localroot, False,
708 ButtonPressMask | ButtonReleaseMask,
709 GrabModeAsync, GrabModeAsync,
710 None,
Scr->SelectCursor, CurrentTime);
712 XMaskEvent(
dpy, ButtonPressMask | ButtonReleaseMask, &event);
713 child =
event.xbutton.subwindow;
715 if(child == (Window) 0) {
719 w = XmuClientWindow(
dpy, child);
720 ret = XGetWindowProperty(
dpy, w, XA_WM_WORKSPACESLIST, 0L, 512,
721 False, XA_STRING, &actual_type, &actual_format, &
len,
731 XQueryPointer(
dpy, localroot, &
root, &child, &root_x, &root_y,
732 &win_x, &win_y, &key_buttons);
734 XMaskEvent(
dpy, ButtonPressMask | ButtonReleaseMask, &event);
735 XUngrabPointer(
dpy, CurrentTime);
737 if(localroot ==
Scr->Root) {
741 XQueryTree(
dpy,
Scr->Root, &
root, &parent, &children, &nchildren);
742 while(parent != (Window) 0) {
747 XQueryTree(
dpy, parent, &
root, &parent, &children, &nchildren);
754 if(localroot == RootWindow(
dpy,
Scr->screen)) {
755 XWithdrawWindow(
dpy, w,
Scr->screen);
758 XUnmapWindow(
dpy, w);
760 XReparentWindow(
dpy, w,
Scr->Root, 0, 0);
762 data [0] = (
unsigned long) NormalState;
763 data [1] = (
unsigned long) None;
765 XChangeProperty(
dpy, w, XA_WM_STATE, XA_WM_STATE, 32,
766 PropModeReplace, (
unsigned char *) data, 2);