/[rdesktop]/sourceforge.net/trunk/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

Annotation of /sourceforge.net/trunk/rdesktop/ewmhints.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 466 - (hide annotations)
Mon Sep 8 08:27:57 2003 UTC (20 years, 9 months ago) by astrand
File MIME type: text/plain
File size: 3967 byte(s)
Added my copyright

1 astrand 263 /*
2     rdesktop: A Remote Desktop Protocol client.
3    
4     Support functions for Extended Window Manager Hints,
5     http://www.freedesktop.org/standards/wm-spec.html
6    
7     Copyright (C) Matthew Chapman 1999-2002
8 astrand 466 Copyright (C) Peter Astrand <peter@cendio.se> 2003
9 astrand 263
10     This program is free software; you can redistribute it and/or modify
11     it under the terms of the GNU General Public License as published by
12     the Free Software Foundation; either version 2 of the License, or
13     (at your option) any later version.
14    
15     This program is distributed in the hope that it will be useful,
16     but WITHOUT ANY WARRANTY; without even the implied warranty of
17     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18     GNU General Public License for more details.
19    
20     You should have received a copy of the GNU General Public License
21     along with this program; if not, write to the Free Software
22     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23     */
24    
25 astrand 266 #include <X11/Xlib.h>
26 astrand 263 #include "rdesktop.h"
27    
28 jsorg71 450 extern Display *g_display;
29 astrand 263
30     /*
31     Get window property value (32 bit format)
32     Returns zero on success, -1 on error
33     */
34     static int
35     get_property_value(char *propname, long max_length,
36     unsigned long *nitems_return, unsigned char **prop_return)
37     {
38     int result;
39     Atom property;
40     Atom actual_type_return;
41     int actual_format_return;
42     unsigned long bytes_after_return;
43    
44 jsorg71 450 property = XInternAtom(g_display, propname, True);
45 astrand 263 if (property == None)
46     {
47     fprintf(stderr, "Atom %s does not exist\n", propname);
48     return (-1);
49     }
50    
51 jsorg71 450 result = XGetWindowProperty(g_display, DefaultRootWindow(g_display), property, 0, /* long_offset */
52 astrand 263 max_length, /* long_length */
53     False, /* delete */
54     AnyPropertyType, /* req_type */
55     &actual_type_return,
56     &actual_format_return,
57     nitems_return, &bytes_after_return, prop_return);
58    
59     if (result != Success)
60     {
61     fprintf(stderr, "XGetWindowProperty failed\n");
62     return (-1);
63     }
64    
65     if (actual_type_return == None || actual_format_return == 0)
66     {
67     fprintf(stderr, "Root window is missing property %s\n", propname);
68     return (-1);
69     }
70    
71     if (bytes_after_return)
72     {
73     fprintf(stderr, "%s is too big for me\n", propname);
74     return (-1);
75     }
76    
77     if (actual_format_return != 32)
78     {
79     fprintf(stderr, "%s has bad format\n", propname);
80     return (-1);
81     }
82    
83     return (0);
84     }
85    
86     /*
87     Get current desktop number
88     Returns -1 on error
89     */
90     static int
91 matthewc 300 get_current_desktop(void)
92 astrand 263 {
93     unsigned long nitems_return;
94 astrand 464 unsigned char *prop_return;
95 astrand 263 int current_desktop;
96    
97     if (get_property_value("_NET_CURRENT_DESKTOP", 1, &nitems_return,
98 astrand 464 &prop_return) < 0)
99 astrand 263 return (-1);
100    
101     if (nitems_return != 1)
102     {
103     fprintf(stderr, "_NET_CURRENT_DESKTOP has bad length\n");
104     return (-1);
105     }
106    
107     current_desktop = *prop_return;
108     XFree(prop_return);
109     return current_desktop;
110     }
111    
112     /*
113     Get workarea geometry
114     Returns zero on success, -1 on error
115     */
116    
117     int
118     get_current_workarea(uint32 * x, uint32 * y, uint32 * width, uint32 * height)
119     {
120     int current_desktop;
121     unsigned long nitems_return;
122 astrand 464 unsigned char *prop_return;
123     uint32 *return_words;
124 astrand 263 const uint32 net_workarea_x_offset = 0;
125     const uint32 net_workarea_y_offset = 1;
126     const uint32 net_workarea_width_offset = 2;
127     const uint32 net_workarea_height_offset = 3;
128     const uint32 max_prop_length = 32 * 4; /* Max 32 desktops */
129    
130     if (get_property_value("_NET_WORKAREA", max_prop_length, &nitems_return,
131 astrand 464 &prop_return) < 0)
132 astrand 263 return (-1);
133    
134     if (nitems_return % 4)
135     {
136     fprintf(stderr, "_NET_WORKAREA has odd length\n");
137     return (-1);
138     }
139    
140     current_desktop = get_current_desktop();
141    
142     if (current_desktop < 0)
143     return -1;
144    
145 astrand 464 return_words = (uint32 *)prop_return;
146 astrand 263
147 astrand 464 *x = return_words[current_desktop * 4 + net_workarea_x_offset];
148     *y = return_words[current_desktop * 4 + net_workarea_y_offset];
149     *width = return_words[current_desktop * 4 + net_workarea_width_offset];
150     *height = return_words[current_desktop * 4 + net_workarea_height_offset];
151    
152 astrand 263 XFree(prop_return);
153    
154     return (0);
155    
156     }

  ViewVC Help
Powered by ViewVC 1.1.26