summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Gottwald <alexander.gottwald@s1999.tu-chemnitz.de>2004-09-15 16:34:17 +0000
committerAlexander Gottwald <alexander.gottwald@s1999.tu-chemnitz.de>2004-09-15 16:34:17 +0000
commitc4baf5cfa9e906cfb3fed738f11d8ec8d0ff535b (patch)
treea897b55362cea1030d87f5960ec1db434742be5f
parentf9fb54809c56e625c1d72beb96157e20aab17412 (diff)
Pull XORG-6_8_0 to CYGWIN branchCYGWIN-6_8_0-MERGE
-rw-r--r--Xedit-noxprint.ad462
-rw-r--r--Xedit-xprint.ad559
-rw-r--r--commands.c130
-rw-r--r--hook.c4
-rw-r--r--ispell.c24
-rw-r--r--lisp/internal.h2
-rw-r--r--lisp/lisp.c2
-rw-r--r--lisp/modules/xedit.lsp2
-rw-r--r--lisp/private.h2
-rw-r--r--lisp/string.c2
-rw-r--r--print.c390
-rw-r--r--print.h47
-rw-r--r--printdialog.c1353
-rw-r--r--printdialog.h69
-rw-r--r--printdialogprivates.h176
-rw-r--r--util.c2
-rw-r--r--xedit.c30
-rw-r--r--xedit.h7
18 files changed, 3221 insertions, 42 deletions
diff --git a/Xedit-noxprint.ad b/Xedit-noxprint.ad
new file mode 100644
index 0000000..16334a3
--- /dev/null
+++ b/Xedit-noxprint.ad
@@ -0,0 +1,462 @@
+! $XFree86: xc/programs/xedit/Xedit.ad,v 1.23 2002/09/22 07:09:05 paulo Exp $
+
+*geometry: 590x440
+*input: TRUE
+*enableBackups: True
+*backupNameSuffix: ~
+*changedBitmap: xlogo11
+*international: True
+
+*hints:\
+Use Control-S and Control-R to Search.\n\
+Use Control-Shift-_ to Undo. Control-G to switch between Undo and Redo.\n\
+Use Control-A to jump to the beginning of the line.\n\
+Use Control-E to jump to the end of the line.\n\
+Use Control-T to transpose characters.\n\
+Use Control-K to cut to the end of the line. Control-Y to paste.\n\
+Use Control-Q to escape control characters.\n\
+Use Control-U[,<number>] to multiply actions. Control-G to cancel.\n\
+Use Control-Z to scroll one line up. Meta-Z to scroll one line down.\n\
+Use Meta-Q to format a paragraph.\n\
+Use Right-Button to extend selections.\n\
+Use Meta-I to insert a file.\n\
+Use Control-W to delete a selection, and/or jump to the selection mark.\n\
+Use Control-X,Control-F to find a file. Tab for filename completion.\n\
+Use Control-X,Control-S to save.\n\
+Use Control-X,Control-C to exit.\n\
+Use Control-C to paste the selection at CUT_BUFFER0.\n\
+Use Control Left-Button to popup the File Menu.\n\
+Use Control Middle-Button to popup the Edit Menu.\n\
+Use Control Right-Button to popup the Option Menu.\n\
+Use Control-X,Tab to Indent.\n\
+Use Control-X,0 to delete current splitted window.\n\
+Use Control-X,1 to delete other splitted window.\n\
+Use Control-X,2 to split the window vertically.\n\
+Use Control-X,3 to split the window horizontally.\n\
+Use Control-X,b to switch to another file.\n\
+Use Control-X,d to list directory. Control-G to Cancel.\n\
+Use Control-X,k to close file being edited.\n\
+Use Control-X,o to switch to another splitted window.\n\
+Use Control-X,u to undo. Control-G to switch between Undo and Redo.\n\
+Use Insert to toggle Overwrite mode.\n\
+Use Control-G to interrupt the lisp subprocess
+
+*formWindow*defaultDistance: 2
+*formWindow.?.borderWidth: 0
+*formWindow.min: 18
+*formWindow.max: 18
+*formWindow.showGrip: False
+*positionWindow.fromHoriz: labelWindow
+*positionWindow.horizDistance: 0
+*positionWindow.left: chainRight
+*positionWindow.right: chainRight
+*positionWindow.width: 90
+*positionWindow.label: error
+*positionWindow.justify: left
+*labelWindow*justify: center
+*labelWindow*label: no file yet
+*labelWindow.left: chainLeft
+*labelWindow.right: chainRight
+
+*quit.label: Quit
+*quit.tip: Close xedit window
+*save.label: Save
+*save.tip: Save current file
+*load.label: Load
+*load.tip: Load a new file
+
+*buttons*orientation: horizontal
+*buttons*showGrip: False
+*buttons.min: 18
+
+*messageWindow.height: 50
+*messageWindow.min: 18
+*Paned*Text*allowResize: True
+
+*messageWindow.autoFill: False
+*messageWindow.scrollVertical: Never
+
+*editWindow.autoFill: False
+*editWindow.scrollVertical: Always
+*editWindow.showGrip: True
+xedit.textSource*enableUndo: True
+
+*bc_label*label: Use Control-S and Control-R to Search.
+*bc_label*showGrip: False
+*bc_label.min: 18
+
+*dirlabel.showGrip: False
+*dirlabel.min: 18
+*dirlabel.max: 18
+
+*dirwindow.defaultColumns: 0
+*dirwindow.verticalList: True
+
+*viewport.forceBars: True
+*viewport.allowVert: 1
+
+*insertFile*text.width: 141
+*insertFile*text.?.pieceSize: 256
+*search*searchText.width: 157
+*search*replaceText.width: 157
+*search*case.horizDistance: 25
+*search*Text.?.pieceSize: 256
+
+*SimpleMenu.BackingStore: NotUseful
+*SimpleMenu.menuLabel.vertSpace: 80
+*SimpleMenu.SmeBSB.HorizontalMargins: 16
+*SimpleMenu.justify: center
+*SimpleMenu.menuLabel.height: 250
+*SimpleMenu*cursor: left_ptr
+
+*fileMenu.label: File Menu
+*optionsMenu.label: Option Menu
+*optionsMenu.ispell.label: ispell...
+*editMenu.label: Edit Menu
+*editMenu.wrapMenuItem.label: Wrapping
+*editMenu.wrapMenuItem.leftBitmap: menu12
+*wrapMenu.never.label: Never
+*wrapMenu.line.label: Line
+*wrapMenu.word.label: Word
+*editMenu.autoFill.label: Auto Fill
+*editMenu.justifyMenuItem.label: Justification
+*editMenu.justifyMenuItem.leftBitmap: menu12
+*justifyMenu.left.label: Left
+*justifyMenu.right.label: Right
+*justifyMenu.center.label: Center
+*justifyMenu.full.label: Full
+*editMenu.breakColumns.label: Break Columns...
+*editMenu.scrollMenuItem.label: Scrollbars
+*editMenu.scrollMenuItem.leftBitmap: menu12
+*scrollMenu.vertical.label: Vertical
+*scrollMenu.horizontal.label: Horizontal
+*editMenu.modeMenuItem.leftBitmap: menu12
+*editMenu.modeMenuItem.label: Edit Mode
+*editModes.none.label: Plain/None
+
+*TransientShell*Text.translations: #override \
+c<Key>S: no-op(r)\n\
+c<Key>R: no-op(r)\n\
+m<Key>I: no-op(r)
+
+*search.translations: #override \
+<Create>:get-values(my, $w, width, $h, height)\
+ set-values(1, minWidth, $w, minHeight, $h, maxHeight, $h, allowShellResize, False)
+
+*insertFile.title: Insert File
+*insertFile.translations: #override \
+<Create>:get-values(my, $w, width, $h, height)\
+ set-values(1, minWidth, $w, minHeight, $h, maxHeight, $h, allowShellResize, False)
+
+*baseTranslations: #override \
+<Ctrl>X,<Ctrl>C:quit()\n\
+<Ctrl>X,<Ctrl>S:save-file()\n\
+<Ctrl>X,<Ctrl>F:find-file()\n\
+<Key>Escape: line-edit()
+
+*messageWindow.Translations: #override \
+<Ctrl>X,<Ctrl>C:quit()\n\
+<Ctrl>X,<Ctrl>S:save-file()\n\
+<Ctrl>X,<Ctrl>F:find-file()\n\
+<Enter>: no-op()\n\
+<Leave>: no-op()\n\
+<Btn1Down>: set-keyboard-focus() select-start()
+
+*searchText.Translations: #override \
+<Enter>: no-op()\n\
+<Leave>: no-op()\n\
+<Btn1Down>: set-keyboard-focus() select-start()
+
+*replaceText.Translations: #override \
+<Enter>: no-op()\n\
+<Leave>: no-op()\n\
+<Btn1Down>: set-keyboard-focus() select-start()
+
+*editWindow.translations: #override \
+<Ctrl>X,<Ctrl>E:lisp-eval()\n\
+<Ctrl>X,<Key>Tab:indent()\n\
+<Ctrl>X,:<Key>0:delete-window(current)\n\
+<Ctrl>X,:<Key>1:delete-window(other)\n\
+<Ctrl>X,:<Key>2:split-window(vertical)\n\
+<Ctrl>X,:<Key>3:split-window(horizontal)\n\
+<Ctrl>X,!l @Num_Lock<Key>b:switch-source()\n\
+<Ctrl>X,!l <Key>b:switch-source()\n\
+<Ctrl>X,!@Num_Lock<Key>b:switch-source()\n\
+<Ctrl>X,!<Key>b:switch-source()\n\
+<Ctrl>X,!l @Num_Lock<Key>d:dir-window()\n\
+<Ctrl>X,!l <Key>d:dir-window()\n\
+<Ctrl>X,!@Num_Lock<Key>d:dir-window()\n\
+<Ctrl>X,!<Key>d:dir-window()\n\
+<Ctrl>X,!l @Num_Lock<Key>k:kill-file()\n\
+<Ctrl>X,!l <Key>k:kill-file()\n\
+<Ctrl>X,!@Num_Lock<Key>k:kill-file()\n\
+<Ctrl>X,!<Key>k:kill-file()\n\
+<Ctrl>X,!l @Num_Lock<Key>o:other-window()\n\
+<Ctrl>X,!l <Key>o:other-window()\n\
+<Ctrl>X,!@Num_Lock<Key>o:other-window()\n\
+<Ctrl>X,!<Key>o:other-window()\n\
+<Ctrl>X,!l @Num_Lock<Key>u:undo()\n\
+<Ctrl>X,!l <Key>u:undo()\n\
+<Ctrl>X,!@Num_Lock<Key>u:undo()\n\
+<Ctrl>X,!<Key>u:undo()\n\
+<Ctrl>G: xedit-keyboard-reset()\n\
+<Ctrl>J: xedit-print-lisp-eval()\n\
+<Key>Tab: insert-char()\n\
+!l @Num_Lock<Key>b:insert-char()\n\
+!l <Key>b: insert-char()\n\
+!@Num_Lock<Key>b:insert-char()\n\
+!<Key>b: insert-char()\n\
+!l @Num_Lock<Key>d:insert-char()\n\
+!l <Key>d: insert-char()\n\
+!@Num_Lock<Key>d:insert-char()\n\
+!<Key>d: insert-char()\n\
+!l <Key>k: insert-char()\n\
+!l @Num_Lock<Key>k:insert-char()\n\
+!@Num_Lock<Key>k:insert-char()\n\
+!<Key>k: insert-char()\n\
+!l @Num_Lock<Key>o:insert-char()\n\
+!l <Key>o: insert-char()\n\
+!@Num_Lock<Key>o:insert-char()\n\
+!<Key>o: insert-char()\n\
+!l @Num_Lock<Key>u:insert-char()\n\
+!l <Key>u: insert-char()\n\
+!@Num_Lock<Key>u:insert-char()\n\
+!<Key>u: insert-char()\n\
+~s <Key>Insert: toggle-overwrite()\n\
+c l @Num_Lock<Btn1Down>:xedit-focus() popup-menu(fileMenu)\n\
+c @Num_Lock<Btn1Down>:xedit-focus() popup-menu(fileMenu)\n\
+c l<Btn1Down>: xedit-focus() popup-menu(fileMenu)\n\
+c<Btn1Down>: xedit-focus() popup-menu(fileMenu)\n\
+c l @Num_Lock<Btn2Down>:xedit-focus() popup-menu(editMenu)\n\
+c @Num_Lock<Btn2Down>:xedit-focus() popup-menu(editMenu)\n\
+c l<Btn2Down>: xedit-focus() popup-menu(editMenu)\n\
+c<Btn2Down>: xedit-focus() popup-menu(editMenu)\n\
+c l @Num_Lock<Btn3Down>:xedit-focus() popup-menu(optionsMenu)\n\
+c @Num_Lock<Btn3Down>:xedit-focus() popup-menu(optionsMenu)\n\
+c l<Btn3Down>:xedit-focus() popup-menu(optionsMenu)\n\
+c<Btn3Down>: xedit-focus() popup-menu(optionsMenu)\n\
+<Btn1Down>: xedit-focus() select-start()
+
+*filename.?.pieceSize: 256
+*filename.translations: #override \
+c<Key>S: no-op(r)\n\
+c<Key>R: no-op(r)\n\
+m<Key>I: no-op(r)\n\
+c<Key>G: cancel-find-file()\n\
+<Key>Return: load-file()\n\
+<Key>Tab: file-completion(h)\n\
+<Key>Escape: cancel-find-file()\n\
+<Enter>: no-op()\n\
+<Leave>: no-op()\n\
+<Btn1Down>: set-keyboard-focus() select-start()
+
+*ispell.translations: #override \
+<Message>WM_PROTOCOLS: ispell(end)
+
+! Sample dictionary, word chars and text mode resources setup
+!*ispell.dictionary: br
+!*ispell.dictionaries: br american americanmed+ english
+!*ispell*br.wordChars: áéíóúçÁÉÍÓÚÇàÀâêôÂÊÔüÜãõÃÕ-
+!*ispell.ispellCommand: /usr/local/bin/ispell -B -m
+!*ispell*text.skipLines: .#
+
+*ispell.geometry: 0x0
+*ispell.minWidth: 320
+*ispell.minHeight: 245
+*ispell*Label.borderWidth: 0
+*ispell*Label.internalHeight: 4
+*ispell*Label.justify: right
+*ispell*Label.width: 112
+*ispell*Label.left: chainLeft
+*ispell*Label.right: chainLeft
+*ispell*Label.top: chainTop
+*ispell*Label.bottom: chainTop
+*ispell*mispelled.label: Misspelled word:
+*ispell*mispelled.top: chainTop
+*ispell*mispelled.bottom: chainTop
+*ispell*mispelled.internalWidth: 0
+*ispell*repeated.label: Repeated words:
+*ispell*repeated.internalWidth: 0
+*ispell*replacement.label: Replace with:
+*ispell*word.fromHoriz: mispelled
+*ispell*word.justify: left
+*ispell*word.borderWidth: 1
+*ispell*word.internalWidth: 4
+*ispell*word.internalHeight: 3
+*ispell*word.width: 194
+*ispell*word.left: chainLeft
+*ispell*word.right: chainRight
+*ispell*word.top: chainTop
+*ispell*word.bottom: chainTop
+*ispell*word.label:
+*ispell*word.tip: Press here to select this text
+*ispell*word.highlightThickness: 0
+*ispell*text.fromHoriz: replacement
+*ispell*replacement.fromVert: mispelled
+*ispell*replacement.internalWidth: 0
+*ispell*form.text.fromVert: word
+*ispell*form.text.width: 194
+*ispell*form.text.top: chainTop
+*ispell*form.text.bottom: chainTop
+*ispell*form.text.left: chainLeft
+*ispell*form.text.right: chainRight
+*ispell*form.text.leftMargin: 4
+*ispell*form.text.?.pieceSize: 256
+*ispell*suggestions.label: Suggestions:
+*ispell*suggestions.fromVert: replacement
+*ispell*suggestions.internalWidth: 0
+*ispell*viewport.fromHoriz: suggestions
+*ispell*viewport.fromVert: text
+*ispell*viewport.width: 194
+*ispell*viewport.height: 143
+*ispell*viewport.top: chainTop
+*ispell*viewport.bottom: chainBottom
+*ispell*viewport.left: chainLeft
+*ispell*viewport.right: chainRight
+*ispell*viewport.forceBars: 1
+*ispell*viewport.allowVert: 1
+*ispell*list.defaultColumns: 1
+*ispell*list.longest: 16384
+*ispell*commands.vertDistance: 5
+*ispell*commands.fromVert: suggestions
+*ispell*commands.top: chainBottom
+*ispell*commands.bottom: chainBottom
+*ispell*commands.right: chainLeft
+*ispell*commands.left: chainLeft
+*ispell*check.label: Check
+*ispell*check.width: 54
+*ispell*check.tip: Ask ispell about the word in the text field
+*ispell*look.label: Look
+*ispell*look.fromHoriz: check
+*ispell*look.horizDistance: 0
+*ispell*look.width: 46
+*ispell*look.tip: Runs the look command
+*ispell*undo.fromVert: check
+*ispell*undo.label: Undo
+*ispell*undo.width: 102
+*ispell*undo.tip: Undo last action
+*ispell*replace.fromVert: undo
+*ispell*replace.label: Replace
+*ispell*replace.tip: Replace occurence of the word
+*ispell*replaceAll.fromVert: undo
+*ispell*replaceAll.fromHoriz: replace
+*ispell*replaceAll.label: All
+*ispell*replaceAll.tip: Replace all occurences of the word
+*ispell*ignore.fromVert: replace
+*ispell*ignore.label: Ignore
+*ispell*ignore.tip: Ignore this word
+*ispell*ignoreAll.fromVert: replaceAll
+*ispell*ignoreAll.fromHoriz: ignore
+*ispell*ignoreAll.label: All
+*ispell*ignoreAll.tip: Ignore all ocurrences of the word
+*ispell*add.fromVert: ignore
+*ispell*add.label: Add
+*ispell*add.width: 50
+*ispell*add.tip: Add word to your private dictionary
+*ispell*addUncap.fromVert: ignoreAll
+*ispell*addUncap.fromHoriz: add
+*ispell*addUncap.label: Uncap
+*ispell*addUncap.horizDistance: 0
+*ispell*addUncap.width: 50
+*ispell*addUncap.tip: Add word uncapitalized, to your private dictionary
+*ispell*suspend.fromVert: add
+*ispell*suspend.label: Suspend
+*ispell*suspend.width: 57
+*ispell*suspend.tip: Suspend ispell execution
+*ispell*cancel.fromHoriz: suspend
+*ispell*cancel.fromVert: addUncap
+*ispell*cancel.label: Close
+*ispell*cancel.width: 43
+*ispell*cancel.horizDistance: 0
+*ispell*cancel.tip: Terminates ispell process
+*ispell*replace.width: 65
+*ispell*ignore.width: 65
+*ispell*replaceAll.width: 35
+*ispell*replaceAll.horizDistance: 0
+*ispell*ignoreAll.width: 35
+*ispell*ignoreAll.horizDistance: 0
+*ispell*terse.fromVert: cancel
+*ispell*terse.Label: Terse Mode
+*ispell*terse.width: 104
+*ispell*terse.borderWidth: 0
+*ispell*terse.tip: Switch terse mode
+*ispell*status.fromVert: viewport
+*ispell*status.fromHoriz: suggestions
+*ispell*status.top: chainBottom
+*ispell*status.bottom: chainBottom
+*ispell*status.left: chainLeft
+*ispell*status.right: chainRight
+*ispell*status.width: 194
+*ispell*status.borderWidth: 1
+*ispell*status.justify: left
+*ispell*status.internalHeight: 2
+*ispell*status.vertDistance: 2
+*ispell*options.fromVert: status
+*ispell*options.fromHoriz: commands
+*ispell*options.bottom: chainBottom
+*ispell*options.top: chainBottom
+*ispell*options.left: chainLeft
+*ispell*options.right: chainRight
+*ispell*options.dict.width: 121
+*ispell*options.horizDistance: 2
+*ispell*options.vertDistance: 2
+*ispell*options.defaultDistance: 2
+*ispell*dict.highlightThickness: 0
+*ispell*dict.justify: left
+*ispell*dict.resizable: False
+*ispell*dict.leftBitmap: menu12
+*ispell*dict.label: Dictionary
+*ispell*dict.tip: Change dictionary
+*ispell*options.format.width: 65
+*ispell*format.highlightThickness: 0
+*ispell*format.justify: left
+*ispell*format.resizable: False
+*ispell*format.leftBitmap: menu12
+*ispell*format.fromHoriz: dict
+*ispell*format.horizDistance: 0
+*ispell*format.tip: Select text type
+
+*columns.minWidth: 140
+*columns.minHeight: 76
+*columns.maxWidth: 140
+*columns.maxHeight: 76
+*columns.form*defaultDistance: 4
+*columns*left: chainLeft
+*columns*right: chainLeft
+*columns*top: chainTop
+*columns*bottom: chainTop
+*columns*Label.width: 96
+*columns*Label.borderWidth: 0
+*columns*Label.internalHeight: 4
+*columns*Label.internalWidth: 2
+*columns*Label.justify: right
+*columns*Text.width: 30
+*columns*Command.width: 58
+*columns*leftLabel.label: Left Column:
+*columns*left.fromHoriz: leftLabel
+*columns*rightLabel.label: Right Column:
+*columns*rightLabel.fromVert: leftLabel
+*columns*right.fromHoriz: rightLabel
+*columns*right.fromVert: left
+*columns*ok.fromVert: rightLabel
+*columns*cancel.fromHoriz: ok
+*columns*cancel.fromVert: rightLabel
+*columns*cancel.horizDistance: 12
+*columns*Text.?.pieceSize: 8
+
+*columns*Text.translations: #override \
+c<Key>S: no-op(r)\n\
+c<Key>R: no-op(r)\n\
+m<Key>I: no-op(r)\n\
+<Key>Return: set-columns(ok)\n\
+<Key>Tab: change-field()\n\
+c<Key>G: set-columns(cancel)\n\
+<Key>Escape: set-columns(cancel)\n\
+<Enter>: no-op()\n\
+<Leave>: no-op()\n\
+<Btn1Down>: set-keyboard-focus() select-start()
+
+*columns.translations: #override \
+<Message>WM_PROTOCOLS: set-columns(cancel)
+
+! EOF.
diff --git a/Xedit-xprint.ad b/Xedit-xprint.ad
new file mode 100644
index 0000000..f6ef6dc
--- /dev/null
+++ b/Xedit-xprint.ad
@@ -0,0 +1,559 @@
+! $XFree86: xc/programs/xedit/Xedit.ad,v 1.23 2002/09/22 07:09:05 paulo Exp $
+
+*geometry: 590x440
+*input: TRUE
+*enableBackups: True
+*backupNameSuffix: ~
+*changedBitmap: xlogo11
+*international: True
+
+*hints:\
+Use Control-S and Control-R to Search.\n\
+Use Control-Shift-_ to Undo. Control-G to switch between Undo and Redo.\n\
+Use Control-A to jump to the beginning of the line.\n\
+Use Control-E to jump to the end of the line.\n\
+Use Control-T to transpose characters.\n\
+Use Control-K to cut to the end of the line. Control-Y to paste.\n\
+Use Control-Q to escape control characters.\n\
+Use Control-U[,<number>] to multiply actions. Control-G to cancel.\n\
+Use Control-Z to scroll one line up. Meta-Z to scroll one line down.\n\
+Use Meta-Q to format a paragraph.\n\
+Use Right-Button to extend selections.\n\
+Use Meta-I to insert a file.\n\
+Use Control-W to delete a selection, and/or jump to the selection mark.\n\
+Use Control-X,Control-F to find a file. Tab for filename completion.\n\
+Use Control-X,Control-S to save.\n\
+Use Control-X,Control-C to exit.\n\
+Use Control-C to paste the selection at CUT_BUFFER0.\n\
+Use Control Left-Button to popup the File Menu.\n\
+Use Control Middle-Button to popup the Edit Menu.\n\
+Use Control Right-Button to popup the Option Menu.\n\
+Use Control-X,Tab to Indent.\n\
+Use Control-X,0 to delete current splitted window.\n\
+Use Control-X,1 to delete other splitted window.\n\
+Use Control-X,2 to split the window vertically.\n\
+Use Control-X,3 to split the window horizontally.\n\
+Use Control-X,b to switch to another file.\n\
+Use Control-X,d to list directory. Control-G to Cancel.\n\
+Use Control-X,k to close file being edited.\n\
+Use Control-X,o to switch to another splitted window.\n\
+Use Control-X,u to undo. Control-G to switch between Undo and Redo.\n\
+Use Insert to toggle Overwrite mode.\n\
+Use Control-G to interrupt the lisp subprocess
+
+*formWindow*defaultDistance: 2
+*formWindow.?.borderWidth: 0
+*formWindow.min: 18
+*formWindow.max: 18
+*formWindow.showGrip: False
+*positionWindow.fromHoriz: labelWindow
+*positionWindow.horizDistance: 0
+*positionWindow.left: chainRight
+*positionWindow.right: chainRight
+*positionWindow.width: 90
+*positionWindow.label: error
+*positionWindow.justify: left
+*labelWindow*justify: center
+*labelWindow*label: no file yet
+*labelWindow.left: chainLeft
+*labelWindow.right: chainRight
+
+*quit.label: Quit
+*quit.tip: Close xedit window
+*save.label: Save
+*save.tip: Save current file
+*load.label: Load
+*load.tip: Load a new file
+*print.label: Print
+*print.tip: Print current file
+
+*buttons*orientation: horizontal
+*buttons*showGrip: False
+*buttons.min: 18
+
+*messageWindow.height: 50
+*messageWindow.min: 18
+*Paned*Text*allowResize: True
+
+*messageWindow.autoFill: False
+*messageWindow.scrollVertical: Never
+
+*editWindow.autoFill: False
+*editWindow.scrollVertical: Always
+*editWindow.showGrip: True
+xedit.textSource*enableUndo: True
+
+*bc_label*label: Use Control-S and Control-R to Search.
+*bc_label*showGrip: False
+*bc_label.min: 18
+
+*dirlabel.showGrip: False
+*dirlabel.min: 18
+*dirlabel.max: 18
+
+*dirwindow.defaultColumns: 0
+*dirwindow.verticalList: True
+
+*viewport.forceBars: True
+*viewport.allowVert: 1
+
+*insertFile*text.width: 141
+*insertFile*text.?.pieceSize: 256
+*search*searchText.width: 157
+*search*replaceText.width: 157
+*search*case.horizDistance: 25
+*search*Text.?.pieceSize: 256
+
+*SimpleMenu.BackingStore: NotUseful
+*SimpleMenu.menuLabel.vertSpace: 80
+*SimpleMenu.SmeBSB.HorizontalMargins: 16
+*SimpleMenu.justify: center
+*SimpleMenu.menuLabel.height: 250
+*SimpleMenu*cursor: left_ptr
+
+*fileMenu.label: File Menu
+*optionsMenu.label: Option Menu
+*optionsMenu.ispell.label: ispell...
+*editMenu.label: Edit Menu
+*editMenu.wrapMenuItem.label: Wrapping
+*editMenu.wrapMenuItem.leftBitmap: menu12
+*wrapMenu.never.label: Never
+*wrapMenu.line.label: Line
+*wrapMenu.word.label: Word
+*editMenu.autoFill.label: Auto Fill
+*editMenu.justifyMenuItem.label: Justification
+*editMenu.justifyMenuItem.leftBitmap: menu12
+*justifyMenu.left.label: Left
+*justifyMenu.right.label: Right
+*justifyMenu.center.label: Center
+*justifyMenu.full.label: Full
+*editMenu.breakColumns.label: Break Columns...
+*editMenu.scrollMenuItem.label: Scrollbars
+*editMenu.scrollMenuItem.leftBitmap: menu12
+*scrollMenu.vertical.label: Vertical
+*scrollMenu.horizontal.label: Horizontal
+*editMenu.modeMenuItem.leftBitmap: menu12
+*editMenu.modeMenuItem.label: Edit Mode
+*editModes.none.label: Plain/None
+
+*TransientShell*Text.translations: #override \
+c<Key>S: no-op(r)\n\
+c<Key>R: no-op(r)\n\
+m<Key>I: no-op(r)
+
+*search.translations: #override \
+<Create>:get-values(my, $w, width, $h, height)\
+ set-values(1, minWidth, $w, minHeight, $h, maxHeight, $h, allowShellResize, False)
+
+*insertFile.title: Insert File
+*insertFile.translations: #override \
+<Create>:get-values(my, $w, width, $h, height)\
+ set-values(1, minWidth, $w, minHeight, $h, maxHeight, $h, allowShellResize, False)
+
+*baseTranslations: #override \
+<Ctrl>X,<Ctrl>C:quit()\n\
+<Ctrl>X,<Ctrl>S:save-file()\n\
+<Ctrl>X,<Ctrl>F:find-file()\n\
+<Key>Escape: line-edit()
+
+*messageWindow.Translations: #override \
+<Ctrl>X,<Ctrl>C:quit()\n\
+<Ctrl>X,<Ctrl>S:save-file()\n\
+<Ctrl>X,<Ctrl>F:find-file()\n\
+<Enter>: no-op()\n\
+<Leave>: no-op()\n\
+<Btn1Down>: set-keyboard-focus() select-start()
+
+*searchText.Translations: #override \
+<Enter>: no-op()\n\
+<Leave>: no-op()\n\
+<Btn1Down>: set-keyboard-focus() select-start()
+
+*replaceText.Translations: #override \
+<Enter>: no-op()\n\
+<Leave>: no-op()\n\
+<Btn1Down>: set-keyboard-focus() select-start()
+
+*editWindow.translations: #override \
+<Ctrl>X,<Ctrl>E:lisp-eval()\n\
+<Ctrl>X,<Key>Tab:indent()\n\
+<Ctrl>X,:<Key>0:delete-window(current)\n\
+<Ctrl>X,:<Key>1:delete-window(other)\n\
+<Ctrl>X,:<Key>2:split-window(vertical)\n\
+<Ctrl>X,:<Key>3:split-window(horizontal)\n\
+<Ctrl>X,!l @Num_Lock<Key>b:switch-source()\n\
+<Ctrl>X,!l <Key>b:switch-source()\n\
+<Ctrl>X,!@Num_Lock<Key>b:switch-source()\n\
+<Ctrl>X,!<Key>b:switch-source()\n\
+<Ctrl>X,!l @Num_Lock<Key>d:dir-window()\n\
+<Ctrl>X,!l <Key>d:dir-window()\n\
+<Ctrl>X,!@Num_Lock<Key>d:dir-window()\n\
+<Ctrl>X,!<Key>d:dir-window()\n\
+<Ctrl>X,!l @Num_Lock<Key>k:kill-file()\n\
+<Ctrl>X,!l <Key>k:kill-file()\n\
+<Ctrl>X,!@Num_Lock<Key>k:kill-file()\n\
+<Ctrl>X,!<Key>k:kill-file()\n\
+<Ctrl>X,!l @Num_Lock<Key>o:other-window()\n\
+<Ctrl>X,!l <Key>o:other-window()\n\
+<Ctrl>X,!@Num_Lock<Key>o:other-window()\n\
+<Ctrl>X,!<Key>o:other-window()\n\
+<Ctrl>X,!l @Num_Lock<Key>u:undo()\n\
+<Ctrl>X,!l <Key>u:undo()\n\
+<Ctrl>X,!@Num_Lock<Key>u:undo()\n\
+<Ctrl>X,!<Key>u:undo()\n\
+<Ctrl>G: xedit-keyboard-reset()\n\
+<Ctrl>J: xedit-print-lisp-eval()\n\
+<Key>Tab: insert-char()\n\
+!l @Num_Lock<Key>b:insert-char()\n\
+!l <Key>b: insert-char()\n\
+!@Num_Lock<Key>b:insert-char()\n\
+!<Key>b: insert-char()\n\
+!l @Num_Lock<Key>d:insert-char()\n\
+!l <Key>d: insert-char()\n\
+!@Num_Lock<Key>d:insert-char()\n\
+!<Key>d: insert-char()\n\
+!l <Key>k: insert-char()\n\
+!l @Num_Lock<Key>k:insert-char()\n\
+!@Num_Lock<Key>k:insert-char()\n\
+!<Key>k: insert-char()\n\
+!l @Num_Lock<Key>o:insert-char()\n\
+!l <Key>o: insert-char()\n\
+!@Num_Lock<Key>o:insert-char()\n\
+!<Key>o: insert-char()\n\
+!l @Num_Lock<Key>u:insert-char()\n\
+!l <Key>u: insert-char()\n\
+!@Num_Lock<Key>u:insert-char()\n\
+!<Key>u: insert-char()\n\
+~s <Key>Insert: toggle-overwrite()\n\
+c l @Num_Lock<Btn1Down>:xedit-focus() popup-menu(fileMenu)\n\
+c @Num_Lock<Btn1Down>:xedit-focus() popup-menu(fileMenu)\n\
+c l<Btn1Down>: xedit-focus() popup-menu(fileMenu)\n\
+c<Btn1Down>: xedit-focus() popup-menu(fileMenu)\n\
+c l @Num_Lock<Btn2Down>:xedit-focus() popup-menu(editMenu)\n\
+c @Num_Lock<Btn2Down>:xedit-focus() popup-menu(editMenu)\n\
+c l<Btn2Down>: xedit-focus() popup-menu(editMenu)\n\
+c<Btn2Down>: xedit-focus() popup-menu(editMenu)\n\
+c l @Num_Lock<Btn3Down>:xedit-focus() popup-menu(optionsMenu)\n\
+c @Num_Lock<Btn3Down>:xedit-focus() popup-menu(optionsMenu)\n\
+c l<Btn3Down>:xedit-focus() popup-menu(optionsMenu)\n\
+c<Btn3Down>: xedit-focus() popup-menu(optionsMenu)\n\
+<Btn1Down>: xedit-focus() select-start()
+
+*filename.?.pieceSize: 256
+*filename.translations: #override \
+c<Key>S: no-op(r)\n\
+c<Key>R: no-op(r)\n\
+m<Key>I: no-op(r)\n\
+c<Key>G: cancel-find-file()\n\
+<Key>Return: load-file()\n\
+<Key>P: print-file()\n\
+<Key>Tab: file-completion(h)\n\
+<Key>Escape: cancel-find-file()\n\
+<Enter>: no-op()\n\
+<Leave>: no-op()\n\
+<Btn1Down>: set-keyboard-focus() select-start()
+
+*ispell.translations: #override \
+<Message>WM_PROTOCOLS: ispell(end)
+
+! Sample dictionary, word chars and text mode resources setup
+!*ispell.dictionary: br
+!*ispell.dictionaries: br american americanmed+ english
+!*ispell*br.wordChars: áéíóúçÁÉÍÓÚÇàÀâêôÂÊÔüÜãõÃÕ-
+!*ispell.ispellCommand: /usr/local/bin/ispell -B -m
+!*ispell*text.skipLines: .#
+
+*ispell.geometry: 0x0
+*ispell.minWidth: 320
+*ispell.minHeight: 245
+*ispell*Label.borderWidth: 0
+*ispell*Label.internalHeight: 4
+*ispell*Label.justify: right
+*ispell*Label.width: 112
+*ispell*Label.left: chainLeft
+*ispell*Label.right: chainLeft
+*ispell*Label.top: chainTop
+*ispell*Label.bottom: chainTop
+*ispell*mispelled.label: Misspelled word:
+*ispell*mispelled.top: chainTop
+*ispell*mispelled.bottom: chainTop
+*ispell*mispelled.internalWidth: 0
+*ispell*repeated.label: Repeated words:
+*ispell*repeated.internalWidth: 0
+*ispell*replacement.label: Replace with:
+*ispell*word.fromHoriz: mispelled
+*ispell*word.justify: left
+*ispell*word.borderWidth: 1
+*ispell*word.internalWidth: 4
+*ispell*word.internalHeight: 3
+*ispell*word.width: 194
+*ispell*word.left: chainLeft
+*ispell*word.right: chainRight
+*ispell*word.top: chainTop
+*ispell*word.bottom: chainTop
+*ispell*word.label:
+*ispell*word.tip: Press here to select this text
+*ispell*word.highlightThickness: 0
+*ispell*text.fromHoriz: replacement
+*ispell*replacement.fromVert: mispelled
+*ispell*replacement.internalWidth: 0
+*ispell*form.text.fromVert: word
+*ispell*form.text.width: 194
+*ispell*form.text.top: chainTop
+*ispell*form.text.bottom: chainTop
+*ispell*form.text.left: chainLeft
+*ispell*form.text.right: chainRight
+*ispell*form.text.leftMargin: 4
+*ispell*form.text.?.pieceSize: 256
+*ispell*suggestions.label: Suggestions:
+*ispell*suggestions.fromVert: replacement
+*ispell*suggestions.internalWidth: 0
+*ispell*viewport.fromHoriz: suggestions
+*ispell*viewport.fromVert: text
+*ispell*viewport.width: 194
+*ispell*viewport.height: 143
+*ispell*viewport.top: chainTop
+*ispell*viewport.bottom: chainBottom
+*ispell*viewport.left: chainLeft
+*ispell*viewport.right: chainRight
+*ispell*viewport.forceBars: 1
+*ispell*viewport.allowVert: 1
+*ispell*list.defaultColumns: 1
+*ispell*list.longest: 16384
+*ispell*commands.vertDistance: 5
+*ispell*commands.fromVert: suggestions
+*ispell*commands.top: chainBottom
+*ispell*commands.bottom: chainBottom
+*ispell*commands.right: chainLeft
+*ispell*commands.left: chainLeft
+*ispell*check.label: Check
+*ispell*check.width: 54
+*ispell*check.tip: Ask ispell about the word in the text field
+*ispell*look.label: Look
+*ispell*look.fromHoriz: check
+*ispell*look.horizDistance: 0
+*ispell*look.width: 46
+*ispell*look.tip: Runs the look command
+*ispell*undo.fromVert: check
+*ispell*undo.label: Undo
+*ispell*undo.width: 102
+*ispell*undo.tip: Undo last action
+*ispell*replace.fromVert: undo
+*ispell*replace.label: Replace
+*ispell*replace.tip: Replace occurence of the word
+*ispell*replaceAll.fromVert: undo
+*ispell*replaceAll.fromHoriz: replace
+*ispell*replaceAll.label: All
+*ispell*replaceAll.tip: Replace all occurences of the word
+*ispell*ignore.fromVert: replace
+*ispell*ignore.label: Ignore
+*ispell*ignore.tip: Ignore this word
+*ispell*ignoreAll.fromVert: replaceAll
+*ispell*ignoreAll.fromHoriz: ignore
+*ispell*ignoreAll.label: All
+*ispell*ignoreAll.tip: Ignore all ocurrences of the word
+*ispell*add.fromVert: ignore
+*ispell*add.label: Add
+*ispell*add.width: 50
+*ispell*add.tip: Add word to your private dictionary
+*ispell*addUncap.fromVert: ignoreAll
+*ispell*addUncap.fromHoriz: add
+*ispell*addUncap.label: Uncap
+*ispell*addUncap.horizDistance: 0
+*ispell*addUncap.width: 50
+*ispell*addUncap.tip: Add word uncapitalized, to your private dictionary
+*ispell*suspend.fromVert: add
+*ispell*suspend.label: Suspend
+*ispell*suspend.width: 57
+*ispell*suspend.tip: Suspend ispell execution
+*ispell*cancel.fromHoriz: suspend
+*ispell*cancel.fromVert: addUncap
+*ispell*cancel.label: Close
+*ispell*cancel.width: 43
+*ispell*cancel.horizDistance: 0
+*ispell*cancel.tip: Terminates ispell process
+*ispell*replace.width: 65
+*ispell*ignore.width: 65
+*ispell*replaceAll.width: 35
+*ispell*replaceAll.horizDistance: 0
+*ispell*ignoreAll.width: 35
+*ispell*ignoreAll.horizDistance: 0
+*ispell*terse.fromVert: cancel
+*ispell*terse.Label: Terse Mode
+*ispell*terse.width: 104
+*ispell*terse.borderWidth: 0
+*ispell*terse.tip: Switch terse mode
+*ispell*status.fromVert: viewport
+*ispell*status.fromHoriz: suggestions
+*ispell*status.top: chainBottom
+*ispell*status.bottom: chainBottom
+*ispell*status.left: chainLeft
+*ispell*status.right: chainRight
+*ispell*status.width: 194
+*ispell*status.borderWidth: 1
+*ispell*status.justify: left
+*ispell*status.internalHeight: 2
+*ispell*status.vertDistance: 2
+*ispell*options.fromVert: status
+*ispell*options.fromHoriz: commands
+*ispell*options.bottom: chainBottom
+*ispell*options.top: chainBottom
+*ispell*options.left: chainLeft
+*ispell*options.right: chainRight
+*ispell*options.dict.width: 121
+*ispell*options.horizDistance: 2
+*ispell*options.vertDistance: 2
+*ispell*options.defaultDistance: 2
+*ispell*dict.highlightThickness: 0
+*ispell*dict.justify: left
+*ispell*dict.resizable: False
+*ispell*dict.leftBitmap: menu12
+*ispell*dict.label: Dictionary
+*ispell*dict.tip: Change dictionary
+*ispell*options.format.width: 65
+*ispell*format.highlightThickness: 0
+*ispell*format.justify: left
+*ispell*format.resizable: False
+*ispell*format.leftBitmap: menu12
+*ispell*format.fromHoriz: dict
+*ispell*format.horizDistance: 0
+*ispell*format.tip: Select text type
+
+*columns.minWidth: 140
+*columns.minHeight: 76
+*columns.maxWidth: 140
+*columns.maxHeight: 76
+*columns.form*defaultDistance: 4
+*columns*left: chainLeft
+*columns*right: chainLeft
+*columns*top: chainTop
+*columns*bottom: chainTop
+*columns*Label.width: 96
+*columns*Label.borderWidth: 0
+*columns*Label.internalHeight: 4
+*columns*Label.internalWidth: 2
+*columns*Label.justify: right
+*columns*Text.width: 30
+*columns*Command.width: 58
+*columns*leftLabel.label: Left Column:
+*columns*left.fromHoriz: leftLabel
+*columns*rightLabel.label: Right Column:
+*columns*rightLabel.fromVert: leftLabel
+*columns*right.fromHoriz: rightLabel
+*columns*right.fromVert: left
+*columns*ok.fromVert: rightLabel
+*columns*cancel.fromHoriz: ok
+*columns*cancel.fromVert: rightLabel
+*columns*cancel.horizDistance: 12
+*columns*Text.?.pieceSize: 8
+
+*columns*Text.translations: #override \
+c<Key>S: no-op(r)\n\
+c<Key>R: no-op(r)\n\
+m<Key>I: no-op(r)\n\
+<Key>Return: set-columns(ok)\n\
+<Key>Tab: change-field()\n\
+c<Key>G: set-columns(cancel)\n\
+<Key>Escape: set-columns(cancel)\n\
+<Enter>: no-op()\n\
+<Leave>: no-op()\n\
+<Btn1Down>: set-keyboard-focus() select-start()
+
+*columns.translations: #override \
+<Message>WM_PROTOCOLS: set-columns(cancel)
+
+! Use "white" as background for printing
+*printshell*background: white
+
+! Print dialog
+*printdialogshell*geometry: 600x120
+*printdialogshell*title: Print
+*printdialogshell*main*ok.fromVert: innerform
+*printdialogshell*main*ok.label: Print
+*printdialogshell*main*ok.tip: Print
+*printdialogshell*main*setup.fromHoriz: ok
+*printdialogshell*main*setup.fromVert: innerform
+*printdialogshell*main*setup.label: Setup...
+*printdialogshell*main*setup.tip: Configure print job options (page size, orientation, etc.)
+*printdialogshell*main*cancel.fromHoriz: setup
+*printdialogshell*main*cancel.fromVert: innerform
+*printdialogshell*main*cancel.label: Cancel
+*printdialogshell*main*cancel.tip: Cancel printing
+*printdialogshell*main*desclabel.label: Printer Description:
+*printdialogshell*main*desclabel.tip: Short description of printer
+*printdialogshell*main*desc.fromHoriz: desclabel
+*printdialogshell*main*desc.tip: Short description of printer
+*printdialogshell*main*info.fromHoriz: desc
+*printdialogshell*main*info.label: Printer info...
+*printdialogshell*main*info.tip: Display additional information about this printer
+*printdialogshell*main*namelabel.fromVert: desclabel
+*printdialogshell*main*namelabel.label: Printer Name:
+*printdialogshell*main*namelabel.tip: Name of selected printer
+*printdialogshell*main*name.fromHoriz: namelabel
+*printdialogshell*main*name.fromVert: desclabel
+*printdialogshell*main*name.tip: Name of selected printer
+*printdialogshell*main*selectprinter.fromHoriz: name
+*printdialogshell*main*selectprinter.fromVert: desclabel
+*printdialogshell*main*selectprinter.label: Select Printer...
+*printdialogshell*main*selectprinter.label: Select Printer...
+*printdialogshell*main*selectprinter.tip: Select a different printer
+*printdialogshell*main*filenamelabel.fromVert: namelabel
+*printdialogshell*main*filenamelabel.label: File Name:
+*printdialogshell*main*filenamelabel.tip: File where the output should be stored
+*printdialogshell*main*filename.fromHoriz: filenamelabel
+*printdialogshell*main*filename.fromVert: namelabel
+*printdialogshell*main*filename.tip: File where the output should be stored
+*printdialogshell*main*selectfile.fromHoriz: filename
+*printdialogshell*main*selectfile.fromVert: namelabel
+*printdialogshell*main*selectfile.label: Select File...
+*printdialogshell*main*selectfile.tip: Select file where the output should be stored
+*printdialogshell*main*printtoprinter.fromVert: filenamelabel
+*printdialogshell*main*printtoprinter.label: Print to Printer
+*printdialogshell*main*printtoprinter.tip: Send print job to printer
+*printdialogshell*main*printtofile.fromVert: filenamelabel
+*printdialogshell*main*printtofile.fromHoriz: printtoprinter
+*printdialogshell*main*printtofile.label: Print to File
+*printdialogshell*main*printtofile.tip: Save print job in a file
+
+! Print job options dialog
+*printdialogshell*setup*geometry: 600x400
+*printdialogshell*setup*title: Print: Print job options
+*printdialogshell*setup*ok.fromVert: list
+*printdialogshell*setup*ok.label: OK
+*printdialogshell*setup*ok.tip: Commit changes
+*printdialogshell*setup*cancel.fromHoriz: ok
+*printdialogshell*setup*cancel.fromVert: list
+*printdialogshell*setup*cancel.label: Cancel
+*printdialogshell*setup*cancel.tip: Cancel and reset to defaults
+*printdialogshell*setup*paperlist.tip: Select paper size
+*printdialogshell*setup*resolutionlist.fromHoriz: paperlist
+*printdialogshell*setup*resolutionlist.tip: Select page resolution
+*printdialogshell*setup*orientationlist.fromHoriz: resolutionlist
+*printdialogshell*setup*orientationlist.tip: Select page orientation
+*printdialogshell*setup*plexlist.fromHoriz: orientationlist
+*printdialogshell*setup*plexlist.tip: Select page plex mode (simplex, duplex, etc.)
+*printdialogshell*setup*jobcopieslabel.fromVert: paperlist
+*printdialogshell*setup*jobcopieslabel.tip: Set number of job copies
+*printdialogshell*setup*jobcopieslabel.label: Job Copies:
+*printdialogshell*setup*jobcopies.fromHoriz: jobcopieslabel
+*printdialogshell*setup*jobcopies.fromVert: paperlist
+*printdialogshell*setup*jobcopies.tip: Set number of job copies
+
+! Printer selection
+*printdialogshell*printerselection*geometry: 400x150
+*printdialogshell*printerselection*title: Print: Select printer
+*printdialogshell*printerselection*ok.fromVert: list
+*printdialogshell*printerselection*ok.label: OK
+*printdialogshell*printerselection*ok.tip: Switch printer
+*printdialogshell*printerselection*cancel.fromHoriz: ok
+*printdialogshell*printerselection*cancel.fromVert: list
+*printdialogshell*printerselection*cancel.label: Cancel
+*printdialogshell*printerselection*cancel.tip: Cancel printer selection
+*printdialogshell*printerselection*list.tip: Select printer name from list
+
+! Select job file
+*printdialogshell*selectfile*geometry: 400x80
+*printdialogshell*selectfile*title: Print: Select job file
+*printdialogshell*selectfile*dialog.label: Select Filename:
+
+! EOF.
diff --git a/commands.c b/commands.c
index f3d889e..9e63158 100644
--- a/commands.c
+++ b/commands.c
@@ -29,10 +29,16 @@
#include <X11/Xfuncs.h>
#include <X11/Xos.h>
#include "xedit.h"
+#ifdef INCLUDE_XPRINT_SUPPORT
+#include "printdialog.h"
+#include "print.h"
+#endif /* INCLUDE_XPRINT_SUPPORT */
#ifdef CRAY
#include <unistd.h>
#endif
#include <stdlib.h>
+#include <stdio.h>
+#include <limits.h>
#include <string.h>
#include <dirent.h>
#include <pwd.h>
@@ -41,6 +47,19 @@
#include <X11/IntrinsicP.h>
#include <X11/Xaw/TextSrcP.h>
+/* Turn a NULL pointer string into an empty string */
+#define NULLSTR(x) (((x)!=NULL)?(x):(""))
+
+#define Error(x) { printf x ; exit(EXIT_FAILURE); }
+#define Assertion(expr, msg) { if (!(expr)) { Error msg } }
+#define Log(x) { if (True) printf x; }
+
+#ifdef INCLUDE_XPRINT_SUPPORT
+static Widget printdialog_shell = NULL;
+static Widget printdialog = NULL;
+static char printJobNameBuffer[PATH_MAX+256];
+#endif /* INCLUDE_XPRINT_SUPPORT */
+
void ResetSourceChanged(xedit_flist_item*);
static void ResetDC(Widget, XtPointer, XtPointer);
@@ -338,8 +357,8 @@ DoSave(Widget w, XtPointer client_data, XtPointer call_data)
XtRemoveCallback(scratch, XtNcallback, SourceChanged,
(XtPointer)item);
item->source = scratch =
- XtVaCreateWidget("textSource", international ?
- multiSrcObjectClass : asciiSrcObjectClass,
+ XtVaCreateWidget("textSource",
+ multiSrcObjectClass,
topwindow,
XtNtype, XawAsciiFile,
XtNeditType, XawtextEdit,
@@ -476,8 +495,8 @@ ReallyDoLoad(char *name, char *filename)
XtSetArg(args[num_args], XtNstring, NULL); num_args++;
}
- source = XtVaCreateWidget("textSource", international ?
- multiSrcObjectClass : asciiSrcObjectClass,
+ source = XtVaCreateWidget("textSource",
+ multiSrcObjectClass,
topwindow,
XtNtype, XawAsciiFile,
XtNeditType, XawtextEdit,
@@ -500,6 +519,109 @@ ReallyDoLoad(char *name, char *filename)
return (True);
}
+#ifdef INCLUDE_XPRINT_SUPPORT
+static void
+printshellDestroyXtProc(Widget w, XtPointer client_data, XtPointer callData)
+{
+ XawPrintDialogClosePrinterConnection(printdialog, False);
+}
+
+static void
+printOKXtProc(Widget w, XtPointer client_data, XtPointer callData)
+{
+ XawPrintDialogCallbackStruct *pdcs = (XawPrintDialogCallbackStruct *)callData;
+ Cardinal n;
+ Arg args[2];
+ Widget textsource;
+
+ Log(("printOKXtProc: OK.\n"));
+
+ /* Get TextSource object */
+ n = 0;
+ XtSetArg(args[n], XtNtextSource, &textsource); n++;
+ XtGetValues(textwindow, args, n);
+
+ Assertion(textsource != NULL, (("printOKXtProc: textsource == NULL.\n")));
+
+ /* ||printJobNameBuffer| must live as long the print job prints
+ * because it is used for the job title AND the page headers... */
+ sprintf(printJobNameBuffer, "Xedit print job");
+
+ DoPrintTextSource("Xedit",
+ textsource, topwindow,
+ pdcs->pdpy, pdcs->pcontext, printshellDestroyXtProc,
+ printJobNameBuffer,
+ pdcs->printToFile?pdcs->printToFileName:NULL);
+
+ XtPopdown(printdialog_shell);
+}
+
+static void
+printCancelXtProc(Widget w, XtPointer client_data, XtPointer callData)
+{
+ Log(("printCancelXtProc: cancel.\n"));
+ XtPopdown(printdialog_shell);
+
+ Log(("destroying print dialog shell...\n"));
+ XtDestroyWidget(printdialog_shell);
+ printdialog_shell = NULL;
+ printdialog = NULL;
+ Log(("... done\n"));
+}
+
+
+/*ARGSUSED*/
+void
+PrintFile(Widget w, XEvent *event, String *params, Cardinal *num_params)
+{
+ DoPrint(w, NULL, NULL);
+}
+
+/*ARGSUSED*/
+void
+DoPrint(Widget w, XtPointer client_data, XtPointer call_data)
+{
+ Dimension width, height;
+ Position x, y;
+ Widget parent = topwindow;
+ Log(("print!\n"));
+
+ if (!printdialog) {
+ int n;
+ Arg args[20];
+
+ n = 0;
+ XtSetArg(args[n], XtNallowShellResize, True); n++;
+ printdialog_shell = XtCreatePopupShell("printdialogshell",
+ transientShellWidgetClass,
+ topwindow, args, n);
+ n = 0;
+ printdialog = XtCreateManagedWidget("printdialog", printDialogWidgetClass,
+ printdialog_shell, args, n);
+ XtAddCallback(printdialog, XawNOkCallback, printOKXtProc, NULL);
+ XtAddCallback(printdialog, XawNCancelCallback, printCancelXtProc, NULL);
+
+ XtRealizeWidget(printdialog_shell);
+ }
+
+ /* Center dialog */
+ XtVaGetValues(printdialog_shell,
+ XtNwidth, &width,
+ XtNheight, &height,
+ NULL);
+
+ x = (Position)(XWidthOfScreen( XtScreen(parent)) - width) / 2;
+ y = (Position)(XHeightOfScreen(XtScreen(parent)) - height) / 3;
+
+ XtVaSetValues(printdialog_shell,
+ XtNx, x,
+ XtNy, y,
+ NULL);
+
+ XtPopup(printdialog_shell, XtGrabNonexclusive);
+}
+#endif /* INCLUDE_XPRINT_SUPPORT */
+
/* Function Name: SourceChanged
* Description: A callback routine called when the source has changed.
* Arguments: w - the text source that has changed.
diff --git a/hook.c b/hook.c
index 5e10a39..9352ea4 100644
--- a/hook.c
+++ b/hook.c
@@ -388,9 +388,11 @@ LineEditAction(Widget w, XEvent *event, String *params, Cardinal *num_params)
{
XawTextBlock block;
- if (international)
+ if (True) {
/* XXX FIXME */
+ fprintf(stderr, "LineEditAction: Not working in international mode.\n");
return;
+ }
block.firstPos = 0;
block.format = FMT8BIT;
diff --git a/ispell.c b/ispell.c
index e867628..ba28087 100644
--- a/ispell.c
+++ b/ispell.c
@@ -27,7 +27,7 @@
* Author: Paulo César Pereira de Andrade
*/
-/* $XdotOrg: xc/programs/xedit/ispell.c,v 1.1.4.1.4.2 2004/03/04 19:55:04 kaleb Exp $ */
+/* $XdotOrg: xc/programs/xedit/ispell.c,v 1.5 2004/09/02 08:40:32 kem Exp $ */
/* $XFree86: xc/programs/xedit/ispell.c,v 1.19 2002/10/19 20:04:20 herrb Exp $ */
#include "xedit.h"
@@ -825,7 +825,7 @@ IspellConvertHtmlAmp(char *buf)
else if (*buf == '#') {
char *tmp;
- if (len == 1);
+ if (len == 1)
return ('?');
ch = strtol(&buf[1], &tmp, 10);
if (*tmp)
@@ -938,10 +938,7 @@ IspellSend(void)
return (-1);
}
for (i = 0; i < block.length; i++) {
- if (international)
- wctomb(mb, ((wchar_t*)block.ptr)[i]);
- else
- *mb = block.ptr[i];
+ wctomb(mb, ((wchar_t*)block.ptr)[i]);
if (amplen) {
if (amplen + 2 >= sizeof(ampbuf)) {
if (!ispell.terse_mode)
@@ -1039,10 +1036,7 @@ IspellSend(void)
return (-1);
}
for (i = 0; i < block.length; i++) {
- if (international)
- wctomb(mb, ((wchar_t*)block.ptr)[i]);
- else
- *mb = block.ptr[i];
+ wctomb(mb, ((wchar_t*)block.ptr)[i]);
if (amplen) {
if (amplen + 2 >= sizeof(ampbuf)) {
if (!ispell.terse_mode)
@@ -1566,18 +1560,12 @@ ReplaceIspell(Widget w, XtPointer client_data, XtPointer call_data)
char mb[sizeof(wchar_t)];
if (XawTextSourceRead(ispell.source, pos - 1, &check, 1) > 0) {
- if (international)
- wctomb(mb, *(wchar_t*)check.ptr);
- else
- *mb = *check.ptr;
+ wctomb(mb, *(wchar_t*)check.ptr);
do_replace = !isalpha(*mb) && *mb && !strchr(ispell.wchars, *mb);
}
if (do_replace &&
XawTextSourceRead(ispell.source, pos + search.length, &check, 1) > 0) {
- if (international)
- wctomb(mb, *(wchar_t*)check.ptr);
- else
- *mb = *check.ptr;
+ wctomb(mb, *(wchar_t*)check.ptr);
do_replace = !isalpha(*mb) && *mb && !strchr(ispell.wchars, *mb);
}
if (do_replace) {
diff --git a/lisp/internal.h b/lisp/internal.h
index 6e9ba1a..487156a 100644
--- a/lisp/internal.h
+++ b/lisp/internal.h
@@ -1,4 +1,4 @@
-/* $XdotOrg: xc/programs/xedit/lisp/internal.h,v 1.1.4.3.4.1 2004/03/04 17:48:56 eich Exp $ */
+/* $XdotOrg: xc/programs/xedit/lisp/internal.h,v 1.2 2004/04/23 19:54:44 eich Exp $ */
/*
* Copyright (c) 2001 by The XFree86 Project, Inc.
*
diff --git a/lisp/lisp.c b/lisp/lisp.c
index da5d1c8..15226f6 100644
--- a/lisp/lisp.c
+++ b/lisp/lisp.c
@@ -46,7 +46,7 @@
#endif
#if defined(linux)
-#include <asm/page.h> /* for PAGE_SIZE */
+#include <asm/page.h> /* for PAGE_SIZE */
#define HAS_GETPAGESIZE
#define HAS_SC_PAGESIZE /* _SC_PAGESIZE may be an enum for Linux */
#endif
diff --git a/lisp/modules/xedit.lsp b/lisp/modules/xedit.lsp
index 970ff3a..525c965 100644
--- a/lisp/modules/xedit.lsp
+++ b/lisp/modules/xedit.lsp
@@ -27,7 +27,7 @@
;; Author: Paulo César Pereira de Andrade
;;
;;
-;; $XdotOrg: xc/programs/xedit/lisp/modules/xedit.lsp,v 1.1.4.1.4.2 2004/03/05 12:46:31 eich Exp $
+;; $XdotOrg: xc/programs/xedit/lisp/modules/xedit.lsp,v 1.2 2004/04/23 19:54:45 eich Exp $
;; $XFree86: xc/programs/xedit/lisp/modules/xedit.lsp,v 1.9 2003/01/16 03:50:46 paulo Exp $
;;
diff --git a/lisp/private.h b/lisp/private.h
index 0b49127..43af828 100644
--- a/lisp/private.h
+++ b/lisp/private.h
@@ -27,7 +27,7 @@
* Author: Paulo César Pereira de Andrade
*/
-/* $XdotOrg: xc/programs/xedit/lisp/private.h,v 1.1.4.2.4.2 2004/03/04 19:58:55 kaleb Exp $ */
+/* $XdotOrg: xc/programs/xedit/lisp/private.h,v 1.2 2004/04/23 19:54:44 eich Exp $ */
/* $XFree86: xc/programs/xedit/lisp/private.h,v 1.41 2003/05/27 22:27:04 tsi Exp $ */
#ifndef Lisp_private_h
diff --git a/lisp/string.c b/lisp/string.c
index b12aadf..2a06b0e 100644
--- a/lisp/string.c
+++ b/lisp/string.c
@@ -27,7 +27,7 @@
* Author: Paulo César Pereira de Andrade
*/
-/* $XdotOrg: xc/programs/xedit/lisp/string.c,v 1.1.4.2.4.2 2004/03/04 19:58:55 kaleb Exp $ */
+/* $XdotOrg: xc/programs/xedit/lisp/string.c,v 1.2 2004/04/23 19:54:44 eich Exp $ */
/* $XFree86: xc/programs/xedit/lisp/string.c,v 1.24tsi Exp $ */
#include "lisp/helper.h"
diff --git a/print.c b/print.c
new file mode 100644
index 0000000..f068afe
--- /dev/null
+++ b/print.c
@@ -0,0 +1,390 @@
+/*
+ * $Xorg: print.c,v 1.1 2004/04/30 02:05:54 gisburn Exp $
+ *
+Copyright 2004 Roland Mainz <roland.mainz@nrubsig.org>
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+ *
+ */
+
+/* Turn a NULL pointer string into an empty string */
+#define NULLSTR(x) (((x)!=NULL)?(x):(""))
+
+#define Error(x) { printf x ; exit(EXIT_FAILURE); }
+#define Assertion(expr, msg) { if (!(expr)) { Error msg } }
+#define Log(x) { if(True) printf x; }
+
+#include "print.h"
+#include <X11/Xaw/Form.h>
+#include <X11/Xaw/Label.h>
+#include <X11/Xaw/AsciiText.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+static Widget
+CreatePrintShell(Widget videoshell,
+ Screen *pscreen,
+ String printshell_name,
+ ArgList args,
+ Cardinal numargs)
+{
+ String videoname,
+ videoclass;
+ Widget pappshell,
+ printshell;
+ Display *pdpy = XDisplayOfScreen(pscreen);
+ int dummyc = 0;
+ String dummys = "";
+ XtGetApplicationNameAndClass(XtDisplay(videoshell),
+ &videoname, &videoclass);
+
+ /* XXX: Why is the |dummyc|&&|dummys| stuff needed here ? */
+ XtDisplayInitialize(XtWidgetToApplicationContext(videoshell), pdpy,
+ videoname, videoclass,
+ NULL, 0,
+ &dummyc, &dummys);
+
+ pappshell = XtVaAppCreateShell(videoname, videoclass,
+ applicationShellWidgetClass,
+ pdpy,
+ XtNscreen, pscreen,
+ NULL);
+ printshell = XtCreatePopupShell(printshell_name,
+ xawPrintShellWidgetClass,
+ pappshell, args, numargs);
+
+
+ /* we're mapping/unmapping at start/end page time */
+ XtSetMappedWhenManaged(printshell, False);
+
+ /* We realise the widget when we're done with building the widget tree... */
+
+ return printshell;
+}
+
+typedef struct
+{
+ const char *programname;
+ Widget toplevel;
+ Bool isPrinting;
+ Widget printshell;
+ struct
+ {
+ Widget form;
+ Widget pageheaderlabel;
+ Widget text;
+ } content; /* content to print */
+ int numpages;
+ Display *pdpy;
+ Screen *pscreen;
+ XPContext pcontext;
+ XtCallbackProc pdpyDestroyCallback;
+ void *printtofile_handle;
+ const char *jobtitle;
+} AppPrintData;
+
+static AppPrintData apdx;
+static AppPrintData *apd = &apdx;
+
+/* Count pages in a text widget
+ * WARNING: This will reset the current position of the text widget
+ * back to the beginning */
+static
+long CountPages(Widget textWidget)
+{
+ long numpages = 0;
+
+ XawTextPosition prevpagepos = -1,
+ currpos = 0;
+
+ /* Move to the top of the file... */
+ XtCallActionProc(textWidget, "beginning-of-file", NULL, NULL, 0);
+
+ /* ... count pages ...*/
+ do
+ {
+ prevpagepos = XawTextTopPosition(textWidget);
+ XtCallActionProc(textWidget, "next-page", NULL, NULL, 0);
+ currpos = XawTextTopPosition(textWidget);
+ numpages++;
+ } while(prevpagepos != currpos);
+
+ /* ... and move to the top of the file... */
+ XtCallActionProc(textWidget, "beginning-of-file", NULL, NULL, 0);
+
+ Log(("CountPages() found %ld pages.\n", numpages))
+
+ return numpages;
+}
+
+static void
+PageSetupCB(Widget widget, XtPointer client_data, XtPointer call_data)
+{
+ Widget pshell = widget;
+ XawPrintShellCallbackStruct *psp = (XawPrintShellCallbackStruct *)call_data;
+ AppPrintData *p = (AppPrintData *)client_data;
+
+ Log(("--> PageSetupCB\n"));
+
+ if (!psp->last_page_in_job) {
+ int currpage;
+ char buffer[256];
+
+ XtVaGetValues(pshell, XawNcurrPageNumInJob, &currpage, NULL);
+
+ sprintf(buffer, "Title: %s / Page: %d/%d", p->jobtitle, currpage, p->numpages);
+ XtVaSetValues(apd->content.pageheaderlabel, XtNlabel, buffer, NULL);
+
+ /* Note: XawPrintShell's pagecount starts with '1'
+ * (=first page is page no. '1') */
+ if (currpage > 1) {
+ Log(("pagedown %d\n", currpage));
+ XtCallActionProc(p->content.text, "next-page", NULL, NULL, 0);
+ }
+ else
+ {
+ Log(("first page\n"));
+ }
+
+ if (currpage >= p->numpages) {
+ psp->last_page_in_job = True;
+ }
+ }
+}
+
+static
+void FinishPrinting(AppPrintData *p)
+{
+ if (p->printtofile_handle) {
+ if (XpuWaitForPrintFileChild(p->printtofile_handle) != XPGetDocFinished) {
+ fprintf(stderr, "%s: Error while printing to file.\n", apd->programname);
+ }
+ p->printtofile_handle = NULL;
+ }
+
+ if (p->printshell) {
+ XtDestroyWidget(p->printshell);
+ p->printshell = NULL;
+ }
+
+ /* Two issues here:
+ * 1. The print display connection is owned by the print dialog
+ * To avoid any problems with that use a callback back to the main
+ * application which calls
+ * |XawPrintDialogClosePrinterConnection(w, False)| to ask the
+ * print dialog widget to close all print display resources and
+ * disown the object.
+ * 2. We have to use XpDestroyContext() and XtCloseDisplay()
+ * instead of XpuClosePrinterDisplay() to make libXt happy...
+ *
+ * Call callback... */
+ (*apd->pdpyDestroyCallback)(NULL, NULL, NULL); /* HACK! */
+
+ /* ... and then get rid of the display */
+ if (p->pcontext != None) {
+ XpDestroyContext(p->pdpy, p->pcontext);
+ }
+ XtCloseDisplay(p->pdpy);
+
+ p->toplevel = NULL;
+ p->isPrinting = False;
+ p->pdpy = NULL;
+ p->pscreen = NULL;
+ p->pcontext = None;
+}
+
+static
+void PrintEndJobCB(Widget pshell, XtPointer client_data, XtPointer call_data)
+{
+ AppPrintData *p = (AppPrintData *)client_data;
+
+ Log(("--> PrintEndJobCB\n"));
+
+ /* Finish printing and destroy print shell (it's legal to destroy Xt
+ * widgets from within it's own callbacks) */
+ FinishPrinting(p);
+}
+
+static
+XFontSet GetPrintTextFontSet(const char *appname, Display *pdpy, long dpi)
+{
+ XFontSet fontset;
+ char fontname[1024];
+ char **missing_charset_list_return;
+ int missing_charset_count_return;
+ char *def_string_return;
+ int i;
+
+ sprintf(fontname, /* Default font for CDE */
+ "-dt-interface user-medium-r-normal-s*-*-120-%ld-%ld-*-*,"
+ /* Default font */
+ "-adobe-courier-medium-r-normal--*-120-%ld-%ld-*-*,"
+ /* Default font for Linux/Japanese locales (ja_JP.SJIS) */
+ "-watanabe-mincho-medium-r-normal--*-120-%ld-%ld-*-*,"
+ "-wadalab-gothic-medium-r-normal--*-120-%ld-%ld-*-*,"
+ /* Fallback */
+ "-*-*-*-*-*--*-120-%ld-%ld-*-*",
+ dpi, dpi,
+ dpi, dpi,
+ dpi, dpi,
+ dpi, dpi,
+ dpi, dpi);
+ fontset = XCreateFontSet(pdpy, fontname,
+ &missing_charset_list_return,
+ &missing_charset_count_return,
+ &def_string_return);
+
+ for( i=0 ; i < missing_charset_count_return ; i++ ) {
+ fprintf(stderr, "%s: warning: font for charset %s is lacking.\n",
+ appname, missing_charset_list_return[i]);
+ }
+
+ if (!fontset)
+ Error(("GetPrintTextFontSet: XCreateFontSet() failure.\n"));
+ return fontset;
+}
+
+void DoPrintTextSource(const char *programname,
+ Widget textsource, Widget toplevel,
+ Display *pdpy, XPContext pcontext,
+ XtCallbackProc pdpyDestroyCB,
+ const char *jobtitle, const char *toFile)
+{
+ long dpi = 0;
+ int n;
+ Arg args[20];
+ XFontSet textfontset = NULL;
+ XFontSetExtents *font_extents;
+
+ apd->programname = programname;
+ apd->pdpyDestroyCallback = pdpyDestroyCB;
+
+ if (apd->isPrinting) {
+ fprintf(stderr, "%s: Already busy with printing.\n", apd->programname);
+ return;
+ }
+
+ /* Configure the print context (paper size, title etc.)
+ * We must do this before creating any Xt widgets - otherwise they will
+ * make wrong assuptions about fonts, resultions etc. ...
+ */
+ XpuSetJobTitle(pdpy, pcontext, jobtitle);
+
+ /* Configuration done, set the context */
+ XpSetContext(pdpy, pcontext);
+
+ /* Get default printer resolution */
+ if (XpuGetResolution(pdpy, pcontext, &dpi) != 1) {
+ fprintf(stderr, "%s: No default resolution for printer.\n", apd->programname);
+ XpuClosePrinterDisplay(pdpy, pcontext);
+ return;
+ }
+
+ apd->toplevel = toplevel;
+ apd->pdpy = pdpy;
+ apd->pcontext = pcontext;
+ apd->pscreen = XpGetScreenOfContext(pdpy, pcontext);
+ apd->jobtitle = jobtitle;
+
+ n = 0;
+ XtSetArg(args[n], XawNlayoutMode, XawPrintLAYOUTMODE_DRAWABLEAREA); n++;
+ apd->printshell = CreatePrintShell(toplevel, apd->pscreen, "printshell", args, n);
+
+ n = 0;
+ XtSetArg(args[n], XtNresizable, True); n++;
+ XtSetArg(args[n], XtNright, XtChainRight); n++;
+ apd->content.form = XtCreateManagedWidget("form", formWidgetClass, apd->printshell, args, n);
+
+ textfontset = GetPrintTextFontSet(apd->programname, pdpy, dpi);
+
+ n = 0;
+ XtSetArg(args[n], XtNinternational, True); n++;
+ XtSetArg(args[n], XtNfromHoriz, NULL); n++;
+ XtSetArg(args[n], XtNfromVert, NULL); n++;
+ XtSetArg(args[n], XtNtop, XtChainTop); n++;
+ XtSetArg(args[n], XtNright, XtChainRight); n++;
+ XtSetArg(args[n], XtNresizable, True); n++;
+ XtSetArg(args[n], XtNfontSet, textfontset); n++;
+ XtSetArg(args[n], XtNlabel, "Page: n/n"); n++;
+ XtSetArg(args[n], XtNjustify, XtJustifyRight); n++;
+ apd->content.pageheaderlabel = XtCreateManagedWidget("pageinfo", labelWidgetClass, apd->content.form, args, n);
+
+ font_extents = XExtentsOfFontSet(textfontset);
+
+ n = 0;
+ XtSetArg(args[n], XtNinternational, True); n++;
+ XtSetArg(args[n], XtNtextSource, textsource); n++;
+ XtSetArg(args[n], XtNscrollHorizontal, XawtextScrollNever); n++;
+ XtSetArg(args[n], XtNscrollVertical, XawtextScrollNever); n++;
+
+/* Usually I would expect that using |XtNfromVert, apd->content.pageheaderlabel|
+ * would be the correct way to place the text widget with the main content below
+ * the page header widget - but for an unknown reason this doesn not work: The
+ * text widget squishes itself into the bottom half of the page and only occupies
+ * 1/2 of the page's with... ;-(( */
+#define WORKAROUND_FOR_SOMETHING_IS_WRONG 1
+#ifdef WORKAROUND_FOR_SOMETHING_IS_WRONG
+ XtSetArg(args[n], XtNtop, XtChainTop); n++;
+ XtSetArg(args[n], XtNright, XtChainRight); n++;
+ XtSetArg(args[n], XtNvertDistance, (font_extents->max_logical_extent.height+2)*2); n++;
+#else
+ XtSetArg(args[n], XtNfromHoriz, NULL); n++;
+ XtSetArg(args[n], XtNfromVert, apd->content.pageheaderlabel); n++;
+#endif
+ XtSetArg(args[n], XtNfontSet, textfontset); n++;
+ apd->content.text = XtCreateManagedWidget("text", asciiTextWidgetClass, apd->content.form, args, n);
+
+ /* Disable the caret - that is not needed for printing */
+ XawTextDisplayCaret(apd->content.text, False);
+
+ XtAddCallback(apd->printshell, XawNpageSetupCallback, PageSetupCB, (XtPointer)apd);
+ XtAddCallback(apd->printshell, XawNendJobCallback, PrintEndJobCB, (XtPointer)apd);
+
+ /* Realise print shell (which will set position+size of the child
+ * widgets based on the current page size) */
+ XtRealizeWidget(apd->printshell);
+
+ /* Count number of pages in the text widget */
+ apd->numpages = CountPages(apd->content.text);
+
+ /* Make sure that the Xt machinery is really using the right screen (assertion) */
+ if (XpGetScreenOfContext(XtDisplay(apd->printshell), apd->pcontext) != XtScreen(apd->printshell))
+ Error(("Widget's screen != print screen. BAD.\n"));
+
+ apd->isPrinting = True;
+
+ if (toFile) {
+ printf("%s: Printing to file '%s'...\n", apd->programname, toFile);
+ apd->printtofile_handle = XpuStartJobToFile(pdpy, pcontext, toFile);
+ if (!apd->printtofile_handle) {
+ perror("XpuStartJobToFile failure");
+ apd->isPrinting = False;
+ return;
+ }
+ }
+ else
+ {
+ printf("%s: Printing to printer...\n", apd->programname);
+ XpuStartJobToSpooler(pdpy);
+ }
+}
+
+
diff --git a/print.h b/print.h
new file mode 100644
index 0000000..69321a1
--- /dev/null
+++ b/print.h
@@ -0,0 +1,47 @@
+/*
+ * $Xorg: print.h,v 1.1 2004/04/30 02:05:54 gisburn Exp $
+ *
+Copyright 2004 Roland Mainz <roland.mainz@nrubsig.org>
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+ *
+ */
+
+#ifndef XMORE_PRINT_H
+#define XMORE_PRINT_H 1
+
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h>
+#include <X11/Xaw/Print.h>
+#include <X11/Xaw/Cardinals.h>
+#include <X11/XprintUtil/xprintutil.h>
+
+/* Prototypes */
+void DoPrintTextSource(const char *programname,
+ Widget textsource,
+ Widget toplevel,
+ Display *pdpy, XPContext pcontext,
+ XtCallbackProc printDisplayDestroyCallback,
+ const char *jobTitle,
+ const char *toFile);
+
+#endif /* !XMORE_PRINT_H */
diff --git a/printdialog.c b/printdialog.c
new file mode 100644
index 0000000..97cf4c9
--- /dev/null
+++ b/printdialog.c
@@ -0,0 +1,1353 @@
+/*
+ * $Xorg: printdialog.c,v 1.1 2004/05/12 02:05:54 gisburn Exp $
+ *
+Copyright 2004 Roland Mainz <roland.mainz@nrubsig.org>
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+ *
+ */
+
+/* Force ANSI C prototypes from X11 headers */
+#ifndef FUNCPROTO
+#define FUNCPROTO 15
+#endif /* !FUNCPROTO */
+
+#include <X11/StringDefs.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+#include <X11/Xaw/Form.h>
+#include <X11/Xaw/Toggle.h>
+#include <X11/Xaw/List.h>
+#include <X11/Xaw/Command.h>
+#include <X11/Xaw/AsciiText.h>
+#include <X11/Xaw/Dialog.h>
+
+#ifdef XKB
+#include <X11/extensions/XKBbells.h>
+#endif /* XKB */
+
+#include "printdialog.h"
+#include "printdialogprivates.h"
+#include "print.h"
+
+#include <stdlib.h>
+#include <ctype.h>
+#include <stdio.h>
+
+/* Turn a NULL pointer string into an empty string */
+#define NULLSTR(x) (((x)!=NULL)?(x):(""))
+
+#define Error(x) { printf x ; exit(EXIT_FAILURE); }
+#define Assertion(expr, msg) { if (!(expr)) { Error msg } }
+#ifdef DEBUG
+# define Log(x) { if(True) printf x; }
+#else
+# define Log(x) { if(False) printf x; }
+#endif /* DEBUG */
+
+/* Local prototypes */
+static void do_beep(PrintDialogWidget pdw);
+static void center_popup(Widget parent, Widget popup);
+static void updateWidgetStates(PrintDialogWidget pdw);
+static void printSetupClose(PrintDialogWidget pdw);
+static void printSetupOKXtProc(Widget w, XtPointer client_data, XtPointer callData);
+static void printSetupCancelXtProc(Widget w, XtPointer client_data, XtPointer callData);
+static void printSetupJobCopiesXtProc(Widget w, XtPointer client_data, XtPointer callData);
+static void printDialogDestXtProc(Widget w, XtPointer client_data, XtPointer callData);
+static void printSelectFileXtProc(Widget w, XtPointer client_data, XtPointer callData);
+static void printOKXtProc(Widget w, XtPointer client_data, XtPointer callData);
+static void printSetupXtProc(Widget w, XtPointer client_data, XtPointer callData);
+static void printFileSelectedXtProc(Widget w, XtPointer client_data, XtPointer callData);
+static void buildFileDialog(PrintDialogWidget pdw);
+static void closePrinterConnection(PrintDialogWidget pdw, Bool closeDisplay);
+static Bool openPrinterConnection(PrintDialogWidget pdw);
+static void destroyPrintSetupDialog(PrintDialogWidget pdw);
+static Widget buildPrintSetupDialog(PrintDialogWidget pdw);
+static String *xpprinterlist_to_widget_printerlist(XPPrinterList printerlist, int num_printers);
+static String *xppaperlist_to_widget_paperlist(XpuMediumSourceSizeList paperlist, int num_papers);
+static String *xpresolutionlist_to_widget_resolutionlist(XpuResolutionList reslist, int num_resolutions);
+static String *xporientationlist_to_widget_orientationlist(XpuOrientationList orientationlist, int num_orientations);
+static String *xpplexlist_to_widget_plexlist(XpuPlexList plexlist, int num_plex);
+static void printerSelectionPrinterSelectedXtProc(Widget w, XtPointer client_data, XtPointer callData);
+static void printSelectPrinterXtProc(Widget w, XtPointer client_data, XtPointer callData);
+static void printerSelectionClose(PrintDialogWidget pdw);
+static void printerSelectionOKXtProc(Widget w, XtPointer client_data, XtPointer callData);
+static void printerSelectionCancelXtProc(Widget w, XtPointer client_data, XtPointer callData);
+static Bool buildPrinterSelectionDialog(PrintDialogWidget pdw);
+static void destroyPrinterSelectionDialog(PrintDialogWidget pdw);
+static void createprintdialogchildren(Widget w);
+
+static
+void do_beep(PrintDialogWidget pdw)
+{
+ Log(("*** Beep!\n"));
+#ifdef XKB
+ XkbStdBell(XtDisplay((Widget)pdw), XtWindow((Widget)pdw), 0, XkbBI_MinorError);
+#else
+ XBell(XtDisplay((Widget)pdw), 0);
+#endif /* XKB */
+}
+
+/* Center popup (on parent, not on screen - which would be a bad idea
+ * in the Xinerama case) */
+static
+void center_popup(Widget parent, Widget popup)
+{
+ Dimension width,
+ height;
+ Position x,
+ y;
+
+ XtVaGetValues(parent,
+ XtNx, &x,
+ XtNy, &y,
+ NULL);
+ XtVaGetValues(popup,
+ XtNwidth, &width,
+ XtNheight, &height,
+ NULL);
+
+ x += (Position)width / 2;
+ y += (Position)height / 3;
+
+ XtVaSetValues(popup,
+ XtNx, x,
+ XtNy, y,
+ NULL);
+}
+
+static
+void updateWidgetStates(PrintDialogWidget pdw)
+{
+ PrintDialogPart *pdp = &pdw->printdialog;
+
+ /* Do not update anything if we will be destroyed */
+ if (pdw->core.being_destroyed)
+ return;
+
+ if (pdp->printToFile == False) {
+ XtVaSetValues(pdp->main.printtoprinter, XtNstate, True, NULL);
+ XtVaSetValues(pdp->main.printtofile, XtNstate, False, NULL);
+ /* Disable the widgets which depend on print-to-file */
+ XtVaSetValues(pdp->main.filenamelabel, XtNsensitive, False, NULL);
+ XtVaSetValues(pdp->main.filename, XtNsensitive, False, NULL);
+ XtVaSetValues(pdp->main.selectfile, XtNsensitive, False, NULL);
+ }
+ else
+ {
+ XtVaSetValues(pdp->main.printtoprinter, XtNstate, False, NULL);
+ XtVaSetValues(pdp->main.printtofile, XtNstate, True, NULL);
+ /* Enable the widgets which depend on print-to-file */
+ XtVaSetValues(pdp->main.filenamelabel, XtNsensitive, True, NULL);
+ XtVaSetValues(pdp->main.filename, XtNsensitive, True, NULL);
+ XtVaSetValues(pdp->main.selectfile, XtNsensitive, True, NULL);
+ }
+
+ /* Update file name */
+ XtVaSetValues(pdp->main.filename, XtNlabel, pdp->filename?pdp->filename:"-", NULL);
+
+ /* General check whether we can print... */
+ pdp->canPrint = True;
+ if (pdp->printer_name == NULL) {
+ pdp->canPrint = False;
+ }
+ else if (strlen(pdp->printer_name) == 0) {
+ pdp->canPrint = False;
+ }
+
+ pdp->canReallyPrint = pdp->canPrint;
+
+ /* Some extra checks for print-to-file */
+ if (pdp->printToFile) {
+ if (pdp->filename == NULL) {
+ pdp->canReallyPrint = False;
+ }
+ else if (strlen(pdp->filename) == 0) {
+ pdp->canReallyPrint = False;
+ }
+ }
+
+ XtVaSetValues(pdp->main.ok, XtNsensitive, pdp->canReallyPrint, NULL);
+ XtVaSetValues(pdp->main.setup, XtNsensitive, pdp->canPrint, NULL);
+}
+
+static void
+printSetupClose(PrintDialogWidget pdw)
+{
+ PrintDialogPart *pdp = &pdw->printdialog;
+ if (pdp->setup.popup) {
+ XtPopdown(pdp->setup.popup);
+ }
+}
+
+static void
+printSetupOKXtProc(Widget w, XtPointer client_data, XtPointer callData)
+{
+ PrintDialogWidget pdw = (PrintDialogWidget)client_data;
+ PrintDialogPart *pdp = &pdw->printdialog;
+ char *s;
+ XawListReturnStruct *lrs;
+ Log(("## printSetupOK: closing print setup!\n"));
+
+ /* Set copy count (if the value is invalid beep and return to the user ) */
+ XtVaGetValues(pdp->setup.jobcopies, XtNstring, &s, NULL);
+ if (s) {
+ int c = atoi(s);
+ if (c < 1 || c > 999) {
+ do_beep(pdw);
+ XtVaSetValues(pdp->setup.jobcopies, XtNstring, "1", NULL);
+ Log(("## printSetupOKXtProc: not a valid copy count value\n"));
+ return;
+ }
+
+ /* Fix me: We should set the number of _job_ copies here, not _doc_ copies */
+ XpuSetDocumentCopies(pdp->pdpy, pdp->pcontext, c);
+ }
+
+ /* Set paper size */
+ lrs = XawListShowCurrent(pdp->setup.paperlist);
+ if (lrs->list_index != XAW_LIST_NONE) {
+ Log(("selected paper is '%s'/'%d'\n", lrs->string, lrs->list_index));
+ Assertion(lrs->list_index < pdp->num_papers, (("Error: lrs->list_index < pdp->num_papers\n")));
+ XpuSetDocMediumSourceSize(pdp->pdpy, pdp->pcontext, &pdp->paperlist[lrs->list_index]);
+ }
+ XtFree((char *)lrs);
+
+ /* Set resolution */
+ lrs = XawListShowCurrent(pdp->setup.resolutionlist);
+ if (lrs->list_index != XAW_LIST_NONE) {
+ Log(("selected resolution is '%s'/'%d'\n", lrs->string, lrs->list_index));
+ Assertion(lrs->list_index < pdp->num_resolutions, (("Error: lrs->list_index < pdp->num_resolutions\n")));
+ XpuSetDocResolution(pdp->pdpy, pdp->pcontext, &pdp->resolutionlist[lrs->list_index]);
+ }
+ XtFree((char *)lrs);
+
+ /* Set orientation */
+ lrs = XawListShowCurrent(pdp->setup.orientationlist);
+ if (lrs->list_index != XAW_LIST_NONE) {
+ Log(("selected orientation is '%s'/'%d'\n", lrs->string, lrs->list_index));
+ Assertion(lrs->list_index < pdp->num_orientations, (("Error: lrs->list_index < pdp->num_orientations\n")));
+ XpuSetDocOrientation(pdp->pdpy, pdp->pcontext, &pdp->orientationlist[lrs->list_index]);
+ }
+ XtFree((char *)lrs);
+
+ /* Set plex mode */
+ lrs = XawListShowCurrent(pdp->setup.plexlist);
+ if (lrs->list_index != XAW_LIST_NONE) {
+ Log(("selected plex is '%s'/'%d'\n", lrs->string, lrs->list_index));
+ Assertion(lrs->list_index < pdp->num_plex, (("Error: lrs->list_index < pdp->num_plex\n")));
+ XpuSetDocPlex(pdp->pdpy, pdp->pcontext, &pdp->plexlist[lrs->list_index]);
+ }
+ XtFree((char *)lrs);
+
+ printSetupClose(pdw);
+}
+
+static void
+printSetupCancelXtProc(Widget w, XtPointer client_data, XtPointer callData)
+{
+ PrintDialogWidget pdw = (PrintDialogWidget)client_data;
+ Log(("## printSetupCancel: closing print setup!\n"));
+
+ printSetupClose(pdw);
+}
+
+static void
+printSetupJobCopiesXtProc(Widget w, XtPointer client_data, XtPointer callData)
+{
+ PrintDialogWidget pdw = (PrintDialogWidget)client_data;
+ PrintDialogPart *pdp = &pdw->printdialog;
+ char *string = NULL;
+
+ Log(("## printSetupJobCopiesXtProc!\n"));
+
+ /* Check whether the input is a valid number - and in the case of invalid input reset the value */
+ XtVaGetValues(pdp->setup.jobcopies, XtNstring, &string, NULL);
+ if (string) {
+ char *s;
+ int i;
+ Bool isValidNumber = True;
+
+ /* First check for invalid characters... */
+ for( s = string ; *s != '\0' ; s++ ) {
+ if (!isdigit(*s)) {
+ isValidNumber = False;
+ break;
+ }
+ }
+
+ /* .. and the do a range check... */
+ i = atoi(string);
+ if (i < 1 || i > 999) {
+ isValidNumber = False;
+ }
+
+ if (!isValidNumber) {
+ do_beep(pdw);
+ XtVaSetValues(pdp->setup.jobcopies, XtNstring, "1", NULL);
+ Log(("## printSetupJobCopiesXtProc: not a valid number\n"));
+ }
+ }
+}
+
+static void
+printCancelXtProc(Widget w, XtPointer client_data, XtPointer callData)
+{
+ PrintDialogWidget pdw = (PrintDialogWidget)client_data;
+ PrintDialogPart *pdp = &pdw->printdialog;
+
+ printSetupClose(pdw);
+
+ if (pdp->cancel_callback) {
+ Log(("printCancelXtProc: calling callback\n"));
+ XtCallCallbackList((Widget)pdw, pdp->cancel_callback, NULL);
+ }
+}
+
+static void
+printDialogDestXtProc(Widget w, XtPointer client_data, XtPointer callData)
+{
+ PrintDialogWidget pdw = (PrintDialogWidget)client_data;
+ PrintDialogPart *pdp = &pdw->printdialog;
+
+ if (w == pdp->main.printtoprinter) {
+ pdp->printToFile = False;
+ }
+ else if (w == pdp->main.printtofile) {
+ pdp->printToFile = True;
+ }
+ else
+ {
+ Log(("printDialogDestXtProc: ERROR: Unknown widget.\n"));
+ }
+
+ updateWidgetStates(pdw);
+}
+
+static void
+printSelectFileXtProc(Widget w, XtPointer client_data, XtPointer callData)
+{
+ PrintDialogWidget pdw = (PrintDialogWidget)client_data;
+ PrintDialogPart *pdp = &pdw->printdialog;
+
+ Log(("## printSelectFileXtProc!\n"));
+
+ if (!pdp->selectFile.shell) {
+ buildFileDialog(pdw);
+ }
+
+ center_popup((Widget)pdw, pdp->selectFile.shell);
+
+ XtPopup(pdp->selectFile.shell, XtGrabExclusive);
+}
+
+static void
+printOKXtProc(Widget w, XtPointer client_data, XtPointer callData)
+{
+ PrintDialogWidget pdw = (PrintDialogWidget)client_data;
+ PrintDialogPart *pdp = &pdw->printdialog;
+ Log(("## printing!\n"));
+
+ if (!pdp->pdpy) {
+ Log(("printOKXtProc: no printer connection, opening one....\n"));
+ openPrinterConnection(pdw);
+
+ if (!pdp->pdpy) {
+ Log(("printOKXtProc: still no printer connection - BAD (this should never happen).\n"));
+ do_beep(pdw);
+ return;
+ }
+ }
+
+ if (pdp->ok_callback) {
+ XawPrintDialogCallbackStruct pdcs;
+
+ Log(("printOKXtProc: calling callbacks...\n"));
+ memset(&pdcs, 0, sizeof(pdcs));
+ pdcs.pdpy = pdp->pdpy;
+ pdcs.pcontext = pdp->pcontext;
+ pdcs.printToFile = pdp->printToFile;
+ pdcs.printToFileName = (const char *)pdp->filename;
+ XtCallCallbackList((Widget)pdw, pdp->ok_callback, &pdcs);
+ }
+
+ printSetupClose(pdw);
+}
+
+static void
+printSetupXtProc(Widget w, XtPointer client_data, XtPointer callData)
+{
+ PrintDialogWidget pdw = (PrintDialogWidget)client_data;
+ PrintDialogPart *pdp = &pdw->printdialog;
+
+ Log(("## setup!\n"));
+
+ if (!pdp->setup.popup) {
+ if (buildPrintSetupDialog(pdw) == NULL) {
+ Log(("printSetupXtProc: buildPrintSetupDialog failure.\n"));
+ return;
+ }
+ }
+
+ center_popup((Widget)pdw, pdp->setup.popup);
+
+ XtPopup(pdp->setup.popup, XtGrabExclusive);
+}
+
+static void
+printFileSelectedXtProc(Widget w, XtPointer client_data, XtPointer callData)
+{
+ PrintDialogWidget pdw = (PrintDialogWidget)client_data;
+ PrintDialogPart *pdp = &pdw->printdialog;
+ const char *filename;
+
+ Log(("printFileSelectedXtProc: User selected file.\n"));
+ filename = XawDialogGetValueString(pdp->selectFile.dialog);
+
+ if (pdp->filename)
+ free(pdp->filename);
+ pdp->filename = strdup(filename);
+
+ XtPopdown(pdp->selectFile.shell);
+
+ updateWidgetStates(pdw);
+}
+
+static
+void buildFileDialog(PrintDialogWidget pdw)
+{
+ PrintDialogPart *pdp = &pdw->printdialog;
+ int n;
+ Arg args[20];
+
+ pdp->selectFile.shell = XtCreatePopupShell("selectfile",
+ transientShellWidgetClass,
+ (Widget)pdw, NULL, 0);
+ n = 0;
+ XtSetArg(args[n], XtNvalue, pdp->filename?pdp->filename:""); n++;
+ pdp->selectFile.dialog = XtCreateManagedWidget("dialog", dialogWidgetClass,
+ pdp->selectFile.shell, args, n);
+ XawDialogAddButton(pdp->selectFile.dialog, "Accept", printFileSelectedXtProc, pdw);
+
+ XtRealizeWidget(pdp->selectFile.shell);
+}
+
+static
+void closePrinterConnection(PrintDialogWidget pdw, Bool closeDisplay)
+{
+ PrintDialogPart *pdp = &pdw->printdialog;
+
+ Log(("# closePrinterConnection\n"));
+
+ destroyPrintSetupDialog(pdw);
+
+ if (pdp->paperlist) {
+ XpuFreeMediumSourceSizeList(pdp->paperlist);
+ pdp->paperlist = NULL;
+ }
+
+ if (pdp->widget_paperlist) {
+ free(pdp->widget_paperlist);
+ pdp->widget_paperlist = NULL;
+ }
+
+ if (pdp->resolutionlist) {
+ XpuFreeResolutionList(pdp->resolutionlist);
+ pdp->resolutionlist = NULL;
+ }
+
+ if (pdp->widget_resolutionlist) {
+ free(pdp->widget_resolutionlist);
+ pdp->widget_resolutionlist = NULL;
+ }
+
+
+ if (pdp->orientationlist) {
+ XpuFreeOrientationList(pdp->orientationlist);
+ pdp->orientationlist = NULL;
+ }
+
+ if (pdp->widget_orientationlist) {
+ free(pdp->widget_orientationlist);
+ pdp->widget_orientationlist = NULL;
+ }
+
+ if (pdp->plexlist) {
+ XpuFreePlexList(pdp->plexlist);
+ pdp->plexlist = NULL;
+ }
+
+ if (pdp->widget_plexlist) {
+ free(pdp->widget_plexlist);
+ pdp->widget_plexlist = NULL;
+ }
+
+ if (pdp->pdpy) {
+ if (closeDisplay) {
+ XpuClosePrinterDisplay(pdp->pdpy, pdp->pcontext);
+ }
+ pdp->pdpy = NULL;
+ pdp->pcontext = None;
+ }
+
+ updateWidgetStates(pdw);
+}
+
+static
+Bool openPrinterConnection(PrintDialogWidget pdw)
+{
+ PrintDialogPart *pdp = &pdw->printdialog;
+
+ Log(("# openPrinterConnection\n"));
+
+ /* Close any outstanding connection first... */
+ closePrinterConnection(pdw, True);
+
+ if (!pdp->printer_name) {
+ Log(("# error: openPrinterConnection: No printer name.\n"));
+ return False;
+ }
+
+ if (XpuGetPrinter(pdp->printer_name, &pdp->pdpy, &pdp->pcontext) == False) {
+ Log(("openPrinterConnection: could not open printer.\n"));
+ return False;
+ }
+
+ pdp->paperlist = XpuGetMediumSourceSizeList(pdp->pdpy, pdp->pcontext, &pdp->num_papers);
+ pdp->resolutionlist = XpuGetResolutionList(pdp->pdpy, pdp->pcontext, &pdp->num_resolutions);
+ pdp->orientationlist = XpuGetOrientationList(pdp->pdpy, pdp->pcontext, &pdp->num_orientations);
+ pdp->plexlist = XpuGetPlexList(pdp->pdpy, pdp->pcontext, &pdp->num_plex);
+
+ pdp->widget_paperlist = xppaperlist_to_widget_paperlist(pdp->paperlist, pdp->num_papers);
+ pdp->widget_resolutionlist = xpresolutionlist_to_widget_resolutionlist(pdp->resolutionlist, pdp->num_resolutions);
+ pdp->widget_orientationlist = xporientationlist_to_widget_orientationlist(pdp->orientationlist, pdp->num_orientations);
+ pdp->widget_plexlist = xpplexlist_to_widget_plexlist(pdp->plexlist, pdp->num_plex);
+
+ updateWidgetStates(pdw);
+
+ return True;
+}
+
+#undef DEFAULT_WIDTH
+#define DEFAULT_WIDTH 120
+#undef DEFAULT_INFOLABEL_WIDTH
+#define DEFAULT_INFOLABEL_WIDTH 250
+
+static
+void destroyPrintSetupDialog(PrintDialogWidget pdw)
+{
+ PrintDialogPart *pdp = &pdw->printdialog;
+
+ if (pdp->setup.popup) {
+ XtDestroyWidget(pdp->setup.popup);
+ }
+
+ /* |XtDestroyWidget(pdp->setup.popup);| above will recursively destroy
+ * all children so we only have to reset the pointers here... */
+ pdp->setup.popup = NULL;
+ pdp->setup.form = NULL;
+ pdp->setup.paperlist = NULL;
+ pdp->setup.resolutionlist = NULL;
+ pdp->setup.orientationlist = NULL;
+ pdp->setup.plexlist = NULL;
+ pdp->setup.ok = NULL;
+ pdp->setup.cancel = NULL;
+}
+
+static
+Widget buildPrintSetupDialog(PrintDialogWidget pdw)
+{
+ PrintDialogPart *pdp = &pdw->printdialog;
+ int n;
+ Arg args[20];
+ Widget listform;
+ XpuSupportedFlags jobflags,
+ docflags;
+ Bool canChangeJobCopies,
+ canChangePaperSize,
+ canChangeResolution,
+ canChangeOrientation,
+ canChangePlex;
+
+ if (!pdp->pdpy) {
+ Log(("buildPrintSetupDialog: no printer connection, opening one....\n"));
+ openPrinterConnection(pdw);
+
+ if (!pdp->pdpy) {
+ Log(("buildPrintSetupDialog: still no printer connection - BAD.\n"));
+ do_beep(pdw);
+ return NULL;
+ }
+ }
+
+ /* Get flags which types of attributes can be modified */
+ jobflags = XpuGetSupportedDocAttributes(pdp->pdpy, pdp->pcontext);
+ docflags = XpuGetSupportedDocAttributes(pdp->pdpy, pdp->pcontext);
+ canChangeJobCopies = (jobflags & XPUATTRIBUTESUPPORTED_COPY_COUNT) == XPUATTRIBUTESUPPORTED_COPY_COUNT;
+ canChangePaperSize = (docflags & XPUATTRIBUTESUPPORTED_DEFAULT_MEDIUM) == XPUATTRIBUTESUPPORTED_DEFAULT_MEDIUM;
+ canChangeResolution = (docflags & XPUATTRIBUTESUPPORTED_DEFAULT_PRINTER_RESOLUTION) == XPUATTRIBUTESUPPORTED_DEFAULT_PRINTER_RESOLUTION;
+ canChangeOrientation = (docflags & XPUATTRIBUTESUPPORTED_CONTENT_ORIENTATION) == XPUATTRIBUTESUPPORTED_CONTENT_ORIENTATION;
+ canChangePlex = (docflags & XPUATTRIBUTESUPPORTED_PLEX) == XPUATTRIBUTESUPPORTED_PLEX;
+
+ n = 0;
+ XtSetArg(args[n], XtNallowShellResize, True); n++;
+ pdp->setup.popup = XtCreatePopupShell("setup", transientShellWidgetClass, (Widget)pdw, args, n);
+
+ n = 0;
+ pdp->setup.form = XtCreateManagedWidget("form", formWidgetClass, pdp->setup.popup, args, n);
+
+ n = 0;
+ listform = XtCreateManagedWidget("list", formWidgetClass, pdp->setup.form, args, n);
+
+ n = 0;
+ XtSetArg(args[n], XtNresizable, True); n++;
+ XtSetArg(args[n], XtNforceColumns, True); n++;
+ XtSetArg(args[n], XtNdefaultColumns, 1); n++;
+ XtSetArg(args[n], XtNsensitive, canChangePaperSize); n++;
+ XtSetArg(args[n], XtNlist, pdp->widget_paperlist); n++;
+ XtSetArg(args[n], XtNwidth, DEFAULT_WIDTH); n++;
+ pdp->setup.paperlist = XtCreateManagedWidget("paperlist", listWidgetClass, listform, args, n);
+
+ n = 0;
+ XtSetArg(args[n], XtNresizable, True); n++;
+ XtSetArg(args[n], XtNforceColumns, True); n++;
+ XtSetArg(args[n], XtNdefaultColumns, 1); n++;
+ XtSetArg(args[n], XtNsensitive, canChangeResolution); n++;
+ XtSetArg(args[n], XtNlist, pdp->widget_resolutionlist); n++;
+ XtSetArg(args[n], XtNwidth, DEFAULT_WIDTH); n++;
+ pdp->setup.resolutionlist = XtCreateManagedWidget("resolutionlist", listWidgetClass, listform, args, n);
+
+ n = 0;
+ XtSetArg(args[n], XtNresizable, True); n++;
+ XtSetArg(args[n], XtNforceColumns, True); n++;
+ XtSetArg(args[n], XtNdefaultColumns, 1); n++;
+ XtSetArg(args[n], XtNsensitive, canChangeOrientation); n++;
+ XtSetArg(args[n], XtNlist, pdp->widget_orientationlist); n++;
+ XtSetArg(args[n], XtNwidth, DEFAULT_WIDTH); n++;
+ pdp->setup.orientationlist = XtCreateManagedWidget("orientationlist", listWidgetClass, listform, args, n);
+
+ n = 0;
+ XtSetArg(args[n], XtNresizable, True); n++;
+ XtSetArg(args[n], XtNforceColumns, True); n++;
+ XtSetArg(args[n], XtNdefaultColumns, 1); n++;
+ XtSetArg(args[n], XtNsensitive, canChangePlex); n++;
+ XtSetArg(args[n], XtNlist, pdp->widget_plexlist); n++;
+ XtSetArg(args[n], XtNwidth, DEFAULT_WIDTH); n++;
+ pdp->setup.plexlist = XtCreateManagedWidget("plexlist", listWidgetClass, listform, args, n);
+
+ n = 0;
+ XtSetArg(args[n], XtNborderWidth, 0); n++;
+ XtSetArg(args[n], XtNresizable, False); n++;
+ XtSetArg(args[n], XtNjustify, XtJustifyRight); n++;
+ XtSetArg(args[n], XtNwidth, DEFAULT_WIDTH); n++;
+ XtSetArg(args[n], XtNsensitive, canChangeJobCopies); n++;
+ pdp->setup.jobcopieslabel = XtCreateManagedWidget("jobcopieslabel", labelWidgetClass, listform, args, n);
+
+ n = 0;
+ XtSetArg(args[n], XtNstring, "1"); n++;
+ XtSetArg(args[n], XtNresizable, True); n++;
+ XtSetArg(args[n], XtNeditType, XawtextEdit); n++;
+ XtSetArg(args[n], XtNsensitive, canChangeJobCopies); n++;
+ pdp->setup.jobcopies = XtCreateManagedWidget("jobcopies", asciiTextWidgetClass, listform, args, n);
+ XtAddCallback(pdp->setup.jobcopies, XtNpositionCallback, printSetupJobCopiesXtProc, pdw);
+
+ n = 0;
+ pdp->setup.ok = XtCreateManagedWidget("ok", commandWidgetClass, pdp->setup.form, args, n);
+ XtAddCallback(pdp->setup.ok, XtNcallback, printSetupOKXtProc, pdw);
+
+ n = 0;
+ pdp->setup.cancel = XtCreateManagedWidget("cancel", commandWidgetClass, pdp->setup.form, args, n);
+ XtAddCallback(pdp->setup.cancel, XtNcallback, printSetupCancelXtProc, pdw);
+
+ XtRealizeWidget(pdp->setup.popup);
+
+ return pdp->setup.popup;
+}
+
+#undef DEFAULT_WIDTH
+#define DEFAULT_WIDTH 150
+
+static
+String *xpprinterlist_to_widget_printerlist(XPPrinterList printerlist, int num_printers)
+{
+ int i;
+ String *names;
+
+ names = malloc(sizeof(String *) * (num_printers+1));
+ if(!names)
+ return NULL;
+
+ for(i = 0 ; i < num_printers ; i++)
+ names[i] = printerlist[i].name;
+
+ names[i] = NULL; /* Terminate the list */
+
+ return names;
+}
+
+static
+String *xppaperlist_to_widget_paperlist(XpuMediumSourceSizeList paperlist, int num_papers)
+{
+ int i;
+ String *names;
+
+ names = malloc(sizeof(String *) * (num_papers+1));
+ if (!names)
+ return NULL;
+
+ for(i = 0 ; i < num_papers ; i++)
+ names[i] = (char *)paperlist[i].medium_name; /* FixMe: tray selection missing */
+
+ names[i] = NULL; /* Terminate the list */
+
+ return names;
+}
+
+static
+String *xpresolutionlist_to_widget_resolutionlist(XpuResolutionList reslist, int num_resolutions)
+{
+ int i;
+ String *names;
+ char *mem;
+
+ /* Allocate a chunk of memory... */
+ mem = malloc((sizeof(String *)+32) * (num_resolutions+2));
+
+ /* ... which has enougth space for the list pointers... */
+ names = (String *)mem;
+ if (!names)
+ return NULL;
+
+ /* ... and the numbers (assuming one number isn't longer than 32-1 chars) */
+ mem += sizeof(String *) * (num_resolutions+2);
+
+ for(i = 0 ; i < num_resolutions ; i++) {
+ sprintf(mem, "%d", (int)reslist[i].dpi);
+ names[i] = mem;
+ mem += strlen(mem) + 1;
+ }
+
+ names[i] = NULL; /* Terminate the list */
+
+ return names;
+}
+
+static
+String *xporientationlist_to_widget_orientationlist(XpuOrientationList orientationlist, int num_orientations)
+{
+ int i;
+ String *names;
+
+ names = malloc(sizeof(String *) * (num_orientations+1));
+ if (!names)
+ return NULL;
+
+ for(i = 0 ; i < num_orientations ; i++)
+ names[i] = (char *)orientationlist[i].orientation;
+
+ names[i] = NULL; /* Terminate the list */
+
+ return names;
+}
+
+static
+String *xpplexlist_to_widget_plexlist(XpuPlexList plexlist, int num_plex)
+{
+ int i;
+ String *names;
+
+ names = malloc(sizeof(String *) * (num_plex+1));
+ if(!names)
+ return NULL;
+
+ for(i = 0 ; i < num_plex ; i++)
+ names[i] = (char *)plexlist[i].plex;
+
+ names[i] = NULL; /* Terminate the list */
+
+ return names;
+}
+
+static void
+printerSelectionPrinterSelectedXtProc(Widget w, XtPointer client_data, XtPointer callData)
+{
+ PrintDialogWidget pdw = (PrintDialogWidget)client_data;
+ PrintDialogPart *pdp = &pdw->printdialog;
+ XawListReturnStruct *lrs = (XawListReturnStruct *)callData;
+ int list_index;
+
+ Log(("## user selected a printer\n"));
+
+ list_index = lrs->list_index;
+ if (list_index == XAW_LIST_NONE) {
+ Log(("printerSelectionPrinterSelectedXtProc: Nothing selected.\n"));
+ return;
+ }
+
+ Log(("selected printer is '%d'/'%s'/'%s'\n",
+ list_index, lrs->string, NULLSTR(pdp->printerlist[list_index].name)));
+
+ /* Enable OK button */
+ XtVaSetValues(pdp->selectPrinter.ok, XtNsensitive, True, NULL);
+}
+
+static void
+printSelectPrinterXtProc(Widget w, XtPointer client_data, XtPointer callData)
+{
+ PrintDialogWidget pdw = (PrintDialogWidget)client_data;
+ PrintDialogPart *pdp = &pdw->printdialog;
+
+ Log(("## select printer!\n"));
+
+ if (!pdp->selectPrinter.popup) {
+ if (!buildPrinterSelectionDialog(pdw)) {
+ Log(("printSelectPrinterXtProc: buildPrinterSelectionDialog failure.\n"));
+ return;
+ }
+ }
+
+ center_popup((Widget)pdw, pdp->selectPrinter.popup);
+
+ XtPopup(pdp->selectPrinter.popup, XtGrabExclusive);
+}
+
+static void
+printerSelectionClose(PrintDialogWidget pdw)
+{
+ PrintDialogPart *pdp = &pdw->printdialog;
+
+ if (pdp->selectPrinter.popup) {
+ XtPopdown(pdp->selectPrinter.popup);
+ }
+}
+
+static void
+printerSelectionOKXtProc(Widget w, XtPointer client_data, XtPointer callData)
+{
+ PrintDialogWidget pdw = (PrintDialogWidget)client_data;
+ PrintDialogPart *pdp = &pdw->printdialog;
+ XawListReturnStruct *lrs;
+ int list_index;
+
+ Log(("## printerSelectionOKXtProc: closing printer selection!\n"));
+
+ /* Copy current selection in printer list widget and open a printer connection */
+ lrs = XawListShowCurrent(pdp->selectPrinter.list);
+ if (!lrs) {
+ Log(("printerSelectionOKXtProc: |lrs|==NULL\n"));
+ return;
+ }
+
+ list_index = lrs->list_index;
+ if (lrs->list_index == XAW_LIST_NONE) {
+ Log(("printerSelectionOKXtProc: rs->list_index == XAW_LIST_NONE\n"));
+ XtFree((char *)lrs);
+ return;
+ }
+
+ /* Set printer name and description in main dialog */
+ XtVaSetValues(pdp->main.name, XtNlabel, NULLSTR(pdp->printerlist[list_index].name), NULL);
+ XtVaSetValues(pdp->main.desc, XtNlabel, NULLSTR(pdp->printerlist[list_index].desc), NULL);
+
+ if (pdp->printer_name)
+ free(pdp->printer_name);
+ pdp->printer_name = strdup(lrs->string);
+
+ /* Close any outstanding printer connection since user has selected
+ * a different printer */
+ closePrinterConnection(pdw, True);
+
+ printerSelectionClose(pdw);
+
+ XtFree((char *)lrs);
+}
+
+static void
+printerSelectionCancelXtProc(Widget w, XtPointer client_data, XtPointer callData)
+{
+ PrintDialogWidget pdw = (PrintDialogWidget)client_data;
+ Log(("## printerSelectionCancelXtProc: closing printer selection!\n"));
+
+ printerSelectionClose(pdw);
+}
+
+static
+Bool buildPrinterSelectionDialog(PrintDialogWidget pdw)
+{
+ PrintDialogPart *pdp = &pdw->printdialog;
+
+ int n;
+ Arg args[20];
+
+ n = 0;
+ XtSetArg(args[n], XtNallowShellResize, True); n++;
+ pdp->selectPrinter.popup = XtCreatePopupShell("printerselection", transientShellWidgetClass, (Widget)pdw, args, n);
+
+ n = 0;
+ pdp->selectPrinter.form = XtCreateManagedWidget("form", formWidgetClass, pdp->selectPrinter.popup, args, n);
+
+ n = 0;
+ XtSetArg(args[n], XtNresizable, True); n++;
+ XtSetArg(args[n], XtNforceColumns, True); n++;
+ XtSetArg(args[n], XtNdefaultColumns, 1); n++;
+ XtSetArg(args[n], XtNlist, pdp->widget_printerlist); n++;
+ XtSetArg(args[n], XtNwidth, DEFAULT_WIDTH); n++;
+ pdp->selectPrinter.list = XtCreateManagedWidget("list", listWidgetClass, pdp->selectPrinter.form, args, n);
+ XtAddCallback(pdp->selectPrinter.list, XtNcallback, printerSelectionPrinterSelectedXtProc, pdw);
+
+ n = 0;
+ XtSetArg(args[n], XtNsensitive, False); n++;
+ pdp->selectPrinter.ok = XtCreateManagedWidget("ok", commandWidgetClass, pdp->selectPrinter.form, args, n);
+ XtAddCallback(pdp->selectPrinter.ok, XtNcallback, printerSelectionOKXtProc, pdw);
+
+ n = 0;
+ pdp->selectPrinter.cancel = XtCreateManagedWidget("cancel", commandWidgetClass, pdp->selectPrinter.form, args, n);
+ XtAddCallback(pdp->selectPrinter.cancel, XtNcallback, printerSelectionCancelXtProc, pdw);
+
+ XtRealizeWidget(pdp->selectPrinter.popup);
+
+ return True;
+}
+
+static
+void destroyPrinterSelectionDialog(PrintDialogWidget pdw)
+{
+ PrintDialogPart *pdp = &pdw->printdialog;
+
+ if (pdp->selectPrinter.popup) {
+ XtDestroyWidget(pdp->selectPrinter.popup);
+ }
+
+ /* |XtDestroyWidget(pdp->setup.popup);| above will recursively destroy
+ * all children so we only have to reset the pointers here... */
+ pdp->selectPrinter.popup = NULL;
+ pdp->selectPrinter.form = NULL;
+ pdp->selectPrinter.list = NULL;
+ pdp->selectPrinter.popup = NULL;
+ pdp->selectPrinter.cancel = NULL;
+}
+
+/*
+ * Function:
+ * createprintdialogchildren
+ *
+ * Parameters:
+ * w - print dialog widget
+ *
+ * Description:
+ * Creates the print dialog widgets.
+ *
+ * Note
+ * -
+ */
+static void
+createprintdialogchildren(Widget w)
+{
+ int n;
+ Arg args[20];
+ PrintDialogWidget pdw = (PrintDialogWidget)w;
+ PrintDialogPart *pdp = &pdw->printdialog;
+ const char *default_printername = NULL,
+ *default_printerdesc = NULL;
+ Bool has_default_printer = False;
+
+ pdp->printerlist = XpuGetPrinterList(NULL, &pdp->num_printers);
+ pdp->widget_printerlist = xpprinterlist_to_widget_printerlist(pdp->printerlist, pdp->num_printers);
+
+ if (pdp->num_printers > 0) {
+ if (pdp->printerlist[0].name && strlen(pdp->printerlist[0].name)) {
+ /* XprintUtils moves the default printer to the top */
+ default_printername = pdp->printerlist[0].name;
+ default_printerdesc = pdp->printerlist[0].desc;
+ pdp->printer_name = strdup(pdp->printerlist[0].name);
+ has_default_printer = True;
+ }
+ }
+ else
+ {
+ XtAppWarning(XtWidgetToApplicationContext(w),
+ "No Xprint servers could be found. "
+ "Check whether the XPSERVERLIST environment variable contains any valid Xprint server(s).");
+ }
+
+ n = 0;
+ XtSetArg(args[n], XtNborderWidth, 0); n++;
+ pdp->main.form = XtCreateManagedWidget("main", formWidgetClass, (Widget)pdw, args, n);
+
+ n = 0;
+ pdp->main.innerform = XtCreateManagedWidget("innerform", formWidgetClass, pdp->main.form, args, n);
+
+ n = 0;
+ XtSetArg(args[n], XtNborderWidth, 0); n++;
+ XtSetArg(args[n], XtNresizable, False); n++;
+ XtSetArg(args[n], XtNjustify, XtJustifyRight); n++;
+ XtSetArg(args[n], XtNwidth, DEFAULT_WIDTH); n++;
+ pdp->main.desclabel = XtCreateManagedWidget("desclabel", labelWidgetClass, pdp->main.innerform, args, n);
+
+ n = 0;
+ XtSetArg(args[n], XtNborderWidth, 0); n++;
+ XtSetArg(args[n], XtNresizable, False); n++;
+ XtSetArg(args[n], XtNjustify, XtJustifyLeft); n++;
+ XtSetArg(args[n], XtNwidth, DEFAULT_INFOLABEL_WIDTH); n++;
+ XtSetArg(args[n], XtNlabel, default_printerdesc?default_printerdesc:"-"); n++;
+ pdp->main.desc = XtCreateManagedWidget("desc", labelWidgetClass, pdp->main.innerform, args, n);
+
+ n = 0;
+ XtSetArg(args[n], XtNsensitive, has_default_printer); n++;
+ pdp->main.info = XtCreateManagedWidget("info", commandWidgetClass, pdp->main.innerform, args, n);
+ /*
+ XtAddCallback(pdp->main.info, XtNcallback, printerInfoXtProc, pdw);
+ */
+ n = 0;
+ XtSetArg(args[n], XtNborderWidth, 0); n++;
+ XtSetArg(args[n], XtNresizable, False); n++;
+ XtSetArg(args[n], XtNjustify, XtJustifyRight); n++;
+ XtSetArg(args[n], XtNwidth, DEFAULT_WIDTH); n++;
+ pdp->main.namelabel = XtCreateManagedWidget("namelabel", labelWidgetClass, pdp->main.innerform, args, n);
+
+ n = 0;
+ XtSetArg(args[n], XtNborderWidth, 0); n++;
+ XtSetArg(args[n], XtNresizable, False); n++;
+ XtSetArg(args[n], XtNjustify, XtJustifyLeft); n++;
+ XtSetArg(args[n], XtNlabel, default_printername?default_printername:"-"); n++;
+ XtSetArg(args[n], XtNwidth, DEFAULT_INFOLABEL_WIDTH); n++;
+ pdp->main.name = XtCreateManagedWidget("name", labelWidgetClass, pdp->main.innerform, args, n);
+
+ n = 0;
+ pdp->main.selectprinter = XtCreateManagedWidget("selectprinter", commandWidgetClass, pdp->main.innerform, args, n);
+ XtAddCallback(pdp->main.selectprinter, XtNcallback, printSelectPrinterXtProc, pdw);
+
+ /* Line: "File selection" */
+
+ n = 0;
+ XtSetArg(args[n], XtNborderWidth, 0); n++;
+ XtSetArg(args[n], XtNresizable, False); n++;
+ XtSetArg(args[n], XtNjustify, XtJustifyRight); n++;
+ XtSetArg(args[n], XtNwidth, DEFAULT_WIDTH); n++;
+ XtSetArg(args[n], XtNsensitive, False); n++;
+ pdp->main.filenamelabel = XtCreateManagedWidget("filenamelabel", labelWidgetClass, pdp->main.innerform, args, n);
+
+ n = 0;
+ XtSetArg(args[n], XtNborderWidth, 0); n++;
+ XtSetArg(args[n], XtNresizable, False); n++;
+ XtSetArg(args[n], XtNjustify, XtJustifyLeft); n++;
+ XtSetArg(args[n], XtNlabel, "-"); n++;
+ XtSetArg(args[n], XtNwidth, DEFAULT_INFOLABEL_WIDTH); n++;
+ XtSetArg(args[n], XtNsensitive, False); n++;
+ pdp->main.filename = XtCreateManagedWidget("filename", labelWidgetClass, pdp->main.innerform, args, n);
+
+ n = 0;
+ XtSetArg(args[n], XtNsensitive, False); n++;
+ pdp->main.selectfile = XtCreateManagedWidget("selectfile", commandWidgetClass, pdp->main.innerform, args, n);
+ XtAddCallback(pdp->main.selectfile, XtNcallback, printSelectFileXtProc, pdw);
+
+ /* Line: Misc (Print destination toggles, copy-count etc.)*/
+ n = 0;
+ XtSetArg(args[n], XtNstate, True); n++;
+ pdp->main.printtoprinter = XtCreateManagedWidget("printtoprinter", toggleWidgetClass, pdp->main.innerform, args, n);
+ XtAddCallback(pdp->main.printtoprinter, XtNcallback, printDialogDestXtProc, pdw);
+
+ n = 0;
+ XtSetArg(args[n], XtNstate, False); n++;
+ pdp->main.printtofile = XtCreateManagedWidget("printtofile", toggleWidgetClass, pdp->main.innerform, args, n);
+ XtAddCallback(pdp->main.printtofile, XtNcallback, printDialogDestXtProc, pdw);
+
+ /* End-of-Inner-Form-Content */
+
+ n = 0;
+ XtSetArg(args[n], XtNsensitive, has_default_printer); n++;
+ pdp->main.ok = XtCreateManagedWidget("ok", commandWidgetClass, pdp->main.form, args, n);
+ XtAddCallback(pdp->main.ok, XtNcallback, printOKXtProc, pdw);
+
+ n = 0;
+ XtSetArg(args[n], XtNsensitive, has_default_printer); n++;
+ pdp->main.setup = XtCreateManagedWidget("setup", commandWidgetClass, pdp->main.form, args, n);
+ XtAddCallback(pdp->main.setup, XtNcallback, printSetupXtProc, pdw);
+
+ n = 0;
+ pdp->main.cancel = XtCreateManagedWidget("cancel", commandWidgetClass, pdp->main.form, args, n);
+ XtAddCallback(pdp->main.cancel, XtNcallback, printCancelXtProc, pdw);
+}
+
+/*
+ * Class Methods
+ */
+static void XawPrintDialogConstraintInitialize(Widget, Widget, ArgList, Cardinal *);
+static void XawPrintDialogGetValuesHook(Widget, ArgList, Cardinal*);
+static void XawPrintDialogInitialize(Widget, Widget, ArgList, Cardinal*);
+static void XawPrintDialogDestroy(Widget);
+static Boolean XawPrintDialogSetValues(Widget, Widget, Widget, ArgList, Cardinal *);
+
+/*
+ * Initialization
+ */
+static XtResource resources[] = {
+ {
+ XtNicon,
+ XtCIcon,
+ XtRBitmap,
+ sizeof(Pixmap),
+ XtOffsetOf(PrintDialogRec, printdialog.icon),
+ XtRImmediate,
+ 0
+ },
+ {
+ XawNOkCallback, XtCCallback, XtRCallback,
+ sizeof(XtCallbackList), XtOffsetOf(PrintDialogRec, printdialog.ok_callback),
+ XtRImmediate, (XtPointer)NULL
+ },
+ {
+ XawNCancelCallback, XtCCallback, XtRCallback,
+ sizeof(XtCallbackList), XtOffsetOf(PrintDialogRec, printdialog.cancel_callback),
+ XtRImmediate, (XtPointer)NULL
+ },
+};
+
+PrintDialogClassRec printdialogClassRec = {
+ /* core */
+ {
+ (WidgetClass)&formClassRec, /* superclass */
+ "PrintDialog", /* class_name */
+ sizeof(PrintDialogRec), /* widget_size */
+ XawInitializeWidgetSet, /* class_initialize */
+ NULL, /* class_part init */
+ False, /* class_inited */
+ XawPrintDialogInitialize, /* initialize */
+ NULL, /* initialize_hook */
+ XtInheritRealize, /* realize */
+ NULL, /* actions */
+ 0, /* num_actions */
+ resources, /* resources */
+ XtNumber(resources), /* num_resources */
+ NULLQUARK, /* xrm_class */
+ True, /* compress_motion */
+ True, /* compress_exposure */
+ True, /* compress_enterleave */
+ False, /* visible_interest */
+ XawPrintDialogDestroy, /* destroy */
+ XtInheritResize, /* resize */
+ XtInheritExpose, /* expose */
+ XawPrintDialogSetValues, /* set_values */
+ NULL, /* set_values_hook */
+ XtInheritSetValuesAlmost, /* set_values_almost */
+ XawPrintDialogGetValuesHook, /* get_values_hook */
+ NULL, /* accept_focus */
+ XtVersion, /* version */
+ NULL, /* callback_private */
+ NULL, /* tm_table */
+ XtInheritQueryGeometry, /* query_geometry */
+ XtInheritDisplayAccelerator, /* display_accelerator */
+ NULL, /* extension */
+ },
+ /* composite */
+ {
+ XtInheritGeometryManager, /* geometry_manager */
+ XtInheritChangeManaged, /* change_managed */
+ XtInheritInsertChild, /* insert_child */
+ XtInheritDeleteChild, /* delete_child */
+ NULL, /* extension */
+ },
+ /* constraint */
+ {
+ NULL, /* subresourses */
+ 0, /* subresource_count */
+ sizeof(PrintDialogConstraintsRec), /* constraint_size */
+ XawPrintDialogConstraintInitialize, /* initialize */
+ NULL, /* destroy */
+ NULL, /* set_values */
+ NULL, /* extension */
+ },
+ /* form */
+ {
+ XtInheritLayout, /* layout */
+ },
+ /* printdialog */
+ {
+ NULL, /* extension */
+ }
+};
+
+WidgetClass printDialogWidgetClass = (WidgetClass)&printdialogClassRec;
+
+/*
+ * Implementation
+ */
+/*ARGSUSED*/
+static void
+XawPrintDialogInitialize(Widget request, Widget cnew, ArgList args, Cardinal *num_args)
+{
+ PrintDialogWidget dw = (PrintDialogWidget)cnew;
+ Arg arglist[9];
+ Cardinal arg_cnt = 0;
+
+ XtSetArg(arglist[arg_cnt], XtNborderWidth, 0); arg_cnt++;
+ XtSetArg(arglist[arg_cnt], XtNleft, XtChainLeft); arg_cnt++;
+
+ if (dw->printdialog.icon != (Pixmap)0) {
+ XtSetArg(arglist[arg_cnt], XtNbitmap, dw->printdialog.icon); arg_cnt++;
+ XtSetArg(arglist[arg_cnt], XtNright, XtChainLeft); arg_cnt++;
+ dw->printdialog.iconW = XtCreateManagedWidget("icon", labelWidgetClass,
+ cnew, arglist, arg_cnt);
+ arg_cnt = 2;
+ XtSetArg(arglist[arg_cnt], XtNfromHoriz, dw->printdialog.iconW); arg_cnt++;
+ }
+ else {
+ dw->printdialog.iconW = NULL;
+ }
+
+ createprintdialogchildren((Widget)dw);
+}
+
+/*ARGSUSED*/
+static void
+XawPrintDialogConstraintInitialize(Widget request, Widget cnew,
+ ArgList args, Cardinal *num_args)
+{
+ PrintDialogWidget dw = (PrintDialogWidget)cnew->core.parent;
+ PrintDialogConstraints constraint = (PrintDialogConstraints)cnew->core.constraints;
+
+ if (!XtIsSubclass(cnew, commandWidgetClass)) /* if not a button */
+ return; /* then just use defaults */
+
+ constraint->form.left = constraint->form.right = XtChainLeft;
+ constraint->form.vert_base = dw->printdialog.main.form;
+
+ if (dw->composite.num_children > 1) {
+ WidgetList children = dw->composite.children;
+ Widget *childP;
+
+ for (childP = children + dw->composite.num_children - 1;
+ childP >= children; childP-- ) {
+ if (*childP == dw->printdialog.main.form)
+ break;
+ if (XtIsManaged(*childP) &&
+ XtIsSubclass(*childP, commandWidgetClass)) {
+ constraint->form.horiz_base = *childP;
+ break;
+ }
+ }
+ }
+}
+
+#define ICON 0
+#define NUM_CHECKS 1
+/*ARGSUSED*/
+static Boolean
+XawPrintDialogSetValues(Widget current, Widget request, Widget cnew,
+ ArgList in_args, Cardinal *in_num_args)
+{
+ PrintDialogWidget w = (PrintDialogWidget)cnew;
+ PrintDialogWidget old = (PrintDialogWidget)current;
+ Arg args[5];
+ unsigned int i;
+ Bool checks[NUM_CHECKS];
+
+ for (i = 0; i < NUM_CHECKS; i++)
+ checks[i] = False;
+
+ for (i = 0; i < *in_num_args; i++) {
+ if (!strcmp(XtNicon, in_args[i].name))
+ checks[ICON] = True;
+ }
+
+ if (checks[ICON]) {
+ if (w->printdialog.icon != 0) {
+ XtSetArg(args[0], XtNbitmap, w->printdialog.icon);
+ if (old->printdialog.iconW != NULL) {
+ XtSetValues(old->printdialog.iconW, args, 1);
+ }
+ else {
+ XtSetArg(args[1], XtNborderWidth, 0);
+ XtSetArg(args[2], XtNleft, XtChainLeft);
+ XtSetArg(args[3], XtNright, XtChainLeft);
+ w->printdialog.iconW = XtCreateWidget("icon", labelWidgetClass,
+ cnew, args, 4);
+ XtManageChild(w->printdialog.iconW);
+ }
+ }
+ else if (old->printdialog.icon != 0) {
+ XtDestroyWidget(old->printdialog.iconW);
+ w->printdialog.iconW = NULL;
+ }
+ }
+
+ return True;
+}
+
+/*
+ * Function:
+ * XawPrintDialogGetValuesHook
+ *
+ * Parameters:
+ * w - Print Dialog Widget
+ * args - argument list
+ * num_args - number of args
+ *
+ * Description:
+ * This is a get values hook routine that gets the values in the dialog.
+ */
+static void
+XawPrintDialogGetValuesHook(Widget w, ArgList args, Cardinal *num_args)
+{
+ /* NO-OP for now */
+}
+
+static void
+XawPrintDialogDestroy(Widget w)
+{
+ PrintDialogWidget pdw = (PrintDialogWidget)w;
+ Log(("# XawPrintDialogDestroy: start.\n"));
+
+ destroyPrintSetupDialog(pdw);
+ destroyPrinterSelectionDialog(pdw);
+ closePrinterConnection(pdw, True);
+
+ Log(("# XawPrintDialogDestroy: done.\n"));
+}
+
+/*
+ * Function:
+ * XawPrintDialogClosePrinterConnection
+ *
+ * Parameters:
+ * w - Print Dialog Widget
+ * closeDisplay - Boolean which decides whether |Display *|
+ * and |XPContext| should be disposed, too.
+ *
+ * Description:
+ * The print display connection is owned by the print dialog
+ * by default.
+ * If the application wishes to close the display connection
+ * to the print server, either to close it itself or force
+ * a disconnection for other reasons this function can be used.
+ *
+ * Notes
+ * 1. PUBLIC API
+ * 2. After this function returns all resources returned by the
+ * print dialog which are related to the status of the printer
+ * connection are stale.
+ */
+void
+XawPrintDialogClosePrinterConnection(Widget w, Bool closeDisplay)
+{
+ closePrinterConnection((PrintDialogWidget)w, closeDisplay);
+}
+
diff --git a/printdialog.h b/printdialog.h
new file mode 100644
index 0000000..e963847
--- /dev/null
+++ b/printdialog.h
@@ -0,0 +1,69 @@
+/*
+ * $Xorg: printdialog.h,v 1.1 2004/04/30 02:05:54 gisburn Exp $
+ *
+Copyright 2004 Roland Mainz <roland.mainz@nrubsig.org>
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+ *
+ */
+
+#ifndef XMORE_PRINTDIALOG_H
+#define XMORE_PRINTDIALOG_H 1
+
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h>
+#include <X11/Xaw/Print.h>
+#include <X11/Xaw/Cardinals.h>
+#include <X11/Xaw/Form.h>
+#include <X11/XprintUtil/xprintutil.h>
+
+/* Resources:
+ NOT WRITTEN YET
+*/
+
+#define XtCIcon "Icon"
+#define XtNicon "icon"
+
+#define XawNOkCallback "okCallback"
+#define XawNCancelCallback "cancelCallback"
+
+typedef struct
+{
+ Display *pdpy;
+ XPContext pcontext;
+ const char *printToFileName;
+ Boolean printToFile;
+} XawPrintDialogCallbackStruct;
+
+typedef struct _PrintDialogClassRec *PrintDialogWidgetClass;
+typedef struct _PrintDialogRec *PrintDialogWidget;
+
+extern WidgetClass printDialogWidgetClass;
+
+_XFUNCPROTOBEGIN
+
+/* Prototypes */
+void XawPrintDialogClosePrinterConnection(Widget w, Bool closeDisplay);
+
+_XFUNCPROTOEND
+
+#endif /* !XMORE_PRINTDIALOG_H */
diff --git a/printdialogprivates.h b/printdialogprivates.h
new file mode 100644
index 0000000..314a91c
--- /dev/null
+++ b/printdialogprivates.h
@@ -0,0 +1,176 @@
+/*
+ * $Xorg: printdialogprivates.h,v 1.1 2004/05/12 02:05:54 gisburn Exp $
+ *
+Copyright 2004 Roland Mainz <roland.mainz@nrubsig.org>
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+ *
+ */
+
+#ifndef _XawPrintDialogP_h
+#define _XawPrintDialogP_h 1
+
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/Xos.h>
+#include <X11/Xmu/Misc.h>
+#include <X11/CoreP.h>
+#include <X11/Xaw/AsciiText.h>
+#include <X11/Xaw/Cardinals.h>
+#include <X11/Xaw/Command.h>
+#include <X11/Xaw/Label.h>
+#include <X11/Xaw/DialogP.h>
+#include <X11/Xaw/XawInit.h>
+#include <X11/Xaw/Dialog.h>
+#include <X11/Xaw/FormP.h>
+
+/* From Xaw/Privates.h */
+#ifndef XtWidth
+#define XtWidth(w) (((RectObj)w)->rectangle.width)
+#endif
+#ifndef XtHeight
+#define XtHeight(w) (((RectObj)w)->rectangle.height)
+#endif
+
+
+typedef struct {
+ XtPointer extension;
+} PrintDialogClassPart;
+
+typedef struct _PrintDialogClassRec {
+ CoreClassPart core_class;
+ CompositeClassPart composite_class;
+ ConstraintClassPart constraint_class;
+ FormClassPart form_class;
+ PrintDialogClassPart print_dialog_class;
+} PrintDialogClassRec;
+
+extern PrintDialogClassRec printDialogClassRec;
+
+typedef struct _PrintDialogPart {
+ /* resources */
+ String label; /* description of the dialog */
+ String value; /* for the user response */
+ Pixmap icon; /* icon bitmap */
+ XtCallbackList ok_callback,
+ cancel_callback;
+
+ /* private */
+ Widget iconW; /* widget to display the icon */
+
+ struct
+ {
+ Widget form,
+ innerform,
+ desclabel,
+ desc,
+ info,
+ namelabel,
+ name,
+ selectprinter,
+ filenamelabel,
+ filename,
+ selectfile,
+ printtoprinter,
+ printtofile,
+ ok,
+ setup,
+ cancel;
+ } main;
+
+ Bool printToFile;
+ char *filename;
+ Bool canPrint, /* can we print ? */
+ canReallyPrint; /* is it really save to print ? */
+
+ struct
+ {
+ Widget popup,
+ form,
+ list,
+ ok,
+ cancel;
+ } selectPrinter;
+
+ struct
+ {
+ Widget popup,
+ form,
+ paperlist,
+ resolutionlist,
+ orientationlist,
+ plexlist,
+ jobcopieslabel,
+ jobcopies,
+ ok,
+ cancel;
+ } setup;
+
+ struct
+ {
+ Widget dialog,
+ shell;
+ } selectFile;
+
+ XPPrinterList printerlist;
+ int num_printers;
+ String *widget_printerlist;
+
+ String printer_name;
+ Display *pdpy;
+ XPContext pcontext;
+
+ XpuMediumSourceSizeList paperlist;
+ int num_papers;
+ String *widget_paperlist;
+
+ XpuResolutionList resolutionlist;
+ int num_resolutions;
+ String *widget_resolutionlist;
+
+ XpuOrientationList orientationlist;
+ int num_orientations;
+ String *widget_orientationlist;
+
+ XpuPlexList plexlist;
+ int num_plex;
+ String *widget_plexlist;
+} PrintDialogPart;
+
+typedef struct _PrintDialogRec {
+ CorePart core;
+ CompositePart composite;
+ ConstraintPart constraint;
+ FormPart form;
+ PrintDialogPart printdialog;
+} PrintDialogRec;
+
+typedef struct {
+ XtPointer extension;
+} PrintDialogConstraintsPart;
+
+typedef struct _PrintDialogConstraintsRec {
+ FormConstraintsPart form;
+ PrintDialogConstraintsPart printdialog;
+} PrintDialogConstraintsRec, *PrintDialogConstraints;
+
+#endif /* !_XawPrintDialogP_h */
+
diff --git a/util.c b/util.c
index 508a2d0..6e8c1d4 100644
--- a/util.c
+++ b/util.c
@@ -83,6 +83,8 @@ MakeCommandButton(Widget box, char *name, XtCallbackProc function)
Widget w = XtCreateManagedWidget(name, commandWidgetClass, box, NULL, ZERO);
if (function != NULL)
XtAddCallback(w, XtNcallback, function, (caddr_t) NULL);
+ else
+ XtVaSetValues(w, XtNsensitive, False, NULL);
return w;
}
diff --git a/xedit.c b/xedit.c
index 8648c06..073078d 100644
--- a/xedit.c
+++ b/xedit.c
@@ -41,6 +41,9 @@ static XtActionsRec actions[] = {
{"quit", QuitAction},
{"save-file", SaveFile},
{"load-file", LoadFile},
+#ifdef INCLUDE_XPRINT_SUPPORT
+{"print-file", PrintFile},
+#endif /* INCLUDE_XPRINT_SUPPORT */
{"find-file", FindFile},
{"cancel-find-file", CancelFindFile},
{"file-completion", FileCompletion},
@@ -71,7 +74,6 @@ static XawTextPositionInfo infos[3];
Widget topwindow, textwindow, messwidget, labelwindow, filenamewindow;
Widget scratch, hpane, vpanes[2], labels[3], texts[3], forms[3], positions[3];
Widget options_popup, dirlabel, dirwindow;
-Boolean international;
Boolean line_edit;
XawTextWrapMode wrapmodes[3];
@@ -111,6 +113,11 @@ static XtResource resources[] = {
#undef Offset
+String fallback_resources[] = {
+ "*international: True", /* set this globally for ALL widgets to avoid wiered crashes */
+ NULL
+};
+
int
main(int argc, char *argv[])
{
@@ -118,7 +125,7 @@ main(int argc, char *argv[])
unsigned num_loaded = 0;
XtSetLanguageProc(NULL, NULL, NULL);
- topwindow = XtAppInitialize(&appcon, "Xedit", NULL, 0, &argc, argv, NULL, NULL, 0);
+ topwindow = XtAppInitialize(&appcon, "Xedit", NULL, 0, &argc, argv, fallback_resources, NULL, 0);
XtAppAddActions(appcon, actions, XtNumber(actions));
XtOverrideTranslations
@@ -240,9 +247,8 @@ main(int argc, char *argv[])
flags = 0;
XtSetArg(args[num_args], XtNstring, NULL); num_args++;
}
- source = XtVaCreateWidget("textSource", international ?
- multiSrcObjectClass
- : asciiSrcObjectClass, topwindow,
+ source = XtVaCreateWidget("textSource",
+ multiSrcObjectClass, topwindow,
XtNtype, XawAsciiFile,
XtNeditType, XawtextEdit,
NULL, NULL);
@@ -281,7 +287,7 @@ main(int argc, char *argv[])
XtSetKeyboardFocus(topwindow, textwindow);
XtAppMainLoop(appcon);
- exit(0);
+ return EXIT_SUCCESS;
}
static void
@@ -302,6 +308,9 @@ makeButtonsAndBoxes(Widget parent)
MakeCommandButton(b_row, "quit", DoQuit);
MakeCommandButton(b_row, "save", DoSave);
MakeCommandButton(b_row, "load", DoLoad);
+#ifdef INCLUDE_XPRINT_SUPPORT
+ MakeCommandButton(b_row, "print", DoPrint);
+#endif /* INCLUDE_XPRINT_SUPPORT */
filenamewindow = MakeStringBox(b_row, "filename", NULL);
}
hintswindow = XtCreateManagedWidget("bc_label", labelWidgetClass,
@@ -347,15 +356,10 @@ makeButtonsAndBoxes(Widget parent)
textwindow = XtCreateManagedWidget(editWindow, asciiTextWidgetClass,
vpanes[0], arglist, num_args);
num_args = 0;
- XtSetArg(arglist[num_args], XtNinternational, &international); ++num_args;
- XtGetValues(textwindow, arglist, num_args);
-
- num_args = 0;
XtSetArg(arglist[num_args], XtNtype, XawAsciiFile); ++num_args;
XtSetArg(arglist[num_args], XtNeditType, XawtextEdit); ++num_args;
- scratch = XtVaCreateWidget("textSource", international ?
- multiSrcObjectClass
- : asciiSrcObjectClass, topwindow,
+ scratch = XtVaCreateWidget("textSource",
+ multiSrcObjectClass, topwindow,
XtNtype, XawAsciiFile,
XtNeditType, XawtextEdit,
NULL, NULL);
diff --git a/xedit.h b/xedit.h
index f347aa3..c7a786d 100644
--- a/xedit.h
+++ b/xedit.h
@@ -100,7 +100,6 @@ extern struct _app_resources {
extern Widget topwindow, textwindow, labelwindow, filenamewindow, messwidget;
extern Widget dirlabel, dirwindow;
-extern Boolean international;
extern Boolean line_edit;
/* externals in xedit.c */
@@ -132,9 +131,15 @@ void QuitAction(Widget, XEvent*, String*, Cardinal*);
void DoSave(Widget, XtPointer, XtPointer);
void SaveFile(Widget, XEvent*, String*, Cardinal*);
void DoLoad(Widget, XtPointer, XtPointer);
+#ifdef INCLUDE_XPRINT_SUPPORT
+void DoPrint(Widget, XtPointer, XtPointer);
+#endif /* INCLUDE_XPRINT_SUPPORT */
void CancelFindFile(Widget, XEvent*, String*, Cardinal*);
void FindFile(Widget, XEvent*, String*, Cardinal*);
void LoadFile(Widget, XEvent*, String*, Cardinal*);
+#ifdef INCLUDE_XPRINT_SUPPORT
+void PrintFile(Widget, XEvent*, String*, Cardinal*);
+#endif /* INCLUDE_XPRINT_SUPPORT */
void FileCompletion(Widget, XEvent*, String*, Cardinal*);
void KillFile(Widget, XEvent*, String*, Cardinal*);
void DirWindowCB(Widget, XtPointer, XtPointer);