181 lines
4.8 KiB
Plaintext
181 lines
4.8 KiB
Plaintext
/* Simulate_input_Mouse.wren */
|
|
|
|
var KeyPressMask = 1 << 0
|
|
var ButtonPressMask = 1 << 2
|
|
var Button1Mask = 1 << 8
|
|
var ExposureMask = 1 << 15
|
|
var Button1 = 1
|
|
var KeyPress = 2
|
|
var ButtonPress = 4
|
|
var Expose = 12
|
|
var ClientMessage = 33
|
|
|
|
var XK_a = 0x0061
|
|
var XK_q = 0x0071
|
|
var XK_Escape = 0xff1b
|
|
|
|
foreign class XGC {
|
|
construct default(display, screenNumber) {}
|
|
}
|
|
|
|
foreign class XColormap {
|
|
construct default(display, screenNumber) {}
|
|
}
|
|
|
|
foreign class XColor {
|
|
construct new() {}
|
|
|
|
foreign pixel
|
|
}
|
|
|
|
// XEvent is a C union, not a struct, so we amalgamate the properties
|
|
foreign class XEvent {
|
|
construct new() {} // creates the union and returns a pointer to it
|
|
|
|
foreign eventType // gets type field, common to all union members
|
|
|
|
foreign eventType=(et) // sets type field
|
|
|
|
foreign button // gets xbutton.button
|
|
|
|
foreign button=(b) // sets xbutton.button
|
|
|
|
foreign state=(st) // sets xbutton.state
|
|
|
|
foreign sameScreen=(ss) // sets xbutton.same_screen
|
|
|
|
foreign dataL // gets xclient.data.l (data is a union)
|
|
}
|
|
|
|
foreign class XDisplay {
|
|
construct openDisplay(displayName) {}
|
|
|
|
foreign defaultScreen()
|
|
|
|
foreign rootWindow(screenNumber)
|
|
|
|
foreign blackPixel(screenNumber)
|
|
|
|
foreign whitePixel(screenNumber)
|
|
|
|
foreign selectInput(w, eventMask)
|
|
|
|
foreign mapWindow(w)
|
|
|
|
foreign closeDisplay()
|
|
|
|
foreign nextEvent(eventReturn)
|
|
|
|
foreign createSimpleWindow(parent, x, y, width, height, borderWidth, border, background)
|
|
|
|
foreign drawString(d, gc, x, y, string, length)
|
|
|
|
foreign storeName(w, windowName)
|
|
|
|
foreign flush()
|
|
|
|
foreign internAtom(atomName, onlyIfExists)
|
|
|
|
foreign setWMProtocols(w, protocols, count)
|
|
|
|
foreign sendEvent(w, propogate, eventMask, eventSend)
|
|
|
|
foreign destroyWindow(w)
|
|
|
|
foreign parseColor(colormap, spec, exactDefReturn)
|
|
|
|
foreign allocColor(colormap, screenInOut)
|
|
|
|
foreign setWindowBackground(w, backgroundPixel)
|
|
|
|
foreign clearArea(w, x, y, width, height, exposures)
|
|
}
|
|
|
|
class X {
|
|
foreign static lookupKeysym(keyEvent, index)
|
|
}
|
|
|
|
/* open connection with the server */
|
|
var xd = XDisplay.openDisplay("")
|
|
if (xd == 0) {
|
|
System.print("Cannot open display.")
|
|
return
|
|
}
|
|
var s = xd.defaultScreen()
|
|
|
|
/* create window */
|
|
var w = xd.createSimpleWindow(xd.rootWindow(s), 10, 10, 350, 250, 1, xd.blackPixel(s), xd.whitePixel(s))
|
|
xd.storeName(w, "Simulate mouse press")
|
|
var white = true // current background color
|
|
|
|
/* select kind of events we are interested in */
|
|
xd.selectInput(w, ExposureMask | KeyPressMask | ButtonPressMask)
|
|
|
|
/* map (show) the window */
|
|
xd.mapWindow(w)
|
|
xd.flush()
|
|
|
|
/* default graphics context */
|
|
var gc = XGC.default(xd, s)
|
|
|
|
/* connect the close button in the window handle */
|
|
var wmDeleteWindow = xd.internAtom("WM_DELETE_WINDOW", true)
|
|
xd.setWMProtocols(w, [wmDeleteWindow], 1)
|
|
|
|
/* create color green */
|
|
var green = XColor.new()
|
|
var colormap = XColormap.default(xd, s)
|
|
xd.parseColor(colormap, "#00FF00", green)
|
|
xd.allocColor(colormap, green)
|
|
|
|
/* event loop */
|
|
var e = XEvent.new()
|
|
while (true) {
|
|
xd.nextEvent(e)
|
|
var et = e.eventType
|
|
if (et == Expose) {
|
|
/* draw or redraw the window */
|
|
var msg1 = "Press the 'a' key to switch the background color"
|
|
var msg2 = "between white and green."
|
|
xd.drawString(w, gc, 10, 20, msg1, msg1.count)
|
|
xd.drawString(w, gc, 10, 35, msg2, msg2.count)
|
|
} else if (et == ButtonPress) {
|
|
System.write("\nButtonPress event received, ")
|
|
if (white) {
|
|
System.print("switching from white to green")
|
|
xd.setWindowBackground(w, green.pixel)
|
|
} else {
|
|
System.print("switching from green to white")
|
|
xd.setWindowBackground(w, xd.whitePixel(s))
|
|
}
|
|
xd.clearArea(w, 0, 0, 0, 0, true)
|
|
white = !white
|
|
} else if (et == ClientMessage) {
|
|
/* delete window event */
|
|
if (e.dataL[0] == wmDeleteWindow) break
|
|
} else if (et == KeyPress) {
|
|
System.print("\nKeyPress event received")
|
|
/* exit if q or escape are pressed */
|
|
var keysym = X.lookupKeysym(e, 0)
|
|
if (keysym == XK_q || keysym == XK_Escape) {
|
|
break
|
|
} else if (keysym == XK_a) {
|
|
/* if a is pressed, manufacture a ButtonPress event and send it to the window */
|
|
System.print("> Key 'a' pressed, sending ButtonPress event")
|
|
var e2 = XEvent.new()
|
|
e2.eventType = ButtonPress
|
|
e2.state = Button1Mask
|
|
e2.button = Button1
|
|
e2.sameScreen = true
|
|
xd.sendEvent(w, true, ButtonPressMask, e2)
|
|
} else {
|
|
System.print("> Key other than 'a' pressed, not processed")
|
|
}
|
|
}
|
|
}
|
|
|
|
xd.destroyWindow(w)
|
|
|
|
/* close connection to server */
|
|
xd.closeDisplay()
|