static void dump_array(GValueArray *array) { unsigned int i; if (array != NULL) { printf("args = {"); for (i = 0; i < array->n_values; i++) { GValue *value; value = g_value_array_get_nth(array, i); if (i > 0) { printf(", "); } if (G_VALUE_HOLDS_LONG(value)) { printf("%ld", g_value_get_long(value)); } if (G_VALUE_HOLDS_STRING(value)) { printf("`%s'", g_value_get_string(value)); } if (G_VALUE_HOLDS_POINTER(value)) { printf("`%ls'", (wchar_t*) g_value_get_pointer(value)); } } printf("}\n"); } }
static gpointer value_as_pointer (GValue *value) { if (g_value_fits_pointer (value)) return g_value_peek_pointer (value); if (G_VALUE_HOLDS_BOOLEAN (value)) return (void*) g_value_get_boolean (value); if (G_VALUE_HOLDS_CHAR (value)) return (void*) (gssize) g_value_get_char (value); if (G_VALUE_HOLDS_UCHAR (value)) return (void*) (gsize) g_value_get_uchar (value); if (G_VALUE_HOLDS_INT (value)) return (void*) g_value_get_int (value); if (G_VALUE_HOLDS_UINT (value)) return (void*) g_value_get_uint (value); if (G_VALUE_HOLDS_LONG (value)) return (void*) g_value_get_long (value); if (G_VALUE_HOLDS_ULONG (value)) return (void*) g_value_get_ulong (value); if (G_VALUE_HOLDS_FLOAT (value)) return (void*) (gssize) g_value_get_float (value); if (G_VALUE_HOLDS_DOUBLE (value)) return (void*) (gssize) g_value_get_double (value); if (G_VALUE_HOLDS_ENUM (value)) return (void*) (gssize) g_value_get_enum (value); if (G_VALUE_HOLDS_FLAGS (value)) return (void*) (gsize) g_value_get_flags (value); return (void*) 0x1373babe; }
/** * g_value_get_long: * @value: a valid #GValue of type %G_TYPE_LONG * * Get the contents of a %G_TYPE_LONG #GValue. * * Returns: long integer contents of @value */ glong g_value_get_long (const GValue *value) { g_return_val_if_fail (G_VALUE_HOLDS_LONG (value), 0); return value->data[0].v_long; }
/* Print the contents of a GValueArray. */ static void print_array(GValueArray *array) { int i; GValue *value; if (array != NULL) { printf(" ("); for (i = 0; i < array->n_values; i++) { value = g_value_array_get_nth(array, i); if (i > 0) { printf(", "); } if (G_VALUE_HOLDS_LONG(value)) { printf("%ld", g_value_get_long(value)); } else if (G_VALUE_HOLDS_STRING(value)) { printf("\"%s\"", g_value_get_string(value)); } else if (G_VALUE_HOLDS_POINTER(value)) { printf("\"%ls\"", (wchar_t*) g_value_get_pointer(value)); } if (G_VALUE_HOLDS_BOXED(value)) { print_array(g_value_get_boxed(value)); } } printf(")"); /* _vte_matcher_free_params_array(array); */ } }
int ce_get_property_default (NMSetting *setting, const char *property_name) { GParamSpec *spec; GValue value = { 0, }; g_return_val_if_fail (NM_IS_SETTING (setting), -1); spec = g_object_class_find_property (G_OBJECT_GET_CLASS (setting), property_name); g_return_val_if_fail (spec != NULL, -1); g_value_init (&value, spec->value_type); g_param_value_set_default (spec, &value); if (G_VALUE_HOLDS_CHAR (&value)) return (int) g_value_get_schar (&value); else if (G_VALUE_HOLDS_INT (&value)) return g_value_get_int (&value); else if (G_VALUE_HOLDS_INT64 (&value)) return (int) g_value_get_int64 (&value); else if (G_VALUE_HOLDS_LONG (&value)) return (int) g_value_get_long (&value); else if (G_VALUE_HOLDS_UINT (&value)) return (int) g_value_get_uint (&value); else if (G_VALUE_HOLDS_UINT64 (&value)) return (int) g_value_get_uint64 (&value); else if (G_VALUE_HOLDS_ULONG (&value)) return (int) g_value_get_ulong (&value); else if (G_VALUE_HOLDS_UCHAR (&value)) return (int) g_value_get_uchar (&value); g_return_val_if_fail (FALSE, 0); return 0; }
/** * g_value_set_long: * @value: a valid #GValue of type %G_TYPE_LONG * @v_long: long integer value to be set * * Set the contents of a %G_TYPE_LONG #GValue to @v_long. */ void g_value_set_long (GValue *value, glong v_long) { g_return_if_fail (G_VALUE_HOLDS_LONG (value)); value->data[0].v_long = v_long; }
/* * Returns a style property if it exists and if it is a long. If not, 0 is returned. * Its a dirty hack. The proper way would be using gtk_style_get() which is only * available with Gtk+ >= 2.16 */ static glong get_style_property_long (GtkStyle *style, GType widget_type, const gchar *property_name) { GtkRcProperty *rcprop = NULL; GtkWidgetClass *klass = g_type_class_ref (widget_type); GParamSpec *pspec = gtk_widget_class_find_style_property (klass, property_name); /* Style must be rc style */ g_return_val_if_fail(style->rc_style != NULL, 0); if (!pspec) { g_printerr("WARN: get_style_property_long: Property '%s' not found\n", property_name); return 0; } if (style->rc_style->rc_properties) { GtkRcProperty key; key.type_name = g_type_qname(widget_type); key.property_name = g_quark_from_string(pspec->name); /* Search all properties for given key */ rcprop = bsearch (&key, style->rc_style->rc_properties->data, style->rc_style->rc_properties->len, sizeof(GtkRcProperty), gtk_rc_properties_cmp); } if (rcprop == NULL) { g_printerr("WARN: get_style_property_long: RcProperty '%s' not found\n", property_name); return 0; } if (G_VALUE_HOLDS_LONG(&(rcprop->value))) { return g_value_get_long(&(rcprop->value)); } else { g_printerr("WARN: get_style_property_long: Property '%s' is not a long\n", property_name); return 0; } }
static GtkCellEditable * parasite_property_cell_renderer_start_editing(GtkCellRenderer *renderer, GdkEvent *event, GtkWidget *widget, const gchar *path, GdkRectangle *background_area, GdkRectangle *cell_area, GtkCellRendererState flags) { PangoFontDescription *font_desc; GtkCellEditable *editable = NULL; GObject *object; const char *name; GValue gvalue = {0}; GParamSpec *prop; g_object_get(renderer, "object", &object, "name", &name, NULL); prop = g_object_class_find_property(G_OBJECT_GET_CLASS(object), name); if (!(prop->flags & G_PARAM_WRITABLE)) return NULL; g_value_init(&gvalue, prop->value_type); g_object_get_property(object, name, &gvalue); if (G_VALUE_HOLDS_ENUM(&gvalue) || G_VALUE_HOLDS_BOOLEAN(&gvalue)) { GtkWidget *combobox = gtk_combo_box_new_text(); gtk_widget_show(combobox); g_object_set(G_OBJECT(combobox), "has-frame", FALSE, NULL); GList *renderers; if (G_VALUE_HOLDS_BOOLEAN(&gvalue)) { gtk_combo_box_append_text(GTK_COMBO_BOX(combobox), "FALSE"); gtk_combo_box_append_text(GTK_COMBO_BOX(combobox), "TRUE"); gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), g_value_get_boolean(&gvalue) ? 1 : 0); } else if (G_VALUE_HOLDS_ENUM(&gvalue)) { gint value = g_value_get_enum(&gvalue); GEnumClass *enum_class = G_PARAM_SPEC_ENUM(prop)->enum_class; guint i; for (i = 0; i < enum_class->n_values; i++) { GEnumValue *enum_value = &enum_class->values[i]; gtk_combo_box_append_text(GTK_COMBO_BOX(combobox), enum_value->value_name); if (enum_value->value == value) gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), i); } } renderers = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(combobox)); g_object_set(G_OBJECT(renderers->data), "scale", TREE_TEXT_SCALE, NULL); g_list_free(renderers); editable = GTK_CELL_EDITABLE(combobox); } else if (G_VALUE_HOLDS_STRING(&gvalue)) { GtkWidget *entry = gtk_entry_new(); gtk_widget_show(entry); gtk_entry_set_text(GTK_ENTRY(entry), g_value_get_string(&gvalue)); editable = GTK_CELL_EDITABLE(entry); } else if (G_VALUE_HOLDS_INT(&gvalue) || G_VALUE_HOLDS_UINT(&gvalue) || G_VALUE_HOLDS_INT64(&gvalue) || G_VALUE_HOLDS_UINT64(&gvalue) || G_VALUE_HOLDS_LONG(&gvalue) || G_VALUE_HOLDS_ULONG(&gvalue) || G_VALUE_HOLDS_DOUBLE(&gvalue)) { double min, max, value; GtkWidget *spinbutton; guint digits = 0; if (G_VALUE_HOLDS_INT(&gvalue)) { GParamSpecInt *paramspec = G_PARAM_SPEC_INT(prop); min = paramspec->minimum; max = paramspec->maximum; value = g_value_get_int(&gvalue); } else if (G_VALUE_HOLDS_UINT(&gvalue)) { GParamSpecUInt *paramspec = G_PARAM_SPEC_UINT(prop); min = paramspec->minimum; max = paramspec->maximum; value = g_value_get_uint(&gvalue); } else if (G_VALUE_HOLDS_INT64(&gvalue)) { GParamSpecInt64 *paramspec = G_PARAM_SPEC_INT64(prop); min = paramspec->minimum; max = paramspec->maximum; value = g_value_get_int64(&gvalue); } else if (G_VALUE_HOLDS_UINT64(&gvalue)) { GParamSpecUInt64 *paramspec = G_PARAM_SPEC_UINT64(prop); min = paramspec->minimum; max = paramspec->maximum; value = g_value_get_uint64(&gvalue); } else if (G_VALUE_HOLDS_LONG(&gvalue)) { GParamSpecLong *paramspec = G_PARAM_SPEC_LONG(prop); min = paramspec->minimum; max = paramspec->maximum; value = g_value_get_long(&gvalue); } else if (G_VALUE_HOLDS_ULONG(&gvalue)) { GParamSpecULong *paramspec = G_PARAM_SPEC_ULONG(prop); min = paramspec->minimum; max = paramspec->maximum; value = g_value_get_ulong(&gvalue); } else if (G_VALUE_HOLDS_DOUBLE(&gvalue)) { GParamSpecDouble *paramspec = G_PARAM_SPEC_DOUBLE(prop); min = paramspec->minimum; max = paramspec->maximum; value = g_value_get_double(&gvalue); digits = 2; } else { // Shouldn't really be able to happen. return NULL; } spinbutton = gtk_spin_button_new_with_range(min, max, 1); gtk_widget_show(spinbutton); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbutton), value); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinbutton), digits); editable = GTK_CELL_EDITABLE(spinbutton); } font_desc = pango_font_description_new(); pango_font_description_set_size(font_desc, 8 * PANGO_SCALE); gtk_widget_modify_font(GTK_WIDGET(editable), font_desc); pango_font_description_free(font_desc); g_value_unset(&gvalue); g_signal_connect(G_OBJECT(editable), "editing_done", G_CALLBACK(parasite_property_cell_renderer_stop_editing), renderer); g_object_set_data_full(G_OBJECT(editable), "_prop_name", g_strdup(name), g_free); g_object_set_data(G_OBJECT(editable), "_prop_object", object); return editable; }
int main(int argc, char **argv) { struct _vte_matcher *matcher = NULL; GArray *array; unsigned int i, j; int l; unsigned char buf[4096]; GValue *value; int infile; struct _vte_iso2022_state *subst; const char *tmp; GValueArray *values; _vte_debug_init(); if (argc < 1) { g_print("usage: %s [file]\n", argv[0]); return 1; } if ((argc > 1) && (strcmp(argv[1], "-") != 0)) { infile = open (argv[1], O_RDONLY); if (infile == -1) { g_print("error opening %s: %s\n", argv[1], strerror(errno)); exit(1); } } else { infile = 1; } g_type_init(); array = g_array_new(FALSE, FALSE, sizeof(gunichar)); matcher = _vte_matcher_new(); subst = _vte_iso2022_state_new(NULL, VTE_ISO2022_DEFAULT_UTF8_AMBIGUOUS_WIDTH, NULL, NULL); for (;;) { l = read (infile, buf, sizeof (buf)); if (!l) break; if (l == -1) { if (errno == EAGAIN) continue; exit (1); } g_array_set_size (array, 0); _vte_iso2022_process(subst, buf, (unsigned int) l, array); i = 0; while (i <= array->len) { tmp = NULL; values = NULL; for (j = 1; j < (array->len - i); j++) { _vte_matcher_match(matcher, &g_array_index(array, gunichar, i), j, &tmp, NULL, &values); if ((tmp == NULL) || (strlen(tmp) > 0)) { break; } } if (i + j == array->len) { break; } if (tmp == NULL) { gunichar c; c = g_array_index(array, gunichar, i); if (VTE_ISO2022_HAS_ENCODED_WIDTH(c)) { c &= ~VTE_ISO2022_ENCODED_WIDTH_MASK; } if (c < 32) { g_print("`^%c'\n", c + 64); } else if (c < 127) { g_print("`%c'\n", c); } else { g_print("`0x%x'\n", c); } i++; continue; } l = j; g_print("%s(", tmp); for (j = 0; (values != NULL) && (j < values->n_values); j++) { if (j > 0) { g_print(", "); } value = g_value_array_get_nth(values, j); if (G_VALUE_HOLDS_LONG(value)) { g_print("%ld", g_value_get_long(value)); } if (G_VALUE_HOLDS_STRING(value)) { g_print("`%s'", g_value_get_string(value)); } if (G_VALUE_HOLDS_POINTER(value)) { g_print("`%ls'", (wchar_t*) g_value_get_pointer(value)); } } if (values != NULL) { _vte_matcher_free_params_array(matcher, values); } g_print(")\n"); i += l; } } g_print("End of data.\n"); close (infile); _vte_iso2022_state_free(subst); g_array_free(array, TRUE); _vte_matcher_free(matcher); return 0; }
PyObject * pygi_get_property_value_real (PyGObject *instance, const gchar *attr_name) { GType g_type; GIPropertyInfo *property_info = NULL; char *property_name = g_strdup (attr_name); GParamSpec *pspec = NULL; GValue value = { 0, }; GIArgument arg = { 0, }; PyObject *py_value = NULL; GITypeInfo *type_info = NULL; GITransfer transfer; canonicalize_key (property_name); g_type = pyg_type_from_object ((PyObject *)instance); property_info = _pygi_lookup_property_from_g_type (g_type, property_name); if (property_info == NULL) goto out; pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (instance->obj), attr_name); if (pspec == NULL) goto out; g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec)); g_object_get_property (instance->obj, attr_name, &value); type_info = g_property_info_get_type (property_info); transfer = g_property_info_get_ownership_transfer (property_info); GITypeTag type_tag = g_type_info_get_tag (type_info); switch (type_tag) { case GI_TYPE_TAG_BOOLEAN: arg.v_boolean = g_value_get_boolean (&value); break; case GI_TYPE_TAG_INT8: arg.v_int8 = g_value_get_schar (&value); break; case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_INT32: if (G_VALUE_HOLDS_LONG (&value)) arg.v_long = g_value_get_long (&value); else arg.v_int = g_value_get_int (&value); break; case GI_TYPE_TAG_INT64: if (G_VALUE_HOLDS_LONG (&value)) arg.v_long = g_value_get_long (&value); else arg.v_int64 = g_value_get_int64 (&value); break; case GI_TYPE_TAG_UINT8: arg.v_uint8 = g_value_get_uchar (&value); break; case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_UINT32: if (G_VALUE_HOLDS_ULONG (&value)) arg.v_ulong = g_value_get_ulong (&value); else arg.v_uint = g_value_get_uint (&value); break; case GI_TYPE_TAG_UINT64: if (G_VALUE_HOLDS_ULONG (&value)) arg.v_ulong = g_value_get_ulong (&value); else arg.v_uint64 = g_value_get_uint64 (&value); break; case GI_TYPE_TAG_FLOAT: arg.v_float = g_value_get_float (&value); break; case GI_TYPE_TAG_DOUBLE: arg.v_double = g_value_get_double (&value); break; case GI_TYPE_TAG_GTYPE: arg.v_size = g_value_get_gtype (&value); break; case GI_TYPE_TAG_UTF8: case GI_TYPE_TAG_FILENAME: arg.v_string = g_value_dup_string (&value); break; case GI_TYPE_TAG_INTERFACE: { GIBaseInfo *info; GIInfoType info_type; GType type; info = g_type_info_get_interface (type_info); type = g_registered_type_info_get_g_type (info); info_type = g_base_info_get_type (info); g_base_info_unref (info); switch (info_type) { case GI_INFO_TYPE_ENUM: arg.v_int32 = g_value_get_enum (&value); break; case GI_INFO_TYPE_INTERFACE: case GI_INFO_TYPE_OBJECT: arg.v_pointer = g_value_get_object (&value); break; case GI_INFO_TYPE_BOXED: case GI_INFO_TYPE_STRUCT: case GI_INFO_TYPE_UNION: if (g_type_is_a (type, G_TYPE_BOXED)) { arg.v_pointer = g_value_get_boxed (&value); } else if (g_type_is_a (type, G_TYPE_POINTER)) { arg.v_pointer = g_value_get_pointer (&value); } else { PyErr_Format (PyExc_NotImplementedError, "Retrieving properties of type '%s' is not implemented", g_type_name (type)); } break; default: PyErr_Format (PyExc_NotImplementedError, "Retrieving properties of type '%s' is not implemented", g_type_name (type)); goto out; } break; } case GI_TYPE_TAG_GHASH: arg.v_pointer = g_value_get_boxed (&value); break; case GI_TYPE_TAG_GLIST: arg.v_pointer = g_value_get_pointer (&value); break; case GI_TYPE_TAG_ARRAY: { gchar** strings; GArray *arg_items; int i; strings = g_value_get_boxed (&value); if (strings == NULL) arg.v_pointer = NULL; else { arg_items = g_array_sized_new (TRUE, TRUE, sizeof (GIArgument), g_strv_length (strings)); g_array_set_size (arg_items, g_strv_length (strings)); for (i = 0; strings[i] != NULL; ++i) { g_array_index (arg_items, GIArgument, i).v_string = strings[i]; } arg.v_pointer = arg_items; } break; } default: PyErr_Format (PyExc_NotImplementedError, "Retrieving properties of type %s is not implemented", g_type_tag_to_string (g_type_info_get_tag (type_info))); goto out; } py_value = _pygi_argument_to_object (&arg, type_info, transfer); out: g_free (property_name); if (property_info != NULL) g_base_info_unref (property_info); if (type_info != NULL) g_base_info_unref (type_info); return py_value; }
gint pygi_set_property_value_real (PyGObject *instance, const gchar *attr_name, PyObject *py_value) { GType g_type; GIPropertyInfo *property_info = NULL; char *property_name = g_strdup (attr_name); GITypeInfo *type_info = NULL; GITypeTag type_tag; GITransfer transfer; GValue value = { 0, }; GIArgument arg = { 0, }; GParamSpec *pspec = NULL; gint ret_value = -1; canonicalize_key (property_name); g_type = pyg_type_from_object ((PyObject *)instance); property_info = _pygi_lookup_property_from_g_type (g_type, property_name); if (property_info == NULL) goto out; pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (instance->obj), attr_name); if (pspec == NULL) goto out; if (! (pspec->flags & G_PARAM_WRITABLE)) goto out; type_info = g_property_info_get_type (property_info); transfer = g_property_info_get_ownership_transfer (property_info); arg = _pygi_argument_from_object (py_value, type_info, transfer); if (PyErr_Occurred()) goto out; g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (pspec)); // FIXME: Lots of types still unhandled type_tag = g_type_info_get_tag (type_info); switch (type_tag) { case GI_TYPE_TAG_INTERFACE: { GIBaseInfo *info; GIInfoType info_type; GType type; info = g_type_info_get_interface (type_info); type = g_registered_type_info_get_g_type (info); info_type = g_base_info_get_type (info); g_base_info_unref (info); switch (info_type) { case GI_INFO_TYPE_ENUM: g_value_set_enum (&value, arg.v_int32); break; case GI_INFO_TYPE_INTERFACE: case GI_INFO_TYPE_OBJECT: g_value_set_object (&value, arg.v_pointer); break; case GI_INFO_TYPE_BOXED: case GI_INFO_TYPE_STRUCT: case GI_INFO_TYPE_UNION: if (g_type_is_a (type, G_TYPE_BOXED)) { g_value_set_boxed (&value, arg.v_pointer); } else { PyErr_Format (PyExc_NotImplementedError, "Setting properties of type '%s' is not implemented", g_type_name (type)); } break; default: PyErr_Format (PyExc_NotImplementedError, "Setting properties of type '%s' is not implemented", g_type_name (type)); goto out; } break; } case GI_TYPE_TAG_BOOLEAN: g_value_set_boolean (&value, arg.v_boolean); break; case GI_TYPE_TAG_INT8: g_value_set_schar (&value, arg.v_int8); break; case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_INT32: if (G_VALUE_HOLDS_LONG (&value)) g_value_set_long (&value, arg.v_long); else g_value_set_int (&value, arg.v_int); break; case GI_TYPE_TAG_INT64: if (G_VALUE_HOLDS_LONG (&value)) g_value_set_long (&value, arg.v_long); else g_value_set_int64 (&value, arg.v_int64); break; case GI_TYPE_TAG_UINT8: g_value_set_uchar (&value, arg.v_uint8); break; case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_UINT32: if (G_VALUE_HOLDS_ULONG (&value)) g_value_set_ulong (&value, arg.v_ulong); else g_value_set_uint (&value, arg.v_uint); break; case GI_TYPE_TAG_UINT64: if (G_VALUE_HOLDS_ULONG (&value)) g_value_set_ulong (&value, arg.v_ulong); else g_value_set_uint64 (&value, arg.v_uint64); break; case GI_TYPE_TAG_FLOAT: g_value_set_float (&value, arg.v_float); break; case GI_TYPE_TAG_DOUBLE: g_value_set_double (&value, arg.v_double); break; case GI_TYPE_TAG_GTYPE: g_value_set_gtype (&value, arg.v_size); break; case GI_TYPE_TAG_UTF8: case GI_TYPE_TAG_FILENAME: g_value_set_string (&value, arg.v_string); break; case GI_TYPE_TAG_GHASH: g_value_set_boxed (&value, arg.v_pointer); break; case GI_TYPE_TAG_GLIST: g_value_set_pointer (&value, arg.v_pointer); break; case GI_TYPE_TAG_ARRAY: { GArray *arg_items = (GArray*) arg.v_pointer; gchar** strings; int i; if (arg_items == NULL) goto out; strings = g_new0 (char*, arg_items->len); for (i = 0; i < arg_items->len; ++i) { strings[i] = g_array_index (arg_items, GIArgument, i).v_string; } g_array_free (arg_items, TRUE); g_value_set_boxed (&value, strings); break; } default: PyErr_Format (PyExc_NotImplementedError, "Setting properties of type %s is not implemented", g_type_tag_to_string (g_type_info_get_tag (type_info))); goto out; } g_object_set_property (instance->obj, attr_name, &value); ret_value = 0; out: g_free (property_name); if (property_info != NULL) g_base_info_unref (property_info); if (type_info != NULL) g_base_info_unref (type_info); return ret_value; }