GIR: Decompose setters and getters for `[]string` and scalar types
Signed-off-by: Felicitas Pojtinger <felicitas@pojtinger.com>
- commit
- 86a69338578b70dc63b2a1c3121b87db4eb47eed
- author
- Felicitas Pojtinger · · 2025-10-31 05:26 UTC
- committer
- Jeroen Wijenbergh · · 2025-12-01 16:10 UTC
- parent
- 9aaf3ff
- signature
- unsigned
4 files · +83 -85
M gen.go +4 -0
| @@ -38,6 +38,10 @@ func main() { | |||
| 38 | 38 | "convcd": util.ConvertArgsCommaDeref, | |
| 39 | 39 | "convd": util.ConvertArgsDeref, | |
| 40 | 40 | "convcbne": util.ConvertCallbackArgsNoErr, | |
| 41 | + | "propsset": util.PropertyScalarSet, | |
| 42 | + | "propsget": util.PropertyScalarGet, | |
| 43 | + | "propvset": util.PropertyVectorSet, | |
| 44 | + | "propvget": util.PropertyVectorGet, | |
| 41 | 45 | }).ParseFiles("templates/go") | |
| 42 | 46 | if err != nil { | |
| 43 | 47 | panic(err) | |
| @@ -38,6 +38,10 @@ func main() { | |||||
| 38 | "convcd": util.ConvertArgsCommaDeref, | 38 | "convcd": util.ConvertArgsCommaDeref, | ||
| 39 | "convd": util.ConvertArgsDeref, | 39 | "convd": util.ConvertArgsDeref, | ||
| 40 | "convcbne": util.ConvertCallbackArgsNoErr, | 40 | "convcbne": util.ConvertCallbackArgsNoErr, | ||
| 41 | + | "propsset": util.PropertyScalarSet, | |||
| 42 | + | "propsget": util.PropertyScalarGet, | |||
| 43 | + | "propvset": util.PropertyVectorSet, | |||
| 44 | + | "propvget": util.PropertyVectorGet, | |||
| 41 | }).ParseFiles("templates/go") | 45 | }).ParseFiles("templates/go") | ||
| 42 | if err != nil { | 46 | if err != nil { | ||
| 43 | panic(err) | 47 | panic(err) | ||
M internal/gir/util/util.go +66 -0
| @@ -213,3 +213,69 @@ func ConstructorName(name string, outer string) string { | |||
| 213 | 213 | // the default is just a concatenation if the constructor doesn't start with New | |
| 214 | 214 | return outer + cname | |
| 215 | 215 | } | |
| 216 | + | ||
| 217 | + | // PropertyScalarSet returns the code for setting a scalar property value | |
| 218 | + | func PropertyScalarSet(notGObject bool, gvalueType, setMethod string) string { | |
| 219 | + | prefix := "" | |
| 220 | + | if notGObject { | |
| 221 | + | prefix = "gobject." | |
| 222 | + | } | |
| 223 | + | return prefix + gvalueType + ")\n\tv." + setMethod + "(value" | |
| 224 | + | } | |
| 225 | + | ||
| 226 | + | // PropertyScalarGet returns the code for getting a scalar property value | |
| 227 | + | func PropertyScalarGet(getMethod string) string { | |
| 228 | + | return "v." + getMethod + "()" | |
| 229 | + | } | |
| 230 | + | ||
| 231 | + | // PropertyVectorSet returns the code for setting a vector property value | |
| 232 | + | func PropertyVectorSet(notGLib bool) string { | |
| 233 | + | prefix := "" | |
| 234 | + | if notGLib { | |
| 235 | + | prefix = "glib." | |
| 236 | + | } | |
| 237 | + | ||
| 238 | + | return prefix + `StrvGetType()) | |
| 239 | + | ||
| 240 | + | cStrBytes := make([][]byte, len(value)) | |
| 241 | + | cStrings := make([]uintptr, len(value)+1) | |
| 242 | + | for i, s := range value { | |
| 243 | + | cStrBytes[i] = make([]byte, len(s)+1) | |
| 244 | + | copy(cStrBytes[i], s) | |
| 245 | + | cStrBytes[i][len(s)] = 0 | |
| 246 | + | cStrings[i] = uintptr(unsafe.Pointer(&cStrBytes[i][0])) | |
| 247 | + | } | |
| 248 | + | cStrings[len(value)] = 0 | |
| 249 | + | ||
| 250 | + | v.SetBoxed(uintptr(unsafe.Pointer(&cStrings[0])))` | |
| 251 | + | } | |
| 252 | + | ||
| 253 | + | // PropertyVectorGet returns the code for getting a vector property value | |
| 254 | + | func PropertyVectorGet() string { | |
| 255 | + | return `cStrvPtr := v.GetBoxed() | |
| 256 | + | if cStrvPtr == 0 { | |
| 257 | + | return nil | |
| 258 | + | } | |
| 259 | + | ||
| 260 | + | var result []string | |
| 261 | + | ptr := cStrvPtr | |
| 262 | + | for { | |
| 263 | + | strPtr := *(*uintptr)(unsafe.Pointer(ptr)) | |
| 264 | + | if strPtr == 0 { | |
| 265 | + | break | |
| 266 | + | } | |
| 267 | + | ||
| 268 | + | var length int | |
| 269 | + | for i := 0; ; i++ { | |
| 270 | + | if *(*byte)(unsafe.Pointer(strPtr + uintptr(i))) == 0 { | |
| 271 | + | length = i | |
| 272 | + | break | |
| 273 | + | } | |
| 274 | + | } | |
| 275 | + | ||
| 276 | + | bytes := unsafe.Slice((*byte)(unsafe.Pointer(strPtr)), length) | |
| 277 | + | result = append(result, string(bytes)) | |
| 278 | + | ptr += unsafe.Sizeof(uintptr(0)) | |
| 279 | + | } | |
| 280 | + | return result` | |
| 281 | + | } | |
| @@ -213,3 +213,69 @@ func ConstructorName(name string, outer string) string { | |||||
| 213 | // the default is just a concatenation if the constructor doesn't start with New | 213 | // the default is just a concatenation if the constructor doesn't start with New | ||
| 214 | return outer + cname | 214 | return outer + cname | ||
| 215 | } | 215 | } | ||
| 216 | + | ||||
| 217 | + | // PropertyScalarSet returns the code for setting a scalar property value | |||
| 218 | + | func PropertyScalarSet(notGObject bool, gvalueType, setMethod string) string { | |||
| 219 | + | prefix := "" | |||
| 220 | + | if notGObject { | |||
| 221 | + | prefix = "gobject." | |||
| 222 | + | } | |||
| 223 | + | return prefix + gvalueType + ")\n\tv." + setMethod + "(value" | |||
| 224 | + | } | |||
| 225 | + | ||||
| 226 | + | // PropertyScalarGet returns the code for getting a scalar property value | |||
| 227 | + | func PropertyScalarGet(getMethod string) string { | |||
| 228 | + | return "v." + getMethod + "()" | |||
| 229 | + | } | |||
| 230 | + | ||||
| 231 | + | // PropertyVectorSet returns the code for setting a vector property value | |||
| 232 | + | func PropertyVectorSet(notGLib bool) string { | |||
| 233 | + | prefix := "" | |||
| 234 | + | if notGLib { | |||
| 235 | + | prefix = "glib." | |||
| 236 | + | } | |||
| 237 | + | ||||
| 238 | + | return prefix + `StrvGetType()) | |||
| 239 | + | ||||
| 240 | + | cStrBytes := make([][]byte, len(value)) | |||
| 241 | + | cStrings := make([]uintptr, len(value)+1) | |||
| 242 | + | for i, s := range value { | |||
| 243 | + | cStrBytes[i] = make([]byte, len(s)+1) | |||
| 244 | + | copy(cStrBytes[i], s) | |||
| 245 | + | cStrBytes[i][len(s)] = 0 | |||
| 246 | + | cStrings[i] = uintptr(unsafe.Pointer(&cStrBytes[i][0])) | |||
| 247 | + | } | |||
| 248 | + | cStrings[len(value)] = 0 | |||
| 249 | + | ||||
| 250 | + | v.SetBoxed(uintptr(unsafe.Pointer(&cStrings[0])))` | |||
| 251 | + | } | |||
| 252 | + | ||||
| 253 | + | // PropertyVectorGet returns the code for getting a vector property value | |||
| 254 | + | func PropertyVectorGet() string { | |||
| 255 | + | return `cStrvPtr := v.GetBoxed() | |||
| 256 | + | if cStrvPtr == 0 { | |||
| 257 | + | return nil | |||
| 258 | + | } | |||
| 259 | + | ||||
| 260 | + | var result []string | |||
| 261 | + | ptr := cStrvPtr | |||
| 262 | + | for { | |||
| 263 | + | strPtr := *(*uintptr)(unsafe.Pointer(ptr)) | |||
| 264 | + | if strPtr == 0 { | |||
| 265 | + | break | |||
| 266 | + | } | |||
| 267 | + | ||||
| 268 | + | var length int | |||
| 269 | + | for i := 0; ; i++ { | |||
| 270 | + | if *(*byte)(unsafe.Pointer(strPtr + uintptr(i))) == 0 { | |||
| 271 | + | length = i | |||
| 272 | + | break | |||
| 273 | + | } | |||
| 274 | + | } | |||
| 275 | + | ||||
| 276 | + | bytes := unsafe.Slice((*byte)(unsafe.Pointer(strPtr)), length) | |||
| 277 | + | result = append(result, string(bytes)) | |||
| 278 | + | ptr += unsafe.Sizeof(uintptr(0)) | |||
| 279 | + | } | |||
| 280 | + | return result` | |||
| 281 | + | } | |||
M pkg/gir/util/util.go +9 -5
| @@ -3,10 +3,14 @@ package util | |||
| 3 | 3 | import "github.com/jwijenbergh/puregotk/internal/gir/util" | |
| 4 | 4 | ||
| 5 | 5 | var ( | |
| 6 | - | ConvertArgs = util.ConvertArgs | |
| 7 | - | ConvertArgsComma = util.ConvertArgsComma | |
| 8 | - | ConvertCallbackArgs = util.ConvertCallbackArgs | |
| 9 | - | ConvertArgsCommaDeref = util.ConvertArgsCommaDeref | |
| 10 | - | ConvertArgsDeref = util.ConvertArgsDeref | |
| 6 | + | ConvertArgs = util.ConvertArgs | |
| 7 | + | ConvertArgsComma = util.ConvertArgsComma | |
| 8 | + | ConvertCallbackArgs = util.ConvertCallbackArgs | |
| 9 | + | ConvertArgsCommaDeref = util.ConvertArgsCommaDeref | |
| 10 | + | ConvertArgsDeref = util.ConvertArgsDeref | |
| 11 | 11 | ConvertCallbackArgsNoErr = util.ConvertCallbackArgsNoErr | |
| 12 | + | PropertyScalarSet = util.PropertyScalarSet | |
| 13 | + | PropertyScalarGet = util.PropertyScalarGet | |
| 14 | + | PropertyVectorSet = util.PropertyVectorSet | |
| 15 | + | PropertyVectorGet = util.PropertyVectorGet | |
| 12 | 16 | ) | |
| @@ -3,10 +3,14 @@ package util | |||||
| 3 | import "github.com/jwijenbergh/puregotk/internal/gir/util" | 3 | import "github.com/jwijenbergh/puregotk/internal/gir/util" | ||
| 4 | 4 | ||||
| 5 | var ( | 5 | var ( | ||
| 6 | - | ConvertArgs = util.ConvertArgs | 6 | + | ConvertArgs = util.ConvertArgs |
| 7 | - | ConvertArgsComma = util.ConvertArgsComma | 7 | + | ConvertArgsComma = util.ConvertArgsComma |
| 8 | - | ConvertCallbackArgs = util.ConvertCallbackArgs | 8 | + | ConvertCallbackArgs = util.ConvertCallbackArgs |
| 9 | - | ConvertArgsCommaDeref = util.ConvertArgsCommaDeref | 9 | + | ConvertArgsCommaDeref = util.ConvertArgsCommaDeref |
| 10 | - | ConvertArgsDeref = util.ConvertArgsDeref | 10 | + | ConvertArgsDeref = util.ConvertArgsDeref |
| 11 | ConvertCallbackArgsNoErr = util.ConvertCallbackArgsNoErr | 11 | ConvertCallbackArgsNoErr = util.ConvertCallbackArgsNoErr | ||
| 12 | + | PropertyScalarSet = util.PropertyScalarSet | |||
| 13 | + | PropertyScalarGet = util.PropertyScalarGet | |||
| 14 | + | PropertyVectorSet = util.PropertyVectorSet | |||
| 15 | + | PropertyVectorGet = util.PropertyVectorGet | |||
| 12 | ) | 16 | ) | ||
M templates/go +4 -80
| @@ -172,20 +172,7 @@ func (x *{{$outer.Name}}Base) {{.Name}}({{conv .Args.API.Full}}) {{.Ret.Return}} | |||
| 172 | 172 | obj := {{if $NotGObject}}gobject.{{end}}Object{} | |
| 173 | 173 | obj.Ptr = x.GoPointer() | |
| 174 | 174 | var v {{if $NotGObject}}gobject.{{end}}Value | |
| 175 | - | {{if eq .GValueType "BoxedStrv"}}v.Init({{if $NotGLib}}glib.{{end}}StrvGetType()) | |
| 176 | - | ||
| 177 | - | cStrBytes := make([][]byte, len(value)) | |
| 178 | - | cStrings := make([]uintptr, len(value)+1) | |
| 179 | - | for i, s := range value { | |
| 180 | - | cStrBytes[i] = make([]byte, len(s)+1) | |
| 181 | - | copy(cStrBytes[i], s) | |
| 182 | - | cStrBytes[i][len(s)] = 0 | |
| 183 | - | cStrings[i] = uintptr(unsafe.Pointer(&cStrBytes[i][0])) | |
| 184 | - | } | |
| 185 | - | cStrings[len(value)] = 0 | |
| 186 | - | ||
| 187 | - | v.SetBoxed(uintptr(unsafe.Pointer(&cStrings[0]))){{else}}v.Init({{if $NotGObject}}gobject.{{end}}{{.GValueType}}) | |
| 188 | - | v.{{.SetMethod}}(value){{end}} | |
| 175 | + | {{if eq .GValueType "BoxedStrv"}}v.Init({{propvset $NotGLib}}{{else}}v.Init({{propsset $NotGObject .GValueType .SetMethod}}){{end}} | |
| 189 | 176 | obj.SetProperty("{{.CName}}", &v) | |
| 190 | 177 | } | |
| 191 | 178 | {{end}} | |
| @@ -198,32 +185,7 @@ func (x *{{$outer.Name}}Base) {{.Name}}({{conv .Args.API.Full}}) {{.Ret.Return}} | |||
| 198 | 185 | obj.Ptr = x.GoPointer() | |
| 199 | 186 | var v {{if $NotGObject}}gobject.{{end}}Value | |
| 200 | 187 | obj.GetProperty("{{.CName}}", &v) | |
| 201 | - | {{if eq .GValueType "BoxedStrv"}}cStrvPtr := v.GetBoxed() | |
| 202 | - | if cStrvPtr == 0 { | |
| 203 | - | return nil | |
| 204 | - | } | |
| 205 | - | ||
| 206 | - | var result []string | |
| 207 | - | ptr := cStrvPtr | |
| 208 | - | for { | |
| 209 | - | strPtr := *(*uintptr)(unsafe.Pointer(ptr)) | |
| 210 | - | if strPtr == 0 { | |
| 211 | - | break | |
| 212 | - | } | |
| 213 | - | ||
| 214 | - | var length int | |
| 215 | - | for i := 0; ; i++ { | |
| 216 | - | if *(*byte)(unsafe.Pointer(strPtr + uintptr(i))) == 0 { | |
| 217 | - | length = i | |
| 218 | - | break | |
| 219 | - | } | |
| 220 | - | } | |
| 221 | - | ||
| 222 | - | bytes := unsafe.Slice((*byte)(unsafe.Pointer(strPtr)), length) | |
| 223 | - | result = append(result, string(bytes)) | |
| 224 | - | ptr += unsafe.Sizeof(uintptr(0)) | |
| 225 | - | } | |
| 226 | - | return result{{else}}return v.{{.GetMethod}}(){{end}} | |
| 188 | + | {{if eq .GValueType "BoxedStrv"}}{{propvget}}{{else}}return {{propsget .GetMethod}}{{end}} | |
| 227 | 189 | } | |
| 228 | 190 | {{end}} | |
| 229 | 191 | {{end}} | |
| @@ -346,20 +308,7 @@ func (c *{{.Name}}) SetGoPointer(ptr uintptr) { | |||
| 346 | 308 | {{if .Doc}}{{.Doc}} | |
| 347 | 309 | {{end}}func (x *{{$outer.Name}}) SetProperty{{.Name}}(value {{.GoType}}) { | |
| 348 | 310 | var v {{if $NotGObject}}gobject.{{end}}Value | |
| 349 | - | {{if eq .GValueType "BoxedStrv"}}v.Init({{if $NotGLib}}glib.{{end}}StrvGetType()) | |
| 350 | - | ||
| 351 | - | cStrBytes := make([][]byte, len(value)) | |
| 352 | - | cStrings := make([]uintptr, len(value)+1) | |
| 353 | - | for i, s := range value { | |
| 354 | - | cStrBytes[i] = make([]byte, len(s)+1) | |
| 355 | - | copy(cStrBytes[i], s) | |
| 356 | - | cStrBytes[i][len(s)] = 0 | |
| 357 | - | cStrings[i] = uintptr(unsafe.Pointer(&cStrBytes[i][0])) | |
| 358 | - | } | |
| 359 | - | cStrings[len(value)] = 0 | |
| 360 | - | ||
| 361 | - | v.SetBoxed(uintptr(unsafe.Pointer(&cStrings[0]))){{else}}v.Init({{if $NotGObject}}gobject.{{end}}{{.GValueType}}) | |
| 362 | - | v.{{.SetMethod}}(value){{end}} | |
| 311 | + | {{if eq .GValueType "BoxedStrv"}}v.Init({{propvset $NotGLib}}{{else}}v.Init({{propsset $NotGObject .GValueType .SetMethod}}){{end}} | |
| 363 | 312 | x.SetProperty("{{.CName}}", &v) | |
| 364 | 313 | } | |
| 365 | 314 | {{end}} | |
| @@ -370,32 +319,7 @@ func (c *{{.Name}}) SetGoPointer(ptr uintptr) { | |||
| 370 | 319 | {{end}}func (x *{{$outer.Name}}) GetProperty{{.Name}}() {{.GoType}} { | |
| 371 | 320 | var v {{if $NotGObject}}gobject.{{end}}Value | |
| 372 | 321 | x.GetProperty("{{.CName}}", &v) | |
| 373 | - | {{if eq .GValueType "BoxedStrv"}}cStrvPtr := v.GetBoxed() | |
| 374 | - | if cStrvPtr == 0 { | |
| 375 | - | return nil | |
| 376 | - | } | |
| 377 | - | ||
| 378 | - | var result []string | |
| 379 | - | ptr := cStrvPtr | |
| 380 | - | for { | |
| 381 | - | strPtr := *(*uintptr)(unsafe.Pointer(ptr)) | |
| 382 | - | if strPtr == 0 { | |
| 383 | - | break | |
| 384 | - | } | |
| 385 | - | ||
| 386 | - | var length int | |
| 387 | - | for i := 0; ; i++ { | |
| 388 | - | if *(*byte)(unsafe.Pointer(strPtr + uintptr(i))) == 0 { | |
| 389 | - | length = i | |
| 390 | - | break | |
| 391 | - | } | |
| 392 | - | } | |
| 393 | - | ||
| 394 | - | bytes := unsafe.Slice((*byte)(unsafe.Pointer(strPtr)), length) | |
| 395 | - | result = append(result, string(bytes)) | |
| 396 | - | ptr += unsafe.Sizeof(uintptr(0)) | |
| 397 | - | } | |
| 398 | - | return result{{else}}return v.{{.GetMethod}}(){{end}} | |
| 322 | + | {{if eq .GValueType "BoxedStrv"}}{{propvget}}{{else}}return {{propsget .GetMethod}}{{end}} | |
| 399 | 323 | } | |
| 400 | 324 | {{end}} | |
| 401 | 325 | {{end}} | |
| @@ -172,20 +172,7 @@ func (x *{{$outer.Name}}Base) {{.Name}}({{conv .Args.API.Full}}) {{.Ret.Return}} | |||||
| 172 | obj := {{if $NotGObject}}gobject.{{end}}Object{} | 172 | obj := {{if $NotGObject}}gobject.{{end}}Object{} | ||
| 173 | obj.Ptr = x.GoPointer() | 173 | obj.Ptr = x.GoPointer() | ||
| 174 | var v {{if $NotGObject}}gobject.{{end}}Value | 174 | var v {{if $NotGObject}}gobject.{{end}}Value | ||
| 175 | - | {{if eq .GValueType "BoxedStrv"}}v.Init({{if $NotGLib}}glib.{{end}}StrvGetType()) | 175 | + | {{if eq .GValueType "BoxedStrv"}}v.Init({{propvset $NotGLib}}{{else}}v.Init({{propsset $NotGObject .GValueType .SetMethod}}){{end}} |
| 176 | - | ||||
| 177 | - | cStrBytes := make([][]byte, len(value)) | |||
| 178 | - | cStrings := make([]uintptr, len(value)+1) | |||
| 179 | - | for i, s := range value { | |||
| 180 | - | cStrBytes[i] = make([]byte, len(s)+1) | |||
| 181 | - | copy(cStrBytes[i], s) | |||
| 182 | - | cStrBytes[i][len(s)] = 0 | |||
| 183 | - | cStrings[i] = uintptr(unsafe.Pointer(&cStrBytes[i][0])) | |||
| 184 | - | } | |||
| 185 | - | cStrings[len(value)] = 0 | |||
| 186 | - | ||||
| 187 | - | v.SetBoxed(uintptr(unsafe.Pointer(&cStrings[0]))){{else}}v.Init({{if $NotGObject}}gobject.{{end}}{{.GValueType}}) | |||
| 188 | - | v.{{.SetMethod}}(value){{end}} | |||
| 189 | obj.SetProperty("{{.CName}}", &v) | 176 | obj.SetProperty("{{.CName}}", &v) | ||
| 190 | } | 177 | } | ||
| 191 | {{end}} | 178 | {{end}} | ||
| @@ -198,32 +185,7 @@ func (x *{{$outer.Name}}Base) {{.Name}}({{conv .Args.API.Full}}) {{.Ret.Return}} | |||||
| 198 | obj.Ptr = x.GoPointer() | 185 | obj.Ptr = x.GoPointer() | ||
| 199 | var v {{if $NotGObject}}gobject.{{end}}Value | 186 | var v {{if $NotGObject}}gobject.{{end}}Value | ||
| 200 | obj.GetProperty("{{.CName}}", &v) | 187 | obj.GetProperty("{{.CName}}", &v) | ||
| 201 | - | {{if eq .GValueType "BoxedStrv"}}cStrvPtr := v.GetBoxed() | 188 | + | {{if eq .GValueType "BoxedStrv"}}{{propvget}}{{else}}return {{propsget .GetMethod}}{{end}} |
| 202 | - | if cStrvPtr == 0 { | |||
| 203 | - | return nil | |||
| 204 | - | } | |||
| 205 | - | ||||
| 206 | - | var result []string | |||
| 207 | - | ptr := cStrvPtr | |||
| 208 | - | for { | |||
| 209 | - | strPtr := *(*uintptr)(unsafe.Pointer(ptr)) | |||
| 210 | - | if strPtr == 0 { | |||
| 211 | - | break | |||
| 212 | - | } | |||
| 213 | - | ||||
| 214 | - | var length int | |||
| 215 | - | for i := 0; ; i++ { | |||
| 216 | - | if *(*byte)(unsafe.Pointer(strPtr + uintptr(i))) == 0 { | |||
| 217 | - | length = i | |||
| 218 | - | break | |||
| 219 | - | } | |||
| 220 | - | } | |||
| 221 | - | ||||
| 222 | - | bytes := unsafe.Slice((*byte)(unsafe.Pointer(strPtr)), length) | |||
| 223 | - | result = append(result, string(bytes)) | |||
| 224 | - | ptr += unsafe.Sizeof(uintptr(0)) | |||
| 225 | - | } | |||
| 226 | - | return result{{else}}return v.{{.GetMethod}}(){{end}} | |||
| 227 | } | 189 | } | ||
| 228 | {{end}} | 190 | {{end}} | ||
| 229 | {{end}} | 191 | {{end}} | ||
| @@ -346,20 +308,7 @@ func (c *{{.Name}}) SetGoPointer(ptr uintptr) { | |||||
| 346 | {{if .Doc}}{{.Doc}} | 308 | {{if .Doc}}{{.Doc}} | ||
| 347 | {{end}}func (x *{{$outer.Name}}) SetProperty{{.Name}}(value {{.GoType}}) { | 309 | {{end}}func (x *{{$outer.Name}}) SetProperty{{.Name}}(value {{.GoType}}) { | ||
| 348 | var v {{if $NotGObject}}gobject.{{end}}Value | 310 | var v {{if $NotGObject}}gobject.{{end}}Value | ||
| 349 | - | {{if eq .GValueType "BoxedStrv"}}v.Init({{if $NotGLib}}glib.{{end}}StrvGetType()) | 311 | + | {{if eq .GValueType "BoxedStrv"}}v.Init({{propvset $NotGLib}}{{else}}v.Init({{propsset $NotGObject .GValueType .SetMethod}}){{end}} |
| 350 | - | ||||
| 351 | - | cStrBytes := make([][]byte, len(value)) | |||
| 352 | - | cStrings := make([]uintptr, len(value)+1) | |||
| 353 | - | for i, s := range value { | |||
| 354 | - | cStrBytes[i] = make([]byte, len(s)+1) | |||
| 355 | - | copy(cStrBytes[i], s) | |||
| 356 | - | cStrBytes[i][len(s)] = 0 | |||
| 357 | - | cStrings[i] = uintptr(unsafe.Pointer(&cStrBytes[i][0])) | |||
| 358 | - | } | |||
| 359 | - | cStrings[len(value)] = 0 | |||
| 360 | - | ||||
| 361 | - | v.SetBoxed(uintptr(unsafe.Pointer(&cStrings[0]))){{else}}v.Init({{if $NotGObject}}gobject.{{end}}{{.GValueType}}) | |||
| 362 | - | v.{{.SetMethod}}(value){{end}} | |||
| 363 | x.SetProperty("{{.CName}}", &v) | 312 | x.SetProperty("{{.CName}}", &v) | ||
| 364 | } | 313 | } | ||
| 365 | {{end}} | 314 | {{end}} | ||
| @@ -370,32 +319,7 @@ func (c *{{.Name}}) SetGoPointer(ptr uintptr) { | |||||
| 370 | {{end}}func (x *{{$outer.Name}}) GetProperty{{.Name}}() {{.GoType}} { | 319 | {{end}}func (x *{{$outer.Name}}) GetProperty{{.Name}}() {{.GoType}} { | ||
| 371 | var v {{if $NotGObject}}gobject.{{end}}Value | 320 | var v {{if $NotGObject}}gobject.{{end}}Value | ||
| 372 | x.GetProperty("{{.CName}}", &v) | 321 | x.GetProperty("{{.CName}}", &v) | ||
| 373 | - | {{if eq .GValueType "BoxedStrv"}}cStrvPtr := v.GetBoxed() | 322 | + | {{if eq .GValueType "BoxedStrv"}}{{propvget}}{{else}}return {{propsget .GetMethod}}{{end}} |
| 374 | - | if cStrvPtr == 0 { | |||
| 375 | - | return nil | |||
| 376 | - | } | |||
| 377 | - | ||||
| 378 | - | var result []string | |||
| 379 | - | ptr := cStrvPtr | |||
| 380 | - | for { | |||
| 381 | - | strPtr := *(*uintptr)(unsafe.Pointer(ptr)) | |||
| 382 | - | if strPtr == 0 { | |||
| 383 | - | break | |||
| 384 | - | } | |||
| 385 | - | ||||
| 386 | - | var length int | |||
| 387 | - | for i := 0; ; i++ { | |||
| 388 | - | if *(*byte)(unsafe.Pointer(strPtr + uintptr(i))) == 0 { | |||
| 389 | - | length = i | |||
| 390 | - | break | |||
| 391 | - | } | |||
| 392 | - | } | |||
| 393 | - | ||||
| 394 | - | bytes := unsafe.Slice((*byte)(unsafe.Pointer(strPtr)), length) | |||
| 395 | - | result = append(result, string(bytes)) | |||
| 396 | - | ptr += unsafe.Sizeof(uintptr(0)) | |||
| 397 | - | } | |||
| 398 | - | return result{{else}}return v.{{.GetMethod}}(){{end}} | |||
| 399 | } | 323 | } | ||
| 400 | {{end}} | 324 | {{end}} | ||
| 401 | {{end}} | 325 | {{end}} | ||