summaryrefslogtreecommitdiff
path: root/src/Window.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/Window.cc')
-rw-r--r--src/Window.cc174
1 files changed, 56 insertions, 118 deletions
diff --git a/src/Window.cc b/src/Window.cc
index 2d183749..769e036f 100644
--- a/src/Window.cc
+++ b/src/Window.cc
@@ -107,11 +107,6 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
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;
@@ -167,36 +162,31 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
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();
@@ -206,6 +196,7 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
getWindowType();
// adjust the window decorations/behavior based on the window type
+
switch (window_type) {
case Type_Desktop:
case Type_Dock:
@@ -230,6 +221,8 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
// 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) &&
@@ -239,17 +232,16 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
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() ||
@@ -260,51 +252,56 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
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;
@@ -316,6 +313,7 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
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;
@@ -336,31 +334,6 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
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
}
@@ -482,8 +455,10 @@ void BlackboxWindow::associateClientWindow(void) {
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,
@@ -491,12 +466,9 @@ void BlackboxWindow::associateClientWindow(void) {
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,
@@ -883,9 +855,7 @@ void BlackboxWindow::grabButtons(void) {
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);
@@ -2627,12 +2597,6 @@ void BlackboxWindow::mapRequestEvent(const XMapRequestEvent *re) {
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()) {
@@ -2726,12 +2690,6 @@ void BlackboxWindow::propertyNotifyEvent(const XPropertyEvent *pe) {
}
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;
@@ -2784,12 +2742,6 @@ void BlackboxWindow::propertyNotifyEvent(const XPropertyEvent *pe) {
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;
}
@@ -2849,19 +2801,11 @@ void BlackboxWindow::configureRequestEvent(const XConfigureRequestEvent *cr) {
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());
}
@@ -2880,13 +2824,6 @@ void BlackboxWindow::configureRequestEvent(const XConfigureRequestEvent *cr) {
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
}
@@ -3564,7 +3501,8 @@ void BlackboxWindow::restore(bool remap) {
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);