~sbalneav/ltsp/xexit

« back to all changes in this revision

Viewing changes to src/xexit.c

  • Committer: Scott Balneaves
  • Date: 2010-05-21 16:12:32 UTC
  • Revision ID: sbalneav@3jane-20100521161232-8mgdvklyflxiwqy2
More cleanup and simplification

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
#include <pthread.h>
22
22
 
23
23
#define XEXIT 1
24
 
#define XDIE 2
25
24
#define PING_INTERVAL 10
26
25
 
27
 
char *script;                   /* Script to exit at logout */
28
 
char *d;                        /* DISPLAY environment variable */
29
 
Display *dpy = NULL;            /* Display */
 
26
char *script;                   /* Script to exit at logout */
 
27
char *d;                        /* DISPLAY environment variable */
 
28
Display *dpy = NULL;            /* Display */
30
29
 
31
30
static int
32
31
handle_xerror (Display * display)
34
33
  execlp (script, script, NULL);
35
34
}
36
35
 
37
 
void
38
 
run_script (void)
39
 
{
40
 
  if (dpy != NULL)
41
 
    {
42
 
      handle_xerror (dpy);
43
 
    }
44
 
}
45
 
 
46
36
/*
47
37
 * ping_timeout:
48
38
 *
59
49
    {
60
50
      sleep (PING_INTERVAL);
61
51
      if (!(pd = XOpenDisplay (d)))
62
 
        {
63
 
          run_script ();
64
 
        }
 
52
        {
 
53
          handle_xerror (NULL);
 
54
        }
65
55
      XCloseDisplay (pd);
66
56
    }
67
57
}
77
67
 
78
68
 
79
69
  res = XGetWindowProperty (d, w, a, 0, 512, 0, XA_STRING,
80
 
                            &type, &format, &nitems, &nleft,
81
 
                            (unsigned char **) &result);
 
70
                            &type, &format, &nitems, &nleft,
 
71
                            (unsigned char **) &result);
82
72
 
83
73
  if (res != Success)
84
74
    {
85
75
      if (type == XA_STRING)
86
 
        {
87
 
          if (*result == 'E' || *result == 'e')
88
 
            {                   /* EXIT */
89
 
              return_val = XEXIT;
90
 
            }
91
 
          else
92
 
            {
93
 
              return_val = XDIE;
94
 
            }
95
 
          XFree (result);
96
 
        }
 
76
        {
 
77
          if (*result == 'E' || *result == 'e')
 
78
            {                   /* EXIT */
 
79
              return_val = XEXIT;
 
80
            }
 
81
        }
 
82
      XFree (result);
97
83
    }
98
84
 
99
85
  return return_val;
102
88
int
103
89
main (int argc, char *argv[])
104
90
{
105
 
  Window root;                  /* root window */
106
 
  Atom prog_atom;               /* Our atom */
 
91
  Window root;                  /* root window */
 
92
  Atom prog_atom;               /* Our atom */
107
93
  XEvent ev;
108
94
  pthread_t ping_thread;
109
 
  char *atomname;               /* Our atom to watch for */
 
95
  char *atomname;               /* Our atom to watch for */
110
96
  int rv;
111
97
 
112
98
  if (argc != 2)
134
120
   */
135
121
 
136
122
  if (pthread_create (&ping_thread, NULL, (void *) &ping_timeout,
137
 
                      (void *) NULL) < 0)
 
123
                      (void *) NULL) < 0)
138
124
    {
139
125
      exit (1);
140
126
    }
184
170
  for (;;)
185
171
    {
186
172
      if (XPending (dpy))
187
 
        {
188
 
          XNextEvent (dpy, &ev);
189
 
          if (ev.type == PropertyNotify)
190
 
            {
191
 
              if (ev.xproperty.atom == prog_atom)
192
 
                {
193
 
                  rv = handle_propchange (dpy, root, prog_atom);
194
 
                  if (rv != 0)
195
 
                    {
196
 
                      break;
197
 
                    }
198
 
                }
199
 
            }
200
 
        }
 
173
        {
 
174
          XNextEvent (dpy, &ev);
 
175
          if (ev.type == PropertyNotify)
 
176
            {
 
177
              if (ev.xproperty.atom == prog_atom)
 
178
                {
 
179
                  rv = handle_propchange (dpy, root, prog_atom);
 
180
                  if (rv == XEXIT)
 
181
                    {
 
182
                      XCloseDisplay (dpy);
 
183
                      exit (0);
 
184
                    }
 
185
                }
 
186
            }
 
187
        }
201
188
      else
202
 
        {
203
 
          usleep (100000);
204
 
        }
205
 
    }
206
 
 
207
 
  if (rv == XEXIT)
208
 
    {
209
 
      XCloseDisplay (dpy);
210
 
      dpy = NULL;
211
 
    }
212
 
 
213
 
  run_script ();
 
189
        {
 
190
          usleep (100000);
 
191
        }
 
192
    }
 
193
 
 
194
  handle_xerror (NULL);
214
195
}