X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fclient.cc;h=2372a26d8de5ea29a16d893f10ffc7e90ffac790;hb=747c089ae1c7df345c7ad98f833e8640ab0bc851;hp=91d61f4bd20392904744e19f06e675ebfde4b4c9;hpb=f4b87e04a2a1d285f7b6f93b3db08f040ba5c32c;p=chaz%2Fopenbox diff --git a/src/client.cc b/src/client.cc index 91d61f4b..2372a26d 100644 --- a/src/client.cc +++ b/src/client.cc @@ -8,6 +8,7 @@ #include "frame.hh" #include "screen.hh" #include "openbox.hh" +#include "bindings.hh" #include "otk/display.hh" #include "otk/property.hh" @@ -44,6 +45,8 @@ Client::Client(int screen, Window window) _transient_for = 0; // pick a layer to start from _layer = Layer_Normal; + // default to not urgent + _urgent = false; getArea(); getDesktop(); @@ -73,7 +76,7 @@ Client::Client(int screen, Window window) updateStrut(); // this makes sure that these windows appear on all desktops - if (_type == Type_Dock || _type == Type_Desktop) + if (/*_type == Type_Dock ||*/ _type == Type_Desktop) _desktop = 0xffffffff; // set the desktop hint, to make sure that it always exists, and to reflect @@ -126,9 +129,13 @@ void Client::getDesktop() // defaults to the current desktop _desktop = openbox->screen(_screen)->desktop(); - otk::Property::get(_window, otk::Property::atoms.net_wm_desktop, - otk::Property::atoms.cardinal, - (long unsigned*)&_desktop); + if (otk::Property::get(_window, otk::Property::atoms.net_wm_desktop, + otk::Property::atoms.cardinal, + (long unsigned*)&_desktop)) { +#ifdef DEBUG + printf("DEBUG: Window requested desktop: %ld\n", _desktop); +#endif + } } @@ -457,7 +464,7 @@ void Client::updateWMHints(bool initstate) // assume a window takes input if it doesnt specify _can_focus = true; - _urgent = false; + bool ur = false; if ((hints = XGetWMHints(**otk::display, _window)) != NULL) { if (hints->flags & InputHint) @@ -468,7 +475,7 @@ void Client::updateWMHints(bool initstate) _iconic = hints->initial_state == IconicState; if (hints->flags & XUrgencyHint) - _urgent = true; + ur = true; if (hints->flags & WindowGroupHint) { if (hints->window_group != _group) { @@ -481,6 +488,18 @@ void Client::updateWMHints(bool initstate) XFree(hints); } + + if (ur != _urgent) { + _urgent = ur; +#ifdef DEBUG + printf("DEBUG: Urgent Hint for 0x%lx: %s\n", + (long)_window, _urgent ? "ON" : "OFF"); +#endif + // fire the urgent callback if we're mapped, otherwise, wait until after + // we're mapped + if (_urgent && frame) + fireUrgent(); + } } @@ -1174,6 +1193,8 @@ void Client::applyStartupState() _shaded = false; shade(true); } + if (_urgent) + fireUrgent(); if (_max_vert); // XXX: incomplete if (_max_horz); // XXX: incomplete @@ -1186,6 +1207,14 @@ void Client::applyStartupState() } +void Client::fireUrgent() +{ + // call the python UrgentWindow callbacks + EventData data(_screen, this, EventUrgentWindow, 0); + openbox->bindings()->fireEvent(&data); +} + + void Client::shade(bool shade) { if (!(_functions & Func_Shade) || // can't @@ -1266,7 +1295,7 @@ bool Client::focus() } while (XCheckTypedWindowEvent(**otk::display, _window, UnmapNotify, &ev)) { if (ignore_unmaps) { - --ignore_unmaps; + unmapHandler(ev.xunmap); } else { XPutBackEvent(**otk::display, &ev); return false; @@ -1406,7 +1435,7 @@ void Client::unmapHandler(const XUnmapEvent &e) { if (ignore_unmaps) { #ifdef DEBUG -// printf("Ignored UnmapNotify for 0x%lx (event 0x%lx)\n", e.window, e.event); + printf("Ignored UnmapNotify for 0x%lx (event 0x%lx)\n", e.window, e.event); #endif // DEBUG ignore_unmaps--; return;