X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fprop.c;h=5cc101092a2819ebfeaecc7ff29a38929c3dac2b;hb=35418ca0fcd3fd28ef579f4435b8bad3b7c87f04;hp=a97b66dc3748fc5831790a6773bcb7397c722241;hpb=693c88ca35a19b50ee52860800bcb861c035f7da;p=chaz%2Fopenbox diff --git a/openbox/prop.c b/openbox/prop.c index a97b66dc..5cc10109 100644 --- a/openbox/prop.c +++ b/openbox/prop.c @@ -45,6 +45,7 @@ void prop_startup() CREATE(net_close_window, "_NET_CLOSE_WINDOW"); CREATE(net_wm_moveresize, "_NET_WM_MOVERESIZE"); + CREATE(net_moveresize_window, "_NET_MOVERESIZE_WINDOW"); CREATE(net_wm_name, "_NET_WM_NAME"); CREATE(net_wm_visible_name, "_NET_WM_VISIBLE_NAME"); @@ -69,15 +70,18 @@ void prop_startup() CREATE(net_wm_window_type_dialog, "_NET_WM_WINDOW_TYPE_DIALOG"); CREATE(net_wm_window_type_normal, "_NET_WM_WINDOW_TYPE_NORMAL"); - CREATE(net_wm_moveresize_size_topleft, "_NET_WM_MOVERESIZE_SIZE_TOPLEFT"); - CREATE(net_wm_moveresize_size_topright, - "_NET_WM_MOVERESIZE_SIZE_TOPRIGHT"); - CREATE(net_wm_moveresize_size_bottomleft, - "_NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT"); - CREATE(net_wm_moveresize_size_bottomright, - "_NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT"); - CREATE(net_wm_moveresize_move, "_NET_WM_MOVERESIZE_MOVE"); - + prop_atoms.net_wm_moveresize_size_topleft = 0; + prop_atoms.net_wm_moveresize_size_top = 1; + prop_atoms.net_wm_moveresize_size_topright = 2; + prop_atoms.net_wm_moveresize_size_right = 3; + prop_atoms.net_wm_moveresize_size_bottomright = 4; + prop_atoms.net_wm_moveresize_size_bottom = 5; + prop_atoms.net_wm_moveresize_size_bottomleft = 6; + prop_atoms.net_wm_moveresize_size_left = 7; + prop_atoms.net_wm_moveresize_move = 8; + prop_atoms.net_wm_moveresize_size_keyboard = 9; + prop_atoms.net_wm_moveresize_move_keyboard = 10; + CREATE(net_wm_action_move, "_NET_WM_ACTION_MOVE"); CREATE(net_wm_action_resize, "_NET_WM_ACTION_RESIZE"); CREATE(net_wm_action_minimize, "_NET_WM_ACTION_MINIMIZE"); @@ -182,7 +186,7 @@ static gboolean get_prealloc(Window win, Atom prop, Atom type, int size, ((guint16*)data)[i] = ((guint16*)xdata)[i]; break; case 32: - ((guint32*)data)[i] = ((guint32*)xdata)[i]; + ((guint32*)data)[i] = ((gulong*)xdata)[i]; break; default: g_assert_not_reached(); /* unhandled size */ @@ -221,7 +225,7 @@ static gboolean get_all(Window win, Atom prop, Atom type, int size, ((guint16*)*data)[i] = ((guint16*)xdata)[i]; break; case 32: - ((guint32*)*data)[i] = ((guint32*)xdata)[i]; + ((guint32*)*data)[i] = ((gulong*)xdata)[i]; break; default: g_assert_not_reached(); /* unhandled size */ @@ -264,35 +268,42 @@ gboolean prop_get_string_locale(Window win, Atom prop, char **ret) int nstr; if (get_stringlist(win, prop, &list, &nstr) && nstr) { - *ret = g_locale_to_utf8(list[0], -1, NULL, NULL, NULL); + *ret = g_convert(list[0], strlen(list[0]), "UTF-8", "ISO-8859-1", + NULL, NULL, NULL); XFreeStringList(list); - if (ret) return TRUE; + if (*ret) return TRUE; } return FALSE; } 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_locale_to_utf8(p, -1, NULL, NULL, NULL); + 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 = strchr(p, '\0'); + if (!(*ret)[i]) + (*ret)[i] = g_strdup(""); } g_free(raw); - if (i == num) - return TRUE; + g_slist_free(strs); + return TRUE; } return FALSE; } @@ -300,31 +311,46 @@ gboolean prop_get_strings_locale(Window win, Atom prop, char ***ret) gboolean prop_get_string_utf8(Window win, Atom prop, char **ret) { char *raw; + char *str; guint num; if (get_all(win, prop, prop_atoms.utf8, 8, (guchar**)&raw, &num)) { - *ret = g_strndup(raw, num); /* grab the first string from the list */ + str = g_strndup(raw, num); /* grab the first string from the list */ g_free(raw); - return TRUE; + if (g_utf8_validate(str, -1, NULL)) { + *ret = str; + return TRUE; + } + g_free(str); } return FALSE; } 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) { - (*ret)[i] = g_strdup(p); - p = strchr(p, '\0'); + 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(""); } g_free(raw); + g_slist_free(strs); return TRUE; } return FALSE; @@ -352,11 +378,11 @@ void prop_set_string_utf8(Window win, Atom prop, char *val) void prop_set_strings_utf8(Window win, Atom prop, char **strs) { GString *str; - guint i; + char **s; str = g_string_sized_new(0); - for (i = 0; strs[i]; ++i) { - str = g_string_append(str, strs[i]); + for (s = strs; *s; ++s) { + str = g_string_append(str, *s); str = g_string_append_c(str, '\0'); } XChangeProperty(ob_display, win, prop, prop_atoms.utf8, 8, @@ -381,6 +407,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, + XSendEvent(ob_display, RootWindow(ob_display, ob_screen), FALSE, SubstructureNotifyMask | SubstructureRedirectMask, &ce); }