From: Dana Jansens Date: Fri, 24 Jan 2003 00:44:36 +0000 (+0000) Subject: add an UrgentNotify callback type. fire it when a window becomes "urgent" X-Git-Url: https://git.dogcows.com/gitweb?a=commitdiff_plain;h=ab2968b3a5d61e2dc6b0a64153a7abb0078ee442;hp=39f19f427b68058b00e17ac972c5d9dfbda8c2e0;p=chaz%2Fopenbox add an UrgentNotify callback type. fire it when a window becomes "urgent" --- diff --git a/src/client.cc b/src/client.cc index 80cc1a2c..473c37f8 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(); @@ -457,7 +460,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 +471,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 +484,14 @@ void Client::updateWMHints(bool initstate) XFree(hints); } + + if (ur != _urgent) { + _urgent = ur; + // fire the urgent callback if we're mapped, otherwise, wait until after + // we're mapped + if (_urgent && frame) + fireUrgent(); + } } @@ -1174,6 +1185,8 @@ void Client::applyStartupState() _shaded = false; shade(true); } + if (_urgent) + fireUrgent(); if (_max_vert); // XXX: incomplete if (_max_horz); // XXX: incomplete @@ -1186,6 +1199,14 @@ void Client::applyStartupState() } +void Client::fireUrgent() +{ + // call the python UrgentNotify callbacks + EventData data(_screen, this, EventUrgentNotify, 0); + openbox->bindings()->fireEvent(&data); +} + + void Client::shade(bool shade) { if (!(_functions & Func_Shade) || // can't diff --git a/src/client.hh b/src/client.hh index 420a8c4a..c8110a3f 100644 --- a/src/client.hh +++ b/src/client.hh @@ -406,6 +406,10 @@ private: */ void shade(bool shade); + //! Fires the urgent callbacks which lets the user do what they want with + //! urgent windows + void fireUrgent(); + //! Fullscreen's or unfullscreen's the client window /*! @param fs true if the window should be made fullscreen; false if it should diff --git a/src/openbox.py b/src/openbox.py index 68dc29a3..a7ca525b 100644 --- a/src/openbox.py +++ b/src/openbox.py @@ -914,6 +914,7 @@ EventShutdown = _openbox.EventShutdown EventKey = _openbox.EventKey EventFocus = _openbox.EventFocus EventBell = _openbox.EventBell +EventUrgentNotify = _openbox.EventUrgentNotify NUM_EVENTS = _openbox.NUM_EVENTS class MouseData(_object): __swig_setmethods__ = {} diff --git a/src/openbox_wrap.cc b/src/openbox_wrap.cc index f4fc5783..7473e961 100644 --- a/src/openbox_wrap.cc +++ b/src/openbox_wrap.cc @@ -12095,6 +12095,7 @@ static swig_const_info swig_const_table[] = { { SWIG_PY_INT, (char *)"EventKey", (long) ob::EventKey, 0, 0, 0}, { SWIG_PY_INT, (char *)"EventFocus", (long) ob::EventFocus, 0, 0, 0}, { SWIG_PY_INT, (char *)"EventBell", (long) ob::EventBell, 0, 0, 0}, +{ SWIG_PY_INT, (char *)"EventUrgentNotify", (long) ob::EventUrgentNotify, 0, 0, 0}, { SWIG_PY_INT, (char *)"NUM_EVENTS", (long) ob::NUM_EVENTS, 0, 0, 0}, { SWIG_PY_INT, (char *)"X_PROTOCOL", (long) 11, 0, 0, 0}, { SWIG_PY_INT, (char *)"X_PROTOCOL_REVISION", (long) 0, 0, 0, 0}, diff --git a/src/python.hh b/src/python.hh index 7cec7667..d8b943e7 100644 --- a/src/python.hh +++ b/src/python.hh @@ -64,6 +64,7 @@ enum EventAction { EventKey, EventFocus, EventBell, + EventUrgentNotify, NUM_EVENTS };