Push events to an asynchronous queue, timestamped
This commit is contained in:
parent
c9795fe01a
commit
906b45982c
32
wdmtg.vala
32
wdmtg.vala
@ -49,6 +49,15 @@ namespace Wdmtg {
|
|||||||
|
|
||||||
string? current_title; ///< Current window title
|
string? current_title; ///< Current window title
|
||||||
X.Window current_window; ///< Current window
|
X.Window current_window; ///< Current window
|
||||||
|
bool current_idle = false; ///< Current idle status
|
||||||
|
|
||||||
|
struct Event {
|
||||||
|
public int64 timestamp; ///< When the event happened
|
||||||
|
public string? title; ///< Current title at the time
|
||||||
|
public bool idle; ///< Whether the user is idle
|
||||||
|
}
|
||||||
|
|
||||||
|
AsyncQueue<Event?> queue; ///< Async queue
|
||||||
|
|
||||||
// --- X helpers ---------------------------------------------------------------
|
// --- X helpers ---------------------------------------------------------------
|
||||||
|
|
||||||
@ -119,6 +128,14 @@ namespace Wdmtg {
|
|||||||
return changed;
|
return changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void push_event () {
|
||||||
|
queue.push(Event () {
|
||||||
|
timestamp = get_real_time (),
|
||||||
|
title = current_title,
|
||||||
|
idle = current_idle
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void update_current_window () {
|
void update_current_window () {
|
||||||
var root = dpy.default_root_window ();
|
var root = dpy.default_root_window ();
|
||||||
X.Atom dummy_type; int dummy_format; ulong nitems, dummy_bytes;
|
X.Atom dummy_type; int dummy_format; ulong nitems, dummy_bytes;
|
||||||
@ -139,9 +156,11 @@ namespace Wdmtg {
|
|||||||
new_title = x_window_title (active_window);
|
new_title = x_window_title (active_window);
|
||||||
current_window = active_window;
|
current_window = active_window;
|
||||||
}
|
}
|
||||||
if (update_window_title (new_title))
|
if (update_window_title (new_title)) {
|
||||||
stdout.printf ("Window changed: %s\n",
|
stdout.printf ("Window changed: %s\n",
|
||||||
null != current_title ? current_title : "(none)");
|
null != current_title ? current_title : "(none)");
|
||||||
|
push_event ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void on_x_property_notify (X.PropertyEvent *xproperty) {
|
void on_x_property_notify (X.PropertyEvent *xproperty) {
|
||||||
@ -150,8 +169,10 @@ namespace Wdmtg {
|
|||||||
update_current_window ();
|
update_current_window ();
|
||||||
else if (xproperty.window == current_window
|
else if (xproperty.window == current_window
|
||||||
&& xproperty.atom == net_wm_name) {
|
&& xproperty.atom == net_wm_name) {
|
||||||
if (update_window_title (x_window_title (current_window)))
|
if (update_window_title (x_window_title (current_window))) {
|
||||||
stdout.printf ("Title changed: %s\n", current_title);
|
stdout.printf ("Title changed: %s\n", current_title);
|
||||||
|
push_event ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -174,6 +195,8 @@ namespace Wdmtg {
|
|||||||
void on_x_alarm_notify (X.Sync.AlarmNotifyEvent *xalarm) {
|
void on_x_alarm_notify (X.Sync.AlarmNotifyEvent *xalarm) {
|
||||||
if (xalarm.alarm == idle_alarm_inactive) {
|
if (xalarm.alarm == idle_alarm_inactive) {
|
||||||
stdout.printf ("User is inactive\n");
|
stdout.printf ("User is inactive\n");
|
||||||
|
current_idle = true;
|
||||||
|
push_event ();
|
||||||
|
|
||||||
X.Sync.Value one, minus_one;
|
X.Sync.Value one, minus_one;
|
||||||
X.Sync.int_to_value (out one, 1);
|
X.Sync.int_to_value (out one, 1);
|
||||||
@ -187,6 +210,9 @@ namespace Wdmtg {
|
|||||||
X.Sync.TestType.NegativeComparison, minus_one);
|
X.Sync.TestType.NegativeComparison, minus_one);
|
||||||
} else if (xalarm.alarm == idle_alarm_inactive) {
|
} else if (xalarm.alarm == idle_alarm_inactive) {
|
||||||
stdout.printf ("User is active\n");
|
stdout.printf ("User is active\n");
|
||||||
|
current_idle = false;
|
||||||
|
push_event ();
|
||||||
|
|
||||||
set_idle_alarm (ref idle_alarm_inactive,
|
set_idle_alarm (ref idle_alarm_inactive,
|
||||||
X.Sync.TestType.PositiveComparison, idle_timeout);
|
X.Sync.TestType.PositiveComparison, idle_timeout);
|
||||||
}
|
}
|
||||||
@ -219,6 +245,8 @@ namespace Wdmtg {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
queue = new AsyncQueue<Event?> ();
|
||||||
|
|
||||||
X.init_threads ();
|
X.init_threads ();
|
||||||
if (null == (dpy = new X.Display ()))
|
if (null == (dpy = new X.Display ()))
|
||||||
exit_fatal ("cannot open display");
|
exit_fatal ("cannot open display");
|
||||||
|
Loading…
Reference in New Issue
Block a user