static void print_client_properties(Display *dpy, Window w, Bool verbose, int maxcmdlen) { char **cliargv = NULL; int i, cliargc; XTextProperty nametp, machtp, tp; int charsleft = maxcmdlen; /* * get the WM_MACHINE and WM_COMMAND list of strings */ if (!XGetWMClientMachine (dpy, w, &machtp)) { machtp.value = NULL; machtp.encoding = None; } if (!XGetCommand (dpy, w, &cliargv, &cliargc)) { if (machtp.value) XFree ((char *) machtp.value); return; } /* * do header information */ if (verbose) { printf ("Window 0x%lx:\n", w); print_text_field (dpy, " Machine: ", &machtp); if (XGetWMName (dpy, w, &nametp)) { print_text_field (dpy, " Name: ", &nametp); if (nametp.value) XFree ((char *) nametp.value); } } else { print_text_field (dpy, NULL, &machtp); putchar (' '); putchar (' '); } if (machtp.value) XFree ((char *) machtp.value); if (verbose) { if (XGetWMIconName (dpy, w, &tp)) { print_text_field (dpy, " Icon Name: ", &tp); if (tp.value) XFree ((char *) tp.value); } } /* * do the command */ if (verbose) { printf (" Command: "); } for (i = 0; i < cliargc && charsleft > 0; ) { charsleft -= print_quoted_word (cliargv[i], charsleft); i++; if (i < cliargc && charsleft > 0) { putchar (' '); charsleft--; } } putchar ('\n'); XFreeStringList (cliargv); /* * do trailer information */ if (verbose) { XClassHint clh; if (XGetClassHint (dpy, w, &clh)) { printf (" Instance/Class: %s/%s", clh.res_name ? clh.res_name : Nil, clh.res_class ? clh.res_class : Nil); if (clh.res_name) XFree (clh.res_name); if (clh.res_class) XFree (clh.res_class); putchar ('\n'); } } }
xwindow::xwindow(Window w, QWidget *parent) : QWidget(parent) { dt = QApplication::desktop(); maxstate = 0; mrb = NULL; clientid = w; actpal = TRUE; urgpal = FALSE; cmapwins = NULL; sstate = FALSE; tstate = FALSE; trsize = FALSE; ncmaps = 0; withdrawnstate = unmapped = TRUE; // get ClassHint get_classhint(); clientname = res_class; // get flags for WM_COMMAND char **argv; int argc; if(XGetCommand(QX11Info::display(), w, &argv, &argc) && argc) { int ncm=0; while(1) { command += argv[ncm]; if(argc > ++ncm) command += ' '; else break; } if(clientname.isEmpty() && ! command.isEmpty()) { char *base; if((base = strrchr(argv[0], '/')) == NULL) base = argv[0]; else base++; clientname = base; } XFreeStringList(argv); } clientname = clientname.simplified(); pflags = get_clientflags(); if(pflags & WindowManager::SmallFrame) { uborderh = defaults::lowerborderheight; borderh = 2*uborderh; } else { uborderh = defaults::windowbuttonsize; borderh = defaults::windowbuttonsize+defaults::lowerborderheight; } // check for nonrectangular window shaped = (WindowManager::servershapes)?(query_shape()):(FALSE); if(pflags & WindowManager::NoResize) borderh -= defaults::lowerborderheight; // save window geometry Window root; uint bwidth,depth; XGetGeometry(QX11Info::display(), w, &root, &pos_x, &pos_y, &init_w, &init_h, &bwidth, &depth); base_w = init_w; base_h = init_h; init_h += borderh; // reparent XSetWindowBorderWidth(QX11Info::display(), w, 0); XSetWindowBorderWidth(QX11Info::display(), winId(), 0); XReparentWindow(QX11Info::display(), w, winId(), 0, uborderh); XAddToSaveSet(QX11Info::display(), w); // get TransientForHint transfor = None; XGetTransientForHint(QX11Info::display(), w, &transfor); // set Font setFont(defaults::borderfont); // get colormap and check for WM_COLORMAP_WINDOWS property get_colormaps(); // get WM_CLIENT_MACHINE XTextProperty prop; if(XGetWMClientMachine(QX11Info::display(), w, &prop) && prop.nitems && prop.format == 8) { clientfqdn = (char *)prop.value; if(defaults::showclientmachines) { int pos = clientfqdn.indexOf('.'); if(pos == -1) clientmachine = clientfqdn; else clientmachine = clientfqdn.left(pos); } } // get WMHints get_wmhints(); // get WMNormalhints get_wmnormalhints(); int cw = init_w; int ch = init_h; getsize(&cw, &ch); // window position if(wmnflags & USPosition) { if(wmnflags & PWinGravity && (wingrav == SouthWestGravity || wingrav == SouthEastGravity)) pos_y -= uborderh; } // a transient window with program specified position looks like a dialog box, // otherwise use autoplacement else if(! defaults::start_restart && (transfor == None || ! (wmnflags & PPosition))) { if(WindowManager::next_x+cw > dt->width()) { pos_x = 0; if(cw < dt->width()) WindowManager::next_x = 2*defaults::windowbuttonsize; } else { pos_x = WindowManager::next_x; WindowManager::next_x += 2*defaults::windowbuttonsize; } int sy,ey; if(defaults::toolbar_top) { sy = defaults::tb_height; ey = dt->height(); } else { sy = 0; ey = dt->height()-defaults::tb_height; } if(WindowManager::next_y+ch > ey) { pos_y = sy; if(ch < dt->height()) WindowManager::next_y = sy+2*defaults::windowbuttonsize; } else { pos_y = WindowManager::next_y; WindowManager::next_y += 2*defaults::windowbuttonsize; } } // move and resize XResizeWindow(QX11Info::display(), clientid, cw, ch-borderh); if(pos_y < 0) pos_y = 0; setGeometry(pos_x, pos_y, cw, ch); // overwrite Qt-defaults because we need SubstructureNotifyMask XSelectInput(QX11Info::display(), winId(), KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | KeymapStateMask | ButtonMotionMask | PointerMotionMask | EnterWindowMask | LeaveWindowMask | FocusChangeMask | ExposureMask | StructureNotifyMask | SubstructureRedirectMask | SubstructureNotifyMask); XSetWindowAttributes attr; attr.event_mask = ColormapChangeMask|PropertyChangeMask; XChangeWindowAttributes(QX11Info::display(), w, CWEventMask, &attr); // get WM protocols getwmprotocols(); // create window borders create_wborder(); // add client to lookup tables WindowManager::cwindows.insert(w, this); WindowManager::pwindows.insert(winId(), this); // get WM_NAME and set window title get_wmname(); if(shaped) reshape(); // init autofocus timer focustimer = new QTimer(this); Q_CHECK_PTR(focustimer); focustimer->setSingleShot(TRUE); connect(focustimer, SIGNAL(timeout()), SLOT(raise())); tfocustimer = new QTimer(this); // used for tiled mode Q_CHECK_PTR(tfocustimer); tfocustimer->setSingleShot(TRUE); connect(tfocustimer, SIGNAL(timeout()), SLOT(tile_maximize())); WindowManager::send_configurenotify(this); if(! urgent && ! defaults::starturgent) { setinactive(); } else { seturgent(); } if(defaults::start_restart) // restore original state { int clstate = get_clientstate(); if(clstate == IconicState) { iconify(); } else if(clstate == WithdrawnState) { withdraw(); } else map(); } else map(); #ifdef DEBUGMSG logmsg << "class xwindow constructed (WId:" << winId() << ")\n"; #endif }