X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=cwmcc%2Froot_props.c;h=52b2b531ce6cc8e05cf113f5226ab950b76b975d;hb=76ebae32b28de8c7941aa3c83025573b4d0fe47b;hp=7339cbbac2a102de2868409088201decfb4b2960;hpb=6b95bf33363f73d198da2f515f2f9f6bef2278c8;p=chaz%2Fopenbox diff --git a/cwmcc/root_props.c b/cwmcc/root_props.c index 7339cbba..52b2b531 100644 --- a/cwmcc/root_props.c +++ b/cwmcc/root_props.c @@ -1,20 +1,16 @@ #include "cwmcc_internal.h" #include "atom.h" #include "prop.h" -#include "client_props.h" -#include "render/render.h" +#include "root_props.h" -#include -#ifdef HAVE_STRING_H -# include -#endif +#include void cwmcc_root_get_supported(Window win, Atom **atoms) { gulong num; - if (!prop_get_array32(win, CWMCC_ATOM(root, net_supported), - CWMCC_ATOM(type, atom), atoms, &num)) { + if (!cwmcc_prop_get_array32(win, CWMCC_ATOM(root, net_supported), + CWMCC_ATOM(type, atom), atoms, &num)) { g_warning("Failed to read NET_SUPPORTED from 0x%lx", win); *atoms = NULL; } @@ -24,8 +20,8 @@ void cwmcc_root_get_client_list(Window win, Window **windows) { gulong num; - if (!prop_get_array32(win, CWMCC_ATOM(root, net_client_list), - CWMCC_ATOM(type, window), windows, &num)) { + if (!cwmcc_prop_get_array32(win, CWMCC_ATOM(root, net_client_list), + CWMCC_ATOM(type, window), windows, &num)) { g_warning("Failed to read NET_CLIENT_LIST from 0x%lx", win); *windows = NULL; } @@ -35,8 +31,8 @@ void cwmcc_root_get_client_list_stacking(Window win, Window **windows) { gulong num; - if (!prop_get_array32(win, CWMCC_ATOM(root, net_client_list_stacking), - CWMCC_ATOM(type, window), windows, &num)) { + if (!cwmcc_prop_get_array32(win,CWMCC_ATOM(root, net_client_list_stacking), + CWMCC_ATOM(type, window), windows, &num)) { g_warning("Failed to read NET_CLIENT_LIST_STACKING from 0x%lx", win); *windows = NULL; } @@ -44,8 +40,8 @@ void cwmcc_root_get_client_list_stacking(Window win, Window **windows) void cwmcc_root_get_number_of_desktops(Window win, gulong *desktops) { - if (!prop_get32(win, CWMCC_ATOM(root, net_number_of_desktops), - CWMCC_ATOM(type, cardinal), desktops)) { + if (!cwmcc_prop_get32(win, CWMCC_ATOM(root, net_number_of_desktops), + CWMCC_ATOM(type, cardinal), desktops)) { g_warning("Failed to read NET_NUMBER_OF_DESKTOPS from 0x%lx", win); *desktops = 1; } @@ -55,8 +51,8 @@ void cwmcc_root_get_desktop_geometry(Window win, gulong *w, gulong *h) { gulong *data = NULL, num; - if (!prop_get_array32(win, CWMCC_ATOM(root, net_desktop_geometry), - CWMCC_ATOM(type, cardinal), &data, &num)) { + if (!cwmcc_prop_get_array32(win, CWMCC_ATOM(root, net_desktop_geometry), + CWMCC_ATOM(type, cardinal), &data, &num)) { g_warning("Failed to read NET_DESKTOP_GEOMETRY from 0x%lx", win); *w = *h = 0; } else if (num != 2) { @@ -73,8 +69,8 @@ void cwmcc_root_get_desktop_viewport(Window win, gulong *x, gulong *y) { gulong *data = NULL, num; - if (!prop_get_array32(win, CWMCC_ATOM(root, net_desktop_viewport), - CWMCC_ATOM(type, cardinal), &data, &num)) { + if (!cwmcc_prop_get_array32(win, CWMCC_ATOM(root, net_desktop_viewport), + CWMCC_ATOM(type, cardinal), &data, &num)) { g_warning("Failed to read NET_DESKTOP_VIEWPORT from 0x%lx", win); *x = *y = 0; } else if (num != 2) { @@ -89,8 +85,8 @@ void cwmcc_root_get_desktop_viewport(Window win, gulong *x, gulong *y) void cwmcc_root_get_current_desktop(Window win, gulong *desktop) { - if (!prop_get32(win, CWMCC_ATOM(root, net_current_desktop), - CWMCC_ATOM(type, cardinal), desktop)) { + if (!cwmcc_prop_get32(win, CWMCC_ATOM(root, net_current_desktop), + CWMCC_ATOM(type, cardinal), desktop)) { g_warning("Failed to read NET_CURRENT_DESKTOP from 0x%lx", win); *desktop = 0; } @@ -98,8 +94,8 @@ void cwmcc_root_get_current_desktop(Window win, gulong *desktop) void cwmcc_root_get_desktop_names(Window win, char ***names) { - if (!prop_get_strings_utf8(win, - CWMCC_ATOM(root, net_desktop_names), names)) { + if (!cwmcc_prop_get_strings_utf8(win, CWMCC_ATOM(root, net_desktop_names), + names)) { g_warning("Failed to read NET_DESKTOP_NAMES from 0x%lx", win); *names = NULL; } @@ -107,10 +103,118 @@ void cwmcc_root_get_desktop_names(Window win, char ***names) void cwmcc_root_get_active_window(Window win, Window *window) { - if (!prop_get32(win, CWMCC_ATOM(root, net_active_window), - CWMCC_ATOM(type, window), window)) { + if (!cwmcc_prop_get32(win, CWMCC_ATOM(root, net_active_window), + CWMCC_ATOM(type, window), window)) { g_warning("Failed to read NET_ACTIVE_WINDOW from 0x%lx", win); *window = None; } } +void cwmcc_root_get_workarea(Window win, int **x, int **y, int **w, int **h) +{ + gulong *data = NULL, num; + gulong desks, i; + + /* need the number of desktops */ + cwmcc_root_get_number_of_desktops(win, &desks); + + if (!cwmcc_prop_get_array32(win, CWMCC_ATOM(root, net_workarea), + CWMCC_ATOM(type, cardinal), &data, &num)) { + g_warning("Failed to read NET_DESKTOP_LAYOUT from 0x%lx", win); + } else if (num != 4 * desks) { + g_warning("Read invalid NET_DESKTOP_LAYOUT from 0x%lx", win); + } else { + *x = g_new(int, desks); + *y = g_new(int, desks); + *w = g_new(int, desks); + *h = g_new(int, desks); + for (i = 0; i < desks; ++i) { + (*x)[i] = data[i * 4]; + (*y)[i] = data[i * 4 + 1]; + (*w)[i] = data[i * 4 + 2]; + (*h)[i] = data[i * 4 + 3]; + } + } +} + +void cwmcc_root_get_supporting_wm_check(Window win, Window *window) +{ + if (!cwmcc_prop_get32(win, CWMCC_ATOM(root, net_supporting_wm_check), + CWMCC_ATOM(type, window), window)) { + g_warning("Failed to read NET_SUPPORTING_WM_CHECK from 0x%lx", win); + *window = None; + } +} + +void cwmcc_root_get_desktop_layout(Window win, + struct Cwmcc_DesktopLayout *layout) +{ + gulong *data = NULL, num; + gulong desks; + + /* need the number of desktops */ + cwmcc_root_get_number_of_desktops(win, &desks); + + layout->orientation = Cwmcc_Orientation_Horz; + layout->start_corner = Cwmcc_Corner_TopLeft; + layout->rows = 1; + layout->columns = desks; + + if (!cwmcc_prop_get_array32(win, CWMCC_ATOM(root, net_desktop_layout), + CWMCC_ATOM(type, cardinal), &data, &num)) { + g_warning("Failed to read NET_DESKTOP_LAYOUT from 0x%lx", win); + } else if (num != 4) { + g_warning("Read invalid NET_DESKTOP_LAYOUT from 0x%lx", win); + } else { + if (data[0] == Cwmcc_Orientation_Horz || + data[0] == Cwmcc_Orientation_Vert) + layout->orientation = data[0]; + if (data[3] == Cwmcc_Corner_TopLeft || + data[3] == Cwmcc_Corner_TopRight || + data[3] == Cwmcc_Corner_BottomLeft || + data[3] == Cwmcc_Corner_BottomRight) + layout->start_corner = data[3]; + layout->rows = data[2]; + layout->columns = data[1]; + + /* bounds checking */ + if (layout->orientation == Cwmcc_Orientation_Horz) { + if (layout->rows > desks) + layout->rows = desks; + if (layout->columns > ((desks + desks % layout->rows) / + layout->rows)) + layout->columns = ((desks + desks % layout->rows) / + layout->rows); + } else { + if (layout->columns > desks) + layout->columns = desks; + if (layout->rows > ((desks + desks % layout->columns) / + layout->columns)) + layout->rows = ((desks + desks % layout->columns) / + layout->columns); + } + } + g_free(data); +} + +void cwmcc_root_get_showing_desktop(Window win, gboolean *showing) +{ + gulong a; + + if (!cwmcc_prop_get32(win, CWMCC_ATOM(root, net_showing_desktop), + CWMCC_ATOM(type, cardinal), &a)) { + g_warning("Failed to read NET_SHOWING_DESKTOP from 0x%lx", win); + a = FALSE; + } + *showing = !!a; +} + +void cwmcc_root_get_openbox_pid(Window win, gulong *pid) +{ + if (!cwmcc_prop_get32(win, CWMCC_ATOM(root, openbox_pid), + CWMCC_ATOM(type, cardinal), pid)) { + g_warning("Failed to read OPENBOX_PID from 0x%lx", win); + *pid = 0; + } +} +