X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=cwmcc%2Fclient_props.c;h=4ca51d390a16a9e83cc125c8f16a5c544f9c4516;hb=07d48062395604c1dfeea214993d48476976f8e9;hp=dc0f4fa43c2e3640bb0cd46da7ca32e8923b568b;hpb=43f01ee9f081c8cb473c3358bbc02f758ab0014b;p=chaz%2Fopenbox diff --git a/cwmcc/client_props.c b/cwmcc/client_props.c index dc0f4fa4..4ca51d39 100644 --- a/cwmcc/client_props.c +++ b/cwmcc/client_props.c @@ -2,38 +2,30 @@ #include "atom.h" #include "prop.h" #include "client_props.h" -#include "render/render.h" #include -#ifdef HAVE_STRING_H -# include -#endif +#include -void cwmcc_client_get_protocols(Window win, Atom **protocols) +void cwmcc_client_get_protocols(Window win, Atom **protocols, gulong *num) { - gulong num; - - if (!prop_get_array32(win, CWMCC_ATOM(client, wm_protocols), - CWMCC_ATOM(type, atom), protocols, &num)) { + if (!cwmcc_prop_get_array32(win, CWMCC_ATOM(client, wm_protocols), + CWMCC_ATOM(type, atom), protocols, num)) { + g_warning("Failed to read WM_PROTOCOLS from 0x%lx", win); *protocols = NULL; + *num = 0; } } -void cwmcc_client_set_protocols(Window win, Atom *protocols) +void cwmcc_client_set_protocols(Window win, Atom *protocols, gulong num) { - gulong n; - Atom *a; - - for (a = protocols, n = 0; *a; ++a, ++n); - XChangeProperty(cwmcc_display, win, CWMCC_ATOM(client, wm_state), - CWMCC_ATOM(type, atom), 32, PropModeReplace, - (guchar*)protocols, n); + cwmcc_prop_set_array32(win, CWMCC_ATOM(client, wm_state), + CWMCC_ATOM(type, atom), protocols, num); } void cwmcc_client_get_wm_state(Window win, gulong *state) { - if (!prop_get32(win, CWMCC_ATOM(client, wm_state), - CWMCC_ATOM(client, wm_state), state)) { + if (!cwmcc_prop_get32(win, CWMCC_ATOM(client, wm_state), + CWMCC_ATOM(client, wm_state), state)) { g_warning("Failed to read WM_STATE from 0x%lx", win); *state = NormalState; } @@ -41,15 +33,16 @@ void cwmcc_client_get_wm_state(Window win, gulong *state) void cwmcc_client_set_wm_state(Window win, gulong state) { - XChangeProperty(cwmcc_display, win, CWMCC_ATOM(client, wm_state), - CWMCC_ATOM(client, wm_state), 32, PropModeReplace, - (guchar*)&state, 1); + cwmcc_prop_set32(win, CWMCC_ATOM(client, wm_state), + CWMCC_ATOM(client, wm_state), state); } void cwmcc_client_get_name(Window win, char **name) { - if (!prop_get_string_utf8(win, CWMCC_ATOM(client, net_wm_name), name)) - if (!prop_get_string_locale(win, CWMCC_ATOM(client, wm_name), name)) { + if (!cwmcc_prop_get_string_utf8(win, CWMCC_ATOM(client, net_wm_name), + name)) + if (!cwmcc_prop_get_string_locale(win, CWMCC_ATOM(client, wm_name), + name)) { g_warning("Failed to read a name from 0x%lx", win); *name = g_strdup("Unnamed Window"); } @@ -57,33 +50,30 @@ void cwmcc_client_get_name(Window win, char **name) void cwmcc_client_set_name(Window win, char *name) { - XChangeProperty(cwmcc_display, win, CWMCC_ATOM(client, net_wm_name), - CWMCC_ATOM(type, utf8), 32, PropModeReplace, - (guchar*)name, strlen(name)); + cwmcc_prop_set_string_utf8(win, CWMCC_ATOM(client, net_wm_name), name); } void cwmcc_client_get_icon_name(Window win, char **name) { - if (!prop_get_string_utf8(win, CWMCC_ATOM(client, net_wm_icon_name), name)) - if (!prop_get_string_locale(win, - CWMCC_ATOM(client, wm_icon_name), name)) { + if (!cwmcc_prop_get_string_utf8(win, CWMCC_ATOM(client, net_wm_icon_name), + name)) + if (!cwmcc_prop_get_string_locale(win,CWMCC_ATOM(client, wm_icon_name), + name)) { g_warning("Failed to read an icon name from 0x%lx", win); *name = g_strdup("Unnamed Window"); } } -void cwmcc_client_icon_set_name(Window win, char *name) +void cwmcc_client_set_icon_name(Window win, char *name) { - XChangeProperty(cwmcc_display, win, CWMCC_ATOM(client, net_wm_icon_name), - CWMCC_ATOM(type, utf8), 32, PropModeReplace, - (guchar*)name, strlen(name)); + cwmcc_prop_set_string_utf8(win, CWMCC_ATOM(client, net_wm_icon_name),name); } void cwmcc_client_get_class(Window win, char **class, char **name) { char **s; - if (!prop_get_strings_locale(win, CWMCC_ATOM(client, wm_class), &s)) { + if (!cwmcc_prop_get_strings_locale(win, CWMCC_ATOM(client, wm_class), &s)){ g_warning("Failed to read WM_CLASS from 0x%lx", win); *class = g_strdup(""); *name = g_strdup(""); @@ -106,8 +96,8 @@ void cwmcc_client_get_class(Window win, char **class, char **name) void cwmcc_client_get_role(Window win, char **role) { - if (!prop_get_string_locale(win, - CWMCC_ATOM(client, wm_window_role), role)) { + if (!cwmcc_prop_get_string_locale(win, CWMCC_ATOM(client, wm_window_role), + role)) { g_warning("Failed to read WM_WINDOW_ROLE from 0x%lx", win); *role = g_strdup(""); } @@ -117,8 +107,8 @@ void cwmcc_client_get_mwmhints(Window win, struct Cwmcc_MwmHints *hints) { gulong *l = NULL, num; - if (!prop_get_array32(win, CWMCC_ATOM(client, motif_wm_hints), - CWMCC_ATOM(client, motif_wm_hints), &l, &num)) { + if (!cwmcc_prop_get_array32(win, CWMCC_ATOM(client, motif_wm_hints), + CWMCC_ATOM(client, motif_wm_hints), &l, &num)){ g_warning("Failed to read Motif WM Hints from 0x%lx", win); hints->flags = 0; } else if (num < 3) { @@ -134,8 +124,8 @@ void cwmcc_client_get_mwmhints(Window win, struct Cwmcc_MwmHints *hints) void cwmcc_client_get_desktop(Window win, gulong *desk) { - if (!prop_get32(win, CWMCC_ATOM(client, net_wm_desktop), - CWMCC_ATOM(type, cardinal), desk)) { + if (!cwmcc_prop_get32(win, CWMCC_ATOM(client, net_wm_desktop), + CWMCC_ATOM(type, cardinal), desk)) { g_warning("Failed to read NET_WM_DESKTOP from 0x%lx", win); *desk = 0; } @@ -143,64 +133,49 @@ void cwmcc_client_get_desktop(Window win, gulong *desk) void cwmcc_client_set_desktop(Window win, gulong desk) { - XChangeProperty(cwmcc_display, win, CWMCC_ATOM(client, net_wm_desktop), - CWMCC_ATOM(type, cardinal), 32, PropModeReplace, - (guchar*)&desk, 1); + cwmcc_prop_set32(win, CWMCC_ATOM(client, net_wm_desktop), + CWMCC_ATOM(type, cardinal), desk); } -void cwmcc_client_get_type(Window win, gulong **types) +void cwmcc_client_get_type(Window win, gulong **types, gulong *num) { - gulong num; - - if (!prop_get_array32(win, CWMCC_ATOM(client, net_wm_window_type), - CWMCC_ATOM(type, atom), types, &num)) { + if (!cwmcc_prop_get_array32(win, CWMCC_ATOM(client, net_wm_window_type), + CWMCC_ATOM(type, atom), types, num)) { g_warning("Failed to read NET_WM_WINDOW_TYPE from 0x%lx", win); - *types = g_new(Atom, 2); + *types = g_new(Atom, 1); (*types)[0] = CWMCC_ATOM(data, net_wm_window_type_normal); - (*types)[1] = 0; + *num = 1; } } -void cwmcc_client_set_type(Window win, gulong *types) +void cwmcc_client_set_type(Window win, gulong *types, gulong num) { - gulong n; - gulong *t; - - for (t = types, n = 0; *t; ++t, ++n); - XChangeProperty(cwmcc_display, win, CWMCC_ATOM(client, wm_state), - CWMCC_ATOM(type, atom), 32, PropModeReplace, - (guchar*)types, n); + cwmcc_prop_set_array32(win, CWMCC_ATOM(client, net_wm_window_type), + CWMCC_ATOM(type, atom), types, num); } -void cwmcc_client_get_state(Window win, gulong **states) +void cwmcc_client_get_state(Window win, gulong **states, gulong *num) { - gulong num; - - if (!prop_get_array32(win, CWMCC_ATOM(client, net_wm_state), - CWMCC_ATOM(type, atom), states, &num)) { + if (!cwmcc_prop_get_array32(win, CWMCC_ATOM(client, net_wm_state), + CWMCC_ATOM(type, atom), states, num)) { g_warning("Failed to read NET_WM_STATE from 0x%lx", win); - *states = g_new(Atom, 1); - (*states)[0] = 0; + *states = NULL; + *num = 0; } } -void cwmcc_client_set_state(Window win, gulong *states) +void cwmcc_client_set_state(Window win, gulong *states, gulong num) { - gulong n; - gulong *s; - - for (s = states, n = 0; *s; ++s, ++n); - XChangeProperty(cwmcc_display, win, CWMCC_ATOM(client, wm_state), - CWMCC_ATOM(type, atom), 32, PropModeReplace, - (guchar*)states, n); + cwmcc_prop_set_array32(win, CWMCC_ATOM(client, net_wm_state), + CWMCC_ATOM(type, atom), states, num); } void cwmcc_client_get_strut(Window win, int *l, int *t, int *r, int *b) { gulong *data = NULL, num; - if (!prop_get_array32(win, CWMCC_ATOM(client, net_wm_strut), - CWMCC_ATOM(type, cardinal), &data, &num)) { + if (!cwmcc_prop_get_array32(win, CWMCC_ATOM(client, net_wm_strut), + CWMCC_ATOM(type, cardinal), &data, &num)) { g_warning("Failed to read NET_WM_STRUT from 0x%lx", win); *l = *t = *r = *b = 0; } else if (num != 4) { @@ -212,7 +187,19 @@ void cwmcc_client_get_strut(Window win, int *l, int *t, int *r, int *b) *t = data[2]; *b = data[3]; } - g_free(l); + g_free(data); +} + +void cwmcc_client_set_strut(Window win, int l, int t, int r, int b) +{ + gulong data[4]; + + data[0] = l; + data[1] = r; + data[2] = t; + data[3] = b; + cwmcc_prop_set_array32(win, CWMCC_ATOM(client, net_wm_strut), + CWMCC_ATOM(type, cardinal), data, 4); } static void convert_pixmap_to_icon(Pixmap pix, Pixmap mask, @@ -254,15 +241,15 @@ static void convert_pixmap_to_icon(Pixmap pix, Pixmap mask, icon->data = NULL; } -void cwmcc_client_get_icon(Window win, struct Cwmcc_Icon **icons) +void cwmcc_client_get_icon(Window win, struct Cwmcc_Icon **icons, gulong *num) { - gulong *data = NULL, num; + gulong *data = NULL; gulong w, h, i; int j; int nicons; - if (!prop_get_array32(win, CWMCC_ATOM(client, net_wm_icon), - CWMCC_ATOM(type, cardinal), &data, &num)) { + if (!cwmcc_prop_get_array32(win, CWMCC_ATOM(client, net_wm_icon), + CWMCC_ATOM(type, cardinal), &data, num)) { g_warning("Failed to read NET_WM_ICON from 0x%lx", win); *icons = NULL; nicons = 0; @@ -270,16 +257,15 @@ void cwmcc_client_get_icon(Window win, struct Cwmcc_Icon **icons) /* figure out how many valid icons are in here */ i = 0; nicons = 0; - while (num - i > 2) { + while (*num - i > 2) { w = data[i++]; h = data[i++]; i += w * h; - if (i > num) break; + if (i > *num) break; ++nicons; } - *icons = g_new(struct Cwmcc_Icon, nicons + 1); - (*icons)[nicons].data = NULL; + *icons = g_new(struct Cwmcc_Icon, nicons); /* store the icons */ i = 0; @@ -289,16 +275,16 @@ void cwmcc_client_get_icon(Window win, struct Cwmcc_Icon **icons) (*icons)[j].data = g_memdup(&data[i], w * h * sizeof(gulong)); i += w * h; - g_assert(i <= num); + g_assert(i <= *num); } } g_free(data); data = NULL; - if (!prop_get_array32(win, CWMCC_ATOM(client, kwm_win_icon), - CWMCC_ATOM(client, kwm_win_icon), &data, &num)) { + if (!cwmcc_prop_get_array32(win, CWMCC_ATOM(client, kwm_win_icon), + CWMCC_ATOM(client, kwm_win_icon), &data, num)){ g_warning("Failed to read KWM_WIN_ICON from 0x%lx", win); - } else if (num != 2) { + } else if (*num != 2) { g_warning("Read invalid KWM_WIN_ICON from 0x%lx", win); } else { Pixmap p, m; @@ -310,21 +296,23 @@ void cwmcc_client_get_icon(Window win, struct Cwmcc_Icon **icons) convert_pixmap_to_icon(p, m, &icon); if (icon.data) { - *icons = g_renew(struct Cwmcc_Icon, *icons, nicons + 2); - (*icons[nicons + 1]).data = NULL; - g_memmove(&(*icons)[nicons], &icon, sizeof(struct Cwmcc_Icon)); + ++nicons; + *icons = g_renew(struct Cwmcc_Icon, *icons, nicons); + (*icons[nicons]).data = NULL; + g_memmove(&(*icons)[nicons-1], &icon, sizeof(struct Cwmcc_Icon)); } } g_free(data); + *num = nicons; } void cwmcc_client_get_premax(Window win, int *x, int *y, int *w, int *h) { gulong *l = NULL, num; - if (!prop_get_array32(win, CWMCC_ATOM(client, openbox_premax), - CWMCC_ATOM(type, cardinal), &l, &num)) { + if (!cwmcc_prop_get_array32(win, CWMCC_ATOM(client, openbox_premax), + CWMCC_ATOM(type, cardinal), &l, &num)) { g_warning("Failed to read OPENBOX_PREMAX from 0x%lx", win); *x = *y = *w = *h = 0; } else if (num != 4) { @@ -347,7 +335,6 @@ void cwmcc_client_set_premax(Window win, int x, int y, int w, int h) l[1] = y; l[2] = w; l[3] = h; - XChangeProperty(cwmcc_display, win, CWMCC_ATOM(client, openbox_premax), - CWMCC_ATOM(type, cardinal), 32, PropModeReplace, - (guchar*)l, 4); + cwmcc_prop_set_array32(win, CWMCC_ATOM(client, openbox_premax), + CWMCC_ATOM(type, cardinal), l, 4); }