1 /* Copyright (c) 2000 Lars Bernhardsson, see README for licence details */
2
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <errno.h>
6
7 #include <X11/X.h>
8 #include <X11/Xos.h>
9 #include <X11/Xlib.h>
10 #include <X11/Xutil.h>
11 #include <X11/Xatom.h>
12
13
14 Display *dpy;
15
16 Atom exit_larswm;
17 Atom restart_larswm;
18 Atom bartext_larswm;
19
20 void
usage(void)21 usage (void)
22 {
23 fprintf (stderr,
24 "usage: larsremote [-display display] <message text | exit | restart>\n");
25 exit (1);
26 }
27
28 void
sendcmessage(Window w,Atom a,long x,int isroot)29 sendcmessage (Window w, Atom a, long x, int isroot)
30 {
31 XEvent ev;
32 long mask;
33
34 memset (&ev, 0, sizeof (ev));
35
36 ev.xclient.type = ClientMessage;
37 ev.xclient.window = w;
38 ev.xclient.message_type = a;
39 ev.xclient.format = 32;
40 ev.xclient.data.l[0] = x;
41 ev.xclient.data.l[1] = CurrentTime;
42 mask = 0L;
43
44 if (isroot)
45 mask = SubstructureRedirectMask; /* magic! */
46
47 XSendEvent (dpy, w, False, mask, &ev);
48 }
49
50 int
main(int argc,char ** argv)51 main (int argc, char **argv)
52 {
53 int i, do_exit, do_restart, do_message;
54 char *display_string = "";
55 char *msgtext;
56
57 do_exit = do_restart = do_message = 0;
58
59 for (i = 1; i < argc; i++)
60 {
61 if ((strcmp (argv[i], "-display") == 0) && (i + 1 < argc))
62 {
63 display_string = argv[++i];
64 }
65 else if (strcmp (argv[i], "exit") == 0)
66 {
67 do_exit++;
68 }
69 else if (strcmp (argv[i], "restart") == 0)
70 {
71 do_restart++;
72 }
73 else if (strcmp (argv[i], "message") == 0)
74 {
75 msgtext = argv[++i];
76 do_message++;
77 }
78 else
79 {
80 usage ();
81 }
82 }
83
84 if ((do_exit + do_restart + do_message) != 1)
85 usage ();
86
87 dpy = XOpenDisplay (display_string);
88
89 if (dpy == 0)
90 {
91 perror ("XOpenDisplay");
92 exit (1);
93 }
94
95 exit_larswm = XInternAtom (dpy, "LARSWM_EXIT", False);
96 restart_larswm = XInternAtom (dpy, "LARSWM_RESTART", False);
97 bartext_larswm = XInternAtom (dpy, "LARSWM_BARTEXT", False);
98
99 if (do_exit)
100 {
101 sendcmessage (DefaultRootWindow (dpy), exit_larswm, 0L, 1);
102 }
103 else if (do_restart)
104 {
105 sendcmessage (DefaultRootWindow (dpy), restart_larswm, 0L, 1);
106 }
107 else if (do_message)
108 {
109 XTextProperty pr;
110
111 XStringListToTextProperty (&msgtext, 1, &pr);
112 XSetTextProperty (dpy, DefaultRootWindow (dpy), &pr, bartext_larswm);
113 XFree (pr.value);
114 }
115
116 XSync (dpy, False);
117 exit (0);
118 }
119