// 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") } }
func (t *track) SetLength(val int32) { t.t.tracklen = C.gint32(val) }
func GlibInt32(i int32) C.gint32 { return C.gint32(i) }