[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Windows port: using Windows' default printer
From: |
Peter 'Luna' Runestig |
Subject: |
Re: Windows port: using Windows' default printer |
Date: |
12 Sep 2003 21:34:17 +0200 |
Hi all!
This is a reworked version of the `w32-default-printer-device' variable
patch I posted in March 2002. After a private mail exchange with Jason
Rumney, I followed his ideas, and instead implemented a
`default-printer-name' function, that is to be used if `printer-name'
is nil. I quote Jason's description of the idea:
>>>>>>
[...] Rather, you should expose a function to lisp (using the DEFUN C
macro) which returns the default printer name, then modify the code that
uses printer-name (and ps-printer-name) to call this function if
printer-name is nil and the function is available.
If possible, avoid w32- specific variables, function names and tests,
then if MacOS or other systems need to do a similar thing, they just
need to implement a function of the same name. This is much cleaner than
having branches all over the place to handle specific platforms.
An example of the Lisp required to do what I'm thinking of would be:
(let ((printer-name (or printer-name
(and (fboundp 'default-printer-name)
(default-printer-name)))))
;; Code that uses printer-name here
)
<<<<<<
diff -bur emacs-cvs-20030904.orig/lisp/ChangeLog
emacs-cvs-20030904/lisp/ChangeLog
--- emacs-cvs-20030904.orig/lisp/ChangeLog 2003-09-03 10:14:52.000000000
+0200
+++ emacs-cvs-20030904/lisp/ChangeLog 2003-09-08 09:01:53.000000000 +0200
@@ -1,3 +1,8 @@
+2003-09-05 Peter Runestig <address@hidden>
+
+ * dos-w32.el, lpr.el, ps-print.el, play/handwrite.el: Added support for
+ the `default-printer-name' function.
+
2003-09-02 Jason Rumney <address@hidden>
* international/titdic-cnv.el (tsang-quick-converter): Fix broken
diff -bur emacs-cvs-20030904.orig/lisp/dos-w32.el
emacs-cvs-20030904/lisp/dos-w32.el
--- emacs-cvs-20030904.orig/lisp/dos-w32.el 2003-09-03 10:14:55.000000000
+0200
+++ emacs-cvs-20030904/lisp/dos-w32.el 2003-09-05 22:50:41.000000000 +0200
@@ -378,7 +378,9 @@
(printer (or (and (boundp 'dos-printer)
(stringp (symbol-value 'dos-printer))
(symbol-value 'dos-printer))
- printer-name)))
+ printer-name
+ (and (fboundp 'default-printer-name)
+ (default-printer-name)))))
(or (eq coding-system-for-write 'no-conversion)
(setq coding-system-for-write
(aref eol-type 1))) ; force conversion to DOS EOLs
@@ -411,7 +413,9 @@
(let ((printer (or (and (boundp 'dos-ps-printer)
(stringp (symbol-value 'dos-ps-printer))
(symbol-value 'dos-ps-printer))
- ps-printer-name)))
+ ps-printer-name
+ (and (fboundp 'default-printer-name)
+ (default-printer-name)))))
(direct-print-region-helper printer start end lpr-prog
delete-text buf display rest)))
diff -bur emacs-cvs-20030904.orig/lisp/lpr.el emacs-cvs-20030904/lisp/lpr.el
--- emacs-cvs-20030904.orig/lisp/lpr.el 2003-09-03 10:14:58.000000000 +0200
+++ emacs-cvs-20030904/lisp/lpr.el 2003-09-05 22:50:41.000000000 +0200
@@ -255,9 +255,12 @@
;; These belong in pr if we are using that.
(and lpr-add-switches lpr-headers-switches
(list "-T" title))
- (and (stringp printer-name)
+ (or (and (stringp printer-name)
(list (concat lpr-printer-switch
printer-name)))
+ (and (fboundp 'default-printer-name)
+ (list (concat lpr-printer-switch
+ (default-printer-name)))))
nswitches))
(if (markerp end)
(set-marker end nil))
diff -bur emacs-cvs-20030904.orig/lisp/play/handwrite.el
emacs-cvs-20030904/lisp/play/handwrite.el
--- emacs-cvs-20030904.orig/lisp/play/handwrite.el 2003-09-03
10:15:15.000000000 +0200
+++ emacs-cvs-20030904/lisp/play/handwrite.el 2003-09-05 22:50:41.000000000
+0200
@@ -335,7 +335,9 @@
(let* ((coding-system-for-write 'raw-text-unix)
(ps-printer-name (or ps-printer-name
(and (boundp 'printer-name)
- printer-name)))
+ printer-name)
+ (and (fboundp 'default-printer-name)
+ (default-printer-name))))
(ps-lpr-switches
(if (stringp ps-printer-name)
(list (concat "-P" ps-printer-name)))))
diff -bur emacs-cvs-20030904.orig/lisp/ps-print.el
emacs-cvs-20030904/lisp/ps-print.el
--- emacs-cvs-20030904.orig/lisp/ps-print.el 2003-09-03 10:15:00.000000000
+0200
+++ emacs-cvs-20030904/lisp/ps-print.el 2003-09-05 22:50:41.000000000 +0200
@@ -6563,7 +6563,9 @@
(let* ((coding-system-for-write 'raw-text-unix)
(ps-printer-name (or ps-printer-name
(and (boundp 'printer-name)
- (symbol-value 'printer-name))))
+ (symbol-value 'printer-name))
+ (and (fboundp 'default-printer-name)
+ (default-printer-name))))
(ps-lpr-switches
(append ps-lpr-switches
(and (stringp ps-printer-name)
diff -bur emacs-cvs-20030904.orig/nt/ChangeLog emacs-cvs-20030904/nt/ChangeLog
--- emacs-cvs-20030904.orig/nt/ChangeLog 2003-09-04 09:19:35.000000000
+0200
+++ emacs-cvs-20030904/nt/ChangeLog 2003-09-08 09:04:42.000000000 +0200
@@ -1,3 +1,7 @@
+2003-09-05 Peter Runestig <address@hidden>
+
+ * gmake.defs, nmake.defs: Add linking to ``winspool.lib''.
+
2003-09-03 Peter Runestig <address@hidden>
* configure.bat: Create ``makefile'' in directories man, lispref
diff -bur emacs-cvs-20030904.orig/nt/gmake.defs emacs-cvs-20030904/nt/gmake.defs
--- emacs-cvs-20030904.orig/nt/gmake.defs 2003-09-03 10:15:31.000000000
+0200
+++ emacs-cvs-20030904/nt/gmake.defs 2003-09-05 22:50:41.000000000 +0200
@@ -177,6 +177,7 @@
USER32 = -luser32
WSOCK32 = -lwsock32
WINMM = -lwinmm
+WINSPOOL = -lwinspool
ifdef NOOPT
DEBUG_CFLAGS = -DEMACSDEBUG
diff -bur emacs-cvs-20030904.orig/nt/nmake.defs emacs-cvs-20030904/nt/nmake.defs
--- emacs-cvs-20030904.orig/nt/nmake.defs 2003-09-03 10:15:31.000000000
+0200
+++ emacs-cvs-20030904/nt/nmake.defs 2003-09-05 22:50:41.000000000 +0200
@@ -124,6 +124,7 @@
USER32 = user32.lib
WSOCK32 = wsock32.lib
WINMM = winmm.lib
+WINSPOOL = winspool.lib
!ifdef NOOPT
DEBUG_CFLAGS = -DEMACSDEBUG
diff -bur emacs-cvs-20030904.orig/src/ChangeLog emacs-cvs-20030904/src/ChangeLog
--- emacs-cvs-20030904.orig/src/ChangeLog 2003-09-03 10:15:33.000000000
+0200
+++ emacs-cvs-20030904/src/ChangeLog 2003-09-08 09:06:20.000000000 +0200
@@ -1,3 +1,7 @@
+2003-09-05 Peter Runestig <address@hidden>
+
+ * makefile.w32-in, w32fns.c: Add `default-printer-name' function.
+
2003-09-03 Kim F. Storm <address@hidden>
* xdisp.c (get_window_cursor_type): Partially undo 2002-03-01
Only in emacs-cvs-20030904/src: ChangeLog.~1.3360.~
diff -bur emacs-cvs-20030904.orig/src/makefile.w32-in
emacs-cvs-20030904/src/makefile.w32-in
--- emacs-cvs-20030904.orig/src/makefile.w32-in 2003-09-03 10:15:39.000000000
+0200
+++ emacs-cvs-20030904/src/makefile.w32-in 2003-09-06 01:50:36.000000000
+0200
@@ -141,6 +141,7 @@
$(USER32) \
$(MPR) \
$(SHELL32) \
+ $(WINSPOOL) \
$(libc)
#
diff -bur emacs-cvs-20030904.orig/src/w32fns.c emacs-cvs-20030904/src/w32fns.c
--- emacs-cvs-20030904.orig/src/w32fns.c 2003-09-03 10:15:41.000000000
+0200
+++ emacs-cvs-20030904/src/w32fns.c 2003-09-05 23:41:01.000000000 +0200
@@ -51,6 +51,7 @@
#include <commdlg.h>
#include <shellapi.h>
#include <ctype.h>
+#include <winspool.h>
#include <dlgs.h>
#define FILE_NAME_TEXT_FIELD edt1
@@ -13925,6 +13926,76 @@
return value;
}
+DEFUN ("default-printer-name", Fdefault_printer_name, Sdefault_printer_name,
+ 0, 0, 0, doc: /* Return the name of Windows default printer device. */)
+ ()
+{
+ static char pname_buf[256];
+ int err;
+ HANDLE hPrn;
+ PRINTER_INFO_2 *ppi2 = NULL;
+ DWORD dwNeeded = 0, dwReturned = 0;
+
+ /* Retrieve the default string from Win.ini (the registry).
+ * String will be in form "printername,drivername,portname".
+ * This is the most portable way to get the default printer. */
+ if (GetProfileString ("windows", "device", ",,", pname_buf, sizeof
(pname_buf)) <= 0)
+ return Qnil;
+ /* printername precedes first "," character */
+ strtok (pname_buf, ",");
+ /* We want to know more than the printer name */
+ if (!OpenPrinter (pname_buf, &hPrn, NULL))
+ return Qnil;
+ GetPrinter (hPrn, 2, NULL, 0, &dwNeeded);
+ if (dwNeeded == 0)
+ {
+ ClosePrinter (hPrn);
+ return Qnil;
+ }
+ /* Allocate memory for the PRINTER_INFO_2 struct */
+ ppi2 = (PRINTER_INFO_2 *) xmalloc (dwNeeded);
+ if (!ppi2)
+ {
+ ClosePrinter (hPrn);
+ return Qnil;
+ }
+ /* Call GetPrinter() again with big enouth memory block */
+ err = GetPrinter (hPrn, 2, (LPBYTE)ppi2, dwNeeded, &dwReturned);
+ ClosePrinter (hPrn);
+ if (!err)
+ {
+ xfree(ppi2);
+ return Qnil;
+ }
+
+ if (ppi2)
+ {
+ if (ppi2->Attributes & PRINTER_ATTRIBUTE_SHARED && ppi2->pServerName)
+ {
+ /* a remote printer */
+ if (*ppi2->pServerName == '\\')
+ _snprintf(pname_buf, sizeof (pname_buf), "%s\\%s",
ppi2->pServerName,
+ ppi2->pShareName);
+ else
+ _snprintf(pname_buf, sizeof (pname_buf), "\\\\%s\\%s",
ppi2->pServerName,
+ ppi2->pShareName);
+ pname_buf[sizeof (pname_buf) - 1] = '\0';
+ }
+ else
+ {
+ /* a local printer */
+ strncpy(pname_buf, ppi2->pPortName, sizeof (pname_buf));
+ pname_buf[sizeof (pname_buf) - 1] = '\0';
+ /* `pPortName' can include several ports, delimited by ','.
+ * we only use the first one. */
+ strtok(pname_buf, ",");
+ }
+ xfree(ppi2);
+ }
+
+ return build_string (pname_buf);
+}
+
/***********************************************************************
Initialization
***********************************************************************/
@@ -14377,6 +14448,7 @@
defsubr (&Sw32_find_bdf_fonts);
defsubr (&Sfile_system_info);
+ defsubr (&Sdefault_printer_name);
/* Setting callback functions for fontset handler. */
get_font_info_func = w32_get_font_info;
--
Peter 'Luna' Runestig (fd. Altberg), Sweden <address@hidden>
PGP Key ID: 0xD07BBE13
Fingerprint: 7B5C 1F48 2997 C061 DE4B 42EA CB99 A35C D07B BE13
AOL Instant Messenger Screen name: PRunestig
Yahoo! Messenger profile name: altberg
- Re: Windows port: using Windows' default printer,
Peter 'Luna' Runestig <=
Re: Windows port: using Windows' default printer, Stefan Monnier, 2003/09/15