X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fclient.cc;h=254345730a84e9bbf1c22dbb9b6113a139303d6a;hb=07a7f6a31a06548e98ed10a3a68851db54ff4034;hp=68653c31f462a8a3e007f466f789fe186102b268;hpb=7359d4d711a304b75ecde6cafa7855cdad89535e;p=chaz%2Fopenbox diff --git a/src/client.cc b/src/client.cc index 68653c31..25434573 100644 --- a/src/client.cc +++ b/src/client.cc @@ -1,8 +1,6 @@ // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- -#ifdef HAVE_CONFIG_H -# include "../config.h" -#endif +#include "config.h" #include "client.hh" #include "frame.hh" @@ -29,7 +27,6 @@ namespace ob { Client::Client(int screen, Window window) : otk::EventHandler(), - WidgetBase(WidgetBase::Type_Client), frame(0), _screen(screen), _window(window) { assert(screen >= 0); @@ -481,7 +478,7 @@ void Client::updateNormalHints() _size_inc = otk::Size(1, 1); _base_size = otk::Size(0, 0); _min_size = otk::Size(0, 0); - _max_size = otk::Size(UINT_MAX, UINT_MAX); + _max_size = otk::Size(INT_MAX, INT_MAX); // get the hints from the window if (XGetWMNormalHints(**otk::display, _window, &size, &ret)) { @@ -581,7 +578,7 @@ void Client::updateTitle() _title = _("Unnamed Window"); if (frame) - frame->setTitle(_title); + frame->adjustTitle(); } @@ -822,6 +819,7 @@ void Client::setModal(bool modal) Client *c = this; while (c->_transient_for) { c = c->_transient_for; + if (c == this) break; // circular? if (c->_modal_child) break; // already has a modal child c->_modal_child = this; } @@ -833,11 +831,14 @@ void Client::setModal(bool modal) while (c->_transient_for) // go up the tree c = c->_transient_for; replacement = c->findModalChild(this); // find a modal child, skipping this + assert(replacement != this); c = this; while (c->_transient_for) { c = c->_transient_for; + if (c == this) break; // circular? if (c->_modal_child != this) break; // has a different modal child + if (c == replacement) break; // found the replacement itself c->_modal_child = replacement; } } @@ -1118,27 +1119,26 @@ void Client::shapeHandler(const XShapeEvent &e) #endif -void Client::resize(Corner anchor, unsigned int w, unsigned int h) +void Client::resize(Corner anchor, int w, int h) { if (!(_functions & Func_Resize)) return; internal_resize(anchor, w, h); } -void Client::internal_resize(Corner anchor, unsigned int w, unsigned int h, +void Client::internal_resize(Corner anchor, int w, int h, bool user, int x, int y) { - w -= _base_size.width(); + w -= _base_size.width(); h -= _base_size.height(); if (user) { // for interactive resizing. have to move half an increment in each // direction. - unsigned int mw = w % _size_inc.width(); // how far we are towards the next - // size inc - unsigned int mh = h % _size_inc.height(); - unsigned int aw = _size_inc.width() / 2; // amount to add - unsigned int ah = _size_inc.height() / 2; + int mw = w % _size_inc.width(); // how far we are towards the next size inc + int mh = h % _size_inc.height(); + int aw = _size_inc.width() / 2; // amount to add + int ah = _size_inc.height() / 2; // don't let us move into a new size increment if (mw + aw >= _size_inc.width()) aw = _size_inc.width() - mw - 1; if (mh + ah >= _size_inc.height()) ah = _size_inc.height() - mh - 1; @@ -1714,8 +1714,8 @@ void Client::focusHandler(const XFocusChangeEvent &e) otk::EventHandler::focusHandler(e); - frame->focus(); _focused = true; + frame->adjustFocus(); openbox->setFocusedClient(this); } @@ -1729,26 +1729,29 @@ void Client::unfocusHandler(const XFocusChangeEvent &e) otk::EventHandler::unfocusHandler(e); - frame->unfocus(); _focused = false; + frame->adjustFocus(); if (openbox->focusedClient() == this) openbox->setFocusedClient(0); } -void Client::configureRequestHandler(const XConfigureRequestEvent &e) +void Client::configureRequestHandler(const XConfigureRequestEvent &ec) { #ifdef DEBUG - printf("ConfigureRequest for 0x%lx\n", e.window); + printf("ConfigureRequest for 0x%lx\n", ec.window); #endif // DEBUG - otk::EventHandler::configureRequestHandler(e); + otk::EventHandler::configureRequestHandler(ec); // compress these + XConfigureRequestEvent e = ec; XEvent ev; while (XCheckTypedWindowEvent(**otk::display, window(), ConfigureRequest, &ev)) { + // XXX if this causes bad things.. we can compress config req's with the + // same mask. e.value_mask |= ev.xconfigurerequest.value_mask; if (ev.xconfigurerequest.value_mask & CWX) e.x = ev.xconfigurerequest.x;