From mboxrd@z Thu Jan 1 00:00:00 1970 Path: main.gmane.org!not-for-mail From: "Peter 'Luna' Runestig" Newsgroups: gmane.emacs.devel Subject: Re: Windows port: using Windows' default printer Date: 25 Sep 2003 15:26:47 +0200 Sender: emacs-devel-bounces+emacs-devel=quimby.gnus.org@gnu.org Message-ID: References: <3E54D5AA.4000805@runestig.com> <3E55CCC0.5050408@runestig.com> <8011-Sun21Sep2003151918+0300-eliz@elta.co.il> <3F7074C8.5010206@runestig.com> <2719-Wed24Sep2003202507+0300-eliz@elta.co.il> NNTP-Posting-Host: deer.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: sea.gmane.org 1064496655 1663 80.91.224.253 (25 Sep 2003 13:30:55 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Thu, 25 Sep 2003 13:30:55 +0000 (UTC) Cc: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+emacs-devel=quimby.gnus.org@gnu.org Thu Sep 25 15:30:53 2003 Return-path: Original-Received: from quimby.gnus.org ([80.91.224.244]) by deer.gmane.org with esmtp (Exim 3.35 #1 (Debian)) id 1A2WCq-0004JW-00 for ; Thu, 25 Sep 2003 15:30:52 +0200 Original-Received: from monty-python.gnu.org ([199.232.76.173]) by quimby.gnus.org with esmtp (Exim 3.35 #1 (Debian)) id 1A2WK2-0002JM-00 for ; Thu, 25 Sep 2003 15:38:18 +0200 Original-Received: from localhost ([127.0.0.1] helo=monty-python.gnu.org) by monty-python.gnu.org with esmtp (Exim 4.22) id 1A2WA6-0008GD-U0 for emacs-devel@quimby.gnus.org; Thu, 25 Sep 2003 09:28:02 -0400 Original-Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.22) id 1A2W9l-0008Fq-HE for emacs-devel@gnu.org; Thu, 25 Sep 2003 09:27:41 -0400 Original-Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.22) id 1A2W9j-0008F1-2S for emacs-devel@gnu.org; Thu, 25 Sep 2003 09:27:40 -0400 Original-Received: from [62.108.199.166] (helo=arthur.runestig.com) by monty-python.gnu.org with esmtp (TLSv1:DES-CBC3-SHA:168) (Exim 4.22) id 1A2W9i-0008EY-Dh for emacs-devel@gnu.org; Thu, 25 Sep 2003 09:27:38 -0400 Original-Received: from BOLL-R2 ([62.108.199.18]) by arthur.runestig.com (8.12.10/8.12.1) with ESMTP id h8PDRVci015192; Thu, 25 Sep 2003 15:27:31 +0200 Original-To: Eli Zaretskii In-Reply-To: <2719-Wed24Sep2003202507+0300-eliz@elta.co.il> Original-Lines: 224 User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.3.50 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.2 Precedence: list List-Id: Emacs development discussions. List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+emacs-devel=quimby.gnus.org@gnu.org Xref: main.gmane.org gmane.emacs.devel:16631 X-Report-Spam: http://spam.gmane.org/gmane.emacs.devel:16631 "Eli Zaretskii" writes: > > Isn't this what my patch does? > > Yes, but why did you need to test for default-printer-name to be > fboundp? It should simply be called unconditionally, and we should > have some provision for the user to override that with printer-name. Yes, you're right of course, no need for fboundp in dos-w32.el. The original idea was that you could have defined a `default-printer-name' function for any given platform, thus the general idea of the fboundp test. But since dos-w32.el belongs to the same platform as the rest of my code, that test is silly. And `default-printer-name' is only called if printer-name/ps-printer-name is nil. > > I also tampered with the following files, but maybe that isn't necessary: > > > > lpr.el: Add `default-printer-name' stuff to `print-region-1'. > > ps-print.el: Add `default-printer-name' stuff to `ps-do-despool'. > > play/handwrite.el: Add `default-printer-name' stuff to `handwrite'. > > This shouldn't be necessary. The reason for me messing with those files, was the line of thinking from the original idea, described above. > I still think that, even for Windows, it's overhead to call > default-printer-name each time we print something. But that's me. I did a profiling test on my 750 MHz PentiumIII, it takes about 5 ms. Anyway, here is a stripped down, "w32-only" version: 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,7 @@ +2003-09-05 Peter Runestig + + * dos-w32.el: Added support for the `default-printer-name' function. + 2003-09-02 Jason Rumney * 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,8 @@ (printer (or (and (boundp 'dos-printer) (stringp (symbol-value 'dos-printer)) (symbol-value 'dos-printer)) - printer-name))) + 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,8 @@ (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 + (default-printer-name)))) (direct-print-region-helper printer start end lpr-prog delete-text buf display rest))) 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 + + * gmake.defs, nmake.defs: Add linking to ``winspool.lib''. + 2003-09-03 Peter Runestig * 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 + + * makefile.w32-in, w32fns.c: Add `default-printer-name' function. + 2003-09-03 Kim F. Storm * xdisp.c (get_window_cursor_type): Partially undo 2002-03-01 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 #include #include +#include #include #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 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