diff options
-rw-r--r-- | Xedit-noxprint.ad | 462 | ||||
-rw-r--r-- | Xedit-xprint.ad | 559 | ||||
-rw-r--r-- | commands.c | 130 | ||||
-rw-r--r-- | hook.c | 4 | ||||
-rw-r--r-- | ispell.c | 24 | ||||
-rw-r--r-- | lisp/internal.h | 2 | ||||
-rw-r--r-- | lisp/lisp.c | 2 | ||||
-rw-r--r-- | lisp/modules/xedit.lsp | 2 | ||||
-rw-r--r-- | lisp/private.h | 2 | ||||
-rw-r--r-- | lisp/string.c | 2 | ||||
-rw-r--r-- | print.c | 390 | ||||
-rw-r--r-- | print.h | 47 | ||||
-rw-r--r-- | printdialog.c | 1353 | ||||
-rw-r--r-- | printdialog.h | 69 | ||||
-rw-r--r-- | printdialogprivates.h | 176 | ||||
-rw-r--r-- | util.c | 2 | ||||
-rw-r--r-- | xedit.c | 30 | ||||
-rw-r--r-- | xedit.h | 7 |
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. @@ -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. @@ -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; @@ -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" @@ -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); + } +} + + @@ -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 */ + @@ -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; } @@ -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); @@ -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); |