annotate src/device-msw.c @ 665:fdefd0186b75

[xemacs-hg @ 2001-09-20 06:28:42 by ben] The great integral types renaming. The purpose of this is to rationalize the names used for various integral types, so that they match their intended uses and follow consist conventions, and eliminate types that were not semantically different from each other. The conventions are: -- All integral types that measure quantities of anything are signed. Some people disagree vociferously with this, but their arguments are mostly theoretical, and are vastly outweighed by the practical headaches of mixing signed and unsigned values, and more importantly by the far increased likelihood of inadvertent bugs: Because of the broken "viral" nature of unsigned quantities in C (operations involving mixed signed/unsigned are done unsigned, when exactly the opposite is nearly always wanted), even a single error in declaring a quantity unsigned that should be signed, or even the even more subtle error of comparing signed and unsigned values and forgetting the necessary cast, can be catastrophic, as comparisons will yield wrong results. -Wsign-compare is turned on specifically to catch this, but this tends to result in a great number of warnings when mixing signed and unsigned, and the casts are annoying. More has been written on this elsewhere. -- All such quantity types just mentioned boil down to EMACS_INT, which is 32 bits on 32-bit machines and 64 bits on 64-bit machines. This is guaranteed to be the same size as Lisp objects of type `int', and (as far as I can tell) of size_t (unsigned!) and ssize_t. The only type below that is not an EMACS_INT is Hashcode, which is an unsigned value of the same size as EMACS_INT. -- Type names should be relatively short (no more than 10 characters or so), with the first letter capitalized and no underscores if they can at all be avoided. -- "count" == a zero-based measurement of some quantity. Includes sizes, offsets, and indexes. -- "bpos" == a one-based measurement of a position in a buffer. "Charbpos" and "Bytebpos" count text in the buffer, rather than bytes in memory; thus Bytebpos does not directly correspond to the memory representation. Use "Membpos" for this. -- "Char" refers to internal-format characters, not to the C type "char", which is really a byte. -- For the actual name changes, see the script below. I ran the following script to do the conversion. (NOTE: This script is idempotent. You can safely run it multiple times and it will not screw up previous results -- in fact, it will do nothing if nothing has changed. Thus, it can be run repeatedly as necessary to handle patches coming in from old workspaces, or old branches.) There are two tags, just before and just after the change: `pre-integral-type-rename' and `post-integral-type-rename'. When merging code from the main trunk into a branch, the best thing to do is first merge up to `pre-integral-type-rename', then apply the script and associated changes, then merge from `post-integral-type-change' to the present. (Alternatively, just do the merging in one operation; but you may then have a lot of conflicts needing to be resolved by hand.) Script `fixtypes.sh' follows: ----------------------------------- cut ------------------------------------ files="*.[ch] s/*.h m/*.h config.h.in ../configure.in Makefile.in.in ../lib-src/*.[ch] ../lwlib/*.[ch]" gr Memory_Count Bytecount $files gr Lstream_Data_Count Bytecount $files gr Element_Count Elemcount $files gr Hash_Code Hashcode $files gr extcount bytecount $files gr bufpos charbpos $files gr bytind bytebpos $files gr memind membpos $files gr bufbyte intbyte $files gr Extcount Bytecount $files gr Bufpos Charbpos $files gr Bytind Bytebpos $files gr Memind Membpos $files gr Bufbyte Intbyte $files gr EXTCOUNT BYTECOUNT $files gr BUFPOS CHARBPOS $files gr BYTIND BYTEBPOS $files gr MEMIND MEMBPOS $files gr BUFBYTE INTBYTE $files gr MEMORY_COUNT BYTECOUNT $files gr LSTREAM_DATA_COUNT BYTECOUNT $files gr ELEMENT_COUNT ELEMCOUNT $files gr HASH_CODE HASHCODE $files ----------------------------------- cut ------------------------------------ `fixtypes.sh' is a Bourne-shell script; it uses 'gr': ----------------------------------- cut ------------------------------------ #!/bin/sh # Usage is like this: # gr FROM TO FILES ... # globally replace FROM with TO in FILES. FROM and TO are regular expressions. # backup files are stored in the `backup' directory. from="$1" to="$2" shift 2 echo ${1+"$@"} | xargs global-replace "s/$from/$to/g" ----------------------------------- cut ------------------------------------ `gr' in turn uses a Perl script to do its real work, `global-replace', which follows: ----------------------------------- cut ------------------------------------ : #-*- Perl -*- ### global-modify --- modify the contents of a file by a Perl expression ## Copyright (C) 1999 Martin Buchholz. ## Copyright (C) 2001 Ben Wing. ## Authors: Martin Buchholz <martin@xemacs.org>, Ben Wing <ben@xemacs.org> ## Maintainer: Ben Wing <ben@xemacs.org> ## Current Version: 1.0, May 5, 2001 # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with XEmacs; see the file COPYING. If not, write to the Free # Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. eval 'exec perl -w -S $0 ${1+"$@"}' if 0; use strict; use FileHandle; use Carp; use Getopt::Long; use File::Basename; (my $myName = $0) =~ s@.*/@@; my $usage=" Usage: $myName [--help] [--backup-dir=DIR] [--line-mode] [--hunk-mode] PERLEXPR FILE ... Globally modify a file, either line by line or in one big hunk. Typical usage is like this: [with GNU print, GNU xargs: guaranteed to handle spaces, quotes, etc. in file names] find . -name '*.[ch]' -print0 | xargs -0 $0 's/\bCONST\b/const/g'\n [with non-GNU print, xargs] find . -name '*.[ch]' -print | xargs $0 's/\bCONST\b/const/g'\n The file is read in, either line by line (with --line-mode specified) or in one big hunk (with --hunk-mode specified; it's the default), and the Perl expression is then evalled with \$_ set to the line or hunk of text, including the terminating newline if there is one. It should destructively modify the value there, storing the changed result in \$_. Files in which any modifications are made are backed up to the directory specified using --backup-dir, or to `backup' by default. To disable this, use --backup-dir= with no argument. Hunk mode is the default because it is MUCH MUCH faster than line-by-line. Use line-by-line only when it matters, e.g. you want to do a replacement only once per line (the default without the `g' argument). Conversely, when using hunk mode, *ALWAYS* use `g'; otherwise, you will only make one replacement in the entire file! "; my %options = (); $Getopt::Long::ignorecase = 0; &GetOptions ( \%options, 'help', 'backup-dir=s', 'line-mode', 'hunk-mode', ); die $usage if $options{"help"} or @ARGV <= 1; my $code = shift; die $usage if grep (-d || ! -w, @ARGV); sub SafeOpen { open ((my $fh = new FileHandle), $_[0]); confess "Can't open $_[0]: $!" if ! defined $fh; return $fh; } sub SafeClose { close $_[0] or confess "Can't close $_[0]: $!"; } sub FileContents { my $fh = SafeOpen ("< $_[0]"); my $olddollarslash = $/; local $/ = undef; my $contents = <$fh>; $/ = $olddollarslash; return $contents; } sub WriteStringToFile { my $fh = SafeOpen ("> $_[0]"); binmode $fh; print $fh $_[1] or confess "$_[0]: $!\n"; SafeClose $fh; } foreach my $file (@ARGV) { my $changed_p = 0; my $new_contents = ""; if ($options{"line-mode"}) { my $fh = SafeOpen $file; while (<$fh>) { my $save_line = $_; eval $code; $changed_p = 1 if $save_line ne $_; $new_contents .= $_; } } else { my $orig_contents = $_ = FileContents $file; eval $code; if ($_ ne $orig_contents) { $changed_p = 1; $new_contents = $_; } } if ($changed_p) { my $backdir = $options{"backup-dir"}; $backdir = "backup" if !defined ($backdir); if ($backdir) { my ($name, $path, $suffix) = fileparse ($file, ""); my $backfulldir = $path . $backdir; my $backfile = "$backfulldir/$name"; mkdir $backfulldir, 0755 unless -d $backfulldir; print "modifying $file (original saved in $backfile)\n"; rename $file, $backfile; } WriteStringToFile ($file, $new_contents); } } ----------------------------------- cut ------------------------------------ In addition to those programs, I needed to fix up a few other things, particularly relating to the duplicate definitions of types, now that some types merged with others. Specifically: 1. in lisp.h, removed duplicate declarations of Bytecount. The changed code should now look like this: (In each code snippet below, the first and last lines are the same as the original, as are all lines outside of those lines. That allows you to locate the section to be replaced, and replace the stuff in that section, verifying that there isn't anything new added that would need to be kept.) --------------------------------- snip ------------------------------------- /* Counts of bytes or chars */ typedef EMACS_INT Bytecount; typedef EMACS_INT Charcount; /* Counts of elements */ typedef EMACS_INT Elemcount; /* Hash codes */ typedef unsigned long Hashcode; /* ------------------------ dynamic arrays ------------------- */ --------------------------------- snip ------------------------------------- 2. in lstream.h, removed duplicate declaration of Bytecount. Rewrote the comment about this type. The changed code should now look like this: --------------------------------- snip ------------------------------------- #endif /* The have been some arguments over the what the type should be that specifies a count of bytes in a data block to be written out or read in, using Lstream_read(), Lstream_write(), and related functions. Originally it was long, which worked fine; Martin "corrected" these to size_t and ssize_t on the grounds that this is theoretically cleaner and is in keeping with the C standards. Unfortunately, this practice is horribly error-prone due to design flaws in the way that mixed signed/unsigned arithmetic happens. In fact, by doing this change, Martin introduced a subtle but fatal error that caused the operation of sending large mail messages to the SMTP server under Windows to fail. By putting all values back to be signed, avoiding any signed/unsigned mixing, the bug immediately went away. The type then in use was Lstream_Data_Count, so that it be reverted cleanly if a vote came to that. Now it is Bytecount. Some earlier comments about why the type must be signed: This MUST BE SIGNED, since it also is used in functions that return the number of bytes actually read to or written from in an operation, and these functions can return -1 to signal error. Note that the standard Unix read() and write() functions define the count going in as a size_t, which is UNSIGNED, and the count going out as an ssize_t, which is SIGNED. This is a horrible design flaw. Not only is it highly likely to lead to logic errors when a -1 gets interpreted as a large positive number, but operations are bound to fail in all sorts of horrible ways when a number in the upper-half of the size_t range is passed in -- this number is unrepresentable as an ssize_t, so code that checks to see how many bytes are actually written (which is mandatory if you are dealing with certain types of devices) will get completely screwed up. --ben */ typedef enum lstream_buffering --------------------------------- snip ------------------------------------- 3. in dumper.c, there are four places, all inside of switch() statements, where XD_BYTECOUNT appears twice as a case tag. In each case, the two case blocks contain identical code, and you should *REMOVE THE SECOND* and leave the first.
author ben
date Thu, 20 Sep 2001 06:31:11 +0000
parents f1a615a0d9e0
children 943eaba38521
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* device functions for mswindows.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1994, 1995 Board of Trustees, University of Illinois.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 Copyright (C) 1994, 1995 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 /* Synched up with: Not in FSF. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 /* Authorship:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 Original authors: Jamie Zawinski and the FSF
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 Rewritten by Ben Wing and Chuck Thompson.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 Rewritten for mswindows by Jonathan Harris, November 1997 for 21.0.
510
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
29 Print support added by Kirill Katsnelson, July 2000.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 #include "console-msw.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 #include "console-stream.h"
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
38 #include "objects-msw.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 #include "events.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 #include "faces.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 #include "frame.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 #include "sysdep.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
44 #include <commdlg.h>
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
45
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
46 #if !(defined (CYGWIN) || defined(MINGW))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
47 #include <objbase.h> /* For CoInitialize */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
48 #endif
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
49
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 /* win32 DDE management library globals */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 #ifdef HAVE_DRAGNDROP
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 DWORD mswindows_dde_mlid;
657
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
53 int mswindows_dde_enable;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 HSZ mswindows_dde_service;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 HSZ mswindows_dde_topic_system;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 HSZ mswindows_dde_item_open;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 /* Control conversion of upper case file names to lower case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 nil means no, t means yes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 Lisp_Object Vmswindows_downcase_file_names;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
63 /* Control whether xemacs_stat() attempts to determine file type and link count
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 exactly, at the expense of slower operation. Since true hard links
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 are supported on NTFS volumes, this is only relevant on NT. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 Lisp_Object Vmswindows_get_true_file_attributes;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 Lisp_Object Qinit_pre_mswindows_win, Qinit_post_mswindows_win;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
69 Lisp_Object Qdevmodep;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70
510
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
71 static Lisp_Object Q_allow_selection;
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
72 static Lisp_Object Q_allow_pages;
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
73 static Lisp_Object Q_selected_page_button;
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
74 static Lisp_Object Qselected_page_button;
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
75
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
76 static Lisp_Object allocate_devmode (DEVMODE* src_devmode, int do_copy,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
77 char* src_name, struct device *d);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 /* helpers */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 static Lisp_Object
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
84 build_syscolor_string (int idx)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
86 return (idx < 0 ? Qnil : mswindows_color_to_string (GetSysColor (idx)));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 build_syscolor_cons (int index1, int index2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 Lisp_Object color1, color2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 GCPRO1 (color1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 color1 = build_syscolor_string (index1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 color2 = build_syscolor_string (index2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 RETURN_UNGCPRO (Fcons (color1, color2));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 build_sysmetrics_cons (int index1, int index2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 return Fcons (index1 < 0 ? Qnil : make_int (GetSystemMetrics (index1)),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 index2 < 0 ? Qnil : make_int (GetSystemMetrics (index2)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
107 static Lisp_Object
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
108 build_devicecaps_cons (HDC hdc, int index1, int index2)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
109 {
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
110 return Fcons (index1 < 0 ? Qnil : make_int (GetDeviceCaps (hdc, index1)),
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
111 index2 < 0 ? Qnil : make_int (GetDeviceCaps (hdc, index2)));
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
112 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
113
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 /************************************************************************/
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
116 /* display methods */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 mswindows_init_device (struct device *d, Lisp_Object props)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 WNDCLASSEX wc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 HDC hdc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 DEVICE_CLASS (d) = Qcolor;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 DEVICE_INFD (d) = DEVICE_OUTFD (d) = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 init_baud_rate (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 init_one_device (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 d->device_data = xnew_and_zero (struct mswindows_device);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 hdc = CreateCompatibleDC (NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 assert (hdc!=NULL);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
133 DEVICE_MSWINDOWS_HCDC(d) = hdc;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
134 DEVICE_MSWINDOWS_FONTLIST (d) = mswindows_enumerate_fonts (hdc);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
135 DEVICE_MSWINDOWS_UPDATE_TICK (d) = GetTickCount ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 /* Register the main window class */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 wc.cbSize = sizeof (WNDCLASSEX);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 wc.style = CS_OWNDC; /* One DC per window */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 wc.lpfnWndProc = (WNDPROC) mswindows_wnd_proc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 wc.cbClsExtra = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 wc.cbWndExtra = MSWINDOWS_WINDOW_EXTRA_BYTES;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 /* This must match whatever is passed to CreateWIndowEx, NULL is ok
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 for this. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
145 wc.hInstance = NULL;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 wc.hIcon = LoadIcon (GetModuleHandle(NULL), XEMACS_CLASS);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 wc.hCursor = LoadCursor (NULL, IDC_ARROW);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 /* Background brush is only used during sizing, when XEmacs cannot
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 take over */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE + 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 wc.lpszMenuName = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 wc.lpszClassName = XEMACS_CLASS;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
154 if (xLoadImageA) /* not in NT 3.5 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
155 wc.hIconSm = (HICON) xLoadImageA (GetModuleHandle (NULL), XEMACS_CLASS,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
156 IMAGE_ICON, 16, 16, 0);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
157 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
158 wc.hIconSm = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
159
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
160 if (xRegisterClassExA) /* not in NT 3.5 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
161 xRegisterClassExA (&wc);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
162 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
163 RegisterClassA ((WNDCLASS *) &wc.style);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 #ifdef HAVE_WIDGETS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 xzero (wc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 /* Register the main window class */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 wc.cbSize = sizeof (WNDCLASSEX);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 wc.lpfnWndProc = (WNDPROC) mswindows_control_wnd_proc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 wc.lpszClassName = XEMACS_CONTROL_CLASS;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 wc.hInstance = NULL;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
172 if (xRegisterClassExA) /* not in NT 3.5 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
173 xRegisterClassExA (&wc);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
174 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
175 RegisterClassA ((WNDCLASS *) &wc.style);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
178 #if defined (HAVE_TOOLBARS) || defined (HAVE_WIDGETS)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 InitCommonControls ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182
657
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
183 #ifdef HAVE_DRAGNDROP
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 static void
657
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
185 mswindows_init_dde ()
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 /* Initialize DDE management library and our related globals. We execute a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 * dde Open("file") by simulating a drop, so this depends on dnd support. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
189 # if !(defined(CYGWIN) || defined(MINGW))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
190 CoInitialize (NULL);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
191 # endif
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
192
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 mswindows_dde_mlid = 0;
659
f1a615a0d9e0 [xemacs-hg @ 2001-09-10 19:31:41 by andyp]
andyp
parents: 657
diff changeset
194 mswindows_dde_enable = 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 DdeInitialize (&mswindows_dde_mlid, (PFNCALLBACK)mswindows_dde_callback,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 APPCMD_FILTERINITS|CBF_FAIL_SELFCONNECTIONS|CBF_FAIL_ADVISES|
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
197 CBF_FAIL_POKES|CBF_FAIL_REQUESTS|CBF_SKIP_ALLNOTIFICATIONS,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
198 0);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
199
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
200 mswindows_dde_service = DdeCreateStringHandle (mswindows_dde_mlid,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
201 XEMACS_CLASS, 0);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
202 mswindows_dde_topic_system = DdeCreateStringHandle (mswindows_dde_mlid,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
203 SZDDESYS_TOPIC, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 mswindows_dde_item_open = DdeCreateStringHandle (mswindows_dde_mlid,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 TEXT(MSWINDOWS_DDE_ITEM_OPEN), 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 DdeNameService (mswindows_dde_mlid, mswindows_dde_service, 0L, DNS_REGISTER);
657
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
207 }
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
208 #endif
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
209
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
210 void
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
211 init_mswindows_very_early()
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
212 {
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
213 #ifdef HAVE_DRAGNDROP
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
214 /* Initializing dde when the device is created is too late - the
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
215 client will give up waiting. Instead we initialize here and tell
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
216 the client we're too busy until the rest of initialization has
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
217 happened. */
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
218 mswindows_init_dde();
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
219 #endif
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
220 }
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
221
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
222 static void
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
223 mswindows_finish_init_device (struct device *d, Lisp_Object props)
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
224 {
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
225 #ifdef HAVE_DRAGNDROP
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
226 /* Tell pending clients we are ready. */
ce0b3f2eff35 [xemacs-hg @ 2001-09-09 04:37:41 by andyp]
andyp
parents: 647
diff changeset
227 mswindows_dde_enable = 1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 mswindows_delete_device (struct device *d)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 #ifdef HAVE_DRAGNDROP
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
235 DdeNameService (mswindows_dde_mlid, 0L, 0L, DNS_UNREGISTER);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
236 DdeFreeStringHandle (mswindows_dde_mlid, mswindows_dde_item_open);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
237 DdeFreeStringHandle (mswindows_dde_mlid, mswindows_dde_topic_system);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
238 DdeFreeStringHandle (mswindows_dde_mlid, mswindows_dde_service);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 DdeUninitialize (mswindows_dde_mlid);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
240
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
241 # if !(defined(CYGWIN) || defined(MINGW))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
242 CoUninitialize ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
243 # endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
246 DeleteDC (DEVICE_MSWINDOWS_HCDC(d));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
247 xfree (d->device_data);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
248 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
249
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
250 void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
251 mswindows_get_workspace_coords (RECT *rc)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
252 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
253 SystemParametersInfo (SPI_GETWORKAREA, 0, rc, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
256 static void
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
257 mswindows_mark_device (struct device *d)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
258 {
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
259 mark_object (DEVICE_MSWINDOWS_FONTLIST (d));
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
260 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
261
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 mswindows_device_system_metrics (struct device *d,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 enum device_metrics m)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
266 const HDC hdc = DEVICE_MSWINDOWS_HCDC(d);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
267
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 switch (m)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 case DM_size_device:
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
271 return Fcons (make_int (GetDeviceCaps (hdc, HORZRES)),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
272 make_int (GetDeviceCaps (hdc, VERTRES)));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 break;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
274 case DM_device_dpi:
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
275 return Fcons (make_int (GetDeviceCaps (hdc, LOGPIXELSX)),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
276 make_int (GetDeviceCaps (hdc, LOGPIXELSY)));
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
277 break;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 case DM_size_device_mm:
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
279 return Fcons (make_int (GetDeviceCaps (hdc, HORZSIZE)),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
280 make_int (GetDeviceCaps (hdc, VERTSIZE)));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 case DM_num_bit_planes:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 /* this is what X means by bitplanes therefore we ought to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 consistent. num planes is always 1 under mswindows and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 therefore useless */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
286 return make_int (GetDeviceCaps (hdc, BITSPIXEL));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 case DM_num_color_cells:
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
289 /* #### SIZEPALETTE only valid if RC_PALETTE bit set in RASTERCAPS,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
290 what should we return for a non-palette-based device? */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
291 return make_int (GetDeviceCaps (hdc, SIZEPALETTE));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 /*** Colors ***/
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
295 #define FROB(met, fore, back) \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 case DM_##met: \
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
297 return build_syscolor_cons (fore, back);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
298
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
299 FROB (color_default, COLOR_WINDOWTEXT, COLOR_WINDOW);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
300 FROB (color_select, COLOR_HIGHLIGHTTEXT, COLOR_HIGHLIGHT);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
301 FROB (color_balloon, COLOR_INFOTEXT, COLOR_INFOBK);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
302 FROB (color_3d_face, COLOR_BTNTEXT, COLOR_BTNFACE);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
303 FROB (color_3d_light, COLOR_3DHILIGHT, COLOR_3DLIGHT);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
304 FROB (color_3d_dark, COLOR_3DDKSHADOW, COLOR_3DSHADOW);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
305 FROB (color_menu, COLOR_MENUTEXT, COLOR_MENU);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
306 FROB (color_menu_highlight, COLOR_HIGHLIGHTTEXT, COLOR_HIGHLIGHT);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
307 FROB (color_menu_button, COLOR_MENUTEXT, COLOR_MENU);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
308 FROB (color_menu_disabled, COLOR_GRAYTEXT, COLOR_MENU);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
309 FROB (color_toolbar, COLOR_BTNTEXT, COLOR_BTNFACE);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
310 FROB (color_scrollbar, COLOR_CAPTIONTEXT, COLOR_SCROLLBAR);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 FROB (color_desktop, -1, COLOR_DESKTOP);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 FROB (color_workspace, -1, COLOR_APPWORKSPACE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 #undef FROB
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 /*** Sizes ***/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 #define FROB(met, index1, index2) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 case DM_##met: \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 return build_sysmetrics_cons (index1, index2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 FROB (size_cursor, SM_CXCURSOR, SM_CYCURSOR);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 FROB (size_scrollbar, SM_CXVSCROLL, SM_CYHSCROLL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 FROB (size_menu, -1, SM_CYMENU);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 FROB (size_icon, SM_CXICON, SM_CYICON);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 FROB (size_icon_small, SM_CXSMICON, SM_CYSMICON);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 #undef FROB
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 case DM_size_workspace:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 RECT rc;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
330 mswindows_get_workspace_coords (&rc);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 return Fcons (make_int (rc.right - rc.left),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 make_int (rc.bottom - rc.top));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
334
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
335 case DM_offset_workspace:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
336 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
337 RECT rc;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
338 mswindows_get_workspace_coords (&rc);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
339 return Fcons (make_int (rc.left), make_int (rc.top));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
340 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
341
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 case DM_size_toolbar:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 case DM_size_toolbar_button:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 case DM_size_toolbar_border:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 /*** Features ***/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 #define FROB(met, index) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 case DM_##met: \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 return make_int (GetSystemMetrics (index));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 FROB (mouse_buttons, SM_CMOUSEBUTTONS);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 FROB (swap_buttons, SM_SWAPBUTTON);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 FROB (show_sounds, SM_SHOWSOUNDS);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 FROB (slow_device, SM_SLOWMACHINE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 FROB (security, SM_SECURE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 #undef FROB
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 /* Do not know such property */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 return Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 /************************************************************************/
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
368 /* printer helpers */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
369 /************************************************************************/
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
370
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
371 static void
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
372 signal_open_printer_error (struct device *d)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
373 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
374 invalid_operation ("Failed to open printer", DEVICE_CONNECTION (d));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
375 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
376
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
377
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
378 /* Helper function */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
379 static int
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
380 msprinter_init_device_internal (struct device *d, char* printer_name)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
381 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
382 DEVICE_MSPRINTER_NAME(d) = xstrdup (printer_name);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
383
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
384 if (!OpenPrinter (printer_name, &DEVICE_MSPRINTER_HPRINTER (d), NULL))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
385 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
386 DEVICE_MSPRINTER_HPRINTER (d) = NULL;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
387 return 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
388 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
389
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
390 DEVICE_MSPRINTER_HDC (d) = CreateDC ("WINSPOOL", printer_name,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
391 NULL, NULL);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
392 if (DEVICE_MSPRINTER_HDC (d) == NULL)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
393 return 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
394
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
395 DEVICE_MSPRINTER_HCDC(d) =
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
396 CreateCompatibleDC (DEVICE_MSPRINTER_HDC (d));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
397
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
398 DEVICE_CLASS (d) = (GetDeviceCaps (DEVICE_MSPRINTER_HDC (d), BITSPIXEL)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
399 * GetDeviceCaps (DEVICE_MSPRINTER_HDC (d), PLANES)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
400 > 1) ? Qcolor : Qmono;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
401 return 1;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
402 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
403
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
404 static void
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
405 msprinter_delete_device_internal (struct device *d)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
406 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
407 if (DEVICE_MSPRINTER_HPRINTER (d))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
408 ClosePrinter (DEVICE_MSPRINTER_HPRINTER (d));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
409 if (DEVICE_MSPRINTER_HDC (d))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
410 DeleteDC (DEVICE_MSPRINTER_HDC (d));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
411 if (DEVICE_MSPRINTER_HCDC (d))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
412 DeleteDC (DEVICE_MSPRINTER_HCDC (d));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
413 if (DEVICE_MSPRINTER_NAME (d))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
414 xfree (DEVICE_MSPRINTER_NAME (d));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
415
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
416 DEVICE_MSPRINTER_FONTLIST (d) = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
417 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
418
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
419 static int
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
420 msprinter_reinit_device (struct device *d, char* devname)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
421 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
422 msprinter_delete_device_internal (d);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
423 return msprinter_init_device_internal (d, devname);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
424 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
425
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
426 Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
427 msprinter_default_printer (void)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
428 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
429 Extbyte name[666];
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 659
diff changeset
430 Intbyte *nameint;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
431
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
432 if (GetProfileString (XETEXT ("windows"), XETEXT ("device"), NULL, name,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
433 sizeof (name) / XETCHAR_SIZE) <= 0)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
434 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
435 EXTERNAL_TO_C_STRING (name, nameint, Qmswindows_tstr);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
436
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
437 if (name[0] == '\0')
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
438 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
439 strtok (name, ",");
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
440
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
441 return build_string (name);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
442 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
443
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
444
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
445 /************************************************************************/
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
446 /* printer methods */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
447 /************************************************************************/
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
448
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
449 static void
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
450 msprinter_init_device (struct device *d, Lisp_Object props)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
451 {
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
452 char* printer_name;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
453 DEVMODE *pdm;
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 593
diff changeset
454 LONG dm_size;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
455
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
456 d->device_data = xnew_and_zero (struct msprinter_device);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
457
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
458 DEVICE_INFD (d) = DEVICE_OUTFD (d) = -1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
459 DEVICE_MSPRINTER_DEVMODE(d) = Qnil;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
460
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
461 /* We do not use printer fon list as we do with the display
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
462 device. Rather, we allow GDI to pick the closest match to the
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
463 display font. */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
464 DEVICE_MSPRINTER_FONTLIST (d) = Qnil;
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
465
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
466 CHECK_STRING (DEVICE_CONNECTION (d));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
467
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
468 TO_EXTERNAL_FORMAT (LISP_STRING, DEVICE_CONNECTION (d),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
469 C_STRING_ALLOCA, printer_name,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
470 Qmswindows_tstr);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
471
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
472 if (!msprinter_init_device_internal (d, printer_name))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
473 signal_open_printer_error (d);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
474
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
475 /* Determine DEVMODE size and store the default DEVMODE */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
476 dm_size = DocumentProperties (NULL, DEVICE_MSPRINTER_HPRINTER (d),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
477 printer_name, NULL, NULL, 0);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
478 if (dm_size <= 0)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
479 signal_open_printer_error (d);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
480
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
481 pdm = (DEVMODE*) xmalloc (dm_size);
552
a3adcf42bcec [xemacs-hg @ 2001-05-21 06:19:40 by mta]
mta
parents: 545
diff changeset
482 if (DocumentProperties (NULL, DEVICE_MSPRINTER_HPRINTER(d),
a3adcf42bcec [xemacs-hg @ 2001-05-21 06:19:40 by mta]
mta
parents: 545
diff changeset
483 printer_name, pdm,
a3adcf42bcec [xemacs-hg @ 2001-05-21 06:19:40 by mta]
mta
parents: 545
diff changeset
484 NULL, DM_OUT_BUFFER) < 0)
a3adcf42bcec [xemacs-hg @ 2001-05-21 06:19:40 by mta]
mta
parents: 545
diff changeset
485 signal_open_printer_error (d);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
486
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
487 assert (DEVMODE_SIZE (pdm) <= dm_size);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
488
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
489 DEVICE_MSPRINTER_DEVMODE(d) =
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
490 allocate_devmode (pdm, 0, printer_name, d);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
491
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
492 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
493
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
494 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
495 msprinter_delete_device (struct device *d)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
496 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
497 if (d->device_data)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
498 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
499 msprinter_delete_device_internal (d);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
500
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
501 /* Disassociate the selected devmode with the device */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
502 if (!NILP (DEVICE_MSPRINTER_DEVMODE (d)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
503 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
504 XDEVMODE (DEVICE_MSPRINTER_DEVMODE (d))->device = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
505 DEVICE_MSPRINTER_DEVMODE (d) = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
506 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
507
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
508 xfree (d->device_data);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
509 }
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
510 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
511
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
512 static Lisp_Object
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
513 msprinter_device_system_metrics (struct device *d,
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
514 enum device_metrics m)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
515 {
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
516 switch (m)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
517 {
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
518 /* Device sizes - pixel and mm */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
519 #define FROB(met, index1, index2) \
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
520 case DM_##met: \
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
521 return build_devicecaps_cons \
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
522 (DEVICE_MSPRINTER_HDC(d), index1, index2);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
523
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
524 FROB (size_device, PHYSICALWIDTH, PHYSICALHEIGHT);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
525 FROB (size_device_mm, HORZSIZE, VERTSIZE);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
526 FROB (size_workspace, HORZRES, VERTRES);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
527 FROB (offset_workspace, PHYSICALOFFSETX, PHYSICALOFFSETY);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
528 FROB (device_dpi, LOGPIXELSX, LOGPIXELSY);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
529 #undef FROB
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
530
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
531 case DM_num_bit_planes:
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
532 /* this is what X means by bitplanes therefore we ought to be
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
533 consistent. num planes is always 1 under mswindows and
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
534 therefore useless */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
535 return make_int (GetDeviceCaps (DEVICE_MSPRINTER_HDC(d), BITSPIXEL));
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
536
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
537 case DM_num_color_cells: /* Printers are non-palette devices */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
538 case DM_slow_device: /* Animation would be a really bad idea */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
539 case DM_security: /* Not provided by windows */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
540 return Qzero;
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
541 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
542
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
543 /* Do not know such property */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
544 return Qunbound;
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
545 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
546
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
547 static void
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
548 msprinter_mark_device (struct device *d)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
549 {
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
550 mark_object (DEVICE_MSPRINTER_FONTLIST (d));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
551 mark_object (DEVICE_MSPRINTER_DEVMODE (d));
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
552 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
553
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
554
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
555 /************************************************************************/
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
556 /* printer Lisp subroutines */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
557 /************************************************************************/
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
558
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
559 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
560 global_free_2_maybe (HGLOBAL hg1, HGLOBAL hg2)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
561 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
562 if (hg1 != NULL)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
563 GlobalFree (hg1);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
564 if (hg2 != NULL)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
565 GlobalFree (hg2);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
566 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
567
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
568 static HGLOBAL
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
569 devmode_to_hglobal (Lisp_Devmode *ldm)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
570 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
571 HGLOBAL hg = GlobalAlloc (GHND, XDEVMODE_SIZE (ldm));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
572 memcpy (GlobalLock (hg), ldm->devmode, XDEVMODE_SIZE (ldm));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
573 GlobalUnlock (hg);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
574 return hg;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
575 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
576
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
577 /* Returns 0 if the printer has been deleted due to a fatal I/O error,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
578 1 otherwise. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
579 static int
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
580 sync_printer_with_devmode (struct device* d, DEVMODE* devmode_in,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
581 DEVMODE* devmode_out, char* devname)
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
582 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
583 /* Change connection if the device changed */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
584 if (devname != NULL
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
585 && stricmp (devname, DEVICE_MSPRINTER_NAME(d)) != 0)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
586 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
587 Lisp_Object new_connection = build_ext_string (devname, Qmswindows_tstr);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
588 struct gcpro gcpro1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
589
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
590 GCPRO1 (new_connection);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
591 DEVICE_CONNECTION (d) = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
592 if (!NILP (Ffind_device (new_connection, Qmsprinter)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
593 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
594 /* We are in trouble - second msprinter for the same device.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
595 Nothing wrong on the Windows side, just forge a unique
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
596 connection name. Use the memory address of d as a unique
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
597 suffix. */
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 578
diff changeset
598 Extbyte *new_connext = (Extbyte *) alloca (strlen (devname + 11));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
599 sprintf (new_connext, "%s:%X", devname, d->header.uid);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
600 new_connection = build_ext_string (devname, Qmswindows_tstr);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
601 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
602 DEVICE_CONNECTION (d) = new_connection;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
603 UNGCPRO;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
604
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
605 /* Reinitialize printer. The device can pop off in process */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
606 if (!msprinter_reinit_device (d, devname))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
607 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
608 /* Kaboom! */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
609 delete_device_internal (d, 1, 0, 1);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
610 return 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
611 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
612 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
613
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
614 /* Apply the new devmode to the printer */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
615 DocumentProperties (NULL,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
616 DEVICE_MSPRINTER_HPRINTER(d),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
617 DEVICE_MSPRINTER_NAME(d),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
618 devmode_out, devmode_in,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
619 DM_IN_BUFFER | DM_OUT_BUFFER);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
620
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
621 /* #### ResetDC fails sometimes, Bill only knows why.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
622 The solution below looks more like a workaround to me,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
623 although it might be fine. --kkm */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
624 if (ResetDC (DEVICE_MSPRINTER_HDC (d), devmode_out) == NULL)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
625 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
626 DeleteDC (DEVICE_MSPRINTER_HDC (d));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
627 DEVICE_MSPRINTER_HDC (d) =
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
628 CreateDC ("WINSPOOL", DEVICE_MSPRINTER_NAME(d), NULL, devmode_out);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
629 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
630
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
631 return 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
632 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
633
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
634 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
635 handle_devmode_changes (Lisp_Devmode *ldm, HGLOBAL hDevNames, HGLOBAL hDevMode)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
636 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
637 DEVNAMES* devnames = (DEVNAMES*) GlobalLock (hDevNames);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
638 char *new_name = devnames ? (char*)devnames + devnames->wDeviceOffset : NULL;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
639 DEVMODE* devmode = (DEVMODE*) GlobalLock (hDevMode);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
640
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
641 /* Size and name may have changed */
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 578
diff changeset
642 ldm->devmode = (DEVMODE *) xrealloc (ldm->devmode, DEVMODE_SIZE (devmode));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
643 if (new_name)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
644 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
645 if (ldm->printer_name)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
646 xfree (ldm->printer_name);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
647 ldm->printer_name = xstrdup (new_name);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
648 }
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
649
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
650 if (!NILP (ldm->device))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
651 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
652 /* Apply the new devmode to the printer and get a compete one back */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
653 struct device *d = XDEVICE (ldm->device);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
654 if (!sync_printer_with_devmode (d, devmode, ldm->devmode, new_name))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
655 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
656 global_free_2_maybe (hDevNames, hDevMode);
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 552
diff changeset
657 signal_error (Qio_error, "Printer device initialization I/O error, device deleted", Qunbound);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
658 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
659 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
660 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
661 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
662 /* Just copy the devmode structure */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
663 memcpy (ldm->devmode, devmode, DEVMODE_SIZE (devmode));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
664 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
665 }
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
666
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
667 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
668 ensure_not_printing (struct device *d)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
669 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
670 if (!NILP (DEVICE_FRAME_LIST (d)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
671 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
672 Lisp_Object device;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
673 XSETDEVICE (device, d);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
674 invalid_operation ("Cannot change settings while print job is active",
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
675 device);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
676 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
677 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
678
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
679 static Lisp_Devmode *
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
680 decode_devmode (Lisp_Object dev)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
681 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
682 if (DEVMODEP (dev))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
683 return XDEVMODE (dev);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
684 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
685 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
686 ensure_not_printing (XDEVICE (dev));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
687 return XDEVMODE (DEVICE_MSPRINTER_DEVMODE (XDEVICE (dev)));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
688 }
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
689 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
690
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
691 /*
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
692 * DEV can be either a printer or devmode
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
693 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
694 static Lisp_Object
510
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
695 print_dialog_worker (Lisp_Object dev, DWORD flags)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
696 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
697 Lisp_Devmode *ldm = decode_devmode (dev);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
698 PRINTDLG pd;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
699
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
700 memset (&pd, 0, sizeof (pd));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
701 pd.lStructSize = sizeof (pd);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
702 pd.hwndOwner = mswindows_get_selected_frame_hwnd ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
703 pd.hDevMode = devmode_to_hglobal (ldm);
510
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
704 pd.Flags = flags | PD_USEDEVMODECOPIESANDCOLLATE;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
705 pd.nMinPage = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
706 pd.nMaxPage = 0xFFFF;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
707
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
708 if (!PrintDlg (&pd))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
709 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
710 global_free_2_maybe (pd.hDevNames, pd.hDevMode);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
711 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
712 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
713
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
714 handle_devmode_changes (ldm, pd.hDevNames, pd.hDevMode);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
715
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
716 /* Finally, build the resulting plist */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
717 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
718 Lisp_Object result = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
719 struct gcpro gcpro1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
720 GCPRO1 (result);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
721
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
722 /* Do consing in reverse order.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
723 Number of copies */
510
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
724 result = Fcons (Qcopies, Fcons (make_int (pd.nCopies), result));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
725
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
726 /* Page range */
510
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
727 if (pd.Flags & PD_PAGENUMS)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
728 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
729 result = Fcons (Qto_page, Fcons (make_int (pd.nToPage), result));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
730 result = Fcons (Qfrom_page, Fcons (make_int (pd.nFromPage), result));
510
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
731 result = Fcons (Qselected_page_button, Fcons (Qpages, result));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
732 }
510
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
733 else if (pd.Flags & PD_SELECTION)
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
734 result = Fcons (Qselected_page_button, Fcons (Qselection, result));
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
735 else
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
736 result = Fcons (Qselected_page_button, Fcons (Qall, result));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
737
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
738 /* Device name */
510
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
739 result = Fcons (Qname, Fcons (build_ext_string (ldm->printer_name,
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
740 Qmswindows_tstr),
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
741 result));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
742 UNGCPRO;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
743
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
744 global_free_2_maybe (pd.hDevNames, pd.hDevMode);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
745 return result;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
746 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
747 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
748
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
749 Lisp_Object
510
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
750 mswindows_handle_print_dialog_box (struct frame *f, Lisp_Object keys)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
751 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
752 Lisp_Object device = Qunbound, settings = Qunbound;
510
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
753 DWORD flags = PD_NOSELECTION;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
754
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
755 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
756 EXTERNAL_PROPERTY_LIST_LOOP_3 (key, value, keys)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
757 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
758 if (EQ (key, Q_device))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
759 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
760 device = wrap_device (decode_device (value));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
761 CHECK_MSPRINTER_DEVICE (device);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
762 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
763 else if (EQ (key, Q_printer_settings))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
764 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
765 CHECK_DEVMODE (value);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
766 settings = value;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
767 }
510
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
768 else if (EQ (key, Q_allow_pages))
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
769 {
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
770 if (NILP (value))
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
771 flags |= PD_NOPAGENUMS;
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
772 }
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
773 else if (EQ (key, Q_allow_selection))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
774 {
510
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
775 if (!NILP (value))
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
776 flags &= ~PD_NOSELECTION;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
777 }
510
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
778 else if (EQ (key, Q_selected_page_button))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
779 {
510
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
780 if (EQ (value, Qselection))
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
781 flags |= PD_SELECTION;
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
782 else if (EQ (value, Qpages))
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
783 flags |= PD_PAGENUMS;
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
784 else if (!EQ (value, Qall))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 552
diff changeset
785 invalid_constant ("for :selected-page-button", value);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
786 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
787 else
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 552
diff changeset
788 invalid_constant ("Unrecognized print-dialog keyword", key);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
789 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
790 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
791
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
792 if ((UNBOUNDP (device) && UNBOUNDP (settings)) ||
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
793 (!UNBOUNDP (device) && !UNBOUNDP (settings)))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 552
diff changeset
794 sferror ("Exactly one of :device and :printer-settings must be given",
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
795 keys);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
796
510
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
797 return print_dialog_worker (!UNBOUNDP (device) ? device : settings, flags);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
798 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
799
506
39ccc7dd8077 [xemacs-hg @ 2001-05-05 08:39:59 by ben]
ben
parents: 446
diff changeset
800 int
39ccc7dd8077 [xemacs-hg @ 2001-05-05 08:39:59 by ben]
ben
parents: 446
diff changeset
801 mswindows_get_default_margin (Lisp_Object prop)
39ccc7dd8077 [xemacs-hg @ 2001-05-05 08:39:59 by ben]
ben
parents: 446
diff changeset
802 {
39ccc7dd8077 [xemacs-hg @ 2001-05-05 08:39:59 by ben]
ben
parents: 446
diff changeset
803 if (EQ (prop, Qleft_margin)) return 1440;
39ccc7dd8077 [xemacs-hg @ 2001-05-05 08:39:59 by ben]
ben
parents: 446
diff changeset
804 if (EQ (prop, Qright_margin)) return 1440;
39ccc7dd8077 [xemacs-hg @ 2001-05-05 08:39:59 by ben]
ben
parents: 446
diff changeset
805 if (EQ (prop, Qtop_margin)) return 720;
39ccc7dd8077 [xemacs-hg @ 2001-05-05 08:39:59 by ben]
ben
parents: 446
diff changeset
806 if (EQ (prop, Qbottom_margin)) return 720;
39ccc7dd8077 [xemacs-hg @ 2001-05-05 08:39:59 by ben]
ben
parents: 446
diff changeset
807 abort ();
39ccc7dd8077 [xemacs-hg @ 2001-05-05 08:39:59 by ben]
ben
parents: 446
diff changeset
808 return 0;
39ccc7dd8077 [xemacs-hg @ 2001-05-05 08:39:59 by ben]
ben
parents: 446
diff changeset
809 }
39ccc7dd8077 [xemacs-hg @ 2001-05-05 08:39:59 by ben]
ben
parents: 446
diff changeset
810
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
811 static int
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
812 plist_get_margin (Lisp_Object plist, Lisp_Object prop)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
813 {
506
39ccc7dd8077 [xemacs-hg @ 2001-05-05 08:39:59 by ben]
ben
parents: 446
diff changeset
814 Lisp_Object val =
39ccc7dd8077 [xemacs-hg @ 2001-05-05 08:39:59 by ben]
ben
parents: 446
diff changeset
815 Fplist_get (plist, prop, make_int (mswindows_get_default_margin (prop)));
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
816 if (!INTP (val))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
817 invalid_argument ("Margin value must be an integer", val);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
818
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
819 return MulDiv (XINT (val), 100, 144);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
820 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
821
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
822 static Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
823 plist_set_margin (Lisp_Object plist, Lisp_Object prop, int margin, int mm_p)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
824 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
825 Lisp_Object val = make_int (MulDiv (margin, 144, mm_p ? 2450 : 100));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
826 return Fcons (prop, Fcons (val, plist));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
827 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
828
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
829 Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
830 mswindows_handle_page_setup_dialog_box (struct frame *f, Lisp_Object keys)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
831 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
832 Lisp_Object device = Qunbound, settings = Qunbound;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
833 Lisp_Object plist = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
834
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
835 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
836 EXTERNAL_PROPERTY_LIST_LOOP_3 (key, value, keys)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
837 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
838 if (EQ (key, Q_device))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
839 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
840 device = wrap_device (decode_device (value));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
841 CHECK_MSPRINTER_DEVICE (device);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
842 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
843 else if (EQ (key, Q_printer_settings))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
844 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
845 CHECK_DEVMODE (value);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
846 settings = value;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
847 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
848 else if (EQ (key, Q_properties))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
849 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
850 CHECK_LIST (value);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
851 plist = value;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
852 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
853 else
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 552
diff changeset
854 invalid_constant ("Unrecognized page-setup dialog keyword", key);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
855 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
856 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
857
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
858 if ((UNBOUNDP (device) && UNBOUNDP (settings)) ||
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
859 (!UNBOUNDP (device) && !UNBOUNDP (settings)))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 552
diff changeset
860 sferror ("Exactly one of :device and :printer-settings must be given",
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
861 keys);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
862
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
863 if (UNBOUNDP (device))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
864 device = settings;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
865
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
866 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
867 Lisp_Devmode *ldm = decode_devmode (device);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
868 PAGESETUPDLG pd;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
869
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
870 memset (&pd, 0, sizeof (pd));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
871 pd.lStructSize = sizeof (pd);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
872 pd.hwndOwner = mswindows_get_selected_frame_hwnd ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
873 pd.Flags = PSD_MARGINS;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
874 pd.rtMargin.left = plist_get_margin (plist, Qleft_margin);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
875 pd.rtMargin.top = plist_get_margin (plist, Qtop_margin);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
876 pd.rtMargin.right = plist_get_margin (plist, Qright_margin);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
877 pd.rtMargin.bottom = plist_get_margin (plist, Qbottom_margin);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
878 pd.hDevMode = devmode_to_hglobal (ldm);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
879
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
880 if (!PageSetupDlg (&pd))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
881 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
882 global_free_2_maybe (pd.hDevNames, pd.hDevMode);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
883 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
884 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
885
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
886 if (pd.hDevMode)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
887 handle_devmode_changes (ldm, pd.hDevNames, pd.hDevMode);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
888
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
889 /* Finally, build the resulting plist */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
890 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
891 Lisp_Object result = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
892 int mm_p = pd.Flags & PSD_INHUNDREDTHSOFMILLIMETERS;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
893 result = plist_set_margin (result, Qbottom_margin, pd.rtMargin.bottom,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
894 mm_p);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
895 result = plist_set_margin (result, Qright_margin, pd.rtMargin.right,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
896 mm_p);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
897 result = plist_set_margin (result, Qtop_margin, pd.rtMargin.top, mm_p);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
898 result = plist_set_margin (result, Qleft_margin, pd.rtMargin.left, mm_p);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
899 return result;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
900 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
901 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
902 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
903
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
904 DEFUN ("msprinter-get-settings", Fmsprinter_get_settings, 1, 1, 0, /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
905 Return the settings object currently used by DEVICE.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
906 The object returned is not a copy, but rather a pointer to the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
907 original one. Use `msprinter-settings-copy' to create a copy of it.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
908 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
909 (device))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
910 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
911 struct device *d = decode_device (device);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
912 XSETDEVICE (device, d);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
913 CHECK_MSPRINTER_DEVICE (device);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
914 return DEVICE_MSPRINTER_DEVMODE (d);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
915 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
916
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
917 DEFUN ("msprinter-select-settings", Fmsprinter_select_settings, 2, 2, 0, /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
918 Select SETTINGS object into a DEVICE.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
919 The settings from the settings object are immediately applied to the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
920 printer, possibly changing even the target printer itself, and all
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
921 future changes are applied synchronously to the printer device and the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
922 selected printer object, until a different settings object is selected
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
923 into the same printer.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
924
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
925 A settings object can be selected to no more than one printer at a time.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
926
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
927 If the supplied settings object is not specialized, it is specialized
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
928 for the printer immediately upon selection. The object can be
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
929 despecialized after it is unselected by calling the function
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
930 `msprinter-settings-despecialize'.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
931
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
932 Return value is the previously selected settings object.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
933 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
934 (device, settings))
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
935 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
936 Lisp_Devmode *ldm;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
937 struct device *d = decode_device (device);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
938
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
939 struct gcpro gcpro1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
940 GCPRO1 (settings);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
941
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
942 XSETDEVICE (device, d);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
943 CHECK_MSPRINTER_DEVICE (device);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
944 CHECK_DEVMODE (settings);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
945 ldm = XDEVMODE (settings);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
946
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
947 if (!NILP (ldm->device))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
948 invalid_operation ("The object is currently selected into a device",
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
949 settings);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
950
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
951 /* If the object being selected is de-specialized, then its
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
952 size is perhaps not enough to receive the new devmode. We can ask
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
953 for printer's devmode size here, because despecialized settings
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
954 cannot force switching to a different printer, as they supply no
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
955 printer name at all. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
956 if (ldm->printer_name == NULL)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
957 {
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 593
diff changeset
958 LONG dm_size =
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
959 DocumentProperties (NULL, DEVICE_MSPRINTER_HPRINTER(d),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
960 DEVICE_MSPRINTER_NAME(d), NULL, NULL, 0);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
961 if (dm_size <= 0)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 552
diff changeset
962 signal_error (Qio_error,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 552
diff changeset
963 "Unable to specialize settings, printer error",
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 552
diff changeset
964 device);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
965
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
966 assert (XDEVMODE_SIZE (ldm) <= dm_size);
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 578
diff changeset
967 ldm->devmode = (DEVMODE *) xrealloc (ldm->devmode, dm_size);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
968 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
969
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
970 /* If we bail out on signal here, no damage is done, except that
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
971 the storage for the DEVMODE structure might be reallocated to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
972 hold a larger one - not a big deal */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
973 if (!sync_printer_with_devmode (d, ldm->devmode, ldm->devmode,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
974 ldm->printer_name))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 552
diff changeset
975 signal_error (Qio_error,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 552
diff changeset
976 "Printer device initialization I/O error, device deleted",
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 552
diff changeset
977 Qunbound);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
978
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
979 if (ldm->printer_name == NULL)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
980 ldm->printer_name = xstrdup (DEVICE_MSPRINTER_NAME(d));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
981
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
982 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
983 Lisp_Object old_mode = DEVICE_MSPRINTER_DEVMODE (d);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
984 ldm->device = device;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
985 XDEVMODE (old_mode)->device = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
986 DEVICE_MSPRINTER_DEVMODE (d) = settings;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
987 UNGCPRO;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
988 return old_mode;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
989 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
990 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
991
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
992 DEFUN ("msprinter-apply-settings", Fmsprinter_apply_settings, 2, 2, 0, /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
993 Apply settings from a SETTINGS object to a 'msprinter DEVICE.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
994 The settings from the settings object are immediately applied to the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
995 printer, possibly changing even the target printer itself. The SETTING
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
996 object is not modified, unlike `msprinter-select-settings', and the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
997 supplied object is not changed. The changes are immediately recorded
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
998 into the settings object which is currently selected into the printer
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
999 device.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1000
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1001 Return value is the currently selected settings object.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1002 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1003 (device, settings))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1004 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1005 Lisp_Devmode *ldm_current, *ldm_new;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1006 struct device *d = decode_device (device);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1007
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1008 struct gcpro gcpro1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1009 GCPRO1 (settings);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1010
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1011 XSETDEVICE (device, d);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1012 CHECK_MSPRINTER_DEVICE (device);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1013 CHECK_DEVMODE (settings);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1014 ldm_new = XDEVMODE (settings);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1015 ldm_current = XDEVMODE (DEVICE_MSPRINTER_DEVMODE (d));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1016
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1017 /* If the supplied devmode is not specialized, then the current
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1018 devmode size will always be sufficient, as the printer does
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1019 not change. If it is specialized, we must reallocate the current
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1020 devmode storage to match with the supplied one, as it has the right
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1021 size for the new printer, if it is going to change. The correct
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1022 way is to use the largest of the two though, to keep the old
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1023 contents unchanged in case of preliminary exit.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1024 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1025 if (ldm_new->printer_name)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1026 ldm_current->devmode =
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1027 (DEVMODE*) xrealloc (ldm_current->devmode,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1028 max (XDEVMODE_SIZE (ldm_new),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1029 XDEVMODE_SIZE (ldm_current)));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1030
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1031 if (!sync_printer_with_devmode (d, ldm_new->devmode,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1032 ldm_current->devmode,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1033 ldm_new->printer_name))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 552
diff changeset
1034 signal_error (Qio_error,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 552
diff changeset
1035 "Printer device initialization I/O error, device deleted",
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 552
diff changeset
1036 Qunbound);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1037
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1038 if (ldm_new->printer_name != NULL)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1039 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1040 xfree (ldm_current->printer_name);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1041 ldm_current->printer_name = xstrdup (ldm_new->printer_name);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1042 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1043
446
1ccc32a20af4 Import from CVS: tag r21-2-38
cvs
parents: 442
diff changeset
1044 UNGCPRO;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1045 return DEVICE_MSPRINTER_DEVMODE (d);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1046 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1047
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1048 /************************************************************************/
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1049 /* devmode */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1050 /************************************************************************/
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1051
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1052 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1053 print_devmode (Lisp_Object obj, Lisp_Object printcharfun,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1054 int escapeflag)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1055 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1056 char buf[100];
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1057 Lisp_Devmode *dm = XDEVMODE (obj);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1058 if (print_readably)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 552
diff changeset
1059 printing_unreadable_object ("#<msprinter-settings 0x%x>",
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 552
diff changeset
1060 dm->header.uid);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1061 write_c_string ("#<msprinter-settings", printcharfun);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1062 if (dm->printer_name)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1063 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1064 write_c_string (" for \"", printcharfun);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1065 write_c_string (dm->printer_name, printcharfun);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1066 write_c_string ("\"", printcharfun);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1067 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1068 if (!NILP (dm->device))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1069 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1070 write_c_string (" (currently on ", printcharfun);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1071 print_internal (dm->device, printcharfun, 0);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1072 write_c_string (")", printcharfun);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1073 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1074 sprintf (buf, " 0x%x>", dm->header.uid);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1075 write_c_string (buf, printcharfun);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1076 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1077
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1078 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1079 finalize_devmode (void *header, int for_disksave)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1080 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1081 Lisp_Devmode *dm = (Lisp_Devmode *) header;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1082
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1083 if (for_disksave)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1084 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1085 Lisp_Object devmode;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1086 XSETDEVMODE (devmode, dm);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1087 invalid_operation
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1088 ("Cannot dump XEmacs containing an msprinter-settings object",
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1089 devmode);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1090 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1091
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1092 assert (NILP (dm->device));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1093
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1094 if (dm->printer_name)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1095 xfree (dm->printer_name);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1096 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1097
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1098 static int
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1099 equal_devmode (Lisp_Object obj1, Lisp_Object obj2, int depth)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1100 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1101 Lisp_Devmode *dm1 = XDEVMODE (obj1);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1102 Lisp_Devmode *dm2 = XDEVMODE (obj2);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1103
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1104 if ((dm1->devmode != NULL) != (dm1->devmode != NULL))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1105 return 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1106 if (dm1->devmode == NULL)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1107 return 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1108 if (memcmp (dm1->devmode, dm2->devmode, XDEVMODE_SIZE (dm1)) != 0)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1109 return 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1110 if (dm1->printer_name == NULL || dm2->printer_name == NULL)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1111 return 1;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1112 return stricmp (dm1->printer_name, dm2->printer_name) == 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1113 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1114
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 659
diff changeset
1115 static Hashcode
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1116 hash_devmode (Lisp_Object obj, int depth)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1117 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1118 Lisp_Devmode *dm = XDEVMODE (obj);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1119
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1120 return HASH3 (XDEVMODE_SIZE (dm),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1121 dm->devmode ? memory_hash (dm->devmode, XDEVMODE_SIZE (dm))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1122 : 0,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1123 dm->printer_name ? string_hash (dm->printer_name) : 0);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1124 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1125
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1126 DEFINE_LRECORD_IMPLEMENTATION ("msprinter-settings", devmode,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1127 0/*mark*/, print_devmode, finalize_devmode,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1128 equal_devmode, hash_devmode, 0/*description*/,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1129 Lisp_Devmode);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1130 static Lisp_Object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1131 allocate_devmode (DEVMODE* src_devmode, int do_copy,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1132 char* src_name, struct device *d)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1133 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1134 Lisp_Devmode *dm;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1135 Lisp_Object ob;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1136
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1137 dm = alloc_lcrecord_type (Lisp_Devmode, &lrecord_devmode);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1138
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1139 if (d)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1140 XSETDEVICE (dm->device, d);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1141 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1142 dm->device = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1143
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1144 dm->printer_name = src_name ? xstrdup (src_name) : NULL;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1145
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1146 if (src_devmode != NULL && do_copy)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1147 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1148 dm->devmode = (DEVMODE*) xmalloc (DEVMODE_SIZE (src_devmode));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1149 memcpy (dm->devmode, src_devmode, DEVMODE_SIZE (src_devmode));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1150 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1151 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1152 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1153 dm->devmode = src_devmode;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1154 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1155
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1156 XSETDEVMODE (ob, dm);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1157 return ob;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1158 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1159
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1160 DEFUN ("msprinter-settings-copy", Fmsprinter_settings_copy, 1, 1, 0, /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1161 Create and returns an exact copy of a printer settings object.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1162 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1163 (settings))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1164 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1165 Lisp_Devmode *dm;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1166
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1167 CHECK_DEVMODE (settings);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1168 dm = XDEVMODE (settings);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1169
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1170 return allocate_devmode (dm->devmode, 1, dm->printer_name, NULL);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1171 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1172
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1173 DEFUN ("msprinter-settings-despecialize", Fmsprinter_settings_despecialize, 1, 1, 0, /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1174 Erase printer-specific settings from a printer settings object.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1175 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1176 (settings))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1177 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1178 Lisp_Devmode *ldm;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1179 DEVMODE *dm;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1180
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1181 CHECK_DEVMODE (settings);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1182 ldm = XDEVMODE (settings);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1183
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1184 if (!NILP (ldm->device))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1185 invalid_operation ("The object is currently selected into a device",
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1186 settings);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1187
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1188 dm = ldm->devmode;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1189
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1190 /* #### TODO. Either remove references to device specific bins,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1191 paper sizes etc, or signal an error of they are present. */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1192
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1193 dm->dmDriverExtra = 0;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1194 dm->dmDeviceName[0] = '\0';
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1195
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1196 if (ldm->printer_name)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1197 xfree (ldm->printer_name);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1198
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1199 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1200 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1201
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1202 DEFUN ("mswindows-get-default-printer", Fmswindows_get_default_printer, 0, 0, 0, /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1203 Return name of the default printer, as string, on nil if there is no default.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1204 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1205 ())
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1206 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1207 return msprinter_default_printer ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1208 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1209
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1210 static void
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1211 signal_enum_printer_error (void)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1212 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1213 invalid_operation ("Error enumerating printers", make_int (GetLastError ()));
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1214 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1215
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1216 DEFUN ("mswindows-printer-list", Fmswindows_printer_list, 0, 0, 0, /*
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1217 Return a list of string names of installed printers.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1218 If there is a default printer, it is returned as the first element of
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1219 the list. If there is no default printer, the first element of the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1220 list will be nil. The rest of elements are guaranteed to have string
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1221 values. Return value is nil if there are no printers installed.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1222 */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1223 ())
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1224 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1225 int have_nt, ok;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1226 BYTE *data_buf, dummy_byte;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 659
diff changeset
1227 Bytecount enum_entry_size;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1228 DWORD enum_flags, enum_level, bytes_needed, num_printers;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1229 struct gcpro gcpro1, gcpro2;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1230 Lisp_Object result = Qnil, def_printer = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1231
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1232 /* Determine OS flavor, to use the fastest enumeration method available */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1233 have_nt = !mswindows_windows9x_p ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1234 enum_flags = PRINTER_ENUM_LOCAL | (have_nt ? PRINTER_ENUM_CONNECTIONS : 0);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1235 enum_level = have_nt ? 4 : 5;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1236 enum_entry_size = have_nt ? sizeof (PRINTER_INFO_4) : sizeof (PRINTER_INFO_5);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1237
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1238 /* Allocate memory for printer enum structure */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1239 ok = EnumPrinters (enum_flags, NULL, enum_level, &dummy_byte, 1,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1240 &bytes_needed, &num_printers);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1241 if (ok)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1242 /* No printers, if just 1 byte is enough */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1243 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1244
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1245 if (GetLastError () != ERROR_INSUFFICIENT_BUFFER)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1246 signal_enum_printer_error ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1247
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 578
diff changeset
1248 data_buf = (BYTE *) alloca (bytes_needed);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1249 ok = EnumPrinters (enum_flags, NULL, enum_level, data_buf, bytes_needed,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1250 &bytes_needed, &num_printers);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1251 if (!ok)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1252 signal_enum_printer_error ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1253
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1254 if (num_printers == 0)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1255 /* Strange but... */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1256 return Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1257
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1258 GCPRO2 (result, def_printer);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1259
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1260 while (num_printers--)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1261 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1262 LPCTSTR printer_name;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1263 if (have_nt)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1264 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1265 PRINTER_INFO_4 *info = (PRINTER_INFO_4*) data_buf;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1266 printer_name = info->pPrinterName;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1267 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1268 else
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1269 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1270 PRINTER_INFO_5 *info = (PRINTER_INFO_5*) data_buf;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1271 printer_name = info->pPrinterName;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1272 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1273 data_buf += enum_entry_size;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1274
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1275 result = Fcons (build_ext_string (printer_name, Qmswindows_tstr),
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1276 result);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1277 }
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1278
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1279 def_printer = msprinter_default_printer ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1280 result = Fdelete (def_printer, result);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1281 result = Fcons (def_printer, result);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1282
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1283 RETURN_UNGCPRO (result);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1284 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1285
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1286
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1287 /************************************************************************/
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1288 /* initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1289 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1290
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1291 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1292 syms_of_device_mswindows (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1293 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1294 INIT_LRECORD_IMPLEMENTATION (devmode);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1295
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1296 DEFSUBR (Fmsprinter_get_settings);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1297 DEFSUBR (Fmsprinter_select_settings);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1298 DEFSUBR (Fmsprinter_apply_settings);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1299 DEFSUBR (Fmsprinter_settings_copy);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1300 DEFSUBR (Fmsprinter_settings_despecialize);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1301 DEFSUBR (Fmswindows_get_default_printer);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1302 DEFSUBR (Fmswindows_printer_list);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1303
510
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
1304 DEFKEYWORD (Q_allow_selection);
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
1305 DEFKEYWORD (Q_allow_pages);
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
1306 DEFKEYWORD (Q_selected_page_button);
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
1307 DEFSYMBOL (Qselected_page_button);
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
1308
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
1309 DEFSYMBOL (Qinit_pre_mswindows_win);
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 506
diff changeset
1310 DEFSYMBOL (Qinit_post_mswindows_win);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1312
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1313 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1314 console_type_create_device_mswindows (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1315 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1316 CONSOLE_HAS_METHOD (mswindows, init_device);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1317 CONSOLE_HAS_METHOD (mswindows, finish_init_device);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1318 CONSOLE_HAS_METHOD (mswindows, mark_device);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1319 CONSOLE_HAS_METHOD (mswindows, delete_device);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1320 CONSOLE_HAS_METHOD (mswindows, device_system_metrics);
545
9a775fb11bb7 [xemacs-hg @ 2001-05-18 04:39:39 by kkm]
kkm
parents: 510
diff changeset
1321 CONSOLE_IMPLEMENTATION_FLAGS (mswindows, XDEVIMPF_PIXEL_GEOMETRY);
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1322
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1323 CONSOLE_HAS_METHOD (msprinter, init_device);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1324 CONSOLE_HAS_METHOD (msprinter, mark_device);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1325 CONSOLE_HAS_METHOD (msprinter, delete_device);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1326 CONSOLE_HAS_METHOD (msprinter, device_system_metrics);
545
9a775fb11bb7 [xemacs-hg @ 2001-05-18 04:39:39 by kkm]
kkm
parents: 510
diff changeset
1327 CONSOLE_IMPLEMENTATION_FLAGS (msprinter, (XDEVIMPF_PIXEL_GEOMETRY
9a775fb11bb7 [xemacs-hg @ 2001-05-18 04:39:39 by kkm]
kkm
parents: 510
diff changeset
1328 | XDEVIMPF_IS_A_PRINTER
9a775fb11bb7 [xemacs-hg @ 2001-05-18 04:39:39 by kkm]
kkm
parents: 510
diff changeset
1329 | XDEVIMPF_NO_AUTO_REDISPLAY
9a775fb11bb7 [xemacs-hg @ 2001-05-18 04:39:39 by kkm]
kkm
parents: 510
diff changeset
1330 | XDEVIMPF_DONT_PREEMPT_REDISPLAY
9a775fb11bb7 [xemacs-hg @ 2001-05-18 04:39:39 by kkm]
kkm
parents: 510
diff changeset
1331 | XDEVIMPF_FRAMELESS_OK));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1332 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1333
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
1334
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1335 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1336 vars_of_device_mswindows (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1337 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1338 DEFVAR_LISP ("mswindows-downcase-file-names", &Vmswindows_downcase_file_names /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1339 Non-nil means convert all-upper case file names to lower case.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1340 This applies when performing completions and file name expansion.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1341 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1342 Vmswindows_downcase_file_names = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1343
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1344 DEFVAR_LISP ("mswindows-get-true-file-attributes", &Vmswindows_get_true_file_attributes /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1345 Non-nil means determine accurate link count in file-attributes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1346 This option slows down file-attributes noticeably, so is disabled by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1347 default. Note that it is only useful for files on NTFS volumes,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1348 where hard links are supported.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1349 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1350 Vmswindows_get_true_file_attributes = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1351 }