aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJoakim Verona2011-06-22 02:03:38 +0200
committerJoakim Verona2011-06-22 02:03:38 +0200
commit479d2bf9a9887d6b3d59ba077cb0ad564b180e07 (patch)
tree4a7a38d313eb611830fa12f2d31f83e8e5627b5b /src
parenta7513ade3bc0fe79430d5541d88c9dcda0932bec (diff)
downloademacs-479d2bf9a9887d6b3d59ba077cb0ad564b180e07.tar.gz
emacs-479d2bf9a9887d6b3d59ba077cb0ad564b180e07.zip
trying to revert the composition code and mowe to mvc. now compiles but far from functional. dont bother trying yet.
Diffstat (limited to 'src')
-rw-r--r--src/dispnew.c5
-rw-r--r--src/insdel.c2
-rw-r--r--src/xdisp.c5
-rw-r--r--src/xwidget.c370
-rw-r--r--src/xwidget.h47
5 files changed, 157 insertions, 272 deletions
diff --git a/src/dispnew.c b/src/dispnew.c
index 01b9acceb4e..ae2c9813725 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -296,6 +296,7 @@ static void add_frame_display_history (struct frame *, int);
296 has been constructed. PAUSED_P non-zero means that the update 296 has been constructed. PAUSED_P non-zero means that the update
297 has been interrupted for pending input. */ 297 has been interrupted for pending input. */
298 298
299
299static void 300static void
300add_window_display_history (struct window *w, const char *msg, int paused_p) 301add_window_display_history (struct window *w, const char *msg, int paused_p)
301{ 302{
@@ -305,7 +306,7 @@ add_window_display_history (struct window *w, const char *msg, int paused_p)
305 history_idx = 0; 306 history_idx = 0;
306 buf = redisplay_history[history_idx].trace; 307 buf = redisplay_history[history_idx].trace;
307 ++history_idx; 308 ++history_idx;
308 309 /* glyph debug seems broken
309 sprintf (buf, "%d: window %p (`%s')%s\n", 310 sprintf (buf, "%d: window %p (`%s')%s\n",
310 history_tick++, 311 history_tick++,
311 w, 312 w,
@@ -314,7 +315,9 @@ add_window_display_history (struct window *w, const char *msg, int paused_p)
314 ? SSDATA (XBUFFER (w->buffer)->name) 315 ? SSDATA (XBUFFER (w->buffer)->name)
315 : "???"), 316 : "???"),
316 paused_p ? " ***paused***" : ""); 317 paused_p ? " ***paused***" : "");
318 */
317 strcat (buf, msg); 319 strcat (buf, msg);
320
318} 321}
319 322
320 323
diff --git a/src/insdel.c b/src/insdel.c
index 4117b0e6b93..b83b2affae0 100644
--- a/src/insdel.c
+++ b/src/insdel.c
@@ -1814,9 +1814,9 @@ void
1814modify_region (struct buffer *buffer, EMACS_INT start, EMACS_INT end, 1814modify_region (struct buffer *buffer, EMACS_INT start, EMACS_INT end,
1815 int preserve_chars_modiff) 1815 int preserve_chars_modiff)
1816{ 1816{
1817 struct buffer *old_buffer = current_buffer;
1817 // printf("modify region\n"); 1818 // printf("modify region\n");
1818 xwidget_modify_region(); 1819 xwidget_modify_region();
1819 struct buffer *old_buffer = current_buffer;
1820 1820
1821 if (buffer != old_buffer) 1821 if (buffer != old_buffer)
1822 set_buffer_internal (buffer); 1822 set_buffer_internal (buffer);
diff --git a/src/xdisp.c b/src/xdisp.c
index cd25ae96862..253a211aa1e 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -3895,7 +3895,7 @@ handle_display_spec (struct it *it, Lisp_Object spec, Lisp_Object object,
3895 if (CONSP (spec) 3895 if (CONSP (spec)
3896 /* Simple specerties. */ 3896 /* Simple specerties. */
3897 && !EQ (XCAR (spec), Qimage) 3897 && !EQ (XCAR (spec), Qimage)
3898 && !EQ (XCAR (prop), Qxwidget) 3898 && !EQ (XCAR (spec), Qxwidget)
3899 && !EQ (XCAR (spec), Qspace) 3899 && !EQ (XCAR (spec), Qspace)
3900 && !EQ (XCAR (spec), Qwhen) 3900 && !EQ (XCAR (spec), Qwhen)
3901 && !EQ (XCAR (spec), Qslice) 3901 && !EQ (XCAR (spec), Qslice)
@@ -11191,7 +11191,7 @@ debug_method_add (w, fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9)
11191 } 11191 }
11192 11192
11193 strncpy (method + len, buffer, remaining); 11193 strncpy (method + len, buffer, remaining);
11194 11194 /* glyph debug broken
11195 if (trace_redisplay_p) 11195 if (trace_redisplay_p)
11196 fprintf (stderr, "%p (%s): %s\n", 11196 fprintf (stderr, "%p (%s): %s\n",
11197 w, 11197 w,
@@ -11200,6 +11200,7 @@ debug_method_add (w, fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9)
11200 ? SSDATA (XBUFFER (w->buffer)->name) 11200 ? SSDATA (XBUFFER (w->buffer)->name)
11201 : "no buffer"), 11201 : "no buffer"),
11202 buffer); 11202 buffer);
11203 */
11203} 11204}
11204 11205
11205#endif /* GLYPH_DEBUG */ 11206#endif /* GLYPH_DEBUG */
diff --git a/src/xwidget.c b/src/xwidget.c
index 547c899b299..dbcb7a42f6e 100644
--- a/src/xwidget.c
+++ b/src/xwidget.c
@@ -74,11 +74,15 @@
74 74
75#include "xwidget.h" 75#include "xwidget.h"
76 76
77//TODO should of course not be a hardcoded array but I can't be bothered atm
77//just a fixed array of xwidgets for now 78//just a fixed array of xwidgets for now
79//would need to be hashtables or something
80
78#define MAX_XWIDGETS 100 81#define MAX_XWIDGETS 100
79struct xwidget xwidgets[MAX_XWIDGETS]; 82struct xwidget xwidgets[MAX_XWIDGETS];
83struct xwidget_view xwidget_views[MAX_XWIDGETS];
84
80 85
81static int once = 0;
82 86
83 87
84Lisp_Object Qxwidget; 88Lisp_Object Qxwidget;
@@ -95,11 +99,12 @@ extern Lisp_Object QCwidth, QCheight;
95 99
96 100
97#define XG_XWIDGET "emacs_xwidget" 101#define XG_XWIDGET "emacs_xwidget"
102struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window *w);
98 103
99int 104int
100xwidget_hidden(struct xwidget *xw) 105xwidget_hidden(struct xwidget_view *xv)
101{ 106{
102 return xw->hidden; 107 return xv->hidden;
103} 108}
104 109
105 110
@@ -109,7 +114,7 @@ buttonclick_handler (GtkWidget * widget, gpointer data)
109 struct xwidget *xw = (struct xwidget *) data; 114 struct xwidget *xw = (struct xwidget *) data;
110 struct input_event event; 115 struct input_event event;
111 Lisp_Object frame; 116 Lisp_Object frame;
112 FRAME_PTR f = (FRAME_PTR) g_object_get_data (G_OBJECT (xw->widget), XG_FRAME_DATA); 117 FRAME_PTR f = NULL;//(FRAME_PTR) g_object_get_data (G_OBJECT (xw->widget), XG_FRAME_DATA); //TODO
113 printf ("button clicked xw:%d id:%d\n", xw, xw->id); 118 printf ("button clicked xw:%d id:%d\n", xw, xw->id);
114 119
115 EVENT_INIT (event); 120 EVENT_INIT (event);
@@ -152,103 +157,31 @@ int xwidget_query_composition_called = 0;
152int hasNamePixmap = 0; 157int hasNamePixmap = 0;
153 158
154 159
155int
156xwidget_has_composition(void){
157int event_base, error_base;
158Display* dpy = GDK_DISPLAY ();
159int i;
160 if(xwidget_query_composition_called)
161 return hasNamePixmap;
162 xwidget_query_composition_called = 1;
163
164 //do this once in an emacs session
165
166 if(gdk_display_supports_composite(gdk_display_get_default ())){
167 hasNamePixmap = 1;
168 }else{
169 return 0;
170 }
171 return 1;
172}
173 160
174 161
175void 162
176xwidget_end_composition(struct xwidget* w){ 163
177 //XCompositeUnredirectWindow(); stop redirecting, should be called when the socket is destroyed
178}
179 164
180void 165void
181xwidget_show (struct xwidget *xw) 166xwidget_show_view (struct xwidget_view *xv)
182{ 167{
183 //printf("xwidget %d shown\n",xw->id); 168 //printf("xwidget %d shown\n",xw->id);
184 xw->hidden = 0; 169 xv->hidden = 0;
185 gtk_widget_show(GTK_WIDGET(xw->widgetwindow)); 170 gtk_widget_show(GTK_WIDGET(xv->widgetwindow));
186 gtk_fixed_move (GTK_FIXED (xw->emacswindow), GTK_WIDGET (xw->widgetwindow), xw->x, xw->y); 171 gtk_fixed_move (GTK_FIXED (xv->emacswindow), GTK_WIDGET (xv->widgetwindow), xv->x, xv->y);
187} 172}
188 173
189 174
190 175/* hide an xvidget view */
191static gboolean 176void
192xwidget_composite_draw_phantom(struct xwidget* xw, 177xwidget_hide_view (struct xwidget_view *xv)
193 int x, int y,
194 int clipx, int clipy)
195{
196 FRAME_PTR f = (FRAME_PTR) g_object_get_data (G_OBJECT (xw->widget), XG_FRAME_DATA);
197 ////////////////////////////////////////////////////////////////
198 //Example 7. Composited windows
199 GdkRegion *region;
200 GtkWidget *child;
201 cairo_t *cr;
202 printf("xwidget_composite_draw_2 at:%d %d\n", x,y);
203 /* get our child (in this case, the event box) */
204 child = xw->widget; //gtk_bin_get_child (GTK_BIN (widget));
205 /* create a cairo context to draw to the emacs window */
206 // cr = gdk_cairo_create (gtk_widget_get_window (f->gwfixed));//GTK_WIDGET(xw->emacswindow));//xw->widgetwindow));//widget->window);
207 cr = gdk_cairo_create (gtk_widget_get_window (f->gwfixed));//GTK_WIDGET(xw->emacswindow));//));//widget->window);
208 /* the source data is the (composited) xwidget */
209 //cairo_move_to(cr, xw->x, xw->y);
210
211 cairo_rectangle(cr, x,y, clipx, clipy);
212 cairo_clip(cr);
213
214 cairo_set_source_rgb(cr,1.0,0,0);
215 cairo_rectangle(cr,x,y,xw->width,xw->height);
216 cairo_fill(cr);
217
218 gdk_cairo_set_source_pixmap (cr, child->window,
219 x,//child->allocation.x,
220 y//child->allocation.y
221 );
222 /* draw no more than our expose event intersects our child */
223 /* region = gdk_region_rectangle (&child->allocation);
224 gdk_region_intersect (region, event->region);
225 gdk_cairo_region (cr, region);
226 cairo_clip (cr); */
227 /* composite, with a 50% opacity */
228 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
229 //cairo_paint_with_alpha (cr, phantom ? 0.5 : 0);
230 cairo_paint_with_alpha (cr, 0.9);
231 //cairo_paint(cr);//transparency);
232 /* we're done */
233 cairo_destroy (cr);
234 return FALSE;
235}
236
237/*
238static gboolean
239xwidget_composite_draw(GtkWidget *widget,
240 GdkEventExpose *event,
241 gpointer data)
242{ 178{
243 struct xwidget* xw = (struct xwidget*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET); 179 //printf("xwidget %d hidden\n",xw->id);
244 printf("xwidget_composite_draw %s\n", data); 180 xv->hidden = 1;
245 xwidget_composite_draw_2(widget, 181 //gtk_widget_hide(GTK_WIDGET(xw->widgetwindow));
246 event, 182 gtk_fixed_move (GTK_FIXED (xv->emacswindow), GTK_WIDGET (xv->widgetwindow),
247 data, 183 10000, 10000);
248 xw->x, xw->y, 0); 184}
249 return FALSE;
250}
251*/
252 185
253 186
254void xwidget_plug_added(GtkSocket *socket, 187void xwidget_plug_added(GtkSocket *socket,
@@ -258,110 +191,94 @@ void xwidget_plug_added(GtkSocket *socket,
258 printf("xwidget_plug_added\n"); 191 printf("xwidget_plug_added\n");
259} 192}
260 193
261static gboolean
262xwidget_composite_draw_widgetwindow(GtkWidget *widget,
263 GdkEventExpose *event,
264 gpointer data)
265{
266 struct xwidget* xw = (struct xwidget*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET);
267 cairo_t *cr;
268 GdkPixmap *pixmap;
269 pixmap=xw->widget->window;
270 printf("xwidget_composite_draw_widgetwindow xw.id:%d xw.type:%d window:%d\n", xw->id,xw->type, gtk_widget_get_window (widget));
271 //if(xw->type!=3)//TODO this is just trial and terror to see if i can draw the live socket anywhere at all
272 cr = gdk_cairo_create (gtk_widget_get_window (widget));//GTK_LAYOUT (xw->widgetwindow)->bin_window);//
273 //else cr = gdk_cairo_create (gtk_widget_get_window (xw->emacswindow));
274 cairo_rectangle(cr, 0,0, xw->width, xw->height);
275 cairo_clip(cr);
276
277 cairo_set_source_rgb(cr,0,1.0,0);
278 cairo_rectangle(cr, 0,0, xw->width, xw->height);
279 cairo_fill(cr);
280 gdk_cairo_set_source_pixmap (cr, pixmap,
281 0,0);
282
283 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
284 cairo_paint_with_alpha (cr, 0.9);
285 //cairo_paint(cr);
286 cairo_destroy (cr);
287
288 return FALSE;
289}
290 194
195
196
197/* initializes and does initial placement of an xwidget view on screen */
291void 198void
292xwidget_init (struct xwidget *xw, struct glyph_string *s, int x, int y) 199xwidget_init_view (struct xwidget *xww,
200 struct glyph_string *s,
201 int x, int y)
293{ 202{
294 xw->initialized = 1; 203 struct xwidget_view *xv;//TODO create
295 xw->id = s->xwidget_id; 204 GdkColor color;
296 xwidget_show(xw); 205 xv->initialized = 1;
206 xv->w = s->w;
297 207
298 //widget creation 208 //widget creation
299 switch (xw->type) 209 switch (xww->type)
300 { 210 {
301 case 1: 211 case 1:
302 xw->widget = gtk_button_new_with_label (xw->title); 212 xv->widget = gtk_button_new_with_label (xww->title);
303 g_signal_connect (G_OBJECT (xw->widget), "clicked", 213 g_signal_connect (G_OBJECT (xv->widget), "clicked",
304 G_CALLBACK (buttonclick_handler), xw); 214 G_CALLBACK (buttonclick_handler), xww); //the model rather than the view
305 break; 215 break;
306 case 2: 216 case 2:
307 xw->widget = gtk_toggle_button_new_with_label (xw->title); 217 xv->widget = gtk_toggle_button_new_with_label (xww->title);
308 break; 218 break;
309 case 3: 219 case 3:
310 xw->widget = gtk_socket_new (); 220 xv->widget = gtk_socket_new ();
311 //gtk_widget_set_app_paintable (xw->widget, TRUE); //workaround for composited sockets 221 //gtk_widget_set_app_paintable (xw->widget, TRUE); //workaround for composited sockets
312 GdkColor color; 222
313 gdk_color_parse("blue",&color); //the blue color never seems to show up. something else draws a grey bg 223 gdk_color_parse("blue",&color); //the blue color never seems to show up. something else draws a grey bg
314 gtk_widget_modify_bg(xw->widget, GTK_STATE_NORMAL, &color); 224 gtk_widget_modify_bg(xv->widget, GTK_STATE_NORMAL, &color);
315 g_signal_connect_after(xw->widget, "plug-added", G_CALLBACK(xwidget_plug_added), "plug added"); 225 g_signal_connect_after(xv->widget, "plug-added", G_CALLBACK(xwidget_plug_added), "plug added");
316 break; 226 break;
317 case 4: 227 case 4:
318 xw->widget = 228 xv->widget =
319 gtk_hscale_new (GTK_ADJUSTMENT 229 gtk_hscale_new (GTK_ADJUSTMENT
320 (gtk_adjustment_new (0, 0, 100, 1, 1, 0))); 230 (gtk_adjustment_new (0, 0, 100, 1, 1, 0)));
321 gtk_scale_set_draw_value (GTK_SCALE (xw->widget), FALSE); //i think its emacs role to show text and stuff, so disable the widgets own text 231 gtk_scale_set_draw_value (GTK_SCALE (xv->widget), FALSE); //i think its emacs role to show text and stuff, so disable the widgets own text
232 break;
233 case 5:
234 //Cairo view
235 //uhm cairo is differentish in gtk 3.
236 //gdk_cairo_create (gtk_widget_get_window (f->gwfixed));
237 break;
322 } 238 }
323 //widget realization 239 //widget realization
324 //make container widget 1st, and put the actual widget inside the container 240 //make container widget 1st, and put the actual widget inside the container
325 //later, drawing should crop container window if necessary to handle case where xwidget 241 //later, drawing should crop container window if necessary to handle case where xwidget
326 //is partially obscured by other emacs windows 242 //is partially obscured by other emacs windows
327 xw->emacswindow = GTK_CONTAINER (s->f->gwfixed); 243 xv->emacswindow = GTK_CONTAINER (s->f->gwfixed);
328 //xw->widgetwindow = GTK_CONTAINER (gtk_layout_new (NULL, NULL)); 244 //xw->widgetwindow = GTK_CONTAINER (gtk_layout_new (NULL, NULL));
329 xw->widgetwindow = GTK_CONTAINER (gtk_offscreen_window_new ()); 245 //xw->widgetwindow = GTK_CONTAINER (gtk_offscreen_window_new ());
330 //xw->widgetwindow = GTK_CONTAINER (gtk_fixed_new ()); 246 xv->widgetwindow = GTK_CONTAINER (gtk_fixed_new ());
331 //xw->widgetwindow = GTK_CONTAINER (gtk_event_box_new ()); 247 //xw->widgetwindow = GTK_CONTAINER (gtk_event_box_new ());
332 gtk_widget_set_size_request (GTK_WIDGET (xw->widget), xw->width, xw->height); 248 //gtk_widget_set_size_request (GTK_WIDGET (xw->widget), xw->width, xw->height);
333 //gtk_layout_set_size (GTK_LAYOUT (xw->widgetwindow), xw->width, xw->height); 249 //gtk_layout_set_size (GTK_LAYOUT (xw->widgetwindow), xw->width, xw->height);
334 gtk_container_add (xw->widgetwindow, xw->widget); 250 gtk_container_add (xv->widgetwindow, xv->widget);
335 gtk_widget_set_size_request (GTK_WIDGET (xw->widget), xw->width, xw->height); 251 gtk_widget_set_size_request (GTK_WIDGET (xv->widget), xww->width, xww->height);
336 //gtk_fixed_put (GTK_FIXED (s->f->gwfixed), GTK_WIDGET (xw->widgetwindow), x, y); 252 gtk_fixed_put (GTK_FIXED (s->f->gwfixed), GTK_WIDGET (xv->widgetwindow), x, y);
337 gtk_widget_show_all (GTK_WIDGET (xw->widgetwindow)); 253 xv->x = x; xv->y = y;
254 gtk_widget_show_all (GTK_WIDGET (xv->widgetwindow));
338 255
339 //store some xwidget data in the gtk widgets 256 //store some xwidget data in the gtk widgets
340 g_object_set_data (G_OBJECT (xw->widget), XG_FRAME_DATA, (gpointer) (s->f)); //the emacs frame 257 g_object_set_data (G_OBJECT (xv->widget), XG_FRAME_DATA, (gpointer) (s->f)); //the emacs frame
341 g_object_set_data (G_OBJECT (xw->widget), XG_XWIDGET, (gpointer) (xw)); //the xwidget 258 g_object_set_data (G_OBJECT (xv->widget), XG_XWIDGET, (gpointer) (xww)); //the xwidget
342 g_object_set_data (G_OBJECT (xw->widgetwindow), XG_XWIDGET, (gpointer) (xw)); //the xwidget 259 g_object_set_data (G_OBJECT (xv->widgetwindow), XG_XWIDGET, (gpointer) (xww)); //the xwidget
343 260
344 //this seems to enable xcomposition. later we need to paint ourselves somehow, 261 //this seems to enable xcomposition. later we need to paint ourselves somehow,
345 //since the widget is no longer responsible for painting itself 262 //since the widget is no longer responsible for painting itself
346 //if(xw->type!=3) //im having trouble with compositing and sockets. hmmm. 263 //if(xw->type!=3) //im having trouble with compositing and sockets. hmmm.
347 //gdk_window_set_composited (xw->widget->window, TRUE); 264 //gdk_window_set_composited (xw->widget->window, TRUE);
348 //gdk_window_set_composited (GTK_LAYOUT (xw->widgetwindow)->bin_window, TRUE); 265 //gdk_window_set_composited (GTK_LAYOUT (xw->widgetwindow)->bin_window, TRUE);
349 gtk_widget_set_double_buffered (xw->widget,FALSE); 266 // gtk_widget_set_double_buffered (xw->widget,FALSE);
350 gtk_widget_set_double_buffered (xw->widgetwindow,FALSE); 267 // gtk_widget_set_double_buffered (xw->widgetwindow,FALSE);
351 //gdk_window_set_composited (xw->widgetwindow, TRUE); 268 //gdk_window_set_composited (xw->widgetwindow, TRUE);
352 //g_signal_connect_after(xw->widget, "expose-event", G_CALLBACK(xwidget_composite_draw), "widget exposed"); 269 //g_signal_connect_after(xw->widget, "expose-event", G_CALLBACK(xwidget_composite_draw), "widget exposed");
353 g_signal_connect_after(xw->widgetwindow, "expose-event", G_CALLBACK(xwidget_composite_draw_widgetwindow), "widgetwindow exposed"); 270 //g_signal_connect_after(xw->widgetwindow, "expose-event", G_CALLBACK(xwidget_composite_draw_widgetwindow), "widgetwindow exposed");
354 // g_signal_connect_after(xw->widget, "damage-event", G_CALLBACK(xwidget_composite_draw), "damaged"); 271 // g_signal_connect_after(xw->widget, "damage-event", G_CALLBACK(xwidget_composite_draw), "damaged");
355 272
356 //widgettype specific initialization only possible after realization 273 //widgettype specific initialization only possible after realization
357 switch (xw->type) 274 switch (xww->type)
358 { 275 {
359 case 3: 276 case 3:
360 printf ("socket id:%x %d\n", 277 printf ("socket id:%x %d\n",
361 gtk_socket_get_id (GTK_SOCKET (xw->widget)), 278 gtk_socket_get_id (GTK_SOCKET (xv->widget)),
362 gtk_socket_get_id (GTK_SOCKET (xw->widget))); 279 gtk_socket_get_id (GTK_SOCKET (xv->widget)));
363 send_xembed_ready_event (xw->id, 280 send_xembed_ready_event (xww->id,
364 gtk_socket_get_id (GTK_SOCKET (xw->widget))); 281 gtk_socket_get_id (GTK_SOCKET (xv->widget)));
365 //gtk_widget_realize(xw->widget); 282 //gtk_widget_realize(xw->widget);
366 break; 283 break;
367 } 284 }
@@ -399,7 +316,8 @@ x_draw_xwidget_glyph_string (struct glyph_string *s)
399 //we also need to check that the xwidget is to be drawn inside a window on a frame where it originaly lives. 316 //we also need to check that the xwidget is to be drawn inside a window on a frame where it originaly lives.
400 //otherwise draw a phantom, or maybe reparent the xwidget. 317 //otherwise draw a phantom, or maybe reparent the xwidget.
401 318
402 struct xwidget *xw = &xwidgets[s->xwidget_id]; 319 struct xwidget *xww = &xwidgets[s->xwidget_id];
320 struct xwidget_view *xv = xwidget_view_lookup(xww, (s->w));
403 int clipx; int clipy; 321 int clipx; int clipy;
404 322
405 /*printf("x_draw_xwidget_glyph_string: id:%d %d %d (%d,%d,%d,%d) selected win:%d\n", 323 /*printf("x_draw_xwidget_glyph_string: id:%d %d %d (%d,%d,%d,%d) selected win:%d\n",
@@ -408,57 +326,58 @@ x_draw_xwidget_glyph_string (struct glyph_string *s)
408 drawing_in_selected_window);*/ 326 drawing_in_selected_window);*/
409 327
410 int x = s->x; 328 int x = s->x;
411 int y = s->y + (s->height / 2) - (xw->height / 2); 329 int y = s->y + (s->height / 2) - (xww->height / 2);
412 int doingsocket = 0; 330 int doingsocket = 0;
413 int moved=0; 331 int moved=0;
414 if (!xw->initialized) 332 if (!xv->initialized){
415 xwidget_init (xw, s, x, y); 333 xwidget_init_view (xww, s, x, y); //once for each view TODO split
334 }
416 335
417 //calculate clip widht and height, which is used both for the xwidget 336 //calculate clip widht and height, which is used both for the xwidget
418 //and its phantom counterpart 337 //and its phantom counterpart
419 clipx = min (xw->width, WINDOW_RIGHT_EDGE_X (s->w) - x - WINDOW_RIGHT_SCROLL_BAR_AREA_WIDTH(s->w) - WINDOW_RIGHT_FRINGE_WIDTH(s->w)); 338 clipx = min (xww->width, WINDOW_RIGHT_EDGE_X (s->w) - x - WINDOW_RIGHT_SCROLL_BAR_AREA_WIDTH(s->w) - WINDOW_RIGHT_FRINGE_WIDTH(s->w));
420 clipy = min (xw->height, 339 clipy = min (xww->height,
421 WINDOW_BOTTOM_EDGE_Y (s->w) - WINDOW_MODE_LINE_HEIGHT (s->w) - y); 340 WINDOW_BOTTOM_EDGE_Y (s->w) - WINDOW_MODE_LINE_HEIGHT (s->w) - y);
422 341
423 //TODO: 342 //TODO:
424 // 1) always draw live xwidget in slected window 343 // 1) always draw live xwidget in slected window
425 // (2) if there were no live instances of the xwidget in selected window, also draw it live) 344 // (2) if there were no live instances of the xwidget in selected window, also draw it live)
426 // 3) if there was a live xwidget previously, now phantom it. 345 // 3) if there was a live xwidget previously, now phantom it.
427 if (drawing_in_selected_window) 346 if (1)//moving to MVC pattern, there will be no "phantom" support for a while //drawing_in_selected_window)
428 { 347 {
429 moved = (xw->x != x) || (xw->y != y); 348 moved = (xv->x != x) || (xv->y != y);
430 if(moved) 349 if(moved)
431 printf ("live xwidget moved: id:%d (%d,%d)->(%d,%d)\n", xw->id, xw->x, xw->y, x, y); 350 printf ("live xwidget moved: id:%d (%d,%d)->(%d,%d)\n", xww->id, xv->x, xv->y, x, y);
432 //xw refers to the *live* instance of the xwidget, so only 351 //xw refers to the *live* instance of the xwidget, so only
433 //update coords when drawing in the selected window 352 //update coords when drawing in the selected window
434 xw->x = x; 353 xv->x = x;
435 xw->y = y; 354 xv->y = y;
436 if (moved) //has it moved? 355 if (moved) //has it moved?
437 { 356 {
438 if (!xwidget_hidden(xw)) //hidden equals not being seen in the live window 357 if (!xwidget_hidden(xv)) //hidden equals not being seen in the live window
439 { 358 {
440 gtk_fixed_move (GTK_FIXED (s->f->gwfixed), 359 gtk_fixed_move (GTK_FIXED (s->f->gwfixed),
441 GTK_WIDGET (xw->widgetwindow), x, y); 360 GTK_WIDGET (xv->widgetwindow), x, y);
442 } 361 }
443 } 362 }
444 //clip the widget window if some parts happen to be outside drawable area 363 //clip the widget window if some parts happen to be outside drawable area
445 //an emacs window is not a gtk window, a gtk window covers the entire frame 364 //an emacs window is not a gtk window, a gtk window covers the entire frame
446 //cliping might have changed even if we havent actualy moved, we try figure out when we need to reclip for real 365 //cliping might have changed even if we havent actualy moved, we try figure out when we need to reclip for real
447 if((xw->clipx != clipx) || (xw->clipy != clipy)) 366 if((xv->clipx != clipx) || (xv->clipy != clipy))
448 gtk_widget_set_size_request (GTK_WIDGET (xw->widgetwindow), 367 gtk_widget_set_size_request (GTK_WIDGET (xv->widgetwindow),
449 clipx, clipy); 368 clipx, clipy);
450 xw->clipx = clipx; xw->clipy = clipy; 369 xv->clipx = clipx; xv->clipy = clipy;
451 //a live xwidget paints itself. when using composition, that 370 //a live xwidget paints itself. when using composition, that
452 //happens through the expose handler for the xwidget 371 //happens through the expose handler for the xwidget
453 //if emacs wants to repaint the area where the widget lives, queue a redraw 372 //if emacs wants to repaint the area where the widget lives, queue a redraw
454 if (!xwidget_hidden(xw)) 373 if (!xwidget_hidden(xv))
455 gtk_widget_queue_draw (xw->widget); 374 gtk_widget_queue_draw (xv->widget);
456 } 375 }
457 else 376 else
458 { 377 {
459 //ok, we are painting the xwidgets in non-selected window, so draw a phantom 378 //ok, we are painting the xwidgets in non-selected window, so draw a phantom
460 //printf("draw phantom xwidget at:%d %d\n",x,y); 379 //printf("draw phantom xwidget at:%d %d\n",x,y);
461 xwidget_composite_draw_phantom (xw, x, y, clipx, clipy); 380 //xwidget_composite_draw_phantom (xw, x, y, clipx, clipy); //TODO MVC there will be very few cases of phantoming
462 } 381 }
463} 382}
464 383
@@ -481,7 +400,7 @@ DEFUN ("xwidget-embed-steal-window", Fxwidget_embed_steal_window, Sxwidget_embed
481 printf (" gtk_socket_add_id: %d %d\n", xid, iwindow_id); 400 printf (" gtk_socket_add_id: %d %d\n", xid, iwindow_id);
482 // gtk_socket_steal(GTK_SOCKET(xw->widget),iwindow_id); 401 // gtk_socket_steal(GTK_SOCKET(xw->widget),iwindow_id);
483 //try adding proper gtk plugs instead, i never once had "steal" work 402 //try adding proper gtk plugs instead, i never once had "steal" work
484 gtk_socket_add_id (GTK_SOCKET (xw->widget), iwindow_id); 403 ///////// gtk_socket_add_id (GTK_SOCKET (xw->widget), iwindow_id); /////TODO MVC
485 //add_id annoyingly odesnt work either. the only working option 404 //add_id annoyingly odesnt work either. the only working option
486 //seems to be clients that plug into the sockets, and so far only emacs and mplayer 405 //seems to be clients that plug into the sockets, and so far only emacs and mplayer
487 //oenvrml 406 //oenvrml
@@ -507,9 +426,12 @@ DEFUN ("xwidget-resize-internal", Fxwidget_resize_internal, Sxwidget_resize_inte
507 printf("resize xwidget %d (%d,%d)->(%d,%d)",xid,xw->width,xw->height,w,h); 426 printf("resize xwidget %d (%d,%d)->(%d,%d)",xid,xw->width,xw->height,w,h);
508 xw->width=w; 427 xw->width=w;
509 xw->height=h; 428 xw->height=h;
429 /*
430 //this will be more complex, need to iterate all views and resize each. tedious TODO MVC
510 gtk_layout_set_size (GTK_LAYOUT (xw->widgetwindow), xw->width, xw->height); 431 gtk_layout_set_size (GTK_LAYOUT (xw->widgetwindow), xw->width, xw->height);
511 gtk_widget_set_size_request (GTK_WIDGET (xw->widget), xw->width, 432 gtk_widget_set_size_request (GTK_WIDGET (xw->widget), xw->width,
512 xw->height); 433 xw->height);
434 */
513 return Qnil; 435 return Qnil;
514} 436}
515 437
@@ -524,11 +446,11 @@ DEFUN("xwidget-info", Fxwidget_info , Sxwidget_info, 1,1,0, doc: /* get xwidget
524 info = Fmake_vector (make_number (7), Qnil); 446 info = Fmake_vector (make_number (7), Qnil);
525 XVECTOR (info)->contents[0] = make_number(xw->id); 447 XVECTOR (info)->contents[0] = make_number(xw->id);
526 XVECTOR (info)->contents[1] = make_number(xw->type); 448 XVECTOR (info)->contents[1] = make_number(xw->type);
527 XVECTOR (info)->contents[2] = make_number(xw->x); 449 XVECTOR (info)->contents[2] = Qnil; //make_number(xw->x);
528 XVECTOR (info)->contents[3] = make_number(xw->y); 450 XVECTOR (info)->contents[3] = Qnil;//make_number(xw->y);
529 XVECTOR (info)->contents[4] = make_number(xw->width); 451 XVECTOR (info)->contents[4] = make_number(xw->width);
530 XVECTOR (info)->contents[5] = make_number(xw->height); 452 XVECTOR (info)->contents[5] = make_number(xw->height);
531 XVECTOR (info)->contents[6] = make_number(xw->hidden); 453 XVECTOR (info)->contents[6] = Qnil;//make_number(xw->hidden);
532 454
533 return info; 455 return info;
534} 456}
@@ -547,7 +469,8 @@ DEFUN ("xwidget-set-keyboard-grab", Fxwidget_set_keyboard_grab, Sxwidget_set_key
547 xid = XFASTINT (xwidget_id); 469 xid = XFASTINT (xwidget_id);
548 kbd_flag = XFASTINT (kbd_grab); 470 kbd_flag = XFASTINT (kbd_grab);
549 xw = &xwidgets[xid]; 471 xw = &xwidgets[xid];
550 472 if(xw->type != 3) return Qnil; //only relevant for xembed
473
551 printf ("kbd grab: %d %d\n", xid, kbd_flag); 474 printf ("kbd grab: %d %d\n", xid, kbd_flag);
552 if (kbd_flag) 475 if (kbd_flag)
553 { 476 {
@@ -567,7 +490,7 @@ DEFUN ("xwidget-set-keyboard-grab", Fxwidget_set_keyboard_grab, Sxwidget_set_key
567 490
568 /* gtk_container_set_focus_child (GTK_CONTAINER (lastparent), xw->widget); */ 491 /* gtk_container_set_focus_child (GTK_CONTAINER (lastparent), xw->widget); */
569 492
570 gtk_container_set_focus_child (GTK_CONTAINER (xw->widgetwindow), xw->widget); 493 ////gtk_container_set_focus_child (GTK_CONTAINER (xw->widgetwindow), xw->widget); //TODO MVC
571 494
572 xwidget_owns_kbd = TRUE; 495 xwidget_owns_kbd = TRUE;
573 } 496 }
@@ -636,6 +559,7 @@ DEFUN ("xwidget-send-keyboard-event", Fxwidget_send_keyboard_event, Sxwidget_sen
636 xwid = XFASTINT (xwidget_id); 559 xwid = XFASTINT (xwidget_id);
637 xw = &xwidgets[xwid]; 560 xw = &xwidgets[xwid];
638 561
562 /* TODO MVC
639 f = (FRAME_PTR) g_object_get_data (G_OBJECT (xw->widget), XG_FRAME_DATA); 563 f = (FRAME_PTR) g_object_get_data (G_OBJECT (xw->widget), XG_FRAME_DATA);
640 564
641 //GdkWindow* window=gtk_widget_get_window(xw->widget); //event winds up in emacs 565 //GdkWindow* window=gtk_widget_get_window(xw->widget); //event winds up in emacs
@@ -653,7 +577,7 @@ DEFUN ("xwidget-send-keyboard-event", Fxwidget_send_keyboard_event, Sxwidget_sen
653 577
654 xwidget_key_send_message (f, xid, 38, 1, 0); //38 is 'a' HACK for now 578 xwidget_key_send_message (f, xid, 38, 1, 0); //38 is 'a' HACK for now
655 xwidget_key_send_message (f, xid, 38, 0, 0); 579 xwidget_key_send_message (f, xid, 38, 0, 0);
656 580 */
657 return Qnil; 581 return Qnil;
658} 582}
659 583
@@ -741,39 +665,6 @@ valid_xwidget_p (Lisp_Object object)
741 return valid_p; 665 return valid_p;
742} 666}
743 667
744//type support nevermind for now
745
746/* /\* List of supported image types. Use define_image_type to add new */
747/* types. Use lookup_image_type to find a type for a given symbol. *\/ */
748
749/* static struct wxidget_type *wxidget_types; */
750
751/* /\* Look up xwidget type SYMBOL, and return a pointer to its xwidget_type */
752/* structure. Value is null if SYMBOL is not a known image type. *\/ */
753
754/* static INLINE struct xwidget_type *lookup_xwidget_type (Lisp_Object symbol) */
755/* { */
756/* struct xwidget_type *type; */
757
758/* for (type = xwidget_types; type; type = type->next) */
759/* if (EQ (symbol, *type->type)) */
760/* break; */
761
762/* return type; */
763/* } */
764
765
766/* hidden means not being seen in the "live" window.
767 a phantom might be seen somewhere though */
768void
769xwidget_hide (struct xwidget *xw)
770{
771 //printf("xwidget %d hidden\n",xw->id);
772 xw->hidden = 1;
773 //gtk_widget_hide(GTK_WIDGET(xw->widgetwindow));
774 gtk_fixed_move (GTK_FIXED (xw->emacswindow), GTK_WIDGET (xw->widgetwindow),
775 10000, 10000);
776}
777 668
778 669
779 670
@@ -820,6 +711,13 @@ xwidget_from_id (int id)
820 return &xwidgets[id]; 711 return &xwidgets[id];
821} 712}
822 713
714struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window *w){
715 for (int i = 0; i < MAX_XWIDGETS; i++)
716 if ((xwidget_views[i].model == xw) && (xwidget_views[i].w == w))
717 return &xwidget_views[i];
718 return NULL;
719}
720
823int 721int
824lookup_xwidget (Lisp_Object spec) 722lookup_xwidget (Lisp_Object spec)
825{ 723{
@@ -862,20 +760,20 @@ xwidget_start_redisplay (void)
862{ 760{
863 int i; 761 int i;
864 for (i = 0; i < MAX_XWIDGETS; i++) 762 for (i = 0; i < MAX_XWIDGETS; i++)
865 xwidgets[i].redisplayed = 0; 763 xwidget_views[i].redisplayed = 0;
866 764
867} 765}
868 766
869/* the xwidget was touched during redisplay, so it isnt a candidate for hiding*/ 767/* the xwidget was touched during redisplay, so it isnt a candidate for hiding*/
870void 768void
871xwidget_touch (struct xwidget *xw) 769xwidget_touch (struct xwidget_view *xw)
872{ 770{
873 //printf("touch xwidget %d\n", xw->id); 771 //printf("touch xwidget %d\n", xw->id);
874 xw->redisplayed = 1; 772 xw->redisplayed = 1;
875} 773}
876 774
877int 775int
878xwidget_touched (struct xwidget *xw) 776xwidget_touched (struct xwidget_view *xw)
879{ 777{
880 return xw->redisplayed; 778 return xw->redisplayed;
881} 779}
@@ -893,6 +791,10 @@ xwidget_touched (struct xwidget *xw)
893void 791void
894xwidget_end_redisplay (struct glyph_matrix *matrix) 792xwidget_end_redisplay (struct glyph_matrix *matrix)
895{ 793{
794 return; //until I convert this to MVC
795
796
797
896 int i; 798 int i;
897 struct xwidget *xw; 799 struct xwidget *xw;
898 int area; 800 int area;
@@ -962,44 +864,10 @@ xwidget_end_redisplay (struct glyph_matrix *matrix)
962 } 864 }
963} 865}
964 866
965/* some type of modification was made to the buffers*/ 867/* some type of modification was made to the buffers(unused)*/
966void 868void
967xwidget_modify_region (void) 869xwidget_modify_region (void)
968{ 870{
969 region_modified = 1; 871 region_modified = 1;
970} 872}
971 873
972////////////////////////////////////////////////////////////////
973
974/* delete the xwidget and its native widget peer */
975void
976xwidget_delete (struct xwidget *xw)
977{
978 printf ("xwidget %d deleted\n", xw->id);
979 xw->initialized = 0;
980 gtk_widget_destroy (xw->widget);
981
982}
983
984
985
986
987/* redraw all xwidgets */
988void
989xwidget_invalidate (void)
990{
991 int i;
992 struct xwidget *xw;
993 printf ("invalidate ");
994 for (i = 0; i < MAX_XWIDGETS; i++)
995 {
996 xw = &xwidgets[i];
997 if (xw->initialized)
998 {
999 printf ("%d,", i);
1000 gtk_widget_queue_draw_area (xw->widget, 0, 0, xw->width,
1001 xw->height);
1002 }
1003 }
1004 printf ("\n");
1005}
diff --git a/src/xwidget.h b/src/xwidget.h
index 3852103d78d..c66568eaac0 100644
--- a/src/xwidget.h
+++ b/src/xwidget.h
@@ -9,28 +9,42 @@ int valid_xwidget_p (Lisp_Object object) ;
9 9
10#include <gtk/gtk.h> 10#include <gtk/gtk.h>
11 11
12
12/* 13/*
13each xwidget instance is described by this struct. 14each xwidget instance/model is described by this struct.
14 */ 15 */
15struct xwidget{ 16struct xwidget{
16 int id; 17 int id;
17 int type; 18 int type;
18 int hidden;
19 GtkWidget* widget;
20 GtkContainer* widgetwindow;
21
22 char* title; 19 char* title;
23 int initialized; 20
21
24 int height; 22 int height;
25 int width; 23 int width;
26 int x; int y; 24 int initialized;
27 Lisp_Object message_hook; 25};
28 int redisplayed; 26
27
28//struct for each xwidget view
29struct xwidget_view{
30 struct xwidget* model;
31
32 int hidden;//if the "live" instance isnt drawn
33 int redisplayed; //if touched by redisplay
34 int initialized;
35
36 GtkWidget* widget;
37 GtkContainer* widgetwindow;
29 GtkContainer* emacswindow; 38 GtkContainer* emacswindow;
39 int x; int y;
30 int clipx; int clipy; 40 int clipx; int clipy;
41 struct window *w;
31}; 42};
32 43
33 44
45
46
47
34struct xwidget_type 48struct xwidget_type
35{ 49{
36 /* A symbol uniquely identifying the xwidget type, */ 50 /* A symbol uniquely identifying the xwidget type, */
@@ -44,19 +58,18 @@ struct xwidget_type
44 struct xwidget_type *next; 58 struct xwidget_type *next;
45}; 59};
46 60
47 61static struct xwidget_type *lookup_xwidget_type (Lisp_Object symbol);
48static INLINE struct xwidget_type *lookup_xwidget_type (Lisp_Object symbol);
49
50
51 62
52struct xwidget* xwidget_from_id(int id); 63struct xwidget* xwidget_from_id(int id);
53 64
54extern int xwidget_owns_kbd; 65extern int xwidget_owns_kbd;
55 66
56void xwidget_start_redisplay(); 67void xwidget_start_redisplay();
57void xwidget_end_redisplay(struct glyph_matrix* matrix); 68void xwidget_end_redisplay(struct glyph_matrix* matrix);
58void xwidget_modify_region(); 69void xwidget_modify_region();
59 70
60void xwidget_touch(struct xwidget* xw); 71void xwidget_touch (struct xwidget_view *xw);
61void xwidget_delete(struct xwidget* xw); 72
62void assert_valid_xwidget_id(int id,char *str); 73void assert_valid_xwidget_id(int id,char *str);
74
75int lookup_xwidget (Lisp_Object spec);