Window creation: Difference between revisions

Updated to work with X11 binding 1.1 and Nim<version 1.4: changed import statement; changed name of deprecated types, etc. Eliminated global vars.
(Updated to work with Nim 1.4 and Nim-Gtk2-1.3. Corrected wrong and inconsistent case of identifiers. Added a context to avoid access to global var in callback.)
(Updated to work with X11 binding 1.1 and Nim<version 1.4: changed import statement; changed name of deprecated types, etc. Eliminated global vars.)
Line 1,288:
 
=== X11 ===
<lang nim>import x11/[xlib, xutil, x, keysym]
 
const
WINDOW_WIDTH = 400
WINDOW_HEIGHT = 300
var
width, height: cuint
display: PDisplay
screen: cint
depth: int
win: TWindow
sizeHints: TXSizeHints
 
type WindowData = tuple[display: PDisplay; window: Window]
proc create_window =
width = WINDOW_WIDTH
height = WINDOW_HEIGHT
 
proc createWindow: WindowData =
display = XOpenDisplay(nil)
let width: cuint = WINDOW_WIDTH
width,let height: cuint = WINDOW_HEIGHT
var sizeHints: TXSizeHintsXSizeHints
 
let display = XOpenDisplay(nil)
if display == nil:
echo( "VerbindungConnection zumto X-Server fehlgeschlagenserver failed.")
quit(1) QuitFailure
 
let screen = XDefaultScreen(display)
depth = XDefaultDepth(display, screen)
var rootwin = XRootWindow(display, screen)
let win = XCreateSimpleWindow(display, rootwin, 100, 10, width, height, 5,
width XBlackPixel(display, heightscreen), 5XWhitePixel(display, screen))
size_hintssizeHints.flags = PSize or PMinSize or PMaxSize
XBlackPixel(display, screen),
sizeHints.min_width = width.cint
XWhitePixel(display, screen))
sizeHints.max_width = width.cint
size_hints.flags = PSize or PMinSize or PMaxSize
size_hintssizeHints.min_widthmin_height = widthheight.cint
size_hintssizeHints.max_widthmax_height = widthheight.cint
discard XSetStandardProperties(
size_hints.min_height = height.cint
display, win, "Simple Window", "window", 0, nil, 0, addr(size_hintssizeHints))
size_hints.max_height = height.cint
discard XSetStandardPropertiesXSelectInput(display, win, "SimpleButtonPressMask Window",or "window",KeyPressMask or PointerMotionMask)
0, nil, 0, addr(size_hints))
discard XSelectInput(display, win, ButtonPressMask or KeyPressMask or
PointerMotionMask)
discard XMapWindow(display, win)
result = (display, win)
 
proc closeWindow(data: WindowData) =
proc close_window =
discard XDestroyWindow(data.display, windata.window)
discard XCloseDisplay(data.display)
var
xev: TXEvent
 
proc processEvent(xev: var XEvent) =
proc process_event =
var key: TKeySymKeySym
case int(xev.theType).int
of KeyPress:
key = XLookupKeysym(cast[ptr TXKeyEventXKeyEvent](addr(xev)), 0)
if key.int != 0:
echo( "keyboard event ",$ key.int)
if key.int == 65307: # <Esc>
quit(1) QuitSuccess
of ButtonPressMask, PointerMotionMask:
Echo(echo "Mouse event")
else: nil
discard
 
proc eventloop(data: WindowData) =
var xev: XEvent
discard XFlush(display)
vardiscard num_events = int(XPendingXFlush(data.display))
var numEvents = XPending(data.display).int
while num_eventsnumEvents != 0:
dec(num_events)
dec numEvents
discard XNextEvent(display, addr(xev))
discard XFlushXNextEvent(data.display, addr(xev))
process_event()
processEvent(xev)
 
let windata = createWindow()
create_window()
while true:
eventloop(windata)
windata.closeWindow()</lang>
close_window()
</lang>
 
=== glut ===
Anonymous user