Sawfish
Scripts quick access edit this


Synopsis[]

Another background selector.

Description[]

This script makes use of a custom widget (a gtk file chooser with embedded preview).

Installation[]

Place background.jl in ~/.sawfish/lisp.

Then place preview-image-selector.jl in /usr/share/sawfish/lisp/sawfish/gtk/widgets or in $SAWFISH_USER_LISP_DIR/sawfish/gtk/widgets.

Put this code in ~/.sawfishrc:

(require 'backgrounds)
(add-hook 'after-initialization-hook set-background-hook)


Code[]

;; background.jl
;; Based on Backgrounds-hack.jl
;; Author: Lucas Pandolfo

(defun set-background (path)
  (cond ((null path) nil)
  	(t (system (concat background-set-app " \"" path "\" &"))
  	   (if (not (null menu-changes-default-bg))
  	       (setq root-background path)))))

(defun set-background-hook ()
  (set-background root-background))


;; CUSTOMIZATION STUFF
(defgroup background "Background")

(defcustom root-background nil
  "Current root background"
  :type preview-image-selector
  :group background
  :after-set set-background-hook)

(defcustom background-set-app "fbsetbg"
  "Application to set desktop background"
  :type program-name
  :group background
  :after-set set-background-hook)

(defcustom menu-changes-default-bg nil
  "Does the menu change the default background?"
  :type boolean
  :group background)

(provide 'background)


;; preview-image-selector.jl
;; Based on file.jl
;; Author: Lucas Pandolfo
;; TODO: -Resize preview preserving aspect

(define-structure sawfish.gtk.widgets.preview-image-selector

    (export )

    (open rep
	  rep.system
          gui.gtk-2.gtk
          sawfish.gtk.widget)

  (define (make-preview-item changed-callback)
    (let* ((box (gtk-hbox-new nil box-spacing))
	   (entry (gtk-entry-new))
	   (button (gtk-file-chooser-button-new '() 'open))
	   (preview (gtk-image-new)))
      (gtk-container-set-border-width box box-border)
      (gtk-box-pack-start box entry)
      (gtk-box-pack-start box button)
      (when changed-callback
	(g-signal-connect
	 entry "changed" (make-signal-callback changed-callback)))

      (g-signal-connect button "update-preview" 
			(lambda (w) 
			  (let* ((filename (gtk-file-chooser-get-preview-filename w))
				 (pixbuf (gdk-pixbuf-new-from-file filename)))
			    (if pixbuf
				(progn (gtk-image-set-from-pixbuf preview (gdk-pixbuf-scale-simple pixbuf 256 200 'bilinear))
				       (gtk-file-chooser-set-preview-widget-active button t))
				(gtk-file-chooser-set-preview-widget-active button nil)))))

      (gtk-file-chooser-set-preview-widget button preview)

      (g-signal-connect button "file-set" (lambda (w) 
					    (gtk-entry-set-text entry (gtk-file-chooser-get-filename button))))
      (gtk-widget-show box)

      (lambda (op)
	(case op
	  ((set) (lambda (x)
		   (gtk-entry-set-text entry (and (stringp x) x))))
	  ((clear) (lambda ()
		     (gtk-entry-set-text entry "")))
	  ((ref) (lambda () (gtk-entry-get-text entry)))
	  ((gtk-widget) box)
	  ((validp) (lambda (x) (stringp x)))))))

  (define-widget-type 'preview-image-selector make-preview-item))