aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGrégoire Jadi2013-06-28 21:18:47 +0200
committerGrégoire Jadi2013-06-28 21:18:47 +0200
commit204e1a81bcba51f955bf5a64782b3e43eea5ea76 (patch)
treea979791d1f82256f1a4b361a17fd154f02660870 /src
parent7a76a0ab447afdba5851d1fb9e0c07db90389782 (diff)
downloademacs-204e1a81bcba51f955bf5a64782b3e43eea5ea76.tar.gz
emacs-204e1a81bcba51f955bf5a64782b3e43eea5ea76.zip
* src/xwidget.c: Replace xwidget_views by Vxwidget_view_list.
xwidget_views was an hardcoded array of fixed lenght of `struct xwidget_view', Vxwidget_view_list is a list of Lisp_Object. * src/xwidget.h (xwidget_view): Remove member `initialized'. This field was only used to determine whether a given xwidget_view was initialized or not in `xwidget_views'. Now only initialized xwidget_view are stored in Vxwidget_view_list.
Diffstat (limited to 'src')
-rw-r--r--src/xwidget.c169
-rw-r--r--src/xwidget.h2
2 files changed, 79 insertions, 92 deletions
diff --git a/src/xwidget.c b/src/xwidget.c
index a2ea996c56d..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*
@@ -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 && EQ (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 && EQ (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 && XXWIDGET (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
@@ -963,8 +953,6 @@ xwidget_osr_event_set_embedder (GtkWidget *widget,
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,19 +960,13 @@ 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
982 xwidget_view_index=0;
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 XSETWINDOW(xv->w, s->w); 970 XSETWINDOW(xv->w, s->w);
989 XSETXWIDGET(xv->model, xww); 971 XSETXWIDGET(xv->model, xww);
990 972
@@ -1143,14 +1125,11 @@ x_draw_xwidget_glyph_string (struct glyph_string *s)
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 && XXWIDGET (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,13 +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 for (int i = 0; i < MAX_XWIDGETS; i++){ 1509 for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); tail = XCDR (tail))
1529 xv = &xwidget_views[i]; 1510 {
1530 if(xv->initialized && !WINDOW_LIVE_P (xv->w)) { 1511 if (XXWIDGET_VIEW_P (XCAR (tail))) {
1512 xv = XXWIDGET_VIEW (XCAR (tail));
1513 if(!WINDOW_LIVE_P (xv->w)) {
1531 gtk_widget_destroy(GTK_WIDGET(xv->widgetwindow)); 1514 gtk_widget_destroy(GTK_WIDGET(xv->widgetwindow));
1532 xv->initialized = 0; 1515 Vxwidget_view_list = Fdelq (XCAR (tail), Vxwidget_view_list);
1516 }
1533 } 1517 }
1534 } 1518 }
1535} 1519}
1536 1520
1537 1521
@@ -1618,13 +1602,11 @@ syms_of_xwidget (void)
1618 DEFVAR_LISP ("xwidget-list", Vxwidget_list, doc: /*xwidgets list*/); 1602 DEFVAR_LISP ("xwidget-list", Vxwidget_list, doc: /*xwidgets list*/);
1619 Vxwidget_list = Qnil; 1603 Vxwidget_list = Qnil;
1620 1604
1621 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*/);
1622 Vxwidget_view_alist = Qnil; 1606 Vxwidget_view_list = Qnil;
1623 1607
1624 Fprovide (intern ("xwidget-internal"), Qnil); 1608 Fprovide (intern ("xwidget-internal"), Qnil);
1625 1609
1626 // for (i = 0; i < MAX_XWIDGETS; i++)
1627 //xwidgets[i].initialized = 0;
1628} 1610}
1629 1611
1630 1612
@@ -1697,13 +1679,16 @@ void
1697xwidget_view_delete_all_in_window (struct window *w) 1679xwidget_view_delete_all_in_window (struct window *w)
1698{ 1680{
1699 struct xwidget_view* xv = NULL; 1681 struct xwidget_view* xv = NULL;
1700 for (int i = 0; i < MAX_XWIDGETS; i++){ 1682 for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); tail = XCDR (tail))
1701 xv = &xwidget_views[i]; 1683 {
1702 if(xv->initialized && XWINDOW (xv->w) == w){ 1684 if (XXWIDGET_VIEW_P (XCAR (tail))) {
1703 gtk_widget_destroy(GTK_WIDGET(xv->widgetwindow)); 1685 xv = XXWIDGET_VIEW (XCAR (tail));
1704 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 }
1705 } 1690 }
1706 } 1691 }
1707} 1692}
1708 1693
1709 1694
@@ -1712,11 +1697,14 @@ struct xwidget_view*
1712xwidget_view_lookup (struct xwidget* xw, struct window *w) 1697xwidget_view_lookup (struct xwidget* xw, struct window *w)
1713{ 1698{
1714 struct xwidget_view* xv = NULL; 1699 struct xwidget_view* xv = NULL;
1715 for (int i = 0; i < MAX_XWIDGETS; i++){ 1700 for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); tail = XCDR (tail))
1716 xv = &xwidget_views[i]; 1701 {
1717 if (xv->initialized && (XXWIDGET (xv->model) == xw) && (XWINDOW (xv->w) == w)) 1702 if (XXWIDGET_VIEW_P (XCAR (tail))) {
1718 return xv; 1703 xv = XXWIDGET_VIEW (XCAR (tail));
1719 } 1704 if (XXWIDGET (xv->model) == xw && XWINDOW (xv->w) == w)
1705 return xv;
1706 }
1707 }
1720 return NULL; /* we didnt find a matching view */ 1708 return NULL; /* we didnt find a matching view */
1721} 1709}
1722 1710
@@ -1761,10 +1749,11 @@ lookup_xwidget (Lisp_Object spec)
1761void 1749void
1762xwidget_start_redisplay (void) 1750xwidget_start_redisplay (void)
1763{ 1751{
1764 int i; 1752 for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); tail = XCDR (tail))
1765 for (i = 0; i < MAX_XWIDGETS; i++) 1753 {
1766 xwidget_views[i].redisplayed = 0; 1754 if (XXWIDGET_VIEW_P (XCAR (tail)))
1767 1755 XXWIDGET_VIEW (XCAR (tail))->redisplayed = 0;
1756 }
1768} 1757}
1769 1758
1770/* 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*/
@@ -1826,18 +1815,19 @@ xwidget_end_redisplay (struct window *w, struct glyph_matrix *matrix)
1826 } 1815 }
1827 } 1816 }
1828 1817
1829 for (i = 0; i < MAX_XWIDGETS; i++) 1818 for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail); tail = XCDR (tail))
1830 { 1819 {
1831 struct xwidget_view* xv = &xwidget_views[i]; 1820 if (XXWIDGET_VIEW_P (XCAR (tail))) {
1821 struct xwidget_view* xv = XXWIDGET_VIEW (XCAR (tail));
1832 1822
1833 //"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
1834 if (xv->initialized && (XWINDOW (xv->w) == w)) 1824 if (XWINDOW (xv->w) == w) {
1835 {
1836 if (xwidget_touched(xv)) 1825 if (xwidget_touched(xv))
1837 xwidget_show_view (xv); 1826 xwidget_show_view (xv);
1838 else 1827 else
1839 xwidget_hide_view (xv); 1828 xwidget_hide_view (xv);
1840 } 1829 }
1830 }
1841 } 1831 }
1842} 1832}
1843 1833
@@ -1845,14 +1835,13 @@ xwidget_end_redisplay (struct window *w, struct glyph_matrix *matrix)
1845void 1835void
1846kill_buffer_xwidgets (Lisp_Object buffer) 1836kill_buffer_xwidgets (Lisp_Object buffer)
1847{ 1837{
1848 Lisp_Object tail, xw; 1838 Lisp_Object tail, xw;
1849 1839 for (tail = Fget_buffer_xwidgets (buffer); CONSP (tail); tail = XCDR (tail))
1850 for (tail = Fget_buffer_xwidgets (buffer); CONSP (tail); tail = XCDR (tail)) 1840 {
1851 { 1841 xw = XCAR (tail);
1852 xw = XCAR (tail); 1842 Vxwidget_list = Fdelq (xw, Vxwidget_list);
1853 Vxwidget_list = Fdelq (xw, Vxwidget_list); 1843 /* TODO free the GTK things in xw */
1854 /* TODO free the GTK things in xw */ 1844 }
1855 }
1856} 1845}
1857 1846
1858#endif /* HAVE_XWIDGETS */ 1847#endif /* HAVE_XWIDGETS */
diff --git a/src/xwidget.h b/src/xwidget.h
index c1ff13ee396..f8c804aac46 100644
--- a/src/xwidget.h
+++ b/src/xwidget.h
@@ -54,8 +54,6 @@ struct xwidget_view {
54 54
55 int hidden;//if the "live" instance isnt drawn 55 int hidden;//if the "live" instance isnt drawn
56 56
57 int initialized;
58
59 GtkWidget* widget; 57 GtkWidget* widget;
60 GtkContainer* widgetwindow; 58 GtkContainer* widgetwindow;
61 GtkContainer* emacswindow; 59 GtkContainer* emacswindow;