comparison src/gtk-glue.c @ 462:0784d089fdc9 r21-2-46

Import from CVS: tag r21-2-46
author cvs
date Mon, 13 Aug 2007 11:44:37 +0200
parents
children 2923009caf47
comparison
equal deleted inserted replaced
461:120ed4009e51 462:0784d089fdc9
1 GtkType GTK_TYPE_ARRAY = 0;
2 GtkType GTK_TYPE_STRING_ARRAY = 0;
3 GtkType GTK_TYPE_FLOAT_ARRAY = 0;
4 GtkType GTK_TYPE_INT_ARRAY = 0;
5 GtkType GTK_TYPE_LISTOF = 0;
6 GtkType GTK_TYPE_STRING_LIST = 0;
7 GtkType GTK_TYPE_OBJECT_LIST = 0;
8 GtkType GTK_TYPE_GDK_GC = 0;
9
10 static GtkType
11 xemacs_type_register (gchar *name, GtkType parent)
12 {
13 GtkType type_id;
14 GtkTypeInfo info;
15
16 info.type_name = name;
17 info.object_size = 0;
18 info.class_size = 0;
19 info.class_init_func = NULL;
20 info.object_init_func = NULL;
21 info.reserved_1 = NULL;
22 info.reserved_2 = NULL;
23
24 type_id = gtk_type_unique (parent, &info);
25
26 return (type_id);
27 }
28
29 static void
30 xemacs_init_gtk_classes (void)
31 {
32 if (!GTK_TYPE_ARRAY)
33 {
34 GTK_TYPE_ARRAY = xemacs_type_register ("GtkArrayOf", 0);
35 GTK_TYPE_STRING_ARRAY = xemacs_type_register ("GtkArrayOfString", GTK_TYPE_ARRAY);
36 GTK_TYPE_FLOAT_ARRAY = xemacs_type_register ("GtkArrayOfFloat", GTK_TYPE_ARRAY);
37 GTK_TYPE_INT_ARRAY = xemacs_type_register ("GtkArrayOfInteger", GTK_TYPE_ARRAY);
38 GTK_TYPE_LISTOF = xemacs_type_register ("GtkListOf", 0);
39 GTK_TYPE_STRING_LIST = xemacs_type_register ("GtkListOfString", GTK_TYPE_LISTOF);
40 GTK_TYPE_OBJECT_LIST = xemacs_type_register ("GtkListOfObject", GTK_TYPE_LISTOF);
41 GTK_TYPE_GDK_GC = xemacs_type_register ("GdkGC", GTK_TYPE_BOXED);
42 }
43 }
44
45 static void
46 xemacs_list_to_gtklist (Lisp_Object obj, GtkArg *arg)
47 {
48 CHECK_LIST (obj);
49
50 if (arg->type == GTK_TYPE_STRING_LIST)
51 {
52 Lisp_Object temp = obj;
53 GList *strings = NULL;
54
55 while (!NILP (temp))
56 {
57 CHECK_STRING (XCAR (temp));
58 temp = XCDR (temp);
59 }
60
61 temp = obj;
62
63 while (!NILP (temp))
64 {
65 strings = g_list_append (strings, XSTRING_DATA (XCAR (temp)));
66 temp = XCDR (temp);
67 }
68
69 GTK_VALUE_POINTER(*arg) = strings;
70 }
71 else if (arg->type == GTK_TYPE_OBJECT_LIST)
72 {
73 Lisp_Object temp = obj;
74 GList *objects = NULL;
75
76 while (!NILP (temp))
77 {
78 CHECK_GTK_OBJECT (XCAR (temp));
79 temp = XCDR (temp);
80 }
81
82 temp = obj;
83
84 while (!NILP (temp))
85 {
86 objects = g_list_append (objects, XGTK_OBJECT (XCAR (temp))->object);
87 temp = XCDR (temp);
88 }
89
90 GTK_VALUE_POINTER(*arg) = objects;
91 }
92 else
93 {
94 abort();
95 }
96 }
97
98 static void
99 __make_gtk_object_mapper (gpointer data, gpointer user_data)
100 {
101 Lisp_Object *rv = (Lisp_Object *) user_data;
102
103 *rv = Fcons (build_gtk_object (GTK_OBJECT (data)), *rv);
104 }
105
106 static void
107 __make_string_mapper (gpointer data, gpointer user_data)
108 {
109 Lisp_Object *rv = (Lisp_Object *) user_data;
110
111 *rv = Fcons (build_string ((char *)data), *rv);
112 }
113
114 static Lisp_Object
115 xemacs_gtklist_to_list (GtkArg *arg)
116 {
117 Lisp_Object rval = Qnil;
118
119 if (GTK_VALUE_POINTER (*arg))
120 {
121 if (arg->type == GTK_TYPE_STRING_LIST)
122 {
123 g_list_foreach (GTK_VALUE_POINTER (*arg), __make_string_mapper, &rval);
124 }
125 else if (arg->type == GTK_TYPE_OBJECT_LIST)
126 {
127 g_list_foreach (GTK_VALUE_POINTER (*arg), __make_gtk_object_mapper, &rval);
128 }
129 else
130 {
131 abort();
132 }
133 }
134 return (rval);
135 }
136
137 static void
138 xemacs_list_to_array (Lisp_Object obj, GtkArg *arg)
139 {
140 CHECK_LIST (obj);
141
142 #define FROB(ret_type,check_fn,extract_fn) \
143 do { \
144 Lisp_Object temp = obj; \
145 int length = 0; \
146 ret_type *array = NULL; \
147 \
148 while (!NILP (temp)) \
149 { \
150 check_fn (XCAR (temp)); \
151 length++; \
152 temp = XCDR (temp); \
153 } \
154 \
155 array = xnew_array_and_zero (ret_type, length + 2); \
156 temp = obj; \
157 length = 0; \
158 \
159 while (!NILP (temp)) \
160 { \
161 array[length++] = extract_fn (XCAR (temp)); \
162 temp = XCDR (temp); \
163 } \
164 \
165 GTK_VALUE_POINTER(*arg) = array; \
166 } while (0);
167
168 if (arg->type == GTK_TYPE_STRING_ARRAY)
169 {
170 FROB(gchar *, CHECK_STRING, XSTRING_DATA);
171 }
172 else if (arg->type == GTK_TYPE_FLOAT_ARRAY)
173 {
174 FROB(gfloat, CHECK_FLOAT, extract_float);
175 }
176 else if (arg->type == GTK_TYPE_INT_ARRAY)
177 {
178 FROB(gint, CHECK_INT, XINT);
179 }
180 else
181 {
182 abort();
183 }
184 #undef FROB
185 }
186
187 extern GdkGC *gtk_get_gc (struct device *d, Lisp_Object font, Lisp_Object fg, Lisp_Object bg,
188 Lisp_Object bg_pmap, Lisp_Object lwidth);
189
190 static GdkGC *
191 face_to_gc (Lisp_Object face)
192 {
193 Lisp_Object device = Fselected_device (Qnil);
194
195 return (gtk_get_gc (XDEVICE (device),
196 Fspecifier_instance (Fget (face, Qfont, Qnil), device, Qnil, Qnil),
197 Fspecifier_instance (Fget (face, Qforeground, Qnil), device, Qnil, Qnil),
198 Fspecifier_instance (Fget (face, Qbackground, Qnil), device, Qnil, Qnil),
199 Fspecifier_instance (Fget (face, Qbackground_pixmap, Qnil), device, Qnil, Qnil),
200 Qnil));
201 }
202
203 static GtkStyle *
204 face_to_style (Lisp_Object face)
205 {
206 Lisp_Object device = Fselected_device (Qnil);
207 GtkStyle *style = gtk_style_new ();
208 int i;
209
210 Lisp_Object font = Fspecifier_instance (Fget (face, Qfont, Qnil), device, Qnil, Qnil);
211 Lisp_Object fg = Fspecifier_instance (Fget (face, Qforeground, Qnil), device, Qnil, Qnil);
212 Lisp_Object bg = Fspecifier_instance (Fget (face, Qbackground, Qnil), device, Qnil, Qnil);
213 Lisp_Object pm = Fspecifier_instance (Fget (face, Qbackground_pixmap, Qnil), device, Qnil, Qnil);
214
215 for (i = 0; i < 5; i++) style->fg[i] = * COLOR_INSTANCE_GTK_COLOR (XCOLOR_INSTANCE (fg));
216 for (i = 0; i < 5; i++) style->bg[i] = * COLOR_INSTANCE_GTK_COLOR (XCOLOR_INSTANCE (bg));
217
218 if (IMAGE_INSTANCEP (pm))
219 {
220 for (i = 0; i < 5; i++) style->bg_pixmap[i] = XIMAGE_INSTANCE_GTK_PIXMAP (pm);
221 }
222
223 style->font = FONT_INSTANCE_GTK_FONT (XFONT_INSTANCE (font));
224
225 return (style);
226 }
227
228 extern int gtk_event_to_emacs_event (struct frame *, GdkEvent *, struct Lisp_Event *);
229
230 static Lisp_Object
231 gdk_event_to_emacs_event(GdkEvent *ev)
232 {
233 Lisp_Object emacs_event = Qnil;
234
235 if (ev)
236 {
237 emacs_event = Fmake_event (Qnil, Qnil);
238 if (!gtk_event_to_emacs_event (NULL, ev, XEVENT (emacs_event)))
239 {
240 /* We need to handle a few more cases than the normal event
241 ** loop does. Mainly the double/triple click events.
242 */
243 if ((ev->type == GDK_2BUTTON_PRESS) || (ev->type == GDK_3BUTTON_PRESS))
244 {
245 struct Lisp_Event *le = XEVENT (emacs_event);
246
247 le->event_type = misc_user_event;
248 le->event.misc.button = ev->button.button;
249 le->event.misc.modifiers = 0;
250 le->event.misc.x = ev->button.x;
251 le->event.misc.y = ev->button.y;
252 if (ev->type == GDK_2BUTTON_PRESS)
253 le->event.misc.function = intern ("double-click");
254 else
255 le->event.misc.function = intern ("triple-click");
256 }
257 else
258 {
259 Fdeallocate_event (emacs_event);
260 emacs_event = Qnil;
261 }
262 }
263 }
264 return (emacs_event);
265 }