emacs-devel
[Top][All Lists]
Advanced

[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





reply via email to

[Prev in Thread] Current Thread [Next in Thread]