/[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

revision 1117, Tue Mar 7 08:17:41 2006 UTC revision 1118 by astrand, Tue Mar 14 13:56:50 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;
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    }
178    
179    
180    /*
181       Get the window state: normal/minimized/maximized.
182    */
183    #ifndef MAKE_PROTO
184    int
185    ewmh_get_window_state(Window w)
186    {
187            unsigned long nitems_return;
188            unsigned char *prop_return;
189            uint32 *return_words;
190            unsigned long item;
191            BOOL maximized_vert, maximized_horz, hidden;
192    
193            maximized_vert = maximized_horz = hidden = False;
194    
195            if (get_property_value(w, "_NET_WM_STATE", 64, &nitems_return, &prop_return) < 0)
196                    return SEAMLESSRDP_NORMAL;
197    
198            return_words = (uint32 *) prop_return;
199    
200            for (item = 0; item < nitems_return; item++)
201            {
202                    if (return_words[item] == g_net_wm_state_maximized_vert_atom)
203                            maximized_vert = True;
204                    if (return_words[item] == g_net_wm_state_maximized_horz_atom)
205                            maximized_horz = True;
206                    if (return_words[item] == g_net_wm_state_hidden_atom)
207                            hidden = True;
208            }
209    
210            XFree(prop_return);
211    
212            if (maximized_vert && maximized_horz)
213                    return SEAMLESSRDP_MAXIMIZED;
214            else if (hidden)
215                    return SEAMLESSRDP_MINIMIZED;
216            else
217                    return SEAMLESSRDP_NORMAL;
218    }
219    
220    /*
221       Set the window state: normal/minimized/maximized.
222       Returns -1 on failure.
223    */
224    int
225    ewmh_change_state(Window wnd, int state)
226    {
227            Status status;
228            XEvent xevent;
229    
230            /*
231             * Deal with the hidden atom
232             */
233            xevent.type = ClientMessage;
234            xevent.xclient.window = wnd;
235            xevent.xclient.message_type = g_net_wm_state_atom;
236            xevent.xclient.format = 32;
237            if (state == SEAMLESSRDP_MINIMIZED)
238                    xevent.xclient.data.l[0] = _NET_WM_STATE_ADD;
239            else
240                    xevent.xclient.data.l[0] = _NET_WM_STATE_REMOVE;
241            xevent.xclient.data.l[1] = g_net_wm_state_hidden_atom;
242            xevent.xclient.data.l[2] = 0;
243            xevent.xclient.data.l[3] = 0;
244            xevent.xclient.data.l[4] = 0;
245            status = XSendEvent(g_display, DefaultRootWindow(g_display), False,
246                                SubstructureNotifyMask | SubstructureRedirectMask, &xevent);
247            if (!status)
248                    return -1;
249    
250    
251            /*
252             * Deal with the max atoms
253             */
254            xevent.type = ClientMessage;
255            xevent.xclient.window = wnd;
256            xevent.xclient.message_type = g_net_wm_state_atom;
257            xevent.xclient.format = 32;
258            if (state == SEAMLESSRDP_MAXIMIZED)
259                    xevent.xclient.data.l[0] = _NET_WM_STATE_ADD;
260            else
261                    xevent.xclient.data.l[0] = _NET_WM_STATE_REMOVE;
262            xevent.xclient.data.l[1] = g_net_wm_state_maximized_vert_atom;
263            xevent.xclient.data.l[2] = g_net_wm_state_maximized_horz_atom;
264            xevent.xclient.data.l[3] = 0;
265            xevent.xclient.data.l[4] = 0;
266            status = XSendEvent(g_display, DefaultRootWindow(g_display), False,
267                                SubstructureNotifyMask | SubstructureRedirectMask, &xevent);
268            if (!status)
269                    return -1;
270    
271            return 0;
272    }
273    
274    #endif /* MAKE_PROTO */
275    
276    
277  #if 0  #if 0
278    
279  /* FIXME: _NET_MOVERESIZE_WINDOW is for pagers, not for  /* FIXME: _NET_MOVERESIZE_WINDOW is for pagers, not for

Legend:
Removed from v.1117  
changed lines
  Added in v.1118

  ViewVC Help
Powered by ViewVC 1.1.26