summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrustable-code <krauter.simon@arcor.de>2019-08-31 12:30:14 +0200
committertrustable-code <krauter.simon@arcor.de>2019-08-31 12:30:14 +0200
commitc0803831e6220c31c0c6c918f81817d0b01e4cb1 (patch)
tree598a6b20164148f5c982f4b587c5c2814efa04ee /src
parentf01d14dd1f3e2539fd6fe257d21f53cecbd62810 (diff)
downloadNiGui-c0803831e6220c31c0c6c918f81817d0b01e4cb1.tar.gz
NiGui-c0803831e6220c31c0c6c918f81817d0b01e4cb1.zip
Rework error handling, related to #48
Diffstat (limited to 'src')
-rwxr-xr-xsrc/nigui.nim16
-rwxr-xr-xsrc/nigui/private/gtk3/gtk3.nim2
-rwxr-xr-xsrc/nigui/private/gtk3/platform_impl.nim8
-rwxr-xr-xsrc/nigui/private/windows/platform_impl.nim42
4 files changed, 44 insertions, 24 deletions
diff --git a/src/nigui.nim b/src/nigui.nim
index 3810446..0ddc2a8 100755
--- a/src/nigui.nim
+++ b/src/nigui.nim
@@ -894,7 +894,7 @@ method `wrap=`*(textArea: TextArea, wrap: bool)
# Private Procedures Predeclaration
# ----------------------------------------------------------------------------------------
-proc raiseError(msg: string, showAlert = true, title = "NiGui Error")
+proc raiseError(msg: string)
proc handleException()
@@ -958,14 +958,20 @@ var
# Global/App Procedures
# ----------------------------------------------------------------------------------------
-proc raiseError(msg: string, showAlert = true, title = "NiGui Error") =
- if showAlert:
- alert(nil, msg & "\p\p" & getStackTrace(), title)
+proc raiseError(msg: string) =
raise newException(Exception, msg)
+proc defaultExceptionHandler() =
+ let msg = getCurrentExceptionMsg() & "\p\p" & getStackTrace()
+ alert(nil, msg, "Error")
+ echo "Error: unhandled exception: ", msg
+ quit()
+
proc handleException() =
+ ## Handle an exception raised in runMainLoop().
+ ## This is called directly from the Gtk part.
if fErrorHandler == nil:
- raiseError(getCurrentExceptionMsg(), true, "Unhandled Exception")
+ defaultExceptionHandler()
else:
fErrorHandler()
diff --git a/src/nigui/private/gtk3/gtk3.nim b/src/nigui/private/gtk3/gtk3.nim
index e23c941..d7d9a1c 100755
--- a/src/nigui/private/gtk3/gtk3.nim
+++ b/src/nigui/private/gtk3/gtk3.nim
@@ -240,7 +240,7 @@ proc gtk_window_resize_to_geometry*(window: pointer, width, height: cint) {.impo
proc gtk_window_get_size*(window: pointer, width, height: var cint) {.importc: "gtk_window_get_size", libgtk3.}
proc gtk_window_get_position*(window: pointer, x, y: var cint) {.importc: "gtk_window_get_position", libgtk3.}
proc gtk_window_move*(window: pointer, x, y: cint) {.importc: "gtk_window_move", libgtk3.}
-proc gtk_window_set_icon_from_file*(window: pointer, filename: cstring, err: pointer) {.importc: "gtk_window_set_icon_from_file", libgtk3.}
+proc gtk_window_set_icon_from_file*(window: pointer, filename: cstring, err: pointer): bool {.importc: "gtk_window_set_icon_from_file", libgtk3.}
proc gtk_window_iconify*(window: pointer) {.importc: "gtk_window_iconify", libgtk3.}
proc gtk_window_deiconify*(window: pointer) {.importc: "gtk_window_deiconify", libgtk3.}
proc gtk_window_present*(window: pointer) {.importc: "gtk_window_present", libgtk3.}
diff --git a/src/nigui/private/gtk3/platform_impl.nim b/src/nigui/private/gtk3/platform_impl.nim
index e8a2649..4014047 100755
--- a/src/nigui/private/gtk3/platform_impl.nim
+++ b/src/nigui/private/gtk3/platform_impl.nim
@@ -27,7 +27,7 @@ var pClipboardTextIsSet: bool
proc pRaiseGError(error: ptr GError) =
if error == nil:
raiseError("Unkown error")
- raiseError($error.message, false)
+ raiseError($error.message)
proc pColorToGdkRGBA(color: Color, rgba: var GdkRGBA) =
rgba.red = color.red.float / 255
@@ -811,7 +811,11 @@ method `control=`(window: WindowImpl, control: Control) =
method `iconPath=`(window: WindowImpl, iconPath: string) =
procCall window.Window.`iconPath=`(iconPath)
- gtk_window_set_icon_from_file(window.fHandle, iconPath, nil)
+ if not gtk_window_set_icon_from_file(window.fHandle, iconPath, nil):
+ if not fileExists(iconPath):
+ raiseError("Faild to load image from file '" & iconPath & "': File does not exist")
+ else:
+ raiseError("Faild to load image from file '" & iconPath & "'")
# ----------------------------------------------------------------------------------------
diff --git a/src/nigui/private/windows/platform_impl.nim b/src/nigui/private/windows/platform_impl.nim
index e9b8e22..dce331c 100755
--- a/src/nigui/private/windows/platform_impl.nim
+++ b/src/nigui/private/windows/platform_impl.nim
@@ -27,16 +27,9 @@ var pLastMouseButtonDownControl: Control
var pLastMouseButtonDownControlX: int
var pLastMouseButtonDownControlY: int
-proc pRaiseLastOSError(showAlert = true) =
+proc pRaiseLastOSError() =
let e = osLastError()
- raiseError(strutils.strip(osErrorMsg(e)) & " (OS Error Code: " & $e & ")", showAlert)
-
-proc pCheckGdiplusStatus(status: int32, showAlert = true) =
- if status != 0:
- if status == 7:
- pRaiseLastOSError(showAlert)
- else:
- raiseError("A GDI+ error occured. (Status: " & $status & ")", showAlert)
+ raiseError(strutils.strip(osErrorMsg(e)) & " (OS Error Code: " & $e & ")")
proc pColorToRGB32(color: Color): RGB32 =
result.red = color.red
@@ -352,12 +345,29 @@ proc pContainerWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer): poi
proc pCustomControlWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer): pointer {.cdecl.}
+proc pCheckGdiplusStatus(status: int32, msg = "") =
+ if status != 0:
+ if status == 7:
+ pRaiseLastOSError()
+ elif msg != "":
+ raiseError(msg & " (GDI+ Status: " & $status & ")")
+ else:
+ raiseError("A GDI+ error occured. (GDI+ Status: " & $status & ")")
+
proc pInitGdiplus() =
var input: GdiplusStartupInput
input.GdiplusVersion = 1
var gidplus: pointer = nil
pCheckGdiplusStatus(GdiplusStartup(gidplus, input, nil))
+proc pGdipCreateBitmapFromFileWrapped(filename: string, bitmap: var pointer) =
+ let status = GdipCreateBitmapFromFile(filename.pUtf8ToUtf16(), bitmap)
+ if status != 0:
+ if not fileExists(filename):
+ raiseError("Faild to load image from file '" & filename & "': File does not exist")
+ else:
+ pCheckGdiplusStatus(status, "Faild to load image from file '" & filename & "'")
+
proc pGetTextSize(hDC, font: pointer, text: string): Size =
let wideText = text.pUtf8ToUtf16
discard SelectObject(hdc, font)
@@ -736,7 +746,7 @@ method getTextLineHeight(canvas: CanvasImpl): int = canvas.pGetTextSize("a").cy
method resize(image: Image, width, height: int) =
let canvas = cast[CanvasImpl](image.canvas)
if canvas.fBitmap != nil:
- pCheckGdiplusStatus(GdipDisposeImage(canvas.fBitmap), false)
+ pCheckGdiplusStatus(GdipDisposeImage(canvas.fBitmap))
pCheckGdiplusStatus(GdipDeleteGraphics(canvas.fGraphics))
canvas.fBitmap = nil
canvas.fGraphics = nil
@@ -750,13 +760,13 @@ method resize(image: Image, width, height: int) =
method loadFromFile(image: Image, filePath: string) =
let canvas = cast[CanvasImpl](image.canvas)
if canvas.fBitmap != nil:
- pCheckGdiplusStatus(GdipDisposeImage(canvas.fBitmap), false)
+ pCheckGdiplusStatus(GdipDisposeImage(canvas.fBitmap))
pCheckGdiplusStatus(GdipDeleteGraphics(canvas.fGraphics))
canvas.fBitmap = nil
canvas.fGraphics = nil
image.canvas.fWidth = 0
image.canvas.fHeight = 0
- pCheckGdiplusStatus(GdipCreateBitmapFromFile(filePath.pUtf8ToUtf16(), canvas.fBitmap), false)
+ pGdipCreateBitmapFromFileWrapped(filePath, canvas.fBitmap)
pCheckGdiplusStatus(GdipGetImageGraphicsContext(canvas.fBitmap, canvas.fGraphics))
var width, height: int32
pCheckGdiplusStatus(GdipGetImageWidth(canvas.fBitmap, width))
@@ -771,7 +781,7 @@ method saveToBitmapFile(image: Image, filePath: string) =
clsidEncoder.Data2 = 0x11d31a04
clsidEncoder.Data3 = 0x0000739a
clsidEncoder.Data4 = 0x2ef31ef8
- pCheckGdiplusStatus(GdipSaveImageToFile(canvas.fBitmap, filePath.pUtf8ToUtf16(), clsidEncoder.addr, nil), false)
+ pCheckGdiplusStatus(GdipSaveImageToFile(canvas.fBitmap, filePath.pUtf8ToUtf16(), clsidEncoder.addr, nil))
method saveToPngFile(image: Image, filePath: string) =
let canvas = cast[CanvasImpl](image.canvas)
@@ -780,7 +790,7 @@ method saveToPngFile(image: Image, filePath: string) =
clsidEncoder.Data2 = 0x11d31a04
clsidEncoder.Data3 = 0x0000739a
clsidEncoder.Data4 = 0x2ef31ef8
- pCheckGdiplusStatus(GdipSaveImageToFile(canvas.fBitmap, filePath.pUtf8ToUtf16(), clsidEncoder.addr, nil), false)
+ pCheckGdiplusStatus(GdipSaveImageToFile(canvas.fBitmap, filePath.pUtf8ToUtf16(), clsidEncoder.addr, nil))
method saveToJpegFile(image: Image, filePath: string, quality = 80) =
let canvas = cast[CanvasImpl](image.canvas)
@@ -790,7 +800,7 @@ method saveToJpegFile(image: Image, filePath: string, quality = 80) =
clsidEncoder.Data3 = 0x0000739a
clsidEncoder.Data4 = 0x2ef31ef8
# TODO: pass quality
- pCheckGdiplusStatus(GdipSaveImageToFile(canvas.fBitmap, filePath.pUtf8ToUtf16(), clsidEncoder.addr, nil), false)
+ pCheckGdiplusStatus(GdipSaveImageToFile(canvas.fBitmap, filePath.pUtf8ToUtf16(), clsidEncoder.addr, nil))
method beginPixelDataAccess(image: Image): ptr UncheckedArray[byte] =
let imageImpl = cast[ImageImpl](image)
@@ -909,7 +919,7 @@ method `control=`(window: WindowImpl, control: Control) =
method `iconPath=`(window: WindowImpl, iconPath: string) =
procCall window.Window.`iconPath=`(iconPath)
var bitmap: pointer
- pCheckGdiplusStatus(GdipCreateBitmapFromFile(iconPath.pUtf8ToUtf16(), bitmap))
+ pGdipCreateBitmapFromFileWrapped(iconPath, bitmap)
var icon: pointer
pCheckGdiplusStatus(GdipGetHicon(bitmap, icon))
discard SendMessageA(window.fHandle, WM_SETICON, cast[pointer](ICON_BIG), icon)