X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fprop.c;h=827ab4e9cf3be29722b3a983116ce70f41adf18c;hb=fdd1c3c8a7eac8ba1246ae64cbfca6f922294c51;hp=44d0f2bf064c9aae0b76aa6b9702fc98d824e641;hpb=f68eb1fc250b13a473d825ac5c69b6d5e28b9595;p=chaz%2Fopenbox diff --git a/openbox/prop.c b/openbox/prop.c index 44d0f2bf..827ab4e9 100644 --- a/openbox/prop.c +++ b/openbox/prop.c @@ -1,3 +1,21 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*- + + prop.c for the Openbox window manager + Copyright (c) 2003 Ben Jansens + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + See the COPYING file for a copy of the GNU General Public License. +*/ + #include "prop.h" #include "openbox.h" @@ -16,6 +34,8 @@ void prop_startup() CREATE(atom, "ATOM"); CREATE(string, "STRING"); CREATE(utf8, "UTF8_STRING"); + + CREATE(manager, "MANAGER"); CREATE(wm_colormap_windows, "WM_COLORMAP_WINDOWS"); CREATE(wm_protocols, "WM_PROTOCOLS"); @@ -29,6 +49,8 @@ void prop_startup() CREATE(wm_window_role, "WM_WINDOW_ROLE"); CREATE(motif_wm_hints, "_MOTIF_WM_HINTS"); + CREATE(sm_client_id, "SM_CLIENT_ID"); + CREATE(net_supported, "_NET_SUPPORTED"); CREATE(net_client_list, "_NET_CLIENT_LIST"); CREATE(net_client_list_stacking, "_NET_CLIENT_LIST_STACKING"); @@ -47,6 +69,8 @@ void prop_startup() CREATE(net_wm_moveresize, "_NET_WM_MOVERESIZE"); CREATE(net_moveresize_window, "_NET_MOVERESIZE_WINDOW"); + CREATE(net_startup_id, "_NET_STARTUP_ID"); + CREATE(net_wm_name, "_NET_WM_NAME"); CREATE(net_wm_visible_name, "_NET_WM_VISIBLE_NAME"); CREATE(net_wm_icon_name, "_NET_WM_ICON_NAME"); @@ -55,6 +79,7 @@ void prop_startup() CREATE(net_wm_window_type, "_NET_WM_WINDOW_TYPE"); CREATE(net_wm_state, "_NET_WM_STATE"); CREATE(net_wm_strut, "_NET_WM_STRUT"); + CREATE(net_wm_strut_partial, "_NET_WM_STRUT_PARTIAL"); CREATE(net_wm_icon, "_NET_WM_ICON"); /* CREATE(net_wm_pid, "_NET_WM_PID"); */ CREATE(net_wm_allowed_actions, "_NET_WM_ALLOWED_ACTIONS"); @@ -278,27 +303,32 @@ gboolean prop_get_string_locale(Window win, Atom prop, char **ret) gboolean prop_get_strings_locale(Window win, Atom prop, char ***ret) { + GSList *strs = NULL, *it; char *raw, *p; - guint num, i; + guint num, i, count = 0; - if (get_all(win, prop, prop_atoms.string, 8, (guchar**)&raw, &num)){ - *ret = g_new(char*, num + 1); - (*ret)[num] = NULL; /* null terminated list */ + if (get_all(win, prop, prop_atoms.string, 8, (guchar**)&raw, &num)) { p = raw; - for (i = 0; i < num; ++i) { - (*ret)[i] = g_convert(p, strlen(p), "UTF-8", "ISO-8859-1", + while (p < raw + num - 1) { + ++count; + strs = g_slist_append(strs, p); + p += strlen(p) + 1; /* next string */ + } + + *ret = g_new0(char*, count + 1); + (*ret)[count] = NULL; /* null terminated list */ + + for (i = 0, it = strs; it; ++i, it = g_slist_next(it)) { + (*ret)[i] = g_convert(it->data, -1, "UTF-8", "ISO-8859-1", NULL, NULL, NULL); /* make sure translation did not fail */ - if (!(*ret)[i]) { - g_strfreev(*ret); /* free what we did so far */ - break; /* the force is not strong with us */ - } - p += strlen(p) + 1; + if (!(*ret)[i]) + (*ret)[i] = g_strdup(""); } g_free(raw); - if (i == num) - return TRUE; + g_slist_free(strs); + return TRUE; } return FALSE; } @@ -323,22 +353,29 @@ gboolean prop_get_string_utf8(Window win, Atom prop, char **ret) gboolean prop_get_strings_utf8(Window win, Atom prop, char ***ret) { + GSList *strs = NULL, *it; char *raw, *p; - guint num, i; + guint num, i, count = 0; if (get_all(win, prop, prop_atoms.utf8, 8, (guchar**)&raw, &num)) { - *ret = g_new(char*, num + 1); - (*ret)[num] = NULL; /* null terminated list */ p = raw; - for (i = 0; i < num; ++i) { - if (g_utf8_validate(p, -1, NULL)) - (*ret)[i] = g_strdup(p); + while (p < raw + num - 1) { + ++count; + strs = g_slist_append(strs, p); + p += strlen(p) + 1; /* next string */ + } + + *ret = g_new0(char*, count + 1); + + for (i = 0, it = strs; it; ++i, it = g_slist_next(it)) { + if (g_utf8_validate(it->data, -1, NULL)) + (*ret)[i] = g_strdup(it->data); else (*ret)[i] = g_strdup(""); - p += strlen(p) + 1; } g_free(raw); + g_slist_free(strs); return TRUE; } return FALSE; @@ -375,6 +412,7 @@ void prop_set_strings_utf8(Window win, Atom prop, char **strs) } XChangeProperty(ob_display, win, prop, prop_atoms.utf8, 8, PropModeReplace, (guchar*)str->str, str->len); + g_string_free(str, TRUE); } void prop_erase(Window win, Atom prop) @@ -383,7 +421,7 @@ void prop_erase(Window win, Atom prop) } void prop_message(Window about, Atom messagetype, long data0, long data1, - long data2, long data3) + long data2, long data3, long mask) { XEvent ce; ce.xclient.type = ClientMessage; @@ -395,6 +433,6 @@ void prop_message(Window about, Atom messagetype, long data0, long data1, ce.xclient.data.l[1] = data1; ce.xclient.data.l[2] = data2; ce.xclient.data.l[3] = data3; - XSendEvent(ob_display, ob_root, FALSE, - SubstructureNotifyMask | SubstructureRedirectMask, &ce); + XSendEvent(ob_display, RootWindow(ob_display, ob_screen), FALSE, + mask, &ce); }