diff options
| author | Joakim Verona | 2011-06-22 02:03:38 +0200 |
|---|---|---|
| committer | Joakim Verona | 2011-06-22 02:03:38 +0200 |
| commit | 479d2bf9a9887d6b3d59ba077cb0ad564b180e07 (patch) | |
| tree | 4a7a38d313eb611830fa12f2d31f83e8e5627b5b /src | |
| parent | a7513ade3bc0fe79430d5541d88c9dcda0932bec (diff) | |
| download | emacs-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.c | 5 | ||||
| -rw-r--r-- | src/insdel.c | 2 | ||||
| -rw-r--r-- | src/xdisp.c | 5 | ||||
| -rw-r--r-- | src/xwidget.c | 370 | ||||
| -rw-r--r-- | src/xwidget.h | 47 |
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 | |||
| 299 | static void | 300 | static void |
| 300 | add_window_display_history (struct window *w, const char *msg, int paused_p) | 301 | add_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 | |||
| 1814 | modify_region (struct buffer *buffer, EMACS_INT start, EMACS_INT end, | 1814 | modify_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 |
| 79 | struct xwidget xwidgets[MAX_XWIDGETS]; | 82 | struct xwidget xwidgets[MAX_XWIDGETS]; |
| 83 | struct xwidget_view xwidget_views[MAX_XWIDGETS]; | ||
| 84 | |||
| 80 | 85 | ||
| 81 | static int once = 0; | ||
| 82 | 86 | ||
| 83 | 87 | ||
| 84 | Lisp_Object Qxwidget; | 88 | Lisp_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" |
| 102 | struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window *w); | ||
| 98 | 103 | ||
| 99 | int | 104 | int |
| 100 | xwidget_hidden(struct xwidget *xw) | 105 | xwidget_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; | |||
| 152 | int hasNamePixmap = 0; | 157 | int hasNamePixmap = 0; |
| 153 | 158 | ||
| 154 | 159 | ||
| 155 | int | ||
| 156 | xwidget_has_composition(void){ | ||
| 157 | int event_base, error_base; | ||
| 158 | Display* dpy = GDK_DISPLAY (); | ||
| 159 | int 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 | ||
| 175 | void | 162 | |
| 176 | xwidget_end_composition(struct xwidget* w){ | 163 | |
| 177 | //XCompositeUnredirectWindow(); stop redirecting, should be called when the socket is destroyed | ||
| 178 | } | ||
| 179 | 164 | ||
| 180 | void | 165 | void |
| 181 | xwidget_show (struct xwidget *xw) | 166 | xwidget_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 */ | |
| 191 | static gboolean | 176 | void |
| 192 | xwidget_composite_draw_phantom(struct xwidget* xw, | 177 | xwidget_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 | /* | ||
| 238 | static gboolean | ||
| 239 | xwidget_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 | ||
| 254 | void xwidget_plug_added(GtkSocket *socket, | 187 | void 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 | ||
| 261 | static gboolean | ||
| 262 | xwidget_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 */ | ||
| 291 | void | 198 | void |
| 292 | xwidget_init (struct xwidget *xw, struct glyph_string *s, int x, int y) | 199 | xwidget_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 */ | ||
| 768 | void | ||
| 769 | xwidget_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 | ||
| 714 | struct 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 | |||
| 823 | int | 721 | int |
| 824 | lookup_xwidget (Lisp_Object spec) | 722 | lookup_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*/ |
| 870 | void | 768 | void |
| 871 | xwidget_touch (struct xwidget *xw) | 769 | xwidget_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 | ||
| 877 | int | 775 | int |
| 878 | xwidget_touched (struct xwidget *xw) | 776 | xwidget_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) | |||
| 893 | void | 791 | void |
| 894 | xwidget_end_redisplay (struct glyph_matrix *matrix) | 792 | xwidget_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)*/ |
| 966 | void | 868 | void |
| 967 | xwidget_modify_region (void) | 869 | xwidget_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 */ | ||
| 975 | void | ||
| 976 | xwidget_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 */ | ||
| 988 | void | ||
| 989 | xwidget_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 | /* |
| 13 | each xwidget instance is described by this struct. | 14 | each xwidget instance/model is described by this struct. |
| 14 | */ | 15 | */ |
| 15 | struct xwidget{ | 16 | struct 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 | ||
| 29 | struct 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 | |||
| 34 | struct xwidget_type | 48 | struct 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 | 61 | static struct xwidget_type *lookup_xwidget_type (Lisp_Object symbol); | |
| 48 | static INLINE struct xwidget_type *lookup_xwidget_type (Lisp_Object symbol); | ||
| 49 | |||
| 50 | |||
| 51 | 62 | ||
| 52 | struct xwidget* xwidget_from_id(int id); | 63 | struct xwidget* xwidget_from_id(int id); |
| 53 | 64 | ||
| 54 | extern int xwidget_owns_kbd; | 65 | extern int xwidget_owns_kbd; |
| 55 | 66 | ||
| 56 | void xwidget_start_redisplay(); | 67 | void xwidget_start_redisplay(); |
| 57 | void xwidget_end_redisplay(struct glyph_matrix* matrix); | 68 | void xwidget_end_redisplay(struct glyph_matrix* matrix); |
| 58 | void xwidget_modify_region(); | 69 | void xwidget_modify_region(); |
| 59 | 70 | ||
| 60 | void xwidget_touch(struct xwidget* xw); | 71 | void xwidget_touch (struct xwidget_view *xw); |
| 61 | void xwidget_delete(struct xwidget* xw); | 72 | |
| 62 | void assert_valid_xwidget_id(int id,char *str); | 73 | void assert_valid_xwidget_id(int id,char *str); |
| 74 | |||
| 75 | int lookup_xwidget (Lisp_Object spec); | ||