diff options
| author | Joakim Verona | 2011-06-25 22:53:39 +0200 |
|---|---|---|
| committer | Joakim Verona | 2011-06-25 22:53:39 +0200 |
| commit | 9fa0e291e866fb7945e18cd2ad8514090c13d510 (patch) | |
| tree | 7535f7de7040c4200c669bd15c0bf153aa27c597 /src | |
| parent | 6716c046071a641da713adf2e1e3d2f583643a9d (diff) | |
| download | emacs-9fa0e291e866fb7945e18cd2ad8514090c13d510.tar.gz emacs-9fa0e291e866fb7945e18cd2ad8514090c13d510.zip | |
cleanups + small step towards better lisp interface. use syms rather than ints for xwidget types
Diffstat (limited to 'src')
| -rw-r--r-- | src/xdisp.c | 6 | ||||
| -rw-r--r-- | src/xwidget.c | 94 | ||||
| -rw-r--r-- | src/xwidget.h | 8 |
3 files changed, 51 insertions, 57 deletions
diff --git a/src/xdisp.c b/src/xdisp.c index 5fa75e60bf4..c48610b37f2 100644 --- a/src/xdisp.c +++ b/src/xdisp.c | |||
| @@ -20994,8 +20994,7 @@ fill_image_glyph_string (struct glyph_string *s) | |||
| 20994 | } | 20994 | } |
| 20995 | 20995 | ||
| 20996 | static void | 20996 | static void |
| 20997 | fill_xwidget_glyph_string (s) | 20997 | fill_xwidget_glyph_string (struct glyph_string *s) |
| 20998 | struct glyph_string *s; | ||
| 20999 | { | 20998 | { |
| 21000 | xassert (s->first_glyph->type == XWIDGET_GLYPH); | 20999 | xassert (s->first_glyph->type == XWIDGET_GLYPH); |
| 21001 | printf("fill_xwidget_glyph_string: width:%d \n",s->first_glyph->pixel_width); | 21000 | printf("fill_xwidget_glyph_string: width:%d \n",s->first_glyph->pixel_width); |
| @@ -22124,8 +22123,7 @@ produce_image_glyph (struct it *it) | |||
| 22124 | } | 22123 | } |
| 22125 | 22124 | ||
| 22126 | static void | 22125 | static void |
| 22127 | produce_xwidget_glyph (it) | 22126 | produce_xwidget_glyph (struct it *it) |
| 22128 | struct it *it; | ||
| 22129 | { | 22127 | { |
| 22130 | // struct image *img; | 22128 | // struct image *img; |
| 22131 | struct face *face; | 22129 | struct face *face; |
diff --git a/src/xwidget.c b/src/xwidget.c index f2d06ae1792..8e8bd4ca4b4 100644 --- a/src/xwidget.c +++ b/src/xwidget.c | |||
| @@ -94,10 +94,12 @@ Lisp_Object Qxwidget_info; | |||
| 94 | Lisp_Object Qxwidget_resize_internal; | 94 | Lisp_Object Qxwidget_resize_internal; |
| 95 | Lisp_Object Qxwidget_send_keyboard_event; | 95 | Lisp_Object Qxwidget_send_keyboard_event; |
| 96 | 96 | ||
| 97 | extern Lisp_Object QCdata, QCtype; | 97 | Lisp_Object Qbutton, Qtoggle, Qslider, Qsocket, Qcairo, QCplist; |
| 98 | extern Lisp_Object QCwidth, QCheight; | ||
| 99 | 98 | ||
| 100 | 99 | ||
| 100 | extern Lisp_Object QCtype; | ||
| 101 | extern Lisp_Object QCwidth, QCheight; | ||
| 102 | |||
| 101 | #define XG_XWIDGET "emacs_xwidget" | 103 | #define XG_XWIDGET "emacs_xwidget" |
| 102 | struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window *w); | 104 | struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window *w); |
| 103 | 105 | ||
| @@ -191,6 +193,13 @@ void xwidget_plug_added(GtkSocket *socket, | |||
| 191 | printf("xwidget_plug_added\n"); | 193 | printf("xwidget_plug_added\n"); |
| 192 | } | 194 | } |
| 193 | 195 | ||
| 196 | gboolean xwidget_plug_removed(GtkSocket *socket, | ||
| 197 | gpointer user_data) | ||
| 198 | { | ||
| 199 | printf("xwidget_plug_removed\n"); | ||
| 200 | return TRUE; /* dont run the default handler because that kills the socket and we want to reuse it*/ | ||
| 201 | } | ||
| 202 | |||
| 194 | 203 | ||
| 195 | int xwidget_view_index=0; | 204 | int xwidget_view_index=0; |
| 196 | 205 | ||
| @@ -209,36 +218,32 @@ xwidget_init_view ( | |||
| 209 | xv->model = xww; | 218 | xv->model = xww; |
| 210 | 219 | ||
| 211 | //widget creation | 220 | //widget creation |
| 212 | switch (xww->type) | 221 | if(EQ(xww->type, Qbutton)) |
| 213 | { | 222 | { |
| 214 | case 1: | ||
| 215 | xv->widget = gtk_button_new_with_label (xww->title); | 223 | xv->widget = gtk_button_new_with_label (xww->title); |
| 216 | g_signal_connect (G_OBJECT (xv->widget), "clicked", | 224 | g_signal_connect (G_OBJECT (xv->widget), "clicked", |
| 217 | G_CALLBACK (buttonclick_handler), xww); //the model rather than the view | 225 | G_CALLBACK (buttonclick_handler), xww); //the model rather than the view |
| 218 | break; | 226 | } else if (EQ(xww->type, Qtoggle)) { |
| 219 | case 2: | ||
| 220 | xv->widget = gtk_toggle_button_new_with_label (xww->title); | 227 | xv->widget = gtk_toggle_button_new_with_label (xww->title); |
| 221 | break; | 228 | } else if (EQ(xww->type, Qsocket)) { |
| 222 | case 3: | ||
| 223 | xv->widget = gtk_socket_new (); | 229 | xv->widget = gtk_socket_new (); |
| 224 | //gtk_widget_set_app_paintable (xw->widget, TRUE); //workaround for composited sockets | 230 | //gtk_widget_set_app_paintable (xw->widget, TRUE); //workaround for composited sockets |
| 225 | 231 | ||
| 226 | //gdk_color_parse("blue",&color); //the blue color never seems to show up. something else draws a grey bg | 232 | //gdk_color_parse("blue",&color); //the blue color never seems to show up. something else draws a grey bg |
| 227 | //gtk_widget_modify_bg(xv->widget, GTK_STATE_NORMAL, &color); | 233 | //gtk_widget_modify_bg(xv->widget, GTK_STATE_NORMAL, &color); |
| 228 | g_signal_connect_after(xv->widget, "plug-added", G_CALLBACK(xwidget_plug_added), "plug added"); | 234 | g_signal_connect_after(xv->widget, "plug-added", G_CALLBACK(xwidget_plug_added), "plug added"); |
| 229 | break; | 235 | g_signal_connect_after(xv->widget, "plug-removed", G_CALLBACK(xwidget_plug_removed), "plug removed"); |
| 230 | case 4: | 236 | } else if (EQ(xww->type, Qsocket)) { |
| 231 | xv->widget = | 237 | xv->widget = |
| 232 | gtk_hscale_new (GTK_ADJUSTMENT | 238 | gtk_hscale_new (GTK_ADJUSTMENT |
| 233 | (gtk_adjustment_new (0, 0, 100, 1, 1, 0))); | 239 | (gtk_adjustment_new (0, 0, 100, 1, 1, 0))); |
| 234 | 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 | 240 | 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 |
| 235 | break; | 241 | } else if (EQ(xww->type, Qcairo)) { |
| 236 | case 5: | ||
| 237 | //Cairo view | 242 | //Cairo view |
| 238 | //uhm cairo is differentish in gtk 3. | 243 | //uhm cairo is differentish in gtk 3. |
| 239 | //gdk_cairo_create (gtk_widget_get_window (f->gwfixed)); | 244 | //gdk_cairo_create (gtk_widget_get_window (f->gwfixed)); |
| 240 | break; | 245 | } else return NULL; |
| 241 | } | 246 | |
| 242 | //widget realization | 247 | //widget realization |
| 243 | //make container widget 1st, and put the actual widget inside the container | 248 | //make container widget 1st, and put the actual widget inside the container |
| 244 | //later, drawing should crop container window if necessary to handle case where xwidget | 249 | //later, drawing should crop container window if necessary to handle case where xwidget |
| @@ -277,9 +282,7 @@ xwidget_init_view ( | |||
| 277 | // g_signal_connect_after(xw->widget, "damage-event", G_CALLBACK(xwidget_composite_draw), "damaged"); | 282 | // g_signal_connect_after(xw->widget, "damage-event", G_CALLBACK(xwidget_composite_draw), "damaged"); |
| 278 | 283 | ||
| 279 | //widgettype specific initialization only possible after realization | 284 | //widgettype specific initialization only possible after realization |
| 280 | switch (xww->type) | 285 | if (EQ(xww->type, Qsocket)) { |
| 281 | { | ||
| 282 | case 3: | ||
| 283 | printf ("xwid:%d socket id:%x %d\n", | 286 | printf ("xwid:%d socket id:%x %d\n", |
| 284 | xww->id, | 287 | xww->id, |
| 285 | gtk_socket_get_id (GTK_SOCKET (xv->widget)), | 288 | gtk_socket_get_id (GTK_SOCKET (xv->widget)), |
| @@ -287,8 +290,7 @@ xwidget_init_view ( | |||
| 287 | send_xembed_ready_event (xww->id, | 290 | send_xembed_ready_event (xww->id, |
| 288 | gtk_socket_get_id (GTK_SOCKET (xv->widget))); | 291 | gtk_socket_get_id (GTK_SOCKET (xv->widget))); |
| 289 | //gtk_widget_realize(xw->widget); | 292 | //gtk_widget_realize(xw->widget); |
| 290 | break; | 293 | } |
| 291 | } | ||
| 292 | return xv; | 294 | return xv; |
| 293 | } | 295 | } |
| 294 | 296 | ||
| @@ -423,6 +425,7 @@ DEFUN ("xwidget-embed-steal-window", Fxwidget_embed_steal_window, Sxwidget_embed | |||
| 423 | } | 425 | } |
| 424 | 426 | ||
| 425 | 427 | ||
| 428 | |||
| 426 | DEFUN ("xwidget-resize-internal", Fxwidget_resize_internal, Sxwidget_resize_internal, 3, 3, 0, doc: | 429 | DEFUN ("xwidget-resize-internal", Fxwidget_resize_internal, Sxwidget_resize_internal, 3, 3, 0, doc: |
| 427 | ) | 430 | ) |
| 428 | (Lisp_Object xwidget_id, Lisp_Object new_width, Lisp_Object new_height) | 431 | (Lisp_Object xwidget_id, Lisp_Object new_width, Lisp_Object new_height) |
| @@ -601,40 +604,24 @@ syms_of_xwidget (void) | |||
| 601 | { | 604 | { |
| 602 | int i; | 605 | int i; |
| 603 | 606 | ||
| 604 | Qxwidget_set_keyboard_grab = intern ("xwidget-set-keyboard-grab"); | ||
| 605 | staticpro (&Qxwidget_set_keyboard_grab); | ||
| 606 | defsubr (&Sxwidget_set_keyboard_grab); | 607 | defsubr (&Sxwidget_set_keyboard_grab); |
| 607 | |||
| 608 | Qxwidget_send_keyboard_event = intern ("xwidget-send-keyboard-event"); | ||
| 609 | staticpro (&Qxwidget_send_keyboard_event); | ||
| 610 | defsubr (&Sxwidget_send_keyboard_event); | 608 | defsubr (&Sxwidget_send_keyboard_event); |
| 611 | |||
| 612 | Qxwidget_embed_steal_window = intern ("xwidget-embed-steal-window"); | ||
| 613 | staticpro (&Qxwidget_embed_steal_window); | ||
| 614 | defsubr (&Sxwidget_embed_steal_window); | 609 | defsubr (&Sxwidget_embed_steal_window); |
| 615 | |||
| 616 | Qxwidget_info = intern ("xwidget-info"); | ||
| 617 | staticpro (&Qxwidget_info); | ||
| 618 | defsubr (&Sxwidget_info); | 610 | defsubr (&Sxwidget_info); |
| 619 | |||
| 620 | Qxwidget_resize_internal = intern ("xwidget-resize-internal"); | ||
| 621 | staticpro (&Qxwidget_resize_internal); | ||
| 622 | defsubr (&Sxwidget_resize_internal); | 611 | defsubr (&Sxwidget_resize_internal); |
| 623 | |||
| 624 | |||
| 625 | Qxwidget_embed_steal_window = intern ("xwidget-embed-steal-window"); | ||
| 626 | staticpro (&Qxwidget_embed_steal_window); | ||
| 627 | defsubr (&Sxwidget_embed_steal_window); | 612 | defsubr (&Sxwidget_embed_steal_window); |
| 628 | 613 | ||
| 614 | DEFSYM (Qxwidget ,"xwidget"); | ||
| 615 | DEFSYM (Qxwidget_id ,":xwidget-id"); | ||
| 616 | DEFSYM (Qtitle ,":title"); | ||
| 629 | 617 | ||
| 630 | Qxwidget = intern ("xwidget"); | 618 | DEFSYM (Qbutton, "button"); |
| 631 | staticpro (&Qxwidget); | 619 | DEFSYM (Qtoggle, "toggle"); |
| 632 | 620 | DEFSYM (Qslider, "slider"); | |
| 633 | Qxwidget_id = intern (":xwidget-id"); | 621 | DEFSYM (Qsocket, "socket"); |
| 634 | staticpro (&Qxwidget_id); | 622 | DEFSYM (Qcairo, "cairo"); |
| 635 | 623 | ||
| 636 | Qtitle = intern (":title"); | 624 | DEFSYM (QCplist, ":plist"); |
| 637 | staticpro (&Qtitle); | ||
| 638 | 625 | ||
| 639 | Fprovide (intern ("xwidget-internal"), Qnil); | 626 | Fprovide (intern ("xwidget-internal"), Qnil); |
| 640 | 627 | ||
| @@ -683,7 +670,7 @@ valid_xwidget_p (Lisp_Object object) | |||
| 683 | 670 | ||
| 684 | 671 | ||
| 685 | 672 | ||
| 686 | 673 | /* find a value associated with key in spec */ | |
| 687 | Lisp_Object | 674 | Lisp_Object |
| 688 | xwidget_spec_value ( | 675 | xwidget_spec_value ( |
| 689 | Lisp_Object spec, Lisp_Object key, | 676 | Lisp_Object spec, Lisp_Object key, |
| @@ -738,7 +725,9 @@ struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window * | |||
| 738 | int | 725 | int |
| 739 | lookup_xwidget (Lisp_Object spec) | 726 | lookup_xwidget (Lisp_Object spec) |
| 740 | { | 727 | { |
| 741 | /*when a xwidget lisp spec is found initialize the C struct*/ | 728 | /*when a xwidget lisp spec is found initialize the C struct that is used in the C code. |
| 729 | |||
| 730 | */ | ||
| 742 | int found = 0, found1 = 0, found2 = 0; | 731 | int found = 0, found1 = 0, found2 = 0; |
| 743 | Lisp_Object value; | 732 | Lisp_Object value; |
| 744 | int id; | 733 | int id; |
| @@ -750,7 +739,7 @@ lookup_xwidget (Lisp_Object spec) | |||
| 750 | xw = &xwidgets[id]; | 739 | xw = &xwidgets[id]; |
| 751 | xw->id=id; | 740 | xw->id=id; |
| 752 | value = xwidget_spec_value (spec, QCtype, &found); | 741 | value = xwidget_spec_value (spec, QCtype, &found); |
| 753 | xw->type = INTEGERP (value) ? XFASTINT (value) : 1; //default to button | 742 | xw->type = SYMBOLP (value) ? value : Qbutton; //default to button |
| 754 | value = xwidget_spec_value (spec, Qtitle, &found2); | 743 | value = xwidget_spec_value (spec, Qtitle, &found2); |
| 755 | xw->title = STRINGP (value) ? (char *) SDATA (value) : "?"; //funky cast FIXME | 744 | xw->title = STRINGP (value) ? (char *) SDATA (value) : "?"; //funky cast FIXME |
| 756 | 745 | ||
| @@ -759,7 +748,8 @@ lookup_xwidget (Lisp_Object spec) | |||
| 759 | value = xwidget_spec_value (spec, QCwidth, NULL); | 748 | value = xwidget_spec_value (spec, QCwidth, NULL); |
| 760 | xw->width = INTEGERP (value) ? XFASTINT (value) : 50; //ok | 749 | xw->width = INTEGERP (value) ? XFASTINT (value) : 50; //ok |
| 761 | 750 | ||
| 762 | 751 | value = xwidget_spec_value (spec, QCplist, Qnil); | |
| 752 | xw->plist = value; | ||
| 763 | printf ("xwidget_id:%d type:%d found:%d %d %d title:%s (%d,%d)\n", id, | 753 | printf ("xwidget_id:%d type:%d found:%d %d %d title:%s (%d,%d)\n", id, |
| 764 | xw->type, found, found1, found2, xw->title, xw->height, xw->width); | 754 | xw->type, found, found1, found2, xw->title, xw->height, xw->width); |
| 765 | 755 | ||
| @@ -769,6 +759,10 @@ lookup_xwidget (Lisp_Object spec) | |||
| 769 | return id; | 759 | return id; |
| 770 | } | 760 | } |
| 771 | 761 | ||
| 762 | |||
| 763 | |||
| 764 | |||
| 765 | |||
| 772 | ////////////////////////////////// | 766 | ////////////////////////////////// |
| 773 | int region_modified = 0; | 767 | int region_modified = 0; |
| 774 | 768 | ||
diff --git a/src/xwidget.h b/src/xwidget.h index c66568eaac0..9e3d4669056 100644 --- a/src/xwidget.h +++ b/src/xwidget.h | |||
| @@ -14,9 +14,11 @@ int valid_xwidget_p (Lisp_Object object) ; | |||
| 14 | each xwidget instance/model is described by this struct. | 14 | each xwidget instance/model is described by this struct. |
| 15 | */ | 15 | */ |
| 16 | struct xwidget{ | 16 | struct xwidget{ |
| 17 | int id; | 17 | Lisp_Object plist;//auxilliary data |
| 18 | int type; | 18 | Lisp_Object type;//the widget type |
| 19 | char* title; | 19 | |
| 20 | int id; // id is stored inside the struct which is conveniont in some cases | ||
| 21 | char* title;//a title that is used for button labels for instance | ||
| 20 | 22 | ||
| 21 | 23 | ||
| 22 | int height; | 24 | int height; |