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: Stefan Monnier
Subject: Re: Windows port: using Windows' default printer
Date: 15 Sep 2003 10:52:23 -0400
User-agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.3.50

> 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:

I think the C part of the code is fine and the use of `printer-name'
is fine as well, but I wish that the use of default-printer-name could be
confined to a single spot (in Unix, it's in `lpr' so Emacs doesn't know
about it).  We probably need to create a function that either calls `lpr'
or calls windows' printing code (using default-printer-name if necessary)
and then have both lpr.el and ps-print.el use this function.

In the mean time, your patch looks like a step in the right direction.


        Stefan


>>>>>>> 
> [...] 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



> _______________________________________________
> Emacs-devel mailing list
> address@hidden
> http://mail.gnu.org/mailman/listinfo/emacs-devel




reply via email to

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