static VALUE rg_m_text_property_to_text_list(int argc, VALUE *argv, G_GNUC_UNUSED VALUE self) { gint num, i; gchar** list; VALUE ret = Qnil; if (argc == 3) { VALUE encoding, format, text; rb_scan_args(argc, argv, "30", &encoding, &format, &text); StringValue(text); num = gdk_text_property_to_text_list(RVAL2ATOM(encoding), NUM2INT(format), (const guchar*)RVAL2CSTR(text), RSTRING_LEN(text), &list); } else { #if GTK_CHECK_VERSION(2,2,0) VALUE display, encoding, format, text; rb_scan_args(argc, argv, "40", &display, &encoding, &format, &text); StringValue(text); num = gdk_text_property_to_text_list_for_display(GDK_DISPLAY_OBJECT(RVAL2GOBJ(display)), RVAL2ATOM(encoding), NUM2INT(format), (const guchar*)RVAL2CSTR(text), RSTRING_LEN(text), &list); #else VALUE encoding, format, text; rb_scan_args(argc, argv, "30", &encoding, &format, &text); rb_warn("Gdk::Property.text_property_to_text_list: Not supported arguments in GTK+-2.0.x."); num = gdk_text_property_to_text_list(RVAL2ATOM(encoding), NUM2INT(format), (const guchar*)RVAL2CSTR(text), RSTRING_LEN(text), &list); #endif } ret = rb_ary_new2(num); for (i =0; i < num; i++) { rb_ary_push(ret, CSTR2RVAL(list[i])); } gdk_free_text_list(list); return ret; }
/* stolen from gwmh */ static gpointer get_typed_property_data (Display *xdisplay, Window xwindow, Atom property, Atom requested_type, gint *size_p, guint expected_format) { static const guint prop_buffer_lengh = 1024 * 1024; unsigned char *prop_data = NULL; Atom type_returned = 0; unsigned long nitems_return = 0, bytes_after_return = 0; int format_returned = 0; gpointer data = NULL; gboolean abort = FALSE; g_return_val_if_fail (size_p != NULL, NULL); *size_p = 0; gdk_error_trap_push (); abort = XGetWindowProperty (xdisplay, xwindow, property, 0, prop_buffer_lengh, False, requested_type, &type_returned, &format_returned, &nitems_return, &bytes_after_return, &prop_data) != Success; if (gdk_error_trap_pop () || type_returned == None) abort++; if (!abort && requested_type != AnyPropertyType && requested_type != type_returned) { /* aparently this can happen for some properties of broken apps, be silent */ abort++; } if (!abort && bytes_after_return) { g_warning (G_GNUC_PRETTY_FUNCTION "(): Eeek, property has more than %u bytes, stored on harddisk?", prop_buffer_lengh); abort++; } if (!abort && expected_format && expected_format != format_returned) { g_warning (G_GNUC_PRETTY_FUNCTION "(): Expected format (%u) unmatched (%d)", expected_format, format_returned); abort++; } if (!abort && prop_data && nitems_return && format_returned) { switch (format_returned) { case 32: *size_p = nitems_return * 4; if (sizeof (gulong) == 8) { guint32 i, *mem = g_malloc0 (*size_p + 1); gulong *prop_longs = (gulong*) prop_data; for (i = 0; i < *size_p / 4; i++) mem[i] = prop_longs[i]; data = mem; } break; case 16: *size_p = nitems_return * 2; break; case 8: *size_p = nitems_return; break; default: g_warning ("Unknown property data format with %d bits (extraterrestrial?)", format_returned); break; } if (!data && *size_p) { guint8 *mem = NULL; if (format_returned == 8 && type_returned == XA_COMPOUND_TEXT) { gchar **tlist = NULL; gint count = gdk_text_property_to_text_list (gdk_x11_xatom_to_atom (type_returned), 8, prop_data, nitems_return, &tlist); if (count && tlist && tlist[0]) { mem = (guint8 *)g_strdup (tlist[0]); *size_p = strlen ((char *)mem); } if (tlist) gdk_free_text_list (tlist); } if (!mem) { mem = g_malloc (*size_p + 1); memcpy (mem, prop_data, *size_p); mem[*size_p] = 0; } data = mem; } } if (prop_data) XFree (prop_data); return data; }