X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/929aeac608c271b2448dffec29aeea85c69d6bff..51caf50203be08ba6f15e0d72b777f036d6bee72:/src/msdos.c
diff --git a/src/msdos.c b/src/msdos.c
index ac8c90455d..b778245a7b 100644
--- a/src/msdos.c
+++ b/src/msdos.c
@@ -1,4 +1,4 @@
-/* MS-DOS specific C utilities. -*- coding: raw-text -*-
+/* MS-DOS specific C utilities. -*- coding: cp850 -*-
Copyright (C) 1993-1997, 1999-2013 Free Software Foundation, Inc.
@@ -20,6 +20,13 @@ along with GNU Emacs. If not, see . */
/* Contributed by Morten Welinder */
/* New display, keyboard, and mouse control by Kim F. Storm */
+/* Note: This file MUST use a unibyte encoding, to both display the
+ keys on the non-US keyboard layout as their respective labels, and
+ provide the correct byte values for the keyboard input to inject
+ into Emacs. See 'struct dos_keyboard_map' below. As long as there
+ are only European keyboard layouts here, we are OK with DOS
+ codepage 850 encoding. */
+
/* Note: some of the stuff here was taken from end of sysdep.c in demacs. */
#include
@@ -291,7 +298,7 @@ mouse_button_depressed (int b, int *xp, int *yp)
}
void
-mouse_get_pos (FRAME_PTR *f, int insist, Lisp_Object *bar_window,
+mouse_get_pos (struct frame **f, int insist, Lisp_Object *bar_window,
enum scroll_bar_part *part, Lisp_Object *x, Lisp_Object *y,
Time *time)
{
@@ -401,7 +408,7 @@ static int term_setup_done;
static unsigned short outside_cursor;
-/* Similar to the_only_frame. */
+/* The only display since MS-DOS does not support multiple ones. */
struct tty_display_info the_only_display_info;
/* Support for DOS/V (allows Japanese characters to be displayed on
@@ -595,11 +602,7 @@ dos_set_window_size (int *rows, int *cols)
Lisp_Object window = hlinfo->mouse_face_window;
if (! NILP (window) && XFRAME (XWINDOW (window)->frame) == f)
- {
- hlinfo->mouse_face_beg_row = hlinfo->mouse_face_beg_col = -1;
- hlinfo->mouse_face_end_row = hlinfo->mouse_face_end_col = -1;
- hlinfo->mouse_face_window = Qnil;
- }
+ reset_mouse_highlight (hlinfo);
}
/* Enable bright background colors. */
@@ -943,9 +946,6 @@ IT_write_glyphs (struct frame *f, struct glyph *str, int str_len)
Mouse Highlight (and friends..)
************************************************************************/
-/* Last window where we saw the mouse. Used by mouse-autoselect-window. */
-static Lisp_Object last_mouse_window;
-
static int mouse_preempted = 0; /* non-zero when XMenu gobbles mouse events */
int
@@ -1151,7 +1151,7 @@ IT_display_cursor (int on)
to put the cursor at the end of the text displayed there. */
static void
-IT_cmgoto (FRAME_PTR f)
+IT_cmgoto (struct frame *f)
{
/* Only set the cursor to where it should be if the display is
already in sync with the window contents. */
@@ -1222,7 +1222,7 @@ IT_cmgoto (FRAME_PTR f)
static void
IT_update_begin (struct frame *f)
{
- struct tty_display_info *display_info = FRAME_X_DISPLAY_INFO (f);
+ struct tty_display_info *display_info = FRAME_DISPLAY_INFO (f);
Mouse_HLInfo *hlinfo = &display_info->mouse_highlight;
struct frame *mouse_face_frame = hlinfo->mouse_face_mouse_frame;
@@ -1254,7 +1254,7 @@ IT_update_begin (struct frame *f)
/* If the mouse highlight is in the window that was deleted
(e.g., if it was popped by completion), clear highlight
unconditionally. */
- if (NILP (w->buffer))
+ if (NILP (w->contents))
hlinfo->mouse_face_window = Qnil;
else
{
@@ -1264,19 +1264,14 @@ IT_update_begin (struct frame *f)
break;
}
- if (NILP (w->buffer) || i < w->desired_matrix->nrows)
+ if (NILP (w->contents) || i < w->desired_matrix->nrows)
clear_mouse_face (hlinfo);
}
}
else if (mouse_face_frame && !FRAME_LIVE_P (mouse_face_frame))
- {
- /* If the frame with mouse highlight was deleted, invalidate the
- highlight info. */
- hlinfo->mouse_face_beg_row = hlinfo->mouse_face_beg_col = -1;
- hlinfo->mouse_face_end_row = hlinfo->mouse_face_end_col = -1;
- hlinfo->mouse_face_window = Qnil;
- hlinfo->mouse_face_mouse_frame = NULL;
- }
+ /* If the frame with mouse highlight was deleted, invalidate the
+ highlight info. */
+ reset_mouse_highlight (hlinfo);
unblock_input ();
}
@@ -1284,7 +1279,7 @@ IT_update_begin (struct frame *f)
static void
IT_update_end (struct frame *f)
{
- struct tty_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
+ struct tty_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
if (dpyinfo->termscript)
fprintf (dpyinfo->termscript, "\nbuffer);
+ struct buffer *b = XBUFFER (sw->contents);
if (EQ (BVAR (b,cursor_type), Qt))
new_cursor = frame_desired_cursor;
@@ -1384,13 +1379,6 @@ IT_delete_glyphs (struct frame *f, int n)
emacs_abort ();
}
-/* set-window-configuration on window.c needs this. */
-void
-x_set_menu_bar_lines (struct frame *f, Lisp_Object value, Lisp_Object oldval)
-{
- set_menu_bar_lines (f, value, oldval);
-}
-
/* This was copied from xfaces.c */
extern Lisp_Object Qbackground_color;
@@ -1548,11 +1536,6 @@ IT_reset_terminal_modes (struct terminal *term)
term_setup_done = 0;
}
-static void
-IT_set_terminal_window (struct frame *f, int foo)
-{
-}
-
/* Remember the screen colors of the current frame, to serve as the
default colors for newly-created frames. */
DEFUN ("msdos-remember-default-colors", Fmsdos_remember_default_colors,
@@ -1753,7 +1736,7 @@ IT_set_frame_parameters (struct frame *f, Lisp_Object alist)
}
}
-extern void init_frame_faces (FRAME_PTR);
+extern void init_frame_faces (struct frame *);
#endif /* !HAVE_X_WINDOWS */
@@ -1836,17 +1819,8 @@ internal_terminal_init (void)
if (colors[1] >= 0 && colors[1] < 16)
FRAME_BACKGROUND_PIXEL (SELECTED_FRAME ()) = colors[1];
}
- the_only_display_info.mouse_highlight.mouse_face_mouse_frame = NULL;
- the_only_display_info.mouse_highlight.mouse_face_beg_row =
- the_only_display_info.mouse_highlight.mouse_face_beg_col = -1;
- the_only_display_info.mouse_highlight.mouse_face_end_row =
- the_only_display_info.mouse_highlight.mouse_face_end_col = -1;
- the_only_display_info.mouse_highlight.mouse_face_face_id = DEFAULT_FACE_ID;
- the_only_display_info.mouse_highlight.mouse_face_window = Qnil;
- the_only_display_info.mouse_highlight.mouse_face_mouse_x =
- the_only_display_info.mouse_highlight.mouse_face_mouse_y = 0;
- the_only_display_info.mouse_highlight.mouse_face_defer = 0;
- the_only_display_info.mouse_highlight.mouse_face_hidden = 0;
+
+ reset_mouse_highlight (&the_only_display_info.mouse_highlight);
if (have_mouse) /* detected in dos_ttraw, which see */
{
@@ -1882,7 +1856,7 @@ initialize_msdos_display (struct terminal *term)
term->ring_bell_hook = IT_ring_bell;
term->reset_terminal_modes_hook = IT_reset_terminal_modes;
term->set_terminal_modes_hook = IT_set_terminal_modes;
- term->set_terminal_window_hook = IT_set_terminal_window;
+ term->set_terminal_window_hook = NULL;
term->update_begin_hook = IT_update_begin;
term->update_end_hook = IT_update_end;
term->frame_up_to_date_hook = IT_frame_up_to_date;
@@ -1913,7 +1887,7 @@ dos_get_saved_screen (char **screen, int *rows, int *cols)
/* We are not X, but we can emulate it well enough for our needs... */
void
-check_x (void)
+check_window_system (void)
{
if (! FRAME_MSDOS_P (SELECTED_FRAME ()))
error ("Not running under a window system");
@@ -1965,10 +1939,10 @@ struct dos_keyboard_map
static struct dos_keyboard_map us_keyboard = {
/* 0 1 2 3 4 5 */
-/* 01234567890123456789012345678901234567890 12345678901234 */
- "`1234567890-= qwertyuiop[] asdfghjkl;'\\ zxcvbnm,./ ",
+/* 01234567890123456789012345678901234567890 123 45678901234 */
+ "`1234567890-= qwertyuiop[] asdfghjkl;'\\ \\zxcvbnm,./ ",
/* 0123456789012345678901234567890123456789 012345678901234 */
- "~!@#$%^&*()_+ QWERTYUIOP{} ASDFGHJKL:\"| ZXCVBNM<>? ",
+ "~!@#$%^&*()_+ QWERTYUIOP{} ASDFGHJKL:\"| |ZXCVBNM<>? ",
0, /* no Alt-Gr key */
0 /* no translate table */
};
@@ -1976,9 +1950,9 @@ static struct dos_keyboard_map us_keyboard = {
static struct dos_keyboard_map fr_keyboard = {
/* 0 1 2 3 4 5 */
/* 012 3456789012345678901234567890123456789012345678901234 */
- "ý&\",(-_
)= azertyuiop^$ qsdfghjklm* wxcvbnm;:! ",
+ "ý&\"'(-_
)= azertyuiop^$ qsdfghjklm* WXCVBN?./õ ",
/* 01234567 89012345678901234567890123456789012345678901234 */
" ~#{[|`\\^@]} Ï ",
0 /* no translate table */
@@ -2000,9 +1974,9 @@ static struct kbd_translate it_kbd_translate_table[] = {
static struct dos_keyboard_map it_keyboard = {
/* 0 1 2 3 4 5 */
/* 0 123456789012345678901234567890123456789012345678901234 */
- "\\1234567890'< qwertyuiop+> asdfghjkl
zxcvbnm,.- ",
+ "\\1234567890'< qwertyuiop+> asdfghjkl
QWERTYUIOP* ASDFGHJKLøõ ZXCVBNM;:_ ",
+ "|!\"$%&/()=?^> QWERTYUIOP* ASDFGHJKLøõ >ZXCVBNM;:_ ",
/* 0123456789012345678901234567890123456789012345678901234 */
" {}~` [] @# ",
it_kbd_translate_table
@@ -2011,9 +1985,9 @@ static struct dos_keyboard_map it_keyboard = {
static struct dos_keyboard_map dk_keyboard = {
/* 0 1 2 3 4 5 */
/* 0123456789012345678901234567890123456789012345678901234 */
- "«1234567890+| qwertyuiop~ asdfghjkl' zxcvbnm,.- ",
+ "«1234567890+| qwertyuiop~ asdfghjkl' ZXCVBNM;:_ ",
/* 0123456789012345678901234567890123456789012345678901234 */
" @$ {[]} | ",
0 /* no translate table */
@@ -2684,10 +2658,10 @@ dos_rawgetc (void)
/* Generate SELECT_WINDOW_EVENTs when needed. */
if (!NILP (Vmouse_autoselect_window))
{
- mouse_window = window_from_coordinates (SELECTED_FRAME (),
- mouse_last_x,
- mouse_last_y,
- 0, 0);
+ static Lisp_Object last_mouse_window;
+
+ mouse_window = window_from_coordinates
+ (SELECTED_FRAME (), mouse_last_x, mouse_last_y, 0, 0);
/* A window will be selected only when it is not
selected now, and the last mouse movement event was
not in it. A minibuffer window will be selected iff
@@ -2702,10 +2676,9 @@ dos_rawgetc (void)
event.timestamp = event_timestamp ();
kbd_buffer_store_event (&event);
}
+ /* Remember the last window where we saw the mouse. */
last_mouse_window = mouse_window;
}
- else
- last_mouse_window = Qnil;
previous_help_echo_string = help_echo_string;
help_echo_string = help_echo_object = help_echo_window = Qnil;
@@ -2976,11 +2949,6 @@ IT_menu_display (XMenu *menu, int y, int x, int pn, int *faces, int disp_help)
/* --------------------------- X Menu emulation ---------------------- */
-/* Report availability of menus. */
-
-int
-have_menus_p (void) { return 1; }
-
/* Create a brand new menu structure. */
XMenu *
@@ -3318,18 +3286,6 @@ XMenuDestroy (Display *foo, XMenu *menu)
xfree (menu);
menu_help_message = prev_menu_help_message = NULL;
}
-
-int
-x_pixel_width (struct frame *f)
-{
- return FRAME_COLS (f);
-}
-
-int
-x_pixel_height (struct frame *f)
-{
- return FRAME_LINES (f);
-}
#endif /* !HAVE_X_WINDOWS */
/* ----------------------- DOS / UNIX conversion --------------------- */
@@ -3339,7 +3295,7 @@ void msdos_downcase_filename (unsigned char *);
/* Destructively turn backslashes into slashes. */
void
-dostounix_filename (char *p, int ignore)
+dostounix_filename (char *p)
{
msdos_downcase_filename (p);
@@ -3603,7 +3559,7 @@ init_environment (int argc, char **argv, int skip_args)
if (!s) s = "c:/command.com";
t = alloca (strlen (s) + 1);
strcpy (t, s);
- dostounix_filename (t, 0);
+ dostounix_filename (t);
setenv ("SHELL", t, 0);
/* PATH is also downcased and backslashes mirrored. */
@@ -3613,7 +3569,7 @@ init_environment (int argc, char **argv, int skip_args)
/* Current directory is always considered part of MsDos's path but it is
not normally mentioned. Now it is. */
strcat (strcpy (t, ".;"), s);
- dostounix_filename (t, 0); /* Not a single file name, but this should work. */
+ dostounix_filename (t); /* Not a single file name, but this should work. */
setenv ("PATH", t, 1);
/* In some sense all dos users have root privileges, so... */
@@ -4083,7 +4039,7 @@ dos_yield_time_slice (void)
because wait_reading_process_output takes care of that. */
int
sys_select (int nfds, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE *efds,
- EMACS_TIME *timeout, void *ignored)
+ struct timespec *timeout, void *ignored)
{
int check_input;
struct timespec t;
@@ -4113,20 +4069,20 @@ sys_select (int nfds, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE *efds,
}
else
{
- EMACS_TIME clnow, cllast, cldiff;
+ struct timespec clnow, cllast, cldiff;
gettime (&t);
- cllast = make_emacs_time (t.tv_sec, t.tv_nsec);
+ cllast = make_timespec (t.tv_sec, t.tv_nsec);
while (!check_input || !detect_input_pending ())
{
gettime (&t);
- clnow = make_emacs_time (t.tv_sec, t.tv_nsec);
- cldiff = sub_emacs_time (clnow, cllast);
- *timeout = sub_emacs_time (*timeout, cldiff);
+ clnow = make_timespec (t.tv_sec, t.tv_nsec);
+ cldiff = timespec_sub (clnow, cllast);
+ *timeout = timespec_sub (*timeout, cldiff);
/* Stop when timeout value crosses zero. */
- if (EMACS_TIME_SIGN (*timeout) <= 0)
+ if (timespec_sign (*timeout) <= 0)
return 0;
cllast = clnow;
dos_yield_time_slice ();