X-Git-Url: http://git.chise.org/gitweb/?p=chise%2Fxemacs-chise.git.1;a=blobdiff_plain;f=src%2Fconsole.c;h=0840f8a4177ee045fb821e73eb4366c7c076b868;hp=7e27f8614b6186171e5c10e88396b3dcdfe807d2;hb=14ac73276fa152e8f0b74602792afc0b9c3236c9;hpb=937bb3ce20f4819a75e8234cb91a1acaa19847f8 diff --git a/src/console.c b/src/console.c index 7e27f86..0840f8a 100644 --- a/src/console.c +++ b/src/console.c @@ -53,6 +53,7 @@ Lisp_Object Qsuspend_resume_hook; list of consoles and stores into each console that does not say it has a local value. */ Lisp_Object Vconsole_defaults; +static void *console_defaults_saved_slots; /* This structure marks which slots in a console have corresponding default values in console_defaults. @@ -69,7 +70,7 @@ Lisp_Object Vconsole_defaults; consoles. If a slot is -1, then there is a DEFVAR_CONSOLE_LOCAL for it - as well as a default value which is used to initialize newly-created + as well as a default value which is used to initialize newly-created consoles and as a reset-value when local-vars are killed. If a slot is -2, there is no DEFVAR_CONSOLE_LOCAL for it. @@ -87,6 +88,7 @@ struct console console_local_flags; /* This structure holds the names of symbols whose values may be console-local. It is indexed and accessed in the same way as the above. */ static Lisp_Object Vconsole_local_symbols; +static void *console_local_symbols_saved_slots; DEFINE_CONSOLE_TYPE (dead); @@ -96,19 +98,19 @@ console_type_entry_dynarr *the_console_type_entry_dynarr; static Lisp_Object -mark_console (Lisp_Object obj, void (*markobj) (Lisp_Object)) +mark_console (Lisp_Object obj) { struct console *con = XCONSOLE (obj); -#define MARKED_SLOT(x) ((void) (markobj (con->x))); +#define MARKED_SLOT(x) mark_object (con->x) #include "conslots.h" #undef MARKED_SLOT /* Can be zero for Vconsole_defaults, Vconsole_local_symbols */ if (con->conmeths) { - markobj (con->conmeths->symbol); - MAYBE_CONMETH (con, mark_console, (con, markobj)); + mark_object (con->conmeths->symbol); + MAYBE_CONMETH (con, mark_console, (con)); } return Qnil; @@ -127,7 +129,7 @@ print_console (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag) sprintf (buf, "#<%s-console", !CONSOLE_LIVE_P (con) ? "dead" : CONSOLE_TYPE_NAME (con)); write_c_string (buf, printcharfun); - if (CONSOLE_LIVE_P (con)) + if (CONSOLE_LIVE_P (con) && !NILP (CONSOLE_CONNECTION (con))) { write_c_string (" on ", printcharfun); print_internal (CONSOLE_CONNECTION (con), printcharfun, 1); @@ -194,7 +196,7 @@ valid_console_type_p (Lisp_Object type) } DEFUN ("valid-console-type-p", Fvalid_console_type_p, 1, 1, 0, /* -Given a CONSOLE-TYPE, return t if it is valid. +Return t if CONSOLE-TYPE is a valid console type. Valid types are 'x, 'tty, and 'stream. */ (console_type)) @@ -214,9 +216,9 @@ DEFUN ("cdfw-console", Fcdfw_console, 1, 1, 0, /* Given a console, device, frame, or window, return the associated console. Return nil otherwise. */ - (obj)) + (object)) { - return CDFW_CONSOLE (obj); + return CDFW_CONSOLE (object); } @@ -242,6 +244,11 @@ select_console_1 (Lisp_Object console) Vwindow_system = Qx; else #endif +#ifdef HAVE_GTK + if (CONSOLE_GTK_P (XCONSOLE (console))) + Vwindow_system = Qgtk; + else +#endif #ifdef HAVE_MS_WINDOWS if (CONSOLE_MSWINDOWS_P (XCONSOLE (console))) Vwindow_system = Qmswindows; @@ -305,7 +312,7 @@ Return non-nil if OBJECT is a console that has not been deleted. } DEFUN ("console-type", Fconsole_type, 0, 1, 0, /* -Return the type of the specified console (e.g. `x' or `tty'). +Return the console type (e.g. `x' or `tty') of CONSOLE. Value is `tty' for a tty console (a character-only terminal), `x' for a console that is an X display, `mswindows' for a console that is a Windows NT/95/97 connection, @@ -325,7 +332,7 @@ Value is `tty' for a tty console (a character-only terminal), } DEFUN ("console-name", Fconsole_name, 0, 1, 0, /* -Return the name of the specified console. +Return the name of CONSOLE. */ (console)) { @@ -353,16 +360,24 @@ static Lisp_Object semi_canonicalize_console_connection (struct console_methods *meths, Lisp_Object name, Error_behavior errb) { - return CONTYPE_METH_OR_GIVEN (meths, semi_canonicalize_console_connection, - (name, errb), name); + if (HAS_CONTYPE_METH_P (meths, semi_canonicalize_console_connection)) + return CONTYPE_METH (meths, semi_canonicalize_console_connection, + (name, errb)); + else + return CONTYPE_METH_OR_GIVEN (meths, canonicalize_console_connection, + (name, errb), name); } static Lisp_Object canonicalize_console_connection (struct console_methods *meths, Lisp_Object name, Error_behavior errb) { - return CONTYPE_METH_OR_GIVEN (meths, canonicalize_console_connection, - (name, errb), name); + if (HAS_CONTYPE_METH_P (meths, canonicalize_console_connection)) + return CONTYPE_METH (meths, canonicalize_console_connection, + (name, errb)); + else + return CONTYPE_METH_OR_GIVEN (meths, semi_canonicalize_console_connection, + (name, errb), name); } static Lisp_Object @@ -486,7 +501,7 @@ create_console (Lisp_Object name, Lisp_Object type, Lisp_Object connection, /* Do it this way so that the console list is in order of creation */ Vconsole_list = nconc2 (Vconsole_list, Fcons (console, Qnil)); - if (CONMETH (con, initially_selected_for_input, (con))) + if (CONMETH_OR_GIVEN (con, initially_selected_for_input, (con), 0)) event_stream_select_console (con); UNGCPRO; @@ -740,7 +755,7 @@ Return a list of all consoles. DEFUN ("console-device-list", Fconsole_device_list, 0, 1, 0, /* Return a list of all devices on CONSOLE. -If CONSOLE is nil, the selected console will be used. +If CONSOLE is nil, the selected console is used. */ (console)) { @@ -770,7 +785,8 @@ Disable input on console CONSOLE. } DEFUN ("console-on-window-system-p", Fconsole_on_window_system_p, 0, 1, 0, /* -Return non-nil if this console is on a window system. +Return t if CONSOLE is on a window system. +If CONSOLE is nil, the selected console is used. This generally means that there is support for the mouse, the menubar, the toolbar, glyphs, etc. */ @@ -866,7 +882,7 @@ void stuff_buffered_input (Lisp_Object stuffstring) { /* stuff_char works only in BSD, versions 4.2 and up. */ -#if defined (BSD) +#if defined (BSD) && defined(HAVE_TTY) if (!CONSOLEP (Vcontrolling_terminal) || !CONSOLE_LIVE_P (XCONSOLE (Vcontrolling_terminal))) return; @@ -876,7 +892,9 @@ stuff_buffered_input (Lisp_Object stuffstring) Extcount count; Extbyte *p; - GET_STRING_EXT_DATA_ALLOCA (stuffstring, FORMAT_KEYBOARD, p, count); + TO_EXTERNAL_FORMAT (LISP_STRING, stuffstring, + ALLOCA, (p, count), + Qkeyboard); while (count-- > 0) stuff_char (XCONSOLE (Vcontrolling_terminal), *p++); stuff_char (XCONSOLE (Vcontrolling_terminal), '\n'); @@ -890,7 +908,7 @@ stuff_buffered_input (Lisp_Object stuffstring) stuff_char (XCONSOLE (Vcontrolling_terminal), *kbd_fetch_ptr++); } # endif -#endif /* BSD */ +#endif /* BSD && HAVE_TTY */ } DEFUN ("suspend-console", Fsuspend_console, 0, 1, "", /* @@ -1011,6 +1029,7 @@ See also `current-input-mode'. TTY_FLAGS (con).flow_control = !NILP (flow); TTY_FLAGS (con).meta_key = meta_key; init_one_console (con); + MARK_FRAME_CHANGED (XFRAME (CONSOLE_SELECTED_FRAME (con))); } #endif @@ -1061,6 +1080,8 @@ The elements of this list correspond to the arguments of void syms_of_console (void) { + INIT_LRECORD_IMPLEMENTATION (console); + DEFSUBR (Fvalid_console_type_p); DEFSUBR (Fconsole_type_list); DEFSUBR (Fcdfw_console); @@ -1096,10 +1117,45 @@ syms_of_console (void) defsymbol (&Qsuspend_resume_hook, "suspend-resume-hook"); } +static const struct lrecord_description cte_description_1[] = { + { XD_LISP_OBJECT, offsetof (console_type_entry, symbol) }, + { XD_STRUCT_PTR, offsetof (console_type_entry, meths), 1, &console_methods_description }, + { XD_END } +}; + +static const struct struct_description cte_description = { + sizeof (console_type_entry), + cte_description_1 +}; + +static const struct lrecord_description cted_description_1[] = { + XD_DYNARR_DESC (console_type_entry_dynarr, &cte_description), + { XD_END } +}; + +const struct struct_description cted_description = { + sizeof (console_type_entry_dynarr), + cted_description_1 +}; + +static const struct lrecord_description console_methods_description_1[] = { + { XD_LISP_OBJECT, offsetof (struct console_methods, symbol) }, + { XD_LISP_OBJECT, offsetof (struct console_methods, predicate_symbol) }, + { XD_LISP_OBJECT, offsetof (struct console_methods, image_conversion_list) }, + { XD_END } +}; + +const struct struct_description console_methods_description = { + sizeof (struct console_methods), + console_methods_description_1 +}; + + void console_type_create (void) { the_console_type_entry_dynarr = Dynarr_new (console_type_entry); + dump_add_root_struct_ptr (&the_console_type_entry_dynarr, &cted_description); Vconsole_type_list = Qnil; staticpro (&Vconsole_type_list); @@ -1114,8 +1170,19 @@ console_type_create (void) } void +reinit_vars_of_console (void) +{ + staticpro_nodump (&Vconsole_list); + Vconsole_list = Qnil; + staticpro_nodump (&Vselected_console); + Vselected_console = Qnil; +} + +void vars_of_console (void) { + reinit_vars_of_console (); + DEFVAR_LISP ("create-console-hook", &Vcreate_console_hook /* Function or functions to call when a console is created. One argument, the newly-created console. @@ -1131,26 +1198,33 @@ One argument, the to-be-deleted console. */ ); Vdelete_console_hook = Qnil; - staticpro (&Vconsole_list); - Vconsole_list = Qnil; - staticpro (&Vselected_console); - Vselected_console = Qnil; - #ifdef HAVE_WINDOW_SYSTEM Fprovide (intern ("window-system")); #endif } /* The docstrings for DEFVAR_* are recorded externally by make-docfile. */ - -/* Declaring this stuff as const produces 'Cannot reinitialize' messages - from SunPro C's fix-and-continue feature (a way neato feature that - makes debugging unbelievably more bearable) */ #define DEFVAR_CONSOLE_LOCAL_1(lname, field_name, forward_type, magicfun) do { \ - static CONST_IF_NOT_DEBUG struct symbol_value_forward I_hate_C \ - = { { { symbol_value_forward_lheader_initializer, \ - (struct lcrecord_header *) &(console_local_flags.field_name), 69 }, \ - forward_type }, magicfun }; \ + static const struct symbol_value_forward I_hate_C = \ + { /* struct symbol_value_forward */ \ + { /* struct symbol_value_magic */ \ + { /* struct lcrecord_header */ \ + { /* struct lrecord_header */ \ + lrecord_type_symbol_value_forward, /* lrecord_type_index */ \ + 1, /* mark bit */ \ + 1, /* c_readonly bit */ \ + 1 /* lisp_readonly bit */ \ + }, \ + 0, /* next */ \ + 0, /* uid */ \ + 0 /* free */ \ + }, \ + &(console_local_flags.field_name), \ + forward_type \ + }, \ + magicfun \ + }; \ + \ { \ int offset = ((char *)symbol_value_forward_forward (&I_hate_C) \ - (char *)&console_local_flags); \ @@ -1184,13 +1258,13 @@ nuke_all_console_slots (struct console *con, Lisp_Object zap) { zero_lcrecord (con); -#define MARKED_SLOT(x) con->x = (zap); +#define MARKED_SLOT(x) con->x = zap #include "conslots.h" #undef MARKED_SLOT } -void -complex_vars_of_console (void) +static void +common_init_complex_vars_of_console (void) { /* Make sure all markable slots in console_defaults are initialized reasonably, so mark_console won't choke. @@ -1198,8 +1272,8 @@ complex_vars_of_console (void) struct console *defs = alloc_lcrecord_type (struct console, &lrecord_console); struct console *syms = alloc_lcrecord_type (struct console, &lrecord_console); - staticpro (&Vconsole_defaults); - staticpro (&Vconsole_local_symbols); + staticpro_nodump (&Vconsole_defaults); + staticpro_nodump (&Vconsole_local_symbols); XSETCONSOLE (Vconsole_defaults, defs); XSETCONSOLE (Vconsole_local_symbols, syms); @@ -1254,6 +1328,53 @@ complex_vars_of_console (void) currently allowable due to the XINT() handling of this value. With some rearrangement you can get 4 more bits. */ } +} + + +#define CONSOLE_SLOTS_SIZE (offsetof (struct console, CONSOLE_SLOTS_LAST_NAME) - offsetof (struct console, CONSOLE_SLOTS_FIRST_NAME) + sizeof (Lisp_Object)) +#define CONSOLE_SLOTS_COUNT (CONSOLE_SLOTS_SIZE / sizeof (Lisp_Object)) + +void +reinit_complex_vars_of_console (void) +{ + struct console *defs, *syms; + + common_init_complex_vars_of_console (); + + defs = XCONSOLE (Vconsole_defaults); + syms = XCONSOLE (Vconsole_local_symbols); + memcpy (&defs->CONSOLE_SLOTS_FIRST_NAME, + console_defaults_saved_slots, + CONSOLE_SLOTS_SIZE); + memcpy (&syms->CONSOLE_SLOTS_FIRST_NAME, + console_local_symbols_saved_slots, + CONSOLE_SLOTS_SIZE); +} + + +static const struct lrecord_description console_slots_description_1[] = { + { XD_LISP_OBJECT_ARRAY, 0, CONSOLE_SLOTS_COUNT }, + { XD_END } +}; + +static const struct struct_description console_slots_description = { + CONSOLE_SLOTS_SIZE, + console_slots_description_1 +}; + +void +complex_vars_of_console (void) +{ + struct console *defs, *syms; + + common_init_complex_vars_of_console (); + + defs = XCONSOLE (Vconsole_defaults); + syms = XCONSOLE (Vconsole_local_symbols); + console_defaults_saved_slots = &defs->CONSOLE_SLOTS_FIRST_NAME; + console_local_symbols_saved_slots = &syms->CONSOLE_SLOTS_FIRST_NAME; + dump_add_root_struct_ptr (&console_defaults_saved_slots, &console_slots_description); + dump_add_root_struct_ptr (&console_local_symbols_saved_slots, &console_slots_description); DEFVAR_CONSOLE_DEFAULTS ("default-function-key-map", function_key_map /* Default value of `function-key-map' for consoles that don't override it. @@ -1270,7 +1391,7 @@ The `read-key-sequence' function replaces any subsequence bound by keymaps have no binding for the current key sequence but `function-key-map' binds a suffix of the sequence to a vector or string, `read-key-sequence' replaces the matching suffix with its binding, and -continues with the new sequence. +continues with the new sequence. See `key-binding'. The events that come from bindings in `function-key-map' are not themselves looked up in `function-key-map'. @@ -1284,7 +1405,7 @@ were a prefix key, typing `ESC O P x' would return */ ); #ifdef HAVE_TTY - /* ### Should this somehow go to TTY data? How do we make it + /* #### Should this somehow go to TTY data? How do we make it accessible from Lisp, then? */ DEFVAR_CONSOLE_LOCAL ("tty-erase-char", tty_erase_char /* The ERASE character as set by the user with stty. @@ -1293,14 +1414,14 @@ consoles, for example), it is set to nil. */ ); #endif - /* While this should be CONST it can't be because some things + /* While this should be const it can't be because some things (i.e. edebug) do manipulate it. */ DEFVAR_CONSOLE_LOCAL ("defining-kbd-macro", defining_kbd_macro /* -Non-nil while a console macro is being defined. Don't set this! +Non-nil while a keyboard macro is being defined. Don't set this! */ ); DEFVAR_CONSOLE_LOCAL ("last-kbd-macro", last_kbd_macro /* -Last kbd macro defined, as a vector of events; nil if none defined. +Last keyboard macro defined, as a vector of events; nil if none defined. */ ); DEFVAR_CONSOLE_LOCAL ("prefix-arg", prefix_arg /* @@ -1344,7 +1465,7 @@ buffer's local map, and the minor mode keymaps and text property keymaps. if ((XINT (console_local_flags.slot) != -2 && \ XINT (console_local_flags.slot) != -3) \ != !(NILP (XCONSOLE (Vconsole_local_symbols)->slot))) \ - abort () + ABORT () #include "conslots.h" #undef MARKED_SLOT }