Mercurial > hg > xemacs-beta
annotate src/console-msw.c @ 5353:38e24b8be4ea
Improve the lexical scoping in #'block, #'return-from.
lisp/ChangeLog addition:
2011-02-07 Aidan Kehoe <kehoea@parhasard.net>
* bytecomp.el:
* bytecomp.el (byte-compile-initial-macro-environment):
Shadow `block', `return-from' here, we implement them differently
when byte-compiling.
* bytecomp.el (byte-compile-active-blocks): New.
* bytecomp.el (byte-compile-block-1): New.
* bytecomp.el (byte-compile-return-from-1): New.
* bytecomp.el (return-from-1): New.
* bytecomp.el (block-1): New.
These are two aliases that exist to have their own associated
byte-compile functions, which functions implement `block' and
`return-from'.
* cl-extra.el (cl-macroexpand-all):
Fix a bug here when macros in the environment have been compiled.
* cl-macs.el (block):
* cl-macs.el (return):
* cl-macs.el (return-from):
Be more careful about lexical scope in these macros.
* cl.el:
* cl.el ('cl-block-wrapper): Removed.
* cl.el ('cl-block-throw): Removed.
These aren't needed in code generated by this XEmacs. They
shouldn't be needed in code generated by XEmacs 21.4, but if it
turns out the packages do need them, we can put them back.
2011-01-30 Mike Sperber <mike@xemacs.org>
* font-lock.el (font-lock-fontify-pending-extents): Don't fail if
`font-lock-mode' is unset, which can happen in the middle of
`revert-buffer'.
2011-01-23 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (delete):
* cl-macs.el (delq):
* cl-macs.el (remove):
* cl-macs.el (remq):
Don't use the compiler macro if these functions were given the
wrong number of arguments, as happens in lisp-tests.el.
* cl-seq.el (remove, remq): Removed.
I added these to subr.el, and forgot to remove them from here.
2011-01-22 Aidan Kehoe <kehoea@parhasard.net>
* bytecomp.el (byte-compile-setq, byte-compile-set):
Remove kludge allowing keywords' values to be set, all the code
that does that is gone.
* cl-compat.el (elt-satisfies-test-p):
* faces.el (set-face-parent):
* faces.el (face-doc-string):
* gtk-font-menu.el:
* gtk-font-menu.el (gtk-reset-device-font-menus):
* msw-font-menu.el:
* msw-font-menu.el (mswindows-reset-device-font-menus):
* package-get.el (package-get-installedp):
* select.el (select-convert-from-image-data):
* sound.el:
* sound.el (load-sound-file):
* x-font-menu.el (x-reset-device-font-menus-core):
Don't quote keywords, they're self-quoting, and the
win from backward-compatibility is sufficiently small now that the
style problem overrides it.
2011-01-22 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (block, return-from): Require that NAME be a symbol
in these macros, as always documented in the #'block docstring and
as required by Common Lisp.
* descr-text.el (unidata-initialize-unihan-database):
Correct the use of non-symbols in #'block and #'return-from in
this function.
2011-01-15 Aidan Kehoe <kehoea@parhasard.net>
* cl-extra.el (concatenate): Accept more complicated TYPEs in this
function, handing the sequences over to #'coerce if we don't
understand them here.
* cl-macs.el (inline): Don't proclaim #'concatenate as inline, its
compiler macro is more useful than doing that.
2011-01-11 Aidan Kehoe <kehoea@parhasard.net>
* subr.el (delete, delq, remove, remq): Move #'remove, #'remq
here, they don't belong in cl-seq.el; move #'delete, #'delq here
from fns.c, implement them in terms of #'delete*, allowing support
for sequences generally.
* update-elc.el (do-autoload-commands): Use #'delete*, not #'delq
here, now the latter's no longer dumped.
* cl-macs.el (delete, delq): Add compiler macros transforming
#'delete and #'delq to #'delete* calls.
2011-01-10 Aidan Kehoe <kehoea@parhasard.net>
* dialog.el (make-dialog-box): Correct a misplaced parenthesis
here, thank you Mats Lidell in 87zkr9gqrh.fsf@mail.contactor.se !
2011-01-02 Aidan Kehoe <kehoea@parhasard.net>
* dialog.el (make-dialog-box):
* list-mode.el (display-completion-list):
These functions used to use cl-parsing-keywords; change them to
use defun* instead, fixing the build. (Not sure what led to me
not including this change in d1b17a33450b!)
2011-01-02 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (define-star-compiler-macros):
Make sure the form has ITEM and LIST specified before attempting
to change to calls with explicit tests; necessary for some tests
in lisp-tests.el to compile correctly.
(stable-union, stable-intersection): Add compiler macros for these
functions, in the same way we do for most of the other functions
in cl-seq.el.
2011-01-01 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (dolist, dotimes, do-symbols, macrolet)
(symbol-macrolet):
Define these macros with defmacro* instead of parsing the argument
list by hand, for the sake of style and readability; use backquote
where appropriate, instead of calling #'list and and friends, for
the same reason.
2010-12-30 Aidan Kehoe <kehoea@parhasard.net>
* x-misc.el (device-x-display):
Provide this function, documented in the Lispref for years, but
not existing previously. Thank you Julian Bradfield, thank you
Jeff Mincy.
2010-12-30 Aidan Kehoe <kehoea@parhasard.net>
* cl-seq.el:
Move the heavy lifting from this file to C. Dump the
cl-parsing-keywords macro, but don't use defun* for the functions
we define that do take keywords, dynamic scope lossage makes that
not practical.
* subr.el (sort, fillarray): Move these aliases here.
(map-plist): #'nsublis is now built-in, but at this point #'eql
isn't necessarily available as a test; use #'eq.
* obsolete.el (cl-delete-duplicates): Make this available for old
compiler macros and old code.
(memql): Document that this is equivalent to #'member*, and worse.
* cl.el (adjoin, subst): Removed. These are in C.
2010-12-30 Aidan Kehoe <kehoea@parhasard.net>
* simple.el (assoc-ignore-case): Remove a duplicate definition of
this function (it's already in subr.el).
* iso8859-1.el (char-width):
On non-Mule, make this function equivalent to that produced by
(constantly 1), but preserve its docstring.
* subr.el (subst-char-in-string): Define this in terms of
#'substitute, #'nsubstitute.
(string-width): Define this using #'reduce and #'char-width.
(char-width): Give this a simpler definition, it makes far more
sense to check for mule at load time and redefine, as we do in
iso8859-1.el.
(store-substring): Implement this in terms of #'replace, now
#'replace is cheap.
2010-12-30 Aidan Kehoe <kehoea@parhasard.net>
* update-elc.el (lisp-files-needed-for-byte-compilation)
(lisp-files-needing-early-byte-compilation):
cl-macs belongs in the former, not the latter, it is as
fundamental as bytecomp.el.
2010-12-30 Aidan Kehoe <kehoea@parhasard.net>
* cl.el:
Provde the Common Lisp program-error, type-error as error
symbols. This doesn't nearly go far enough for anyone using the
Common Lisp errors.
2010-12-29 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (delete-duplicates):
If the form has an incorrect number of arguments, don't attempt a
compiler macroexpansion.
2010-12-29 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (cl-safe-expr-p):
Forms that start with the symbol lambda are also safe.
2010-12-29 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (= < > <= >=):
For these functions' compiler macros, the optimisation is safe
even if the first and the last arguments have side effects, since
they're only used the once.
2010-12-29 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (inline-side-effect-free-compiler-macros):
Unroll a loop here at macro-expansion time, so these compiler
macros are compiled. Use #'eql instead of #'eq in a couple of
places for better style.
2010-12-29 Aidan Kehoe <kehoea@parhasard.net>
* cl-extra.el (notany, notevery): Avoid some dynamic scope
stupidity with local variable names in these functions, when they
weren't prefixed with cl-; go into some more detail in the doc
strings.
2010-12-29 Aidan Kehoe <kehoea@parhasard.net>
* byte-optimize.el (side-effect-free-fns): #'remove, #'remq are
free of side-effects.
(side-effect-and-error-free-fns):
Drop dot, dot-marker from the list.
2010-11-17 Aidan Kehoe <kehoea@parhasard.net>
* cl-extra.el (coerce):
In the argument list, name the first argument OBJECT, not X; the
former name was always used in the doc string and is clearer.
Handle vector type specifications which include the length of the
target sequence, error if there's a mismatch.
* cl-macs.el (cl-make-type-test): Handle type specifications
starting with the symbol 'eql.
2010-11-14 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (eql): Don't remove the byte-compile property of this
symbol. That was necessary to override a bug in bytecomp.el where
#'eql was confused with #'eq, which bug we no longer have.
If neither expression is constant, don't attempt to handle the
expression in this compiler macro, leave it to byte-compile-eql,
which produces better code anyway.
* bytecomp.el (eq): #'eql is not the function associated with the
byte-eq byte code.
(byte-compile-eql): Add an explicit compile method for this
function, for cases where the cl-macs compiler macro hasn't
reduced it to #'eq or #'equal.
2010-10-25 Aidan Kehoe <kehoea@parhasard.net>
Add compiler macros and compilation sanity-checking for various
functions that take keywords.
* byte-optimize.el (side-effect-free-fns): #'symbol-value is
side-effect free and not error free.
* bytecomp.el (byte-compile-normal-call): Check keyword argument
lists for sanity; store information about the positions where
keyword arguments start using the new byte-compile-keyword-start
property.
* cl-macs.el (cl-const-expr-val): Take a new optional argument,
cl-not-constant, defaulting to nil, in this function; return it if
the expression is not constant.
(cl-non-fixnum-number-p): Make this into a separate function, we
want to pass it to #'every.
(eql): Use it.
(define-star-compiler-macros): Use the same code to generate the
member*, assoc* and rassoc* compiler macros; special-case some
code in #'add-to-list in subr.el.
(remove, remq): Add compiler macros for these two functions, in
preparation for #'remove being in C.
(define-foo-if-compiler-macros): Transform (remove-if-not ...) calls to
(remove ... :if-not) at compile time, which will be a real win
once the latter is in C.
(define-substitute-if-compiler-macros)
(define-subst-if-compiler-macros): Similarly for these functions.
(delete-duplicates): Change this compiler macro to use
#'plists-equal; if we don't have information about the type of
SEQUENCE at compile time, don't bother attempting to inline the
call, the function will be in C soon enough.
(equalp): Remove an old commented-out compiler macro for this, if
we want to see it it's in version control.
(subst-char-in-string): Transform this to a call to nsubstitute or
nsubstitute, if that is appropriate.
* cl.el (ldiff): Don't call setf here, this makes for a load-time
dependency problem in cl-macs.el
2010-06-14 Stephen J. Turnbull <stephen@xemacs.org>
* term/vt100.el:
Refer to XEmacs, not GNU Emacs, in permissions.
* term/bg-mouse.el:
* term/sup-mouse.el:
Put copyright notice in canonical "Copyright DATE AUTHOR" form.
Refer to XEmacs, not GNU Emacs, in permissions.
* site-load.el:
Add permission boilerplate.
* mule/canna-leim.el:
* alist.el:
Refer to XEmacs, not APEL/this program, in permissions.
* mule/canna-leim.el:
Remove my copyright, I've assigned it to the FSF.
2010-06-14 Stephen J. Turnbull <stephen@xemacs.org>
* gtk.el:
* gtk-widget-accessors.el:
* gtk-package.el:
* gtk-marshal.el:
* gtk-compose.el:
* gnome.el:
Add copyright notice based on internal evidence.
2010-06-14 Stephen J. Turnbull <stephen@xemacs.org>
* easymenu.el: Add reference to COPYING to permission notice.
* gutter.el:
* gutter-items.el:
* menubar-items.el:
Fix typo "Xmacs" in permissions notice.
2010-06-14 Stephen J. Turnbull <stephen@xemacs.org>
* auto-save.el:
* font.el:
* fontconfig.el:
* mule/kinsoku.el:
Add "part of XEmacs" text to permission notice.
2010-10-14 Aidan Kehoe <kehoea@parhasard.net>
* byte-optimize.el (side-effect-free-fns):
* cl-macs.el (remf, getf):
* cl-extra.el (tailp, cl-set-getf, cl-do-remf):
* cl.el (ldiff, endp):
Tighten up Common Lisp compatibility for #'ldiff, #'endp, #'tailp;
add circularity checking for the first two.
#'cl-set-getf and #'cl-do-remf were Lisp implementations of
#'plist-put and #'plist-remprop; change the names to aliases,
changes the macros that use them to using #'plist-put and
#'plist-remprop directly.
2010-10-12 Aidan Kehoe <kehoea@parhasard.net>
* abbrev.el (fundamental-mode-abbrev-table, global-abbrev-table):
Create both these abbrev tables using the usual
#'define-abbrev-table calls, rather than attempting to
special-case them.
* cl-extra.el: Force cl-macs to be loaded here, if cl-extra.el is
being loaded interpreted. Previously other, later files would
redundantly call (load "cl-macs") when interpreted, it's more
reasonable to do it here, once.
* cmdloop.el (read-quoted-char-radix): Use defcustom here, we
don't have any dump-order dependencies that would prevent that.
* custom.el (eval-when-compile): Don't load cl-macs when
interpreted or when byte-compiling, rely on cl-extra.el in the
former case and the appropriate entry in bytecomp-load-hook in the
latter. Get rid of custom-declare-variable-list, we have no
dump-time dependencies that would require it.
* faces.el (eval-when-compile): Don't load cl-macs when
interpreted or when byte-compiling.
* packages.el: Remove some inaccurate comments.
* post-gc.el (cleanup-simple-finalizers): Use #'delete-if-not
here, now the order of preloaded-file-list has been changed to
make it available.
* subr.el (custom-declare-variable-list): Remove. No need for it.
Also remove a stub define-abbrev-table from this file, given the
current order of preloaded-file-list there's no need for it.
2010-10-10 Aidan Kehoe <kehoea@parhasard.net>
* bytecomp.el (byte-compile-constp) Forms quoted with FUNCTION are
also constant.
(byte-compile-initial-macro-environment): In #'the, if FORM is
constant and does not match TYPE, warn at byte-compile time.
2010-10-10 Aidan Kehoe <kehoea@parhasard.net>
* backquote.el (bq-vector-contents, bq-list*): Remove; the former
is equivalent to (append VECTOR nil), the latter to (list* ...).
(bq-process-2): Use (append VECTOR nil) instead of using
#'bq-vector-contents to convert to a list.
(bq-process-1): Now we use list* instead of bq-list
* subr.el (list*): Moved from cl.el, since it is now required to
be available the first time a backquoted form is encountered.
* cl.el (list*): Move to subr.el.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* test-harness.el (Check-Message):
Add an omitted comma here, thank you the buildbot.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* hash-table.el (hash-table-key-list, hash-table-value-list)
(hash-table-key-value-alist, hash-table-key-value-plist):
Remove some useless #'nreverse calls in these files; our hash
tables have no order, it's not helpful to pretend they do.
* behavior.el (read-behavior):
Do the same in this file, in some code evidently copied from
hash-table.el.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* info.el (Info-insert-dir):
* format.el (format-deannotate-region):
* files.el (cd, save-buffers-kill-emacs):
Use #'some, #'every and related functions for applying boolean
operations to lists, instead of rolling our own ones that cons and
don't short-circuit.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* bytecomp.el (byte-compile-initial-macro-environment):
* cl-macs.el (the):
Rephrase the docstring, make its implementation when compiling
files a little nicer.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* descr-text.el (unidata-initialize-unicodedata-database)
(unidata-initialize-unihan-database, describe-char-unicode-data)
(describe-char-unicode-data):
Wrap calls to the database functions with (with-fboundp ...),
avoiding byte compile warnings on builds without support for the
database functions.
(describe-char): (reduce #'max ...), not (apply #'max ...), no
need to cons needlessly.
(describe-char): Remove a redundant lambda wrapping
#'extent-properties.
(describe-char-unicode-data): Call #'nsubst when replacing "" with
nil in the result of #'split-string, instead of consing inside
mapcar.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* x-faces.el (x-available-font-sizes):
* specifier.el (let-specifier):
* package-ui.el (pui-add-required-packages):
* msw-faces.el (mswindows-available-font-sizes):
* modeline.el (modeline-minor-mode-menu):
* minibuf.el (minibuf-directory-files):
Replace the O2N (delq nil (mapcar (lambda (W) (and X Y)) Z)) with
the ON (mapcan (lambda (W) (and X (list Y))) Z) in these files.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (= < > <= >=):
When these functions are handed more than two arguments, and those
arguments have no side effects, transform to a series of two
argument calls, avoiding funcall in the byte-compiled code.
* mule/mule-cmds.el (finish-set-language-environment):
Take advantage of this change in a function called 256 times at
startup.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* bytecomp.el (byte-compile-function-form, byte-compile-quote)
(byte-compile-quote-form):
Warn at compile time, and error at runtime, if a (quote ...) or a
(function ...) form attempts to quote more than one object.
2010-09-16 Aidan Kehoe <kehoea@parhasard.net>
* byte-optimize.el (byte-optimize-apply): Transform (apply 'nconc
(mapcar ...)) to (mapcan ...); warn about use of the first idiom.
* update-elc.el (do-autoload-commands):
* packages.el (packages-find-package-library-path):
* frame.el (frame-list):
* extents.el (extent-descendants):
* etags.el (buffer-tag-table-files):
* dumped-lisp.el (preloaded-file-list):
* device.el (device-list):
* bytecomp-runtime.el (proclaim-inline, proclaim-notinline)
Use #'mapcan, not (apply #'nconc (mapcar ...) in all these files.
* bytecomp-runtime.el (eval-when-compile, eval-and-compile):
In passing, mention that these macros also evaluate the body when
interpreted.
tests/ChangeLog addition:
2011-02-07 Aidan Kehoe <kehoea@parhasard.net>
* automated/lisp-tests.el:
Test lexical scope for `block', `return-from'; add a
Known-Bug-Expect-Failure for a contorted example that fails when
byte-compiled.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Mon, 07 Feb 2011 12:01:24 +0000 |
parents | 71ee43b8a74d |
children | 308d34e9f07d |
rev | line source |
---|---|
428 | 1 /* Console functions for mswindows. |
793 | 2 Copyright (C) 1996, 2000, 2001, 2002 Ben Wing. |
428 | 3 |
4 This file is part of XEmacs. | |
5 | |
6 XEmacs is free software; you can redistribute it and/or modify it | |
7 under the terms of the GNU General Public License as published by the | |
8 Free Software Foundation; either version 2, or (at your option) any | |
9 later version. | |
10 | |
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with XEmacs; see the file COPYING. If not, write to | |
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
19 Boston, MA 02111-1307, USA. */ | |
20 | |
21 /* Synched up with: Not in FSF. */ | |
22 | |
771 | 23 /* This file essentially Mule-ized (except perhaps some Unicode splitting). |
24 5-2000. */ | |
25 | |
428 | 26 /* Authorship: |
27 | |
28 Ben Wing: January 1996, for 19.14. | |
29 Rewritten for mswindows by Jonathan Harris, November 1997 for 21.0 | |
30 */ | |
31 | |
2367 | 32 /* See win32.c for info about the different Windows files in XEmacs. */ |
33 | |
428 | 34 #include <config.h> |
35 #include "lisp.h" | |
36 | |
872 | 37 #include "console-msw-impl.h" |
442 | 38 #include "events.h" |
39 #include "opaque.h" | |
2828 | 40 #include "elhash.h" |
428 | 41 |
440 | 42 DEFINE_CONSOLE_TYPE (mswindows); |
43 DEFINE_CONSOLE_TYPE (msprinter); | |
428 | 44 |
442 | 45 Lisp_Object Qabortretryignore; |
46 Lisp_Object Qapplmodal; | |
47 Lisp_Object Qdefault_desktop_only; | |
48 Lisp_Object Qdefbutton1; | |
49 Lisp_Object Qdefbutton2; | |
50 Lisp_Object Qdefbutton3; | |
51 Lisp_Object Qdefbutton4; | |
52 /* Lisp_Object Qhelp; */ | |
53 Lisp_Object Qiconasterisk; | |
54 Lisp_Object Qiconexclamation; | |
55 Lisp_Object Qiconhand; | |
56 Lisp_Object Qiconinformation; | |
57 Lisp_Object Qiconquestion; | |
58 Lisp_Object Qiconstop; | |
59 /* Lisp_Object Qok; */ | |
60 Lisp_Object Qokcancel; | |
61 Lisp_Object Qretrycancel; | |
62 /* Lisp_Object Qright; */ | |
63 Lisp_Object Qrtlreading; | |
64 Lisp_Object Qservice_notification; | |
65 Lisp_Object Qsetforeground; | |
66 Lisp_Object Qsystemmodal; | |
67 Lisp_Object Qtaskmodal; | |
68 Lisp_Object Qtopmost; | |
69 Lisp_Object Qyesno; | |
70 Lisp_Object Qyesnocancel; | |
2850 | 71 Lisp_Object Vmswindows_seen_characters; |
442 | 72 |
73 /* Lisp_Object Qabort; */ | |
74 /* Lisp_Object Qcancel; */ | |
75 /* Lisp_Object Qignore; */ | |
76 /* Lisp_Object Qno; */ | |
77 /* Lisp_Object Qok; */ | |
78 /* Lisp_Object Qretry; */ | |
79 /* Lisp_Object Qyes; */ | |
80 | |
81 | |
440 | 82 /************************************************************************/ |
83 /* mswindows console methods */ | |
84 /************************************************************************/ | |
428 | 85 |
86 static int | |
2286 | 87 mswindows_initially_selected_for_input (struct console *UNUSED (con)) |
428 | 88 { |
89 return 1; | |
90 } | |
91 | |
442 | 92 static HWND mswindows_console_hwnd = 0; |
93 | |
800 | 94 /* Based on Microsoft KB article Q124103 */ |
442 | 95 static HWND |
96 GetConsoleHwnd (void) | |
97 { | |
800 | 98 HWND hwndFound; |
2367 | 99 Ascbyte newtitle[100]; |
800 | 100 Extbyte *oldtitle; |
101 int numchars; | |
442 | 102 |
103 /* fetch current window title */ | |
104 | |
800 | 105 { |
106 int size = 64; | |
107 do | |
108 { | |
109 size *= 2; | |
110 oldtitle = alloca_extbytes (size * XETCHAR_SIZE); | |
111 numchars = qxeGetConsoleTitle (oldtitle, size); | |
112 } | |
113 while (numchars >= size - 1); | |
114 } | |
442 | 115 |
800 | 116 /* format a "unique" new title */ |
117 | |
2367 | 118 sprintf (newtitle, "%ld/%ld", GetTickCount (), GetCurrentProcessId ()); |
800 | 119 |
2367 | 120 /* change current window title; we may be called during armageddon |
121 so don't do any conversion */ | |
442 | 122 |
2367 | 123 SetConsoleTitleA (newtitle); |
442 | 124 |
125 /* ensure window title has been updated */ | |
126 | |
771 | 127 Sleep (40); |
442 | 128 |
129 /* look for NewWindowTitle */ | |
130 | |
2367 | 131 hwndFound = FindWindowA (NULL, newtitle); |
442 | 132 |
133 /* restore original window title */ | |
134 | |
800 | 135 qxeSetConsoleTitle (oldtitle); |
442 | 136 |
800 | 137 return hwndFound; |
442 | 138 } |
139 | |
771 | 140 static HWND |
442 | 141 mswindows_get_console_hwnd (void) |
142 { | |
143 if (!mswindows_console_hwnd) | |
144 mswindows_console_hwnd = GetConsoleHwnd (); | |
145 return mswindows_console_hwnd; | |
146 } | |
147 | |
148 static int | |
149 mswindows_ensure_console_allocated (void) | |
150 { | |
151 HWND fgwin = GetForegroundWindow (); | |
152 /* stupid mswin api won't let you create the console window | |
153 hidden! creating it changes the focus! fuck me! */ | |
154 if (AllocConsole ()) | |
155 { | |
156 SetForegroundWindow (fgwin); | |
157 return 1; | |
158 } | |
159 return 0; | |
160 } | |
161 | |
440 | 162 static Lisp_Object |
163 mswindows_canonicalize_console_connection (Lisp_Object connection, | |
578 | 164 Error_Behavior errb) |
440 | 165 { |
166 /* Do not allow more than one mswindows device, by explicitly | |
167 requiring that CONNECTION is nil, the only allowed connection in | |
168 Windows. */ | |
169 if (!NILP (connection)) | |
170 { | |
171 if (ERRB_EQ (errb, ERROR_ME)) | |
563 | 172 invalid_argument |
440 | 173 ("Invalid (non-nil) connection for mswindows device/console", |
174 connection); | |
175 else | |
176 return Qunbound; | |
177 } | |
428 | 178 |
440 | 179 return Qnil; |
180 } | |
181 | |
182 static Lisp_Object | |
183 mswindows_canonicalize_device_connection (Lisp_Object connection, | |
578 | 184 Error_Behavior errb) |
440 | 185 { |
186 return mswindows_canonicalize_console_connection (connection, errb); | |
187 } | |
428 | 188 |
2828 | 189 /* The actual console doesn't matter, because the global map is global. See |
190 console-x.c for a corner case, though. */ | |
191 | |
192 static Lisp_Object | |
193 mswindows_perhaps_init_unseen_key_defaults (struct console *UNUSED(con), | |
194 Lisp_Object key) | |
195 { | |
196 Ichar val; | |
197 extern Lisp_Object Vcurrent_global_map; | |
198 | |
199 if (SYMBOLP(key)) | |
200 { | |
201 /* We've no idea what to default a symbol to on MS Windows, and most | |
202 of the keys I'm aware of that have | |
203 symbols--cf. event-msw.c--_shouldn't_ have associated chars. */ | |
204 return Qnil; | |
205 } | |
206 | |
207 CHECK_CHAR(key); | |
208 | |
2850 | 209 if (!(HASH_TABLEP(Vmswindows_seen_characters))) |
2828 | 210 { |
211 /* All the keysym we deal with are character objects; therefore, we | |
212 can use eq as the test without worrying. */ | |
2850 | 213 Vmswindows_seen_characters = make_lisp_hash_table (128, |
214 HASH_TABLE_NON_WEAK, | |
5191
71ee43b8a74d
Add #'equalp as a hash test by default; add #'define-hash-table-test, GNU API
Aidan Kehoe <kehoea@parhasard.net>
parents:
4981
diff
changeset
|
215 Qeq); |
2828 | 216 } |
217 /* Might give the user an opaque error if make_lisp_hash_table fails, | |
218 but it shouldn't crash. */ | |
2850 | 219 CHECK_HASH_TABLE(Vmswindows_seen_characters); |
2828 | 220 |
221 val = XCHAR(key); | |
222 | |
223 /* Same logic as in x_has_keysym; I'm not convinced it's sane. */ | |
224 if (val < 0x80) | |
225 { | |
226 return Qnil; | |
227 } | |
228 | |
2850 | 229 if (!NILP(Fgethash(key, Vmswindows_seen_characters, Qnil))) |
2828 | 230 { |
231 return Qnil; | |
232 } | |
233 | |
234 if (NILP (Flookup_key (Vcurrent_global_map, key, Qnil))) | |
235 { | |
2850 | 236 Fputhash(key, Qt, Vmswindows_seen_characters); |
2828 | 237 Fdefine_key (Vcurrent_global_map, key, Qself_insert_command); |
238 return Qt; | |
239 } | |
240 | |
241 return Qnil; | |
242 } | |
243 | |
442 | 244 void |
245 mswindows_hide_console (void) | |
246 { | |
247 ShowWindow (mswindows_get_console_hwnd (), SW_HIDE); | |
248 } | |
249 | |
771 | 250 static void |
442 | 251 mswindows_show_console (void) |
252 { | |
253 /* What I really want is for the console window to appear on top of other | |
254 windows, but NOT get the focus. This seems hard-to-impossible under | |
255 Windows. The following sequence seems to do the best possible, along | |
256 with keeping the console window on top when xemacs --help is used. */ | |
257 HWND hwnd = mswindows_get_console_hwnd (); | |
258 HWND hwndf = GetFocus (); | |
771 | 259 if (!IsWindowVisible (hwnd)) |
260 ShowWindow (hwnd, SW_SHOWNA); | |
261 if (noninteractive) | |
262 BringWindowToTop (hwnd); | |
263 else | |
264 SetWindowPos (hwnd, hwndf, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | |
265 | SWP_NOACTIVATE); | |
442 | 266 } |
267 | |
268 static int mswindows_console_buffered = 0; | |
269 HANDLE mswindows_console_buffer; | |
270 | |
271 static void | |
272 mswindows_ensure_console_buffered (void) | |
273 { | |
274 if (!mswindows_console_buffered) | |
275 { | |
276 COORD new_size; | |
277 | |
278 new_size.X = 80; | |
279 new_size.Y = 1000; | |
280 mswindows_ensure_console_allocated (); | |
281 mswindows_console_buffer = | |
282 CreateConsoleScreenBuffer (GENERIC_WRITE, 0, NULL, | |
283 CONSOLE_TEXTMODE_BUFFER, NULL); | |
284 SetConsoleScreenBufferSize (mswindows_console_buffer, new_size); | |
285 SetConsoleActiveScreenBuffer (mswindows_console_buffer); | |
286 mswindows_console_buffered = 1; | |
287 } | |
288 } | |
289 | |
290 int mswindows_message_outputted; | |
291 | |
292 int | |
867 | 293 mswindows_output_console_string (const Ibyte *ptr, Bytecount len) |
442 | 294 { |
295 DWORD num_written; | |
296 | |
297 mswindows_message_outputted = 1; | |
298 mswindows_ensure_console_buffered (); | |
299 mswindows_show_console (); | |
300 | |
2367 | 301 if (initialized && !inhibit_non_essential_conversion_operations) |
771 | 302 { |
303 const Extbyte *extptr; | |
304 Bytecount extlen; | |
305 TO_EXTERNAL_FORMAT (DATA, (ptr, len), | |
306 ALLOCA, (extptr, extlen), | |
307 Qmswindows_tstr); | |
308 return qxeWriteConsole (mswindows_console_buffer, extptr, | |
309 extlen / XETCHAR_SIZE, &num_written, NULL); | |
310 } | |
311 else | |
2367 | 312 #ifdef NON_ASCII_INTERNAL_FORMAT |
313 #error Do something here | |
314 #endif | |
315 return WriteConsoleA (mswindows_console_buffer, (Chbyte *) ptr, len, | |
771 | 316 &num_written, NULL); |
442 | 317 } |
318 | |
319 DEFUN ("mswindows-debugging-output", Fmswindows_debugging_output, 1, 1, 0, /* | |
320 Write CHAR-OR-STRING to the Windows debugger, using OutputDebugString(). | |
321 This function can be used as the STREAM argument of Fprint() or the like. | |
322 */ | |
323 (char_or_string)) | |
324 { | |
325 if (STRINGP (char_or_string)) | |
771 | 326 /* It's safe to pass in string data because TO_EXTERNAL_FORMAT |
327 inhibits GC. */ | |
328 write_string_to_mswindows_debugging_output | |
329 (XSTRING_DATA (char_or_string), XSTRING_LENGTH (char_or_string)); | |
442 | 330 else |
331 { | |
867 | 332 Ibyte str[MAX_ICHAR_LEN]; |
442 | 333 Bytecount len; |
334 | |
335 CHECK_CHAR_COERCE_INT (char_or_string); | |
867 | 336 len = set_itext_ichar (str, XCHAR (char_or_string)); |
771 | 337 write_string_to_mswindows_debugging_output (str, len); |
442 | 338 } |
339 | |
340 return char_or_string; | |
341 } | |
342 | |
771 | 343 void |
1346 | 344 write_string_to_mswindows_debugging_output (const Ibyte *str, Bytecount len) |
771 | 345 { |
346 const Extbyte *extptr; | |
2367 | 347 if (initialized && !inhibit_non_essential_conversion_operations) |
771 | 348 { |
349 TO_EXTERNAL_FORMAT (DATA, (str, len), | |
4981
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
2850
diff
changeset
|
350 C_STRING_ALLOCA, extptr, Qmswindows_tstr); |
771 | 351 qxeOutputDebugString (extptr); |
352 } | |
353 else | |
1204 | 354 { |
2367 | 355 #ifdef NON_ASCII_INTERNAL_FORMAT |
356 #error Do something here | |
357 #endif | |
1204 | 358 /* STR may not be null-terminated so make it that way. */ |
359 Extbyte *ext = alloca_extbytes (len + 1); | |
360 memcpy (ext, str, len); | |
361 ext[len] = '\0'; | |
362 OutputDebugStringA (ext); | |
363 } | |
771 | 364 } |
365 | |
442 | 366 #ifdef DEBUG_XEMACS |
367 | |
368 /* | |
369 * Random helper functions for debugging. | |
370 * Intended for use in the MSVC "Watch" window which doesn't like | |
371 * the aborts that the error_check_foo() functions can make. | |
372 */ | |
373 struct lrecord_header *DHEADER (Lisp_Object obj); | |
374 struct lrecord_header * | |
375 DHEADER (Lisp_Object obj) | |
376 { | |
377 return LRECORDP (obj) ? XRECORD_LHEADER (obj) : NULL; | |
378 } | |
379 | |
380 void *DOPAQUE_DATA (Lisp_Object obj); | |
381 void * | |
382 DOPAQUE_DATA (Lisp_Object obj) | |
383 { | |
384 return OPAQUEP (obj) ? OPAQUE_DATA (XOPAQUE (obj)) : NULL; | |
385 } | |
386 | |
387 Lisp_Event *DEVENT (Lisp_Object obj); | |
388 Lisp_Event * | |
389 DEVENT (Lisp_Object obj) | |
390 { | |
391 return EVENTP (obj) ? XEVENT (obj) : NULL; | |
392 } | |
393 | |
394 Lisp_Cons *DCONS (Lisp_Object obj); | |
395 Lisp_Cons * | |
396 DCONS (Lisp_Object obj) | |
397 { | |
398 return CONSP (obj) ? XCONS (obj) : NULL; | |
399 } | |
400 | |
401 Lisp_Cons *DCONSCDR (Lisp_Object obj); | |
402 Lisp_Cons * | |
403 DCONSCDR (Lisp_Object obj) | |
404 { | |
405 return (CONSP (obj) && CONSP (XCDR (obj))) ? XCONS (XCDR (obj)) : 0; | |
406 } | |
407 | |
867 | 408 Ibyte *DSTRING (Lisp_Object obj); |
409 Ibyte * | |
442 | 410 DSTRING (Lisp_Object obj) |
411 { | |
412 return STRINGP (obj) ? XSTRING_DATA (obj) : NULL; | |
413 } | |
414 | |
415 Lisp_Vector *DVECTOR (Lisp_Object obj); | |
416 Lisp_Vector * | |
417 DVECTOR (Lisp_Object obj) | |
418 { | |
419 return VECTORP (obj) ? XVECTOR (obj) : NULL; | |
420 } | |
421 | |
422 Lisp_Symbol *DSYMBOL (Lisp_Object obj); | |
423 Lisp_Symbol * | |
424 DSYMBOL (Lisp_Object obj) | |
425 { | |
426 return SYMBOLP (obj) ? XSYMBOL (obj) : NULL; | |
427 } | |
428 | |
867 | 429 Ibyte *DSYMNAME (Lisp_Object obj); |
430 Ibyte * | |
442 | 431 DSYMNAME (Lisp_Object obj) |
432 { | |
793 | 433 return SYMBOLP (obj) ? XSTRING_DATA (XSYMBOL (obj)->name) : NULL; |
442 | 434 } |
435 | |
436 #endif /* DEBUG_XEMACS */ | |
437 | |
438 DEFUN ("mswindows-message-box", Fmswindows_message_box, 1, 3, 0, /* | |
439 Pop up an MS Windows message box. | |
440 MESSAGE is the string to display. Optional argument FLAG controls | |
441 what appears in the box and how it behaves; it is a symbol or list of | |
442 symbols, described below. Second optional argument TITLE controls the | |
443 title bar; if omitted, a standard title bar will be used, probably | |
444 displaying "XEmacs". | |
445 | |
446 Possible flags are | |
447 | |
448 | |
449 -- To specify the buttons in the message box: | |
450 | |
451 abortretryignore | |
452 The message box contains three push buttons: Abort, Retry, and Ignore. | |
453 ok | |
454 The message box contains one push button: OK. This is the default. | |
455 okcancel | |
456 The message box contains two push buttons: OK and Cancel. | |
457 retrycancel | |
458 The message box contains two push buttons: Retry and Cancel. | |
459 yesno | |
460 The message box contains two push buttons: Yes and No. | |
461 yesnocancel | |
462 The message box contains three push buttons: Yes, No, and Cancel. | |
463 | |
464 | |
465 -- To display an icon in the message box: | |
466 | |
467 iconexclamation, iconwarning | |
468 An exclamation-point icon appears in the message box. | |
469 iconinformation, iconasterisk | |
470 An icon consisting of a lowercase letter i in a circle appears in | |
471 the message box. | |
472 iconquestion | |
473 A question-mark icon appears in the message box. | |
474 iconstop, iconerror, iconhand | |
475 A stop-sign icon appears in the message box. | |
476 | |
477 | |
478 -- To indicate the default button: | |
479 | |
480 defbutton1 | |
481 The first button is the default button. This is the default. | |
482 defbutton2 | |
483 The second button is the default button. | |
484 defbutton3 | |
485 The third button is the default button. | |
486 defbutton4 | |
487 The fourth button is the default button. | |
488 | |
489 | |
490 -- To indicate the modality of the dialog box: | |
491 | |
492 applmodal | |
493 The user must respond to the message box before continuing work in | |
494 the window identified by the hWnd parameter. However, the user can | |
495 move to the windows of other applications and work in those windows. | |
496 Depending on the hierarchy of windows in the application, the user | |
497 may be able to move to other windows within the application. All | |
498 child windows of the parent of the message box are automatically | |
499 disabled, but popup windows are not. This is the default. | |
500 systemmodal | |
501 Same as applmodal except that the message box has the WS_EX_TOPMOST | |
502 style. Use system-modal message boxes to notify the user of serious, | |
503 potentially damaging errors that require immediate attention (for | |
504 example, running out of memory). This flag has no effect on the | |
505 user's ability to interact with windows other than those associated | |
506 with hWnd. | |
507 taskmodal | |
508 Same as applmodal except that all the top-level windows belonging to | |
509 the current task are disabled if the hWnd parameter is NULL. Use | |
510 this flag when the calling application or library does not have a | |
511 window handle available but still needs to prevent input to other | |
512 windows in the current application without suspending other | |
513 applications. | |
514 | |
515 | |
516 In addition, you can specify the following flags: | |
517 | |
518 default-desktop-only | |
519 The desktop currently receiving input must be a default desktop; | |
520 otherwise, the function fails. A default desktop is one an | |
521 application runs on after the user has logged on. | |
522 help | |
523 Adds a Help button to the message box. Choosing the Help button or | |
524 pressing F1 generates a Help event. | |
525 right | |
526 The text is right-justified. | |
527 rtlreading | |
528 Displays message and caption text using right-to-left reading order | |
529 on Hebrew and Arabic systems. | |
530 setforeground | |
531 The message box becomes the foreground window. Internally, Windows | |
532 calls the SetForegroundWindow function for the message box. | |
533 topmost | |
534 The message box is created with the WS_EX_TOPMOST window style. | |
535 service-notification | |
536 Windows NT only: The caller is a service notifying the user of an | |
537 event. The function displays a message box on the current active | |
538 desktop, even if there is no user logged on to the computer. If | |
539 this flag is set, the hWnd parameter must be NULL. This is so the | |
540 message box can appear on a desktop other than the desktop | |
541 corresponding to the hWnd. | |
542 | |
543 | |
544 | |
545 The return value is one of the following menu-item values returned by | |
546 the dialog box: | |
547 | |
548 abort | |
549 Abort button was selected. | |
550 cancel | |
551 Cancel button was selected. | |
552 ignore | |
553 Ignore button was selected. | |
554 no | |
555 No button was selected. | |
556 ok | |
557 OK button was selected. | |
558 retry | |
559 Retry button was selected. | |
560 yes | |
561 Yes button was selected. | |
562 | |
563 If a message box has a Cancel button, the function returns the | |
564 `cancel' value if either the ESC key is pressed or the Cancel button | |
565 is selected. If the message box has no Cancel button, pressing ESC has | |
566 no effect. */ | |
567 (message_, flags, title)) | |
568 { | |
569 Extbyte *msgout; | |
570 Extbyte *titleout = 0; | |
571 UINT sty = 0; | |
572 | |
573 if (!LISTP (flags)) | |
574 { | |
575 CHECK_SYMBOL (flags); | |
576 flags = list1 (flags); | |
577 } | |
578 | |
579 CHECK_STRING (message_); | |
4981
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
2850
diff
changeset
|
580 msgout = LISP_STRING_TO_TSTR (message_); |
442 | 581 |
582 if (!NILP (title)) | |
583 { | |
584 CHECK_STRING (title); | |
4981
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
2850
diff
changeset
|
585 titleout = LISP_STRING_TO_TSTR (title); |
442 | 586 } |
587 | |
2367 | 588 { |
589 EXTERNAL_LIST_LOOP_2 (st, flags) | |
590 { | |
591 CHECK_SYMBOL (st); | |
592 if (0) | |
593 ; | |
442 | 594 #define FROB(sym, val) else if (EQ (st, sym)) sty |= val |
2367 | 595 FROB (Qabortretryignore, MB_ABORTRETRYIGNORE); |
596 FROB (Qapplmodal, MB_APPLMODAL); | |
597 FROB (Qdefault_desktop_only, MB_DEFAULT_DESKTOP_ONLY); | |
598 FROB (Qdefbutton1, MB_DEFBUTTON1); | |
599 FROB (Qdefbutton2, MB_DEFBUTTON2); | |
600 FROB (Qdefbutton3, MB_DEFBUTTON3); | |
601 FROB (Qdefbutton4, MB_DEFBUTTON4); | |
602 FROB (Qhelp, MB_HELP); | |
603 FROB (Qiconasterisk, MB_ICONASTERISK); | |
604 FROB (Qiconexclamation, MB_ICONEXCLAMATION); | |
605 FROB (Qiconhand, MB_ICONHAND); | |
606 FROB (Qiconinformation, MB_ICONINFORMATION); | |
607 FROB (Qiconquestion, MB_ICONQUESTION); | |
608 FROB (Qiconstop, MB_ICONSTOP); | |
609 FROB (Qok, MB_OK); | |
610 FROB (Qokcancel, MB_OKCANCEL); | |
611 FROB (Qretrycancel, MB_RETRYCANCEL); | |
612 FROB (Qright, MB_RIGHT); | |
613 FROB (Qrtlreading, MB_RTLREADING); | |
614 FROB (Qservice_notification, MB_SERVICE_NOTIFICATION); | |
615 FROB (Qsetforeground, MB_SETFOREGROUND); | |
616 FROB (Qsystemmodal, MB_SYSTEMMODAL); | |
617 FROB (Qtaskmodal, MB_TASKMODAL); | |
618 FROB (Qtopmost, MB_TOPMOST); | |
619 FROB (Qyesno, MB_YESNO); | |
620 FROB (Qyesnocancel, MB_YESNOCANCEL); | |
442 | 621 #undef FROB |
622 | |
2367 | 623 else |
624 invalid_constant ("Unrecognized flag", st); | |
625 } | |
626 } | |
442 | 627 |
628 { | |
771 | 629 int retval = qxeMessageBox (NULL, msgout, titleout, sty); |
442 | 630 |
631 if (retval == 0) | |
563 | 632 out_of_memory ("When calling `mswindows-message-box'", Qunbound); |
442 | 633 |
634 #define FROB(sym, val) if (retval == val) return sym | |
635 FROB (Qabort, IDABORT); | |
636 FROB (Qcancel, IDCANCEL); | |
637 FROB (Qignore, IDIGNORE); | |
638 FROB (Qno, IDNO); | |
639 FROB (Qok, IDOK); | |
640 FROB (Qretry, IDRETRY); | |
641 FROB (Qyes, IDYES); | |
642 #undef FROB | |
643 | |
563 | 644 invalid_argument ("Unknown return value from MessageBox()", |
645 make_int (retval)); | |
442 | 646 } |
647 | |
648 return Qnil; | |
649 } | |
650 | |
651 static Lisp_Object | |
652 msprinter_canonicalize_console_connection (Lisp_Object connection, | |
578 | 653 Error_Behavior errb) |
442 | 654 { |
655 /* If nil connection is specified, transform it into the name | |
656 of the default printer */ | |
657 if (NILP (connection)) | |
658 { | |
659 connection = msprinter_default_printer (); | |
660 if (NILP (connection)) | |
661 { | |
662 if (ERRB_EQ (errb, ERROR_ME)) | |
563 | 663 invalid_state ("There is no default printer in the system", |
664 Qunbound); | |
442 | 665 else |
666 return Qunbound; | |
667 } | |
668 } | |
669 | |
670 CHECK_STRING (connection); | |
671 return connection; | |
672 } | |
673 | |
674 static Lisp_Object | |
675 msprinter_canonicalize_device_connection (Lisp_Object connection, | |
578 | 676 Error_Behavior errb) |
442 | 677 { |
678 return msprinter_canonicalize_console_connection (connection, errb); | |
679 } | |
680 | |
428 | 681 |
682 /************************************************************************/ | |
683 /* initialization */ | |
684 /************************************************************************/ | |
685 | |
686 void | |
687 syms_of_console_mswindows (void) | |
688 { | |
442 | 689 DEFSUBR (Fmswindows_debugging_output); |
690 | |
563 | 691 DEFSYMBOL (Qabortretryignore); |
692 DEFSYMBOL (Qapplmodal); | |
693 DEFSYMBOL (Qdefault_desktop_only); | |
694 DEFSYMBOL (Qdefbutton1); | |
695 DEFSYMBOL (Qdefbutton2); | |
696 DEFSYMBOL (Qdefbutton3); | |
697 DEFSYMBOL (Qdefbutton4); | |
698 /* DEFSYMBOL (Qhelp); */ | |
699 DEFSYMBOL (Qiconasterisk); | |
700 DEFSYMBOL (Qiconexclamation); | |
701 DEFSYMBOL (Qiconhand); | |
702 DEFSYMBOL (Qiconinformation); | |
703 DEFSYMBOL (Qiconquestion); | |
704 DEFSYMBOL (Qiconstop); | |
705 /* DEFSYMBOL (Qok); */ | |
706 DEFSYMBOL (Qokcancel); | |
707 DEFSYMBOL (Qretrycancel); | |
708 /* DEFSYMBOL (Qright); */ | |
709 DEFSYMBOL (Qrtlreading); | |
710 DEFSYMBOL (Qservice_notification); | |
711 DEFSYMBOL (Qsetforeground); | |
712 DEFSYMBOL (Qsystemmodal); | |
713 DEFSYMBOL (Qtaskmodal); | |
714 DEFSYMBOL (Qtopmost); | |
715 DEFSYMBOL (Qyesno); | |
716 DEFSYMBOL (Qyesnocancel); | |
442 | 717 |
563 | 718 /* DEFSYMBOL (Qabort); */ |
719 /* DEFSYMBOL (Qcancel); */ | |
720 /* DEFSYMBOL (Qignore); */ | |
721 /* DEFSYMBOL (Qno); */ | |
722 /* DEFSYMBOL (Qok); */ | |
723 /* DEFSYMBOL (Qretry); */ | |
724 /* DEFSYMBOL (Qyes); */ | |
442 | 725 |
726 DEFSUBR (Fmswindows_message_box); | |
428 | 727 } |
728 | |
729 void | |
730 console_type_create_mswindows (void) | |
731 { | |
732 INITIALIZE_CONSOLE_TYPE (mswindows, "mswindows", "console-mswindows-p"); | |
733 | |
734 /* console methods */ | |
735 /* CONSOLE_HAS_METHOD (mswindows, init_console); */ | |
736 /* CONSOLE_HAS_METHOD (mswindows, mark_console); */ | |
737 CONSOLE_HAS_METHOD (mswindows, initially_selected_for_input); | |
738 /* CONSOLE_HAS_METHOD (mswindows, delete_console); */ | |
440 | 739 CONSOLE_HAS_METHOD (mswindows, canonicalize_console_connection); |
740 CONSOLE_HAS_METHOD (mswindows, canonicalize_device_connection); | |
428 | 741 /* CONSOLE_HAS_METHOD (mswindows, semi_canonicalize_console_connection); */ |
742 /* CONSOLE_HAS_METHOD (mswindows, semi_canonicalize_device_connection); */ | |
2828 | 743 CONSOLE_HAS_METHOD (mswindows, perhaps_init_unseen_key_defaults); |
440 | 744 |
745 INITIALIZE_CONSOLE_TYPE (msprinter, "msprinter", "console-msprinter-p"); | |
442 | 746 CONSOLE_HAS_METHOD (msprinter, canonicalize_console_connection); |
747 CONSOLE_HAS_METHOD (msprinter, canonicalize_device_connection); | |
428 | 748 } |
749 | |
750 void | |
751 reinit_console_type_create_mswindows (void) | |
752 { | |
753 REINITIALIZE_CONSOLE_TYPE (mswindows); | |
440 | 754 REINITIALIZE_CONSOLE_TYPE (msprinter); |
428 | 755 } |
756 | |
757 void | |
758 vars_of_console_mswindows (void) | |
759 { | |
2850 | 760 DEFVAR_LISP ("mswindows-seen-characters", &Vmswindows_seen_characters /* |
761 Hash table of non-ASCII characters the MS Windows subsystem has seen. | |
762 */ ); | |
763 Vmswindows_seen_characters = Qnil; | |
428 | 764 Fprovide (Qmswindows); |
765 } |