Size screen_physical_size;
gboolean screen_showing_desktop;
DesktopLayout screen_desktop_layout;
-GPtrArray *screen_desktop_names;
+char **screen_desktop_names = NULL;
static Rect *area = NULL;
static Strut *strut = NULL;
XErrorHandler old;
pid_t pid;
int i, num_support;
- Atom *supported;
+ guint32 *supported;
running = FALSE;
old = XSetErrorHandler(another_running);
PROP_SET32(ob_root, net_supporting_wm_check, window, support_window);
/* set properties on the supporting window */
- PROP_SETS(support_window, net_wm_name, utf8, "Openbox");
+ PROP_SETS(support_window, net_wm_name, "Openbox");
PROP_SET32(support_window, net_supporting_wm_check, window,support_window);
/* set the _NET_SUPPORTED_ATOMS hint */
num_support = 48;
i = 0;
- supported = g_new(Atom, num_support);
+ supported = g_new(guint32, num_support);
supported[i++] = prop_atoms.net_current_desktop;
supported[i++] = prop_atoms.net_number_of_desktops;
supported[i++] = prop_atoms.net_desktop_geometry;
supported[] = prop_atoms.net_wm_action_stick;
*/
- PROP_SET32A(ob_root, net_supported, atom, supported, num_support);
+ PROP_SETA32(ob_root, net_supported, atom, supported, num_support);
g_free(supported);
return TRUE;
void screen_startup()
{
GSList *it;
+ guint i;
- screen_desktop_names = g_ptr_array_new();
-
/* get the initial size */
screen_resize();
/* set the names */
- for (it = config_desktops_names; it; it = it->next)
- g_ptr_array_add(screen_desktop_names, it->data); /* dont strdup */
- PROP_SETSA(ob_root, net_desktop_names, utf8, screen_desktop_names);
- g_ptr_array_set_size(screen_desktop_names, 0); /* rm the ptrs so they dont
- get frees when we
- update the desktop
- names */
+ screen_desktop_names = g_new(char*,
+ g_slist_length(config_desktops_names) + 1);
+ for (i = 0, it = config_desktops_names; it; ++i, it = it->next)
+ screen_desktop_names[i] = it->data; /* dont strdup */
+ screen_desktop_names[i] = NULL;
+ PROP_SETSS(ob_root, net_desktop_names, screen_desktop_names);
+ g_free(screen_desktop_names); /* dont free the individual strings */
+ screen_desktop_names = NULL;
+
screen_num_desktops = 0;
screen_set_num_desktops(config_desktops_num);
screen_desktop = 0;
void screen_shutdown()
{
- guint i;
-
XSelectInput(ob_display, ob_root, NoEventMask);
PROP_ERASE(ob_root, openbox_pid); /* we're not running here no more! */
XDestroyWindow(ob_display, support_window);
- for (i = 0; i < screen_desktop_names->len; ++i)
- g_free(g_ptr_array_index(screen_desktop_names, i));
- g_ptr_array_free(screen_desktop_names, TRUE);
+ g_strfreev(screen_desktop_names);
g_free(strut);
g_free(area);
}
void screen_resize()
{
/* XXX RandR support here? */
- int geometry[2];
+ guint32 geometry[2];
/* Set the _NET_DESKTOP_GEOMETRY hint */
geometry[0] = WidthOfScreen(ScreenOfDisplay(ob_display, ob_screen));
geometry[1] = HeightOfScreen(ScreenOfDisplay(ob_display, ob_screen));
- PROP_SET32A(ob_root, net_desktop_geometry, cardinal, geometry, 2);
+ PROP_SETA32(ob_root, net_desktop_geometry, cardinal, geometry, 2);
screen_physical_size.width = geometry[0];
screen_physical_size.height = geometry[1];
void screen_set_num_desktops(guint num)
{
guint i, old;
- gulong *viewport;
+ guint32 *viewport;
GList *it;
g_assert(num > 0);
PROP_SET32(ob_root, net_number_of_desktops, cardinal, num);
/* set the viewport hint */
- viewport = g_new0(gulong, num * 2);
- PROP_SET32A(ob_root, net_desktop_viewport, cardinal, viewport, num * 2);
+ viewport = g_new0(guint32, num * 2);
+ PROP_SETA32(ob_root, net_desktop_viewport, cardinal, viewport, num * 2);
g_free(viewport);
/* change our struts/area to match */
void screen_update_layout()
{
- unsigned long *data = NULL;
+ guint32 *data = NULL;
+ guint num;
/* defaults */
screen_desktop_layout.orientation = prop_atoms.net_wm_orientation_horz;
screen_desktop_layout.rows = 1;
screen_desktop_layout.columns = screen_num_desktops;
- if (PROP_GET32A(ob_root, net_desktop_layout, cardinal, data, 4)) {
- if (data[0] == prop_atoms.net_wm_orientation_vert)
- screen_desktop_layout.orientation = data[0];
- if (data[3] == prop_atoms.net_wm_topright)
- screen_desktop_layout.start_corner = data[3];
- else if (data[3] == prop_atoms.net_wm_bottomright)
- screen_desktop_layout.start_corner = data[3];
- else if (data[3] == prop_atoms.net_wm_bottomleft)
- screen_desktop_layout.start_corner = data[3];
-
- /* fill in a zero rows/columns */
- if (!(data[1] == 0 && data[2] == 0)) { /* both 0's is bad data.. */
- if (data[1] == 0) {
- data[1] = (screen_num_desktops +
- screen_num_desktops % data[2]) / data[2];
- } else if (data[2] == 0) {
- data[2] = (screen_num_desktops +
- screen_num_desktops % data[1]) / data[1];
- }
- screen_desktop_layout.columns = data[1];
- screen_desktop_layout.rows = data[2];
- }
-
- /* bounds checking */
- if (screen_desktop_layout.orientation ==
- prop_atoms.net_wm_orientation_horz) {
- if (screen_desktop_layout.rows > screen_num_desktops)
- screen_desktop_layout.rows = screen_num_desktops;
- if (screen_desktop_layout.columns > ((screen_num_desktops +
- screen_num_desktops %
- screen_desktop_layout.rows) /
- screen_desktop_layout.rows))
- screen_desktop_layout.columns =
- (screen_num_desktops + screen_num_desktops %
- screen_desktop_layout.rows) /
- screen_desktop_layout.rows;
- } else {
- if (screen_desktop_layout.columns > screen_num_desktops)
- screen_desktop_layout.columns = screen_num_desktops;
- if (screen_desktop_layout.rows > ((screen_num_desktops +
- screen_num_desktops %
- screen_desktop_layout.columns) /
- screen_desktop_layout.columns))
- screen_desktop_layout.rows =
- (screen_num_desktops + screen_num_desktops %
- screen_desktop_layout.columns) /
- screen_desktop_layout.columns;
- }
+ if (PROP_GETA32(ob_root, net_desktop_layout, cardinal, &data, &num)) {
+ if (num == 3 || num == 4) {
+ if (data[0] == prop_atoms.net_wm_orientation_vert)
+ screen_desktop_layout.orientation = data[0];
+ if (num == 3)
+ screen_desktop_layout.start_corner =
+ prop_atoms.net_wm_topright;
+ else {
+ if (data[3] == prop_atoms.net_wm_topright)
+ screen_desktop_layout.start_corner = data[3];
+ else if (data[3] == prop_atoms.net_wm_bottomright)
+ screen_desktop_layout.start_corner = data[3];
+ else if (data[3] == prop_atoms.net_wm_bottomleft)
+ screen_desktop_layout.start_corner = data[3];
+ }
+
+ /* fill in a zero rows/columns */
+ if (!(data[1] == 0 && data[2] == 0)) { /* both 0's is bad data.. */
+ if (data[1] == 0) {
+ data[1] = (screen_num_desktops +
+ screen_num_desktops % data[2]) / data[2];
+ } else if (data[2] == 0) {
+ data[2] = (screen_num_desktops +
+ screen_num_desktops % data[1]) / data[1];
+ }
+ screen_desktop_layout.columns = data[1];
+ screen_desktop_layout.rows = data[2];
+ }
+
+ /* bounds checking */
+ if (screen_desktop_layout.orientation ==
+ prop_atoms.net_wm_orientation_horz) {
+ if (screen_desktop_layout.rows > screen_num_desktops)
+ screen_desktop_layout.rows = screen_num_desktops;
+ if (screen_desktop_layout.columns >
+ ((screen_num_desktops + screen_num_desktops %
+ screen_desktop_layout.rows) /
+ screen_desktop_layout.rows))
+ screen_desktop_layout.columns =
+ (screen_num_desktops + screen_num_desktops %
+ screen_desktop_layout.rows) /
+ screen_desktop_layout.rows;
+ } else {
+ if (screen_desktop_layout.columns > screen_num_desktops)
+ screen_desktop_layout.columns = screen_num_desktops;
+ if (screen_desktop_layout.rows >
+ ((screen_num_desktops + screen_num_desktops %
+ screen_desktop_layout.columns) /
+ screen_desktop_layout.columns))
+ screen_desktop_layout.rows =
+ (screen_num_desktops + screen_num_desktops %
+ screen_desktop_layout.columns) /
+ screen_desktop_layout.columns;
+ }
+ }
g_free(data);
}
}
guint i;
/* empty the array */
- for (i = 0; i < screen_desktop_names->len; ++i)
- g_free(g_ptr_array_index(screen_desktop_names, i));
- g_ptr_array_set_size(screen_desktop_names, 0);
-
- PROP_GETSA(ob_root, net_desktop_names, utf8, screen_desktop_names);
-
- while (screen_desktop_names->len < screen_num_desktops)
- g_ptr_array_add(screen_desktop_names, g_strdup("Unnamed Desktop"));
+ g_strfreev(screen_desktop_names);
+ screen_desktop_names = NULL;
+
+ if (PROP_GETSS(ob_root, net_desktop_names, utf8, &screen_desktop_names))
+ for (i = 0; screen_desktop_names[i] && i <= screen_num_desktops; ++i);
+ else
+ i = 0;
+ if (i <= screen_num_desktops) {
+ screen_desktop_names = g_renew(char*, screen_desktop_names,
+ screen_num_desktops + 1);
+ screen_desktop_names[screen_num_desktops] = NULL;
+ for (; i < screen_num_desktops; ++i)
+ screen_desktop_names[i] = g_strdup("Unnamed Desktop");
+ }
}
void screen_show_desktop(gboolean show)
static void screen_update_area()
{
guint i;
- gulong *dims;
+ guint32 *dims;
g_free(area);
area = g_new0(Rect, screen_num_desktops + 1);
- dims = g_new(unsigned long, 4 * screen_num_desktops);
+ dims = g_new(guint32, 4 * screen_num_desktops);
for (i = 0; i < screen_num_desktops + 1; ++i) {
Rect old_area = area[i];
/*
dims[(i * 4) + 3] = area[i].height;
}
}
- PROP_SET32A(ob_root, net_workarea, cardinal,
+ PROP_SETA32(ob_root, net_workarea, cardinal,
dims, 4 * screen_num_desktops);
g_free(dims);
}