diff options
| author | Joakim Verona | 2012-07-18 10:56:08 +0200 |
|---|---|---|
| committer | Joakim Verona | 2012-07-18 10:56:08 +0200 |
| commit | 82da003bbce9d1b93480ba20713432f7c27bf7de (patch) | |
| tree | 95577969ab2c9ab7774889b5f898e32f129fb8a4 /src/xwidget.c | |
| parent | 7f914423eafcd40a7c2f394949d7bb5eeb5cdfff (diff) | |
| download | emacs-82da003bbce9d1b93480ba20713432f7c27bf7de.tar.gz emacs-82da003bbce9d1b93480ba20713432f7c27bf7de.zip | |
some experimental support for gobject introspection
Diffstat (limited to 'src/xwidget.c')
| -rw-r--r-- | src/xwidget.c | 68 |
1 files changed, 66 insertions, 2 deletions
diff --git a/src/xwidget.c b/src/xwidget.c index f59f2f32d1e..a9e3477d103 100644 --- a/src/xwidget.c +++ b/src/xwidget.c | |||
| @@ -102,6 +102,9 @@ | |||
| 102 | #include <webkit/webkitdownload.h> | 102 | #include <webkit/webkitdownload.h> |
| 103 | #endif | 103 | #endif |
| 104 | 104 | ||
| 105 | //for GIR | ||
| 106 | #include <girepository.h> | ||
| 107 | |||
| 105 | #include "xwidget.h" | 108 | #include "xwidget.h" |
| 106 | 109 | ||
| 107 | //TODO should of course not be a hardcoded array but I can't be bothered atm | 110 | //TODO should of course not be a hardcoded array but I can't be bothered atm |
| @@ -137,7 +140,7 @@ Lisp_Object Qxwidget_info; | |||
| 137 | Lisp_Object Qxwidget_resize; | 140 | Lisp_Object Qxwidget_resize; |
| 138 | Lisp_Object Qxwidget_send_keyboard_event; | 141 | Lisp_Object Qxwidget_send_keyboard_event; |
| 139 | 142 | ||
| 140 | Lisp_Object Qbutton, Qtoggle, Qslider, Qsocket, Qsocket_osr, Qcairo, | 143 | Lisp_Object Qbutton, Qtoggle, Qslider, Qsocket, Qsocket_osr, Qcairo, Qxwgir, |
| 141 | Qwebkit_osr, QCplist; | 144 | Qwebkit_osr, QCplist; |
| 142 | 145 | ||
| 143 | 146 | ||
| @@ -601,6 +604,46 @@ xwidget_osr_button_callback (GtkWidget *widget, | |||
| 601 | return TRUE; //dont propagate this event furter | 604 | return TRUE; //dont propagate this event furter |
| 602 | } | 605 | } |
| 603 | 606 | ||
| 607 | |||
| 608 | GtkWidget* xwgir_create(char* class){ | ||
| 609 | //create a gtk widget, given its name | ||
| 610 | //find the constructor | ||
| 611 | //call it | ||
| 612 | //also figure out how to pass args | ||
| 613 | /* gboolean g_function_info_invoke (GIFunctionInfo *info, */ | ||
| 614 | /* const GIArgument *in_args, */ | ||
| 615 | /* int n_in_args, */ | ||
| 616 | /* const GIArgument *out_args, */ | ||
| 617 | /* int n_out_args, */ | ||
| 618 | /* GIArgument *return_value, */ | ||
| 619 | /* GError **error); */ | ||
| 620 | char* namespace = "Gtk"; | ||
| 621 | char* namespace_version = "3.0"; | ||
| 622 | GError *error = NULL; | ||
| 623 | GIRepository *repository; | ||
| 624 | GIArgument return_value; | ||
| 625 | /* GtkWidget* rv; */ | ||
| 626 | repository = g_irepository_get_default(); | ||
| 627 | g_irepository_require(repository, namespace, namespace_version, 0, &error); | ||
| 628 | if (error) { | ||
| 629 | g_error("ERROR: %s\n", error->message); | ||
| 630 | return NULL; | ||
| 631 | } | ||
| 632 | |||
| 633 | GIObjectInfo* obj_info = g_irepository_find_by_name(repository, namespace, class); | ||
| 634 | GIFunctionInfo* f_info = g_object_info_find_method (obj_info, "new"); | ||
| 635 | g_function_info_invoke(f_info, | ||
| 636 | 0, NULL, | ||
| 637 | 0, NULL, | ||
| 638 | &return_value, | ||
| 639 | NULL); | ||
| 640 | return return_value.v_pointer; | ||
| 641 | |||
| 642 | } | ||
| 643 | |||
| 644 | |||
| 645 | |||
| 646 | |||
| 604 | int xwidget_view_index=0; | 647 | int xwidget_view_index=0; |
| 605 | 648 | ||
| 606 | /* initializes and does initial placement of an xwidget view on screen */ | 649 | /* initializes and does initial placement of an xwidget view on screen */ |
| @@ -635,6 +678,9 @@ xwidget_init_view (struct xwidget *xww, | |||
| 635 | } else if (EQ(xww->type, Qtoggle)) { | 678 | } else if (EQ(xww->type, Qtoggle)) { |
| 636 | xv->widget = gtk_toggle_button_new_with_label (XSTRING(xww->title)->data); | 679 | xv->widget = gtk_toggle_button_new_with_label (XSTRING(xww->title)->data); |
| 637 | //xv->widget = gtk_entry_new ();//temp hack to experiment with key propagation TODO entry widget is useful for testing | 680 | //xv->widget = gtk_entry_new ();//temp hack to experiment with key propagation TODO entry widget is useful for testing |
| 681 | } else if (EQ(xww->type, Qxwgir)) { | ||
| 682 | //this is just a test for xwgir | ||
| 683 | xv->widget = xwgir_create ("Button"); | ||
| 638 | } else if (EQ(xww->type, Qsocket)) { | 684 | } else if (EQ(xww->type, Qsocket)) { |
| 639 | xv->widget = gtk_socket_new (); | 685 | xv->widget = gtk_socket_new (); |
| 640 | g_signal_connect_after(xv->widget, "plug-added", G_CALLBACK(xwidget_plug_added), "plug added"); | 686 | g_signal_connect_after(xv->widget, "plug-added", G_CALLBACK(xwidget_plug_added), "plug added"); |
| @@ -721,7 +767,21 @@ xwidget_init_view (struct xwidget *xww, | |||
| 721 | #endif | 767 | #endif |
| 722 | 768 | ||
| 723 | 769 | ||
| 724 | } else return NULL; | 770 | } else { |
| 771 | //here we have run out of hard coded symbols, we will now attempt to create | ||
| 772 | //a widget dynamically | ||
| 773 | //TODO | ||
| 774 | // - support OSR | ||
| 775 | // - support constructor args | ||
| 776 | // - support signals | ||
| 777 | // - check that the argument widget type actually exists | ||
| 778 | printf("xwgir symbol %s:\n",SDATA(SYMBOL_NAME(xww->type))); | ||
| 779 | //xv->widget = xwgir_create ("Button"); | ||
| 780 | xv->widget = xwgir_create(SDATA(SYMBOL_NAME(xww->type))); | ||
| 781 | |||
| 782 | } | ||
| 783 | |||
| 784 | //else return NULL; | ||
| 725 | 785 | ||
| 726 | //widget realization | 786 | //widget realization |
| 727 | //make container widget 1st, and put the actual widget inside the container | 787 | //make container widget 1st, and put the actual widget inside the container |
| @@ -1245,6 +1305,8 @@ syms_of_xwidget (void) | |||
| 1245 | DEFSYM (Qsocket_osr, "socket-osr"); | 1305 | DEFSYM (Qsocket_osr, "socket-osr"); |
| 1246 | DEFSYM (Qcairo, "cairo"); | 1306 | DEFSYM (Qcairo, "cairo"); |
| 1247 | 1307 | ||
| 1308 | DEFSYM (Qxwgir, "xwgir"); | ||
| 1309 | |||
| 1248 | DEFSYM (QCplist, ":plist"); | 1310 | DEFSYM (QCplist, ":plist"); |
| 1249 | 1311 | ||
| 1250 | DEFVAR_LISP ("xwidget-alist", Vxwidget_alist, doc: /*xwidgets list*/); | 1312 | DEFVAR_LISP ("xwidget-alist", Vxwidget_alist, doc: /*xwidgets list*/); |
| @@ -1471,4 +1533,6 @@ xwidget_end_redisplay (struct window *w, struct glyph_matrix *matrix) | |||
| 1471 | } | 1533 | } |
| 1472 | } | 1534 | } |
| 1473 | } | 1535 | } |
| 1536 | |||
| 1537 | |||
| 1474 | #endif | 1538 | #endif |