aboutsummaryrefslogtreecommitdiff
path: root/wmstatus.c
diff options
context:
space:
mode:
Diffstat (limited to 'wmstatus.c')
-rw-r--r--wmstatus.c151
1 files changed, 123 insertions, 28 deletions
diff --git a/wmstatus.c b/wmstatus.c
index 404f422..8f7a97b 100644
--- a/wmstatus.c
+++ b/wmstatus.c
@@ -42,6 +42,8 @@
#include <pulse/introspect.h>
#include <pulse/subscribe.h>
+#include <dbus/dbus.h>
+
// --- Utilities ---------------------------------------------------------------
enum { PIPE_READ, PIPE_WRITE };
@@ -1168,6 +1170,12 @@ struct app_context
struct poller_fd x_event; ///< X11 event
char *layout; ///< Keyboard layout
+ // Insomnia:
+
+ DBusConnection *system_bus; ///< System bus connection
+ char *insomnia_info; ///< Status message (possibly error)
+ int insomnia_fd; ///< Inhibiting file descriptor
+
// MPD:
struct poller_timer mpd_reconnect; ///< Start MPD communication
@@ -1233,6 +1241,16 @@ app_context_init (struct app_context *self)
poller_fd_init (&self->x_event, &self->poller,
ConnectionNumber (self->dpy));
+ // So far we don't necessarily need DBus to function,
+ // and we have no desire to process any incoming messages either
+ DBusError err = DBUS_ERROR_INIT;
+ self->insomnia_fd = -1;
+ if (!(self->system_bus = dbus_bus_get (DBUS_BUS_SYSTEM, &err)))
+ {
+ print_error ("dbus: %s", err.message);
+ dbus_error_free (&err);
+ }
+
mpd_client_init (&self->mpd_client, &self->poller);
nut_client_init (&self->nut_client, &self->poller);
@@ -1264,6 +1282,10 @@ app_context_free (struct app_context *self)
}
str_free (&self->command_buffer);
+ free (self->insomnia_info);
+ if (self->insomnia_fd != -1)
+ xclose (self->insomnia_fd);
+
mpd_client_free (&self->mpd_client);
free (self->mpd_song);
free (self->mpd_status);
@@ -1492,6 +1514,9 @@ refresh_status (struct app_context *ctx)
if (ctx->nut_status) ctx->backend->add (ctx->backend, ctx->nut_status);
if (ctx->layout) ctx->backend->add (ctx->backend, ctx->layout);
+ if (ctx->insomnia_info)
+ ctx->backend->add (ctx->backend, ctx->insomnia_info);
+
for (size_t i = 0; i < ctx->command_current.len; i++)
ctx->backend->add (ctx->backend, ctx->command_current.vector[i]);
@@ -2354,6 +2379,75 @@ on_standby (struct app_context *ctx, int arg)
}
static void
+go_insomniac (struct app_context *ctx)
+{
+ static const char *what = "sleep:idle";
+ static const char *who = PROGRAM_NAME;
+ static const char *why = "";
+ static const char *mode = "block";
+
+ if (!ctx->system_bus)
+ {
+ ctx->insomnia_info = xstrdup_printf ("%s: %s", "Insomnia", "no DBus");
+ return;
+ }
+
+ DBusMessage *msg = dbus_message_new_method_call
+ ("org.freedesktop.login1", "/org/freedesktop/login1",
+ "org.freedesktop.login1.Manager", "Inhibit");
+ hard_assert (msg != NULL);
+
+ hard_assert (dbus_message_append_args (msg,
+ DBUS_TYPE_STRING, &what,
+ DBUS_TYPE_STRING, &who,
+ DBUS_TYPE_STRING, &why,
+ DBUS_TYPE_STRING, &mode,
+ DBUS_TYPE_INVALID));
+
+ DBusError err = DBUS_ERROR_INIT;
+ DBusMessage *reply = dbus_connection_send_with_reply_and_block
+ (ctx->system_bus, msg, 1000, &err);
+ dbus_message_unref (msg);
+ if (!reply)
+ {
+ ctx->insomnia_info = xstrdup_printf ("%s: %s", "Insomnia", err.message);
+ dbus_error_free (&err);
+ }
+ else if (!dbus_message_get_args (reply, &err,
+ DBUS_TYPE_UNIX_FD, &ctx->insomnia_fd, DBUS_TYPE_INVALID))
+ {
+ dbus_message_unref (reply);
+ ctx->insomnia_info = xstrdup_printf ("%s: %s", "Insomnia", err.message);
+ dbus_error_free (&err);
+ }
+ else
+ {
+ dbus_message_unref (reply);
+ ctx->insomnia_info = xstrdup ("Insomniac");
+ set_cloexec (ctx->insomnia_fd);
+ }
+}
+
+static void
+on_insomnia (struct app_context *ctx, int arg)
+{
+ (void) arg;
+ free (ctx->insomnia_info);
+ ctx->insomnia_info = NULL;
+
+ // Get rid of the lock if we hold one, establish it otherwise
+ if (ctx->insomnia_fd != -1)
+ {
+ xclose (ctx->insomnia_fd);
+ ctx->insomnia_fd = -1;
+ }
+ else
+ go_insomniac (ctx);
+
+ refresh_status (ctx);
+}
+
+static void
on_lock_group (struct app_context *ctx, int arg)
{
XkbLockGroup (ctx->dpy, XkbUseCoreKbd, arg);
@@ -2369,48 +2463,49 @@ struct
g_keys[] =
{
// This key should be labeled L on normal Qwert[yz] layouts
- { Mod4Mask, XK_n, on_lock, 0 },
+ { Mod4Mask, XK_n, on_lock, 0 },
// MPD
- { Mod4Mask, XK_Up, on_mpd_play, 0 },
- { Mod4Mask, XK_Down, on_mpd_stop, 0 },
- { Mod4Mask, XK_Left, on_mpd_prev, 0 },
- { Mod4Mask, XK_Right, on_mpd_next, 0 },
+ { Mod4Mask, XK_Up, on_mpd_play, 0 },
+ { Mod4Mask, XK_Down, on_mpd_stop, 0 },
+ { Mod4Mask, XK_Left, on_mpd_prev, 0 },
+ { Mod4Mask, XK_Right, on_mpd_next, 0 },
/* xmodmap | grep -e Alt_R -e Meta_R -e ISO_Level3_Shift -e Mode_switch */
- { Mod4Mask | Mod5Mask, XK_Left, on_mpd_backward, 0 },
- { Mod4Mask | Mod5Mask, XK_Right, on_mpd_forward, 0 },
+ { Mod4Mask | Mod5Mask, XK_Left, on_mpd_backward, 0 },
+ { Mod4Mask | Mod5Mask, XK_Right, on_mpd_forward, 0 },
// Display input sources
- { Mod4Mask, XK_F5, on_input_switch, 0 },
- { Mod4Mask, XK_F6, on_input_switch, 1 },
- { Mod4Mask, XK_F7, on_input_switch, 2 },
- { Mod4Mask, XK_F8, on_input_switch, 3 },
+ { Mod4Mask, XK_F5, on_input_switch, 0 },
+ { Mod4Mask, XK_F6, on_input_switch, 1 },
+ { Mod4Mask, XK_F7, on_input_switch, 2 },
+ { Mod4Mask, XK_F8, on_input_switch, 3 },
// Keyboard groups
- { Mod4Mask, XK_F9, on_lock_group, 0 },
- { Mod4Mask, XK_F10, on_lock_group, 1 },
- { Mod4Mask, XK_F11, on_lock_group, 2 },
- { Mod4Mask, XK_F12, on_lock_group, 3 },
+ { Mod4Mask, XK_F9, on_lock_group, 0 },
+ { Mod4Mask, XK_F10, on_lock_group, 1 },
+ { Mod4Mask, XK_F11, on_lock_group, 2 },
+ { Mod4Mask, XK_F12, on_lock_group, 3 },
// Brightness
- { Mod4Mask, XK_Home, on_brightness, 10 },
- { Mod4Mask, XK_End, on_brightness, -10 },
+ { Mod4Mask, XK_Home, on_brightness, 10 },
+ { Mod4Mask, XK_End, on_brightness, -10 },
{ 0, XF86XK_MonBrightnessUp, on_brightness, 10 },
{ 0, XF86XK_MonBrightnessDown, on_brightness, -10 },
- { Mod4Mask, XK_Pause, on_standby, 0 },
+ { Mod4Mask, XK_Pause, on_standby, 0 },
+ { Mod4Mask | ShiftMask, XK_Pause, on_insomnia, 0 },
// Volume
- { Mod4Mask, XK_Insert, on_volume_switch, 0 },
- { Mod4Mask, XK_Delete, on_volume_mute, 0 },
- { Mod4Mask, XK_Page_Up, on_volume_set, 5 },
- { Mod4Mask | Mod5Mask, XK_Page_Up, on_volume_set, 1 },
- { Mod4Mask, XK_Page_Down, on_volume_set, -5 },
- { Mod4Mask | Mod5Mask, XK_Page_Down, on_volume_set, -1 },
- { 0, XF86XK_AudioMicMute, on_volume_mic_mute, 0 },
- { 0, XF86XK_AudioMute, on_volume_mute, 0 },
- { 0, XF86XK_AudioRaiseVolume, on_volume_set, 5 },
- { 0, XF86XK_AudioLowerVolume, on_volume_set, -5 },
+ { Mod4Mask, XK_Insert, on_volume_switch, 0 },
+ { Mod4Mask, XK_Delete, on_volume_mute, 0 },
+ { Mod4Mask, XK_Page_Up, on_volume_set, 5 },
+ { Mod4Mask | Mod5Mask, XK_Page_Up, on_volume_set, 1 },
+ { Mod4Mask, XK_Page_Down, on_volume_set, -5 },
+ { Mod4Mask | Mod5Mask, XK_Page_Down, on_volume_set, -1 },
+ { 0, XF86XK_AudioMicMute, on_volume_mic_mute, 0 },
+ { 0, XF86XK_AudioMute, on_volume_mute, 0 },
+ { 0, XF86XK_AudioRaiseVolume, on_volume_set, 5 },
+ { 0, XF86XK_AudioLowerVolume, on_volume_set, -5 },
};
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -