int sender_personal;
int sender_mbox;
int hotkey;
+ int led;
};
struct option_node {
o->sender_personal = -1;
o->sender_mbox = -1;
o->hotkey = -1;
+ o->led = -1;
}
static void
MERGE(sender_personal);
MERGE(sender_mbox);
MERGE(hotkey);
+ MERGE(led);
}
}
rethink_display();
}
+#ifdef CONFIG_X_LEDS
+
+#include <X11/Xlib.h>
+
+static Display *leds_dpy;
+static unsigned leds_care, leds_have, leds_want;
+
+static void
+leds_init(void)
+{
+ leds_care = 0;
+ CLIST_FOR_EACH(struct option_node *, o, options)
+ if (o->o.led > 0)
+ leds_care |= (1 << o->o.led);
+ if (!leds_care)
+ {
+ debug("LEDS: No mailbox wants them\n");
+ return;
+ }
+ if (!getenv("DISPLAY"))
+ {
+ debug("LEDS: Do not have X display\n");
+ return;
+ }
+ if (!(leds_dpy = XOpenDisplay(NULL)))
+ die("Cannot open X display, although the DISPLAY variable is set");
+
+ leds_have = ~0U;
+}
+
+static void
+sync_leds(void)
+{
+ if (leds_want == leds_have)
+ return;
+
+ debug("LEDS: have %02x, want %02x, care %02x\n", leds_have, leds_want, leds_care);
+ for (int i=1; i<10; i++)
+ if (leds_care & (leds_have ^ leds_want) & (1 << i))
+ {
+ XKeyboardControl cc;
+ cc.led = i;
+ cc.led_mode = (leds_want & (1 << i)) ? LedModeOn : LedModeOff;
+ XChangeKeyboardControl(leds_dpy, KBLed | KBLedMode, &cc);
+ }
+ XFlush(leds_dpy);
+ leds_have = leds_want;
+}
+
+static void
+rethink_leds(void)
+{
+ if (!leds_dpy)
+ return;
+
+ leds_want = 0;
+ CLIST_FOR_EACH(struct mbox *, b, mboxes)
+ if (b->o.led > 0 && b->new)
+ leds_want |= (1 << b->o.led);
+ sync_leds();
+}
+
+static void
+leds_cleanup(void)
+{
+ if (!leds_dpy)
+ return;
+
+ leds_want = 0;
+ sync_leds();
+}
+
+#else
+
+static void leds_init(void) { }
+static void rethink_leds(void) { }
+static void leds_cleanup(void) { }
+
+#endif
+
static int cursor_at, cursor_max;
enum {
redraw_all();
refresh();
}
+ rethink_leds();
if (beeeep && allow_bells)
beep();
}
e\t\t\tHide from display if empty\n\
f\t\t\tShow flagged messages if there are no new ones\n\
h\t\t\tHide from display\n\
+l<led>\t\t\tLight a keyboard led (1-9) if running on X display\n\
m\t\t\tShow mailbox name of the sender\n\
p\t\t\tShow personal info (full name) of the sender\n\
s\t\t\tShow message snippets\n\
o->priority = x - '0';
else if (x == '!' && *c)
o->hotkey = *c++;
+ else if (x == 'l' && *c >= '1' && *c <= '9')
+ o->led = *c++ - '0';
else
{
int value = !!islower(x);
charset_init();
term_init();
+ leds_init();
scan_and_redraw();
next_active(0, 1);
}
}
+ leds_cleanup();
term_cleanup();
return 0;
}