make iconified windows uniconify on an XMapRequestEvent.
sync with blackbox cvs.
This commit is contained in:
parent
be2f47223c
commit
e15e4a9e03
13 changed files with 194 additions and 162 deletions
|
@ -78,7 +78,7 @@ extern "C" {
|
|||
#endif // HAVE_SYS_WAIT_H
|
||||
}
|
||||
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
using std::string;
|
||||
|
||||
#include "i18n.hh"
|
||||
|
@ -468,7 +468,6 @@ ScreenInfo::ScreenInfo(BaseDisplay *d, unsigned int num) {
|
|||
if (pos != string::npos)
|
||||
default_string.resize(pos);
|
||||
|
||||
std::ostringstream formatter;
|
||||
formatter << "DISPLAY=" << default_string << '.' << screen_number;
|
||||
display_string = formatter.str();
|
||||
display_string = string("DISPLAY=") + default_string + '.' +
|
||||
itostring(static_cast<unsigned long>(screen_number));
|
||||
}
|
||||
|
|
|
@ -200,7 +200,8 @@ void Configmenu::Focusmenu::itemSelected(int button, unsigned int index) {
|
|||
|
||||
case 4: // click raise with sloppy focus
|
||||
getScreen()->saveClickRaise(! getScreen()->doClickRaise());
|
||||
getScreen()->updateFocusModel();
|
||||
// make sure the appropriate mouse buttons are grabbed on the windows
|
||||
getScreen()->toggleFocusModel(BScreen::SloppyFocus);
|
||||
break;
|
||||
}
|
||||
setValues();
|
||||
|
|
|
@ -132,6 +132,8 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) {
|
|||
resource.mstyle.t_font = resource.mstyle.f_font = resource.tstyle.font =
|
||||
resource.wstyle.font = (BFont *) 0;
|
||||
|
||||
geom_pixmap = None;
|
||||
|
||||
xatom->setSupported(this); // set-up netwm support
|
||||
#ifdef HAVE_GETPID
|
||||
xatom->setValue(getRootWindow(), XAtom::blackbox_pid, XAtom::cardinal,
|
||||
|
@ -2006,7 +2008,7 @@ Workspace* BScreen::getWorkspace(unsigned int index) {
|
|||
}
|
||||
|
||||
|
||||
void BScreen::buttonPressEvent(XButtonEvent *xbutton) {
|
||||
void BScreen::buttonPressEvent(const XButtonEvent *xbutton) {
|
||||
if (xbutton->button == 1) {
|
||||
if (! isRootColormapInstalled())
|
||||
image_control->installRootColormap();
|
||||
|
@ -2071,6 +2073,9 @@ void BScreen::buttonPressEvent(XButtonEvent *xbutton) {
|
|||
|
||||
|
||||
void BScreen::toggleFocusModel(FocusModel model) {
|
||||
std::for_each(windowList.begin(), windowList.end(),
|
||||
std::mem_fun(&BlackboxWindow::ungrabButtons));
|
||||
|
||||
if (model == SloppyFocus) {
|
||||
saveSloppyFocus(True);
|
||||
} else {
|
||||
|
@ -2080,14 +2085,8 @@ void BScreen::toggleFocusModel(FocusModel model) {
|
|||
saveSloppyFocus(False);
|
||||
}
|
||||
|
||||
updateFocusModel();
|
||||
}
|
||||
|
||||
|
||||
void BScreen::updateFocusModel()
|
||||
{
|
||||
std::for_each(workspacesList.begin(), workspacesList.end(),
|
||||
std::mem_fun(&Workspace::updateFocusModel));
|
||||
std::for_each(windowList.begin(), windowList.end(),
|
||||
std::mem_fun(&BlackboxWindow::grabButtons));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -331,14 +331,13 @@ public:
|
|||
void save_rc(void);
|
||||
void reconfigure(void);
|
||||
void toggleFocusModel(FocusModel model);
|
||||
void updateFocusModel(void);
|
||||
void rereadMenu(void);
|
||||
void shutdown(void);
|
||||
void showPosition(int x, int y);
|
||||
void showGeometry(unsigned int gx, unsigned int gy);
|
||||
void hideGeometry(void);
|
||||
|
||||
void buttonPressEvent(XButtonEvent *xbutton);
|
||||
void buttonPressEvent(const XButtonEvent *xbutton);
|
||||
|
||||
void updateNetizenCurrentWorkspace(void);
|
||||
void updateNetizenWorkspaceCount(void);
|
||||
|
|
10
src/Slit.cc
10
src/Slit.cc
|
@ -625,7 +625,7 @@ void Slit::shutdown(void) {
|
|||
}
|
||||
|
||||
|
||||
void Slit::buttonPressEvent(XButtonEvent *e) {
|
||||
void Slit::buttonPressEvent(const XButtonEvent *e) {
|
||||
if (e->window != frame.window) return;
|
||||
|
||||
if (e->button == Button1 && (! on_top)) {
|
||||
|
@ -659,7 +659,7 @@ void Slit::buttonPressEvent(XButtonEvent *e) {
|
|||
}
|
||||
|
||||
|
||||
void Slit::enterNotifyEvent(XCrossingEvent *) {
|
||||
void Slit::enterNotifyEvent(const XCrossingEvent *) {
|
||||
if (! do_auto_hide)
|
||||
return;
|
||||
|
||||
|
@ -671,7 +671,7 @@ void Slit::enterNotifyEvent(XCrossingEvent *) {
|
|||
}
|
||||
|
||||
|
||||
void Slit::leaveNotifyEvent(XCrossingEvent *) {
|
||||
void Slit::leaveNotifyEvent(const XCrossingEvent *) {
|
||||
if (! do_auto_hide)
|
||||
return;
|
||||
|
||||
|
@ -683,7 +683,7 @@ void Slit::leaveNotifyEvent(XCrossingEvent *) {
|
|||
}
|
||||
|
||||
|
||||
void Slit::configureRequestEvent(XConfigureRequestEvent *e) {
|
||||
void Slit::configureRequestEvent(const XConfigureRequestEvent *e) {
|
||||
if (! blackbox->validateWindow(e->window))
|
||||
return;
|
||||
|
||||
|
@ -737,7 +737,7 @@ void Slit::toggleAutoHide(void) {
|
|||
}
|
||||
|
||||
|
||||
void Slit::unmapNotifyEvent(XUnmapEvent *e) {
|
||||
void Slit::unmapNotifyEvent(const XUnmapEvent *e) {
|
||||
removeClient(e->window);
|
||||
}
|
||||
|
||||
|
|
10
src/Slit.hh
10
src/Slit.hh
|
@ -188,11 +188,11 @@ public:
|
|||
void shutdown(void);
|
||||
void toggleAutoHide(void);
|
||||
|
||||
void buttonPressEvent(XButtonEvent *e);
|
||||
void enterNotifyEvent(XCrossingEvent * /*unused*/);
|
||||
void leaveNotifyEvent(XCrossingEvent * /*unused*/);
|
||||
void configureRequestEvent(XConfigureRequestEvent *e);
|
||||
void unmapNotifyEvent(XUnmapEvent *e);
|
||||
void buttonPressEvent(const XButtonEvent *e);
|
||||
void enterNotifyEvent(const XCrossingEvent * /*unused*/);
|
||||
void leaveNotifyEvent(const XCrossingEvent * /*unused*/);
|
||||
void configureRequestEvent(const XConfigureRequestEvent *e);
|
||||
void unmapNotifyEvent(const XUnmapEvent *e);
|
||||
|
||||
virtual void timeout(void);
|
||||
|
||||
|
|
|
@ -777,7 +777,7 @@ void Toolbar::edit(void) {
|
|||
}
|
||||
|
||||
|
||||
void Toolbar::buttonPressEvent(XButtonEvent *be) {
|
||||
void Toolbar::buttonPressEvent(const XButtonEvent *be) {
|
||||
if (be->button == 1) {
|
||||
if (be->window == frame.psbutton)
|
||||
redrawPrevWorkspaceButton(True, True);
|
||||
|
@ -826,7 +826,7 @@ void Toolbar::buttonPressEvent(XButtonEvent *be) {
|
|||
|
||||
|
||||
|
||||
void Toolbar::buttonReleaseEvent(XButtonEvent *re) {
|
||||
void Toolbar::buttonReleaseEvent(const XButtonEvent *re) {
|
||||
if (re->button == 1) {
|
||||
if (re->window == frame.psbutton) {
|
||||
redrawPrevWorkspaceButton(False, True);
|
||||
|
@ -873,7 +873,7 @@ void Toolbar::buttonReleaseEvent(XButtonEvent *re) {
|
|||
}
|
||||
|
||||
|
||||
void Toolbar::enterNotifyEvent(XCrossingEvent *) {
|
||||
void Toolbar::enterNotifyEvent(const XCrossingEvent *) {
|
||||
if (! do_auto_hide)
|
||||
return;
|
||||
|
||||
|
@ -884,7 +884,7 @@ void Toolbar::enterNotifyEvent(XCrossingEvent *) {
|
|||
}
|
||||
}
|
||||
|
||||
void Toolbar::leaveNotifyEvent(XCrossingEvent *) {
|
||||
void Toolbar::leaveNotifyEvent(const XCrossingEvent *) {
|
||||
if (! do_auto_hide)
|
||||
return;
|
||||
|
||||
|
@ -896,7 +896,7 @@ void Toolbar::leaveNotifyEvent(XCrossingEvent *) {
|
|||
}
|
||||
|
||||
|
||||
void Toolbar::exposeEvent(XExposeEvent *ee) {
|
||||
void Toolbar::exposeEvent(const XExposeEvent *ee) {
|
||||
if (ee->window == frame.clock) checkClock(True);
|
||||
else if (ee->window == frame.workspace_label && (! editing))
|
||||
redrawWorkspaceLabel();
|
||||
|
@ -908,7 +908,7 @@ void Toolbar::exposeEvent(XExposeEvent *ee) {
|
|||
}
|
||||
|
||||
|
||||
void Toolbar::keyPressEvent(XKeyEvent *ke) {
|
||||
void Toolbar::keyPressEvent(const XKeyEvent *ke) {
|
||||
if (ke->window == frame.workspace_label && editing) {
|
||||
if (new_workspace_name.empty()) {
|
||||
new_name_pos = 0;
|
||||
|
@ -916,7 +916,7 @@ void Toolbar::keyPressEvent(XKeyEvent *ke) {
|
|||
|
||||
KeySym ks;
|
||||
char keychar[1];
|
||||
XLookupString(ke, keychar, 1, &ks, 0);
|
||||
XLookupString(const_cast<XKeyEvent*>(ke), keychar, 1, &ks, 0);
|
||||
|
||||
// either we are told to end with a return or we hit 127 chars
|
||||
if (ks == XK_Return || new_name_pos == 127) {
|
||||
|
|
|
@ -172,12 +172,12 @@ public:
|
|||
inline int getY(void) const
|
||||
{ return ((hidden) ? frame.y_hidden : frame.rect.y()); }
|
||||
|
||||
void buttonPressEvent(XButtonEvent *be);
|
||||
void buttonReleaseEvent(XButtonEvent *re);
|
||||
void enterNotifyEvent(XCrossingEvent * /*unused*/);
|
||||
void leaveNotifyEvent(XCrossingEvent * /*unused*/);
|
||||
void exposeEvent(XExposeEvent *ee);
|
||||
void keyPressEvent(XKeyEvent *ke);
|
||||
void buttonPressEvent(const XButtonEvent *be);
|
||||
void buttonReleaseEvent(const XButtonEvent *re);
|
||||
void enterNotifyEvent(const XCrossingEvent * /*unused*/);
|
||||
void leaveNotifyEvent(const XCrossingEvent * /*unused*/);
|
||||
void exposeEvent(const XExposeEvent *ee);
|
||||
void keyPressEvent(const XKeyEvent *ke);
|
||||
|
||||
void edit(void);
|
||||
void reconfigure(void);
|
||||
|
|
230
src/Window.cc
230
src/Window.cc
|
@ -134,13 +134,14 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
|
|||
frame.fgrip_pixel = 0;
|
||||
frame.utitle = frame.ftitle = frame.uhandle = frame.fhandle = None;
|
||||
frame.ulabel = frame.flabel = frame.ubutton = frame.fbutton = None;
|
||||
frame.pbutton = frame.ugrip = frame.fgrip = decorations;
|
||||
frame.pbutton = frame.ugrip = frame.fgrip = None;
|
||||
|
||||
decorations = Decor_Titlebar | Decor_Border | Decor_Handle |
|
||||
Decor_Iconify | Decor_Maximize;
|
||||
functions = Func_Resize | Func_Move | Func_Iconify | Func_Maximize;
|
||||
|
||||
client.wm_hint_flags = client.normal_hint_flags = 0;
|
||||
client.window_group = None;
|
||||
client.transient_for = 0;
|
||||
|
||||
/*
|
||||
|
@ -271,32 +272,7 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
|
|||
}
|
||||
#endif // SHAPE
|
||||
|
||||
if ((! screen->isSloppyFocus()) || screen->doClickRaise()) {
|
||||
// grab button 1 for changing focus/raising
|
||||
blackbox->grabButton(Button1, 0, frame.plate, True, ButtonPressMask,
|
||||
GrabModeSync, GrabModeSync, None, None);
|
||||
}
|
||||
|
||||
if (functions & Func_Move)
|
||||
blackbox->grabButton(Button1, Mod1Mask, frame.window, True,
|
||||
ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
|
||||
GrabModeAsync, frame.window,
|
||||
blackbox->getMoveCursor());
|
||||
blackbox->grabButton(Button2, Mod1Mask, frame.window, True,
|
||||
ButtonReleaseMask, GrabModeAsync, GrabModeAsync,
|
||||
None, None);
|
||||
if (functions & Func_Resize)
|
||||
blackbox->grabButton(Button3, Mod1Mask, frame.window, True,
|
||||
ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
|
||||
GrabModeAsync, None,
|
||||
blackbox->getLowerRightAngleCursor());
|
||||
|
||||
positionWindows();
|
||||
decorate();
|
||||
|
||||
if (decorations & Decor_Titlebar)
|
||||
XMapSubwindows(blackbox->getXDisplay(), frame.title);
|
||||
XMapSubwindows(blackbox->getXDisplay(), frame.window);
|
||||
grabButtons();
|
||||
|
||||
windowmenu = new Windowmenu(this);
|
||||
|
||||
|
@ -329,15 +305,14 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
|
|||
|
||||
if (flags.shaded) {
|
||||
flags.shaded = False;
|
||||
unsigned long orig_state = current_state;
|
||||
shade();
|
||||
|
||||
/*
|
||||
Because the iconic'ness of shaded windows is lost, we need to set the
|
||||
state to NormalState so that shaded windows on other workspaces will not
|
||||
get shown on the first workspace.
|
||||
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.
|
||||
*/
|
||||
if (orig_state != IconicState)
|
||||
current_state = NormalState;
|
||||
}
|
||||
|
||||
|
@ -360,6 +335,11 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
|
|||
window was iconified previously.
|
||||
*/
|
||||
|
||||
positionWindows();
|
||||
decorate();
|
||||
|
||||
XMapSubwindows(blackbox->getXDisplay(), frame.window);
|
||||
|
||||
redrawWindowFrame();
|
||||
}
|
||||
|
||||
|
@ -838,17 +818,11 @@ void BlackboxWindow::positionButtons(bool redecorate_label) {
|
|||
void BlackboxWindow::reconfigure(void) {
|
||||
upsize();
|
||||
|
||||
client.rect.setPos(frame.rect.left() + frame.margin.left,
|
||||
frame.rect.top() + frame.margin.top);
|
||||
|
||||
positionWindows();
|
||||
decorate();
|
||||
|
||||
redrawWindowFrame();
|
||||
|
||||
configure(frame.rect.x(), frame.rect.y(),
|
||||
frame.rect.width(), frame.rect.height());
|
||||
|
||||
if (windowmenu) {
|
||||
windowmenu->move(windowmenu->getX(), frame.rect.y() + frame.title_h);
|
||||
windowmenu->reconfigure();
|
||||
|
@ -856,14 +830,31 @@ void BlackboxWindow::reconfigure(void) {
|
|||
}
|
||||
|
||||
|
||||
void BlackboxWindow::updateFocusModel(void) {
|
||||
if ((! screen->isSloppyFocus()) || screen->doClickRaise()) {
|
||||
void BlackboxWindow::grabButtons(void) {
|
||||
if ((! screen->isSloppyFocus()) || screen->doClickRaise())
|
||||
// grab button 1 for changing focus/raising
|
||||
blackbox->grabButton(Button1, 0, frame.plate, True, ButtonPressMask,
|
||||
GrabModeSync, GrabModeSync, None, None);
|
||||
} else {
|
||||
GrabModeSync, GrabModeSync, frame.plate, None);
|
||||
|
||||
if (functions & Func_Move)
|
||||
blackbox->grabButton(Button1, Mod1Mask, frame.window, True,
|
||||
ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
|
||||
GrabModeAsync, frame.window,
|
||||
blackbox->getMoveCursor());
|
||||
if (functions & Func_Resize)
|
||||
blackbox->grabButton(Button3, Mod1Mask, frame.window, True,
|
||||
ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
|
||||
GrabModeAsync, frame.window,
|
||||
blackbox->getLowerRightAngleCursor());
|
||||
}
|
||||
|
||||
|
||||
void BlackboxWindow::ungrabButtons(void) {
|
||||
if ((! screen->isSloppyFocus()) || screen->doClickRaise())
|
||||
blackbox->ungrabButton(Button1, 0, frame.plate);
|
||||
}
|
||||
|
||||
blackbox->ungrabButton(Button1, Mod1Mask, frame.window);
|
||||
blackbox->ungrabButton(Button3, Mod1Mask, frame.window);
|
||||
}
|
||||
|
||||
|
||||
|
@ -881,6 +872,11 @@ void BlackboxWindow::positionWindows(void) {
|
|||
client.rect.width(), client.rect.height());
|
||||
XMoveResizeWindow(blackbox->getXDisplay(), client.window,
|
||||
0, 0, client.rect.width(), client.rect.height());
|
||||
// ensure client.rect contains the real location
|
||||
client.rect.setCoords(frame.rect.left() + frame.margin.left,
|
||||
frame.rect.top() + frame.margin.top,
|
||||
frame.rect.right() - frame.margin.right,
|
||||
frame.rect.bottom() - frame.margin.bottom);
|
||||
|
||||
if (decorations & Decor_Titlebar) {
|
||||
if (frame.title == None) createTitlebar();
|
||||
|
@ -1435,9 +1431,15 @@ BlackboxWindow *BlackboxWindow::getTransientFor(void) const {
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* This function is responsible for updating both the client and the frame
|
||||
* rectangles.
|
||||
* According to the ICCCM a client message is not sent for a resize, only a
|
||||
* move.
|
||||
*/
|
||||
void BlackboxWindow::configure(int dx, int dy,
|
||||
unsigned int dw, unsigned int dh) {
|
||||
bool send_event = False;
|
||||
bool send_event = (frame.rect.x() != dx || frame.rect.y() != dy);
|
||||
|
||||
if (dw != frame.rect.width() || dh != frame.rect.height()) {
|
||||
frame.rect.setRect(dx, dy, dw, dh);
|
||||
|
@ -1461,9 +1463,7 @@ void BlackboxWindow::configure(int dx, int dy,
|
|||
positionWindows();
|
||||
decorate();
|
||||
redrawWindowFrame();
|
||||
} else if (frame.rect.x() != dx || frame.rect.y() != dy) {
|
||||
send_event = True;
|
||||
|
||||
} else {
|
||||
frame.rect.setPos(dx, dy);
|
||||
|
||||
XMoveWindow(blackbox->getXDisplay(), frame.window,
|
||||
|
@ -1471,6 +1471,7 @@ void BlackboxWindow::configure(int dx, int dy,
|
|||
}
|
||||
|
||||
if (send_event && ! flags.moving) {
|
||||
// if moving, the update and event will occur when the move finishes
|
||||
client.rect.setPos(frame.rect.left() + frame.margin.left,
|
||||
frame.rect.top() + frame.margin.top);
|
||||
|
||||
|
@ -1490,7 +1491,6 @@ void BlackboxWindow::configure(int dx, int dy,
|
|||
|
||||
XSendEvent(blackbox->getXDisplay(), client.window, False,
|
||||
StructureNotifyMask, &event);
|
||||
|
||||
screen->updateNetizenConfigNotify(&event);
|
||||
}
|
||||
}
|
||||
|
@ -1532,8 +1532,10 @@ void BlackboxWindow::configureShape(void) {
|
|||
bool BlackboxWindow::setInputFocus(void) {
|
||||
if (flags.focused) return True;
|
||||
|
||||
assert(! flags.iconic);
|
||||
|
||||
assert(! flags.iconic &&
|
||||
(flags.stuck || // window must be on the current workspace or sticky
|
||||
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) {
|
||||
|
@ -1541,7 +1543,7 @@ bool BlackboxWindow::setInputFocus(void) {
|
|||
wkspc->setLastFocusedWindow(this);
|
||||
return True;
|
||||
}
|
||||
|
||||
#endif
|
||||
if (! frame.rect.intersects(screen->getRect())) {
|
||||
// client is outside the screen, move it to the center
|
||||
configure((screen->getWidth() - frame.rect.width()) / 2,
|
||||
|
@ -1653,13 +1655,24 @@ void BlackboxWindow::show(void) {
|
|||
XMapWindow(blackbox->getXDisplay(), client.window);
|
||||
XMapSubwindows(blackbox->getXDisplay(), frame.window);
|
||||
XMapWindow(blackbox->getXDisplay(), frame.window);
|
||||
|
||||
#ifdef DEBUG
|
||||
int real_x, real_y;
|
||||
Window child;
|
||||
XTranslateCoordinates(blackbox->getXDisplay(), client.window,
|
||||
screen->getRootWindow(),
|
||||
0, 0, &real_x, &real_y, &child);
|
||||
fprintf(stderr, "%s -- assumed: (%d, %d), real: (%d, %d)\n", getTitle(),
|
||||
client.rect.left(), client.rect.top(), real_x, real_y);
|
||||
assert(client.rect.left() == real_x && client.rect.top() == real_y);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void BlackboxWindow::deiconify(bool reassoc, bool raise) {
|
||||
if (flags.iconic || reassoc)
|
||||
screen->reassociateWindow(this, BSENTINEL, False);
|
||||
else if (blackbox_attrib.workspace != screen->getCurrentWorkspace()->getID())
|
||||
else if (blackbox_attrib.workspace != screen->getCurrentWorkspaceID())
|
||||
return;
|
||||
|
||||
show();
|
||||
|
@ -2116,20 +2129,19 @@ void BlackboxWindow::restoreAttributes(void) {
|
|||
|
||||
if (net->flags & AttribShaded && net->attrib & AttribShaded) {
|
||||
flags.shaded = False;
|
||||
unsigned long orig_state = current_state;
|
||||
shade();
|
||||
|
||||
/*
|
||||
Because the iconic'ness of shaded windows is lost, we need to set the
|
||||
state to NormalState so that shaded windows on other workspaces will not
|
||||
get shown on the first workspace.
|
||||
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.
|
||||
*/
|
||||
current_state = NormalState;
|
||||
if (orig_state != IconicState)
|
||||
current_state = WithdrawnState;
|
||||
}
|
||||
|
||||
if ((net->workspace != screen->getCurrentWorkspaceID()) &&
|
||||
(net->workspace < screen->getWorkspaceCount()))
|
||||
if (net->workspace != screen->getCurrentWorkspaceID() &&
|
||||
net->workspace < screen->getWorkspaceCount())
|
||||
screen->reassociateWindow(this, net->workspace, True);
|
||||
|
||||
if ((blackbox_attrib.workspace != screen->getCurrentWorkspaceID()) &&
|
||||
|
@ -2521,8 +2533,16 @@ void BlackboxWindow::reparentNotifyEvent(const XReparentEvent *re) {
|
|||
}
|
||||
|
||||
|
||||
void BlackboxWindow::propertyNotifyEvent(Atom atom) {
|
||||
switch(atom) {
|
||||
void BlackboxWindow::propertyNotifyEvent(const XPropertyEvent *pe) {
|
||||
if (pe->state == PropertyDelete)
|
||||
return;
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "BlackboxWindow::propertyNotifyEvent(): for 0x%lx\n",
|
||||
client.window);
|
||||
#endif
|
||||
|
||||
switch(pe->atom) {
|
||||
case XA_WM_CLASS:
|
||||
case XA_WM_CLIENT_MACHINE:
|
||||
case XA_WM_COMMAND:
|
||||
|
@ -2567,6 +2587,9 @@ void BlackboxWindow::propertyNotifyEvent(Atom atom) {
|
|||
|
||||
if ((client.normal_hint_flags & PMinSize) &&
|
||||
(client.normal_hint_flags & PMaxSize)) {
|
||||
// the window now can/can't resize itself, so the buttons need to be
|
||||
// regrabbed.
|
||||
ungrabButtons();
|
||||
if (client.max_width <= client.min_width &&
|
||||
client.max_height <= client.min_height) {
|
||||
decorations &= ~(Decor_Maximize | Decor_Handle);
|
||||
|
@ -2575,6 +2598,7 @@ void BlackboxWindow::propertyNotifyEvent(Atom atom) {
|
|||
decorations |= Decor_Maximize | Decor_Handle;
|
||||
functions |= Func_Resize | Func_Maximize;
|
||||
}
|
||||
grabButtons();
|
||||
setAllowedActions();
|
||||
}
|
||||
|
||||
|
@ -2589,7 +2613,7 @@ void BlackboxWindow::propertyNotifyEvent(Atom atom) {
|
|||
}
|
||||
|
||||
default:
|
||||
if (atom == xatom->getAtom(XAtom::wm_protocols)) {
|
||||
if (pe->atom == xatom->getAtom(XAtom::wm_protocols)) {
|
||||
getWMProtocols();
|
||||
|
||||
if ((decorations & Decor_Close) && (! frame.close_button)) {
|
||||
|
@ -2600,7 +2624,7 @@ void BlackboxWindow::propertyNotifyEvent(Atom atom) {
|
|||
}
|
||||
if (windowmenu) windowmenu->reconfigure();
|
||||
}
|
||||
} else if (atom == xatom->getAtom(XAtom::net_wm_strut)) {
|
||||
} else if (pe->atom == xatom->getAtom(XAtom::net_wm_strut)) {
|
||||
updateStrut();
|
||||
}
|
||||
|
||||
|
@ -2610,6 +2634,10 @@ void BlackboxWindow::propertyNotifyEvent(Atom atom) {
|
|||
|
||||
|
||||
void BlackboxWindow::exposeEvent(const XExposeEvent *ee) {
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "BlackboxWindow::exposeEvent() for 0x%lx\n", client.window);
|
||||
#endif
|
||||
|
||||
if (frame.label == ee->window && (decorations & Decor_Titlebar))
|
||||
redrawLabel();
|
||||
else if (frame.close_button == ee->window)
|
||||
|
@ -2667,6 +2695,11 @@ void BlackboxWindow::configureRequestEvent(const XConfigureRequestEvent *cr) {
|
|||
|
||||
|
||||
void BlackboxWindow::buttonPressEvent(const XButtonEvent *be) {
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "BlackboxWindow::buttonPressEvent() for 0x%lx\n",
|
||||
client.window);
|
||||
#endif
|
||||
|
||||
if (frame.maximize_button == be->window) {
|
||||
redrawMaximizeButton(True);
|
||||
} else if (be->button == 1 || (be->button == 3 && be->state == Mod1Mask)) {
|
||||
|
@ -2705,51 +2738,42 @@ void BlackboxWindow::buttonPressEvent(const XButtonEvent *be) {
|
|||
} else if (windowmenu && be->button == 3 &&
|
||||
(frame.title == be->window || frame.label == be->window ||
|
||||
frame.handle == be->window || frame.window == be->window)) {
|
||||
int mx = 0, my = 0;
|
||||
|
||||
if (frame.title == be->window || frame.label == be->window) {
|
||||
mx = be->x_root - (windowmenu->getWidth() / 2);
|
||||
my = frame.rect.y() + frame.title_h + frame.border_w;
|
||||
} else if (frame.handle == be->window) {
|
||||
mx = be->x_root - (windowmenu->getWidth() / 2);
|
||||
my = frame.rect.bottom() - frame.handle_h - (frame.border_w * 3) -
|
||||
windowmenu->getHeight();
|
||||
if (windowmenu->isVisible()) {
|
||||
windowmenu->hide();
|
||||
} else {
|
||||
mx = be->x_root - (windowmenu->getWidth() / 2);
|
||||
int mx = be->x_root - windowmenu->getWidth() / 2,
|
||||
my = be->y_root - windowmenu->getHeight() / 2;
|
||||
|
||||
if (be->y <= static_cast<signed>(frame.bevel_w))
|
||||
my = frame.rect.y() + frame.title_h;
|
||||
else
|
||||
my = be->y_root - (windowmenu->getHeight() / 2);
|
||||
}
|
||||
// snap the window menu into a corner/side if necessary
|
||||
int left_edge, right_edge, top_edge, bottom_edge;
|
||||
|
||||
// snap the window menu into a corner if necessary - we check the
|
||||
// position of the menu with the coordinates of the client to
|
||||
// make the comparisions easier.
|
||||
// XXX: this needs some work!
|
||||
if (mx > client.rect.right() -
|
||||
static_cast<signed>(windowmenu->getWidth()))
|
||||
mx = frame.rect.right() - windowmenu->getWidth() - frame.border_w + 1;
|
||||
if (mx < client.rect.left())
|
||||
mx = frame.rect.x();
|
||||
/*
|
||||
the " + (frame.border_w * 2) - 1" bits are to get the proper width
|
||||
and height of the menu, as the sizes returned by it do not include
|
||||
the borders.
|
||||
*/
|
||||
left_edge = frame.rect.x();
|
||||
right_edge = frame.rect.right() -
|
||||
(windowmenu->getWidth() + (frame.border_w * 2) - 1);
|
||||
top_edge = client.rect.top() - (frame.border_w + frame.mwm_border_w);
|
||||
bottom_edge = client.rect.bottom() -
|
||||
(windowmenu->getHeight() + (frame.border_w * 2) - 1) +
|
||||
(frame.border_w + frame.mwm_border_w);
|
||||
|
||||
if (my > client.rect.bottom() -
|
||||
static_cast<signed>(windowmenu->getHeight()))
|
||||
my = frame.rect.bottom() - windowmenu->getHeight() - frame.border_w + 1;
|
||||
if (my < client.rect.top())
|
||||
my = frame.rect.y() + ((decorations & Decor_Titlebar) ?
|
||||
frame.title_h : 0);
|
||||
if (mx < left_edge)
|
||||
mx = left_edge;
|
||||
if (mx > right_edge)
|
||||
mx = right_edge;
|
||||
if (my < top_edge)
|
||||
my = top_edge;
|
||||
if (my > bottom_edge)
|
||||
my = bottom_edge;
|
||||
|
||||
if (windowmenu) {
|
||||
if (! windowmenu->isVisible()) {
|
||||
windowmenu->move(mx, my);
|
||||
windowmenu->show();
|
||||
XRaiseWindow(blackbox->getXDisplay(), windowmenu->getWindowID());
|
||||
XRaiseWindow(blackbox->getXDisplay(),
|
||||
windowmenu->getSendToMenu()->getWindowID());
|
||||
} else {
|
||||
windowmenu->hide();
|
||||
}
|
||||
}
|
||||
// mouse wheel up
|
||||
} else if (be->button == 4) {
|
||||
|
@ -2768,6 +2792,11 @@ void BlackboxWindow::buttonPressEvent(const XButtonEvent *be) {
|
|||
|
||||
|
||||
void BlackboxWindow::buttonReleaseEvent(const XButtonEvent *re) {
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "BlackboxWindow::buttonReleaseEvent() for 0x%lx\n",
|
||||
client.window);
|
||||
#endif
|
||||
|
||||
if (re->window == frame.maximize_button) {
|
||||
if ((re->x >= 0 && re->x <= static_cast<signed>(frame.button_w)) &&
|
||||
(re->y >= 0 && re->y <= static_cast<signed>(frame.button_w))) {
|
||||
|
@ -2791,9 +2820,6 @@ void BlackboxWindow::buttonReleaseEvent(const XButtonEvent *re) {
|
|||
endMove();
|
||||
} else if (flags.resizing) {
|
||||
endResize();
|
||||
} else if (re->window == frame.window) {
|
||||
if (re->button == 2 && re->state == Mod1Mask)
|
||||
XUngrabPointer(blackbox->getXDisplay(), CurrentTime);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3190,6 +3216,11 @@ void BlackboxWindow::endResize(void) {
|
|||
|
||||
|
||||
void BlackboxWindow::motionNotifyEvent(const XMotionEvent *me) {
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "BlackboxWindow::motionNotifyEvent() for 0x%lx\n",
|
||||
client.window);
|
||||
#endif
|
||||
|
||||
if (flags.moving) {
|
||||
doMove(me->x_root, me->y_root);
|
||||
} else if (flags.resizing) {
|
||||
|
@ -3244,6 +3275,9 @@ void BlackboxWindow::restore(bool remap) {
|
|||
XSelectInput(blackbox->getXDisplay(), client.window, NoEventMask);
|
||||
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);
|
||||
|
||||
restoreGravity(client.rect);
|
||||
|
||||
XUnmapWindow(blackbox->getXDisplay(), frame.window);
|
||||
|
|
|
@ -379,7 +379,8 @@ public:
|
|||
void shade(void);
|
||||
void stick(void);
|
||||
void reconfigure(void);
|
||||
void updateFocusModel(void);
|
||||
void grabButtons(void);
|
||||
void ungrabButtons(void);
|
||||
void installColormap(bool install);
|
||||
void restore(bool remap);
|
||||
void configure(int dx, int dy, unsigned int dw, unsigned int dh);
|
||||
|
@ -394,7 +395,7 @@ public:
|
|||
void mapRequestEvent(const XMapRequestEvent *mre);
|
||||
void unmapNotifyEvent(const XUnmapEvent */*unused*/);
|
||||
void reparentNotifyEvent(const XReparentEvent */*unused*/);
|
||||
void propertyNotifyEvent(Atom atom);
|
||||
void propertyNotifyEvent(const XPropertyEvent *pe);
|
||||
void exposeEvent(const XExposeEvent *ee);
|
||||
void configureRequestEvent(const XConfigureRequestEvent *cr);
|
||||
|
||||
|
|
|
@ -103,8 +103,13 @@ unsigned int Workspace::removeWindow(BlackboxWindow *w) {
|
|||
if ((w->isFocused() || w == lastfocus) &&
|
||||
! screen->getBlackbox()->doShutdown()) {
|
||||
BlackboxWindow *newfocus = 0;
|
||||
if (w->isTransient())
|
||||
if (w->isTransient()) {
|
||||
newfocus = w->getTransientFor();
|
||||
if (newfocus &&
|
||||
(newfocus->isIconic() || // do not focus icons
|
||||
newfocus->getWorkspaceNumber() != id)) // or other workspaces
|
||||
newfocus = 0;
|
||||
}
|
||||
if (! newfocus && ! stackingList.empty())
|
||||
newfocus = stackingList.front();
|
||||
|
||||
|
@ -115,7 +120,7 @@ unsigned int Workspace::removeWindow(BlackboxWindow *w) {
|
|||
if the window is on the visible workspace, then try focus it, and fall
|
||||
back to the default focus target if the window won't focus.
|
||||
*/
|
||||
if (! newfocus || ! newfocus->setInputFocus())
|
||||
if (! (newfocus && newfocus->setInputFocus()))
|
||||
screen->getBlackbox()->setFocusedWindow(0);
|
||||
} else if (lastfocus == w) {
|
||||
/*
|
||||
|
@ -320,12 +325,6 @@ void Workspace::reconfigure(void) {
|
|||
}
|
||||
|
||||
|
||||
void Workspace::updateFocusModel(void) {
|
||||
std::for_each(windowList.begin(), windowList.end(),
|
||||
std::mem_fun(&BlackboxWindow::updateFocusModel));
|
||||
}
|
||||
|
||||
|
||||
BlackboxWindow *Workspace::getWindow(unsigned int index) {
|
||||
if (index < windowList.size()) {
|
||||
BlackboxWindowList::iterator it = windowList.begin();
|
||||
|
|
|
@ -102,7 +102,6 @@ public:
|
|||
void raiseWindow(BlackboxWindow *w);
|
||||
void lowerWindow(BlackboxWindow *w);
|
||||
void reconfigure(void);
|
||||
void updateFocusModel(void);
|
||||
void setCurrent(void);
|
||||
void setName(const std::string& new_name);
|
||||
};
|
||||
|
|
|
@ -322,7 +322,12 @@ void Blackbox::process_event(XEvent *e) {
|
|||
|
||||
BlackboxWindow *win = searchWindow(e->xmaprequest.window);
|
||||
|
||||
if (! win) {
|
||||
if (win) {
|
||||
if (win->isIconic()) {
|
||||
win->deiconify();
|
||||
win->setInputFocus();
|
||||
}
|
||||
} else {
|
||||
BScreen *screen = searchScreen(e->xmaprequest.parent);
|
||||
|
||||
if (! screen) {
|
||||
|
@ -444,13 +449,9 @@ void Blackbox::process_event(XEvent *e) {
|
|||
case PropertyNotify: {
|
||||
last_time = e->xproperty.time;
|
||||
|
||||
if (e->xproperty.state != PropertyDelete) {
|
||||
BlackboxWindow *win = searchWindow(e->xproperty.window);
|
||||
|
||||
if (win)
|
||||
win->propertyNotifyEvent(e->xproperty.atom);
|
||||
}
|
||||
|
||||
win->propertyNotifyEvent(&e->xproperty);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue