summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrustable-code <krauter.simon@arcor.de>2017-09-20 20:35:42 +0200
committertrustable-code <krauter.simon@arcor.de>2017-09-20 20:35:42 +0200
commit17c5e0b4024c5741d22257e706f2af2efb7595ad (patch)
treeb400d9b4c33accc5dc7d6fd3c061f63f13b3147c /src
parentdc62b597a99b8bc1866400366a340347b8fc12b9 (diff)
downloadNiGui-17c5e0b4024c5741d22257e706f2af2efb7595ad.tar.gz
NiGui-17c5e0b4024c5741d22257e706f2af2efb7595ad.zip
Dispose, CloseClick, Minimize
* Changed "Dispose" events * Added "CloseClick" event * Added "Window.minimize()" and "Window.minimized" Use "Window.show()" to unminimize the window.
Diffstat (limited to 'src')
-rwxr-xr-xsrc/nigui.nim93
-rwxr-xr-xsrc/nigui/private/gtk3/gtk3.nim21
-rwxr-xr-xsrc/nigui/private/gtk3/platform_impl.nim15
-rwxr-xr-xsrc/nigui/private/windows/platform_impl.nim18
-rwxr-xr-xsrc/nigui/private/windows/windows.nim5
5 files changed, 116 insertions, 36 deletions
diff --git a/src/nigui.nim b/src/nigui.nim
index 087c139..163a1d2 100755
--- a/src/nigui.nim
+++ b/src/nigui.nim
@@ -146,12 +146,14 @@ type
fDisposed: bool
fTitle: string
fVisible: bool
+ fMinimized: bool
fWidth, fHeight: int
fClientWidth, fClientHeight: int
fX, fY: int
fControl: Control
fIconPath: string
fOnDispose: WindowDisposeProc
+ fOnCloseClick: CloseClickProc
fOnResize: ResizeProc
fOnDropFiles: DropFilesProc
fOnKeyDown: WindowKeyProc
@@ -210,9 +212,12 @@ type
WindowDisposeEvent* = ref object
window*: Window
- cancel*: bool
WindowDisposeProc* = proc(event: WindowDisposeEvent)
+ CloseClickEvent* = ref object
+ window*: Window
+ CloseClickProc* = proc(event: CloseClickEvent)
+
ResizeEvent* = ref object
window*: Window
ResizeProc* = proc(event: ResizeEvent)
@@ -496,7 +501,7 @@ proc init*(window: WindowImpl)
## Only needed for own constructors.
proc dispose*(window: var Window)
-proc dispose*(window: Window)
+method dispose*(window: Window)
proc disposed*(window: Window): bool
@@ -509,6 +514,11 @@ method showModal*(window: Window, parent: Window)
method hide*(window: Window)
+method minimized*(window: Window): bool
+method `minimized=`*(window: Window, minimized: bool)
+
+method minimize*(window: Window)
+
method control*(window: Window): Control
method `control=`*(window: Window, control: Control)
@@ -538,7 +548,7 @@ method clientHeight*(window: Window): int
method iconPath*(window: Window): string
method `iconPath=`*(window: Window, iconPath: string)
-method handleDisposeEvent*(window: Window, event: WindowDisposeEvent)
+method closeClick*(window: Window)
method handleResizeEvent*(window: Window, event: ResizeEvent)
@@ -549,6 +559,9 @@ method handleDropFilesEvent*(window: Window, event: DropFilesEvent)
method onDispose*(window: Window): WindowDisposeProc
method `onDispose=`*(window: Window, callback: WindowDisposeProc)
+method onCloseClick*(window: Window): CloseClickProc
+method `onCloseClick=`*(window: Window, callback: CloseClickProc)
+
method onResize*(window: Window): ResizeProc
method `onResize=`*(window: Window, callback: ResizeProc)
@@ -569,7 +582,7 @@ proc init*(control: Control)
proc init*(control: ControlImpl)
proc dispose*(control: var Control)
-proc dispose*(control: Control)
+method dispose*(control: Control)
proc disposed*(control: Control): bool
@@ -678,8 +691,6 @@ method forceRedraw*(control: Control)
method canvas*(control: Control): Canvas
-method handleDisposeEvent*(control: Control, event: ControlDisposeEvent)
-
method handleDrawEvent*(control: Control, event: DrawEvent)
method handleMouseButtonDownEvent*(control: Control, event: MouseButtonEvent)
@@ -1155,32 +1166,28 @@ proc init(window: Window) =
windowList.add(window)
window.triggerRelayout()
-
method destroy(window: Window) =
if window.fControl != nil:
- window.fControl.destroy()
+ window.fControl.dispose()
# should be extended by WindowImpl
-proc disposeInner(window: Window): bool =
- var event = new WindowDisposeEvent
- event.window = window
- window.handleDisposeEvent(event)
- if event.cancel:
- return false
+proc dispose(window: var Window) =
+ let w = window
+ w.dispose() # force calling "dispose(window: Window)" instead of itself
+ window = nil
+
+method dispose(window: Window) =
+ let callback = window.onDispose
+ if callback != nil:
+ var event = new WindowDisposeEvent
+ event.window = window
+ callback(event)
window.destroy()
let i = windowList.find(window)
windowList.delete(i)
if quitOnLastWindowClose and windowList.len == 0:
quit()
window.fDisposed = true
- return true
-
-proc dispose(window: var Window) =
- if window.disposeInner():
- window = nil
-
-proc dispose(window: Window) =
- discard window.disposeInner()
proc disposed(window: Window): bool = window == nil or window.fDisposed
@@ -1204,8 +1211,11 @@ method visible(window: Window): bool = window.fVisible
method `visible=`(window: Window, visible: bool) =
window.fVisible = visible
+ if visible:
+ window.fMinimized = false
if window.x == -1 or window.y == -1:
window.centerOnScreen()
+ # should be extended by WindowImpl
method show(window: Window) = window.visible = true
@@ -1215,6 +1225,18 @@ method showModal(window: Window, parent: Window) =
method hide(window: Window) = window.visible = false
+method minimized(window: Window): bool = window.fMinimized
+
+method `minimized=`(window: Window, minimized: bool) =
+ if minimized:
+ window.minimize()
+ else:
+ window.show()
+
+method minimize(window: Window) =
+ window.fMinimized = true
+ # should be extended by WindowImpl
+
method x(window: Window): int = window.fX
method `x=`(window: Window, x: int) =
@@ -1266,11 +1288,15 @@ method `iconPath=`(window: Window, iconPath: string) =
window.fIconPath = iconPath
# should be extended by WindowImpl
-method handleDisposeEvent(window: Window, event: WindowDisposeEvent) =
+method closeClick(window: Window) =
# can be overriden by custom window
- let callback = window.onDispose
+ let callback = window.onCloseClick
if callback != nil:
+ var event = new CloseClickEvent
+ event.window = window
callback(event)
+ else:
+ window.dispose() # default action
method handleResizeEvent(window: Window, event: ResizeEvent) =
# can be overriden by custom window
@@ -1293,6 +1319,9 @@ method handleKeyDownEvent(window: Window, event: WindowKeyEvent) =
method onDispose(window: Window): WindowDisposeProc = window.fOnDispose
method `onDispose=`(window: Window, callback: WindowDisposeProc) = window.fOnDispose = callback
+method onCloseClick(window: Window): CloseClickProc = window.fOnCloseClick
+method `onCloseClick=`(window: Window, callback: CloseClickProc) = window.fOnCloseClick = callback
+
method onResize(window: Window): ResizeProc = window.fOnResize
method `onResize=`(window: Window, callback: ResizeProc) = window.fOnResize = callback
@@ -1332,10 +1361,16 @@ method destroy(control: Control) =
# should be extended by WindowImpl
proc dispose(control: var Control) =
- control.destroy()
+ let c = control
+ c.dispose() # force calling "dispose(control: Control)" instead of itself
control = nil
-proc dispose(control: Control) =
+method dispose(control: Control) =
+ let callback = control.onDispose
+ if callback != nil:
+ var event = new ControlDisposeEvent
+ event.control = control
+ callback(event)
control.destroy()
control.fDisposed = true
@@ -1626,12 +1661,6 @@ method forceRedraw(control: Control) =
method canvas(control: Control): Canvas = control.fCanvas
-method handleDisposeEvent(control: Control, event: ControlDisposeEvent) =
- # can be overriden by custom window
- let callback = control.onDispose
- if callback != nil:
- callback(event)
-
method handleDrawEvent(control: Control, event: DrawEvent) =
# can be implemented by custom control
let callback = control.onDraw
diff --git a/src/nigui/private/gtk3/gtk3.nim b/src/nigui/private/gtk3/gtk3.nim
index 3e83f62..f9c666f 100755
--- a/src/nigui/private/gtk3/gtk3.nim
+++ b/src/nigui/private/gtk3/gtk3.nim
@@ -74,6 +74,13 @@ type
group*: int8
is_modifier*: int8
+ GdkEventWindowState* {.byCopy.} = object
+ event_type*: cint
+ window*: pointer
+ send_event*: int8
+ changed_mask*: cint
+ new_window_state*: cint
+
GtkTextIter* {.byCopy.} = object
dummy1: pointer
dummy2: pointer
@@ -186,6 +193,17 @@ const
# Key modifier masks:
GDK_CONTROL_MASK* = 1 shl 2
+ # GdkWindowState:
+ GDK_WINDOW_STATE_WITHDRAWN* = 1
+ GDK_WINDOW_STATE_ICONIFIED* = 2
+ GDK_WINDOW_STATE_MAXIMIZED* = 4
+ GDK_WINDOW_STATE_STICKY* = 8
+ GDK_WINDOW_STATE_FULLSCREEN* = 16
+ GDK_WINDOW_STATE_ABOVE* = 32
+ GDK_WINDOW_STATE_BELOW* = 64
+ GDK_WINDOW_STATE_FOCUSED* = 128
+ GDK_WINDOW_STATE_TILED* = 256
+
# ----------------------------------------------------------------------------------------
# General Gtk Procs
@@ -216,6 +234,9 @@ proc gtk_window_get_size*(window: pointer, width, height: var cint) {.importc: "
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_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.}
proc gdk_window_begin_paint_rect*(window: pointer, rectangle: var GdkRectangle) {.importc: "gdk_window_begin_paint_rect", libgtk3.}
proc gdk_window_begin_paint_region*(window: pointer, region: pointer) {.importc: "gdk_window_begin_paint_region", libgtk3.}
diff --git a/src/nigui/private/gtk3/platform_impl.nim b/src/nigui/private/gtk3/platform_impl.nim
index ec8a2da..ac4bf2d 100755
--- a/src/nigui/private/gtk3/platform_impl.nim
+++ b/src/nigui/private/gtk3/platform_impl.nim
@@ -42,7 +42,7 @@ proc pGdkRGBAToColor(rgba: var GdkRGBA): Color =
proc pWindowDeleteSignal(widgetHandle, event, data: pointer): bool {.cdecl.} =
let window = cast[WindowImpl](data)
- window.dispose()
+ window.closeClick()
return true
proc pWindowConfigureSignal(windowHandle, event, data: pointer): bool {.cdecl.} =
@@ -580,6 +580,10 @@ proc pMainScrollbarDraw(widget: pointer, cr: pointer, data: pointer): bool {.cde
gtk_scrolled_window_set_policy(widget, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC)
fScrollbarSize = allocation.height
+proc pWindowStateEventSignal(widget: pointer, event: var GdkEventWindowState, user_data: pointer): bool {.cdecl.} =
+ let window = cast[WindowImpl](user_data)
+ window.fMinimized = (event.new_window_state and GDK_WINDOW_STATE_ICONIFIED) == GDK_WINDOW_STATE_ICONIFIED
+
proc init(window: WindowImpl) =
if pClipboardPtr == nil:
gtk_init(nil, nil)
@@ -592,6 +596,7 @@ proc init(window: WindowImpl) =
discard g_signal_connect_data(window.fHandle, "delete-event", pWindowDeleteSignal, cast[pointer](window))
discard g_signal_connect_data(window.fHandle, "configure-event", pWindowConfigureSignal, cast[pointer](window))
discard g_signal_connect_data(window.fHandle, "key-press-event", pWindowKeyPressSignal, cast[pointer](window))
+ discard g_signal_connect_data(window.fHandle, "window-state-event", pWindowStateEventSignal, cast[pointer](window))
# Enable drag and drop of files:
pSetDragDest(window.fHandle)
@@ -610,7 +615,9 @@ method destroy(window: WindowImpl) =
method `visible=`(window: WindowImpl, visible: bool) =
procCall window.Window.`visible=`(visible)
if visible:
- gtk_widget_show(window.fHandle)
+ # gtk_window_deiconify(window.fHandle)
+ # gtk_widget_show(window.fHandle)
+ gtk_window_present(window.fHandle)
while fScrollbarSize == -1:
discard gtk_main_iteration()
else:
@@ -622,6 +629,10 @@ method showModal(window, parent: WindowImpl) =
gtk_window_set_transient_for(window.fHandle, parent.fHandle)
window.visible = true
+method minimize(window: WindowImpl) =
+ procCall window.Window.minimize()
+ gtk_window_iconify(window.fHandle)
+
method `width=`*(window: WindowImpl, width: int) =
procCall window.Window.`width=`(width)
gtk_window_resize(window.fHandle, window.width.cint, window.height.cint)
diff --git a/src/nigui/private/windows/platform_impl.nim b/src/nigui/private/windows/platform_impl.nim
index a07af81..e59f120 100755
--- a/src/nigui/private/windows/platform_impl.nim
+++ b/src/nigui/private/windows/platform_impl.nim
@@ -258,7 +258,7 @@ proc pWindowWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer): pointe
case uMsg
of WM_CLOSE:
let window = cast[WindowImpl](pGetWindowLongPtr(hWnd, GWLP_USERDATA))
- window.dispose()
+ window.closeClick()
return cast[pointer](true) # keeps the window open, else the window will be destroyed
of WM_SIZE:
let window = cast[WindowImpl](pGetWindowLongPtr(hWnd, GWLP_USERDATA))
@@ -303,6 +303,15 @@ proc pWindowWndProc(hWnd: pointer, uMsg: int32, wParam, lParam: pointer): pointe
let window = cast[Window](pGetWindowLongPtr(hWnd, GWLP_USERDATA))
if window != nil and pHandleWMCHAR(window, nil, wParam, lParam):
return
+ of WM_SYSCOMMAND:
+ let window = cast[Window](pGetWindowLongPtr(hWnd, GWLP_USERDATA))
+ if window != nil:
+ if cast[int](wParam) == SC_MINIMIZE:
+ window.fMinimized = true
+ echo "a"
+ elif cast[int](wParam) == SC_RESTORE:
+ window.fMinimized = false
+ echo "b"
else:
discard
result = pCommonWndProc(hWnd, uMsg, wParam, lParam)
@@ -715,7 +724,8 @@ method destroy(window: WindowImpl) =
method `visible=`(window: WindowImpl, visible: bool) =
procCall window.Window.`visible=`(visible)
if visible:
- pShowWindow(window.fHandle, SW_SHOW)
+ # pShowWindow(window.fHandle, SW_SHOW)
+ pShowWindow(window.fHandle, SW_RESTORE)
else:
pShowWindow(window.fHandle, SW_HIDE)
@@ -731,6 +741,10 @@ method showModal(window, parent: WindowImpl) =
window.visible = true
discard EnableWindow(parent.fHandle, false)
+method minimize(window: WindowImpl) =
+ procCall window.Window.minimize()
+ pShowWindow(window.fHandle, SW_MINIMIZE)
+
proc pUpdatePosition(window: WindowImpl) =
pSetWindowPos(window.fHandle, window.x, window.y, -1, -1, SWP_NOSIZE)
# discard MoveWindow(window.fHandle, window.x.int32, window.y.int32, window.width.int32, window.height.int32, false)
diff --git a/src/nigui/private/windows/windows.nim b/src/nigui/private/windows/windows.nim
index 536d345..cc70dc1 100755
--- a/src/nigui/private/windows/windows.nim
+++ b/src/nigui/private/windows/windows.nim
@@ -75,13 +75,18 @@ const
SB_LINERIGHT* = 1
SB_PAGELEFT* = 2
SB_PAGERIGHT* = 3
+ SC_MINIMIZE* = 0xF020
+ SC_RESTORE* = 0xF120
SIF_ALL* = 23
SM_CXVSCROLL* = 2
SPI_GETWORKAREA* = 0x0030
SPI_SETKEYBOARDCUES* = 0x100B
SS_CENTERIMAGE* = 0x00000200
SW_HIDE* = 0
+ SW_MAXIMIZE = 3
SW_SHOW* = 5
+ SW_MINIMIZE* = 6
+ SW_RESTORE* = 9
SWP_NOMOVE* = 2
SWP_NOSIZE* = 1
VK_CONTROL* = 17