X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/69c41c4070c86baac11a627e9c3d366420aeb7cc..c2cbbdd1656a20cf979a11cbdd1d0a74e570772f:/src/xterm.c?ds=sidebyside diff --git a/src/xterm.c b/src/xterm.c index b5c5ce33d6..f0f6702cd6 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -21,7 +21,6 @@ along with GNU Emacs. If not, see . */ /* Xt features made by Fred Pierresteguy. */ #include -#include #include #include @@ -29,9 +28,6 @@ along with GNU Emacs. If not, see . */ #include "lisp.h" #include "blockinput.h" - -/* Need syssignal.h for various externs and definitions that may be required - by some configurations for calls to signal later in this source file. */ #include "syssignal.h" /* This may include sys/types.h, and that somehow loses @@ -50,7 +46,6 @@ along with GNU Emacs. If not, see . */ #include "systime.h" #include -#include #include #include #include @@ -166,13 +161,6 @@ struct x_display_info *x_display_list; Lisp_Object x_display_name_list; -/* Frame being updated by update_frame. This is declared in term.c. - This is set by update_begin and looked at by all the XT functions. - It is zero while not inside an update. In that case, the XT - functions assume that `selected_frame' is the frame to apply to. */ - -extern struct frame *updating_frame; - /* This is a frame waiting to be auto-raised, within XTread_socket. */ static struct frame *pending_autoraise_frame; @@ -520,7 +508,7 @@ x_set_frame_alpha (struct frame *f) if (rc == Success && actual != None) { unsigned long value = *(unsigned long *)data; - XFree ((void *) data); + XFree (data); if (value == opac) { x_uncatch_errors (); @@ -1438,12 +1426,12 @@ x_draw_glyphless_glyph_string_foreground (struct glyph_string *s) #ifdef USE_X_TOOLKIT -static struct frame *x_frame_of_widget (Widget); static Boolean cvt_string_to_pixel (Display *, XrmValue *, Cardinal *, XrmValue *, XrmValue *, XtPointer *); static void cvt_pixel_dtor (XtAppContext, XrmValue *, XtPointer, XrmValue *, Cardinal *); +#ifdef USE_LUCID /* Return the frame on which widget WIDGET is used.. Abort if frame cannot be determined. */ @@ -1475,12 +1463,9 @@ x_frame_of_widget (Widget widget) && f->output_data.x->widget == widget) return f; - abort (); + emacs_abort (); } - -#ifdef USE_LUCID - /* Allocate a color which is lighter or darker than *PIXEL by FACTOR or DELTA. Try a color with RGB values multiplied by FACTOR first. If this produces the same color as PIXEL, try a color where all RGB @@ -1496,7 +1481,7 @@ x_alloc_lighter_color_for_widget (Widget widget, Display *display, Colormap cmap return x_alloc_lighter_color (f, display, cmap, pixel, factor, delta); } -#endif +#endif /* USE_LUCID */ /* Structure specifying which arguments should be passed by Xt to @@ -2707,7 +2692,7 @@ x_draw_underwave (struct glyph_string *s) y2 += dy; if (INT_MAX - dx < xmax) - abort (); + emacs_abort (); while (x1 <= xmax) { @@ -2816,7 +2801,7 @@ x_draw_glyph_string (struct glyph_string *s) break; default: - abort (); + emacs_abort (); } if (!s->for_overlaps) @@ -3016,7 +3001,7 @@ x_shift_glyphs_for_insert (struct frame *f, int x, int y, int width, int height, static void x_delete_glyphs (struct frame *f, register int n) { - abort (); + emacs_abort (); } @@ -3289,7 +3274,7 @@ XTset_terminal_window (struct frame *f, int n) static void x_ins_del_lines (struct frame *f, int vpos, int n) { - abort (); + emacs_abort (); } @@ -3588,7 +3573,7 @@ x_frame_rehighlight (struct x_display_info *dpyinfo) : dpyinfo->x_focus_frame); if (! FRAME_LIVE_P (dpyinfo->x_highlight_frame)) { - FRAME_FOCUS_FRAME (dpyinfo->x_focus_frame) = Qnil; + fset_focus_frame (dpyinfo->x_focus_frame, Qnil); dpyinfo->x_highlight_frame = dpyinfo->x_focus_frame; } } @@ -3713,7 +3698,7 @@ x_find_modifier_meanings (struct x_display_info *dpyinfo) dpyinfo->alt_mod_mask &= ~dpyinfo->meta_mod_mask; } - XFree ((char *) syms); + XFree (syms); XFreeModifiermap (mods); } @@ -4126,7 +4111,7 @@ x_window_to_scroll_bar (Display *display, Window window_id) frame = XCAR (tail); /* All elements of Vframe_list should be frames. */ if (! FRAMEP (frame)) - abort (); + emacs_abort (); if (! FRAME_X_P (XFRAME (frame))) continue; @@ -4635,7 +4620,7 @@ x_create_toolkit_scroll_bar (struct frame *f, struct scroll_bar *bar) Widget widget; Arg av[20]; int ac = 0; - char const *scroll_bar_name = SCROLL_BAR_NAME; + const char *scroll_bar_name = SCROLL_BAR_NAME; unsigned long pixel; BLOCK_INPUT; @@ -4665,7 +4650,7 @@ x_create_toolkit_scroll_bar (struct frame *f, struct scroll_bar *bar) } widget = XmCreateScrollBar (f->output_data.x->edit_widget, - scroll_bar_name, av, ac); + (char *) scroll_bar_name, av, ac); /* Add one callback for everything that can happen. */ XtAddCallback (widget, XmNdecrementCallback, xm_scroll_callback, @@ -4960,6 +4945,7 @@ x_scroll_bar_create (struct window *w, int top, int left, int width, int height) struct frame *f = XFRAME (w->frame); struct scroll_bar *bar = ALLOCATE_PSEUDOVECTOR (struct scroll_bar, x_window, PVEC_OTHER); + Lisp_Object barobj; BLOCK_INPUT; @@ -5020,7 +5006,8 @@ x_scroll_bar_create (struct window *w, int top, int left, int width, int height) /* Add bar to its frame's list of scroll bars. */ bar->next = FRAME_SCROLL_BARS (f); bar->prev = Qnil; - XSETVECTOR (FRAME_SCROLL_BARS (f), bar); + XSETVECTOR (barobj, bar); + fset_scroll_bars (f, barobj); if (!NILP (bar->next)) XSETVECTOR (XSCROLL_BAR (bar->next)->prev, bar); @@ -5183,7 +5170,7 @@ x_scroll_bar_remove (struct scroll_bar *bar) #endif /* Dissociate this scroll bar from its window. */ - XWINDOW (bar->window)->vertical_scroll_bar = Qnil; + wset_vertical_scroll_bar (XWINDOW (bar->window), Qnil); UNBLOCK_INPUT; } @@ -5198,6 +5185,7 @@ static void XTset_vertical_scroll_bar (struct window *w, int portion, int whole, int position) { struct frame *f = XFRAME (w->frame); + Lisp_Object barobj; struct scroll_bar *bar; int top, height, left, sb_left, width, sb_width; int window_y, window_height; @@ -5395,7 +5383,8 @@ XTset_vertical_scroll_bar (struct window *w, int portion, int whole, int positio } #endif /* not USE_TOOLKIT_SCROLL_BARS */ - XSETVECTOR (w->vertical_scroll_bar, bar); + XSETVECTOR (barobj, bar); + wset_vertical_scroll_bar (w, barobj); } @@ -5419,12 +5408,12 @@ XTcondemn_scroll_bars (FRAME_PTR frame) { Lisp_Object bar; bar = FRAME_SCROLL_BARS (frame); - FRAME_SCROLL_BARS (frame) = XSCROLL_BAR (bar)->next; + fset_scroll_bars (frame, XSCROLL_BAR (bar)->next); XSCROLL_BAR (bar)->next = FRAME_CONDEMNED_SCROLL_BARS (frame); XSCROLL_BAR (bar)->prev = Qnil; if (! NILP (FRAME_CONDEMNED_SCROLL_BARS (frame))) XSCROLL_BAR (FRAME_CONDEMNED_SCROLL_BARS (frame))->prev = bar; - FRAME_CONDEMNED_SCROLL_BARS (frame) = bar; + fset_condemned_scroll_bars (frame, bar); } } @@ -5437,10 +5426,11 @@ XTredeem_scroll_bar (struct window *window) { struct scroll_bar *bar; struct frame *f; + Lisp_Object barobj; /* We can't redeem this window's scroll bar if it doesn't have one. */ if (NILP (window->vertical_scroll_bar)) - abort (); + emacs_abort (); bar = XSCROLL_BAR (window->vertical_scroll_bar); @@ -5455,11 +5445,11 @@ XTredeem_scroll_bar (struct window *window) return; else if (EQ (FRAME_CONDEMNED_SCROLL_BARS (f), window->vertical_scroll_bar)) - FRAME_CONDEMNED_SCROLL_BARS (f) = bar->next; + fset_condemned_scroll_bars (f, bar->next); else /* If its prev pointer is nil, it must be at the front of one or the other! */ - abort (); + emacs_abort (); } else XSCROLL_BAR (bar->prev)->next = bar->next; @@ -5469,7 +5459,8 @@ XTredeem_scroll_bar (struct window *window) bar->next = FRAME_SCROLL_BARS (f); bar->prev = Qnil; - XSETVECTOR (FRAME_SCROLL_BARS (f), bar); + XSETVECTOR (barobj, bar); + fset_scroll_bars (f, barobj); if (! NILP (bar->next)) XSETVECTOR (XSCROLL_BAR (bar->next)->prev, bar); } @@ -5486,7 +5477,7 @@ XTjudge_scroll_bars (FRAME_PTR f) /* Clear out the condemned list now so we won't try to process any more events on the hapless scroll bars. */ - FRAME_CONDEMNED_SCROLL_BARS (f) = Qnil; + fset_condemned_scroll_bars (f, Qnil); for (; ! NILP (bar); bar = next) { @@ -5556,7 +5547,7 @@ static void x_scroll_bar_handle_click (struct scroll_bar *bar, XEvent *event, struct input_event *emacs_event) { if (! WINDOWP (bar->window)) - abort (); + emacs_abort (); emacs_event->kind = SCROLL_BAR_CLICK_EVENT; emacs_event->code = event->xbutton.button - Button1; @@ -6462,7 +6453,7 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr, } else if (status_return != XLookupKeySym && status_return != XLookupBoth) - abort (); + emacs_abort (); } else nbytes = XLookupString (&event.xkey, (char *) copy_bufptr, @@ -7501,7 +7492,7 @@ x_draw_window_cursor (struct window *w, struct glyph_row *glyph_row, int x, int break; default: - abort (); + emacs_abort (); } } @@ -7771,7 +7762,9 @@ x_connection_signal (int signalnum) /* If we don't have an argument, */ #ifdef USG /* USG systems forget handlers when they are used; must reestablish each time */ - signal (signalnum, x_connection_signal); + struct sigaction action; + emacs_sigaction_init (&action, x_connection_signal); + sigaction (signalnum, &action, 0); #endif /* USG */ } @@ -7832,7 +7825,7 @@ x_connection_closed (Display *dpy, const char *error_message) { /* Set this to t so that delete_frame won't get confused trying to find a replacement. */ - KVAR (FRAME_KBOARD (XFRAME (frame)), Vdefault_minibuffer_frame) = Qt; + kset_default_minibuffer_frame (FRAME_KBOARD (XFRAME (frame)), Qt); delete_frame (frame, Qnoelisp); } @@ -7848,13 +7841,13 @@ x_connection_closed (Display *dpy, const char *error_message) (https://bugzilla.gnome.org/show_bug.cgi?id=85715). Once, the resulting Glib error message loop filled a user's disk. To avoid this, kill Emacs unconditionally on disconnect. */ - shut_down_emacs (0, 0, Qnil); + shut_down_emacs (0, Qnil); fprintf (stderr, "%s\n\ When compiled with GTK, Emacs cannot recover from X disconnects.\n\ This is a GTK bug: https://bugzilla.gnome.org/show_bug.cgi?id=85715\n\ For details, see etc/PROBLEMS.\n", error_msg); - abort (); + emacs_abort (); #endif /* USE_GTK */ /* Indicate that this display is dead. */ @@ -7864,7 +7857,7 @@ For details, see etc/PROBLEMS.\n", dpyinfo->terminal->reference_count--; if (dpyinfo->reference_count != 0) /* We have just closed all frames on this display. */ - abort (); + emacs_abort (); { Lisp_Object tmp; @@ -7881,10 +7874,15 @@ For details, see etc/PROBLEMS.\n", } /* Ordinary stack unwind doesn't deal with these. */ + { + sigset_t unblocked; + sigemptyset (&unblocked); #ifdef SIGIO - sigunblock (sigmask (SIGIO)); + sigaddset (&unblocked, SIGIO); #endif - sigunblock (sigmask (SIGALRM)); + sigaddset (&unblocked, SIGALRM); + pthread_sigmask (SIG_UNBLOCK, &unblocked, 0); + } TOTALLY_UNBLOCK_INPUT; unbind_to (idx, Qnil); @@ -10112,7 +10110,7 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) { terminal->kboard = xmalloc (sizeof *terminal->kboard); init_kboard (terminal->kboard); - KVAR (terminal->kboard, Vwindow_system) = Qx; + kset_window_system (terminal->kboard, Qx); /* Add the keyboard to the list before running Lisp code (via Qvendor_specific_keysyms below), since these are not traced @@ -10134,9 +10132,10 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) /* Temporarily hide the partially initialized terminal. */ terminal_list = terminal->next_terminal; UNBLOCK_INPUT; - KVAR (terminal->kboard, Vsystem_key_alist) - = call1 (Qvendor_specific_keysyms, - vendor ? build_string (vendor) : empty_unibyte_string); + kset_system_key_alist + (terminal->kboard, + call1 (Qvendor_specific_keysyms, + vendor ? build_string (vendor) : empty_unibyte_string)); BLOCK_INPUT; terminal->next_terminal = terminal_list; terminal_list = terminal; @@ -10402,13 +10401,10 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) connection = ConnectionNumber (dpyinfo->display); dpyinfo->connection = connection; - - { - dpyinfo->gray - = XCreatePixmapFromBitmapData (dpyinfo->display, dpyinfo->root_window, - gray_bits, gray_width, gray_height, - 1, 0, 1); - } + dpyinfo->gray + = XCreatePixmapFromBitmapData (dpyinfo->display, dpyinfo->root_window, + gray_bits, gray_width, gray_height, + 1, 0, 1); #ifdef HAVE_X_I18N xim_initialize (dpyinfo, resource_name); @@ -10443,7 +10439,7 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) to.addr = (XPointer)&font; x_catch_errors (dpy); if (!XtCallConverter (dpy, XtCvtStringToFont, &d, 1, &fr, &to, NULL)) - abort (); + emacs_abort (); if (x_had_errors_p (dpy) || !XQueryFont (dpy, font)) XrmPutLineResource (&xrdb, "Emacs.dialog.*.font: 9x15"); x_uncatch_errors (); @@ -10609,8 +10605,6 @@ x_activate_timeout_atimer (void) /* Set up use of X before we make the first connection. */ -extern frame_parm_handler x_frame_parm_handlers[]; - static struct redisplay_interface x_redisplay_interface = { x_frame_parm_handlers, @@ -10768,6 +10762,8 @@ x_create_terminal (struct x_display_info *dpyinfo) void x_initialize (void) { + struct sigaction action; + baud_rate = 19200; x_noop_count = 0; @@ -10814,9 +10810,8 @@ x_initialize (void) XSetErrorHandler (x_error_handler); XSetIOErrorHandler (x_io_error_quitter); - signal (SIGPIPE, x_connection_signal); - - xgselect_initialize (); + emacs_sigaction_init (&action, x_connection_signal); + sigaction (SIGPIPE, &action, 0); }