X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fclient.cc;h=83ee5b9a22e379a15652929ae607e82547e93e22;hb=edd539420796233d3f69e1cceaa0f491ffdb5c6a;hp=f60a8da62e33882c38631cd62f3d9751ae5f6e0f;hpb=8a7bff7a05b20b2f330c4d4e5f768a9bacb44ff9;p=chaz%2Fopenbox diff --git a/src/client.cc b/src/client.cc index f60a8da6..83ee5b9a 100644 --- a/src/client.cc +++ b/src/client.cc @@ -58,8 +58,8 @@ Client::Client(int screen, Window window) getDesktop(); updateTransientFor(); - getType(); getMwmHints(); + getType(); // this can change the mwmhints for special cases getState(); getShaped(); @@ -188,9 +188,12 @@ void Client::getType() _type = Type_Dialog; else if (val[i] == otk::Property::atoms.net_wm_window_type_normal) _type = Type_Normal; -// XXX: make this work again -// else if (val[i] == otk::Property::atoms.kde_net_wm_window_type_override) -// mwm_decorations = 0; // prevent this window from getting any decor + else if (val[i] == otk::Property::atoms.kde_net_wm_window_type_override){ + // prevent this window from getting any decor or functionality + _mwmhints.flags &= MwmFlag_Functions | MwmFlag_Decorations; + _mwmhints.decorations = 0; + _mwmhints.functions = 0; + } if (_type != (WindowType) -1) break; // grab the first known type } @@ -481,9 +484,6 @@ void Client::updateNormalHints() _min_size.setPoint(0, 0); _max_size.setPoint(INT_MAX, INT_MAX); - // XXX: might want to cancel any interactive resizing of the window at this - // point.. - // get the hints from the window if (XGetWMNormalHints(**otk::display, _window, &size, &ret)) { _positioned = (size.flags & (PPosition|USPosition)); @@ -495,7 +495,7 @@ void Client::updateNormalHints() // changing its gravity if (frame && _gravity != oldgravity) { // move our idea of the client's position based on its new gravity - int x, y; + int x = frame->rect().x(), y = frame->rect().y(); frame->frameGravity(x, y); _area.setPos(x, y); } @@ -679,8 +679,6 @@ void Client::updateTransientFor() _transient_for = c; if (_transient_for) _transient_for->_transients.push_back(this); // add to new parent - - // XXX: change decor status? } } @@ -841,7 +839,6 @@ void Client::setState(StateAction action, long data1, long data2) } else if (state == otk::Property::atoms.net_wm_state_maximized_horz) { if (_max_horz) continue; maxh = true; - // XXX: resize the window etc } else if (state == otk::Property::atoms.net_wm_state_shaded) { shadestate = true; } else if (state == otk::Property::atoms.net_wm_state_skip_taskbar) { @@ -1149,6 +1146,8 @@ void Client::internal_resize(Corner anchor, int w, int h, bool user, void Client::move(int x, int y) { if (!(_functions & Func_Move)) return; + frame->frameGravity(x, y); // get the client's position based on x,y for the + // frame internal_move(x, y); } @@ -1376,18 +1375,11 @@ void Client::maximize(bool max, int dir, bool savearea) if (dir == 2 && !_max_vert) return; } - int g = _gravity; - const otk::Rect &a = openbox->screen(_screen)->area(); - int x = _area.x(), y = _area.y(), w = _area.width(), h = _area.height(); + int x = frame->rect().x(), y = frame->rect().y(), + w = _area.width(), h = _area.height(); if (max) { - // when maximizing, put the client where we want, NOT the frame! - _gravity = StaticGravity; - // adjust our idea of position based on StaticGravity, so we stay put - // unless asked - frame->frameGravity(x, y); - if (savearea) { long dimensions[4]; long *readdim; @@ -1425,7 +1417,7 @@ void Client::maximize(bool max, int dir, bool savearea) w = a.width(); } if (dir == 0 || dir == 2) { // vert - y = a.y() + frame->size().top; + y = a.y(); h = a.height() - frame->size().top - frame->size().bottom; } } else { @@ -1457,24 +1449,20 @@ void Client::maximize(bool max, int dir, bool savearea) h = a.height() / 2; } } - otk::Property::erase(_window, otk::Property::atoms.openbox_premax); } if (dir == 0 || dir == 1) // horz _max_horz = max; if (dir == 0 || dir == 2) // vert _max_vert = max; + + if (!_max_horz && !_max_vert) + otk::Property::erase(_window, otk::Property::atoms.openbox_premax); + changeState(); // change the state hints on the client + frame->frameGravity(x, y); // figure out where the client should be going internal_resize(TopLeft, w, h, true, x, y); - _gravity = g; - if (max) { - // because of my little gravity trick in here, we have to set the position - // of the client to what it really is - int x, y; - frame->frameGravity(x, y); - _area.setPos(x, y); - } } @@ -1560,6 +1548,13 @@ void Client::disableDecorations(DecorationFlags flags) } +bool Client::focusModalChild() +{ + // XXX: find a modal child recursively and try focus it + return false; +} + + bool Client::focus() { // won't try focus if the client doesn't want it, or if the window isn't @@ -1568,6 +1563,10 @@ bool Client::focus() if (_focused) return true; + if (_modal) + if (focusModalChild()) + return true; + // do a check to see if the window has already been unmapped or destroyed // do this intelligently while watching out for unmaps we've generated // (ignore_unmaps > 0)