annotate src/select-gtk.c @ 844:047d37eb70d7

[xemacs-hg @ 2002-05-16 13:30:23 by ben] ui fixes for things that were bothering me bytecode.c, editfns.c, lisp.h, lread.c: Fix save-restriction to use markers rather than pseudo-markers (integers representing the amount of text on either side of the region). That way, all inserts are handled correctly, not just those inside old restriction. Add buffer argument to save_restriction_save(). process.c: Clean up very dirty and kludgy code that outputs into a buffer -- use proper unwind protects, etc. font-lock.c: Do save-restriction/widen around the function -- otherwise, incorrect results will ensue when a buffer has been narrowed before a call to e.g. `buffer-syntactic-context' -- something that happens quite often. fileio.c: Look for a handler for make-temp-name. window.c, winslots.h: Try to solve this annoying problem: have two frames displaying the buffer, in different places; in one, temporarily switch away to another buffer and then back -- and you've lost your position; it's reset to the other one in the other frame. My current solution involves window-level caches of buffers and points (also a cache for window-start); when set-window-buffer is called, it looks to see if the buffer was previously visited in the window, and if so, uses the most recent point at that time. (It's a marker, so it handles changes.) #### Note: It could be argued that doing it on the frame level would be better -- e.g. if you visit a buffer temporarily through a grep, and then go back to that buffer, you presumably want the grep's position rather than some previous position provided everything was in the same frame, even though the grep was in another window in the frame. However, doing it on the frame level fails when you have two windows on the same frame. Perhaps we keep both a window and a frame cache, and use the frame cache if there are no other windows on the frame showing the buffer, else the window's cache? This is probably something to be configurable using a specifier. Suggestions please please please? window.c: Clean up a bit code that deals with the annoyance of window-point vs. point. dialog.el: Function to ask a multiple-choice question, automatically choosing a dialog box or minibuffer representation as necessary. Generalized version of yes-or-no-p, y-or-n-p. files.el: Use get-user-response to ask "yes/no/diff" question when recovering. "diff" means that a diff is displayed between the current file and the autosave. (Converts/deconverts escape-quoted as necessary. No more complaints from you, Mr. Turnbull!) One known problem: when a dialog is used, it's modal, so you can't scroll the diff. Will fix soon. lisp-mode.el: If we're filling a string, don't treat semicolon as a comment, which would give very unfriendly results. Uses `buffer-syntactic-context'. simple.el: all changes back to the beginning. (Useful if you've saved the file in the middle of the changes.) simple.el: Add option kill-word-into-kill-ring, which controls whether words deleted with kill-word, backward-kill-word, etc. are "cut" into the kill ring, or "cleared" into nothingness. (My preference is the latter, by far. I'd almost go so far as suggesting we make it the default, as you can always select a word and then cut it if you want it cut.) menubar-items.el: Add option corresponding to kill-word-into-kill-ring.
author ben
date Thu, 16 May 2002 13:30:58 +0000
parents e38acbeb1cae
children 804517e16990
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1 /* GTK selection processing for XEmacs
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2 Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 746
diff changeset
3 Copyright (C) 2001 Ben Wing.
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
4
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
5 This file is part of XEmacs.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
6
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
7 XEmacs is free software; you can redistribute it and/or modify it
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
9 Free Software Foundation; either version 2, or (at your option) any
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
10 later version.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
11
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
15 for more details.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
16
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
18 along with XEmacs; see the file COPYING. If not, write to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
20 Boston, MA 02111-1307, USA. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
21
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
22 /* Synched up with: Not synched with FSF. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
23
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
24 /* Authorship:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
25
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
26 Written by Kevin Gallo for FSF Emacs.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
27 Rewritten for mswindows by Jonathan Harris, December 1997 for 21.0.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
28 Rewritten for GTK by William Perry, April 2000 for 21.1
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
29 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
30
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
31
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
32 #include <config.h>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
33 #include "lisp.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
34 #include "events.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
35 #include "buffer.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
36 #include "device.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
37 #include "console-gtk.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
38 #include "select.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
39 #include "opaque.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
40 #include "frame.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
41
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
42 static Lisp_Object Vretrieved_selection;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
43 static gboolean waiting_for_selection;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
44 Lisp_Object Vgtk_sent_selection_hooks;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
45
778
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 771
diff changeset
46 extern int lisp_to_time (Lisp_Object, time_t *);
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 771
diff changeset
47 extern Lisp_Object time_to_lisp (time_t);
2923009caf47 [xemacs-hg @ 2002-03-16 10:38:59 by ben]
ben
parents: 771
diff changeset
48
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
49 static GdkAtom
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
50 symbol_to_gtk_atom (struct device *d, Lisp_Object sym, int only_if_exists)
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
51 {
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
52 if (NILP (sym)) return GDK_SELECTION_PRIMARY;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
53 if (EQ (sym, Qt)) return GDK_SELECTION_SECONDARY;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
54 if (EQ (sym, QPRIMARY)) return GDK_SELECTION_PRIMARY;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
55 if (EQ (sym, QSECONDARY)) return GDK_SELECTION_SECONDARY;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
56
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
57 {
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
58 const Extbyte *nameext;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
59 LISP_STRING_TO_EXTERNAL (Fsymbol_name (sym), nameext, Qctext);
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
60 return gdk_atom_intern (nameext, only_if_exists ? TRUE : FALSE);
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
61 }
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
62 }
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
63
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
64 static Lisp_Object
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
65 atom_to_symbol (struct device *d, GdkAtom atom)
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
66 {
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
67 if (atom == GDK_SELECTION_PRIMARY) return (QPRIMARY);
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
68 if (atom == GDK_SELECTION_SECONDARY) return (QSECONDARY);
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
69
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
70 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 746
diff changeset
71 Intbyte *intstr;
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
72 Extbyte *str = gdk_atom_name (atom);
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
73
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
74 if (! str) return Qnil;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
75
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 746
diff changeset
76 EXTERNAL_TO_C_STRING (str, intstr, Qctext);
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
77 g_free (str);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 746
diff changeset
78 return intern_int (intstr);
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
79 }
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
80 }
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
81
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
82 #define PROCESSING_GTK_CODE
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
83 #include "select-common.h"
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
84 #undef PROCESSING_GTK_CODE
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
85
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
86
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
87 /* Set the selection data to GDK_NONE and NULL data, meaning we were
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
88 ** unable to do what they wanted.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
89 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
90 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
91 gtk_decline_selection_request (GtkSelectionData *data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
92 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
93 gtk_selection_data_set (data, GDK_NONE, 0, NULL, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
94 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
95
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
96 /* Used as an unwind-protect clause so that, if a selection-converter signals
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
97 an error, we tell the requestor that we were unable to do what they wanted
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
98 before we throw to top-level or go into the debugger or whatever.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
99 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
100 struct _selection_closure
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
101 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
102 GtkSelectionData *data;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
103 gboolean successful;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
104 };
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
105
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
106 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
107 gtk_selection_request_lisp_error (Lisp_Object closure)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
108 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
109 struct _selection_closure *cl = (struct _selection_closure *)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
110 get_opaque_ptr (closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
111
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
112 free_opaque_ptr (closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
113 if (cl->successful == TRUE)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
114 return Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
115 gtk_decline_selection_request (cl->data);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
116 return Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
117 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
118
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
119 /* This provides the current selection to a requester.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
120 **
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
121 ** This is connected to the selection_get() signal of the application
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
122 ** shell in device-gtk.c:gtk_init_device().
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
123 **
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
124 ** This is radically different than the old selection code (21.1.x),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
125 ** but has been modeled after the X code, and appears to work.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
126 **
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
127 ** WMP Feb 12 2001
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
128 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
129 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
130 emacs_gtk_selection_handle (GtkWidget *widget,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
131 GtkSelectionData *selection_data,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
132 guint info,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
133 guint time_stamp,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
134 gpointer data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
135 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
136 /* This function can GC */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
137 struct gcpro gcpro1, gcpro2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
138 Lisp_Object temp_obj;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
139 Lisp_Object selection_symbol;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
140 Lisp_Object target_symbol = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
141 Lisp_Object converted_selection = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
142 guint32 local_selection_time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
143 Lisp_Object successful_p = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
144 int count;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
145 struct device *d = decode_gtk_device (Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
146 struct _selection_closure *cl = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
147
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
148 GCPRO2 (converted_selection, target_symbol);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
149
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
150 selection_symbol = atom_to_symbol (d, selection_data->selection);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
151 target_symbol = atom_to_symbol (d, selection_data->target);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
152
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
153 #if 0 /* #### MULTIPLE doesn't work yet */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
154 if (EQ (target_symbol, QMULTIPLE))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
155 target_symbol = fetch_multiple_target (selection_data);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
156 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
157
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
158 temp_obj = Fget_selection_timestamp (selection_symbol);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
159
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
160 if (NILP (temp_obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
161 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
162 /* We don't appear to have the selection. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
163 gtk_decline_selection_request (selection_data);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
164
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
165 goto DONE_LABEL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
166 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
167
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
168 local_selection_time = * (guint32 *) XOPAQUE_DATA (temp_obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
169
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
170 if (time_stamp != GDK_CURRENT_TIME &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
171 local_selection_time > time_stamp)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
172 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
173 /* Someone asked for the selection, and we have one, but not the one
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
174 they're looking for. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
175 gtk_decline_selection_request (selection_data);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
176 goto DONE_LABEL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
177 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
178
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
179 converted_selection = select_convert_out (selection_symbol,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
180 target_symbol, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
181
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
182 /* #### Is this the right thing to do? I'm no X expert. -- ajh */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
183 if (NILP (converted_selection))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
184 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
185 /* We don't appear to have a selection in that data type. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
186 gtk_decline_selection_request (selection_data);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
187 goto DONE_LABEL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
188 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
189
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
190 count = specpdl_depth ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
191
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
192 cl = (struct _selection_closure *) xmalloc (sizeof (*cl));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
193 cl->data = selection_data;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
194 cl->successful = FALSE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
195
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
196 record_unwind_protect (gtk_selection_request_lisp_error,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
197 make_opaque_ptr (cl));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
198
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
199 {
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
200 UChar_Binary *data;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
201 Bytecount size;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
202 int format;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
203 GdkAtom type;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
204 lisp_data_to_selection_data (d, converted_selection,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
205 &data, &type, &size, &format);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
206
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
207 gtk_selection_data_set (selection_data, type, format, data,
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
208 /* #### is this right? */
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
209 (unsigned int) size);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
210 successful_p = Qt;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
211 /* Tell x_selection_request_lisp_error() it's cool. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
212 cl->successful = TRUE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
213 xfree (data);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
214 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
215
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 746
diff changeset
216 unbind_to (count);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
217
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
218 DONE_LABEL:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
219
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
220 if (cl) xfree (cl);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
221
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
222 UNGCPRO;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
223
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
224 /* Let random lisp code notice that the selection has been asked for. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
225 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
226 Lisp_Object val = Vgtk_sent_selection_hooks;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
227 if (!UNBOUNDP (val) && !NILP (val))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
228 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
229 Lisp_Object rest;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
230 if (CONSP (val) && !EQ (XCAR (val), Qlambda))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
231 for (rest = val; !NILP (rest); rest = Fcdr (rest))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
232 call3 (Fcar (rest), selection_symbol, target_symbol, successful_p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
233 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
234 call3 (val, selection_symbol, target_symbol, successful_p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
235 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
236 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
237 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
238
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
239
746
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
240 void
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
241 emacs_gtk_selection_clear_event_handle (GtkWidget *widget,
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
242 GdkEventSelection *event,
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
243 gpointer data)
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
244 {
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
245 GdkAtom selection = event->selection;
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
246 guint32 changed_owner_time = event->time;
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
247 struct device *d = decode_gtk_device (Qnil);
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
248
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
249 Lisp_Object selection_symbol, local_selection_time_lisp;
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
250 guint32 local_selection_time;
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
251
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
252 selection_symbol = atom_to_symbol (d, selection);
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
253
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
254 local_selection_time_lisp = Fget_selection_timestamp (selection_symbol);
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
255
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
256 /* We don't own the selection, so that's fine. */
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
257 if (NILP (local_selection_time_lisp))
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
258 return;
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
259
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
260 local_selection_time = *(guint32 *) XOPAQUE_DATA (local_selection_time_lisp);
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
261
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
262 /* This SelectionClear is for a selection that we no longer own, so we can
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
263 disregard it. (That is, we have reasserted the selection since this
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
264 request was generated.)
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
265 */
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
266 if (changed_owner_time != GDK_CURRENT_TIME &&
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
267 local_selection_time > changed_owner_time)
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
268 return;
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
269
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
270 handle_selection_clear (selection_symbol);
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
271 }
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
272
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
273
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
274
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
275 static GtkWidget *reading_selection_reply;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
276 static GdkAtom reading_which_selection;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
277 static int selection_reply_timed_out;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
278
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
279 /* Gets the current selection owned by another application */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
280 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
281 emacs_gtk_selection_received (GtkWidget *widget,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
282 GtkSelectionData *selection_data,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
283 gpointer user_data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
284 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
285 waiting_for_selection = FALSE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
286 Vretrieved_selection = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
287
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
288 reading_selection_reply = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
289
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
290 signal_fake_event ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
291
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
292 if (selection_data->length < 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
293 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
294 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
295 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
296
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
297 Vretrieved_selection =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
298 selection_data_to_lisp_data (NULL,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
299 selection_data->data,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
300 selection_data->length,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
301 selection_data->type,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
302 selection_data->format);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
303 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
304
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
305 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
306 selection_reply_done (void *ignore)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
307 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
308 return !reading_selection_reply;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
309 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
310
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
311 /* Do protocol to read selection-data from the server.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
312 Converts this to lisp data and returns it.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
313 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
314 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
315 gtk_get_foreign_selection (Lisp_Object selection_symbol,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
316 Lisp_Object target_type)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
317 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
318 /* This function can GC */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
319 struct device *d = decode_gtk_device (Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
320 GtkWidget *requestor = DEVICE_GTK_APP_SHELL (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
321 guint32 requestor_time = DEVICE_GTK_MOUSE_TIMESTAMP (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
322 GdkAtom selection_atom = symbol_to_gtk_atom (d, selection_symbol, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
323 int speccount;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
324 GdkAtom type_atom = symbol_to_gtk_atom (d, (CONSP (target_type) ?
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
325 XCAR (target_type) : target_type), 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
326
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
327 gtk_selection_convert (requestor, selection_atom, type_atom,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
328 requestor_time);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
329
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
330 signal_fake_event ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
331
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
332 /* Block until the reply has been read. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
333 reading_selection_reply = requestor;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
334 reading_which_selection = selection_atom;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
335 selection_reply_timed_out = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
336
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
337 speccount = specpdl_depth ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
338
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
339 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
340 /* add a timeout handler */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
341 if (gtk_selection_timeout > 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
342 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
343 Lisp_Object id = Fadd_timeout (make_int (x_selection_timeout),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
344 Qx_selection_reply_timeout_internal,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
345 Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
346 record_unwind_protect (Fdisable_timeout, id);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
347 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
348 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
349
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
350 /* This is ^Gable */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
351 wait_delaying_user_input (selection_reply_done, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
352
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
353 if (selection_reply_timed_out)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
354 signal_error (Qselection_conversion_error, "timed out waiting for reply from selection owner", Qunbound);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
355
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 746
diff changeset
356 unbind_to (speccount);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
357
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
358 /* otherwise, the selection is waiting for us on the requested property. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
359 return select_convert_in (selection_symbol,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
360 target_type,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
361 Vretrieved_selection);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
362 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
363
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
364
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
365 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
366 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
367 gtk_get_window_property (struct device *d, GtkWidget *window, GdkAtom property,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
368 Extbyte **data_ret, int *bytes_ret,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
369 GdkAtom *actual_type_ret, int *actual_format_ret,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
370 unsigned long *actual_size_ret, int delete_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
371 {
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
372 /* deleted */
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
373 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
374
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
375
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
376 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
377 receive_incremental_selection (Display *display, Window window, Atom property,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
378 /* this one is for error messages only */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
379 Lisp_Object target_type,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
380 unsigned int min_size_bytes,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
381 Extbyte **data_ret, int *size_bytes_ret,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
382 Atom *type_ret, int *format_ret,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
383 unsigned long *size_ret)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
384 {
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
385 /* deleted */
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
386 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
387
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
388
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
389 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
390 gtk_get_window_property_as_lisp_data (struct device *d,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
391 GtkWidget *window,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
392 GdkAtom property,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
393 /* next two for error messages only */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
394 Lisp_Object target_type,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
395 GdkAtom selection_atom)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
396 {
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
397 /* deleted */
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
398 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
399 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
400
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
401
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
402
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
403 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
404 gtk_own_selection (Lisp_Object selection_name, Lisp_Object selection_value,
712
2d3184c89f71 [xemacs-hg @ 2001-12-23 01:08:32 by wmperry]
wmperry
parents: 665
diff changeset
405 Lisp_Object how_to_add, Lisp_Object selection_type, int owned_p)
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
406 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
407 struct device *d = decode_gtk_device (Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
408 GtkWidget *selecting_window = GTK_WIDGET (DEVICE_GTK_APP_SHELL (d));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
409 Lisp_Object selection_time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
410 /* Use the time of the last-read mouse or keyboard event.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
411 For selection purposes, we use this as a sleazy way of knowing what the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
412 current time is in server-time. This assumes that the most recently read
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
413 mouse or keyboard event has something to do with the assertion of the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
414 selection, which is probably true.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
415 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
416 guint32 thyme = DEVICE_GTK_MOUSE_TIMESTAMP (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
417 GdkAtom selection_atom;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
418
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
419 CHECK_SYMBOL (selection_name);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
420 selection_atom = symbol_to_gtk_atom (d, selection_name, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
421
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
422 gtk_selection_owner_set (selecting_window,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
423 selection_atom,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
424 thyme);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
425
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
426 /* We do NOT use time_to_lisp() here any more, like we used to.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
427 That assumed equivalence of time_t and Time, which is not
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
428 necessarily the case (e.g. under OSF on the Alphas, where
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
429 Time is a 64-bit quantity and time_t is a 32-bit quantity).
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
430
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
431 Opaque pointers are the clean way to go here.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
432 */
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
433 return make_opaque (&thyme, sizeof (thyme));
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
434 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
435
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
436 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
437 gtk_disown_selection (Lisp_Object selection, Lisp_Object timeval)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
438 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
439 struct device *d = decode_gtk_device (Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
440 GdkAtom selection_atom;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
441 guint32 timestamp;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
442
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
443 CHECK_SYMBOL (selection);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
444 selection_atom = symbol_to_gtk_atom (d, selection, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
445
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
446 if (NILP (timeval))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
447 timestamp = DEVICE_GTK_MOUSE_TIMESTAMP (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
448 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
449 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
450 time_t the_time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
451 lisp_to_time (timeval, &the_time);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
452 timestamp = (guint32) the_time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
453 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
454
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
455 gtk_selection_owner_set (NULL, selection_atom, timestamp);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
456 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
457
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
458 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
459 gtk_selection_exists_p (Lisp_Object selection,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
460 Lisp_Object selection_type)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
461 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
462 struct device *d = decode_gtk_device (Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
463
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
464 return (gdk_selection_owner_get (symbol_to_gtk_atom (d, selection, 0)) ? Qt : Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
465 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
466
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
467
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
468
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
469 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
470 /* initialization */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
471 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
472
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
473 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
474 syms_of_select_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
475 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
476 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
477
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
478 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
479 console_type_create_select_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
480 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
481 CONSOLE_HAS_METHOD (gtk, own_selection);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
482 CONSOLE_HAS_METHOD (gtk, disown_selection);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
483 CONSOLE_HAS_METHOD (gtk, selection_exists_p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
484 CONSOLE_HAS_METHOD (gtk, get_foreign_selection);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
485 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
486
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
487 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
488 vars_of_select_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
489 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
490 staticpro (&Vretrieved_selection);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
491 Vretrieved_selection = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
492
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
493 DEFVAR_LISP ("gtk-sent-selection-hooks", &Vgtk_sent_selection_hooks /*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
494 A function or functions to be called after we have responded to some
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
495 other client's request for the value of a selection that we own. The
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
496 function(s) will be called with four arguments:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
497 - the name of the selection (typically PRIMARY, SECONDARY, or CLIPBOARD);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
498 - the name of the selection-type which we were requested to convert the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
499 selection into before sending (for example, STRING or LENGTH);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
500 - and whether we successfully transmitted the selection.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
501 We might have failed (and declined the request) for any number of reasons,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
502 including being asked for a selection that we no longer own, or being asked
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
503 to convert into a type that we don't know about or that is inappropriate.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
504 This hook doesn't let you change the behavior of emacs's selection replies,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
505 it merely informs you that they have happened.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
506 */ );
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
507 Vgtk_sent_selection_hooks = Qunbound;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
508 }