add an UrgentNotify callback type. fire it when a window becomes "urgent"
This commit is contained in:
parent
39f19f427b
commit
ab2968b3a5
5 changed files with 30 additions and 2 deletions
|
@ -8,6 +8,7 @@
|
||||||
#include "frame.hh"
|
#include "frame.hh"
|
||||||
#include "screen.hh"
|
#include "screen.hh"
|
||||||
#include "openbox.hh"
|
#include "openbox.hh"
|
||||||
|
#include "bindings.hh"
|
||||||
#include "otk/display.hh"
|
#include "otk/display.hh"
|
||||||
#include "otk/property.hh"
|
#include "otk/property.hh"
|
||||||
|
|
||||||
|
@ -44,6 +45,8 @@ Client::Client(int screen, Window window)
|
||||||
_transient_for = 0;
|
_transient_for = 0;
|
||||||
// pick a layer to start from
|
// pick a layer to start from
|
||||||
_layer = Layer_Normal;
|
_layer = Layer_Normal;
|
||||||
|
// default to not urgent
|
||||||
|
_urgent = false;
|
||||||
|
|
||||||
getArea();
|
getArea();
|
||||||
getDesktop();
|
getDesktop();
|
||||||
|
@ -457,7 +460,7 @@ void Client::updateWMHints(bool initstate)
|
||||||
|
|
||||||
// assume a window takes input if it doesnt specify
|
// assume a window takes input if it doesnt specify
|
||||||
_can_focus = true;
|
_can_focus = true;
|
||||||
_urgent = false;
|
bool ur = false;
|
||||||
|
|
||||||
if ((hints = XGetWMHints(**otk::display, _window)) != NULL) {
|
if ((hints = XGetWMHints(**otk::display, _window)) != NULL) {
|
||||||
if (hints->flags & InputHint)
|
if (hints->flags & InputHint)
|
||||||
|
@ -468,7 +471,7 @@ void Client::updateWMHints(bool initstate)
|
||||||
_iconic = hints->initial_state == IconicState;
|
_iconic = hints->initial_state == IconicState;
|
||||||
|
|
||||||
if (hints->flags & XUrgencyHint)
|
if (hints->flags & XUrgencyHint)
|
||||||
_urgent = true;
|
ur = true;
|
||||||
|
|
||||||
if (hints->flags & WindowGroupHint) {
|
if (hints->flags & WindowGroupHint) {
|
||||||
if (hints->window_group != _group) {
|
if (hints->window_group != _group) {
|
||||||
|
@ -481,6 +484,14 @@ void Client::updateWMHints(bool initstate)
|
||||||
|
|
||||||
XFree(hints);
|
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;
|
_shaded = false;
|
||||||
shade(true);
|
shade(true);
|
||||||
}
|
}
|
||||||
|
if (_urgent)
|
||||||
|
fireUrgent();
|
||||||
|
|
||||||
if (_max_vert); // XXX: incomplete
|
if (_max_vert); // XXX: incomplete
|
||||||
if (_max_horz); // 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)
|
void Client::shade(bool shade)
|
||||||
{
|
{
|
||||||
if (!(_functions & Func_Shade) || // can't
|
if (!(_functions & Func_Shade) || // can't
|
||||||
|
|
|
@ -406,6 +406,10 @@ private:
|
||||||
*/
|
*/
|
||||||
void shade(bool shade);
|
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
|
//! Fullscreen's or unfullscreen's the client window
|
||||||
/*!
|
/*!
|
||||||
@param fs true if the window should be made fullscreen; false if it should
|
@param fs true if the window should be made fullscreen; false if it should
|
||||||
|
|
|
@ -914,6 +914,7 @@ EventShutdown = _openbox.EventShutdown
|
||||||
EventKey = _openbox.EventKey
|
EventKey = _openbox.EventKey
|
||||||
EventFocus = _openbox.EventFocus
|
EventFocus = _openbox.EventFocus
|
||||||
EventBell = _openbox.EventBell
|
EventBell = _openbox.EventBell
|
||||||
|
EventUrgentNotify = _openbox.EventUrgentNotify
|
||||||
NUM_EVENTS = _openbox.NUM_EVENTS
|
NUM_EVENTS = _openbox.NUM_EVENTS
|
||||||
class MouseData(_object):
|
class MouseData(_object):
|
||||||
__swig_setmethods__ = {}
|
__swig_setmethods__ = {}
|
||||||
|
|
|
@ -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 *)"EventKey", (long) ob::EventKey, 0, 0, 0},
|
||||||
{ SWIG_PY_INT, (char *)"EventFocus", (long) ob::EventFocus, 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 *)"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 *)"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", (long) 11, 0, 0, 0},
|
||||||
{ SWIG_PY_INT, (char *)"X_PROTOCOL_REVISION", (long) 0, 0, 0, 0},
|
{ SWIG_PY_INT, (char *)"X_PROTOCOL_REVISION", (long) 0, 0, 0, 0},
|
||||||
|
|
|
@ -64,6 +64,7 @@ enum EventAction {
|
||||||
EventKey,
|
EventKey,
|
||||||
EventFocus,
|
EventFocus,
|
||||||
EventBell,
|
EventBell,
|
||||||
|
EventUrgentNotify,
|
||||||
NUM_EVENTS
|
NUM_EVENTS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue