]>
Dogcows Code - chaz/openbox/blob - cwmcc/prop.c
1 #include "cwmcc_internal.h"
8 /* this just isn't used...
9 static gboolean get(Window win, Atom prop, Atom type, int size,
10 guchar **data, gulong num)
17 gulong ret_items, bytes_left;
18 long num32 = 32 / size * num; /\* num in 32-bit elements *\/
20 res = XGetWindowProperty(cwmcc_display, win, prop, 0l, num32,
21 FALSE, type, &ret_type, &ret_size,
22 &ret_items, &bytes_left, &xdata);
23 if (res == Success && ret_items && xdata) {
24 if (ret_size == size && ret_items >= num) {
25 *data = g_memdup(xdata, num * (size / 8));
34 static gboolean
get_prealloc(Window win
, Atom prop
, Atom type
, int size
,
35 guchar
*data
, gulong num
)
42 gulong ret_items
, bytes_left
;
43 long num32
= 32 / size
* num
; /* num in 32-bit elements */
45 res
= XGetWindowProperty(cwmcc_display
, win
, prop
, 0l, num32
,
46 FALSE
, type
, &ret_type
, &ret_size
,
47 &ret_items
, &bytes_left
, &xdata
);
48 if (res
== Success
&& ret_items
&& xdata
) {
49 if (ret_size
== size
&& ret_items
>= num
) {
51 for (i
= 0; i
< num
; ++i
)
57 ((guint16
*)data
)[i
] = ((guint16
*)xdata
)[i
];
60 ((guint32
*)data
)[i
] = ((guint32
*)xdata
)[i
];
63 g_assert_not_reached(); /* unhandled size */
72 static gboolean
get_all(Window win
, Atom prop
, Atom type
, int size
,
73 guchar
**data
, gulong
*num
)
80 gulong ret_items
, bytes_left
;
82 res
= XGetWindowProperty(cwmcc_display
, win
, prop
, 0l, G_MAXLONG
,
83 FALSE
, type
, &ret_type
, &ret_size
,
84 &ret_items
, &bytes_left
, &xdata
);
86 if (ret_size
== size
&& ret_items
> 0) {
87 *data
= g_malloc(ret_items
* (size
/ 8) + sizeof(guchar
*));
88 g_memmove(*data
, xdata
, ret_items
* (size
/ 8));
89 data
[ret_items
* (size
/ 8)] = NULL
;
98 static gboolean
get_stringlist(Window win
, Atom prop
, char ***list
, int *nstr
)
101 gboolean ret
= FALSE
;
103 if (XGetTextProperty(cwmcc_display
, win
, &tprop
, prop
) && tprop
.nitems
) {
104 if (XTextPropertyToStringList(&tprop
, list
, nstr
))
111 gboolean
cwmcc_prop_get32(Window win
, Atom prop
, Atom type
, gulong
*ret
)
113 return get_prealloc(win
, prop
, type
, 32, (guchar
*)ret
, 1);
116 gboolean
cwmcc_prop_get_array32(Window win
, Atom prop
, Atom type
, gulong
**ret
,
119 return get_all(win
, prop
, type
, 32, (guchar
**)ret
, nret
);
122 gboolean
cwmcc_prop_get_string_locale(Window win
, Atom prop
, char **data
)
127 if (get_stringlist(win
, prop
, &list
, &nstr
) && nstr
) {
128 *data
= g_locale_to_utf8(list
[0], -1, NULL
, NULL
, NULL
);
129 XFreeStringList(list
);
130 if (data
) return TRUE
;
135 gboolean
cwmcc_prop_get_string_utf8(Window win
, Atom prop
, char **ret
)
140 if (get_all(win
, prop
, CWMCC_ATOM(type
, utf8
), 8, (guchar
**)&raw
, &num
)) {
141 *ret
= g_strdup(raw
); /* grab the first string from the list */
148 gboolean
cwmcc_prop_get_strings_utf8(Window win
, Atom prop
, char ***ret
)
153 if (get_all(win
, prop
, CWMCC_ATOM(type
, utf8
), 8, (guchar
**)&raw
, &num
)) {
154 *ret
= g_new(char*, num
+ 1);
155 (*ret
)[num
] = NULL
; /* null terminated list */
158 for (i
= 0; i
< num
; ++i
) {
159 (*ret
)[i
] = g_strdup(p
);
168 gboolean
cwmcc_prop_get_strings_locale(Window win
, Atom prop
, char ***ret
)
173 if (get_all(win
, prop
, CWMCC_ATOM(type
, string
), 8, (guchar
**)&raw
, &num
)){
174 *ret
= g_new(char*, num
+ 1);
175 (*ret
)[num
] = NULL
; /* null terminated list */
178 for (i
= 0; i
< num
; ++i
) {
179 (*ret
)[i
] = g_locale_to_utf8(p
, -1, NULL
, NULL
, NULL
);
180 /* make sure translation did not fail */
182 g_strfreev(*ret
); /* free what we did so far */
183 break; /* the force is not strong with us */
194 void cwmcc_prop_set32(Window win
, Atom prop
, Atom type
, gulong val
)
196 XChangeProperty(cwmcc_display
, win
, prop
, type
, 32, PropModeReplace
,
200 void cwmcc_prop_set_array32(Window win
, Atom prop
, Atom type
,
201 gulong
*val
, gulong num
)
203 XChangeProperty(cwmcc_display
, win
, prop
, type
, 32, PropModeReplace
,
207 void cwmcc_prop_set_string_utf8(Window win
, Atom prop
, char *val
)
209 XChangeProperty(cwmcc_display
, win
, prop
, CWMCC_ATOM(type
, utf8
), 8,
210 PropModeReplace
, (guchar
*)val
, strlen(val
));
213 void cwmcc_prop_set_strings_utf8(Window win
, Atom prop
, char **strs
)
218 str
= g_string_sized_new(0);
219 for (i
= 0; strs
[i
]; ++i
) {
220 str
= g_string_append(str
, strs
[i
]);
221 str
= g_string_append_c(str
, '\0');
223 XChangeProperty(cwmcc_display
, win
, prop
, CWMCC_ATOM(type
, utf8
), 8,
224 PropModeReplace
, (guchar
*)str
->str
, str
->len
);
227 void cwmcc_prop_erase(Window win
, Atom prop
)
229 XDeleteProperty(cwmcc_display
, win
, prop
);
This page took 0.04921 seconds and 5 git commands to generate.