/[rdesktop]/sourceforge.net/branches/seamlessrdp-branch/rdesktop/ewmhints.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /sourceforge.net/branches/seamlessrdp-branch/rdesktop/ewmhints.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

sourceforge.net/trunk/rdesktop/ewmhints.c revision 1013 by astrand, Mon Sep 12 12:36:45 2005 UTC sourceforge.net/branches/seamlessrdp-branch/rdesktop/ewmhints.c revision 1119 by astrand, Wed Mar 15 06:42:57 2006 UTC
# Line 24  Line 24 
24  #include <X11/Xlib.h>  #include <X11/Xlib.h>
25  #include "rdesktop.h"  #include "rdesktop.h"
26    
27    #define _NET_WM_STATE_REMOVE        0   /* remove/unset property */
28    #define _NET_WM_STATE_ADD           1   /* add/set property */
29    #define _NET_WM_STATE_TOGGLE        2   /* toggle property  */
30    
31  extern Display *g_display;  extern Display *g_display;
32    static Atom g_net_wm_state_maximized_vert_atom, g_net_wm_state_maximized_horz_atom,
33            g_net_wm_state_hidden_atom;
34    Atom g_net_wm_state_atom, g_net_wm_desktop_atom;
35    
36  /*  /*
37     Get window property value (32 bit format)     Get window property value (32 bit format)
38     Returns zero on success, -1 on error     Returns zero on success, -1 on error
39  */  */
40  static int  static int
41  get_property_value(char *propname, long max_length,  get_property_value(Window wnd, char *propname, long max_length,
42                     unsigned long *nitems_return, unsigned char **prop_return)                     unsigned long *nitems_return, unsigned char **prop_return)
43  {  {
44          int result;          int result;
# Line 47  get_property_value(char *propname, long Line 54  get_property_value(char *propname, long
54                  return (-1);                  return (-1);
55          }          }
56    
57          result = XGetWindowProperty(g_display, DefaultRootWindow(g_display), property, 0,       /* long_offset */          result = XGetWindowProperty(g_display, wnd, property, 0,        /* long_offset */
58                                      max_length, /* long_length */                                      max_length, /* long_length */
59                                      False,      /* delete */                                      False,      /* delete */
60                                      AnyPropertyType,    /* req_type */                                      AnyPropertyType,    /* req_type */
# Line 63  get_property_value(char *propname, long Line 70  get_property_value(char *propname, long
70    
71          if (actual_type_return == None || actual_format_return == 0)          if (actual_type_return == None || actual_format_return == 0)
72          {          {
73                  fprintf(stderr, "Root window is missing property %s\n", propname);                  fprintf(stderr, "Window is missing property %s\n", propname);
74                  return (-1);                  return (-1);
75          }          }
76    
# Line 93  get_current_desktop(void) Line 100  get_current_desktop(void)
100          unsigned char *prop_return;          unsigned char *prop_return;
101          int current_desktop;          int current_desktop;
102    
103          if (get_property_value("_NET_CURRENT_DESKTOP", 1, &nitems_return, &prop_return) < 0)          if (get_property_value
104                (DefaultRootWindow(g_display), "_NET_CURRENT_DESKTOP", 1, &nitems_return,
105                 &prop_return) < 0)
106                  return (-1);                  return (-1);
107    
108          if (nitems_return != 1)          if (nitems_return != 1)
# Line 125  get_current_workarea(uint32 * x, uint32 Line 134  get_current_workarea(uint32 * x, uint32
134          const uint32 net_workarea_height_offset = 3;          const uint32 net_workarea_height_offset = 3;
135          const uint32 max_prop_length = 32 * 4;  /* Max 32 desktops */          const uint32 max_prop_length = 32 * 4;  /* Max 32 desktops */
136    
137          if (get_property_value("_NET_WORKAREA", max_prop_length, &nitems_return, &prop_return) < 0)          if (get_property_value
138                (DefaultRootWindow(g_display), "_NET_WORKAREA", max_prop_length, &nitems_return,
139                 &prop_return) < 0)
140                  return (-1);                  return (-1);
141    
142          if (nitems_return % 4)          if (nitems_return % 4)
# Line 153  get_current_workarea(uint32 * x, uint32 Line 164  get_current_workarea(uint32 * x, uint32
164  }  }
165    
166    
167    
168    void
169    ewmh_init()
170    {
171            g_net_wm_state_maximized_vert_atom =
172                    XInternAtom(g_display, "_NET_WM_STATE_MAXIMIZED_VERT", False);
173            g_net_wm_state_maximized_horz_atom =
174                    XInternAtom(g_display, "_NET_WM_STATE_MAXIMIZED_HORZ", False);
175            g_net_wm_state_hidden_atom = XInternAtom(g_display, "_NET_WM_STATE_HIDDEN", False);
176            g_net_wm_state_atom = XInternAtom(g_display, "_NET_WM_STATE", False);
177            g_net_wm_desktop_atom = XInternAtom(g_display, "_NET_WM_DESKTOP", False);
178    }
179    
180    
181    /*
182       Get the window state: normal/minimized/maximized.
183    */
184    #ifndef MAKE_PROTO
185    int
186    ewmh_get_window_state(Window w)
187    {
188            unsigned long nitems_return;
189            unsigned char *prop_return;
190            uint32 *return_words;
191            unsigned long item;
192            BOOL maximized_vert, maximized_horz, hidden;
193    
194            maximized_vert = maximized_horz = hidden = False;
195    
196            if (get_property_value(w, "_NET_WM_STATE", 64, &nitems_return, &prop_return) < 0)
197                    return SEAMLESSRDP_NORMAL;
198    
199            return_words = (uint32 *) prop_return;
200    
201            for (item = 0; item < nitems_return; item++)
202            {
203                    if (return_words[item] == g_net_wm_state_maximized_vert_atom)
204                            maximized_vert = True;
205                    if (return_words[item] == g_net_wm_state_maximized_horz_atom)
206                            maximized_horz = True;
207                    if (return_words[item] == g_net_wm_state_hidden_atom)
208                            hidden = True;
209            }
210    
211            XFree(prop_return);
212    
213            if (maximized_vert && maximized_horz)
214                    return SEAMLESSRDP_MAXIMIZED;
215            else if (hidden)
216                    return SEAMLESSRDP_MINIMIZED;
217            else
218                    return SEAMLESSRDP_NORMAL;
219    }
220    
221    /*
222       Set the window state: normal/minimized/maximized.
223       Returns -1 on failure.
224    */
225    int
226    ewmh_change_state(Window wnd, int state)
227    {
228            Status status;
229            XEvent xevent;
230    
231            /*
232             * Deal with the hidden atom
233             */
234            xevent.type = ClientMessage;
235            xevent.xclient.window = wnd;
236            xevent.xclient.message_type = g_net_wm_state_atom;
237            xevent.xclient.format = 32;
238            if (state == SEAMLESSRDP_MINIMIZED)
239                    xevent.xclient.data.l[0] = _NET_WM_STATE_ADD;
240            else
241                    xevent.xclient.data.l[0] = _NET_WM_STATE_REMOVE;
242            xevent.xclient.data.l[1] = g_net_wm_state_hidden_atom;
243            xevent.xclient.data.l[2] = 0;
244            xevent.xclient.data.l[3] = 0;
245            xevent.xclient.data.l[4] = 0;
246            status = XSendEvent(g_display, DefaultRootWindow(g_display), False,
247                                SubstructureNotifyMask | SubstructureRedirectMask, &xevent);
248            if (!status)
249                    return -1;
250    
251    
252            /*
253             * Deal with the max atoms
254             */
255            xevent.type = ClientMessage;
256            xevent.xclient.window = wnd;
257            xevent.xclient.message_type = g_net_wm_state_atom;
258            xevent.xclient.format = 32;
259            if (state == SEAMLESSRDP_MAXIMIZED)
260                    xevent.xclient.data.l[0] = _NET_WM_STATE_ADD;
261            else
262                    xevent.xclient.data.l[0] = _NET_WM_STATE_REMOVE;
263            xevent.xclient.data.l[1] = g_net_wm_state_maximized_vert_atom;
264            xevent.xclient.data.l[2] = g_net_wm_state_maximized_horz_atom;
265            xevent.xclient.data.l[3] = 0;
266            xevent.xclient.data.l[4] = 0;
267            status = XSendEvent(g_display, DefaultRootWindow(g_display), False,
268                                SubstructureNotifyMask | SubstructureRedirectMask, &xevent);
269            if (!status)
270                    return -1;
271    
272            return 0;
273    }
274    
275    
276    int
277    ewmh_get_window_desktop(Window wnd)
278    {
279            unsigned long nitems_return;
280            unsigned char *prop_return;
281            int desktop;
282    
283            if (get_property_value(wnd, "_NET_WM_DESKTOP", 1, &nitems_return, &prop_return) < 0)
284                    return (-1);
285    
286            if (nitems_return != 1)
287            {
288                    fprintf(stderr, "_NET_WM_DESKTOP has bad length\n");
289                    return (-1);
290            }
291    
292            desktop = *prop_return;
293            XFree(prop_return);
294            return desktop;
295    }
296    
297    
298    int
299    ewmh_move_to_desktop(Window wnd, unsigned int desktop)
300    {
301            Status status;
302            XEvent xevent;
303    
304            xevent.type = ClientMessage;
305            xevent.xclient.window = wnd;
306            xevent.xclient.message_type = g_net_wm_desktop_atom;
307            xevent.xclient.format = 32;
308            xevent.xclient.data.l[0] = desktop;
309            xevent.xclient.data.l[1] = 0;
310            xevent.xclient.data.l[2] = 0;
311            xevent.xclient.data.l[3] = 0;
312            xevent.xclient.data.l[4] = 0;
313            status = XSendEvent(g_display, DefaultRootWindow(g_display), False,
314                                SubstructureNotifyMask | SubstructureRedirectMask, &xevent);
315            if (!status)
316                    return -1;
317    
318            return 0;
319    }
320    
321    #endif /* MAKE_PROTO */
322    
323    
324  #if 0  #if 0
325    
326  /* FIXME: _NET_MOVERESIZE_WINDOW is for pagers, not for  /* FIXME: _NET_MOVERESIZE_WINDOW is for pagers, not for

Legend:
Removed from v.1013  
changed lines
  Added in v.1119

  ViewVC Help
Powered by ViewVC 1.1.26