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