diff --git a/gintro/gimplgobj.nim b/gintro/gimplgobj.nim index 44b6a1c..9f92e18 100644 --- a/gintro/gimplgobj.nim +++ b/gintro/gimplgobj.nim @@ -201,13 +201,17 @@ proc $1$2 {.cdecl.} = if types[i] == "": resu.add(", " & names[i]) else: - resu.add(", " & names[i] & "1") - r1s.add(" var " & names[i] & "1 {.global.}: " & types[i] & "\n") - r1s.add(" if " & names[i] & "1" & ".isNil:\n") - r1s.add(" new " & names[i] & "1" & "\n") - r1s.add(" GC_ref(" & names[i] & "1)" & "\n") # never call destroy/finalizer on this global variable - r1s.add(" " & names[i] & "1.ignoreFinalizer = true" & "\n") - r1s.add(" " & names[i] & "1.impl = " & names[i] & "\n") + var namesi = names[i] + if namesi[0] == '`': + assert(namesi[^1] == '`') + namesi = namesi[1 .. ^2] + resu.add(", " & namesi & "1") + r1s.add(" var " & namesi & "1 {.global.}: " & types[i] & "\n") + r1s.add(" if " & namesi & "1" & ".isNil:\n") + r1s.add(" new " & namesi & "1" & "\n") + r1s.add(" GC_ref(" & namesi & "1)" & "\n") # never call destroy/finalizer on this global variable + r1s.add(" " & namesi & "1.ignoreFinalizer = true" & "\n") + r1s.add(" " & namesi & "1.impl = " & names[i] & "\n") if not ignoreArg.boolVal: if getTypeInst(arg).typeKind == ntyRef: resu.add(", cast[$5](user_data)") diff --git a/tests/gen.nim b/tests/gen.nim index 5f70010..0a3baf4 100644 --- a/tests/gen.nim +++ b/tests/gen.nim @@ -1,8 +1,10 @@ # High level gobject-introspection based GTK4/GTK3 bindings for the Nim programming language # nimpretty --maxLineLen:130 gen.nim -# v 0.9.9 2022-OCT-10 +# v 0.9.9 2022-OCT-20 # (c) S. Salewski 2018, 2019, 2020, 2021, 2022, 2023 +# https://gnome.pages.gitlab.gnome.org/gobject-introspection/girepository/ + # usefull for finding death code: # https://forum.nim-lang.org/t/5898 @@ -373,6 +375,7 @@ defaultParameters["pango_layout_set_text"] = "length int -1" for i in keywords: mangledNames[i] = '`' & i & '`' +mangledNames["object"] = "obj" mangledNames["CSET_A_2_Z"] = "CSET_A_2_Z_U" mangledNames["CSET_a_2_z"] = "CSET_a_2_z_L" mangledNames["2big"] = "tooBig" @@ -2908,7 +2911,8 @@ proc writeEnum(info: GIEnumInfo) = var s: seq[T] var alias: HashSet[string] # double entry in gstvideo, see https://discourse.gnome.org/t/gstvideo-1-0-gir-double-entries/5442 var flags = ($gBaseInfoGetName(info)).endsWith("Flags") - var flagDefault: string + var flagDefault: string + var lags: string output.writeLine("type") let n = info.gEnumInfoGetNValues() for j in 0.cint ..< n: @@ -2922,15 +2926,26 @@ proc writeEnum(info: GIEnumInfo) = result = cmp(x.v, y.v) if result == 0: result = cmp(x.n, y.n) + + if not flags and s[^1].v > 2: + flags = true + for j in 0 .. s.high: # v0.9.9, pull in some more flags? + if bitops.popCount(s[j].v) > 1: + flags = false + break + for j in 0 .. s.high: if s[j].v < 0: flags = false - if j == 0 and s[j].v == 0: + # if j == 0 and s[j].v == 0: # wrong for GApplicationFlags for glib >= 2.74 + if s[j].v == 0: continue if bitops.popCount(s[j].v) != 1: flags = false if s.len <= 1: flags = false var tname = mangleName(gBaseInfoGetName(info)) - if flags: tname = tname[0 .. ^6] + if flags and tname.endsWith("Flags"): + tname = tname[0 .. ^6] + lags = "Flags" if flags: output.writeLine(" ", tname & "Flag" & EM, " {.size: sizeof(cint), pure.} = enum") if s[0].v != 0 and s[0].v != 1: # flags may start with none = 0 or with flag1 = 1 @@ -2943,14 +2958,21 @@ proc writeEnum(info: GIEnumInfo) = var val = i.v if flags and j == 0 and val == 0: # proc c(t: typedesc[B]): B ={} - flagDefault = (" " & tname & "Flags" & i.n.capitalizeAscii & EM & " = " & tname & "Flags" & "({})") - flagDefault.add("\nproc " & i.n & "*(t: typedesc[" & tname & "Flags]): " & tname & "Flags = " & tname & "Flags" & "({})") + flagDefault = (" " & tname & lags & i.n.capitalizeAscii & EM & " = " & tname & lags & "({})") + flagDefault.add("\nproc " & i.n & "*(t: typedesc[" & tname & lags & "]): " & tname & lags & " = " & tname & lags & "({})") #echo flagDefault + k = i continue if j > 0 and i.v == k.v: if i.n != k.n: let h = if flags: "Flag" else: "" - alias.incl(" " & tname & i.n.capitalizeAscii & EM & " = " & tname & h & '.' & k.n) + var vv: string + if flags and k.v == 0: + vv = tname & lags & "({})" + else: + vv = tname & h & '.' & k.n + + alias.incl(" " & tname & i.n.capitalizeAscii & EM & " = " & vv) continue if flags: val = countTrailingZeroBits(val) # firstSetBit(val) @@ -2958,7 +2980,7 @@ proc writeEnum(info: GIEnumInfo) = k = i if flags: - output.writeLine("\n ", tname & "Flags" & EM, " {.size: sizeof(cint).} = set[$1Flag]" % [tname]) + output.writeLine("\n ", tname & lags & EM, " {.size: sizeof(cint).} = set[$1Flag]" % [tname]) if alias.len > 0 or flagDefault.len > 0: output.writeLine("\nconst") @@ -4588,7 +4610,7 @@ launch() # if not xcallerAlloc.contains(el): # echo el -# 4591 lines +# 4613 lines # gtk_icon_view_get_tooltip_context bug Candidate ignoreFinalizer # gtk_tree_view_get_cursor bug getBox genRec gisup4 #