Mercurial > emacs
changeset 83569:86395c339701
(w32_set_terminal_modes, w32_reset_terminal_modes):
Add terminal arg.
(x_clear_frame, x_delete_glyphs, w32_ring_bell, x_ins_del_lines):
Add frame arg.
(x_delete_terminal, w32_create_terminal): New functions.
(w32_term_init): Create a terminal.
(w32_initialize): Move terminal specific initialization to
w32_create_terminal.
author | Jason Rumney <jasonr@gnu.org> |
---|---|
date | Tue, 15 May 2007 22:59:04 +0000 |
parents | 21e8c3e3274f |
children | c6328b40e293 |
files | src/w32term.c |
diffstat | 1 files changed, 131 insertions(+), 104 deletions(-) [+] |
line wrap: on
line diff
--- a/src/w32term.c Mon May 14 22:29:58 2007 +0000 +++ b/src/w32term.c Tue May 15 22:59:04 2007 +0000 @@ -235,9 +235,9 @@ int x_compute_min_glyph_bounds P_ ((struct frame *)); static void x_update_end P_ ((struct frame *)); static void w32_frame_up_to_date P_ ((struct frame *)); -static void w32_set_terminal_modes P_ ((void)); -static void w32_reset_terminal_modes P_ ((void)); -static void x_clear_frame P_ ((void)); +static void w32_set_terminal_modes P_ ((struct terminal *)); +static void w32_reset_terminal_modes P_ ((struct terminal *)); +static void x_clear_frame P_ ((struct frame *)); static void frame_highlight P_ ((struct frame *)); static void frame_unhighlight P_ ((struct frame *)); static void x_new_focus_frame P_ ((struct w32_display_info *, @@ -801,7 +801,7 @@ rarely happens). */ static void -w32_set_terminal_modes (void) +w32_set_terminal_modes (struct terminal *term) { } @@ -809,7 +809,7 @@ the W32 windows go away, and suspending requires no action. */ static void -w32_reset_terminal_modes (void) +w32_reset_terminal_modes (struct terminal *term) { } @@ -2608,16 +2608,10 @@ for X frames. */ static void -x_delete_glyphs (n) +x_delete_glyphs (f, n) + struct frame *f; register int n; { - struct frame *f; - - if (updating_frame) - f = updating_frame; - else - f = SELECTED_FRAME (); - if (! FRAME_W32_P (f)) return; @@ -2629,15 +2623,8 @@ frame. Otherwise clear the selected frame. */ static void -x_clear_frame () +x_clear_frame (struct frame *f) { - struct frame *f; - - if (updating_frame) - f = updating_frame; - else - f = SELECTED_FRAME (); - if (! FRAME_W32_P (f)) return; @@ -2664,18 +2651,14 @@ /* Make audible bell. */ static void -w32_ring_bell (void) +w32_ring_bell (struct frame *f) { - struct frame *f; - - f = SELECTED_FRAME (); - BLOCK_INPUT; if (FRAME_W32_P (f) && visible_bell) { int i; - HWND hwnd = FRAME_W32_WINDOW (SELECTED_FRAME ()); + HWND hwnd = FRAME_W32_WINDOW (f); for (i = 0; i < 5; i++) { @@ -2685,7 +2668,7 @@ FlashWindow (hwnd, FALSE); } else - w32_sys_ring_bell (); + w32_sys_ring_bell (f); UNBLOCK_INPUT; } @@ -2712,16 +2695,10 @@ lines or deleting -N lines at vertical position VPOS. */ static void -x_ins_del_lines (vpos, n) +x_ins_del_lines (f, vpos, n) + struct frame *f; int vpos, n; { - struct frame *f; - - if (updating_frame) - f = updating_frame; - else - f = SELECTED_FRAME (); - if (! FRAME_W32_P (f)) return; @@ -5910,14 +5887,13 @@ /* Destroy the window of frame F. */ - +void x_destroy_window (f) struct frame *f; { struct w32_display_info *dpyinfo = FRAME_W32_DISPLAY_INFO (f); x_free_frame_resources (f); - dpyinfo->reference_count--; } @@ -6177,6 +6153,116 @@ return buffer; } +void +x_flush (struct frame * f) +{ /* Nothing to do */ } + + +extern frame_parm_handler w32_frame_parm_handlers[]; + +static struct redisplay_interface w32_redisplay_interface = +{ + w32_frame_parm_handlers, + x_produce_glyphs, + x_write_glyphs, + x_insert_glyphs, + x_clear_end_of_line, + x_scroll_run, + x_after_update_window_line, + x_update_window_begin, + x_update_window_end, + x_cursor_to, + x_flush, + 0, /* flush_display_optional */ + x_clear_window_mouse_face, + w32_get_glyph_overhangs, + x_fix_overlapping_area, + w32_draw_fringe_bitmap, + w32_define_fringe_bitmap, + w32_destroy_fringe_bitmap, + w32_per_char_metric, + w32_encode_char, + NULL, /* w32_compute_glyph_string_overhangs */ + x_draw_glyph_string, + w32_define_frame_cursor, + w32_clear_frame_area, + w32_draw_window_cursor, + w32_draw_vertical_window_border, + w32_shift_glyphs_for_insert +}; + +static void x_delete_terminal (struct terminal *term); + +static struct terminal * +w32_create_terminal (struct w32_display_info *dpyinfo) +{ + struct terminal *terminal; + + terminal = create_terminal (); + + terminal->type = output_w32; + terminal->display_info.w32 = dpyinfo; + dpyinfo->terminal = terminal; + + /* MSVC does not type K&R functions with no arguments correctly, and + so we must explicitly cast them. */ + terminal->clear_frame_hook = x_clear_frame; + terminal->ins_del_lines_hook = x_ins_del_lines; + terminal->delete_glyphs_hook = x_delete_glyphs; + terminal->ring_bell_hook = w32_ring_bell; + terminal->reset_terminal_modes_hook = w32_reset_terminal_modes; + terminal->set_terminal_modes_hook = w32_set_terminal_modes; + terminal->update_begin_hook = x_update_begin; + terminal->update_end_hook = x_update_end; + terminal->set_terminal_window_hook = w32_set_terminal_window; + terminal->read_socket_hook = w32_read_socket; + terminal->frame_up_to_date_hook = w32_frame_up_to_date; + terminal->mouse_position_hook = w32_mouse_position; + terminal->frame_rehighlight_hook = w32_frame_rehighlight; + terminal->frame_raise_lower_hook = w32_frame_raise_lower; + // terminal->fullscreen_hook = XTfullscreen_hook; + terminal->set_vertical_scroll_bar_hook = w32_set_vertical_scroll_bar; + terminal->condemn_scroll_bars_hook = w32_condemn_scroll_bars; + terminal->redeem_scroll_bar_hook = w32_redeem_scroll_bar; + terminal->judge_scroll_bars_hook = w32_judge_scroll_bars; + + terminal->delete_frame_hook = x_destroy_window; + terminal->delete_terminal_hook = x_delete_terminal; + + terminal->rif = &w32_redisplay_interface; + terminal->scroll_region_ok = 1; /* We'll scroll partial frames. */ + terminal->char_ins_del_ok = 1; + terminal->line_ins_del_ok = 1; /* We'll just blt 'em. */ + terminal->fast_clear_end_of_line = 1; /* X does this well. */ + terminal->memory_below_frame = 0; /* We don't remember what scrolls + off the bottom. */ + + return terminal; +} + +static void +x_delete_terminal (struct terminal *terminal) +{ + struct w32_display_info *dpyinfo = terminal->display_info.w32; + int i; + + /* Protect against recursive calls. Fdelete_frame in + delete_terminal calls us back when it deletes our last frame. */ + if (terminal->deleted) + return; + + BLOCK_INPUT; + /* Free the fonts in the font table. */ + for (i = 0; i < dpyinfo->n_fonts; i++) + if (dpyinfo->font_table[i].name) + { + DeleteObject (((XFontStruct*)(dpyinfo->font_table[i].font))->hfont); + } + + x_delete_display (dpyinfo); + UNBLOCK_INPUT; +} + struct w32_display_info * w32_term_init (display_name, xrm_option, resource_name) Lisp_Object display_name; @@ -6184,6 +6270,7 @@ char *resource_name; { struct w32_display_info *dpyinfo; + struct terminal *terminal; HDC hdc; BLOCK_INPUT; @@ -6197,6 +6284,12 @@ w32_initialize_display_info (display_name); dpyinfo = &one_w32_display_info; + terminal = w32_create_terminal (dpyinfo); + + /* Set the name of the terminal. */ + terminal->name = (char *) xmalloc (SBYTES (display_name) + 1); + strncpy (terminal->name, SDATA (display_name), SBYTES (display_name)); + terminal->name[SBYTES (display_name)] = 0; dpyinfo->xrdb = xrm_option ? w32_make_rdb (xrm_option) : NULL; @@ -6257,7 +6350,6 @@ } /* Get rid of display DPYINFO, assuming all frames are already gone. */ - void x_delete_display (dpyinfo) struct w32_display_info *dpyinfo; @@ -6309,73 +6401,8 @@ DWORD WINAPI w32_msg_worker (void * arg); void -x_flush (struct frame * f) -{ /* Nothing to do */ } - -extern frame_parm_handler w32_frame_parm_handlers[]; - -static struct redisplay_interface w32_redisplay_interface = -{ - w32_frame_parm_handlers, - x_produce_glyphs, - x_write_glyphs, - x_insert_glyphs, - x_clear_end_of_line, - x_scroll_run, - x_after_update_window_line, - x_update_window_begin, - x_update_window_end, - x_cursor_to, - x_flush, - 0, /* flush_display_optional */ - x_clear_window_mouse_face, - w32_get_glyph_overhangs, - x_fix_overlapping_area, - w32_draw_fringe_bitmap, - w32_define_fringe_bitmap, - w32_destroy_fringe_bitmap, - w32_per_char_metric, - w32_encode_char, - NULL, /* w32_compute_glyph_string_overhangs */ - x_draw_glyph_string, - w32_define_frame_cursor, - w32_clear_frame_area, - w32_draw_window_cursor, - w32_draw_vertical_window_border, - w32_shift_glyphs_for_insert -}; - -void w32_initialize () { - rif = &w32_redisplay_interface; - - /* MSVC does not type K&R functions with no arguments correctly, and - so we must explicitly cast them. */ - clear_frame_hook = (void (*)(void)) x_clear_frame; - ring_bell_hook = (void (*)(void)) w32_ring_bell; - update_begin_hook = x_update_begin; - update_end_hook = x_update_end; - - read_socket_hook = w32_read_socket; - - frame_up_to_date_hook = w32_frame_up_to_date; - - mouse_position_hook = w32_mouse_position; - frame_rehighlight_hook = w32_frame_rehighlight; - frame_raise_lower_hook = w32_frame_raise_lower; - set_vertical_scroll_bar_hook = w32_set_vertical_scroll_bar; - condemn_scroll_bars_hook = w32_condemn_scroll_bars; - redeem_scroll_bar_hook = w32_redeem_scroll_bar; - judge_scroll_bars_hook = w32_judge_scroll_bars; - - TTY_SCROLL_REGION_OK (CURTTY ()) = 1; /* we'll scroll partial frames */ - TTY_CHAR_INS_DEL_OK (CURTTY ()) = 1; - TTY_LINE_INS_DEL_OK (CURTTY ()) = 1; /* we'll just blt 'em */ - TTY_FAST_CLEAR_END_OF_LINE (CURTTY ()) = 1; /* X does this well */ - TTY_MEMORY_BELOW_FRAME (CURTTY ()) = 0; /* we don't remember what - scrolls off the - bottom */ baud_rate = 19200; w32_system_caret_hwnd = NULL;