annotate src/select-gtk.c @ 5724:ede80ef92a74

Make soft links in src for module source files, if built in to the executable. This ensures that those files are built with the same compiler flags as all other source files. See these xemacs-beta messages: <CAHCOHQn+q=Xuwq+y68dvqi7afAP9f-TdB7=8YiZ8VYO816sjHg@mail.gmail.com> <f5by5ejqiyk.fsf@calexico.inf.ed.ac.uk>
author Jerry James <james@xemacs.org>
date Sat, 02 Mar 2013 14:32:37 -0700
parents 79e9934779c1
children
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
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4985
diff changeset
7 XEmacs is free software: you can redistribute it and/or modify it
462
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
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4985
diff changeset
9 Free Software Foundation, either version 3 of the License, or (at your
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4985
diff changeset
10 option) any later version.
462
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
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4985
diff changeset
18 along with XEmacs. If not, see <http://www.gnu.org/licenses/>. */
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
19
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
20 /* Synched up with: Not synched with FSF. */
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 /* Authorship:
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 Written by Kevin Gallo for FSF Emacs.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
25 Rewritten for mswindows by Jonathan Harris, December 1997 for 21.0.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
26 Rewritten for GTK by William Perry, April 2000 for 21.1
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
27 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
28
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 #include <config.h>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
31 #include "lisp.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
32
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
33 #include "buffer.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
34 #include "device-impl.h"
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
35 #include "events.h"
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
36 #include "frame.h"
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
37 #include "opaque.h"
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
38 #include "select.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
39
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 867
diff changeset
40 #include "console-gtk-impl.h"
462
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
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2054
diff changeset
50 symbol_to_gtk_atom (struct device *UNUSED (d), Lisp_Object sym,
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2054
diff changeset
51 int only_if_exists)
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
52 {
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
53 if (NILP (sym)) return GDK_SELECTION_PRIMARY;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
54 if (EQ (sym, Qt)) return GDK_SELECTION_SECONDARY;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
55 if (EQ (sym, QPRIMARY)) return GDK_SELECTION_PRIMARY;
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
56 if (EQ (sym, QSECONDARY)) return GDK_SELECTION_SECONDARY;
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 {
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
59 const Extbyte *nameext;
4981
4aebb0131297 Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents: 4953
diff changeset
60 nameext = LISP_STRING_TO_EXTERNAL (Fsymbol_name (sym), Qctext);
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
61 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
62 }
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
63 }
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
64
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
65 static Lisp_Object
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2054
diff changeset
66 atom_to_symbol (struct device *UNUSED (d), GdkAtom atom)
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
67 {
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
68 if (atom == GDK_SELECTION_PRIMARY) return (QPRIMARY);
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
69 if (atom == GDK_SELECTION_SECONDARY) return (QSECONDARY);
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
70
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
71 {
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 793
diff changeset
72 Ibyte *intstr;
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
73 Extbyte *str = gdk_atom_name (atom);
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
74
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
75 if (! str) return Qnil;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
76
4981
4aebb0131297 Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents: 4953
diff changeset
77 intstr = EXTERNAL_TO_ITEXT (str, Qctext);
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
78 g_free (str);
4953
304aebb79cd3 function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents: 2620
diff changeset
79 return intern_istring (intstr);
647
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
4984
f23cd0184dcf xlike, doc changes
Ben Wing <ben@xemacs.org>
parents: 4976
diff changeset
83 #define THIS_IS_GTK
f23cd0184dcf xlike, doc changes
Ben Wing <ben@xemacs.org>
parents: 4976
diff changeset
84 #include "select-xlike-inc.c"
f23cd0184dcf xlike, doc changes
Ben Wing <ben@xemacs.org>
parents: 4976
diff changeset
85 #undef THIS_IS_GTK
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
86
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
87
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
88 /* 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
89 ** unable to do what they wanted.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
90 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
91 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
92 gtk_decline_selection_request (GtkSelectionData *data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
93 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
94 gtk_selection_data_set (data, GDK_NONE, 0, NULL, 0);
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
97 /* 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
98 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
99 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
100 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
101 struct _selection_closure
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
102 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
103 GtkSelectionData *data;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
104 gboolean successful;
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
107 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
108 gtk_selection_request_lisp_error (Lisp_Object closure)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
109 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
110 struct _selection_closure *cl = (struct _selection_closure *)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
111 get_opaque_ptr (closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
112
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
113 free_opaque_ptr (closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
114 if (cl->successful == TRUE)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
115 return Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
116 gtk_decline_selection_request (cl->data);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
117 return Qnil;
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
120 /* This provides the current selection to a requester.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
121 **
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
122 ** This is connected to the selection_get() signal of the application
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
123 ** shell in device-gtk.c:gtk_init_device().
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
124 **
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
125 ** This is radically different than the old selection code (21.1.x),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
126 ** but has been modeled after the X code, and appears to work.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
127 **
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
128 ** WMP Feb 12 2001
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
129 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
130 void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2054
diff changeset
131 emacs_gtk_selection_handle (GtkWidget *UNUSED (widget),
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
132 GtkSelectionData *selection_data,
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2054
diff changeset
133 guint UNUSED (info),
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
134 guint time_stamp,
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2054
diff changeset
135 gpointer UNUSED (data))
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
136 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
137 /* This function can GC */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
138 struct gcpro gcpro1, gcpro2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
139 Lisp_Object temp_obj;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
140 Lisp_Object selection_symbol;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
141 Lisp_Object target_symbol = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
142 Lisp_Object converted_selection = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
143 guint32 local_selection_time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
144 Lisp_Object successful_p = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
145 int count;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
146 struct device *d = decode_gtk_device (Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
147 struct _selection_closure *cl = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
148
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
149 GCPRO2 (converted_selection, target_symbol);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
150
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
151 selection_symbol = atom_to_symbol (d, selection_data->selection);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
152 target_symbol = atom_to_symbol (d, selection_data->target);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
153
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
154 #if 0 /* #### MULTIPLE doesn't work yet */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
155 if (EQ (target_symbol, QMULTIPLE))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
156 target_symbol = fetch_multiple_target (selection_data);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
157 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
158
2620
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 2367
diff changeset
159 temp_obj = get_selection_raw_time(selection_symbol);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
160
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
161 if (NILP (temp_obj))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
162 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
163 /* We don't appear to have the selection. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
164 gtk_decline_selection_request (selection_data);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
165
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
166 goto DONE_LABEL;
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
169 local_selection_time = * (guint32 *) XOPAQUE_DATA (temp_obj);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
170
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
171 if (time_stamp != GDK_CURRENT_TIME &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
172 local_selection_time > time_stamp)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
173 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
174 /* 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
175 they're looking for. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
176 gtk_decline_selection_request (selection_data);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
177 goto DONE_LABEL;
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
180 converted_selection = select_convert_out (selection_symbol,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
181 target_symbol, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
182
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
183 /* #### 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
184 if (NILP (converted_selection))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
185 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
186 /* We don't appear to have a selection in that data type. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
187 gtk_decline_selection_request (selection_data);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
188 goto DONE_LABEL;
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
191 count = specpdl_depth ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
192
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
193 cl = xnew (struct _selection_closure);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
194 cl->data = selection_data;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
195 cl->successful = FALSE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
196
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
197 record_unwind_protect (gtk_selection_request_lisp_error,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
198 make_opaque_ptr (cl));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
199
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
200 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
201 Rawbyte *data;
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
202 Bytecount size;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
203 int format;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
204 GdkAtom type;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
205 lisp_data_to_selection_data (d, converted_selection,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
206 &data, &type, &size, &format);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
207
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
208 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
209 /* #### is this right? */
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
210 (unsigned int) size);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
211 successful_p = Qt;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
212 /* Tell x_selection_request_lisp_error() it's cool. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
213 cl->successful = TRUE;
4976
16112448d484 Rename xfree(FOO, TYPE) -> xfree(FOO)
Ben Wing <ben@xemacs.org>
parents: 4953
diff changeset
214 xfree (data);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
215 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
216
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 746
diff changeset
217 unbind_to (count);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
218
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
219 DONE_LABEL:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
220
1726
a8d8f419b459 [xemacs-hg @ 2003-09-30 15:26:34 by james]
james
parents: 872
diff changeset
221 if (cl)
4976
16112448d484 Rename xfree(FOO, TYPE) -> xfree(FOO)
Ben Wing <ben@xemacs.org>
parents: 4953
diff changeset
222 xfree (cl);
462
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 UNGCPRO;
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 /* Let random lisp code notice that the selection has been asked for. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
227 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
228 Lisp_Object val = Vgtk_sent_selection_hooks;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
229 if (!UNBOUNDP (val) && !NILP (val))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
230 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
231 Lisp_Object rest;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
232 if (CONSP (val) && !EQ (XCAR (val), Qlambda))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
233 for (rest = val; !NILP (rest); rest = Fcdr (rest))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
234 call3 (Fcar (rest), selection_symbol, target_symbol, successful_p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
235 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
236 call3 (val, selection_symbol, target_symbol, successful_p);
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 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
240
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
241
746
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
242 void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2054
diff changeset
243 emacs_gtk_selection_clear_event_handle (GtkWidget *UNUSED (widget),
746
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
244 GdkEventSelection *event,
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2054
diff changeset
245 gpointer UNUSED (data))
746
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
246 {
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
247 GdkAtom selection = event->selection;
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
248 guint32 changed_owner_time = event->time;
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
249 struct device *d = decode_gtk_device (Qnil);
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
250
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
251 Lisp_Object selection_symbol, local_selection_time_lisp;
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
252 guint32 local_selection_time;
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 selection_symbol = atom_to_symbol (d, selection);
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
255
2620
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 2367
diff changeset
256 local_selection_time_lisp = get_selection_raw_time (selection_symbol);
746
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
257
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
258 /* 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
259 if (NILP (local_selection_time_lisp))
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
260 return;
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 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
263
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
264 /* 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
265 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
266 request was generated.)
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
267 */
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
268 if (changed_owner_time != GDK_CURRENT_TIME &&
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
269 local_selection_time > changed_owner_time)
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
270 return;
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 handle_selection_clear (selection_symbol);
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
273 }
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
274
b13b1b7b11f1 [xemacs-hg @ 2002-02-08 13:04:18 by wmperry]
wmperry
parents: 712
diff changeset
275
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
276
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
277 static GtkWidget *reading_selection_reply;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
278 static GdkAtom reading_which_selection;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
279 static int selection_reply_timed_out;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
280
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
281 /* Gets the current selection owned by another application */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
282 void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2054
diff changeset
283 emacs_gtk_selection_received (GtkWidget *UNUSED (widget),
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
284 GtkSelectionData *selection_data,
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2054
diff changeset
285 gpointer UNUSED (user_data))
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
286 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
287 waiting_for_selection = FALSE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
288 Vretrieved_selection = Qnil;
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 reading_selection_reply = NULL;
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 signal_fake_event ();
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 if (selection_data->length < 0)
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 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
297 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
298
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
299 Vretrieved_selection =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
300 selection_data_to_lisp_data (NULL,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
301 selection_data->data,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
302 selection_data->length,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
303 selection_data->type,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
304 selection_data->format);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
305 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
306
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
307 static int
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2054
diff changeset
308 selection_reply_done (void *UNUSED (ignore))
462
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 return !reading_selection_reply;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
311 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
312
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
313 /* Do protocol to read selection-data from the server.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
314 Converts this to lisp data and returns it.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
315 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
316 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
317 gtk_get_foreign_selection (Lisp_Object selection_symbol,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
318 Lisp_Object target_type)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
319 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
320 /* This function can GC */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
321 struct device *d = decode_gtk_device (Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
322 GtkWidget *requestor = DEVICE_GTK_APP_SHELL (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
323 guint32 requestor_time = DEVICE_GTK_MOUSE_TIMESTAMP (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
324 GdkAtom selection_atom = symbol_to_gtk_atom (d, selection_symbol, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
325 int speccount;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
326 GdkAtom type_atom = symbol_to_gtk_atom (d, (CONSP (target_type) ?
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
327 XCAR (target_type) : target_type), 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
328
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
329 gtk_selection_convert (requestor, selection_atom, type_atom,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
330 requestor_time);
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 signal_fake_event ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
333
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
334 /* Block until the reply has been read. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
335 reading_selection_reply = requestor;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
336 reading_which_selection = selection_atom;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
337 selection_reply_timed_out = 0;
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 speccount = specpdl_depth ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
340
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
341 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
342 /* add a timeout handler */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
343 if (gtk_selection_timeout > 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
344 {
5581
56144c8593a8 Mechanically change INT to FIXNUM in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5402
diff changeset
345 Lisp_Object id = Fadd_timeout (make_fixnum (x_selection_timeout),
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
346 Qx_selection_reply_timeout_internal,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
347 Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
348 record_unwind_protect (Fdisable_timeout, id);
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 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
351
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
352 /* This is ^Gable */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
353 wait_delaying_user_input (selection_reply_done, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
354
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
355 if (selection_reply_timed_out)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 462
diff changeset
356 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
357
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 746
diff changeset
358 unbind_to (speccount);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
359
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
360 /* otherwise, the selection is waiting for us on the requested property. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
361 return select_convert_in (selection_symbol,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
362 target_type,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
363 Vretrieved_selection);
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
366
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
367 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
368 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
369 gtk_get_window_property (struct device *d, GtkWidget *window, GdkAtom property,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
370 Extbyte **data_ret, int *bytes_ret,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
371 GdkAtom *actual_type_ret, int *actual_format_ret,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
372 unsigned long *actual_size_ret, int delete_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
373 {
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
374 /* deleted */
462
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
377
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
378 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
379 receive_incremental_selection (Display *display, Window window, Atom property,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
380 /* this one is for error messages only */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
381 Lisp_Object target_type,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
382 unsigned int min_size_bytes,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
383 Extbyte **data_ret, int *size_bytes_ret,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
384 Atom *type_ret, int *format_ret,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
385 unsigned long *size_ret)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
386 {
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
387 /* deleted */
462
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
390
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
391 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
392 gtk_get_window_property_as_lisp_data (struct device *d,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
393 GtkWidget *window,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
394 GdkAtom property,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
395 /* next two for error messages only */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
396 Lisp_Object target_type,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
397 GdkAtom selection_atom)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
398 {
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 563
diff changeset
399 /* deleted */
462
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 #endif
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
404
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
405 static Lisp_Object
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2054
diff changeset
406 gtk_own_selection (Lisp_Object selection_name,
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2054
diff changeset
407 Lisp_Object UNUSED (selection_value),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2054
diff changeset
408 Lisp_Object UNUSED (how_to_add),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2054
diff changeset
409 Lisp_Object UNUSED (selection_type), int UNUSED (owned_p))
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
410 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
411 struct device *d = decode_gtk_device (Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
412 GtkWidget *selecting_window = GTK_WIDGET (DEVICE_GTK_APP_SHELL (d));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
413 /* Use the time of the last-read mouse or keyboard event.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
414 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
415 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
416 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
417 selection, which is probably true.
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 guint32 thyme = DEVICE_GTK_MOUSE_TIMESTAMP (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
420 GdkAtom selection_atom;
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 CHECK_SYMBOL (selection_name);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
423 selection_atom = symbol_to_gtk_atom (d, selection_name, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
424
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
425 gtk_selection_owner_set (selecting_window,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
426 selection_atom,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
427 thyme);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
428
2620
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 2367
diff changeset
429 /* [[ We do NOT use time_to_lisp() here any more, like we used to.
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
430 That assumed equivalence of time_t and Time, which is not
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
431 necessarily the case (e.g. under OSF on the Alphas, where
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
432 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
433
2620
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 2367
diff changeset
434 Opaque pointers are the clean way to go here. ]]
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 2367
diff changeset
435
5e906dd5c3e9 [xemacs-hg @ 2005-02-28 20:21:43 by aidan]
aidan
parents: 2367
diff changeset
436 See my comment on the same issue in select-x.c -- Aidan. */
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 778
diff changeset
437 return make_opaque (&thyme, sizeof (thyme));
462
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
440 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
441 gtk_disown_selection (Lisp_Object selection, Lisp_Object timeval)
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 struct device *d = decode_gtk_device (Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
444 GdkAtom selection_atom;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
445 guint32 timestamp;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
446
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
447 CHECK_SYMBOL (selection);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
448 selection_atom = symbol_to_gtk_atom (d, selection, 0);
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 if (NILP (timeval))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
451 timestamp = DEVICE_GTK_MOUSE_TIMESTAMP (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
452 else
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 time_t the_time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
455 lisp_to_time (timeval, &the_time);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
456 timestamp = (guint32) the_time;
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
459 gtk_selection_owner_set (NULL, selection_atom, timestamp);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
460 }
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 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
463 gtk_selection_exists_p (Lisp_Object selection,
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2054
diff changeset
464 Lisp_Object UNUSED (selection_type))
462
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 struct device *d = decode_gtk_device (Qnil);
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 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
469 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
470
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 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
474 /* initialization */
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 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
478 syms_of_select_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
479 {
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
482 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
483 console_type_create_select_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
484 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
485 CONSOLE_HAS_METHOD (gtk, own_selection);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
486 CONSOLE_HAS_METHOD (gtk, disown_selection);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
487 CONSOLE_HAS_METHOD (gtk, selection_exists_p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
488 CONSOLE_HAS_METHOD (gtk, get_foreign_selection);
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
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
491 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
492 vars_of_select_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
493 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
494 staticpro (&Vretrieved_selection);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
495 Vretrieved_selection = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
496
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
497 DEFVAR_LISP ("gtk-sent-selection-hooks", &Vgtk_sent_selection_hooks /*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
498 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
499 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
500 function(s) will be called with four arguments:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
501 - the name of the selection (typically PRIMARY, SECONDARY, or CLIPBOARD);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
502 - 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
503 selection into before sending (for example, STRING or LENGTH);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
504 - and whether we successfully transmitted the selection.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
505 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
506 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
507 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
508 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
509 it merely informs you that they have happened.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
510 */ );
5616
79e9934779c1 Use va_run_hooks_with_args() for x-sent-selection-hooks, lost-selection-hooks
Aidan Kehoe <kehoea@parhasard.net>
parents: 5581
diff changeset
511 Vgtk_sent_selection_hooks = Qnil;
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
512 }