X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/59b5141dd7247260cbc383e0bc2afde139d55670..0a2aedfe6d650e825a50f25f972bac20d669f5cb:/src/xselect.c diff --git a/src/xselect.c b/src/xselect.c index b54ddd8323..8de436f119 100644 --- a/src/xselect.c +++ b/src/xselect.c @@ -1,12 +1,12 @@ /* X Selection processing for Emacs. - Copyright (C) 1993-1997, 2000-2015 Free Software Foundation, Inc. + Copyright (C) 1993-1997, 2000-2016 Free Software Foundation, Inc. This file is part of GNU Emacs. GNU Emacs is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. +the Free Software Foundation, either version 3 of the License, or (at +your option) any later version. GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -31,12 +31,8 @@ along with GNU Emacs. If not, see . */ #include "lisp.h" #include "xterm.h" /* for all of the X includes */ -#include "dispextern.h" /* frame.h seems to want this */ #include "frame.h" /* Need this to get the X window of selected_frame */ #include "blockinput.h" -#include "character.h" -#include "buffer.h" -#include "process.h" #include "termhooks.h" #include "keyboard.h" @@ -219,7 +215,7 @@ symbol_to_x_atom (struct x_display_info *dpyinfo, Lisp_Object sym) if (EQ (sym, QDELETE)) return dpyinfo->Xatom_DELETE; if (EQ (sym, QMULTIPLE)) return dpyinfo->Xatom_MULTIPLE; if (EQ (sym, QINCR)) return dpyinfo->Xatom_INCR; - if (EQ (sym, QEMACS_TMP)) return dpyinfo->Xatom_EMACS_TMP; + if (EQ (sym, Q_EMACS_TMP_)) return dpyinfo->Xatom_EMACS_TMP; if (EQ (sym, QTARGETS)) return dpyinfo->Xatom_TARGETS; if (EQ (sym, QNULL)) return dpyinfo->Xatom_NULL; if (!SYMBOLP (sym)) emacs_abort (); @@ -277,7 +273,7 @@ x_atom_to_symbol (struct x_display_info *dpyinfo, Atom atom) if (atom == dpyinfo->Xatom_INCR) return QINCR; if (atom == dpyinfo->Xatom_EMACS_TMP) - return QEMACS_TMP; + return Q_EMACS_TMP_; if (atom == dpyinfo->Xatom_TARGETS) return QTARGETS; if (atom == dpyinfo->Xatom_NULL) @@ -316,7 +312,7 @@ x_own_selection (Lisp_Object selection_name, Lisp_Object selection_value, x_catch_errors (display); XSetSelectionOwner (display, selection_atom, selecting_window, timestamp); x_check_errors (display, "Can't set selection: %s"); - x_uncatch_errors (); + x_uncatch_errors_after_check (); unblock_input (); /* Now update the local cache */ @@ -384,8 +380,6 @@ x_get_local_selection (Lisp_Object selection_symbol, Lisp_Object target_type, CHECK_SYMBOL (target_type); handler_fn = Fcdr (Fassq (target_type, Vselection_converter_alist)); - /* gcpro is not needed here since nothing but HANDLER_FN - is live, and that ought to be a symbol. */ if (!NILP (handler_fn)) value = call3 (handler_fn, @@ -753,7 +747,6 @@ x_reply_selection_request (struct selection_input_event *event, static void x_handle_selection_request (struct selection_input_event *event) { - struct gcpro gcpro1, gcpro2; Time local_selection_time; struct x_display_info *dpyinfo = SELECTION_EVENT_DPYINFO (event); @@ -765,7 +758,6 @@ x_handle_selection_request (struct selection_input_event *event) Lisp_Object local_selection_data; bool success = false; ptrdiff_t count = SPECPDL_INDEX (); - GCPRO2 (local_selection_data, target_symbol); if (!dpyinfo) goto DONE; @@ -849,7 +841,6 @@ x_handle_selection_request (struct selection_input_event *event) selection_symbol, target_symbol, success ? Qt : Qnil); unbind_to (count, Qnil); - UNGCPRO; } /* Perform the requested selection conversion, and write the data to @@ -864,10 +855,8 @@ x_convert_selection (Lisp_Object selection_symbol, Lisp_Object target_symbol, Atom property, bool for_multiple, struct x_display_info *dpyinfo) { - struct gcpro gcpro1; Lisp_Object lisp_selection; struct selection_data *cs; - GCPRO1 (lisp_selection); lisp_selection = x_get_local_selection (selection_symbol, target_symbol, @@ -891,7 +880,6 @@ x_convert_selection (Lisp_Object selection_symbol, converted_selections = cs; } - UNGCPRO; return false; } @@ -904,7 +892,6 @@ x_convert_selection (Lisp_Object selection_symbol, cs->next = converted_selections; converted_selections = cs; lisp_data_to_selection_data (dpyinfo, lisp_selection, cs); - UNGCPRO; return true; } @@ -1188,7 +1175,7 @@ x_get_foreign_selection (Lisp_Object selection_symbol, Lisp_Object target_type, XConvertSelection (display, selection_atom, type_atom, target_property, requestor_window, requestor_time); x_check_errors (display, "Can't convert selection: %s"); - x_uncatch_errors (); + x_uncatch_errors_after_check (); /* Prepare to block until the reply has been read. */ reading_selection_window = requestor_window; @@ -1968,9 +1955,7 @@ On Nextstep, TIME-STAMP and TERMINAL are unused. */) Lisp_Object time_stamp, Lisp_Object terminal) { Lisp_Object val = Qnil; - struct gcpro gcpro1, gcpro2; struct frame *f = frame_for_x_selection (terminal); - GCPRO2 (target_type, val); /* we store newly consed data into these */ CHECK_SYMBOL (selection_symbol); CHECK_SYMBOL (target_type); @@ -1986,8 +1971,8 @@ On Nextstep, TIME-STAMP and TERMINAL are unused. */) { Lisp_Object frame; XSETFRAME (frame, f); - RETURN_UNGCPRO (x_get_foreign_selection (selection_symbol, target_type, - time_stamp, frame)); + return x_get_foreign_selection (selection_symbol, target_type, + time_stamp, frame); } if (CONSP (val) && SYMBOLP (XCAR (val))) @@ -1996,7 +1981,7 @@ On Nextstep, TIME-STAMP and TERMINAL are unused. */) if (CONSP (val) && NILP (XCDR (val))) val = XCAR (val); } - RETURN_UNGCPRO (clean_local_selection_data (val)); + return clean_local_selection_data (val); } DEFUN ("x-disown-selection-internal", Fx_disown_selection_internal, @@ -2147,11 +2132,10 @@ x_clipboard_manager_save (Lisp_Object frame) static Lisp_Object x_clipboard_manager_error_1 (Lisp_Object err) { - Lisp_Object format - = build_string ("X clipboard manager error: %s\n" - "If the problem persists, set " - uLSQM"x-select-enable-clipboard-manager"uRSQM" to nil."); - CALLN (Fmessage, format, CAR (CDR (err))); + AUTO_STRING (format, "X clipboard manager error: %s\n\ +If the problem persists, set `%s' to nil."); + AUTO_STRING (varname, "x-select-enable-clipboard-manager"); + CALLN (Fmessage, format, CAR (CDR (err)), varname); return Qnil; } @@ -2161,8 +2145,8 @@ static Lisp_Object x_clipboard_manager_error_2 (Lisp_Object err) { fprintf (stderr, "Error saving to X clipboard manager.\n\ -If the problem persists, set `x-select-enable-clipboard-manager' \ -to nil.\n"); +If the problem persists, set '%s' \ +to nil.\n", "x-select-enable-clipboard-manager"); return Qnil; } @@ -2283,7 +2267,7 @@ x_fill_property_data (Display *dpy, Lisp_Object data, void *ret, int format) { Lisp_Object o = XCAR (iter); - if (INTEGERP (o) || FLOATP (o) || CONSP (o)) + if (NUMBERP (o) || CONSP (o)) { if (CONSP (o) && RANGED_INTEGERP (X_LONG_MIN >> 16, XCAR (o), X_LONG_MAX >> 16) @@ -2346,10 +2330,11 @@ x_property_data_to_lisp (struct frame *f, const unsigned char *data, Atom type, int format, unsigned long size) { ptrdiff_t format_bytes = format >> 3; - if (PTRDIFF_MAX / format_bytes < size) + ptrdiff_t data_bytes; + if (INT_MULTIPLY_WRAPV (size, format_bytes, &data_bytes)) memory_full (SIZE_MAX); return selection_data_to_lisp_data (FRAME_DISPLAY_INFO (f), data, - size * format_bytes, type, format); + data_bytes, type, format); } DEFUN ("x-get-atom-name", Fx_get_atom_name, @@ -2376,7 +2361,7 @@ If the value is 0 or the atom is not known, return the empty string. */) x_catch_errors (dpy); name = atom ? XGetAtomName (dpy, atom) : empty; had_errors_p = x_had_errors_p (dpy); - x_uncatch_errors (); + x_uncatch_errors_after_check (); if (!had_errors_p) ret = build_string (name); @@ -2559,7 +2544,7 @@ x_send_client_event (Lisp_Object display, Lisp_Object dest, Lisp_Object from, else error ("DEST as a string must be one of PointerWindow or InputFocus"); } - else if (INTEGERP (dest) || FLOATP (dest) || CONSP (dest)) + else if (NUMBERP (dest) || CONSP (dest)) CONS_TO_INTEGER (dest, Window, wdest); else error ("DEST must be a frame, nil, string, number or cons"); @@ -2694,7 +2679,7 @@ A value of 0 means wait as long as necessary. This is initialized from the DEFSYM (QDELETE, "DELETE"); DEFSYM (QMULTIPLE, "MULTIPLE"); DEFSYM (QINCR, "INCR"); - DEFSYM (QEMACS_TMP, "_EMACS_TMP_"); + DEFSYM (Q_EMACS_TMP_, "_EMACS_TMP_"); DEFSYM (QTARGETS, "TARGETS"); DEFSYM (QATOM, "ATOM"); DEFSYM (QCLIPBOARD_MANAGER, "CLIPBOARD_MANAGER");