Bug#16045
[emacs.git] / src / dosfns.c
blob426da1fb41a8d8699b1c2318fcd1a4a6b47ee08b
1 /* MS-DOS specific Lisp utilities. Coded by Manabu Higashida, 1991.
2 Major changes May-July 1993 Morten Welinder (only 10% original code left)
3 Copyright (C) 1991, 1993, 1996-1998, 2001-2013 Free Software
4 Foundation, Inc.
6 This file is part of GNU Emacs.
8 GNU Emacs is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
13 GNU Emacs is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
21 #include <config.h>
23 #ifdef MSDOS
24 /* The entire file is within this conditional */
26 #include <stdio.h>
27 /* gettime and settime in dos.h clash with their namesakes from
28 gnulib, so we move out of our way the prototypes in dos.h. */
29 #define gettime dos_h_gettime_
30 #define settime dos_h_settime_
31 #include <dos.h>
32 #undef gettime
33 #undef settime
35 #include "lisp.h"
36 #include "character.h"
37 #include "buffer.h"
38 #include "termchar.h"
39 #include "frame.h"
40 #include "termhooks.h"
41 #include "blockinput.h"
42 #include "window.h"
43 #include "dosfns.h"
44 #include "msdos.h"
45 #include "dispextern.h"
46 #include "coding.h"
47 #include "process.h"
48 #include <dpmi.h>
49 #include <go32.h>
50 #include <dirent.h>
51 #include <sys/vfs.h>
52 #include <unistd.h>
53 #include <grp.h>
54 #include <crt0.h>
56 DEFUN ("int86", Fint86, Sint86, 2, 2, 0,
57 doc: /* Call specific MS-DOS interrupt number INTERRUPT with REGISTERS.
58 Return the updated REGISTER vector.
60 INTERRUPT should be an integer in the range 0 to 255.
61 REGISTERS should be a vector produced by `make-register' and
62 `set-register-value'. */)
63 (Lisp_Object interrupt, Lisp_Object registers)
65 register int i;
66 int no;
67 union REGS inregs, outregs;
69 CHECK_NUMBER (interrupt);
70 no = (unsigned long) XINT (interrupt);
71 CHECK_VECTOR (registers);
72 if (no < 0 || no > 0xff || ASIZE (registers) != 8)
73 return Qnil;
74 for (i = 0; i < 8; i++)
75 CHECK_NUMBER (AREF (registers, i));
77 inregs.x.ax = (unsigned long) XFASTINT (AREF (registers, 0));
78 inregs.x.bx = (unsigned long) XFASTINT (AREF (registers, 1));
79 inregs.x.cx = (unsigned long) XFASTINT (AREF (registers, 2));
80 inregs.x.dx = (unsigned long) XFASTINT (AREF (registers, 3));
81 inregs.x.si = (unsigned long) XFASTINT (AREF (registers, 4));
82 inregs.x.di = (unsigned long) XFASTINT (AREF (registers, 5));
83 inregs.x.cflag = (unsigned long) XFASTINT (AREF (registers, 6));
84 inregs.x.flags = (unsigned long) XFASTINT (AREF (registers, 7));
86 int86 (no, &inregs, &outregs);
88 ASET (registers, 0, make_number (outregs.x.ax));
89 ASET (registers, 1, make_number (outregs.x.bx));
90 ASET (registers, 2, make_number (outregs.x.cx));
91 ASET (registers, 3, make_number (outregs.x.dx));
92 ASET (registers, 4, make_number (outregs.x.si));
93 ASET (registers, 5, make_number (outregs.x.di));
94 ASET (registers, 6, make_number (outregs.x.cflag));
95 ASET (registers, 7, make_number (outregs.x.flags));
97 return registers;
100 DEFUN ("msdos-memget", Fdos_memget, Sdos_memget, 2, 2, 0,
101 doc: /* Read DOS memory at offset ADDRESS into VECTOR.
102 Return the updated VECTOR. */)
103 (Lisp_Object address, Lisp_Object vector)
105 register int i;
106 int offs, len;
107 char *buf;
109 CHECK_NUMBER (address);
110 offs = (unsigned long) XINT (address);
111 CHECK_VECTOR (vector);
112 len = ASIZE (vector);
113 if (len < 1 || len > 2048 || offs < 0 || offs > 0xfffff - len)
114 return Qnil;
115 buf = alloca (len);
116 dosmemget (offs, len, buf);
118 for (i = 0; i < len; i++)
119 ASET (vector, i, make_number (buf[i]));
121 return vector;
124 DEFUN ("msdos-memput", Fdos_memput, Sdos_memput, 2, 2, 0,
125 doc: /* Write DOS memory at offset ADDRESS from VECTOR. */)
126 (Lisp_Object address, Lisp_Object vector)
128 register int i;
129 int offs, len;
130 char *buf;
132 CHECK_NUMBER (address);
133 offs = (unsigned long) XINT (address);
134 CHECK_VECTOR (vector);
135 len = ASIZE (vector);
136 if (len < 1 || len > 2048 || offs < 0 || offs > 0xfffff - len)
137 return Qnil;
138 buf = alloca (len);
140 for (i = 0; i < len; i++)
142 CHECK_NUMBER (AREF (vector, i));
143 buf[i] = (unsigned char) XFASTINT (AREF (vector, i)) & 0xFF;
146 dosmemput (buf, len, offs);
147 return Qt;
150 DEFUN ("msdos-set-keyboard", Fmsdos_set_keyboard, Smsdos_set_keyboard, 1, 2, 0,
151 doc: /* Set keyboard layout according to COUNTRY-CODE.
152 If the optional argument ALLKEYS is non-nil, the keyboard is mapped for
153 all keys; otherwise it is only used when the ALT key is pressed.
154 The current keyboard layout is available in dos-keyboard-code. */)
155 (Lisp_Object country_code, Lisp_Object allkeys)
157 CHECK_NUMBER (country_code);
158 if (!dos_set_keyboard (XINT (country_code), !NILP (allkeys)))
159 return Qnil;
160 return Qt;
163 #ifndef HAVE_X_WINDOWS
164 /* Later we might want to control the mouse interface with this function,
165 e.g., with respect to non-80 column screen modes. */
167 DEFUN ("msdos-mouse-p", Fmsdos_mouse_p, Smsdos_mouse_p, 0, 0, 0,
168 doc: /* Report whether a mouse is present. */)
169 (void)
171 if (have_mouse)
172 return Qt;
173 else
174 return Qnil;
176 #endif
178 DEFUN ("msdos-mouse-init", Fmsdos_mouse_init, Smsdos_mouse_init, 0, 0, "",
179 doc: /* Initialize and enable mouse if available. */)
180 (void)
182 if (have_mouse)
184 have_mouse = 1;
185 mouse_init ();
186 return Qt;
188 return Qnil;
191 DEFUN ("msdos-mouse-enable", Fmsdos_mouse_enable, Smsdos_mouse_enable, 0, 0, "",
192 doc: /* Enable mouse if available. */)
193 (void)
195 if (have_mouse)
197 have_mouse = 1;
198 mouse_on ();
200 return have_mouse ? Qt : Qnil;
203 DEFUN ("msdos-mouse-disable", Fmsdos_mouse_disable, Smsdos_mouse_disable, 0, 0, "",
204 doc: /* Disable mouse if available. */)
205 (void)
207 mouse_off ();
208 if (have_mouse) have_mouse = -1;
209 return Qnil;
212 DEFUN ("insert-startup-screen", Finsert_startup_screen, Sinsert_startup_screen, 0, 0, "",
213 doc: /* Insert copy of screen contents prior to starting Emacs.
214 Return nil if startup screen is not available. */)
215 (void)
217 char *s;
218 int rows, cols, i, j;
220 if (!dos_get_saved_screen (&s, &rows, &cols))
221 return Qnil;
223 for (i = 0; i < rows; i++)
225 for (j = 0; j < cols; j++)
227 insert_char (*s);
228 s += 2;
230 insert_char ('\n');
233 return Qt;
236 unsigned char dos_country_info[DOS_COUNTRY_INFO];
237 static unsigned char usa_country_info[DOS_COUNTRY_INFO] = {
238 0, 0, /* date format */
239 '$', 0, 0, 0, 0, /* currency string */
240 ',', 0, /* thousands separator */
241 '.', 0, /* decimal separator */
242 '/', 0, /* date separator */
243 ':', 0, /* time separator */
244 0, /* currency format */
245 2, /* digits after decimal in currency */
246 0, /* time format */
247 0, 0, 0, 0, /* address of case map routine, GPF if used */
248 ' ', 0, /* data-list separator (?) */
249 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* reserved */
252 #ifndef HAVE_X_WINDOWS
253 static unsigned dos_windows_version;
254 char parent_vm_title[50]; /* Ralf Brown says 30 is enough */
255 int w95_set_virtual_machine_title (const char *);
257 void
258 restore_parent_vm_title (void)
260 if (NILP (Vdos_windows_version))
261 return;
262 if ((dos_windows_version & 0xff) >= 4 && parent_vm_title[0])
263 w95_set_virtual_machine_title (parent_vm_title);
264 delay (50);
266 #endif /* !HAVE_X_WINDOWS */
268 void
269 init_dosfns (void)
271 union REGS regs;
272 _go32_dpmi_registers dpmiregs;
273 unsigned long xbuf = _go32_info_block.linear_address_of_transfer_buffer;
275 #ifndef SYSTEM_MALLOC
276 extern void get_lim_data (void);
278 get_lim_data (); /* why the hell isn't this called elsewhere? */
279 #endif
281 regs.x.ax = 0x3000;
282 intdos (&regs, &regs);
283 Vdos_version = Fcons (make_number (regs.h.al), make_number (regs.h.ah));
285 /* Obtain the country code via DPMI, use DJGPP transfer buffer. */
286 dpmiregs.x.ax = 0x3800;
287 dpmiregs.x.ds = xbuf >> 4;
288 dpmiregs.x.dx = 0;
289 dpmiregs.x.ss = dpmiregs.x.sp = dpmiregs.x.flags = 0;
290 _go32_dpmi_simulate_int (0x21, &dpmiregs);
291 if (dpmiregs.x.flags & 1)
293 dos_country_code = 1; /* assume USA if 213800 failed */
294 memcpy (dos_country_info, usa_country_info, DOS_COUNTRY_INFO);
296 else
298 dos_country_code = dpmiregs.x.bx;
299 dosmemget (xbuf, DOS_COUNTRY_INFO, dos_country_info);
302 dos_set_keyboard (dos_country_code, 0);
304 regs.x.ax = 0x6601;
305 intdos (&regs, &regs);
306 if (regs.x.cflag)
307 /* Estimate code page from country code */
308 switch (dos_country_code)
310 case 45: /* Denmark */
311 case 47: /* Norway */
312 dos_codepage = 865;
313 break;
314 default:
315 /* US */
316 dos_codepage = 437;
318 else
319 dos_codepage = regs.x.bx & 0xffff;
321 #ifndef HAVE_X_WINDOWS
322 parent_vm_title[0] = '\0';
324 /* If we are running from DOS box on MS-Windows, get Windows version. */
325 dpmiregs.x.ax = 0x1600; /* enhanced mode installation check */
326 dpmiregs.x.ss = dpmiregs.x.sp = dpmiregs.x.flags = 0;
327 _go32_dpmi_simulate_int (0x2f, &dpmiregs);
328 /* We only support Windows-specific features when we run on Windows 9X
329 or on Windows 3.X/enhanced mode.
331 Int 2Fh/AX=1600h returns:
333 AL = 00: no Windows at all;
334 AL = 01: Windows/386 2.x;
335 AL = 80h: Windows 3.x in mode other than enhanced;
336 AL = FFh: Windows/386 2.x
338 We also check AH > 0 (Windows 3.1 or later), in case AL tricks us. */
339 if (dpmiregs.h.al > 2 && dpmiregs.h.al != 0x80 && dpmiregs.h.al != 0xff
340 && (dpmiregs.h.al > 3 || dpmiregs.h.ah > 0))
342 dos_windows_version = dpmiregs.x.ax;
343 Vdos_windows_version =
344 Fcons (make_number (dpmiregs.h.al), make_number (dpmiregs.h.ah));
346 /* Save the current title of this virtual machine, so we can restore
347 it before exiting. Otherwise, Windows 95 will continue to use
348 the title we set even after we are history, stupido... */
349 if (dpmiregs.h.al >= 4)
351 dpmiregs.x.ax = 0x168e;
352 dpmiregs.x.dx = 3; /* get VM title */
353 dpmiregs.x.cx = sizeof (parent_vm_title) - 1;
354 dpmiregs.x.es = __tb >> 4;
355 dpmiregs.x.di = __tb & 15;
356 dpmiregs.x.sp = dpmiregs.x.ss = dpmiregs.x.flags = 0;
357 _go32_dpmi_simulate_int (0x2f, &dpmiregs);
358 if (dpmiregs.x.ax == 1)
359 dosmemget (__tb, sizeof (parent_vm_title), parent_vm_title);
362 else
364 dos_windows_version = 0;
365 Vdos_windows_version = Qnil;
367 #endif /* !HAVE_X_WINDOWS */
369 /* Without this, we never see hidden files.
370 Don't OR it with the previous value, so the value recorded at dump
371 time, possibly with `preserve-case' flags set, won't get through. */
372 __opendir_flags = __OPENDIR_FIND_HIDDEN;
374 #if __DJGPP_MINOR__ == 0
375 /* Under LFN, preserve the case of files as recorded in the directory
376 (in DJGPP 2.01 and later this is automagically done by the library). */
377 if (!NILP (Fmsdos_long_file_names ()))
378 __opendir_flags |= __OPENDIR_PRESERVE_CASE;
379 #endif /* __DJGPP_MINOR__ == 0 */
382 #ifndef HAVE_X_WINDOWS
384 /* Emulation of some X window features from xfns.c and xfaces.c. */
386 /* Standard VGA colors, in the order of their standard numbering
387 in the default VGA palette. */
388 static char *vga_colors[16] = {
389 "black", "blue", "green", "cyan", "red", "magenta", "brown",
390 "lightgray", "darkgray", "lightblue", "lightgreen", "lightcyan",
391 "lightred", "lightmagenta", "yellow", "white"
394 /* Given a color name, return its index, or -1 if not found. Note
395 that this only performs case-insensitive comparison against the
396 standard names. For anything more sophisticated, like matching
397 "gray" with "grey" or translating X color names into their MSDOS
398 equivalents, call the Lisp function Qtty_color_desc (defined
399 on lisp/term/tty-colors.el). */
401 msdos_stdcolor_idx (const char *name)
403 int i;
405 for (i = 0; i < sizeof (vga_colors) / sizeof (vga_colors[0]); i++)
406 if (xstrcasecmp (name, vga_colors[i]) == 0)
407 return i;
409 return
410 strcmp (name, unspecified_fg) == 0 ? FACE_TTY_DEFAULT_FG_COLOR
411 : strcmp (name, unspecified_bg) == 0 ? FACE_TTY_DEFAULT_BG_COLOR
412 : FACE_TTY_DEFAULT_COLOR;
415 /* Given a color index, return its standard name. */
416 Lisp_Object
417 msdos_stdcolor_name (int idx)
419 extern Lisp_Object Qunspecified;
421 if (idx == FACE_TTY_DEFAULT_FG_COLOR)
422 return build_string (unspecified_fg);
423 else if (idx == FACE_TTY_DEFAULT_BG_COLOR)
424 return build_string (unspecified_bg);
425 else if (idx >= 0 && idx < sizeof (vga_colors) / sizeof (vga_colors[0]))
426 return build_string (vga_colors[idx]);
427 else
428 return Qunspecified; /* meaning the default */
431 /* Support for features that are available when we run in a DOS box
432 on MS-Windows. */
434 ms_windows_version (void)
436 return dos_windows_version;
439 /* Set the title of the current virtual machine, to appear on
440 the caption bar of that machine's window. */
443 w95_set_virtual_machine_title (const char *title_string)
445 /* Only Windows 9X (version 4 and higher) support this function. */
446 if (!NILP (Vdos_windows_version)
447 && (dos_windows_version & 0xff) >= 4)
449 _go32_dpmi_registers regs;
450 dosmemput (title_string, strlen (title_string) + 1, __tb);
451 regs.x.ax = 0x168e;
452 regs.x.dx = 1;
453 regs.x.es = __tb >> 4;
454 regs.x.di = __tb & 15;
455 regs.x.sp = regs.x.ss = regs.x.flags = 0;
456 _go32_dpmi_simulate_int (0x2f, &regs);
457 return regs.x.ax == 1;
459 return 0;
462 /* Change the title of frame F to NAME.
463 If NAME is nil, use the frame name as the title.
465 If Emacs is not run from a DOS box on Windows 9X, this only
466 sets the name in the frame struct, but has no other effects. */
468 void
469 x_set_title (struct frame *f, Lisp_Object name)
471 /* Don't change the title if it's already NAME. */
472 if (EQ (name, f->title))
473 return;
475 update_mode_lines = 13;
477 fset_title (f, name);
479 if (NILP (name))
480 name = f->name;
482 if (FRAME_MSDOS_P (f))
484 block_input ();
485 w95_set_virtual_machine_title (SDATA (name));
486 unblock_input ();
489 #endif /* !HAVE_X_WINDOWS */
491 DEFUN ("file-system-info", Ffile_system_info, Sfile_system_info, 1, 1, 0,
492 doc: /* Return storage information about the file system FILENAME is on.
493 Value is a list of floats (TOTAL FREE AVAIL), where TOTAL is the total
494 storage of the file system, FREE is the free storage, and AVAIL is the
495 storage available to a non-superuser. All 3 numbers are in bytes.
496 If the underlying system call fails, value is nil. */)
497 (Lisp_Object filename)
499 struct statfs stfs;
500 Lisp_Object encoded, value;
502 CHECK_STRING (filename);
503 filename = Fexpand_file_name (filename, Qnil);
504 encoded = ENCODE_FILE (filename);
506 if (statfs (SDATA (encoded), &stfs))
507 value = Qnil;
508 else
509 value = list3 (make_float ((double) stfs.f_bsize * stfs.f_blocks),
510 make_float ((double) stfs.f_bsize * stfs.f_bfree),
511 make_float ((double) stfs.f_bsize * stfs.f_bavail));
513 return value;
516 /* System depended enumeration of and access to system processes a-la
517 ps(1). Here, we only return info about the running Emacs process.
518 (There are no other processes on DOS, right?) */
520 Lisp_Object
521 list_system_processes (void)
523 Lisp_Object proclist = Qnil;
525 proclist = Fcons (make_fixnum_or_float (getpid ()), proclist);
527 return proclist;
530 Lisp_Object
531 system_process_attributes (Lisp_Object pid)
533 int proc_id;
534 Lisp_Object attrs = Qnil;
536 CHECK_NUMBER_OR_FLOAT (pid);
537 proc_id = FLOATP (pid) ? XFLOAT_DATA (pid) : XINT (pid);
539 if (proc_id == getpid ())
541 EMACS_INT uid, gid;
542 char *usr;
543 struct group *gr;
544 char cmd[FILENAME_MAX];
545 char *cmdline = NULL, *p, *q;
546 size_t cmdline_size = 0;
547 int i;
548 Lisp_Object cmd_str, decoded_cmd, tem;
549 double pmem;
550 #ifndef SYSTEM_MALLOC
551 extern unsigned long ret_lim_data ();
552 #endif
554 uid = getuid ();
555 attrs = Fcons (Fcons (Qeuid, make_fixnum_or_float (uid)), attrs);
556 usr = getlogin ();
557 if (usr)
558 attrs = Fcons (Fcons (Quser, build_string (usr)), attrs);
559 gid = getgid ();
560 attrs = Fcons (Fcons (Qegid, make_fixnum_or_float (gid)), attrs);
561 gr = getgrgid (gid);
562 if (gr)
563 attrs = Fcons (Fcons (Qgroup, build_string (gr->gr_name)), attrs);
564 strcpy (cmd, basename (__crt0_argv[0]));
565 /* Command name is encoded in locale-coding-system; decode it. */
566 cmd_str = build_unibyte_string (cmd);
567 decoded_cmd = code_convert_string_norecord (cmd_str,
568 Vlocale_coding_system, 0);
569 attrs = Fcons (Fcons (Qcomm, decoded_cmd), attrs);
570 /* Pretend we have 0 as PPID. */
571 attrs = Fcons (Fcons (Qppid, make_number (0)), attrs);
572 attrs = Fcons (Fcons (Qpgrp, pid), attrs);
573 attrs = Fcons (Fcons (Qttname, build_string ("/dev/tty")), attrs);
574 /* We are never idle! */
575 tem = Fget_internal_run_time ();
576 attrs = Fcons (Fcons (Qtime, tem), attrs);
577 attrs = Fcons (Fcons (Qthcount, make_number (1)), attrs);
578 attrs = Fcons (Fcons (Qstart,
579 Fsymbol_value (intern ("before-init-time"))),
580 attrs);
581 attrs = Fcons (Fcons (Qvsize,
582 make_fixnum_or_float ((unsigned long)sbrk (0)/1024)),
583 attrs);
584 attrs = Fcons (Fcons (Qetime, tem), attrs);
585 #ifndef SYSTEM_MALLOC
586 /* ret_lim_data is on vm-limit.c, which is not compiled in under
587 SYSTEM_MALLOC. */
588 pmem = (double)((unsigned long) sbrk (0)) / ret_lim_data () * 100.0;
589 if (pmem > 100)
590 #endif
591 pmem = 100;
592 attrs = Fcons (Fcons (Qpmem, make_float (pmem)), attrs);
593 /* Pass 1: Count how much storage we need. */
594 for (i = 0; i < __crt0_argc; i++)
596 cmdline_size += strlen (__crt0_argv[i]) + 1; /* +1 for blank delim */
597 if (strpbrk (__crt0_argv[i], " \t\n\r\v\f"))
599 cmdline_size += 2;
600 for (p = __crt0_argv[i]; *p; p++)
602 if (*p == '"')
603 cmdline_size++;
607 /* Pass 2: Allocate storage and concatenate argv[]. */
608 cmdline = xmalloc (cmdline_size + 1);
609 for (i = 0, q = cmdline; i < __crt0_argc; i++)
611 if (strpbrk (__crt0_argv[i], " \t\n\r\v\f"))
613 *q++ = '"';
614 for (p = __crt0_argv[i]; *p; p++)
616 if (*p == '\"')
617 *q++ = '\\';
618 *q++ = *p;
620 *q++ = '"';
622 else
624 strcpy (q, __crt0_argv[i]);
625 q += strlen (__crt0_argv[i]);
627 *q++ = ' ';
629 /* Remove the trailing blank. */
630 if (q > cmdline)
631 q[-1] = '\0';
633 /* Command line is encoded in locale-coding-system; decode it. */
634 cmd_str = build_unibyte_string (cmdline);
635 decoded_cmd = code_convert_string_norecord (cmd_str,
636 Vlocale_coding_system, 0);
637 xfree (cmdline);
638 attrs = Fcons (Fcons (Qargs, decoded_cmd), attrs);
641 return attrs;
644 void
645 dos_cleanup (void)
647 struct tty_display_info *tty;
649 #ifndef HAVE_X_WINDOWS
650 restore_parent_vm_title ();
651 #endif
652 /* Make sure the termscript file is committed, in case we are
653 crashing and some vital info was written there. */
654 if (FRAMEP (selected_frame))
656 struct frame *sf = XFRAME (selected_frame);
658 if (FRAME_LIVE_P (sf)
659 && (FRAME_MSDOS_P (sf) || FRAME_TERMCAP_P (sf)))
661 tty = CURTTY ();
662 if (tty->termscript)
664 fflush (tty->termscript);
665 fsync (fileno (tty->termscript));
672 * Define everything
674 void
675 syms_of_dosfns (void)
677 defsubr (&Sint86);
678 defsubr (&Sdos_memget);
679 defsubr (&Sdos_memput);
680 defsubr (&Smsdos_mouse_init);
681 defsubr (&Smsdos_mouse_enable);
682 defsubr (&Smsdos_set_keyboard);
683 defsubr (&Sinsert_startup_screen);
684 defsubr (&Smsdos_mouse_disable);
685 defsubr (&Sfile_system_info);
686 #ifndef HAVE_X_WINDOWS
687 defsubr (&Smsdos_mouse_p);
688 #endif
690 DEFVAR_INT ("dos-country-code", dos_country_code,
691 doc: /* The country code returned by Dos when Emacs was started.
692 Usually this is the international telephone prefix. */);
694 DEFVAR_INT ("dos-codepage", dos_codepage,
695 doc: /* The codepage active when Emacs was started.
696 The following are known:
697 437 United States
698 850 Multilingual (Latin I)
699 852 Slavic (Latin II)
700 857 Turkish
701 860 Portugal
702 861 Iceland
703 863 Canada (French)
704 865 Norway/Denmark */);
706 DEFVAR_INT ("dos-timezone-offset", dos_timezone_offset,
707 doc: /* The current timezone offset to UTC in minutes.
708 Implicitly modified when the TZ variable is changed. */);
710 DEFVAR_LISP ("dos-version", Vdos_version,
711 doc: /* The (MAJOR . MINOR) Dos version (subject to modification with setver). */);
713 #ifndef HAVE_X_WINDOWS
714 DEFVAR_LISP ("dos-windows-version", Vdos_windows_version,
715 doc: /* The (MAJOR . MINOR) Windows version for DOS session on MS-Windows. */);
716 #endif
718 DEFVAR_LISP ("dos-display-scancodes", Vdos_display_scancodes,
719 doc: /* Whether DOS raw keyboard events are displayed as you type.
720 When non-nil, the keyboard scan-codes are displayed at the bottom right
721 corner of the display (typically at the end of the mode line).
722 The output format is: scan code:char code*modifiers. */);
724 Vdos_display_scancodes = Qnil;
726 DEFVAR_INT ("dos-hyper-key", dos_hyper_key,
727 doc: /* If set to 1, use right ALT key as hyper key.
728 If set to 2, use right CTRL key as hyper key. */);
729 dos_hyper_key = 0;
731 DEFVAR_INT ("dos-super-key", dos_super_key,
732 doc: /* If set to 1, use right ALT key as super key.
733 If set to 2, use right CTRL key as super key. */);
734 dos_super_key = 0;
736 DEFVAR_INT ("dos-keypad-mode", dos_keypad_mode,
737 doc: /* Controls what key code is returned by a key in the numeric keypad.
738 The `numlock ON' action is only taken if no modifier keys are pressed.
739 The value is an integer constructed by adding the following bits together:
741 0x00 Digit key returns digit (if numlock ON)
742 0x01 Digit key returns kp-digit (if numlock ON)
743 0x02 Digit key returns M-digit (if numlock ON)
744 0x03 Digit key returns edit key (if numlock ON)
746 0x00 Grey key returns char (if numlock ON)
747 0x04 Grey key returns kp-key (if numlock ON)
749 0x00 Digit key returns digit (if numlock OFF)
750 0x10 Digit key returns kp-digit (if numlock OFF)
751 0x20 Digit key returns M-digit (if numlock OFF)
752 0x30 Digit key returns edit key (if numlock OFF)
754 0x00 Grey key returns char (if numlock OFF)
755 0x40 Grey key returns kp-key (if numlock OFF)
757 0x200 ALT-0..ALT-9 in top-row produces shifted codes. */);
758 dos_keypad_mode = 0x75;
760 DEFVAR_INT ("dos-keyboard-layout", dos_keyboard_layout,
761 doc: /* Contains the country code for the current keyboard layout.
762 Use msdos-set-keyboard to select another keyboard layout. */);
763 dos_keyboard_layout = 1; /* US */
765 DEFVAR_INT ("dos-decimal-point", dos_decimal_point,
766 doc: /* The character to produce when kp-decimal key is pressed.
767 If non-zero, this variable contains the character to be returned when the
768 decimal point key in the numeric keypad is pressed when Num Lock is on.
769 If zero, the decimal point key returns the country code specific value. */);
770 dos_decimal_point = 0;
772 #endif /* MSDOS */