# HG changeset patch # User Karoly Lorentey # Date 1126408542 0 # Node ID 5272862a4865d609a49fdc9b581d9491c0a3b9d4 # Parent d2e0850b17f23428d416ec3880f1eaebb8c07a33 Fix crashes in xdialog_show (and other places) with xterm-mouse-mode. * src/dispextern.h (get_tty_device): Declare. * src/dispnew.c (Fsend_string_to_terminal): Add optional TERMINAL parameter. * src/fns.c (Fy_or_n_p, Fyes_or_no_p): Don't try to open an X dialog on tty terminals. * src/term.c (get_tty_device): Remove static qualifier. * src/xmenu.c (create_and_show_dialog, create_and_show_popup_menu) (free_frame_menubar, mouse_position_for_popup, set_frame_menubar) (update_frame_menubar, x_activate_menubar, xdialog_show, xmenu_show): Abort when given a non-X frame. * src/xmenu.c (Fx_popup_menu, Fx_popup_dialog): Throw an error when run on a non-X frame. git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-410 diff -r d2e0850b17f2 -r 5272862a4865 src/dispextern.h --- a/src/dispextern.h Sun Sep 11 03:06:33 2005 +0000 +++ b/src/dispextern.h Sun Sep 11 03:15:42 2005 +0000 @@ -2930,6 +2930,7 @@ extern void set_tty_color_mode P_ ((struct frame *, Lisp_Object)); extern void tty_setup_colors P_ ((struct tty_display_info *, int)); extern struct device *get_device P_ ((Lisp_Object display, int)); +extern struct device *get_tty_device P_ ((Lisp_Object terminal)); extern struct device *get_named_tty P_ ((char *)); EXFUN (Fdisplay_tty_type, 1); extern struct device *init_initial_device P_ ((void)); diff -r d2e0850b17f2 -r 5272862a4865 src/dispnew.c --- a/src/dispnew.c Sun Sep 11 03:06:33 2005 +0000 +++ b/src/dispnew.c Sun Sep 11 03:15:42 2005 +0000 @@ -6285,21 +6285,27 @@ DEFUN ("send-string-to-terminal", Fsend_string_to_terminal, - Ssend_string_to_terminal, 1, 1, 0, + Ssend_string_to_terminal, 1, 2, 0, doc: /* Send STRING to the terminal without alteration. -Control characters in STRING will have terminal-dependent effects. */) - (string) +Control characters in STRING will have terminal-dependent effects. + +Optional parameter TERMINAL specifies the tty display device to use. +It may be a terminal id, a frame, or nil for the terminal used by the +currently selected frame. */) + (string, display) Lisp_Object string; + Lisp_Object display; { + struct device *d = get_tty_device (display); struct tty_display_info *tty; /* ??? Perhaps we should do something special for multibyte strings here. */ CHECK_STRING (string); - if (! FRAME_TERMCAP_P (SELECTED_FRAME ())) - error ("Current frame is not on a tty device"); - - tty = CURTTY (); + if (!d) + error ("Unknown display device"); + + tty = d->display_info.tty; if (tty->termscript) { diff -r d2e0850b17f2 -r 5272862a4865 src/fns.c --- a/src/fns.c Sun Sep 11 03:06:33 2005 +0000 +++ b/src/fns.c Sun Sep 11 03:15:42 2005 +0000 @@ -3267,7 +3267,8 @@ { #ifdef HAVE_MENUS - if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event)) + if (FRAME_WINDOW_P (SELECTED_FRAME ()) + && (NILP (last_nonmenu_event) || CONSP (last_nonmenu_event)) && use_dialog_box && have_menus_p ()) { @@ -3398,7 +3399,8 @@ CHECK_STRING (prompt); #ifdef HAVE_MENUS - if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event)) + if (FRAME_WINDOW_P (SELECTED_FRAME ()) + && (NILP (last_nonmenu_event) || CONSP (last_nonmenu_event)) && use_dialog_box && have_menus_p ()) { diff -r d2e0850b17f2 -r 5272862a4865 src/term.c --- a/src/term.c Sun Sep 11 03:06:33 2005 +0000 +++ b/src/term.c Sun Sep 11 03:15:42 2005 +0000 @@ -85,8 +85,6 @@ static void tty_show_cursor P_ ((struct tty_display_info *)); static void tty_hide_cursor P_ ((struct tty_display_info *)); -static struct device *get_tty_device (Lisp_Object device); - void delete_initial_device P_ ((struct device *)); void create_tty_output P_ ((struct frame *)); void delete_tty_output P_ ((struct frame *)); @@ -2164,11 +2162,11 @@ /* Return the tty display object specified by DEVICE. */ -static struct device * -get_tty_device (Lisp_Object device) +struct device * +get_tty_device (Lisp_Object terminal) { - struct device *d = get_device (device, 0); - + struct device *d = get_device (terminal, 0); + if (d && d->type == output_initial) d = NULL; diff -r d2e0850b17f2 -r 5272862a4865 src/xmenu.c --- a/src/xmenu.c Sun Sep 11 03:06:33 2005 +0000 +++ b/src/xmenu.c Sun Sep 11 03:15:42 2005 +0000 @@ -705,6 +705,9 @@ Window root, dummy_window; int dummy; + if (! FRAME_X_P (f)) + abort (); + BLOCK_INPUT; XQueryPointer (FRAME_X_DISPLAY (f), @@ -899,6 +902,9 @@ xpos += XINT (x); ypos += XINT (y); + + if (! FRAME_X_P (f)) + error ("Can not put X menu on non-X terminal"); } Vmenu_updating_frame = Qnil; #endif /* HAVE_MENUS */ @@ -1085,6 +1091,9 @@ but I don't want to make one now. */ CHECK_WINDOW (window); + if (! FRAME_X_P (f)) + error ("Can not put X dialog on non-X terminal"); + #if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK) /* Display a menu with these alternatives in the middle of frame F. */ @@ -1302,6 +1311,9 @@ x_activate_menubar (f) FRAME_PTR f; { + if (! FRAME_X_P (f)) + abort (); + if (!f->output_data.x->saved_menu_event->type) return; @@ -1922,9 +1934,14 @@ #ifdef USE_GTK return xg_update_frame_menubar (f); #else - struct x_output *x = f->output_data.x; + struct x_output *x; int columns, rows; + if (! FRAME_X_P (f)) + abort (); + + x = f->output_data.x; + if (!x->menubar_widget || XtIsManaged (x->menubar_widget)) return 0; @@ -1970,7 +1987,7 @@ int first_time; int deep_p; { - xt_or_gtk_widget menubar_widget = f->output_data.x->menubar_widget; + xt_or_gtk_widget menubar_widget; #ifdef USE_X_TOOLKIT LWLIB_ID id; #endif @@ -1980,6 +1997,10 @@ int *submenu_start, *submenu_end; int *submenu_top_level_items, *submenu_n_panes; + if (! FRAME_X_P (f)) + abort (); + + menubar_widget = f->output_data.x->menubar_widget; XSETFRAME (Vmenu_updating_frame, f); @@ -2324,6 +2345,9 @@ { Widget menubar_widget; + if (! FRAME_X_P (f)) + abort (); + menubar_widget = f->output_data.x->menubar_widget; f->output_data.x->menubar_height = 0; @@ -2476,6 +2500,9 @@ struct next_popup_x_y popup_x_y; int specpdl_count = SPECPDL_INDEX (); + if (! FRAME_X_P (f)) + abort (); + xg_crazy_callback_abort = 1; menu = xg_create_widget ("popup", first_wv->name, f, first_wv, G_CALLBACK (popup_selection_callback), @@ -2584,6 +2611,9 @@ LWLIB_ID menu_id; Widget menu; + if (! FRAME_X_P (f)) + abort (); + menu_id = widget_id_tick++; menu = lw_create_widget ("popup", first_wv->name, menu_id, first_wv, f->output_data.x->widget, 1, 0, @@ -2659,6 +2689,9 @@ int first_pane; + if (! FRAME_X_P (f)) + abort (); + *error = NULL; if (menu_items_used <= MENU_ITEMS_PANE_LENGTH) @@ -2941,6 +2974,9 @@ { GtkWidget *menu; + if (! FRAME_X_P (f)) + abort (); + menu = xg_create_widget ("dialog", first_wv->name, f, first_wv, G_CALLBACK (dialog_selection_callback), G_CALLBACK (popup_deactivate_callback), @@ -2990,6 +3026,9 @@ { LWLIB_ID dialog_id; + if (!FRAME_X_P (f)) + abort(); + dialog_id = widget_id_tick++; lw_create_widget (first_wv->name, "dialog", dialog_id, first_wv, f->output_data.x->widget, 1, 0, @@ -3041,6 +3080,9 @@ /* 1 means we've seen the boundary between left-hand elts and right-hand. */ int boundary_seen = 0; + if (! FRAME_X_P (f)) + abort (); + *error_name = NULL; if (menu_items_n_panes > 1) @@ -3308,6 +3350,9 @@ unsigned int dummy_uint; int specpdl_count = SPECPDL_INDEX (); + if (! FRAME_X_P (f)) + abort (); + *error = 0; if (menu_items_n_panes == 0) return Qnil;