Wrap X11 app state into an object

pull/2/head
rexim 5 years ago
parent 14cfee4c14
commit 7408a61334

@ -1,78 +1,81 @@
import x11/xlib, x11/xutil, x11/x, x11/keysym import x11/xlib, x11/xutil, x11/x, x11/keysym
const type
WINDOW_WIDTH = 800 Hello* = object
WINDOW_HEIGHT = 600 running*: bool
DISPLAY_STRING = "Hello, Nimrods. Pepepains"
var
display: PDisplay display: PDisplay
screen: cint screen: cint
win: TWindow win: TWindow
wmDeleteMessage: TAtom wmDeleteMessage: TAtom
running: bool message: cstring
proc create_window = proc create_hello*(width, height: int,
display = XOpenDisplay(nil) message: string): Hello =
if display == nil: result.message = message
result.display = XOpenDisplay(nil)
if result.display == nil:
quit "Failed to open display" quit "Failed to open display"
screen = XDefaultScreen(display) result.screen = XDefaultScreen(result.display)
var rootwin = XRootWindow(display, screen) var rootwin = XRootWindow(result.display, result.screen)
win = XCreateSimpleWindow(display, rootwin, result.win =
XCreateSimpleWindow(result.display, rootwin,
100, 10, 100, 10,
WINDOW_WIDTH, WINDOW_HEIGHT, 5, width.cuint, height.cuint, 5,
XBlackPixel(display, screen), XBlackPixel(result.display,
XWhitePixel(display, screen)) result.screen),
XWhitePixel(result.display,
result.screen))
var size_hints = TXSizeHints( var size_hints = TXSizeHints(
flags: PSize or PMinSize or PMaxSize, flags: PSize or PMinSize or PMaxSize,
min_width: WINDOW_WIDTH.cint, min_width: width.cint,
max_width: WINDOW_WIDTH.cint, max_width: width.cint,
min_height: WINDOW_HEIGHT.cint, min_height: height.cint,
max_height: WINDOW_HEIGHT.cint) max_height: height.cint)
discard XSetStandardProperties(display, discard XSetStandardProperties(result.display,
win, result.win,
"Simple Window", "Simple Window",
"window", "window",
0, nil, 0, 0, nil, 0,
addr(size_hints)) addr(size_hints))
discard XSelectInput(display, win, discard XSelectInput(result.display, result.win,
ButtonPressMask or KeyPressMask or ButtonPressMask or KeyPressMask or
PointerMotionMask or ExposureMask) PointerMotionMask or ExposureMask)
discard XMapWindow(display, win) discard XMapWindow(result.display, result.win)
wmDeleteMessage = result.wmDeleteMessage =
XInternAtom(display, XInternAtom(result.display,
"WM_DELETE_WINDOW", "WM_DELETE_WINDOW",
false.TBool) false.TBool)
discard XSetWMProtocols(display, discard XSetWMProtocols(result.display,
win, result.win,
wmDeleteMessage.addr, 1) result.wmDeleteMessage.addr, 1)
running = true result.running = true
proc close_window = proc close* (hello: Hello) =
discard XDestroyWindow(display, win) discard XDestroyWindow(hello.display, hello.win)
discard XCloseDisplay(display) discard XCloseDisplay(hello.display)
proc draw_screen = proc draw* (hello: Hello) =
discard XDrawString(display, win, discard XDrawString(hello.display,
DefaultGC(display, screen), hello.win,
DefaultGC(hello.display, hello.screen),
10, 50, 10, 50,
DISPLAY_STRING.cstring, hello.message,
DISPLAY_STRING.len.cint) hello.message.len.cint)
proc handle_event = proc handle_event* (hello: var Hello) =
var xev: TXEvent var xev: TXEvent
discard XNextEvent(display, xev.addr) discard XNextEvent(hello.display, xev.addr)
case xev.theType case xev.theType
of Expose: of Expose:
draw_screen() hello.draw()
of ClientMessage: of ClientMessage:
if cast[TAtom](xev.xclient.data.l[0]) == wmDeleteMessage: if cast[TAtom](xev.xclient.data.l[0]) == hello.wmDeleteMessage:
running = false hello.running = false
of KeyPress: of KeyPress:
var key = XLookupKeysym(cast[PXKeyEvent](xev.addr), 0) var key = XLookupKeysym(cast[PXKeyEvent](xev.addr), 0)
if key != 0: if key != 0:
@ -82,7 +85,7 @@ proc handle_event =
else: else:
discard discard
create_window() var hello = createHello(800, 600, "Hello!")
while running: defer: hello.close()
handle_event() while hello.running:
close_window() hello.handle_event()

Loading…
Cancel
Save