sync with bb-cvs

This commit is contained in:
Dana Jansens 2002-07-26 08:37:15 +00:00
parent cd6c4ebcb2
commit 83b6c9bfa0
6 changed files with 247 additions and 120 deletions

View file

@ -283,7 +283,7 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) {
// manage shown windows // manage shown windows
for (i = 0; i < nchild; ++i) { for (i = 0; i < nchild; ++i) {
if (children[i] == None || (! blackbox->validateWindow(children[i]))) if (children[i] == None || ! blackbox->validateWindow(children[i]))
continue; continue;
XWindowAttributes attrib; XWindowAttributes attrib;
@ -1232,6 +1232,14 @@ void BScreen::manageWindow(Window w) {
return; return;
} }
// is the window a docking app
XWMHints *wmhint = XGetWMHints(blackbox->getXDisplay(), w);
if (wmhint && (wmhint->flags & StateHint) &&
wmhint->initial_state == WithdrawnState) {
slit->addClient(w);
return;
}
new BlackboxWindow(blackbox, w, this); new BlackboxWindow(blackbox, w, this);
BlackboxWindow *win = blackbox->searchWindow(w); BlackboxWindow *win = blackbox->searchWindow(w);
@ -1763,7 +1771,7 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
break; break;
case 421: // exec case 421: // exec
if ((! *label) && (! *command)) { if (! (*label || *command)) {
fprintf(stderr, i18n(ScreenSet, ScreenEXECError, fprintf(stderr, i18n(ScreenSet, ScreenEXECError,
"BScreen::parseMenuFile: [exec] error, " "BScreen::parseMenuFile: [exec] error, "
"no menu label and/or command defined\n")); "no menu label and/or command defined\n"));
@ -1786,21 +1794,19 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
break; break;
case 561: // style case 561: { // style
{ if (! (*label && *command)) {
if ((! *label) || (! *command)) { fprintf(stderr,
fprintf(stderr, i18n(ScreenSet, ScreenSTYLEError,
i18n(ScreenSet, ScreenSTYLEError, "BScreen::parseMenuFile: [style] error, "
"BScreen::parseMenuFile: [style] error, " "no menu label and/or filename defined\n"));
"no menu label and/or filename defined\n")); continue;
continue;
}
string style = expandTilde(command);
menu->insert(label, BScreen::SetStyle, style.c_str());
} }
string style = expandTilde(command);
menu->insert(label, BScreen::SetStyle, style.c_str());
}
break; break;
case 630: // config case 630: // config
@ -1830,7 +1836,7 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
if (submenufile) { if (submenufile) {
struct stat buf; struct stat buf;
if (fstat(fileno(submenufile), &buf) || if (fstat(fileno(submenufile), &buf) ||
(! S_ISREG(buf.st_mode))) { ! S_ISREG(buf.st_mode)) {
fprintf(stderr, fprintf(stderr,
i18n(ScreenSet, ScreenINCLUDEErrorReg, i18n(ScreenSet, ScreenINCLUDEErrorReg,
"BScreen::parseMenuFile: [include] error: " "BScreen::parseMenuFile: [include] error: "
@ -1912,7 +1918,7 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
{ {
bool newmenu = ((key == 1113) ? True : False); bool newmenu = ((key == 1113) ? True : False);
if ((! *label) || ((! *command) && newmenu)) { if (! *label || (! *command && newmenu)) {
fprintf(stderr, fprintf(stderr,
i18n(ScreenSet, ScreenSTYLESDIRError, i18n(ScreenSet, ScreenSTYLESDIRError,
"BScreen::parseMenuFile: [stylesdir/stylesmenu]" "BScreen::parseMenuFile: [stylesdir/stylesmenu]"
@ -1958,7 +1964,7 @@ bool BScreen::parseMenuFile(FILE *file, Rootmenu *menu) {
style += '/'; style += '/';
style += fname; style += fname;
if ((! stat(style.c_str(), &statbuf)) && if (! stat(style.c_str(), &statbuf) &&
S_ISREG(statbuf.st_mode)) S_ISREG(statbuf.st_mode))
stylesmenu->insert(fname, BScreen::SetStyle, style); stylesmenu->insert(fname, BScreen::SetStyle, style);
} }

View file

@ -133,6 +133,17 @@ void Slit::addClient(Window w) {
client->rect.setSize(64, 64); client->rect.setSize(64, 64);
} }
Atom *proto;
int num_return = 0;
if (XGetWMProtocols(display, client->window, &proto, &num_return)) {
for (int i = 0; i < num_return; ++i) {
if (proto[i] ==
blackbox->getXAtom()->getAtom(XAtom::blackbox_structure_messages)) {
screen->addNetizen(new Netizen(screen, client->window));
}
}
}
XSetWindowBorderWidth(display, client->window, 0); XSetWindowBorderWidth(display, client->window, 0);
XGrabServer(display); XGrabServer(display);
@ -466,12 +477,17 @@ void Slit::updateStrut(void) {
case TopCenter: case TopCenter:
case TopLeft: case TopLeft:
case TopRight: case TopRight:
strut.top = getExposedHeight() + border_width; strut.top = frame.rect.top() + getExposedHeight() + border_width;
break; break;
case BottomCenter: case BottomCenter:
case BottomLeft: case BottomLeft:
case BottomRight: case BottomRight:
strut.bottom = getExposedHeight() + border_width; int pos;
if (do_auto_hide)
pos = frame.y_hidden;
else
pos = frame.rect.y();
strut.bottom = (screen->getRect().bottom() - pos);
break; break;
case CenterLeft: case CenterLeft:
strut.left = getExposedWidth() + border_width; strut.left = getExposedWidth() + border_width;

View file

@ -26,6 +26,8 @@
#endif // HAVE_CONFIG_H #endif // HAVE_CONFIG_H
extern "C" { extern "C" {
#include <X11/Xatom.h>
#ifdef HAVE_STRING_H #ifdef HAVE_STRING_H
#include <string.h> #include <string.h>
#endif #endif
@ -48,11 +50,9 @@ extern "C" {
#if defined(HAVE_PROCESS_H) && defined(__EMX__) #if defined(HAVE_PROCESS_H) && defined(__EMX__)
# include <process.h> # include <process.h>
#endif // HAVE_PROCESS_H __EMX__ #endif // HAVE_PROCESS_H __EMX__
}
#include <X11/Xatom.h>
#include <assert.h> #include <assert.h>
}
#include <algorithm> #include <algorithm>
@ -171,8 +171,8 @@ void bexec(const string& command, const string& displaystring) {
assert(ret != -1); assert(ret != -1);
string cmd = "exec "; string cmd = "exec ";
cmd += command; cmd += command;
execl("/bin/sh", "/bin/sh", "-c", cmd.c_str(), NULL); ret = execl("/bin/sh", "/bin/sh", "-c", cmd.c_str(), NULL);
exit(0); exit(ret);
} }
#else // __EMX__ #else // __EMX__
spawnlp(P_NOWAIT, "cmd.exe", "cmd.exe", "/c", command, NULL); spawnlp(P_NOWAIT, "cmd.exe", "cmd.exe", "/c", command, NULL);
@ -249,10 +249,8 @@ string itostring(unsigned long i) {
string itostring(long i) { string itostring(long i) {
if (i < 0) { std::string tmp = itostring( (unsigned long) std::abs(i));
std::string tmp = itostring( (unsigned long) -i); if (i < 0)
tmp.insert(tmp.begin(), '-'); tmp.insert(tmp.begin(), '-');
return tmp; return tmp;
} else
return itostring( (unsigned long) i);
} }

View file

@ -38,9 +38,11 @@ extern "C" {
# include <stdio.h> # include <stdio.h>
# endif // HAVE_STDIO_H # endif // HAVE_STDIO_H
#endif // DEBUG #endif // DEBUG
}
#include <cstdlib> #ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif // HAVE_STDLIB_H
}
#include "i18n.hh" #include "i18n.hh"
#include "blackbox.hh" #include "blackbox.hh"
@ -55,9 +57,9 @@ extern "C" {
#include "Window.hh" #include "Window.hh"
#include "Windowmenu.hh" #include "Windowmenu.hh"
#include "Workspace.hh" #include "Workspace.hh"
#include "Slit.hh"
using std::string; using std::string;
using std::abs;
// change this to change what modifier keys openbox uses for mouse bindings // change this to change what modifier keys openbox uses for mouse bindings
// for example: Mod1Mask | ControlMask // for example: Mod1Mask | ControlMask
@ -91,6 +93,25 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
return; return;
} }
// fetch client size and placement
XWindowAttributes wattrib;
if (! XGetWindowAttributes(blackbox->getXDisplay(),
client.window, &wattrib) ||
! wattrib.screen || wattrib.override_redirect) {
#ifdef DEBUG
fprintf(stderr,
"BlackboxWindow::BlackboxWindow(): XGetWindowAttributes failed\n");
#endif // DEBUG
delete this;
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 // set the eventmask early in the game so that we make sure we get
// all the events we are interested in // all the events we are interested in
XSetWindowAttributes attrib_set; XSetWindowAttributes attrib_set;
@ -101,20 +122,6 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
XChangeWindowAttributes(blackbox->getXDisplay(), client.window, XChangeWindowAttributes(blackbox->getXDisplay(), client.window,
CWEventMask|CWDontPropagate, &attrib_set); CWEventMask|CWDontPropagate, &attrib_set);
// fetch client size and placement
XWindowAttributes wattrib;
if ((! XGetWindowAttributes(blackbox->getXDisplay(),
client.window, &wattrib)) ||
(! wattrib.screen) || wattrib.override_redirect) {
#ifdef DEBUG
fprintf(stderr,
"BlackboxWindow::BlackboxWindow(): XGetWindowAttributes failed\n");
#endif // DEBUG
delete this;
return;
}
flags.moving = flags.resizing = flags.shaded = flags.visible = flags.moving = flags.resizing = flags.shaded = flags.visible =
flags.iconic = flags.focused = flags.stuck = flags.modal = flags.iconic = flags.focused = flags.stuck = flags.modal =
flags.send_focus_message = flags.shaped = flags.skip_taskbar = flags.send_focus_message = flags.shaped = flags.skip_taskbar =
@ -146,10 +153,12 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
Decor_Iconify | Decor_Maximize; Decor_Iconify | Decor_Maximize;
functions = Func_Resize | Func_Move | Func_Iconify | Func_Maximize; functions = Func_Resize | Func_Move | Func_Iconify | Func_Maximize;
client.wm_hint_flags = client.normal_hint_flags = 0; client.normal_hint_flags = 0;
client.window_group = None; client.window_group = None;
client.transient_for = 0; client.transient_for = 0;
current_state = NormalState;
/* /*
get the initial size and location of client window (relative to the get the initial size and location of client window (relative to the
_root window_). This position is the reference point used with the _root window_). This position is the reference point used with the
@ -175,11 +184,11 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
getWMHints(); getWMHints();
getWMNormalHints(); getWMNormalHints();
if (client.initial_state == WithdrawnState) { #ifdef DEBUG
screen->getSlit()->addClient(client.window); fprintf(stderr, "0x%lx: after hints (%d, %d) w: %d, h: %d\n", client.window,
delete this; client.rect.x(), client.rect.y(),
return; client.rect.width(), client.rect.height());
} #endif // DEBUG
frame.window = createToplevelWindow(); frame.window = createToplevelWindow();
frame.plate = createChildWindow(frame.window); frame.plate = createChildWindow(frame.window);
@ -232,6 +241,14 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
} }
upsize(); upsize();
#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
setAllowedActions(); setAllowedActions();
bool place_window = True; bool place_window = True;
@ -243,6 +260,13 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
place_window = False; 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. // add the window's strut. note this is done *after* placing the window.
screen->addStrut(&client.strut); screen->addStrut(&client.strut);
updateStrut(); updateStrut();
@ -272,16 +296,20 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
// place the window // place the window
configure(frame.rect.x(), frame.rect.y(), configure(frame.rect.x(), frame.rect.y(),
frame.rect.width(), frame.rect.height()); 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
} }
// preserve the window's initial state on first map, and its current state // preserve the window's initial state on first map, and its current state
// across a restart // across a restart
if (! getState()) { unsigned long initial_state = current_state;
if (client.wm_hint_flags & StateHint) if (! getState())
current_state = client.initial_state; current_state = initial_state;
else
current_state = NormalState;
}
// get sticky state from our parent window if we've got one // get sticky state from our parent window if we've got one
if (isTransient() && client.transient_for != (BlackboxWindow *) ~0ul && if (isTransient() && client.transient_for != (BlackboxWindow *) ~0ul &&
@ -290,14 +318,14 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
if (flags.shaded) { if (flags.shaded) {
flags.shaded = False; flags.shaded = False;
unsigned long orig_state = current_state; initial_state = current_state;
shade(); shade();
/* /*
At this point in the life of a window, current_state should only be set At this point in the life of a window, current_state should only be set
to IconicState if the window was an *icon*, not if it was shaded. to IconicState if the window was an *icon*, not if it was shaded.
*/ */
if (orig_state != IconicState) if (initial_state != IconicState)
current_state = NormalState; current_state = NormalState;
} }
@ -306,9 +334,8 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
stick(); stick();
} }
if (flags.maximized && (functions & Func_Maximize)) { if (flags.maximized && (functions & Func_Maximize))
remaximize(); remaximize();
}
/* /*
When the window is mapped (and also when its attributes are restored), the When the window is mapped (and also when its attributes are restored), the
@ -327,6 +354,13 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
XMapSubwindows(blackbox->getXDisplay(), frame.window); XMapSubwindows(blackbox->getXDisplay(), frame.window);
redrawWindowFrame(); 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
} }
@ -849,7 +883,7 @@ void BlackboxWindow::grabButtons(void) {
void BlackboxWindow::ungrabButtons(void) { void BlackboxWindow::ungrabButtons(void) {
if ((! screen->isSloppyFocus()) || screen->doClickRaise()) 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(Button1, ModMask, frame.window);
@ -1033,10 +1067,9 @@ void BlackboxWindow::getWMProtocols(void) {
if (proto[i] == xatom->getAtom(XAtom::wm_delete_window)) { if (proto[i] == xatom->getAtom(XAtom::wm_delete_window)) {
decorations |= Decor_Close; decorations |= Decor_Close;
functions |= Func_Close; functions |= Func_Close;
} else if (proto[i] == xatom->getAtom(XAtom::wm_take_focus)) } else if (proto[i] == xatom->getAtom(XAtom::wm_take_focus)) {
flags.send_focus_message = True; flags.send_focus_message = True;
else if (proto[i] == xatom->getAtom(XAtom::blackbox_structure_messages)) }
screen->addNetizen(new Netizen(screen, client.window));
} }
XFree(proto); XFree(proto);
@ -1050,7 +1083,6 @@ void BlackboxWindow::getWMProtocols(void) {
*/ */
void BlackboxWindow::getWMHints(void) { void BlackboxWindow::getWMHints(void) {
focus_mode = F_Passive; focus_mode = F_Passive;
client.initial_state = NormalState;
// remove from current window group // remove from current window group
if (client.window_group) { if (client.window_group) {
@ -1077,7 +1109,7 @@ void BlackboxWindow::getWMHints(void) {
} }
if (wmhint->flags & StateHint) if (wmhint->flags & StateHint)
client.initial_state = wmhint->initial_state; current_state = wmhint->initial_state;
if (wmhint->flags & WindowGroupHint) { if (wmhint->flags & WindowGroupHint) {
client.window_group = wmhint->window_group; client.window_group = wmhint->window_group;
@ -1092,7 +1124,6 @@ void BlackboxWindow::getWMHints(void) {
group->addWindow(this); group->addWindow(this);
} }
client.wm_hint_flags = wmhint->flags;
XFree(wmhint); XFree(wmhint);
} }
@ -1332,17 +1363,12 @@ bool BlackboxWindow::getBlackboxHints(void) {
if (blackbox_hint->flags & AttribDecoration) { if (blackbox_hint->flags & AttribDecoration) {
switch (blackbox_hint->decoration) { switch (blackbox_hint->decoration) {
case DecorNone: case DecorNone:
// clear all decorations except close decorations = 0;
decorations &= Decor_Close;
// clear all functions except close
functions &= Func_Close;
break; break;
case DecorTiny: case DecorTiny:
decorations |= Decor_Titlebar | Decor_Iconify; decorations |= Decor_Titlebar | Decor_Iconify;
decorations &= ~(Decor_Border | Decor_Handle | Decor_Maximize); decorations &= ~(Decor_Border | Decor_Handle | Decor_Maximize);
functions |= Func_Move | Func_Iconify;
functions &= ~(Func_Resize | Func_Maximize); functions &= ~(Func_Resize | Func_Maximize);
break; break;
@ -1350,7 +1376,6 @@ bool BlackboxWindow::getBlackboxHints(void) {
case DecorTool: case DecorTool:
decorations |= Decor_Titlebar; decorations |= Decor_Titlebar;
decorations &= ~(Decor_Iconify | Decor_Border | Decor_Handle); decorations &= ~(Decor_Iconify | Decor_Border | Decor_Handle);
functions |= Func_Move;
functions &= ~(Func_Resize | Func_Maximize | Func_Iconify); functions &= ~(Func_Resize | Func_Maximize | Func_Iconify);
break; break;
@ -1359,8 +1384,6 @@ bool BlackboxWindow::getBlackboxHints(void) {
default: default:
decorations |= Decor_Titlebar | Decor_Border | Decor_Handle | decorations |= Decor_Titlebar | Decor_Border | Decor_Handle |
Decor_Iconify | Decor_Maximize; Decor_Iconify | Decor_Maximize;
functions |= Func_Resize | Func_Move | Func_Iconify | Func_Maximize;
break; break;
} }
@ -1376,8 +1399,7 @@ bool BlackboxWindow::getBlackboxHints(void) {
void BlackboxWindow::getTransientInfo(void) { void BlackboxWindow::getTransientInfo(void) {
if (client.transient_for && if (client.transient_for &&
client.transient_for != (BlackboxWindow *) ~0ul) { client.transient_for != (BlackboxWindow *) ~0ul) {
// the transient for hint was removed, so we need to tell our // reset transient_for in preparation of looking for a new owner
// previous transient_for that we are going away
client.transient_for->client.transientList.remove(this); client.transient_for->client.transientList.remove(this);
} }
@ -1548,15 +1570,7 @@ bool BlackboxWindow::setInputFocus(void) {
assert(! flags.iconic && assert(! flags.iconic &&
(flags.stuck || // window must be on the current workspace or sticky (flags.stuck || // window must be on the current workspace or sticky
blackbox_attrib.workspace == screen->getCurrentWorkspaceID())); blackbox_attrib.workspace == screen->getCurrentWorkspaceID()));
#if 0
// if the window is not visible, mark the window as wanting focus rather
// than give it focus.
if (! flags.visible) {
Workspace *wkspc = screen->getWorkspace(blackbox_attrib.workspace);
wkspc->setLastFocusedWindow(this);
return True;
}
#endif
/* /*
We only do this check for normal windows and dialogs because other windows We only do this check for normal windows and dialogs because other windows
do this on purpose, such as kde's kicker, and we don't want to go moving do this on purpose, such as kde's kicker, and we don't want to go moving
@ -1855,6 +1869,27 @@ void BlackboxWindow::maximize(unsigned int button) {
// re-maximizes the window to take into account availableArea changes // re-maximizes the window to take into account availableArea changes
void BlackboxWindow::remaximize(void) { void BlackboxWindow::remaximize(void) {
if (flags.shaded) {
// we only update the window's attributes otherwise we lose the shade bit
switch(flags.maximized) {
case 1:
blackbox_attrib.flags |= AttribMaxHoriz | AttribMaxVert;
blackbox_attrib.attrib |= AttribMaxHoriz | AttribMaxVert;
break;
case 2:
blackbox_attrib.flags |= AttribMaxVert;
blackbox_attrib.attrib |= AttribMaxVert;
break;
case 3:
blackbox_attrib.flags |= AttribMaxHoriz;
blackbox_attrib.attrib |= AttribMaxHoriz;
break;
}
return;
}
// save the original dimensions because maximize will wipe them out // save the original dimensions because maximize will wipe them out
int premax_x = blackbox_attrib.premax_x, int premax_x = blackbox_attrib.premax_x,
premax_y = blackbox_attrib.premax_y, premax_y = blackbox_attrib.premax_y,
@ -2236,6 +2271,56 @@ void BlackboxWindow::restoreAttributes(void) {
blackbox_attrib.premax_h = h; blackbox_attrib.premax_h = h;
} }
if (net->flags & AttribDecoration) {
switch (net->decoration) {
case DecorNone:
decorations = 0;
break;
default:
case DecorNormal:
decorations |= Decor_Titlebar | Decor_Handle | Decor_Border |
Decor_Iconify | Decor_Maximize;
break;
case DecorTiny:
decorations |= Decor_Titlebar | Decor_Iconify;
decorations &= ~(Decor_Border | Decor_Handle | Decor_Maximize);
break;
case DecorTool:
decorations |= Decor_Titlebar;
decorations &= ~(Decor_Iconify | Decor_Border | Decor_Handle);
break;
}
// sanity check the new decor
if (! (functions & Func_Resize) || isTransient())
decorations &= ~(Decor_Maximize | Decor_Handle);
if (! (functions & Func_Maximize))
decorations &= ~Decor_Maximize;
if (decorations & Decor_Titlebar) {
if (functions & Func_Close) // close button is controlled by function
decorations |= Decor_Close; // not decor type
} else {
if (flags.shaded) // we can not be shaded if we lack a titlebar
shade();
}
if (flags.visible && frame.window) {
XMapSubwindows(blackbox->getXDisplay(), frame.window);
XMapWindow(blackbox->getXDisplay(), frame.window);
}
reconfigure();
setState(current_state);
}
// with the state set it will then be the map event's job to read the // with the state set it will then be the map event's job to read the
// window's state and behave accordingly // window's state and behave accordingly
@ -2531,6 +2616,12 @@ void BlackboxWindow::mapRequestEvent(const XMapRequestEvent *re) {
case InactiveState: case InactiveState:
case ZoomState: case ZoomState:
default: 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(); show();
screen->getWorkspace(blackbox_attrib.workspace)->raiseWindow(this); screen->getWorkspace(blackbox_attrib.workspace)->raiseWindow(this);
if (isNormal()) { if (isNormal()) {
@ -2624,6 +2715,12 @@ void BlackboxWindow::propertyNotifyEvent(const XPropertyEvent *pe) {
} }
reconfigure(); 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; break;
@ -2676,6 +2773,12 @@ void BlackboxWindow::propertyNotifyEvent(const XPropertyEvent *pe) {
if (old_rect != frame.rect) if (old_rect != frame.rect)
reconfigure(); 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; break;
} }
@ -2735,11 +2838,19 @@ void BlackboxWindow::configureRequestEvent(const XConfigureRequestEvent *cr) {
applyGravity(req); applyGravity(req);
} }
if (cr->value_mask & CWWidth) if (cr->value_mask & CWWidth) {
req.setWidth(cr->width + frame.margin.left + frame.margin.right); 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); 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()); configure(req.x(), req.y(), req.width(), req.height());
} }
@ -2758,6 +2869,13 @@ void BlackboxWindow::configureRequestEvent(const XConfigureRequestEvent *cr) {
break; 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
} }
@ -3030,10 +3148,10 @@ void BlackboxWindow::doMove(int x_root, int y_root) {
bool snapped = False; bool snapped = False;
const Rect &winrect = snapwin->frameRect(); const Rect &winrect = snapwin->frameRect();
int dleft = std::abs(wright - winrect.left()), int dleft = abs(wright - winrect.left()),
dright = std::abs(wleft - winrect.right()), dright = abs(wleft - winrect.right()),
dtop = std::abs(wbottom - winrect.top()), dtop = abs(wbottom - winrect.top()),
dbottom = std::abs(wtop - winrect.bottom()); dbottom = abs(wtop - winrect.bottom());
if (wtop >= (signed)(winrect.y() - frame.rect.height() + 1) && if (wtop >= (signed)(winrect.y() - frame.rect.height() + 1) &&
wtop < (signed)(winrect.y() + winrect.height() - 1)) { wtop < (signed)(winrect.y() + winrect.height() - 1)) {
@ -3052,8 +3170,8 @@ void BlackboxWindow::doMove(int x_root, int y_root) {
if (snapped) { if (snapped) {
if (screen->getWindowCornerSnap()) { if (screen->getWindowCornerSnap()) {
// try corner-snap to its other sides // try corner-snap to its other sides
dtop = std::abs(wtop - winrect.top()); dtop = abs(wtop - winrect.top());
dbottom = std::abs(wbottom - winrect.bottom()); dbottom = abs(wbottom - winrect.bottom());
if (dtop < snap_distance && dtop <= dbottom) if (dtop < snap_distance && dtop <= dbottom)
dy = winrect.top(); dy = winrect.top();
else if (dbottom < snap_distance) else if (dbottom < snap_distance)
@ -3081,8 +3199,8 @@ void BlackboxWindow::doMove(int x_root, int y_root) {
if (snapped) { if (snapped) {
if (screen->getWindowCornerSnap()) { if (screen->getWindowCornerSnap()) {
// try corner-snap to its other sides // try corner-snap to its other sides
dleft = std::abs(wleft - winrect.left()); dleft = abs(wleft - winrect.left());
dright = std::abs(wright - winrect.right()); dright = abs(wright - winrect.right());
if (dleft < snap_distance && dleft <= dright) if (dleft < snap_distance && dleft <= dright)
dx = winrect.left(); dx = winrect.left();
else if (dright < snap_distance) else if (dright < snap_distance)
@ -3128,10 +3246,10 @@ void BlackboxWindow::doMove(int x_root, int y_root) {
frame.rect.height()))) frame.rect.height())))
continue; continue;
int dleft = std::abs(wleft - srect.left()), int dleft = abs(wleft - srect.left()),
dright = std::abs(wright - srect.right()), dright = abs(wright - srect.right()),
dtop = std::abs(wtop - srect.top()), dtop = abs(wtop - srect.top()),
dbottom = std::abs(wbottom - srect.bottom()); dbottom = abs(wbottom - srect.bottom());
// snap left? // snap left?
if (dleft < snap_distance && dleft <= dright) if (dleft < snap_distance && dleft <= dright)
@ -3466,7 +3584,7 @@ void BlackboxWindow::timeout(void) {
} }
void BlackboxWindow::changeBlackboxHints(BlackboxHints *net) { void BlackboxWindow::changeBlackboxHints(const BlackboxHints *net) {
if ((net->flags & AttribShaded) && if ((net->flags & AttribShaded) &&
((blackbox_attrib.attrib & AttribShaded) != ((blackbox_attrib.attrib & AttribShaded) !=
(net->attrib & AttribShaded))) (net->attrib & AttribShaded)))
@ -3512,8 +3630,7 @@ void BlackboxWindow::changeBlackboxHints(BlackboxHints *net) {
if (net->flags & AttribDecoration) { if (net->flags & AttribDecoration) {
switch (net->decoration) { switch (net->decoration) {
case DecorNone: case DecorNone:
// clear all decorations except close decorations = 0;
decorations &= Decor_Close;
break; break;

View file

@ -183,7 +183,7 @@ private:
base_width, base_height, base_width, base_height,
win_gravity; win_gravity;
unsigned long initial_state, normal_hint_flags, wm_hint_flags; unsigned long initial_state, normal_hint_flags;
} client; } client;
FunctionFlags functions; FunctionFlags functions;
@ -390,7 +390,7 @@ public:
void restore(bool remap); void restore(bool remap);
void configure(int dx, int dy, unsigned int dw, unsigned int dh); void configure(int dx, int dy, unsigned int dw, unsigned int dh);
void setWorkspace(unsigned int n); void setWorkspace(unsigned int n);
void changeBlackboxHints(BlackboxHints *net); void changeBlackboxHints(const BlackboxHints *net);
void restoreAttributes(void); void restoreAttributes(void);
void buttonPressEvent(const XButtonEvent *be); void buttonPressEvent(const XButtonEvent *be);

View file

@ -282,16 +282,6 @@ void Blackbox::process_event(XEvent *e) {
} }
case ConfigureRequest: { case ConfigureRequest: {
// compress configure requests...
XEvent realevent;
unsigned int i = 0;
while(XCheckTypedWindowEvent(getXDisplay(), e->xconfigurerequest.window,
ConfigureRequest, &realevent)) {
i++;
}
if ( i > 0 )
e = &realevent;
BlackboxWindow *win = (BlackboxWindow *) 0; BlackboxWindow *win = (BlackboxWindow *) 0;
Slit *slit = (Slit *) 0; Slit *slit = (Slit *) 0;
@ -496,7 +486,7 @@ void Blackbox::process_event(XEvent *e) {
if (win->getScreen()->isSloppyFocus() && if (win->getScreen()->isSloppyFocus() &&
(! win->isFocused()) && (! no_focus) && (! win->isFocused()) && (! no_focus) &&
win->isNormal()) { // don't focus non-normal windows with mouseover win->isNormal()) { // don't focus non-normal windows with mouseover
if (((! sa.leave) || sa.inferior) && win->isVisible()) { if ((! sa.leave || sa.inferior) && win->isVisible()) {
if (win->setInputFocus()) if (win->setInputFocus())
win->installColormap(True); // XXX: shouldnt we honour no install? win->installColormap(True); // XXX: shouldnt we honour no install?
} }