unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: "Stefan Monnier" <monnier@IRO.UMontreal.CA>
Cc: emacs-devel@gnu.org
Subject: Re: Windows port: using Windows' default printer
Date: 15 Sep 2003 10:52:23 -0400	[thread overview]
Message-ID: <jwvpti214uw.fsf@vor.iro.umontreal.ca> (raw)
In-Reply-To: <uwucdls1y.fsf@runestig.com>

> 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 <peter@runestig.com>
> +
> +	* dos-w32.el, lpr.el, ps-print.el, play/handwrite.el: Added support for
> +	the `default-printer-name' function.
> +
>  2003-09-02  Jason Rumney  <jasonr@gnu.org>
 
>  	* 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 <peter@runestig.com>
> +
> +	* gmake.defs, nmake.defs: Add linking to ``winspool.lib''.
> +
>  2003-09-03  Peter Runestig <peter@runestig.com>
 
>  	* 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 <peter@runestig.com>
> +
> +	* makefile.w32-in, w32fns.c: Add `default-printer-name' function.
> +
>  2003-09-03  Kim F. Storm  <storm@cua.dk>
 
>  	* 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;
>  }
>  \f
> +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);
> +}
> +\f
>  /***********************************************************************
>  			    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 <peter@runestig.com>
> 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
> Emacs-devel@gnu.org
> http://mail.gnu.org/mailman/listinfo/emacs-devel

  parent reply	other threads:[~2003-09-15 14:52 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-02-20 13:18 Windows port: using Windows' default printer Peter 'Luna' Runestig
2003-02-20 23:05 ` Jason Rumney
2003-02-21  6:52   ` Peter 'Luna' Runestig
2003-02-21  8:20     ` Jason Rumney
2003-09-12 19:34       ` Peter 'Luna' Runestig
2003-09-13 10:04         ` Eli Zaretskii
2003-09-13 10:35           ` Jason Rumney
2003-09-13 14:39             ` Eli Zaretskii
2003-09-13 19:44               ` Peter 'Luna' Runestig
2003-09-13 20:32                 ` Kai Grossjohann
2003-09-13 22:13                   ` Jason Rumney
2003-09-13 23:44                 ` Eli Zaretskii
2003-09-14  9:40                   ` Peter 'Luna' Runestig
2003-09-15 14:52         ` Stefan Monnier [this message]
2003-09-21 13:19           ` Eli Zaretskii
2003-09-21 19:51             ` Stefan Monnier
2003-09-22  6:07               ` Eli Zaretskii
2003-09-23 16:28               ` Peter 'Luna' Runestig
2003-09-24 18:25                 ` Eli Zaretskii
2003-09-24 19:22                   ` Luc Teirlinck
2003-09-25 13:26                   ` Peter 'Luna' Runestig
2003-10-22 10:35                     ` Peter 'Luna' Runestig
2003-10-22 11:15                       ` Jason Rumney
2003-10-22 15:58                       ` Eli Zaretskii
2003-11-26 11:55                         ` Peter 'Luna' Runestig

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=jwvpti214uw.fsf@vor.iro.umontreal.ca \
    --to=monnier@iro.umontreal.ca \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).