|
|
@ -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()
|
|
|
|