Screen::Screen(int screen)
: WidgetBase(WidgetBase::Type_Root),
- _number(screen)
+ _number(screen),
+ _style(screen, "")
{
assert(screen >= 0); assert(screen < ScreenCount(**otk::display));
_info = otk::display->screenInfo(screen);
XDefineCursor(**otk::display, _info->rootWindow(),
openbox->cursors().session);
- // initialize the shit that is used for all drawing on the screen
- _image_control = new otk::ImageControl(_info, true);
- _image_control->installRootColormap();
- _root_cmap_installed = True;
-
- // initialize the screen's style
- _style.setImageControl(_image_control);
+ // XXX: initialize the screen's style
+ /*
otk::ustring stylepath;
python_get_string("theme", &stylepath);
otk::Configuration sconfig(false);
}
}
_style.load(sconfig);
+ */
+ otk::display->renderControl(_number)->drawRoot(*_style.rootColor());
// set up notification of netwm support
changeSupportedAtoms();
openbox->registerHandler(_info->rootWindow(), this);
// call the python Startup callbacks
- EventData data(_number, 0, EventShutdown, 0);
+ EventData data(_number, 0, EventAction::Shutdown, 0);
openbox->bindings()->fireEvent(&data);
}
unmanageWindow(clients.front());
// call the python Shutdown callbacks
- EventData data(_number, 0, EventShutdown, 0);
+ EventData data(_number, 0, EventAction::Shutdown, 0);
openbox->bindings()->fireEvent(&data);
XDestroyWindow(**otk::display, _focuswindow);
XDestroyWindow(**otk::display, _supportwindow);
-
- delete _image_control;
}
#endif // XINERAMA
*/
- if (old_area != _area)
+ //if (old_area != _area)
// XXX: re-maximize windows
changeWorkArea();
otk::Property::atoms.net_wm_moveresize_size_bottomright,
otk::Property::atoms.net_wm_moveresize_move,
*/
-/*
otk::Property::atoms.net_wm_allowed_actions,
otk::Property::atoms.net_wm_action_move,
otk::Property::atoms.net_wm_action_resize,
+ otk::Property::atoms.net_wm_action_minimize,
otk::Property::atoms.net_wm_action_shade,
+/* otk::Property::atoms.net_wm_action_stick,*/
otk::Property::atoms.net_wm_action_maximize_horz,
otk::Property::atoms.net_wm_action_maximize_vert,
+ otk::Property::atoms.net_wm_action_fullscreen,
otk::Property::atoms.net_wm_action_change_desktop,
otk::Property::atoms.net_wm_action_close,
-*/
+
otk::Property::atoms.net_wm_state,
otk::Property::atoms.net_wm_state_modal,
otk::Property::atoms.net_wm_state_maximized_vert,
// reparented back to root automatically
XChangeSaveSet(**otk::display, window, SetModeInsert);
- if (!(openbox->state() == Openbox::State_Starting ||
- client->positionRequested())) {
- // position the window intelligenty .. hopefully :)
- // call the python PLACEWINDOW binding
- EventData data(_number, client, EventPlaceWindow, 0);
- openbox->bindings()->fireEvent(&data);
- }
-
// create the decoration frame for the client window
client->frame = new Frame(client, &_style);
+ // register the plate for events (map req's)
+ // this involves removing itself from the handler list first, since it is
+ // auto added to the list, being a widget. we won't get any events on the
+ // plate except for events for the client (SubstructureRedirectMask)
+ openbox->clearHandler(client->frame->plate());
+ openbox->registerHandler(client->frame->plate(), client);
// add to the wm's map
openbox->addClient(client->frame->window(), client);
openbox->addClient(client->frame->label(), client);
openbox->addClient(client->frame->button_max(), client);
openbox->addClient(client->frame->button_iconify(), client);
- openbox->addClient(client->frame->button_stick(), client);
+ openbox->addClient(client->frame->button_alldesk(), client);
openbox->addClient(client->frame->button_close(), client);
openbox->addClient(client->frame->handle(), client);
openbox->addClient(client->frame->grip_left(), client);
// reparent the client to the frame
client->frame->grabClient();
+ if (!(openbox->state() == Openbox::State_Starting ||
+ client->positionRequested())) {
+ // position the window intelligenty .. hopefully :)
+ // call the python PLACEWINDOW binding
+ EventData data(_number, client, EventAction::PlaceWindow, 0);
+ openbox->bindings()->fireEvent(&data);
+ }
+
// if on the current desktop.. (or all desktops)
if (client->desktop() == _desktop ||
client->desktop() == (signed)0xffffffff) {
client->frame->show();
}
-
- // XXX: handle any requested states such as maximized
+
+ client->applyStartupState();
otk::display->ungrab();
openbox->bindings()->grabButtons(true, client);
// call the python NEWWINDOW binding
- EventData data(_number, client, EventNewWindow, 0);
+ EventData data(_number, client, EventAction::NewWindow, 0);
openbox->bindings()->fireEvent(&data);
#ifdef DEBUG
- printf("Managed window 0x%lx\n", window);
+ printf("Managed window 0x%lx frame 0x%lx\n",
+ window, client->frame->window());
#endif
}
Frame *frame = client->frame;
// call the python CLOSEWINDOW binding
- EventData data(_number, client, EventCloseWindow, 0);
+ EventData data(_number, client, EventAction::CloseWindow, 0);
openbox->bindings()->fireEvent(&data);
openbox->bindings()->grabButtons(false, client);
openbox->removeClient(frame->label());
openbox->removeClient(frame->button_max());
openbox->removeClient(frame->button_iconify());
- openbox->removeClient(frame->button_stick());
+ openbox->removeClient(frame->button_alldesk());
openbox->removeClient(frame->button_close());
openbox->removeClient(frame->handle());
openbox->removeClient(frame->grip_left());
// reparent the window out of the frame
frame->releaseClient();
+#ifdef DEBUG
+ Window framewin = client->frame->window();
+#endif
delete client->frame;
client->frame = 0;
client->unfocus();
#ifdef DEBUG
- printf("Unmanaged window 0x%lx\n", client->window());
+ printf("Unmanaged window 0x%lx frame 0x%lx\n", client->window(), framewin);
#endif
delete client;
assert(!_stacking.empty()); // this would be bad
Client::List::iterator it = --_stacking.end();
- Client::List::const_iterator end = _stacking.begin();
+ const Client::List::iterator end = _stacking.begin();
for (; it != end && (*it)->layer() < client->layer(); --it);
if (*it == client) return; // already the bottom, return
_stacking.remove(client);
Client::List::iterator it = _stacking.begin();
- Client::List::const_iterator end = _stacking.end();
+ const Client::List::iterator end = _stacking.end();
// the stacking list is from highest to lowest
for (; it != end && (*it)->layer() > client->layer(); ++it);
printf("MapRequest for 0x%lx\n", e.window);
#endif // DEBUG
- /*
- MapRequest events come here even after the window exists instead of going
- right to the client window, because of how they are sent and their struct
- layout.
- */
Client *c = openbox->findClient(e.window);
-
if (c) {
- // send a net_active_window message
- XEvent ce;
- ce.xclient.type = ClientMessage;
- ce.xclient.message_type = otk::Property::atoms.net_active_window;
- ce.xclient.display = **otk::display;
- ce.xclient.window = c->window();
- ce.xclient.format = 32;
- ce.xclient.data.l[0] = 0l;
- ce.xclient.data.l[1] = 0l;
- ce.xclient.data.l[2] = 0l;
- ce.xclient.data.l[3] = 0l;
- ce.xclient.data.l[4] = 0l;
- XSendEvent(**otk::display, _info->rootWindow(), false,
- SubstructureRedirectMask | SubstructureNotifyMask,
- &ce);
+#ifdef DEBUG
+ printf("DEBUG: MAP REQUEST CAUGHT IN SCREEN. IGNORED.\n");
+#endif
} else
manageWindow(e.window);
}
+
}