alterator-printers-6.0/000075500000000000000000000000001154637001100152145ustar00rootroot00000000000000alterator-printers-6.0/Makefile000064400000000000000000000010041154637001100166470ustar00rootroot00000000000000NAME=printers DESCRIPTION="Printers administration" INSTALL=/usr/bin/install IMAGE_DIR=$(datadir)/alterator/images/printers/ HELPER_DIR=$(libexecdir)/alterator-printers all: clean: install: install-backend install-ui install-images install-helpers include /usr/share/alterator/build/ui2.mak include /usr/share/alterator/build/backend.mak install-helpers: for i in helpers/*;do $(INSTALL) -Dpm 755 $$i $(HELPER_DIR)/$${i##*/};done install-images: $(INSTALL) -d $(IMAGE_DIR) cp -a images/*.png $(IMAGE_DIR) alterator-printers-6.0/applications/000075500000000000000000000000001154637001100177025ustar00rootroot00000000000000alterator-printers-6.0/applications/printers.desktop000075500000000000000000000003111154637001100231410ustar00rootroot00000000000000[Desktop Entry] Type=Application Categories=X-Alterator-System Icon=printers Terminal=false Name=Printers Name[ru_RU]=Принтеры X-Alterator-URI=/printers X-Alterator-Weight=40 X-Alterator-UI=qt alterator-printers-6.0/backend3/000075500000000000000000000000001154637001100166665ustar00rootroot00000000000000alterator-printers-6.0/backend3/cupsd000075500000000000000000000051141154637001100177330ustar00rootroot00000000000000#!/bin/sh dump_file="/var/cache/alterator/printers-drivers.dump" exit_handler() { local rc=$? trap - 0 rm -f -- $TEMPORARY_PPD exit $rc } trap exit_handler 0 1 2 3 9 13 reload_smb() { ! service smb status >/dev/null 2>&1 || service smb reload >/dev/null 2>&1 } LPSTAT="/usr/bin/lpstat" LPADMIN="/usr/sbin/lpadmin" LPR="/usr/bin/lpr" FOOMATIC_PPD_GENERATOR="/usr/bin/foomatic-ppdfile" HELPERSDIR="/usr/lib/alterator-printers" . alterator-sh-functions on_message() { case "$in_action" in list) echo '(' for printer in `LANG=C "$LPSTAT" -a|egrep '^([0-9a-zA-Z_-])+'|cut -f1 -d' '|sed 's,.*,&,'`;do printf '("%s" label "%s")' "$printer" "$printer" done echo ')' ;; delete) "$LPADMIN" -x "$in_prnname" reload_smb write_nop ;; read) echo '(' if [ "$in__objects" = "server" ];then service cups status >/dev/null 2>&1 || echo "nocups #t" [ -s "$dump_file" ] || echo "nodump #t" LANG=C "$LPSTAT" -d| sed -r 's,system default destination:[[:space:]]*,,; s,.*,default \"&\",' else #state if LANG=C "$LPSTAT" -p "$in_prnname"|grep -qs 'enabled';then printf '%s "%s"' "status" "started" else printf '%s "%s"' "status" "stopped" fi #uri URI=`LANG=C "$LPSTAT" -v "$in_prnname"|sed 's,device for[^:]*:[[:space:]]*,,'` printf '%s "%s"' "uri" "$URI" lpoptions -p "$in_prnname"| sed -r "s/.*(printer-info=(('[^']+')|([^'[:space:]]+))).*/\2/; s/'//g; s,.*,description \"&\"," #driver echo "driver" \"`egrep -m2 --with-filename '^\*(Manufacturer|ModelName)' /etc/cups/ppd/"$in_prnname".ppd 2>/dev/null| awk -f "$HELPERSDIR"/dump_ppds.awk`\" fi echo ')' ;; write) if [ "$in__objects" = "test_page" ];then "$LPR" -P "$in_printer" /usr/share/printer-testpages/cupspage.ps elif [ "$in__objects" = "server" ];then "$LPADMIN" -d "$in_default" elif [ "$in__objects" = "dodump" ];then "$HELPERSDIR"/update-printers-db else "$LPADMIN" -p "$in_prnname" -v "$in_uri" ${in_description:+-D "$in_description"} if [ "$in_status" = "started" ];then /usr/sbin/cupsenable "$in_prnname" /usr/sbin/accept "$in_prnname" elif [ "$in_status" = "stopped" ];then /usr/sbin/cupsdisable "$in_prnname" fi if echo "$in_ppd"|grep -q '^/';then ppdfile="$in_ppd" else TEMPORARY_PPD=`mktemp -t "$in_prnname".ppd.XXXXXX` ppdfile="$TEMPORARY_PPD" "$FOOMATIC_PPD_GENERATOR" -p "$in_ppd" >$ppdfile fi "$LPADMIN" -p "$in_prnname" -P "$ppdfile" -o PageSize=A4 reload_smb fi write_nop ;; *) echo '#f' ;; esac } message_loop alterator-printers-6.0/backend3/printer_detect000075500000000000000000000041221154637001100216260ustar00rootroot00000000000000#!/bin/sh dump_file="/var/cache/alterator/printers-drivers.dump" CUPS_USB_BACKEND="/usr/lib/cups/backend/usb" reload_parport() { modprobe -r lp parport_pc parport modprobe lp } get_name() { cat /proc/sys/dev/parport/"$2"/autoprobe| grep "$1"| sed -r "s,^$1:(.*);,\1,; s,^hp ,," #HACK for HP LaserJet 1150 } . alterator-sh-functions on_message() { case "$in_action" in list) echo '(' #reload parport drivers to read autodetect information reload_parport pushd /proc/sys/dev/parport >/dev/null 2>&1 for i in parport[0-9]* do [ -d "$i" ] && printf '("%s")' "$i" done popd >/dev/null 2>&1 "$CUPS_USB_BACKEND" | sed -r 's,^([^"]+)",,; s,([^"]+)".*,\1,'| grep -v "Unknown"| sed -r 's,.*,\(\"usb:&\"\),' echo ')' ;; read) echo '(' if echo "$in__objects"|grep -qs parport; then if grep -qs 'CLASS:PRINTER;' /proc/sys/dev/parport/"$in__objects"/autoprobe;then model=$(get_name MODEL "$in__objects") make=$(get_name MANUFACTURER "$in__objects"|sed 's,HEWLETT-PACKARD,HP,i') drv=$(grep -m1 -i "^$make;$model" "$dump_file"| sed -r 's,(.*);(.*);(.*),\1;\2,') [ -z "$make" -a -z "$model" ] || printf '%s "%s"' "make_model" "$make $model" [ -z "$drv" ] || printf '%s "%s"' "driver" "$drv" fi number=$(echo "$in__objects"|sed s,parport,,) printf '%s "%s"' "uri" "parallel:/dev/lp$number" elif echo "$in__objects"|grep -qs "^usb:"; then name=$(echo "$in__objects"|sed 's,^usb:,,') uri=$($CUPS_USB_BACKEND|grep "\"$name\""|tail -n1|cut -f2 -d' ') make_model=$(echo "$uri"| sed -r 's,usb://([^/]+)/([^/]+),\1;\2,; s,\?serial=.*,,; s,%20, ,g; s,^HP\;hp ,HP\;,') #HACK for HP LaserJet 1150 if [ -n "$make_model" ]; then drv=$(grep -m1 -i "^$make_model" "$dump_file"| sed -r 's,(.*);(.*);(.*),\1;\2,') [ -z "$make_model" ] || printf '%s "%s"' "make_model" "`echo $make_model | sed 's/;/ /g'`" [ -z "$drv" ] || printf '%s "%s"' "driver" "$drv" fi printf '%s "%s"' "uri" "$uri" fi echo ')' ;; *) echo '#f' ;; esac } message_loop alterator-printers-6.0/backend3/printer_drivers000075500000000000000000000010741154637001100220370ustar00rootroot00000000000000#!/bin/sh dump_file="/var/cache/alterator/printers-drivers.dump" . alterator-sh-functions on_message() { case "$in_action" in list) echo '(' case "$in__objects" in /) awk -F';' '{print "(\"" $1 "\")" }' "$dump_file" | sort -u ;; *) awk -F';' "/^$in__objects/"'{print "(\"" $2 "\")" }' "$dump_file" ;; esac echo ')' ;; read) echo '(' make_n_model=`echo $in__objects | tr "/" ";"` awk -F';' "/$make_n_model/"'{print "id \"" $3 "\""}' "$dump_file" echo ')' ;; *) echo '#f' ;; esac } message_loop alterator-printers-6.0/helpers/000075500000000000000000000000001154637001100166565ustar00rootroot00000000000000alterator-printers-6.0/helpers/dump_foomatic.awk000075500000000000000000000006721154637001100222200ustar00rootroot00000000000000BEGIN { OFS=";" } function untag(tagname) { gsub("[[:space:]]*<" tagname ">[[:space:]]*",""); gsub("[[:space:]]*.*",""); } /<\/printer>/ { print make,model,id; } // { if (in_autodetect == 0) { untag("make"); make=$0; } } // { if (in_autodetect == 0) { untag("model"); model=$0; } } // { in_autodetect=1; } /<\/autodetect>/ { in_autodetect=0; } // { untag("id"); id=$0; } alterator-printers-6.0/helpers/dump_ppds.awk000075500000000000000000000006121154637001100213570ustar00rootroot00000000000000BEGIN { FS=":" ; OFS=";" ; } function unquote() { gsub("^[[:space:]]*\"[[:space:]]*","",$3); gsub("[[:space:]]*\"[\r[:space:]]*$","",$3); } function results() { print manufacturer,model,$1; manufacturer=""; model=""; } /.*:\*Manufacturer/ { unquote(); manufacturer=$3; if (model != "") results(); } /.*:\*ModelName:/ { unquote(); model=$3; if (manufacturer != "") results(); } alterator-printers-6.0/helpers/update-printers-db000075500000000000000000000007411154637001100223170ustar00rootroot00000000000000#!/bin/sh HELPERSDIR="/usr/lib/alterator-printers" FOOMATIC_OVERVIEW=/usr/bin/foomatic-combo-xml dump_file="/var/cache/alterator/printers-drivers.dump" >"$dump_file" [ -d /usr/share/foomatic ] && "$FOOMATIC_OVERVIEW" -O -l /usr/share/foomatic/|/bin/awk -f "$HELPERSDIR"/dump_foomatic.awk >>"$dump_file" [ -d /usr/share/cups/model ] && /bin/egrep -m2 --with-filename '^\*(Manufacturer|ModelName)' /usr/share/cups/model/*| /bin/awk -f "$HELPERSDIR"/dump_ppds.awk >>"$dump_file" alterator-printers-6.0/images/000075500000000000000000000000001154637001100164615ustar00rootroot00000000000000alterator-printers-6.0/images/pause.png000064400000000000000000000006511154637001100203060ustar00rootroot00000000000000PNG  IHDRabKGDH pHYs G>tIME9$6IDATxJ0o O^_^Ku; L?ǣr69pu >; [k˹z^P)BIENDB`alterator-printers-6.0/images/play.png000064400000000000000000000011331154637001100201320ustar00rootroot00000000000000PNG  IHDRR;^jbKGD pHYs |tIME(,^*7IDATxK`1i.FTGE:8A[.wʥN;/-(Y* 8.ZiRPRڙZ={FȲ[!%&g~o( 9iJ{L3-~J,X+KsdS_$qU`e;kiZtpULTw^rM; hγjpMQWy,Ϸ@ lgX2 FFﳲjhSzi<`grlH_Id*N. @pR=EF%B!YI<{g EA"L<rqyI/~ 3`FrtW/x8BL F<Eǩv;:66Ff)ł3 P:h^ h^Q:P,8_juanaſ_b#]Qb'1IENDB`alterator-printers-6.0/ui/000075500000000000000000000000001154637001100156315ustar00rootroot00000000000000alterator-printers-6.0/ui/printers/000075500000000000000000000000001154637001100174775ustar00rootroot00000000000000alterator-printers-6.0/ui/printers/index.scm000064400000000000000000000340071154637001100213160ustar00rootroot00000000000000(document:surround "/std/base") (document:insert "/std/functions") (document:envelop with-translation _ "alterator-printers") (define (get-printers) (woo-catch/message (thunk (woo-list-names "/cupsd/printers")))) (define (get-server) (woo-catch/message (thunk (woo-read-first "/cupsd/server")))) (define (getprinter name) (woo-catch/message (thunk (woo-read-first "/cupsd" 'prnname name)))) ;current printer data (define printer-type (make-cell #f)) (define printer-data (make-cell #f)) ;edit/new data (define printer-status (make-cell #f)) (define printer-uri (make-cell #f)) (define printer-driver (make-cell #f)) ;edit/new mode (define mode (make-cell 'edit)) (define (redraw-status-button) (state-button text (if (cell-ref printer-status) (_ "stop printer") (_ "start printer"))) (state-button pixmap (if (cell-ref printer-status) "printers/pause.png" "printers/play.png"))) (define (update-status-button prn) (cell-set! printer-status (string=? (woo-get-option prn 'status) "started")) (redraw-status-button)) (define (extract-model prn) (let* ((driver (woo-get-option prn 'driver)) (name (cond-cadr (string-cut driver #\;)))) (or name (_ "Unknown model")))) (define (update-connection-button mdl) (connection-button text (string-append (cond ((string=? (cell-ref printer-type) "smb") (_ "Samba")) ((string=? (cell-ref printer-type) "lcl") (_ "Local")) (else (_"Unknown connection"))) "/" (or mdl (_ "Unknown model"))))) (define (update-connection uri) (cond ((string-prefix? "smb://" uri) (cell-set! printer-type "smb")) ((string-prefix? "parallel:" uri) (cell-set! printer-type "lcl")) ((string-prefix? "usb:" uri) (cell-set! printer-type "lcl")) (else (cell-set! printer-type "sel")))) (define (fill-info name) (let ((printer (getprinter name))) (cell-set! printer-data printer) (cell-set! printer-uri (woo-get-option printer 'uri)) (cell-set! printer-driver (string-cut (woo-get-option printer 'driver) #\;)) (printername text name) (printerdesc text (woo-get-option printer 'description)) (update-connection (woo-get-option printer 'uri)) (update-connection-button (extract-model printer)) (update-status-button printer))) (define (mark-default name default) (cons name (if (string=? name default) "theme:radio-on" "theme:radio-off"))) (define (do-default) (define (extract-text x) (car (vector-ref x 0))) (woo-catch/message (thunk (let ((old-idx (string-list-index (woo-get-option (get-server) 'default) (map extract-text (printerlist rows)))) (new-idx (printerlist current))) (woo-write "/cupsd/server" 'default (printerlist text)) (printerlist row-item old-idx (cons #f "theme:radio-off") row-item new-idx (cons #f "theme:radio-on")))))) (define (do-test-page) (woo-catch/message (thunk (woo-write "/cupsd/test_page" 'printer (printerlist text))))) (define (do-edit) (switch-state)) (define (do-new) (switch-state) ;new specific actions (cell-set! mode 'new) (printername activity #t) (printerdesc activity #t) (printername text "") (printerdesc text "") (cell-set! printer-data '()) (cell-set! printer-driver #f) (cell-set! printer-uri #f) (cell-set! printer-type "sel") (connection-button text (_ "Create connection")) (cell-set! printer-status #t) (redraw-status-button) (printerlist append-row (cons (_ "NEW PRINTER") "theme:radio-off")) (printerlist current (- (printerlist count) 1))) ;TODO: add support for change type here (define (change-connection) (error-message visibility #f) (let ((result (document:popup (string-append "/printers/" (cell-ref printer-type)) 'printer-uri (or (cell-ref printer-uri) (woo-get-option (cell-ref printer-data) 'uri)) 'printer-driver (or (cell-ref printer-driver) (string-cut (woo-get-option (cell-ref printer-data) 'driver) #\;))))) (and (pair? result) (begin (cell-set! printer-uri (car result)) (cell-set! printer-driver (cdr result)) (update-connection (cell-ref printer-uri)) (update-connection-button (cond-cadr (cell-ref printer-driver))))))) (define (check-buttons) ((widgets edit-button delete-button testpage-button default-button) activity (> (printerlist count) 0))) (define (switch-state) (error-message visibility #f) (printerlist activity (not (printerlist activity)));switch (let ((state (printerlist activity))) (group1 visibility state) (group2 visibility (not state)) (printerdesc activity (not state)) (for-each (lambda(w) (w activity (not state))) (list connection-button state-button)) (for-each (lambda(w) (w activity state)) (list testpage-button default-button))) (check-buttons)) (define (write-error msg) (error-message visibility #t) (error-message text (string-append "" msg "")) #f) (define (cleanup-model-name vendor model) (and vendor model (let* ((cutted (substring model (string-length vendor) (string-length model))) (start (string-skip cutted #\space))) (substring cutted start (string-length cutted))))) (define (get-driver) (let* ((vendor (car (cell-ref printer-driver))) (model (cleanup-model-name vendor (cadr (cell-ref printer-driver))))) (woo-get-option (woo-read-first (string-append "/printer_drivers/" vendor "/" model)) 'id))) (define (modify-printer) (cond ((empty-string? (printername text)) (write-error (_ "You should define printer name"))) ((not (string-match "^([0-9a-zA-Z_-])+$" (printername text))) (write-error (_ "Printer name doesn't match required pattern '^([0-9a-zA-Z_-])+$'"))) ((and (eq? (cell-ref mode) 'new) (not (cell-ref printer-driver))) (write-error (_ "You should define printer model"))) ((and (eq? (cell-ref mode) 'new) (empty-string? (cell-ref printer-uri))) (write-error (_ "You shoud define printer connection"))) (else (splash-message (_ "Generating printer driver...")) (begin-1 (woo-catch/message (thunk (document:release) (woo-write "/cupsd" 'prnname (printername text) 'uri (cell-ref printer-uri) 'ppd (or (caddr (cell-ref printer-driver)) (get-driver)) 'description (printerdesc text) 'status (if (cell-ref printer-status) "started" "stopped")))) (splash-message))))) (define (do-delete) (and (eq? 'yes (document:popup-warning (string-append (_ "Are you really want to remove printer ") (printerlist text) " ?") 'no 'yes)) (woo-catch/message (thunk (woo-delete "/cupsd" 'prnname (printerlist text)) (printerlist remove (printerlist current)) (check-buttons) (and (> (printerlist count) 0) (begin (printerlist current 0)) (fill-info (printerlist text))))))) (define (generate-dump) (splash-message (_ "Generating drivers cache...")) (begin-1 (woo-catch/message (thunk (document:release) (woo-write "/cupsd/dodump"))) (splash-message))) (hbox (vbox (document:id printerlist (listbox header (vector (_ "Printers")) (when selected ((widgets testpage-button default-button edit-button delete-button) activity #t) (fill-info (printerlist text))))) (hbox (document:id testpage-button (button (_ "Test page") activity #f (when clicked (do-test-page)))) (document:id default-button (button (_ "Made default") activity #f (when clicked (do-default)))) (button (_ "Generate drivers cache") (when clicked (generate-dump))))) (vbox (groupbox (_ "Printer options") (hbox (label (_ "Name:")) (document:id printername (edit "" activity #f (when changed (printerlist row-item (printerlist current) (printername text)))))) (hbox (label (_ "Description:")) (document:id printerdesc (edit "" activity #f))) (document:id connection-button (button (_ "Connection/Model") activity #f (when clicked (change-connection)))) (document:id state-button (button (_ "stop printer") pixmap "printers/pause.png" activity #f (when clicked (cell-set! printer-status (not (cell-ref printer-status))) (redraw-status-button)))) (document:id error-message (label "" visibility #f))) (document:id group1 (hbox (document:id edit-button (button (_ "Edit") activity #f (when clicked (do-edit)))) (document:id new-button (button (_ "New") (when clicked (do-new)))) (document:id delete-button (button (_ "Delete") activity #f (when clicked (do-delete)))))) (document:id group2 (hbox visibility #f (document:id accept-button (button (_ "Accept") (when clicked (and (modify-printer) (begin (and (eq? (cell-ref mode) 'new) (begin (cell-set! mode 'edit) (printername activity #f))) (fill-info (printerlist text)) (switch-state)))))) (document:id discard-button (button (_ "Discard") (when clicked (case (cell-ref mode) ((new) (cell-set! mode 'edit) (printername activity #f) (printerlist remove (printerlist current)) (and (> (printerlist count) 0) (printerlist current 0)))) (and (> (printerlist count) 0)(fill-info (printerlist text))) (switch-state)))))))) (button (_ "Quit") (when clicked (document:end))) (document:root (when loaded (let ((data (get-server))) (printerlist rows (map (lambda (name) (mark-default name (woo-get-option data 'default))) (or (get-printers) '()))) (if (woo-get-option data 'nodump #f) (generate-dump)) (if (woo-get-option data 'nocups #f) (document:popup-critical (_ "Service cupsd is stopped") 'ok))))) alterator-printers-6.0/ui/printers/lcl.scm000064400000000000000000000057301154637001100207620ustar00rootroot00000000000000(document:surround "/std/base") (document:envelop with-translation _ "alterator-printers") title (_ "Local connection setup") (define (get-devices) (woo-catch/message (thunk (woo-list-names "/printer_detect")))) (set-global! 'printer-model (or (global 'printer-driver) (list "" "" ""))) (set-global! 'load-auto (make-cell #f)) (define printer-uri (make-cell (or (global 'printer-uri) ""))) (define (getdevice name) (woo-catch/message (thunk (woo-read-first (string-append "/printer_detect/" name))))) (define (get-current devices-lst) (list-index (lambda(x) (let* ((device (getdevice x)) (uri (woo-get-option device 'uri))) (string=? uri (cell-ref printer-uri)))) devices-lst)) (hbox (label (_ "Detected printer:")) (document:id auto-detect (label ""))) (document:id devicelist (listbox header (vector (_ "Devices")) (when selected (let* ((device (getdevice (devicelist text))) (driver (woo-get-option device 'driver #f)) (driver-lst (and driver (string-cut driver #\;))) (uri (woo-get-option device 'uri)) (make_n_model (woo-get-option device 'make_model))) (if make_n_model (auto-detect text make_n_model) (auto-detect text "")) (and driver (begin (set-global! 'printer-model (list (car driver-lst) (string-append (car driver-lst) " " (cadr driver-lst)))) ((cell-ref (global 'load-auto))))) (cell-set! printer-uri uri))))) (document:surround "/printers/mdl") (hbox (button (_ "OK") (when clicked (document:end (cons (cell-ref printer-uri) (list (vendorlist text) (string-append (vendorlist text) " " (modellist text)) #f))))) (button (_ "Cancel") (when clicked (document:end #f)))) (document:root (when loaded (devicelist (let ((devices (or (get-devices) '()))) (list (rows devices) (current (or (get-current devices) -1))))))) alterator-printers-6.0/ui/printers/mdl.scm000064400000000000000000000040431154637001100207600ustar00rootroot00000000000000(document:insert "/std/functions") (document:envelop with-translation _ "alterator-printers") (define (cleanup-model-name vendor model) (and (not-empty-string? vendor) (not-empty-string? model) (let* ((cutted (substring model (string-length vendor) (string-length model))) (start (string-skip cutted #\space))) (substring cutted start (string-length cutted))))) (define (get-vendors) (woo-catch/message (thunk (sort (woo-list-names "/printer_drivers") string (string-length str) size) (string-drop str size)) "")))) ;;(define printer-model (make-cell (global 'printer-driver))) (define printer-uri (drop-header (global 'printer-uri))) (define (extract-user-password str) (and (not-empty-string? str) (let ((sep (string-index printer-uri #\@))) (and sep (string-cut (string-take str sep) #\:))))) (define (extract-group-host-share str) (and (not-empty-string? str) (string-cut (string-drop str (+ 1 (or (string-index printer-uri #\@) -1))) #\/))) (define (check-length lst) (if (and (pair? lst) (= (length lst) 2)) (cons "" lst) lst)) (define smb-u-p (extract-user-password printer-uri)) (define smb-g-h-s (check-length (extract-group-host-share printer-uri))) (define (not-empty-field? f) (not-empty-string? (f text))) (define (allow-ok) (and (not-empty-field? smb-host) (not-empty-field? smb-share) (not-empty-field? smb-user))) (define field-options (list (when changed (ok-button activity (allow-ok))))) (define (made-user-password) (string-join (delete "" (list (smb-user text) (smb-password text))) ":")) (define (made-group-host-share) (string-join (delete "" (list (smb-workgroup text) (smb-host text) (smb-share text))) "/")) (define (made-uri) (string-append "smb://" (string-join (delete "" (list (made-user-password) (made-group-host-share))) "@"))) (define (cond-caddr x) (and (pair? x) (pair? (cdr x)) (pair? (cddr x)) (caddr x))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (vbox (hbox (label (_ "SMB server group:")) (document:id smb-workgroup (edit (or (cond-car smb-g-h-s) "") field-options))) (hbox (label (_ "SMB server host:")) (document:id smb-host (edit (or (cond-cadr smb-g-h-s) "") field-options))) (hbox (label (_ "SMB share name:")) (document:id smb-share (edit (or (cond-caddr smb-g-h-s) "") field-options))) (hbox (label (_ "User name:")) (document:id smb-user (edit (or (cond-car smb-u-p) "") field-options))) (hbox (label (_ "Password:")) (document:id smb-password (edit (or (cond-cadr smb-u-p) "") field-options echo "stars" )))) (document:surround "/printers/mdl") (hbox (document:id ok-button (button (_ "OK" ) activity (and (not-empty-string? (cond-car smb-u-p)) (not-empty-string? (cond-cadr smb-g-h-s)) (not-empty-string? (cond-caddr smb-g-h-s))) (when clicked (document:end (cons (made-uri) (list (vendorlist text) (string-append (vendorlist text) " " (modellist text)))))))) (button (_ "Cancel") (when clicked (document:end #f))))