Introduction
Introduction Statistics Contact Development Disclaimer Help
twinwatch: Plan 9-ify. - plan9port - [fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port
Log
Files
Refs
README
LICENSE
---
commit 6510a2d3530132753a6a1dfb2589e9ad82bc271c
parent 0ac4bfee32fce9dc336751aa219ca4dbdf3e8ecd
Author: Dan Cross <[email protected]>
Date: Wed, 15 Jan 2020 14:47:39 +0000
winwatch: Plan 9-ify.
This is new code, and custom to plan9port. Make it
conform more closely to plan9 style.
Signed-off-by: Dan Cross <[email protected]>
Diffstat:
M src/cmd/rio/winwatch.c | 838 +++++++++++++++--------------…
1 file changed, 412 insertions(+), 426 deletions(-)
---
diff --git a/src/cmd/rio/winwatch.c b/src/cmd/rio/winwatch.c
t@@ -1,23 +1,25 @@
-/* slightly modified from
-https://github.com/fhs/misc/blob/master/cmd/winwatch/winwatch.c
-so as to deal with memory leaks and certain X errors */
+/*
+ * slightly modified from
+ * https://github.com/fhs/misc/blob/master/cmd/winwatch/winwatch.c
+ * so as to deal with memory leaks and certain X errors
+ */
#include <u.h>
#include <libc.h>
#include <draw.h>
#include <event.h>
#include <regexp.h>
-#include <stdio.h>
+#include <fmt.h>
#include "../devdraw/x11-inc.h"
AUTOLIB(X11);
typedef struct Win Win;
struct Win {
- XWindow n;
- int dirty;
- char *label;
- Rectangle r;
+ XWindow n;
+ int dirty;
+ char *label;
+ Rectangle r;
};
XDisplay *dpy;
t@@ -37,502 +39,486 @@ Image *lightblue;
XErrorHandler oldxerrorhandler;
enum {
- PAD = 3,
- MARGIN = 5
+ PAD = 3,
+ MARGIN = 5
};
static jmp_buf savebuf;
-int
+int
winwatchxerrorhandler(XDisplay *disp, XErrorEvent *xe)
{
- char buf[100];
-
- XGetErrorText(disp, xe->error_code, buf, 100);
- fprintf(stderr, "winwatch: X error %s, request code %d\n", buf,
- xe->request_code);
- XFlush(disp);
- XSync(disp, False);
- XSetErrorHandler(oldxerrorhandler);
- longjmp(savebuf, 1);
+ char buf[100];
+
+ XGetErrorText(disp, xe->error_code, buf, 100);
+ fprint(2, "winwatch: X error %s, request code %d\n",
+ buf, xe->request_code);
+ XFlush(disp);
+ XSync(disp, False);
+ XSetErrorHandler(oldxerrorhandler);
+ longjmp(savebuf, 1);
+ return(0); /* Not reached */
}
void*
erealloc(void *v, ulong n)
{
- v = realloc(v, n);
- if (v == nil)
- sysfatal("out of memory reallocating");
- return v;
+ v = realloc(v, n);
+ if(v==nil)
+ sysfatal("out of memory reallocating");
+ return v;
}
char*
estrdup(char *s)
{
- s = strdup(s);
- if (s == nil)
- sysfatal("out of memory allocating");
- return s;
+ s = strdup(s);
+ if(s==nil)
+ sysfatal("out of memory allocating");
+ return(s);
}
char*
getproperty(XWindow w, Atom a)
{
- uchar *p;
- int fmt;
- Atom type;
- ulong n, dummy;
- int s;
-
- n = 100;
- p = nil;
-
- oldxerrorhandler = XSetErrorHandler(winwatchxerrorhandler);
- s = XGetWindowProperty(dpy, w, a, 0, 100L, 0,
- AnyPropertyType, &type, &fmt, &n, &dummy, &p);
- XFlush(dpy);
- XSync(dpy, False);
- XSetErrorHandler(oldxerrorhandler);
-
-
- if (s == 0)
- return (char *) p;
- else {
- free(p);
- return nil;
- }
+ uchar *p;
+ int fmt;
+ Atom type;
+ ulong n, dummy;
+ int s;
+
+ n = 100;
+ p = nil;
+ oldxerrorhandler = XSetErrorHandler(winwatchxerrorhandler);
+ s = XGetWindowProperty(dpy, w, a, 0, 100L, 0,
+ AnyPropertyType, &type, &fmt, &n, &dummy, &p);
+ XFlush(dpy);
+ XSync(dpy, False);
+ XSetErrorHandler(oldxerrorhandler);
+ if(s!=0){
+ XFree(p);
+ return(nil);
+ }
+
+ return((char*)p);
}
-XWindow
+XWindow
findname(XWindow w)
{
- int i;
- uint nxwin;
- XWindow dw1, dw2, *xwin;
- char *p;
- int s;
- Atom net_wm_name;
-
- p = getproperty(w, XA_WM_NAME);
- if (p) {
- free(p);
- return w;
- }
-
- net_wm_name = XInternAtom (dpy, "_NET_WM_NAME", FALSE);
- p = getproperty(w, net_wm_name);
- if (p) {
- free(p);
- return w;
- }
-
- oldxerrorhandler = XSetErrorHandler(winwatchxerrorhandler);
- s = XQueryTree(dpy, w, &dw1, &dw2, &xwin, &nxwin);
- XFlush(dpy);
- XSync(dpy, False);
- XSetErrorHandler(oldxerrorhandler);
-
- if (s == 0) {
- if (xwin != NULL)
- XFree(xwin);
- return 0;
- }
-
- for (i = 0; i < nxwin; i++) {
- w = findname(xwin[i]);
- if (w != 0) {
- XFree(xwin);
- return w;
- }
- }
-
- XFree(xwin);
-
- return 0;
+ int i;
+ uint nxwin;
+ XWindow dw1, dw2, *xwin;
+ char *p;
+ int s;
+ Atom net_wm_name;
+
+ p = getproperty(w, XA_WM_NAME);
+ if(p){
+ free(p);
+ return(w);
+ }
+
+ net_wm_name = XInternAtom(dpy, "_NET_WM_NAME", FALSE);
+ p = getproperty(w, net_wm_name);
+ if(p){
+ free(p);
+ return(w);
+ }
+
+ oldxerrorhandler = XSetErrorHandler(winwatchxerrorhandler);
+ s = XQueryTree(dpy, w, &dw1, &dw2, &xwin, &nxwin);
+ XFlush(dpy);
+ XSync(dpy, False);
+ XSetErrorHandler(oldxerrorhandler);
+ if(s == 0) {
+ if (xwin != NULL)
+ XFree(xwin);
+ return 0;
+ }
+
+ for (i = 0; i < nxwin; i++) {
+ w = findname(xwin[i]);
+ if (w != 0) {
+ XFree(xwin);
+ return w;
+ }
+ }
+ XFree(xwin);
+
+ return 0;
}
-int
+int
wcmp(const void *w1, const void *w2)
{
- return *(XWindow *) w1 - *(XWindow *) w2;
+ return *(XWindow *) w1 - *(XWindow *) w2;
}
/* unicode-aware case-insensitive strcmp, taken from golang’s gc/subr.c */
-int
+int
_cistrcmp(char *p, char *q)
{
- Rune rp, rq;
-
- while(*p || *q) {
- if(*p == 0)
- return +1;
- if(*q == 0)
- return -1;
- p += chartorune(&rp, p);
- q += chartorune(&rq, q);
- rp = tolowerrune(rp);
- rq = tolowerrune(rq);
- if(rp < rq)
- return -1;
- if(rp > rq)
- return +1;
- }
- return 0;
+ Rune rp, rq;
+
+ while(*p || *q) {
+ if(*p == 0)
+ return +1;
+ if(*q == 0)
+ return -1;
+ p += chartorune(&rp, p);
+ q += chartorune(&rq, q);
+ rp = tolowerrune(rp);
+ rq = tolowerrune(rq);
+ if(rp < rq)
+ return -1;
+ if(rp > rq)
+ return +1;
+ }
+ return 0;
}
-int
+int
winlabelcmp(const void *w1, const void *w2)
{
- const Win *p1 = (Win *) w1;
- const Win *p2 = (Win *) w2;
- return _cistrcmp(p1->label, p2->label);
+ const Win *p1 = (Win *) w1;
+ const Win *p2 = (Win *) w2;
+ return _cistrcmp(p1->label, p2->label);
}
-void
+void
refreshwin(void)
{
- XWindow dw1, dw2, *xwin;
- XClassHint class;
- XWindowAttributes attr;
- char *label;
- char *wmname;
- int i, nw;
- uint nxwin;
- Status s;
- Atom net_wm_name;
-
-
- oldxerrorhandler = XSetErrorHandler(winwatchxerrorhandler);
- s = XQueryTree(dpy, root, &dw1, &dw2, &xwin, &nxwin);
- XFlush(dpy);
- XSync(dpy, False);
- XSetErrorHandler(oldxerrorhandler);
-
- if (s == 0) {
- if (xwin != NULL)
- XFree(xwin);
- return;
- }
- qsort(xwin, nxwin, sizeof(xwin[0]), wcmp);
-
- nw = 0;
- for (i = 0; i < nxwin; i++) {
- memset(&attr, 0, sizeof attr);
- xwin[i] = findname(xwin[i]);
- if (xwin[i] == 0)
- continue;
-
- oldxerrorhandler = XSetErrorHandler(winwatchxerrorhandler);
- s = XGetWindowAttributes(dpy, xwin[i], &attr);
- XFlush(dpy);
- XSync(dpy, False);
- XSetErrorHandler(oldxerrorhandler);
-
- if (s == 0)
- continue;
- if (attr.width <= 0 || attr.override_redirect
- || attr.map_state != IsViewable)
- continue;
-
- oldxerrorhandler = XSetErrorHandler(winwatchxerrorhandler);
- s = XGetClassHint(dpy, xwin[i], &class);
- XFlush(dpy);
- XSync(dpy, False);
- XSetErrorHandler(oldxerrorhandler);
-
- if (s == 0)
- continue;
-
- if (exclude != nil && regexec(exclude, class.res_name, nil, 0)) {
- free(class.res_name);
- free(class.res_class);
- continue;
- }
-
- net_wm_name = XInternAtom (dpy, "_NET_WM_NAME", FALSE);
- wmname = getproperty(xwin[i], net_wm_name);
-
- if (wmname == nil) {
- wmname = getproperty(xwin[i], XA_WM_NAME);
- if (wmname == nil) {
- free(class.res_name);
- free(class.res_class);
- continue;
- }
- }
-
- if (showwmnames == 1)
- label = wmname;
- else
- label = class.res_name;
-
- if (nw < nwin && win[nw].n == xwin[i]
- && strcmp(win[nw].label, label) == 0) {
- nw++;
- free(wmname);
- free(class.res_name);
- free(class.res_class);
- continue;
- }
-
- if (nw < nwin) {
- free(win[nw].label);
- win[nw].label = nil;
- }
-
- if (nw >= mwin) {
- mwin += 8;
- win = erealloc(win, mwin * sizeof(win[0]));
- }
- win[nw].n = xwin[i];
- win[nw].label = estrdup(label);
- win[nw].dirty = 1;
- win[nw].r = Rect(0, 0, 0, 0);
- free(wmname);
- free(class.res_name);
- free(class.res_class);
- nw++;
- }
-
- oldxerrorhandler = XSetErrorHandler(winwatchxerrorhandler);
- XFree(xwin);
- XFlush(dpy);
- XSync(dpy, False);
- XSetErrorHandler(oldxerrorhandler);
-
- while (nwin > nw)
- free(win[--nwin].label);
- nwin = nw;
-
- if (sortlabels == 1)
- qsort(win, nwin, sizeof(struct Win), winlabelcmp);
-
- return;
+ XWindow dw1, dw2, *xwin;
+ XClassHint class;
+ XWindowAttributes attr;
+ char *label;
+ char *wmname;
+ int i, nw;
+ uint nxwin;
+ Status s;
+ Atom net_wm_name;
+
+
+ oldxerrorhandler = XSetErrorHandler(winwatchxerrorhandler);
+ s = XQueryTree(dpy, root, &dw1, &dw2, &xwin, &nxwin);
+ XFlush(dpy);
+ XSync(dpy, False);
+ XSetErrorHandler(oldxerrorhandler);
+ if(s==0){
+ if(xwin!=NULL)
+ XFree(xwin);
+ return;
+ }
+ qsort(xwin, nxwin, sizeof(xwin[0]), wcmp);
+
+ nw = 0;
+ for(i=0; i<nxwin; i++){
+ memset(&attr, 0, sizeof attr);
+ xwin[i] = findname(xwin[i]);
+ if(xwin[i]==0)
+ continue;
+
+ oldxerrorhandler = XSetErrorHandler(winwatchxerrorhandler);
+ s = XGetWindowAttributes(dpy, xwin[i], &attr);
+ XFlush(dpy);
+ XSync(dpy, False);
+ XSetErrorHandler(oldxerrorhandler);
+ if(s==0)
+ continue;
+ if (attr.width <= 0 ||
+ attr.override_redirect ||
+ attr.map_state != IsViewable)
+ continue;
+
+ oldxerrorhandler = XSetErrorHandler(winwatchxerrorhandler);
+ s = XGetClassHint(dpy, xwin[i], &class);
+ XFlush(dpy);
+ XSync(dpy, False);
+ XSetErrorHandler(oldxerrorhandler);
+
+ if(s==0)
+ continue;
+
+ if (exclude!=nil && regexec(exclude, class.res_name, nil, 0)) {
+ free(class.res_name);
+ free(class.res_class);
+ continue;
+ }
+
+ net_wm_name = XInternAtom(dpy, "_NET_WM_NAME", FALSE);
+ wmname = getproperty(xwin[i], net_wm_name);
+
+ if(wmname==nil){
+ wmname = getproperty(xwin[i], XA_WM_NAME);
+ if(wmname==nil){
+ free(class.res_name);
+ free(class.res_class);
+ continue;
+ }
+ }
+
+ label = class.res_name;
+ if(showwmnames==1)
+ label = wmname;
+
+ if(nw<nwin && win[nw].n==xwin[i] && strcmp(win[nw].label, labe…
+ nw++;
+ free(wmname);
+ free(class.res_name);
+ free(class.res_class);
+ continue;
+ }
+
+ if(nw<nwin){
+ free(win[nw].label);
+ win[nw].label = nil;
+ }
+
+ if(nw>=mwin){
+ mwin += 8;
+ win = erealloc(win, mwin * sizeof(win[0]));
+ }
+ win[nw].n = xwin[i];
+ win[nw].label = estrdup(label);
+ win[nw].dirty = 1;
+ win[nw].r = Rect(0, 0, 0, 0);
+ free(wmname);
+ free(class.res_name);
+ free(class.res_class);
+ nw++;
+ }
+
+ oldxerrorhandler = XSetErrorHandler(winwatchxerrorhandler);
+ XFree(xwin);
+ XFlush(dpy);
+ XSync(dpy, False);
+ XSetErrorHandler(oldxerrorhandler);
+
+ while(nwin>nw)
+ free(win[--nwin].label);
+ nwin = nw;
+
+ if(sortlabels==1)
+ qsort(win, nwin, sizeof(struct Win), winlabelcmp);
}
-void
+void
drawnowin(int i)
{
- Rectangle r;
-
- r = Rect(0, 0, (Dx(screen->r) - 2 * MARGIN + PAD) / cols - PAD,
- font->height);
- r = rectaddpt(rectaddpt
- (r,
- Pt(MARGIN + (PAD + Dx(r)) * (i / rows),
- MARGIN + (PAD + Dy(r)) * (i % rows))),
- screen->r.min);
- draw(screen, insetrect(r, -1), lightblue, nil, ZP);
+ Rectangle r;
+
+ r = Rect(0, 0, (Dx(screen->r) - 2 * MARGIN + PAD) / cols - PAD, font->…
+ r = rectaddpt(
+ rectaddpt(r,
+ Pt(MARGIN + (PAD + Dx(r)) * (i / rows),
+ MARGIN + (PAD + Dy(r)) * (i % rows))),
+ screen->r.min);
+ draw(screen, insetrect(r, -1), lightblue, nil, ZP);
}
-void
+void
drawwin(int i)
{
- draw(screen, win[i].r, lightblue, nil, ZP);
- _string(screen, addpt(win[i].r.min, Pt(2, 0)), display->black, ZP,
- font, win[i].label, nil, strlen(win[i].label),
- win[i].r, nil, ZP, SoverD);
- border(screen, win[i].r, 1, display->black, ZP);
- win[i].dirty = 0;
+ draw(screen, win[i].r, lightblue, nil, ZP);
+ _string(screen, addpt(win[i].r.min, Pt(2, 0)), display->black, ZP,
+ font, win[i].label, nil, strlen(win[i].label),
+ win[i].r, nil, ZP, SoverD);
+ border(screen, win[i].r, 1, display->black, ZP);
+ win[i].dirty = 0;
}
-int
+int
geometry(void)
{
- int i, ncols, z;
- Rectangle r;
-
- z = 0;
- rows = (Dy(screen->r) - 2 * MARGIN + PAD) / (font->height + PAD);
- if (rows * cols < nwin || rows * cols >= nwin * 2) {
- ncols = nwin <= 0 ? 1 : (nwin + rows - 1) / rows;
- if (ncols != cols) {
- cols = ncols;
- z = 1;
- }
- }
-
- r = Rect(0, 0, (Dx(screen->r) - 2 * MARGIN + PAD) / cols - PAD,
- font->height);
- for (i = 0; i < nwin; i++)
- win[i].r =
- rectaddpt(rectaddpt
- (r,
- Pt(MARGIN + (PAD + Dx(r)) * (i / rows),
- MARGIN + (PAD + Dy(r)) * (i % rows))),
- screen->r.min);
-
- return z;
+ int i, ncols, z;
+ Rectangle r;
+
+ z = 0;
+ rows = (Dy(screen->r) - 2 * MARGIN + PAD) / (font->height + PAD);
+ if(rows*cols<nwin || rows*cols>=nwin*2){
+ ncols = 1;
+ if(nwin>0)
+ ncols = (nwin + rows - 1) / rows;
+ if(ncols!=cols){
+ cols = ncols;
+ z = 1;
+ }
+ }
+
+ r = Rect(0, 0, (Dx(screen->r) - 2 * MARGIN + PAD) / cols - PAD, font->…
+ for(i=0; i<nwin; i++)
+ win[i].r =
+ rectaddpt(
+ rectaddpt(r,
+ Pt(MARGIN + (PAD + Dx(r)) * (i / rows),
+ MARGIN + (PAD + Dy(r)) * (i % rows))),
+ screen->r.min);
+
+ return z;
}
-void
+void
redraw(Image *screen, int all)
{
- int i;
-
- all |= geometry();
- if (all)
- draw(screen, screen->r, lightblue, nil, ZP);
- for (i = 0; i < nwin; i++)
- if (all || win[i].dirty)
- drawwin(i);
- if (!all)
- for (; i < onwin; i++)
- drawnowin(i);
-
- onwin = nwin;
+ int i;
+
+ all |= geometry();
+ if(all)
+ draw(screen, screen->r, lightblue, nil, ZP);
+ for(i=0; i<nwin; i++)
+ if(all || win[i].dirty)
+ drawwin(i);
+ if(!all)
+ for (; i<onwin; i++)
+ drawnowin(i);
+ onwin = nwin;
}
-void
+void
eresized(int new)
{
- if (new && getwindow(display, Refmesg) < 0)
- fprint(2, "can't reattach to window");
- geometry();
- redraw(screen, 1);
+ if(new && getwindow(display, Refmesg)<0)
+ fprint(2, "can't reattach to window");
+ geometry();
+ redraw(screen, 1);
}
-void
+void
selectwin(XWindow win)
{
- XEvent ev;
- long mask;
-
- memset(&ev, 0, sizeof ev);
- ev.xclient.type = ClientMessage;
- ev.xclient.serial = 0;
- ev.xclient.send_event = True;
- ev.xclient.message_type = net_active_window;
- ev.xclient.window = win;
- ev.xclient.format = 32;
- mask = SubstructureRedirectMask | SubstructureNotifyMask;
-
- XSendEvent(dpy, root, False, mask, &ev);
- XMapRaised(dpy, win);
- XSync(dpy, False);
+ XEvent ev;
+ long mask;
+
+ memset(&ev, 0, sizeof ev);
+ ev.xclient.type = ClientMessage;
+ ev.xclient.serial = 0;
+ ev.xclient.send_event = True;
+ ev.xclient.message_type = net_active_window;
+ ev.xclient.window = win;
+ ev.xclient.format = 32;
+ mask = SubstructureRedirectMask | SubstructureNotifyMask;
+
+ XSendEvent(dpy, root, False, mask, &ev);
+ XMapRaised(dpy, win);
+ XSync(dpy, False);
}
-
-void
+void
click(Mouse m)
{
- int i, j;
-
- if (m.buttons == 0 || (m.buttons & ~4))
- return;
-
- for (i = 0; i < nwin; i++)
- if (ptinrect(m.xy, win[i].r))
- break;
- if (i == nwin)
- return;
-
- do
- m = emouse();
- while (m.buttons == 4);
-
- if (m.buttons != 0) {
- do
- m = emouse();
- while (m.buttons);
- return;
- }
-
- for (j = 0; j < nwin; j++)
- if (ptinrect(m.xy, win[j].r))
- break;
- if (j != i)
- return;
-
- selectwin(win[i].n);
+ int i, j;
+
+ if(m.buttons==0 || (m.buttons&~4))
+ return;
+
+ for(i=0; i<nwin; i++)
+ if(ptinrect(m.xy, win[i].r))
+ break;
+ if(i==nwin)
+ return;
+
+ do
+ m = emouse();
+ while(m.buttons==4);
+
+ if(m.buttons!=0){
+ do
+ m = emouse();
+ while(m.buttons);
+ return;
+ }
+ for(j=0; j<nwin; j++)
+ if(ptinrect(m.xy, win[j].r))
+ break;
+ if(j==i)
+ selectwin(win[i].n);
}
-void
+void
usage(void)
{
- fprint(2,
- "usage: winwatch [-e exclude] [-W winsize] [-f font] [-n] [-s]\n");
- exits("usage");
+ fprint(2,
+ "usage: winwatch [-e exclude] [-W winsize] [-f font] [-n] [-s]\n");
+ exits("usage");
}
-void
+void
main(int argc, char **argv)
{
- char *fontname;
- int Etimer;
- Event e;
-
- sortlabels = 0;
- showwmnames = 0;
-
- fontname = "/lib/font/bit/lucsans/unicode.8.font";
-
- ARGBEGIN {
- case 'W':
- winsize = EARGF(usage());
- break;
- case 'f':
- fontname = EARGF(usage());
- break;
- case 'e':
- exclude = regcomp(EARGF(usage()));
- if (exclude == nil)
- sysfatal("Bad regexp");
- break;
- case 's':
- sortlabels = 1;
- break;
- case 'n':
- showwmnames = 1;
- break;
- default:
- usage();
- }
- ARGEND if (argc)
- usage();
-
- /* moved up from original winwatch.c for p9p because there can be only one…
- einit(Emouse | Ekeyboard);
- Etimer = etimer(0, 1000);
-
- dpy = XOpenDisplay("");
-
- if (dpy == nil)
- sysfatal("open display: %r");
-
- root = DefaultRootWindow(dpy);
- net_active_window = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False);
-
- initdraw(0, 0, "winwatch");
- lightblue = allocimagemix(display, DPalebluegreen, DWhite);
- if (lightblue == nil)
- sysfatal("allocimagemix: %r");
- if ((font = openfont(display, fontname)) == nil)
- sysfatal("font '%s' not found", fontname);
-
-
- /* reentry point upon X server errors */
- setjmp(savebuf);
-
- refreshwin();
- redraw(screen, 1);
-
- for (;;) {
- switch (eread(Emouse | Ekeyboard | Etimer, &e)) {
- case Ekeyboard:
- if (e.kbdc == 0x7F || e.kbdc == 'q')
- exits(0);
- break;
- case Emouse:
- if (e.mouse.buttons)
- click(e.mouse);
- /* fall through */
- default: /* Etimer */
- refreshwin();
- redraw(screen, 0);
- break;
- }
- }
+ char *fontname;
+ int Etimer;
+ Event e;
+
+ sortlabels = 0;
+ showwmnames = 0;
+ fontname = "/lib/font/bit/lucsans/unicode.8.font";
+
+ ARGBEGIN {
+ case 'W':
+ winsize = EARGF(usage());
+ break;
+ case 'f':
+ fontname = EARGF(usage());
+ break;
+ case 'e':
+ exclude = regcomp(EARGF(usage()));
+ if(exclude==nil)
+ sysfatal("Bad regexp");
+ break;
+ case 's':
+ sortlabels = 1;
+ break;
+ case 'n':
+ showwmnames = 1;
+ break;
+ default:
+ usage();
+ } ARGEND;
+
+ if(argc)
+ usage();
+
+ /* moved up from original winwatch.c for p9p because there can be only…
+ einit(Emouse | Ekeyboard);
+ Etimer = etimer(0, 1000);
+
+ dpy = XOpenDisplay("");
+ if(dpy==nil)
+ sysfatal("open display: %r");
+
+ root = DefaultRootWindow(dpy);
+ net_active_window = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False);
+
+ initdraw(0, 0, "winwatch");
+ lightblue = allocimagemix(display, DPalebluegreen, DWhite);
+ if(lightblue==nil)
+ sysfatal("allocimagemix: %r");
+ font = openfont(display, fontname);
+ if(font==nil)
+ sysfatal("font '%s' not found", fontname);
+
+ /* reentry point upon X server errors */
+ setjmp(savebuf);
+
+ refreshwin();
+ redraw(screen, 1);
+ for(;;){
+ switch(eread(Emouse|Ekeyboard|Etimer, &e)){
+ case Ekeyboard:
+ if(e.kbdc==0x7F || e.kbdc=='q')
+ exits(0);
+ break;
+ case Emouse:
+ if(e.mouse.buttons)
+ click(e.mouse);
+ /* fall through */
+ default: /* Etimer */
+ refreshwin();
+ redraw(screen, 0);
+ break;
+ }
+ }
}
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.