more fixes for Nim 0.19

This commit is contained in:
Stefan Salewski 2018-08-20 08:09:56 +02:00
commit 32b3018a7b
4 changed files with 20 additions and 16 deletions

View file

@ -1,6 +1,6 @@
# Package # Package
version = "0.4.4" version = "0.4.5"
author = "Stefan Salewski" author = "Stefan Salewski"
description = "High level GObject-Introspection based GTK3 bindings" description = "High level GObject-Introspection based GTK3 bindings"
license = "MIT" license = "MIT"

View file

@ -732,7 +732,7 @@ proc copyClipRectangleList*(cr: Context): seq[Rectangle] =
var h: Rectangle var h: Rectangle
var r = cairo_copy_clip_rectangle_list(cr.impl) var r = cairo_copy_clip_rectangle_list(cr.impl)
defer: cairo_rectangle_list_destroy(r) defer: cairo_rectangle_list_destroy(r)
if r.status != Status.success or r.numRectangles == 0: return nil if r.status != Status.success or r.numRectangles == 0: return @[]
result = newSeq[Rectangle]() result = newSeq[Rectangle]()
for i in 0 ..< r.numRectangles: for i in 0 ..< r.numRectangles:
let k = cast[ptr array[99, Rectangle00]](r.rectangles)[i] let k = cast[ptr array[99, Rectangle00]](r.rectangles)[i]

View file

@ -51,7 +51,7 @@ macro mconnect(widget: gobject.Object; signal: string; p: typed; arg: typed; ign
var # position and actual type of interface provider, if any var # position and actual type of interface provider, if any
ipos = -1 ipos = -1
ipro: string = nil ipro: string #= nil
inc(ProcID) inc(ProcID)
let wt = getType(widget) let wt = getType(widget)
@ -112,7 +112,7 @@ proc $1$2 {.cdecl.} =
(names[i], types[i]) = largs[i].split(": ptr ") (names[i], types[i]) = largs[i].split(": ptr ")
types[i].setLen(types[i].len - 2) types[i].setLen(types[i].len - 2)
else: else:
types[i] = nil # plain arg, no object types[i] = ""#nil # plain arg, no object
var a1, a2: string var a1, a2: string
(a1, a2) = largs[i].split(": ") (a1, a2) = largs[i].split(": ")
let h = ct5nt(a2) let h = ct5nt(a2)
@ -124,7 +124,7 @@ proc $1$2 {.cdecl.} =
types[ipos - 1] = ipro types[ipos - 1] = ipro
for i in 0 .. largs.high: for i in 0 .. largs.high:
if types[i] == nil: if types[i] == "":
resu.add(", " & names[i]) resu.add(", " & names[i])
else: else:
resu.add(", " & names[i] & "1") resu.add(", " & names[i] & "1")

View file

@ -1,5 +1,5 @@
# High level gobject-introspection based GTK3 bindings for the Nim programming language # High level gobject-introspection based GTK3 bindings for the Nim programming language
# v 0.4.4 2018-AUG-02 # v 0.4.5 2018-AUG-20
# (c) S. Salewski 2018 # (c) S. Salewski 2018
# https://wiki.gnome.org/Projects/GObjectIntrospection # https://wiki.gnome.org/Projects/GObjectIntrospection
@ -433,8 +433,8 @@ proc genP(info: GICallableInfo; genProxy = false; binfo: GIBaseInfo = nil): (str
let kk = if name[0] == '`': name[1 .. ^2] else: name let kk = if name[0] == '`': name[1 .. ^2] else: name
arglist.add(kk & "_00") arglist.add(kk & "_00")
elif ct2nt.contains(str): elif ct2nt.contains(str):
if str == "cstring": if str == "cstring" and mayBeNil:
arglist.add("safeStringToCString" & '(' & name & ')') arglist.add("safeStringToCString" & '(' & name & ')')################################################
else: else:
arglist.add(str & '(' & name & ')') arglist.add(str & '(' & name & ')')
else: else:
@ -453,7 +453,8 @@ proc genP(info: GICallableInfo; genProxy = false; binfo: GIBaseInfo = nil): (str
if name == h1 and str == h2: if name == h1 and str == h2:
str.add(" = " & h3) str.add(" = " & h3)
if genProxy and str == "string" and mayBeNil: if genProxy and str == "string" and mayBeNil:
str.add(" = nil") #str.add(" = nil")
str.add(" = \"\"")
if genProxy and isProxyCandidate(t) and mayBeNil: if genProxy and isProxyCandidate(t) and mayBeNil:
#if not str.contains("|") and (gArgInfoGetDirection(arg) == GIDirection.OUT or gArgInfoGetDirection(arg) == GIDirection.INOUT): #if not str.contains("|") and (gArgInfoGetDirection(arg) == GIDirection.OUT or gArgInfoGetDirection(arg) == GIDirection.INOUT):
# str.add(" = cast[" & str & "](nil)") # str.add(" = cast[" & str & "](nil)")
@ -462,6 +463,7 @@ proc genP(info: GICallableInfo; genProxy = false; binfo: GIBaseInfo = nil): (str
# discard # discard
#else: #else:
str.add(" = nil") str.add(" = nil")
#str.add(" = \"\"")
if (genProxy or sym == "pango_extents_to_pixels") and isFunctionInfo(info) and (gFunctionInfoGetFlags(info).int and GIFunctionInfoFlags.WRAPS_VFUNC.ord) == 0: if (genProxy or sym == "pango_extents_to_pixels") and isFunctionInfo(info) and (gFunctionInfoGetFlags(info).int and GIFunctionInfoFlags.WRAPS_VFUNC.ord) == 0:
if userAlloc and mayBeNil: if userAlloc and mayBeNil:
var h = str var h = str
@ -690,7 +692,7 @@ proc writeMethod(info: GIBaseInfo; minfo: GIFunctionInfo; genProxy = false) =
freeMeName = $gBaseInfoGetName(freeMe) freeMeName = $gBaseInfoGetName(freeMe)
if sym == "g_closure_new_simple" or sym == "g_closure_new_object": freeMeName = "unref" # TODO GI bug? if sym == "g_closure_new_simple" or sym == "g_closure_new_object": freeMeName = "unref" # TODO GI bug?
assert(gCallableInfoGetCallerOwns(minfo) in {GITransfer.EVERYTHING, GITransfer.NOTHING}) assert(gCallableInfoGetCallerOwns(minfo) in {GITransfer.EVERYTHING, GITransfer.NOTHING})
if freeMeName.isNil: if freeMeName == "":
methodBuffer.writeLine(" new(result)") methodBuffer.writeLine(" new(result)")
else: else:
methodBuffer.writeLine(" new(result, $1)" % freeMeName) methodBuffer.writeLine(" new(result, $1)" % freeMeName)
@ -760,7 +762,7 @@ proc writeMethod(info: GIBaseInfo; minfo: GIFunctionInfo; genProxy = false) =
elif h.endsWith("unref"): elif h.endsWith("unref"):
freeMeName = "unref" freeMeName = "unref"
break break
if freeMeName.isNil: if freeMeName == "":
# assert false # TODO we have to fix this case manually # assert false # TODO we have to fix this case manually
echo "Caution: No free/unref found for ", ' ', gBaseInfoGetName(iface), " (", sym, ')' echo "Caution: No free/unref found for ", ' ', gBaseInfoGetName(iface), " (", sym, ')'
methodBuffer.writeLine(" new(result)") methodBuffer.writeLine(" new(result)")
@ -781,7 +783,7 @@ proc writeMethod(info: GIBaseInfo; minfo: GIFunctionInfo; genProxy = false) =
methodBuffer.writeLine("\nproc " & asym & EM & plist & " =") methodBuffer.writeLine("\nproc " & asym & EM & plist & " =")
var freeMeName: string var freeMeName: string
for j in 0.cint ..< gCallableInfoGetNArgs(minfo): for j in 0.cint ..< gCallableInfoGetNArgs(minfo):
freeMeName = nil freeMeName = ""
let arg = gCallableInfoGetArg(minfo, j) let arg = gCallableInfoGetArg(minfo, j)
let t = gArgInfoGetType(arg) let t = gArgInfoGetType(arg)
if gArgInfoGetDirection(arg) == GIDirection.OUT and isProxyCandidate(t) and not callerAlloc.contains(genRec(t, true, true)) and not gArgInfoIsCallerAllocates(arg): if gArgInfoGetDirection(arg) == GIDirection.OUT and isProxyCandidate(t) and not callerAlloc.contains(genRec(t, true, true)) and not gArgInfoIsCallerAllocates(arg):
@ -815,7 +817,7 @@ proc writeMethod(info: GIBaseInfo; minfo: GIFunctionInfo; genProxy = false) =
else: else:
freeMeName = $gBaseInfoGetName(freeMe) freeMeName = $gBaseInfoGetName(freeMe)
let h2 = mangleName(gBaseInfoGetName(arg)) let h2 = mangleName(gBaseInfoGetName(arg))
if freeMeName.isNil: if freeMeName == "":
methodBuffer.writeLine(" new(" & h2 & ")") methodBuffer.writeLine(" new(" & h2 & ")")
else: else:
methodBuffer.writeLine(" new(" & h2 & ", " & freeMeName & ")") methodBuffer.writeLine(" new(" & h2 & ", " & freeMeName & ")")
@ -976,6 +978,7 @@ proc writeInterface(info: GIInterfaceInfo) =
(plist, arglist, replist) = genP(signalInfo, false, info) (plist, arglist, replist) = genP(signalInfo, false, info)
memo.add(plist) memo.add(plist)
memo = memo.replace("\n ", "") memo = memo.replace("\n ", "")
memo = memo.replace("\"", "\\\"")
supmod.writeLine(" \"" & ($gBaseInfoGetName(signalInfo)).replace("-", "_") & RecSep & $gBaseInfoGetName(info) & RecSep & memo & "\",") supmod.writeLine(" \"" & ($gBaseInfoGetName(signalInfo)).replace("-", "_") & RecSep & $gBaseInfoGetName(info) & RecSep & memo & "\",")
if gCallableInfoGetNArgs(signalInfo) > 0: if gCallableInfoGetNArgs(signalInfo) > 0:
var plist, arglist: string var plist, arglist: string
@ -1248,6 +1251,7 @@ proc writeObj(info: GIObjectInfo) =
(plist, arglist, replist) = genP(signalInfo, false, info) (plist, arglist, replist) = genP(signalInfo, false, info)
memo.add(plist) memo.add(plist)
memo = memo.replace("\n ", "") memo = memo.replace("\n ", "")
memo = memo.replace("\"", "\\\"")
supmod.writeLine(" \"" & ($gBaseInfoGetName(signalInfo)).replace("-", "_") & RecSep & $gBaseInfoGetName(info) & RecSep & memo & "\",") supmod.writeLine(" \"" & ($gBaseInfoGetName(signalInfo)).replace("-", "_") & RecSep & $gBaseInfoGetName(info) & RecSep & memo & "\",")
if gCallableInfoGetNArgs(signalInfo) > 0: if gCallableInfoGetNArgs(signalInfo) > 0:
var plist, arglist: string var plist, arglist: string
@ -1424,7 +1428,7 @@ proc gtk_file_chooser_dialog_new*(title: cstring; parent: ptr Window00; action:
firstButtonText: cstring = nil): ptr FileChooserDialog00 {.varargs, firstButtonText: cstring = nil): ptr FileChooserDialog00 {.varargs,
importc: "gtk_file_chooser_dialog_new", libprag.} importc: "gtk_file_chooser_dialog_new", libprag.}
proc newFileChooserDialog*(title: string = nil; parent: Window = nil; action: FileChooserAction): FileChooserDialog = proc newFileChooserDialog*(title: string = ""; parent: Window = nil; action: FileChooserAction): FileChooserDialog =
let gobj = gtk_file_chooser_dialog_new(safeStringToCString(title), if parent.isNil: nil else: cast[ptr Window00](parent.impl), action) let gobj = gtk_file_chooser_dialog_new(safeStringToCString(title), if parent.isNil: nil else: cast[ptr Window00](parent.impl), action)
if g_object_get_qdata(gobj, Quark) != nil: if g_object_get_qdata(gobj, Quark) != nil:
result = cast[type(result)](g_object_get_qdata(gobj, Quark)) result = cast[type(result)](g_object_get_qdata(gobj, Quark))
@ -1439,7 +1443,7 @@ proc newFileChooserDialog*(title: string = nil; parent: Window = nil; action: Fi
assert(g_object_get_qdata(result.impl, Quark) == nil) assert(g_object_get_qdata(result.impl, Quark) == nil)
g_object_set_qdata(result.impl, Quark, addr(result[])) g_object_set_qdata(result.impl, Quark, addr(result[]))
proc initFileChooserDialog*[T](result: var T; title: string = nil; parent: Window = nil; action: FileChooserAction) = proc initFileChooserDialog*[T](result: var T; title: string = ""; parent: Window = nil; action: FileChooserAction) =
assert(result is FileChooserDialog) assert(result is FileChooserDialog)
let gobj = gtk_file_chooser_dialog_new(safeStringToCString(title), if parent.isNil: nil else: cast[ptr Window00](parent.impl), action) let gobj = gtk_file_chooser_dialog_new(safeStringToCString(title), if parent.isNil: nil else: cast[ptr Window00](parent.impl), action)
if g_object_get_qdata(gobj, Quark) != nil: if g_object_get_qdata(gobj, Quark) != nil:
@ -1569,7 +1573,7 @@ proc main(namespace: string) =
output.writeLine("const GTrue = gboolean(1)") output.writeLine("const GTrue = gboolean(1)")
output.writeLine("proc cogfree*(mem: pointer) {.importc: \"g_free\", libprag.}") output.writeLine("proc cogfree*(mem: pointer) {.importc: \"g_free\", libprag.}")
output.writeLine("proc toBool*(g: gboolean): bool = g.int != 0") output.writeLine("proc toBool*(g: gboolean): bool = g.int != 0")
output.writeLine("proc safeStringToCString*(s: string): cstring = (if s.isNil: nil else: cstring(s))") output.writeLine("proc safeStringToCString*(s: string): cstring = (if s.len == 0: nil else: cstring(s))")
elif namespace == "Gdk": elif namespace == "Gdk":
output.writeLine("type\n AtomArray* = pointer") output.writeLine("type\n AtomArray* = pointer")
output.writeLine("type\n KeymapKey00Array* = pointer") output.writeLine("type\n KeymapKey00Array* = pointer")