unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: "Peter 'Luna' Runestig" <peter@runestig.com>
Subject: Re: Windows port: using Windows' default printer
Date: 12 Sep 2003 21:34:17 +0200	[thread overview]
Message-ID: <uwucdls1y.fsf@runestig.com> (raw)
In-Reply-To: m2wujuujs3.fsf@nyaumo.jasonr.f2s.com

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

  reply	other threads:[~2003-09-12 19:34 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 [this message]
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
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=uwucdls1y.fsf@runestig.com \
    --to=peter@runestig.com \
    /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).