aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJoakim Verona2013-07-01 01:07:54 -0700
committerJoakim Verona2013-07-01 01:07:54 -0700
commit1ce45b902c67b8a0dda8d71bd2812de29a9988a6 (patch)
tree358fc8474007d2c88e6f33b39cb376596d55621a /src
parente791b833abdf63dee8195b371dbf0f084b76e512 (diff)
parent204e1a81bcba51f955bf5a64782b3e43eea5ea76 (diff)
downloademacs-1ce45b902c67b8a0dda8d71bd2812de29a9988a6.tar.gz
emacs-1ce45b902c67b8a0dda8d71bd2812de29a9988a6.zip
Merge pull request #6 from daimrod/struct_to_Lisp_Object
Struct to lisp object
Diffstat (limited to 'src')
-rw-r--r--src/xwidget.c185
-rw-r--r--src/xwidget.h19
2 files changed, 95 insertions, 109 deletions
diff --git a/src/xwidget.c b/src/xwidget.c
index 57d27a2b3c7..21cf47b8a7a 100644
--- a/src/xwidget.c
+++ b/src/xwidget.c
@@ -96,13 +96,6 @@
96 96
97#include "xwidget.h" 97#include "xwidget.h"
98 98
99//TODO should of course not be a hardcoded array but I can't be bothered atm
100//just a fixed array of xwidgets for now
101//would need to be hashtables or something
102
103#define MAX_XWIDGETS 100
104struct xwidget_view xwidget_views[MAX_XWIDGETS];
105
106//TODO embryo of lisp allocators for xwidgets 99//TODO embryo of lisp allocators for xwidgets
107//TODO xwidget* should be Lisp_xwidget* 100//TODO xwidget* should be Lisp_xwidget*
108struct xwidget* 101struct xwidget*
@@ -215,7 +208,7 @@ TYPE is a symbol which can take one of the following values:
215 208
216 xw->height = XFASTINT(height); 209 xw->height = XFASTINT(height);
217 xw->width = XFASTINT(width); 210 xw->width = XFASTINT(width);
218 XSETPSEUDOVECTOR (val, xw, PVEC_XWIDGET); // set the vectorlike_header of VAL with the correct value 211 XSETXWIDGET (val, xw); // set the vectorlike_header of VAL with the correct value
219 Vxwidget_list = Fcons (val, Vxwidget_list); 212 Vxwidget_list = Fcons (val, Vxwidget_list);
220 xw->widgetwindow_osr = NULL; 213 xw->widgetwindow_osr = NULL;
221 xw->widget_osr = NULL; 214 xw->widget_osr = NULL;
@@ -439,25 +432,20 @@ xwidget_slider_changed (GtkRange *range,
439 432
440 printf("slider changed val:%f\n", v); 433 printf("slider changed val:%f\n", v);
441 434
442 435 for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); tail = XCDR (tail))
443 //block sibling views signal handlers
444 for (int i = 0; i < MAX_XWIDGETS; i++)
445 {
446 xv = &xwidget_views[i];
447 if(xv->initialized && xvp->model == xv->model){
448 g_signal_handler_block( xv->widget,xv->handler_id);
449 }
450 }
451 //set values of sibling views and unblock
452 for (int i = 0; i < MAX_XWIDGETS; i++)
453 { 436 {
454 xv = &xwidget_views[i]; 437 if (XXWIDGET_VIEW_P (XCAR (tail))) {
455 if(xv->initialized && xvp->model == xv->model){ 438 xv = XXWIDGET_VIEW (XCAR (tail));
456 gtk_range_set_value(GTK_RANGE(xv->widget), v); 439 if (EQ (xvp->model, xv->model)) {
457 g_signal_handler_unblock( xv->widget,xv->handler_id); 440 //block sibling views signal handlers
441 g_signal_handler_block(xv->widget, xv->handler_id);
442
443 //set values of sibling views and unblock
444 gtk_range_set_value(GTK_RANGE(xv->widget), v);
445 g_signal_handler_unblock(xv->widget,xv->handler_id);
446 }
458 } 447 }
459 } 448 }
460
461} 449}
462 450
463 451
@@ -471,11 +459,13 @@ xwidget_osr_damage_event_callback (GtkWidget *widget, GdkEventExpose *event, gpo
471 struct xwidget_view* xv; 459 struct xwidget_view* xv;
472 //webkit_osr_redraw_child(xw, widget); 460 //webkit_osr_redraw_child(xw, widget);
473 printf ("damage\n"); 461 printf ("damage\n");
474 for (int i = 0; i < MAX_XWIDGETS; i++)//todo mvc refactor 462
463 for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); tail = XCDR (tail))
475 { 464 {
476 xv = &xwidget_views[i]; 465 if (XXWIDGET_VIEW_P (XCAR (tail))) {
477 if(xv->initialized && xv->model == xw){ 466 xv = XXWIDGET_VIEW (XCAR (tail));
478 gtk_widget_queue_draw (xv->widget); //redraw all views, the master has changed 467 if (XXWIDGET (xv->model) == xw)
468 gtk_widget_queue_draw (xv->widget); //redraw all views, the master has changed
479 } 469 }
480 } 470 }
481 471
@@ -958,13 +948,11 @@ xwidget_osr_event_set_embedder (GtkWidget *widget,
958 GdkEvent *event, 948 GdkEvent *event,
959 gpointer xv) 949 gpointer xv)
960{ 950{
961 xwidget_set_embedder_view(((struct xwidget_view*) xv)->model, 951 xwidget_set_embedder_view(XXWIDGET (((struct xwidget_view*) xv)->model),
962 (struct xwidget_view*) xv); 952 (struct xwidget_view*) xv);
963} 953}
964 954
965 955
966int xwidget_view_index=0;
967
968/* initializes and does initial placement of an xwidget view on screen */ 956/* initializes and does initial placement of an xwidget view on screen */
969struct xwidget_view* 957struct xwidget_view*
970xwidget_init_view (struct xwidget *xww, 958xwidget_init_view (struct xwidget *xww,
@@ -972,21 +960,15 @@ xwidget_init_view (struct xwidget *xww,
972 int x, int y) 960 int x, int y)
973{ 961{
974 //TODO temp code replace with lisp list 962 //TODO temp code replace with lisp list
975 struct xwidget_view *xv; 963 struct xwidget_view *xv = allocate_xwidget_view();
964 Lisp_Object val;
976 GdkColor color; 965 GdkColor color;
977 966
978 do{ 967 XSETXWIDGET_VIEW (val, xv) ;
979 if(xwidget_view_index < MAX_XWIDGETS) 968 Vxwidget_view_list = Fcons (val, Vxwidget_view_list);
980 xwidget_view_index++; 969
981 else 970 XSETWINDOW(xv->w, s->w);
982 xwidget_view_index=0; 971 XSETXWIDGET(xv->model, xww);
983
984 xv = &xwidget_views[xwidget_view_index];
985 }while( xv->initialized == 1); //TODO yeah this can infloop if there are MAX_WIDGETS on-screen
986
987 xv->initialized = 1;
988 xv->w = s->w;
989 xv->model = xww;
990 972
991 //widget creation 973 //widget creation
992 if(EQ(xww->type, Qbutton)) 974 if(EQ(xww->type, Qbutton))
@@ -1136,21 +1118,18 @@ x_draw_xwidget_glyph_string (struct glyph_string *s)
1136 int box_line_vwidth = max (s->face->box_line_width, 0); 1118 int box_line_vwidth = max (s->face->box_line_width, 0);
1137 int height = s->height; 1119 int height = s->height;
1138 struct xwidget *xww = s->xwidget; 1120 struct xwidget *xww = s->xwidget;
1139 struct xwidget_view *xv = xwidget_view_lookup(xww, (s->w)); 1121 struct xwidget_view *xv = xwidget_view_lookup(xww, s->w);
1140 int clip_right; int clip_bottom; int clip_top; int clip_left; 1122 int clip_right; int clip_bottom; int clip_top; int clip_left;
1141 1123
1142 int x = s->x; 1124 int x = s->x;
1143 int y = s->y + (s->height / 2) - (xww->height / 2); 1125 int y = s->y + (s->height / 2) - (xww->height / 2);
1144 int moved=0; 1126 int moved=0;
1145 1127
1146 if (xv == NULL || xv->initialized == 0){ 1128 /* We do it here in the display loop because there is no other
1147 /* Views must be initialized once(only once). 1129 time to know things like window placement etc.
1148 We do it here in the display loop because there is no other time to know things like 1130 */
1149 window placement etc. 1131 printf ("xv init for xw %d\n", xww);
1150 */ 1132 xv = xwidget_init_view (xww, s, x, y);
1151 printf ("xv init for xw %d\n", xww);
1152 xv = xwidget_init_view (xww, s, x, y);
1153 }
1154 1133
1155 //calculate clipping, which is used for all manner of onscreen xwidget views 1134 //calculate clipping, which is used for all manner of onscreen xwidget views
1156 //each widget border can get clipped by other emacs objects so there are four clipping variables 1135 //each widget border can get clipped by other emacs objects so there are four clipping variables
@@ -1377,12 +1356,14 @@ DEFUN ("xwidget-resize", Fxwidget_resize, Sxwidget_resize, 3, 3, 0, doc:
1377 1356
1378 } 1357 }
1379 1358
1380 for (int i = 0; i < MAX_XWIDGETS; i++) //TODO MVC refactor lazy linear search 1359 for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); tail = XCDR (tail)) //TODO MVC refactor lazy linear search
1381 { 1360 {
1382 xv = &xwidget_views[i]; 1361 if (XXWIDGET_VIEW_P (XCAR (tail))) {
1383 if(xv->initialized && xv->model == xw){ 1362 xv = XXWIDGET_VIEW (XCAR (tail));
1384 gtk_layout_set_size (GTK_LAYOUT (xv->widgetwindow), xw->width, xw->height); 1363 if(XXWIDGET (xv->model) == xw) {
1385 gtk_widget_set_size_request (GTK_WIDGET (xv->widget), xw->width, xw->height); 1364 gtk_layout_set_size (GTK_LAYOUT (xv->widgetwindow), xw->width, xw->height);
1365 gtk_widget_set_size_request (GTK_WIDGET (xv->widget), xw->width, xw->height);
1366 }
1386 } 1367 }
1387 } 1368 }
1388 1369
@@ -1525,17 +1506,16 @@ DEFUN("xwidget-delete-zombies", Fxwidget_delete_zombies , Sxwidget_delete_zombie
1525 1506
1526 */ 1507 */
1527 struct xwidget_view* xv = NULL; 1508 struct xwidget_view* xv = NULL;
1528 Lisp_Object w; 1509 for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); tail = XCDR (tail))
1529 for (int i = 0; i < MAX_XWIDGETS; i++){ 1510 {
1530 xv = &xwidget_views[i]; 1511 if (XXWIDGET_VIEW_P (XCAR (tail))) {
1531 if (xv->w != NULL) 1512 xv = XXWIDGET_VIEW (XCAR (tail));
1532 XSETWINDOW(w, xv->w); 1513 if(!WINDOW_LIVE_P (xv->w)) {
1533 if(xv->initialized && (! (WINDOW_LIVE_P(w)))){ 1514 gtk_widget_destroy(GTK_WIDGET(xv->widgetwindow));
1534 1515 Vxwidget_view_list = Fdelq (XCAR (tail), Vxwidget_view_list);
1535 gtk_widget_destroy(GTK_WIDGET(xv->widgetwindow)); 1516 }
1536 xv->initialized = 0;
1537 } 1517 }
1538 } 1518 }
1539} 1519}
1540 1520
1541 1521
@@ -1622,13 +1602,11 @@ syms_of_xwidget (void)
1622 DEFVAR_LISP ("xwidget-list", Vxwidget_list, doc: /*xwidgets list*/); 1602 DEFVAR_LISP ("xwidget-list", Vxwidget_list, doc: /*xwidgets list*/);
1623 Vxwidget_list = Qnil; 1603 Vxwidget_list = Qnil;
1624 1604
1625 DEFVAR_LISP ("xwidget-view-alist", Vxwidget_view_alist, doc: /*xwidget views list*/); 1605 DEFVAR_LISP ("xwidget-view-list", Vxwidget_view_list, doc: /*xwidget views list*/);
1626 Vxwidget_view_alist = Qnil; 1606 Vxwidget_view_list = Qnil;
1627 1607
1628 Fprovide (intern ("xwidget-internal"), Qnil); 1608 Fprovide (intern ("xwidget-internal"), Qnil);
1629 1609
1630 // for (i = 0; i < MAX_XWIDGETS; i++)
1631 //xwidgets[i].initialized = 0;
1632} 1610}
1633 1611
1634 1612
@@ -1701,13 +1679,16 @@ void
1701xwidget_view_delete_all_in_window (struct window *w) 1679xwidget_view_delete_all_in_window (struct window *w)
1702{ 1680{
1703 struct xwidget_view* xv = NULL; 1681 struct xwidget_view* xv = NULL;
1704 for (int i = 0; i < MAX_XWIDGETS; i++){ 1682 for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); tail = XCDR (tail))
1705 xv = &xwidget_views[i]; 1683 {
1706 if(xv->initialized && xv->w == w){ 1684 if (XXWIDGET_VIEW_P (XCAR (tail))) {
1707 gtk_widget_destroy(GTK_WIDGET(xv->widgetwindow)); 1685 xv = XXWIDGET_VIEW (XCAR (tail));
1708 xv->initialized = 0; 1686 if(XWINDOW (xv->w) == w) {
1687 gtk_widget_destroy(GTK_WIDGET(xv->widgetwindow));
1688 Vxwidget_view_list = Fdelq (XCAR (tail), Vxwidget_view_list);
1689 }
1709 } 1690 }
1710 } 1691 }
1711} 1692}
1712 1693
1713 1694
@@ -1716,11 +1697,14 @@ struct xwidget_view*
1716xwidget_view_lookup (struct xwidget* xw, struct window *w) 1697xwidget_view_lookup (struct xwidget* xw, struct window *w)
1717{ 1698{
1718 struct xwidget_view* xv = NULL; 1699 struct xwidget_view* xv = NULL;
1719 for (int i = 0; i < MAX_XWIDGETS; i++){ 1700 for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); tail = XCDR (tail))
1720 xv = &xwidget_views[i]; 1701 {
1721 if (xv->initialized && (xv->model == xw) && (xv->w == w)) 1702 if (XXWIDGET_VIEW_P (XCAR (tail))) {
1722 return xv; 1703 xv = XXWIDGET_VIEW (XCAR (tail));
1723 } 1704 if (XXWIDGET (xv->model) == xw && XWINDOW (xv->w) == w)
1705 return xv;
1706 }
1707 }
1724 return NULL; /* we didnt find a matching view */ 1708 return NULL; /* we didnt find a matching view */
1725} 1709}
1726 1710
@@ -1765,10 +1749,11 @@ lookup_xwidget (Lisp_Object spec)
1765void 1749void
1766xwidget_start_redisplay (void) 1750xwidget_start_redisplay (void)
1767{ 1751{
1768 int i; 1752 for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); tail = XCDR (tail))
1769 for (i = 0; i < MAX_XWIDGETS; i++) 1753 {
1770 xwidget_views[i].redisplayed = 0; 1754 if (XXWIDGET_VIEW_P (XCAR (tail)))
1771 1755 XXWIDGET_VIEW (XCAR (tail))->redisplayed = 0;
1756 }
1772} 1757}
1773 1758
1774/* the xwidget was touched during redisplay, so it isnt a candidate for hiding*/ 1759/* the xwidget was touched during redisplay, so it isnt a candidate for hiding*/
@@ -1830,18 +1815,19 @@ xwidget_end_redisplay (struct window *w, struct glyph_matrix *matrix)
1830 } 1815 }
1831 } 1816 }
1832 1817
1833 for (i = 0; i < MAX_XWIDGETS; i++) 1818 for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); tail = XCDR (tail))
1834 { 1819 {
1835 struct xwidget_view* xv = &xwidget_views[i]; 1820 if (XXWIDGET_VIEW_P (XCAR (tail))) {
1821 struct xwidget_view* xv = XXWIDGET_VIEW (XCAR (tail));
1836 1822
1837 //"touched" is only meaningful for the current window, so disregard other views 1823 //"touched" is only meaningful for the current window, so disregard other views
1838 if (xv->initialized && ( xv->w == w)) 1824 if (XWINDOW (xv->w) == w) {
1839 {
1840 if (xwidget_touched(xv)) 1825 if (xwidget_touched(xv))
1841 xwidget_show_view (xv); 1826 xwidget_show_view (xv);
1842 else 1827 else
1843 xwidget_hide_view (xv); 1828 xwidget_hide_view (xv);
1844 } 1829 }
1830 }
1845 } 1831 }
1846} 1832}
1847 1833
@@ -1849,14 +1835,13 @@ xwidget_end_redisplay (struct window *w, struct glyph_matrix *matrix)
1849void 1835void
1850kill_buffer_xwidgets (Lisp_Object buffer) 1836kill_buffer_xwidgets (Lisp_Object buffer)
1851{ 1837{
1852 Lisp_Object tail, xw; 1838 Lisp_Object tail, xw;
1853 1839 for (tail = Fget_buffer_xwidgets (buffer); CONSP (tail); tail = XCDR (tail))
1854 for (tail = Fget_buffer_xwidgets (buffer); CONSP (tail); tail = XCDR (tail)) 1840 {
1855 { 1841 xw = XCAR (tail);
1856 xw = XCAR (tail); 1842 Vxwidget_list = Fdelq (xw, Vxwidget_list);
1857 Vxwidget_list = Fdelq (xw, Vxwidget_list); 1843 /* TODO free the GTK things in xw */
1858 /* TODO free the GTK things in xw */ 1844 }
1859 }
1860} 1845}
1861 1846
1862#endif /* HAVE_XWIDGETS */ 1847#endif /* HAVE_XWIDGETS */
diff --git a/src/xwidget.h b/src/xwidget.h
index 530b087796c..f8c804aac46 100644
--- a/src/xwidget.h
+++ b/src/xwidget.h
@@ -43,22 +43,17 @@ struct xwidget{
43 43
44 44
45//struct for each xwidget view 45//struct for each xwidget view
46struct xwidget_view{ 46struct xwidget_view {
47 struct vectorlike_header header; 47 struct vectorlike_header header;
48 struct xwidget* model; //TODO should be lisp 48 Lisp_Object model;
49 49 Lisp_Object w;
50 50
51 //here ends the lisp part. 51 //here ends the lisp part.
52 //"redisplayed" is the marker field 52 //"redisplayed" is the marker field
53 int redisplayed; //if touched by redisplay 53 int redisplayed; //if touched by redisplay
54 54
55
56 struct window *w; //TODO should be lisp
57
58 int hidden;//if the "live" instance isnt drawn 55 int hidden;//if the "live" instance isnt drawn
59 56
60 int initialized;
61
62 GtkWidget* widget; 57 GtkWidget* widget;
63 GtkContainer* widgetwindow; 58 GtkContainer* widgetwindow;
64 GtkContainer* emacswindow; 59 GtkContainer* emacswindow;
@@ -72,10 +67,16 @@ struct xwidget_view{
72 67
73/* Test for xwidget (xwidget . spec) (car must be the symbol xwidget)*/ 68/* Test for xwidget (xwidget . spec) (car must be the symbol xwidget)*/
74#define XWIDGETP(x) (CONSP (x) && EQ (XCAR (x), Qxwidget)) 69#define XWIDGETP(x) (CONSP (x) && EQ (XCAR (x), Qxwidget))
70
75/* Test for xwidget pseudovector*/ 71/* Test for xwidget pseudovector*/
76#define XXWIDGETP(x) PSEUDOVECTORP (x, PVEC_XWIDGET) 72#define XXWIDGETP(x) PSEUDOVECTORP (x, PVEC_XWIDGET)
77#define XXWIDGET(a) (eassert (XXWIDGETP(a)),(struct xwidget *) XPNTR(a)) 73#define XXWIDGET(a) (eassert (XXWIDGETP(a)), \
74 (struct xwidget *) XUNTAG(a, Lisp_Vectorlike))
78 75
76/* Test for xwidget_view pseudovector */
77#define XXWIDGET_VIEW_P(x) PSEUDOVECTORP (x, PVEC_XWIDGET_VIEW)
78#define XXWIDGET_VIEW(a) (eassert (XXWIDGET_VIEW_P(a)), \
79 (struct xwidget_view *) XUNTAG(a, Lisp_Vectorlike))
79 80
80struct xwidget_type 81struct xwidget_type
81{ 82{