return;
}
-#ifdef DEBUG
- fprintf(stderr, "0x%lx: initial (%d, %d) w: %d, h: %d\n", client.window,
- wattrib.x, wattrib.y, wattrib.width, wattrib.height);
-#endif // DEBUG
-
// set the eventmask early in the game so that we make sure we get
// all the events we are interested in
XSetWindowAttributes attrib_set;
client.rect.setRect(wattrib.x, wattrib.y, wattrib.width, wattrib.height);
client.old_bw = wattrib.border_width;
- windowmenu = 0;
lastButtonPressTime = 0;
timer = new BTimer(blackbox, this);
timer->setTimeout(blackbox->getAutoRaiseDelay());
+ windowmenu = new Windowmenu(this);
+
+ // get size, aspect, minimum/maximum size and other hints set by the
+ // client
+
if (! getBlackboxHints()) {
getMWMHints();
getNetWMHints();
}
- // get size, aspect, minimum/maximum size and other hints set by the
- // client
getWMProtocols();
getWMHints();
getWMNormalHints();
-#ifdef DEBUG
- fprintf(stderr, "0x%lx: after hints (%d, %d) w: %d, h: %d\n", client.window,
- client.rect.x(), client.rect.y(),
- client.rect.width(), client.rect.height());
-#endif // DEBUG
-
frame.window = createToplevelWindow();
- frame.plate = createChildWindow(frame.window);
- associateClientWindow();
blackbox->saveWindowSearch(frame.window, this);
+
+ frame.plate = createChildWindow(frame.window);
blackbox->saveWindowSearch(frame.plate, this);
- blackbox->saveWindowSearch(client.window, this);
// determine if this is a transient window
getTransientInfo();
getWindowType();
// adjust the window decorations/behavior based on the window type
+
switch (window_type) {
case Type_Desktop:
case Type_Dock:
// normal windows retain all of the possible decorations and functionality
break;
}
+
+ setAllowedActions();
// further adjeust the window's decorations/behavior based on window sizes
if ((client.normal_hint_flags & PMinSize) &&
decorations &= ~(Decor_Maximize | Decor_Handle);
functions &= ~(Func_Resize | Func_Maximize);
}
- upsize();
+
+ if (decorations & Decor_Titlebar)
+ createTitlebar();
-#ifdef DFEBUG
- fprintf(stderr, "0x%lx: sizes reflect the frame from now on\n",
- client.window);
- fprintf(stderr, "0x%lx: after upsize (%d, %d) w: %d, h: %d\n", client.window,
- frame.rect.x(), frame.rect.y(),
- frame.rect.width(), frame.rect.height());
-#endif // DEBUG
+ if (decorations & Decor_Handle)
+ createHandle();
- setAllowedActions();
+ // apply the size and gravity hint to the frame
+
+ upsize();
bool place_window = True;
if (blackbox->isStartup() || isTransient() ||
place_window = False;
}
-#ifdef DEBUG
- fprintf(stderr, "0x%lx: after gravity (%d, %d) w: %d, h: %d\n",
- client.window,
- frame.rect.x(), frame.rect.y(),
- frame.rect.width(), frame.rect.height());
-#endif // DEBUG
-
// add the window's strut. note this is done *after* placing the window.
screen->addStrut(&client.strut);
updateStrut();
- if (decorations & Decor_Titlebar)
- createTitlebar();
-
- if (decorations & Decor_Handle)
- createHandle();
-
#ifdef SHAPE
- if (blackbox->hasShapeExtensions() && flags.shaped) {
+ if (blackbox->hasShapeExtensions() && flags.shaped)
configureShape();
- }
#endif // SHAPE
- windowmenu = new Windowmenu(this);
-
if (blackbox_attrib.workspace >= screen->getWorkspaceCount())
screen->getCurrentWorkspace()->addWindow(this, place_window);
else
screen->getWorkspace(blackbox_attrib.workspace)->
addWindow(this, place_window);
+ /*
+ the server needs to be grabbed here to prevent client's from sending
+ events while we are in the process of configuring their window.
+ We hold the grab until after we are done moving the window around.
+ */
+
+ XGrabServer(blackbox->getXDisplay());
+
+ associateClientWindow();
+
+ blackbox->saveWindowSearch(client.window, this);
+
if (! place_window) {
// don't need to call configure if we are letting the workspace
// place the window
configure(frame.rect.x(), frame.rect.y(),
frame.rect.width(), frame.rect.height());
-#ifdef DEBUG
- fprintf(stderr, "0x%lx: after configure (%d, %d) w: %d, h: %d\n",
- client.window,
- frame.rect.x(), frame.rect.y(),
- frame.rect.width(), frame.rect.height());
-#endif // DEBUG
}
+ positionWindows();
+
+ XUngrabServer(blackbox->getXDisplay());
+
+ // now that we know where to put the window and what it should look like
+ // we apply the decorations
+ decorate();
+
+ grabButtons();
+
+ XMapSubwindows(blackbox->getXDisplay(), frame.window);
+
+ // this ensures the title, buttons, and other decor are properly displayed
+ redrawWindowFrame();
+
// preserve the window's initial state on first map, and its current state
// across a restart
unsigned long initial_state = current_state;
client.transient_for->isStuck() != flags.stuck)
stick();
+ // the following flags are set by blackbox native apps only
if (flags.shaded) {
flags.shaded = False;
initial_state = current_state;
if (flags.maximized && (functions & Func_Maximize))
remaximize();
-
- /*
- When the window is mapped (and also when its attributes are restored), the
- current_state that was set here will be used.
- It is set to Normal if the window is to be mapped or it is set to Iconic
- if the window is to be iconified.
- *Note* that for sticky windows, the same rules apply here, they are in
- fact never set to Iconic since there is no way for us to tell if a sticky
- window was iconified previously.
- */
-
- positionWindows();
- decorate();
- grabButtons();
-
- XMapSubwindows(blackbox->getXDisplay(), frame.window);
-
- redrawWindowFrame();
-
-#ifdef DEBUG
- fprintf(stderr, "0x%lx: end of constructor (%d, %d) w: %d, h: %d\n",
- client.window,
- frame.rect.x(), frame.rect.y(),
- frame.rect.width(), frame.rect.height());
-#endif // DEBUG
}
XSelectInput(blackbox->getXDisplay(), frame.plate, SubstructureRedirectMask);
- XGrabServer(blackbox->getXDisplay());
-
+ /*
+ note we used to grab around this call to XReparentWindow however the
+ server is now grabbed before this method is called
+ */
unsigned long event_mask = PropertyChangeMask | FocusChangeMask |
StructureNotifyMask;
XSelectInput(blackbox->getXDisplay(), client.window,
XReparentWindow(blackbox->getXDisplay(), client.window, frame.plate, 0, 0);
XSelectInput(blackbox->getXDisplay(), client.window, event_mask);
- XUngrabServer(blackbox->getXDisplay());
-
XRaiseWindow(blackbox->getXDisplay(), frame.plate);
XMapSubwindows(blackbox->getXDisplay(), frame.plate);
-
#ifdef SHAPE
if (blackbox->hasShapeExtensions()) {
XShapeSelectInput(blackbox->getXDisplay(), client.window,
void BlackboxWindow::ungrabButtons(void) {
- if (! screen->isSloppyFocus() || screen->doClickRaise())
- blackbox->ungrabButton(Button1, 0, frame.plate);
-
+ blackbox->ungrabButton(Button1, 0, frame.plate);
blackbox->ungrabButton(Button1, ModMask, frame.window);
blackbox->ungrabButton(Button2, ModMask, frame.window);
blackbox->ungrabButton(Button3, ModMask, frame.window);
blackbox_attrib.flags ^= AttribOmnipresent;
blackbox_attrib.attrib ^= AttribOmnipresent;
+ for (unsigned int i = 0; i < screen->getNumberOfWorkspaces(); ++i)
+ if (i != blackbox_attrib.workspace)
+ screen->getWorkspace(i)->removeWindow(this, True);
+
flags.stuck = False;
if (! flags.iconic)
// value than that contained in the class' data.
xatom->setValue(client.window, XAtom::net_wm_desktop, XAtom::cardinal,
0xffffffff);
+
+ for (unsigned int i = 0; i < screen->getNumberOfWorkspaces(); ++i)
+ if (i != blackbox_attrib.workspace)
+ screen->getWorkspace(i)->addWindow(this, False, True);
setState(current_state);
}
if (! flags.iconic) {
// iconic windows arent in a workspace menu!
- Clientmenu *menu =
- screen->getWorkspace(blackbox_attrib.workspace)->getMenu();
- menu->setItemSelected(window_number, isFocused());
+ if (flags.stuck)
+ screen->getCurrentWorkspace()->setFocused(this, isFocused());
+ else
+ screen->getWorkspace(blackbox_attrib.workspace)->
+ setFocused(this, flags.focused);
}
}
case InactiveState:
case ZoomState:
default:
-#ifdef DEBUG
- fprintf(stderr, "0x%lx: just before show (%d, %d) w: %d, h: %d\n",
- client.window,
- frame.rect.x(), frame.rect.y(),
- frame.rect.width(), frame.rect.height());
-#endif // DEBUG
show();
screen->getWorkspace(blackbox_attrib.workspace)->raiseWindow(this);
if (isNormal()) {
}
reconfigure();
-#ifdef DEBUG
- fprintf(stderr, "0x%lx: transient hint (%d, %d) w: %d, h: %d\n",
- client.window,
- frame.rect.x(), frame.rect.y(),
- frame.rect.width(), frame.rect.height());
-#endif
}
break;
if (old_rect != frame.rect)
reconfigure();
-#ifdef DEBUG
- fprintf(stderr, "0x%lx: normal hint (%d, %d) w: %d, h: %d\n",
- client.window,
- frame.rect.x(), frame.rect.y(),
- frame.rect.width(), frame.rect.height());
-#endif // DEBUG
break;
}
applyGravity(req);
}
- if (cr->value_mask & CWWidth) {
+ if (cr->value_mask & CWWidth)
req.setWidth(cr->width + frame.margin.left + frame.margin.right);
-#ifdef DEBUG
- fprintf(stderr, "0x%lx: new width - %d\n", client.window, cr->width);
-#endif // DEBUG
- }
- if (cr->value_mask & CWHeight) {
+ if (cr->value_mask & CWHeight)
req.setHeight(cr->height + frame.margin.top + frame.margin.bottom);
-#ifdef DEBUG
- fprintf(stderr, "0x%lx: new height - %d\n", client.window, cr->height);
-#endif // DEBUG
- }
configure(req.x(), req.y(), req.width(), req.height());
}
break;
}
}
-
-#ifdef DEBUG
- fprintf(stderr, "0x%lx: change request (%d, %d) w: %d, h: %d\n",
- client.window,
- frame.rect.x(), frame.rect.y(),
- frame.rect.width(), frame.rect.height());
-#endif // DEBUG
}
XSelectInput(blackbox->getXDisplay(), frame.plate, NoEventMask);
// do not leave a shaded window as an icon unless it was an icon
- if (flags.shaded && ! flags.iconic) setState(NormalState);
+ if (flags.shaded && ! flags.iconic)
+ setState(NormalState);
restoreGravity(client.rect);