handle map requests with the root window class

This commit is contained in:
Dana Jansens 2002-12-02 23:03:41 +00:00
parent 958df77162
commit a77f0fb344
6 changed files with 37 additions and 62 deletions

View file

@ -24,6 +24,7 @@ OBFrame::OBFrame(OBClient *client, otk::Style *style)
: otk::OtkWidget(Openbox::instance, style),
_client(client),
_screen(otk::OBDisplay::screenInfo(client->screen())),
_plate(this),
_titlebar(this),
_button_close(&_titlebar),
_button_iconify(&_titlebar),
@ -48,6 +49,9 @@ OBFrame::OBFrame(OBClient *client, otk::Style *style)
_handle.unmanaged();
_grip_left.unmanaged();
_grip_right.unmanaged();
_plate.unmanaged();
_plate.show();
_button_close.setText("X");
_button_iconify.setText("I");
@ -90,6 +94,10 @@ void OBFrame::setStyle(otk::Style *style)
_style = style;
// XXX: change when focus changes!
XSetWindowBorder(otk::OBDisplay::display, _plate.getWindow(),
_style->getFrameFocus()->color().pixel());
XSetWindowBorder(otk::OBDisplay::display, getWindow(),
_style->getBorderColor()->pixel());
XSetWindowBorder(otk::OBDisplay::display, _titlebar.getWindow(),
@ -115,17 +123,21 @@ void OBFrame::adjust()
int width; // the width of the client window and the border around it
int bwidth; // width to make borders
int cbwidth; // width of the inner client border
if (_decorations & OBClient::Decor_Border) {
bwidth = _style->getBorderWidth();
cbwidth = _style->getFrameWidth();
_size.left = _size.top = _size.bottom = _size.right =
_style->getFrameWidth();
width = _client->area().width() + _style->getFrameWidth() * 2;
} else {
bwidth = 0;
bwidth = cbwidth = 0;
_size.left = _size.top = _size.bottom = _size.right = 0;
width = _client->area().width();
}
XSetWindowBorderWidth(otk::OBDisplay::display, _plate.getWindow(), cbwidth);
XSetWindowBorderWidth(otk::OBDisplay::display, getWindow(), bwidth);
XSetWindowBorderWidth(otk::OBDisplay::display, _titlebar.getWindow(),
bwidth);
@ -238,8 +250,8 @@ void OBFrame::adjust()
resize(_size.left + _size.right + _client->area().width(),
_size.top + _size.bottom + _client->area().height());
XMoveWindow(otk::OBDisplay::display, _client->window(),
_size.left, _size.top);
_plate.setGeometry(_size.left, _size.top, _client->area().width(),
_client->area().height());
// map/unmap all the windows
if (_decorations & OBClient::Decor_Titlebar) {
@ -329,7 +341,8 @@ void OBFrame::grabClient()
//XSelectInput(otk::OBDisplay::display, _window, SubstructureRedirectMask);
// reparent the client to the frame
XReparentWindow(otk::OBDisplay::display, _client->window(), getWindow(), 0, 0);
XReparentWindow(otk::OBDisplay::display, _client->window(),
_plate.getWindow(), 0, 0);
_client->ignore_unmaps++;
// raise the client above the frame

View file

@ -38,6 +38,7 @@ private:
otk::Strut _size;
// decoration windows
otk::OtkFocusWidget _plate; // sits entirely under the client window
otk::OtkFocusWidget _titlebar;
otk::OtkButton _button_close;
otk::OtkButton _button_iconify;

View file

@ -121,9 +121,6 @@ Openbox::Openbox(int argc, char **argv)
_property = new otk::OBProperty();
// set this class as the fallback event handler (for map events)
setFallbackHandler(this);
// create the mouse cursors we'll use
_cursors.session = XCreateFontCursor(otk::OBDisplay::display, XC_left_ptr);
_cursors.move = XCreateFontCursor(otk::OBDisplay::display, XC_fleur);
@ -284,58 +281,5 @@ OBClient *Openbox::findClient(Window window)
}
void Openbox::mapRequestHandler(const XMapRequestEvent &e)
{
#ifdef DEBUG
printf("MapRequest for 0x%lx\n", e.window);
#endif // DEBUG
otk::OtkEventHandler::mapRequestHandler(e);
OBClient *client = findClient(e.window);
if (client) {
// XXX: uniconify and/or unshade the window
} else {
int screen = INT_MAX;
for (int i = 0; i < ScreenCount(otk::OBDisplay::display); ++i)
if (otk::OBDisplay::screenInfo(i)->getRootWindow() == e.parent) {
screen = i;
break;
}
if (screen >= ScreenCount(otk::OBDisplay::display)) {
/*
we got a map request for a window who's parent isn't root. this
can happen in only one circumstance:
a client window unmapped a managed window, and then remapped it
somewhere between unmapping the client window and reparenting it
to root.
regardless of how it happens, we need to find the screen that
the window is on
*/
XWindowAttributes wattrib;
if (! XGetWindowAttributes(otk::OBDisplay::display, e.window,
&wattrib)) {
// failed to get the window attributes, perhaps the window has
// now been destroyed?
return;
}
for (int i = 0; i < ScreenCount(otk::OBDisplay::display); ++i)
if (otk::OBDisplay::screenInfo(i)->getRootWindow() == wattrib.root) {
screen = i;
break;
}
}
assert(screen < static_cast<int>(_screens.size()));
_screens[screen]->manageWindow(e.window);
}
}
}

View file

@ -188,8 +188,6 @@ public:
manager can be destroyed.
*/
inline void shutdown() { _doshutdown = true; }
virtual void mapRequestHandler(const XMapRequestEvent &);
};
}

View file

@ -6,6 +6,7 @@
#include "rootwindow.hh"
#include "openbox.hh"
#include "screen.hh"
#include "otk/display.hh"
namespace ob {
@ -91,4 +92,20 @@ void OBRootWindow::setDesktopName(int i, const std::string &name)
}
void OBRootWindow::mapRequestHandler(const XMapRequestEvent &e)
{
#ifdef DEBUG
printf("MapRequest for 0x%lx\n", e.window);
#endif // DEBUG
OBClient *client = Openbox::instance->findClient(e.window);
if (client) {
// XXX: uniconify and/or unshade the window
} else {
Openbox::instance->screen(_info->getScreenNumber())->
manageWindow(e.window);
}
}
}

View file

@ -56,6 +56,8 @@ public:
virtual void clientMessageHandler(const XClientMessageEvent &e);
virtual void mapRequestHandler(const XMapRequestEvent &);
//! Sets the name of a desktop
/*!
@param i The index of the desktop to set the name for (base 0)