;; -*- mode: scheme; -*-
;; simple.scwmrc was system.scwmrc until Scwm-0.99.2

;; Uncomment the below to send a single UDP packet to
;; the scwm usage counter machine at startup
;; The single packet just contains the hostname and version number
;; To disable, set environment variable SCWM_DO_NOT_LOG_USAGE
;;(define thank-scwm-authors-with-usage-note #t)

(define user-image-load-path
  (list (string-append (user-home) "/src/scwm/pixmaps")
	(string-append (user-home) "/src/scwm/bitmaps")))

;;; set path to use for image searches
(set! image-load-path
      (append
       user-image-load-path
       '("/usr/X11/lib/X11/mini-icons" "/usr/X11/include/X11/pixmaps"
         "/usr/lib/icons" "/usr/local/X11/include/X11/pixmaps"
         "/usr/local/lib/icons" "/usr/local/icons"
         "/uns/share/include/X11/pixmaps" "/uns/share/include/X11/bitmaps")
       image-load-path))

;;-------------------------------;;
;; import the scwm modules       ;;

#!
(use-scwm-modules minimal base winops winlist wininfo
		  doc style message-window face
		  preferences style
		  ;optargs winlist-menu)
		  winlist-menu)
!#


(use-modules
 (app scwm minimal)
 (app scwm base)
 (app scwm style)
 (app scwm winops)
 (app scwm winlist)
 (app scwm wininfo)
 (app scwm doc)
 (app scwm message-window)
 (app scwm face)
 ;(app scwm preferences)
 (app scwm optargs)
 (app scwm winlist-menu))


;;-------------------------------;;
;; set some basic styles info    ;;


(define font
  (make-font "-unknown-DejaVu Sans Mono-normal-normal-normal-*-18-*-*-*-m-0-iso10646-1"))

(menu-style #:fg "#eeeeec"
            #:bg "#252a2b"
            #:stipple "blue"
            #:hl-fg "yellow"
            #:font font)

(title-style #:font font #:justify 'left)

(set-icon-font! font)
(set-highlight-foreground! "white")
(set-highlight-background! "blueviolet")
(set-rubber-band-mask! 127)

;;-------------------------------;;
;; set some paths                ;;
;;

;; these are OK for my system, but may need to be changed for
;; yours. This should probably be eventually autoconfed or something.

;;; set path to use for image searches
(set! image-load-path
      (append
       user-image-load-path
       '("/usr/X11/lib/X11/mini-icons" "/usr/X11/include/X11/pixmaps"
         "/usr/lib/icons" "/usr/local/X11/include/X11/pixmaps"
         "/usr/local/lib/icons" "/usr/local/icons"
         "/uns/share/include/X11/pixmaps" "/uns/share/include/X11/bitmaps")
       image-load-path))

;;-------------------------------;;
;; set some window styles        ;;

(window-style "*"
	      #:fg "white" #:bg "navy"
	      #:icon "unknown1.xpm"
	      #:icon-box (list (x- 70) 1 69 (y- 141))
	      #:border-width 6
	      #:focus 'mouse
	      #:mwm-func-hint #t #:mwm-decor-hint #t
	      #:hint-override #t #:decorate-transient #t
	      #:PPosition-hint #f
	      #:lenience #t
	      )
(define desk-widget
  (make-style #:plain-border #t #:sticky #t #:winlist-skip #t
	      #:border-width 3 #:focus 'none))

(window-style "*lock" #:use-style desk-widget)
(window-style "xload" #:no-titlebar #t #:use-style desk-widget)
(window-style "xscreensaver" #:no-titlebar #t #:use-style desk-widget)
(window-style "xbiff" #:no-titlebar #t #:use-style desk-widget)
(window-style "xcalc" #:icon "xcalc.xpm")
(window-style "xman" #:icon "xman.xpm")
(window-style "xmag" #:icon "mag_glass.xpm")
(window-style "Emacs" #:icon "gnu-animal.xpm")
(window-style "XTerm" #:icon "xterm.xpm")


;; People seem to prefer move by full virtual desks
(set-edge-resistance! 500 10)
(set-edge-scroll! (%x 100) (%y 100))


;;-------------------------------;;
;; define some useful menus      ;;


(define window-ops-menu
  (menu
   (list
    (menu-title "Window Ops") menu-separator
    (menuitem "Move" #:action interactive-move)
    (menuitem "Resize" #:action interactive-resize)
    (menuitem "Raise" #:action raise-window)
    (menuitem "Lower" #:action lower-window)
;;    (menuitem "Print" #:action print-window)
    (menuitem "(Un)Window-Shade" #:action toggle-window-shade)
    (menuitem "(De)Iconify" #:action toggle-iconify)
    (menuitem "(Un)Maximize" #:action toggle-maximize-vertical)
    (menuitem "(Un)Stick" #:action toggle-stick)
    (menuitem "(Un)Keep On Top" #:action toggle-on-top)
    menu-separator
    (menuitem "Close" #:action close-window)
    (menuitem "Delete" #:action delete-window)
    (menuitem "Destroy" #:action destroy-window)
    menu-separator
    (menuitem "Refresh Screen" #:action refresh))))

(define* (popup-ops)
  ""
  (interactive)
  (popup-menu window-ops-menu))

;; Hack to let quit work
(set-procedure-property! quit 'interactive #t)

(define menu-quit-verify
  (menu
   (list
    (menu-title "Really quit scwm?") menu-separator
    ;;(menuitem "Yes" #:action scheme-quit)
    (menuitem "Yes" #:action quit)
    (menuitem "No" #:action #f)
    menu-separator
    (menuitem "Restart scwm" #:action (lambda () (restart "scwm"))))))

(define (quit-verify)
  (popup-menu menu-quit-verify))

(define desk-menu
  (menu
   (list
    (menu-title "Desks") menu-separator
    (menuitem "Desk 1" #:action (lambda () (set-current-desk! 0)))
    (menuitem "Desk 2" #:action (lambda () (set-current-desk! 1)))
    (menuitem "Desk 3" #:action (lambda () (set-current-desk! 2)))
    (menuitem "Desk 4" #:action (lambda () (set-current-desk! 3))))))

(define util-menu
  (menu
   (list
    (menu-title "Utilities") menu-separator
    ;(menuitem "Preferences..." #:action scwm-options-dialog)
    menu-separator
    (menuitem "urxvt" #:action (lambda () (execute "urxvt")))
    (menuitem "emacs" #:action (lambda () (execute "emacsclient -c -a emacs")))
    (menuitem "firefox" #:action (lambda () (execute "firefox")))
    (menuitem "top" #:action
	       (lambda () (execute "urxvt -T Top -n Top -e top")))
    menu-separator
    (menuitem "Desks" #:action desk-menu)
    menu-separator
    (menuitem "Exit scwm" #:action menu-quit-verify))))

(define* (popup-util)
  ""
  (interactive)
  (popup-menu util-menu))

(define (make-small-window-ops-menu w)
  (menu
   (list
;;    (menu-title "Window Ops2")
;;    menu-separator
    (menuitem "Move" #:action interactive-move)
    (menuitem "Resize" #:action interactive-resize)
    (menuitem "Raise" #:action raise-window)
    (menuitem "Lower" #:action lower-window)
    (menuitem "Iconify" #:action iconify-window)
    menu-separator
    (menuitem "More..." #:action
	      (menu
	       (list
		(menuitem (if (maximized? w)
			      "Unmaximize"
			      "Maximize")
			  #:action toggle-maximize-vertical)
		(menuitem (if (sticky-window? w)
			      "Unstick"
			      "Stick") #:action toggle-stick)
		(menuitem (if (shaded-window? w)
			      "UnWindow-Shade"
			      "Window-Shade")
			  #:action toggle-window-shade)
		(menuitem (if (kept-on-top? w)
			      "UnKeep On Top"
			      "Keep On Top") #:action toggle-on-top))))
    menu-separator
    (menuitem "Close" #:action close-window)
    (menuitem "Destroy" #:action destroy-window))))

(define* (popup-small-ops)
  "" (interactive)
  (popup-menu (make-small-window-ops-menu (get-window))))


;; now set some mouse and key bindings ;;

;; first our root menus
(bind-mouse 'root 1 popup-util)
(bind-mouse 'root 2 popup-ops)
(bind-mouse 'root 3 (lambda ()
		      (show-window-list-menu #f #f #:show-geometry #t)))
(bind-mouse 'root "M-3" (lambda () (popup-menu desk-menu)))


;; window buttons
(bind-mouse 'left-button-1 1 popup-small-ops)
(bind-mouse 'right-button-1 1 toggle-maximize-vertical)
(bind-mouse 'right-button-2 1 iconify-window)

;; operations on parts of the window
(bind-mouse '(frame-corners frame-sides) 2 popup-small-ops)
(bind-mouse 'frame-corners 1 resize-or-raise)
(bind-mouse 'frame-sides 1 move-or-raise)

(define* (move-or-shade)
  ""
  (interactive)
  (case (mouse-event-type)
    ((double-click) (toggle-window-shade))
    (else (move-or-raise))))

(bind-mouse 'title 1 move-or-shade)
(bind-mouse 'title 3 lower-window)


;; key bindings for the menus
(bind-key 'all "M-F1" popup-util)
(bind-key 'all "M-F2" popup-ops)

;; in case of emergency, hit Control-Meta-Shift-Q
(bind-key 'all "C-M-S-q" quit-verify)

;; some stuff for icons
(define* (move-or-deiconify)
  ""
  (interactive)
  (case (mouse-event-type)
    ((motion) (interactive-move))
    ((double-click) (deiconify-window))))

(bind-mouse 'icon 1 move-or-deiconify)
(bind-mouse 'icon 2 deiconify-window)



;; move the pointer with the keyboard
(bind-key 'all "M-Left" (lambda () (move-pointer (%x -1) 0)))
(bind-key 'all "M-Right" (lambda () (move-pointer (%x 1) 0)))
(bind-key 'all "M-Up" (lambda () (move-pointer 0 (%y -1))))
(bind-key 'all "M-Down" (lambda () (move-pointer 0 (%y 1))))

;; move the viewport with the keyboard
(bind-key 'all "C-M-Left" (lambda () (move-viewport (%x -100) 0)))
(bind-key 'all "C-M-Right" (lambda () (move-viewport (%x 100) 0)))
(bind-key 'all "C-M-Up" (lambda () (move-viewport 0 (%y -100))))
(bind-key 'all "C-M-Down" (lambda () (move-viewport 0 (%y 100))))

;; rotate the current window with the keyboard
(bind-key 'all "C-S-Tab"
	  (lambda ()
	    (next-window #:only visible? #:except iconified-window?)))

(bind-key 'all "M-S-Tab"
	  (lambda ()
	    (prev-window #:only visible? #:except iconified-window?)))