// Set value to i func (v *Value) Set(i interface{}) { if vg, ok := i.(ValueGetter); ok { vg.Value().Copy(v) return } // Other types r := reflect.ValueOf(i) switch r.Kind() { case reflect.Invalid: C.g_value_reset(v.g()) case reflect.Bool: C.g_value_set_boolean(v.g(), gBoolean(r.Bool())) case reflect.Int: C.g_value_set_long(v.g(), C.glong(i.(int))) case reflect.Int8: C.g_value_set_schar(v.g(), C.gint8(i.(int8))) case reflect.Int32: C.g_value_set_int(v.g(), C.gint(i.(int32))) case reflect.Int64: C.g_value_set_int64(v.g(), C.gint64(i.(int64))) case reflect.Uint: C.g_value_set_ulong(v.g(), C.gulong(i.(uint))) case reflect.Uint8: C.g_value_set_uchar(v.g(), C.guchar(i.(uint8))) case reflect.Uint32: C.g_value_set_uint(v.g(), C.guint(i.(uint32))) case reflect.Uint64: C.g_value_set_uint64(v.g(), C.guint64(i.(uint64))) case reflect.Float32: C.g_value_set_float(v.g(), C.gfloat(i.(float32))) case reflect.Float64: C.g_value_set_double(v.g(), C.gdouble(i.(float64))) case reflect.Ptr: C.g_value_set_pointer(v.g(), C.gpointer(r.Pointer())) case reflect.String: C.g_value_set_static_string(v.g(), (*C.gchar)(C.CString(r.String()))) default: panic("Can't represent Go value in Glib type system.") } }
// pointerVal attempts to return an unsafe.Pointer for value. // Not all types are understood, in which case a nil Pointer // is returned. func pointerVal(value interface{}) unsafe.Pointer { var p unsafe.Pointer switch v := value.(type) { case bool: c := gbool(v) p = unsafe.Pointer(&c) case int8: c := C.gint8(v) p = unsafe.Pointer(&c) case int16: c := C.gint16(v) p = unsafe.Pointer(&c) case int32: c := C.gint32(v) p = unsafe.Pointer(&c) case int64: c := C.gint64(v) p = unsafe.Pointer(&c) case int: c := C.gint(v) p = unsafe.Pointer(&c) case uint8: c := C.guchar(v) p = unsafe.Pointer(&c) case uint16: c := C.guint16(v) p = unsafe.Pointer(&c) case uint32: c := C.guint32(v) p = unsafe.Pointer(&c) case uint64: c := C.guint64(v) p = unsafe.Pointer(&c) case uint: c := C.guint(v) p = unsafe.Pointer(&c) case uintptr: p = unsafe.Pointer(C.gpointer(v)) case float32: c := C.gfloat(v) p = unsafe.Pointer(&c) case float64: c := C.gdouble(v) p = unsafe.Pointer(&c) case string: cstr := C.CString(v) defer C.free(unsafe.Pointer(cstr)) p = unsafe.Pointer(cstr) default: if pv, ok := value.(unsafe.Pointer); ok { p = pv } else { val := reflect.ValueOf(value) switch val.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: c := C.int(val.Int()) p = unsafe.Pointer(&c) case reflect.Uintptr, reflect.Ptr, reflect.UnsafePointer: p = unsafe.Pointer(C.gpointer(val.Pointer())) } } } return p }
// Set() is a wrapper around g_object_set(). However, unlike // g_object_set(), this function only sets one name value pair. Make // multiple calls to this function to set multiple properties. func (v *Object) Set(name string, value interface{}) error { cstr := C.CString(name) defer C.free(unsafe.Pointer(cstr)) if _, ok := value.(Object); ok { value = value.(Object).GObject } var p unsafe.Pointer = nil switch value.(type) { case bool: c := gbool(value.(bool)) p = unsafe.Pointer(&c) case int8: c := C.gint8(value.(int8)) p = unsafe.Pointer(&c) case int16: c := C.gint16(value.(int16)) p = unsafe.Pointer(&c) case int32: c := C.gint32(value.(int32)) p = unsafe.Pointer(&c) case int64: c := C.gint64(value.(int64)) p = unsafe.Pointer(&c) case int: c := C.gint(value.(int)) p = unsafe.Pointer(&c) case uint8: c := C.guchar(value.(uint8)) p = unsafe.Pointer(&c) case uint16: c := C.guint16(value.(uint16)) p = unsafe.Pointer(&c) case uint32: c := C.guint32(value.(uint32)) p = unsafe.Pointer(&c) case uint64: c := C.guint64(value.(uint64)) p = unsafe.Pointer(&c) case uint: c := C.guint(value.(uint)) p = unsafe.Pointer(&c) case uintptr: p = unsafe.Pointer(C.gpointer(value.(uintptr))) case float32: c := C.gfloat(value.(float32)) p = unsafe.Pointer(&c) case float64: c := C.gdouble(value.(float64)) p = unsafe.Pointer(&c) case string: cstr := C.CString(value.(string)) defer C.free(unsafe.Pointer(cstr)) p = unsafe.Pointer(cstr) default: if pv, ok := value.(unsafe.Pointer); ok { p = pv } else { // Constants with separate types are not type asserted // above, so do a runtime check here instead. val := reflect.ValueOf(value) switch val.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: c := C.int(val.Int()) p = unsafe.Pointer(&c) case reflect.Uintptr: p = unsafe.Pointer(C.gpointer(val.Pointer())) } } } // Can't call g_object_set() as it uses a variable arg list, use a // wrapper instead if p != nil { C._g_object_set_one(C.gpointer(v.GObject), (*C.gchar)(cstr), p) return nil } else { return errors.New("Unable to perform type conversion") } }
// SetSChar is a wrapper around g_value_set_schar(). func (v *Value) SetSChar(val int8) { C.g_value_set_schar(v.native(), C.gint8(val)) }
func GlibInt8(i int8) C.gint8 { return C.gint8(i) }