func XMain(callbacks Callbacks) { dpy := C.XOpenDisplay(nil) w := C.XCreateSimpleWindow(dpy, C.XDefaultRootWindow(dpy), 0, 0, 600, 400, 0, 0, 0) C.XSelectInput(dpy, w, C.StructureNotifyMask|C.SubstructureNotifyMask|C.ExposureMask) C.XMapWindow(dpy, w) win := Window{dpy: dpy, xw: w} visual := C.XDefaultVisual(dpy, 0) surf := cairo.XlibSurfaceCreate(unsafe.Pointer(dpy), uint64(win.xw), unsafe.Pointer(visual), 10, 10) for { var e C.XEvent C.XNextEvent(dpy, &e) typ := XEventType(*(*C.int)(unsafe.Pointer(&e))) // log.Printf("X event: %s", typ) switch typ { case C.ConfigureNotify: e := (*C.XConfigureEvent)(unsafe.Pointer(&e)) surf.SetSize(int(e.width), int(e.height)) case C.Expose: cr := cairo.Create(surf.Surface) callbacks.Draw(cr, surf) default: // log.Printf("unknown X event %s", typ) } } }
func (d *Display) NewWindow(delegate ui.WinDelegate) ui.Win { w := C.XCreateSimpleWindow(d.dpy, C.XDefaultRootWindow(d.dpy), 0, 0, 640, 400, 0, 0, C.XWhitePixel(d.dpy, 0)) C.XSelectInput(d.dpy, w, C.StructureNotifyMask|C.SubstructureNotifyMask|C.ExposureMask|C.KeyPress|C.KeyRelease|C.ButtonPress) C.XMapWindow(d.dpy, w) return &Window{ delegate: delegate, dpy: d, xw: w, } }
func (window *XWindow) Create(width uint, height uint, title string) bool { dpy := C.XOpenDisplay(nil) scr := C.XDefaultScreen(dpy) root := C.XDefaultRootWindow(dpy) win := C.XCreateSimpleWindow(dpy, root, 0, 0, C.uint(width), C.uint(height), 0, C.XBlackPixel(dpy, scr), C.XBlackPixel(dpy, scr)) C.XStoreName(dpy, win, C.CString(title)) C.XMapWindow(dpy, win) window.dpy = dpy return true }
func Screen() (C.uint, C.uint, C.uint) { // d := C.CString(dspl) defer C.free(unsafe.Pointer(d)) display = C.XOpenDisplay(d) if display == nil { panic("display == nil") /* Terminate (); */ os.Exit(1) } window0 = C.XDefaultRootWindow(display) screen = C.XDefaultScreen(display) return C.uint(C.XDisplayWidth(display, screen)), C.uint(C.XDisplayHeight(display, screen)), C.uint(C.XDefaultDepth(display, screen)) }
func CreateXWindow(width, height int) (*XWindow, error) { C.XInitThreads() W := &XWindow{} W.Display = C.XOpenDisplay(nil) if W.Display == nil { return &XWindow{}, errors.New("Can't open display") } W.Window = C.XCreateSimpleWindow(W.Display, C.XDefaultRootWindow(W.Display), 0, 0, C.uint(width), C.uint(height), 0, 0, 0xFF151515) C.XSetWindowBackgroundPixmap(W.Display, W.Window, 0) // This avoids flickering on resize C.XMapWindow(W.Display, W.Window) C.XStoreName(W.Display, W.Window, C.CString("gowitt")) C.XSelectInput(W.Display, W.Window, C.ExposureMask|C.KeyPressMask|C.ButtonPressMask) C.XFlush(W.Display) // Cairo W.Surface = C.cairo_xlib_surface_create(W.Display, C.Drawable(W.Window), C.XDefaultVisual(W.Display, 0), C.int(width), C.int(height)) C.cairo_xlib_surface_set_size(W.Surface, C.int(width), C.int(height)) W.Cairo = C.cairo_create(W.Surface) // Pango InitLayoutsCache(W.Cairo) W.PangoContext = C.pango_cairo_create_context(W.Cairo) W.FontDesc = C.pango_font_description_from_string(C.CString("Sans 10")) W.AttrList = C.pango_attr_list_new() placeholderImage = C.cairo_image_surface_create_from_png(C.CString("test.png")) W.UserImages = NewImageCache(func() { var ev C.XEvent exev := (*C.XExposeEvent)(unsafe.Pointer(&ev)) exev._type = C.Expose exev.count = 0 exev.window = W.Window exev.send_event = 1 exev.display = W.Display C.XSendEvent(W.Display, W.Window, 0, C.ExposureMask, &ev) C.XFlush(W.Display) }) return W, nil }
func setStatus(status string) { C.XStoreName(dpy, C.XDefaultRootWindow(dpy), C.CString(status)) C.XSync(dpy, 1) }
func main() { var dpy *C.Display var attr C.XWindowAttributes var start C.XButtonEvent var ev C.XEvent var ch *C.char if dpy != C.XOpenDisplay(ch) { return } C.XGrabKey( dpy, C.int(C.XKeysymToKeycode(dpy, C.XStringToKeysym(C.CString("F1")))), C.Mod1Mask, C.XDefaultRootWindow(dpy), 1, C.GrabModeAsync, C.GrabModeAsync, ) C.XGrabButton( dpy, 1, C.Mod1Mask, C.XDefaultRootWindow(dpy), 1, C.ButtonPressMask|C.ButtonReleaseMask|C.PointerMotionMask, C.GrabModeAsync, C.GrabModeAsync, C.None, C.None, ) C.XGrabButton( dpy, 3, C.Mod1Mask, C.XDefaultRootWindow(dpy), 1, C.ButtonPressMask|C.ButtonReleaseMask|C.PointerMotionMask, C.GrabModeAsync, C.GrabModeAsync, C.None, C.None, ) start.subwindow = C.None for { C.XNextEvent(dpy, &ev) if unionToInt(ev) == C.KeyPress && unionToXKeyEvent(ev).subwindow != C.None { C.XRaiseWindow(dpy, unionToXKeyEvent(ev).subwindow) } else if unionToInt(ev) == C.ButtonPress && unionToXButtonEvent(ev).subwindow != C.None { C.XGetWindowAttributes(dpy, unionToXButtonEvent(ev).subwindow, &attr) start = *unionToXButtonEvent(ev) } else if unionToInt(ev) == C.MotionNotify && start.subwindow != C.None { xdiff := unionToXButtonEvent(ev).x_root - start.x_root ydiff := unionToXButtonEvent(ev).y_root - start.y_root var toDiffX C.int var toDiffY C.int if start.button == 1 { toDiffX = xdiff toDiffY = ydiff } var toWidth C.int var toHeight C.int if start.button == 3 { toWidth = xdiff toHeight = ydiff } C.XMoveResizeWindow( dpy, start.subwindow, attr.x+toDiffX, attr.y+toDiffY, max(1, attr.width+toWidth), max(1, attr.height+toHeight)) } else if unionToInt(ev) == C.ButtonRelease { start.subwindow = C.None } } }
func setStatus(s *C.char) { C.XStoreName(dpy, C.XDefaultRootWindow(dpy), s) C.XSync(dpy, 1) }