Skip to content

Instantly share code, notes, and snippets.

@bastos
Created October 31, 2008 17:55
Show Gist options
  • Save bastos/21368 to your computer and use it in GitHub Desktop.
Save bastos/21368 to your computer and use it in GitHub Desktop.
;; From http://alohakun.blog7.fc2.com/blog-entry-929.html with small changes...
(require-extension xlib)
(let ((dpy (xopendisplay #f)))
(assert dpy)
(let ((root (xdefaultrootwindow dpy)))
(xgrabkey dpy XK_F1 MOD4MASK root 1 GRABMODEASYNC GRABMODEASYNC)
(xgrabbutton dpy 1 MOD4MASK root 1 BUTTONPRESSMASK GRABMODEASYNC GRABMODEASYNC NONE NONE)
(xgrabbutton dpy 3 MOD4MASK root 1 BUTTONPRESSMASK GRABMODEASYNC GRABMODEASYNC NONE NONE)
(let ((event (make-xevent))
(attr (make-xwindowattributes))
(start (make-xbuttonevent)))
(let eventloop ()
(xnextevent dpy event)
(cond
((and (eqv? (xevent-type event) KEYPRESS)
(not (eqv? (xevent-xkey-window event) NONE)))
(xraisewindow dpy (xevent-xkey-window event)))
((and (eqv? (xevent-type event) BUTTONPRESS)
(not (eqv? (xevent-xbutton-subwindow event) NONE)))
(xgrabpointer dpy (xevent-xbutton-subwindow event) 1
(bitwise-ior POINTERMOTIONMASK BUTTONRELEASEMASK)
GRABMODEASYNC GRABMODEASYNC NONE NONE CURRENTTIME)
(xgetwindowattributes dpy (xevent-xbutton-subwindow event) attr)
(set-xbuttonevent-type! start (xevent-xbutton-type event))
(set-xbuttonevent-serial! start (xevent-xbutton-serial event))
(set-xbuttonevent-send_event! start (xevent-xbutton-send_event event))
(set-xbuttonevent-display! start (xevent-xbutton-display event))
(set-xbuttonevent-window! start (xevent-xbutton-window event))
(set-xbuttonevent-root! start (xevent-xbutton-root event))
(set-xbuttonevent-subwindow! start (xevent-xbutton-subwindow event))
(set-xbuttonevent-time! start (xevent-xbutton-time event))
(set-xbuttonevent-x! start (xevent-xbutton-x event))
(set-xbuttonevent-y! start (xevent-xbutton-y event))
(set-xbuttonevent-x_root! start (xevent-xbutton-x_root event))
(set-xbuttonevent-y_root! start (xevent-xbutton-y_root event))
(set-xbuttonevent-state! start (xevent-xbutton-state event))
(set-xbuttonevent-button! start (xevent-xbutton-button event))
(set-xbuttonevent-same_screen! start (xevent-xbutton-same_screen event)))
((eqv? (xevent-type event) MOTIONNOTIFY)
(xraisewindow dpy (xevent-xkey-window event))
(let ((xdiff (- (xevent-xbutton-x_root event)
(xbuttonevent-x_root start)))
(ydiff (- (xevent-xbutton-y_root event)
(xbuttonevent-y_root start))))
(xmoveresizewindow dpy (xevent-xmotion-window event)
(+ (xwindowattributes-x attr)
(if (eqv? (xbuttonevent-button start) 1)
xdiff 0))
(+ (xwindowattributes-y attr)
(if (eqv? (xbuttonevent-button start) 1)
ydiff 0))
(max 1 (+ (xwindowattributes-width attr)
(if (eqv? (xbuttonevent-button start) 3)
xdiff 0)))
(max 1 (+ (xwindowattributes-height attr)
(if (eqv? (xbuttonevent-button start) 3)
ydiff 0))))))
((eqv? (xevent-type event) BUTTONRELEASE)
(xungrabpointer dpy CURRENTTIME)))
(eventloop)))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment