aboutsummaryrefslogtreecommitdiffstats
path: root/src/window.c
diff options
context:
space:
mode:
authorPaul Eggert2013-07-16 14:35:45 -0700
committerPaul Eggert2013-07-16 14:35:45 -0700
commit27e498e6e5fea8ac64c90ac13678b537b7b12302 (patch)
treede676dbd21308870ecf762376135433e59161917 /src/window.c
parentac72c08d12cb5b86e873148ce52c2403ef2159c6 (diff)
downloademacs-27e498e6e5fea8ac64c90ac13678b537b7b12302.tar.gz
emacs-27e498e6e5fea8ac64c90ac13678b537b7b12302.zip
New unwind-protect flavors to better type-check C callbacks.
This also lessens the need to write wrappers for callbacks, and the need for make_save_pointer. * alloca.c (free_save_value): * atimer.c (run_all_atimers): Now extern. * alloc.c (safe_alloca_unwind): * atimer.c (unwind_stop_other_atimers): * keyboard.c (cancel_hourglass_unwind) [HAVE_WINDOW_SYSTEM]: * menu.c (cleanup_popup_menu) [HAVE_NS]: * minibuf.c (choose_minibuf_frame_1): * process.c (make_serial_process_unwind): * xdisp.h (pop_message_unwind): * xselect.c (queue_selection_requests_unwind): Remove no-longer-needed wrapper. All uses replaced by the wrappee. * alloca.c (record_xmalloc): Prefer record_unwind_protect_ptr to record_unwind_protect with make_save_pointer. * alloca.c (Fgarbage_collect): Prefer record_unwind_protect_void to passing a dummy. * buffer.c (restore_buffer): * window.c (restore_window_configuration): * xfns.c, w32fns.c (do_unwind_create_frame) New wrapper. All record-unwind uses of wrappee changed. * buffer.c (set_buffer_if_live): * callproc.c (call_process_cleanup, delete_temp_file): * coding.c (code_conversion_restore): * dired.c (directory_files_internal_w32_unwind) [WINDOWSNT]: * editfns.c (save_excursion_restore) (subst_char_in_region_unwind, subst_char_in_region_unwind_1) (save_restriction_restore): * eval.c (restore_stack_limits, un_autoload): * fns.c (require_unwind): * keyboard.c (recursive_edit_unwind, tracking_off): * lread.c (record_load_unwind, load_warn_old_style_backquotes): * macros.c (pop_kbd_macro, restore_menu_items): * nsfns.m (unwind_create_frame): * print.c (print_unwind): * process.c (start_process_unwind): * search.c (unwind_set_match_data): * window.c (select_window_norecord, select_frame_norecord): * xdisp.c (unwind_with_echo_area_buffer, unwind_format_mode_line) (fast_set_selected_frame): * xfns.c, w32fns.c (unwind_create_tip_frame): Return void, not a dummy Lisp_Object. All uses changed. * buffer.h (set_buffer_if_live): Move decl here from lisp.h. * callproc.c (call_process_kill): * fileio.c (restore_point_unwind, decide_coding_unwind) (build_annotations_unwind): * insdel.c (Fcombine_after_change_execute_1): * keyboard.c (read_char_help_form_unwind): * menu.c (unuse_menu_items): * minibuf.c (run_exit_minibuf_hook, read_minibuf_unwind): * sound.c (sound_cleanup): * xdisp.c (unwind_redisplay): * xfns.c (clean_up_dialog): * xselect.c (x_selection_request_lisp_error, x_catch_errors_unwind): Accept no args and return void, instead of accepting and returning a dummy Lisp_Object. All uses changed. * cygw32.c (fchdir_unwind): * fileio.c (close_file_unwind): * keyboard.c (restore_kboard_configuration): * lread.c (readevalllop_1): * process.c (wait_reading_process_output_unwind): Accept int and return void, rather than accepting an Emacs integer and returning a dummy object. In some cases this fixes an unlikely bug when the corresponding int is outside Emacs integer range. All uses changed. * dired.c (directory_files_internal_unwind): * fileio.c (do_auto_save_unwind): * gtkutil.c (pop_down_dialog): * insdel.c (reset_var_on_error): * lread.c (load_unwind): * xfns.c (clean_up_file_dialog): * xmenu.c, nsmenu.m (pop_down_menu): * xmenu.c (cleanup_widget_value_tree): * xselect.c (wait_for_property_change_unwind): Accept pointer and return void, rather than accepting an Emacs save value encapsulating the pointer and returning a dummy object. All uses changed. * editfns.c (Fformat): Update the saved pointer directly via set_unwind_protect_ptr rather than indirectly via make_save_pointer. * eval.c (specpdl_func): Remove. All uses replaced by definiens. (unwind_body): New function. (record_unwind_protect): First arg is now a function returning void, not a dummy Lisp_Object. (record_unwind_protect_ptr, record_unwind_protect_int) (record_unwind_protect_void): New functions. (unbind_to): Support SPECPDL_UNWIND_PTR etc. * fileio.c (struct auto_save_unwind): New type. (do_auto_save_unwind): Use it. (do_auto_save_unwind_1): Remove; subsumed by new do_auto_save_unwind. * insdel.c (struct rvoe_arg): New type. (reset_var_on_error): Use it. * lisp.h (SPECPDL_UNWIND_PTR, SPECPDL_UNWIND_INT, SPECPDL_UNWIND_VOID): New constants. (specbinding_func): Remove; there are now several such functions. (union specbinding): New members unwind_ptr, unwind_int, unwind_void. (set_unwind_protect_ptr): New function. * xselect.c: Remove unnecessary forward decls, to simplify maintenance.
Diffstat (limited to 'src/window.c')
-rw-r--r--src/window.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/window.c b/src/window.c
index 22da72db2b7..2ff149ed4fa 100644
--- a/src/window.c
+++ b/src/window.c
@@ -3086,18 +3086,18 @@ run_funs (Lisp_Object funs)
3086 call0 (XCAR (funs)); 3086 call0 (XCAR (funs));
3087} 3087}
3088 3088
3089static Lisp_Object 3089static void
3090select_window_norecord (Lisp_Object window) 3090select_window_norecord (Lisp_Object window)
3091{ 3091{
3092 return WINDOW_LIVE_P (window) 3092 if (WINDOW_LIVE_P (window))
3093 ? Fselect_window (window, Qt) : selected_window; 3093 Fselect_window (window, Qt);
3094} 3094}
3095 3095
3096static Lisp_Object 3096static void
3097select_frame_norecord (Lisp_Object frame) 3097select_frame_norecord (Lisp_Object frame)
3098{ 3098{
3099 return FRAME_LIVE_P (XFRAME (frame)) 3099 if (FRAME_LIVE_P (XFRAME (frame)))
3100 ? Fselect_frame (frame, Qt) : selected_frame; 3100 Fselect_frame (frame, Qt);
3101} 3101}
3102 3102
3103void 3103void
@@ -3410,7 +3410,7 @@ temp_output_buffer_show (register Lisp_Object buf)
3410 Note: Both Fselect_window and select_window_norecord may 3410 Note: Both Fselect_window and select_window_norecord may
3411 set-buffer to the buffer displayed in the window, 3411 set-buffer to the buffer displayed in the window,
3412 so we need to save the current buffer. --stef */ 3412 so we need to save the current buffer. --stef */
3413 record_unwind_protect (Fset_buffer, prev_buffer); 3413 record_unwind_protect (restore_buffer, prev_buffer);
3414 record_unwind_protect (select_window_norecord, prev_window); 3414 record_unwind_protect (select_window_norecord, prev_window);
3415 Fselect_window (window, Qt); 3415 Fselect_window (window, Qt);
3416 Fset_buffer (w->contents); 3416 Fset_buffer (w->contents);
@@ -5873,6 +5873,12 @@ the return value is nil. Otherwise the value is t. */)
5873 return (FRAME_LIVE_P (f) ? Qt : Qnil); 5873 return (FRAME_LIVE_P (f) ? Qt : Qnil);
5874} 5874}
5875 5875
5876void
5877restore_window_configuration (Lisp_Object configuration)
5878{
5879 Fset_window_configuration (configuration);
5880}
5881
5876 5882
5877/* If WINDOW is an internal window, recursively delete all child windows 5883/* If WINDOW is an internal window, recursively delete all child windows
5878 reachable via the next and contents slots of WINDOW. Otherwise setup 5884 reachable via the next and contents slots of WINDOW. Otherwise setup