diff options
| author | Grégoire Jadi | 2013-06-28 21:18:47 +0200 |
|---|---|---|
| committer | Grégoire Jadi | 2013-06-28 21:18:47 +0200 |
| commit | 204e1a81bcba51f955bf5a64782b3e43eea5ea76 (patch) | |
| tree | a979791d1f82256f1a4b361a17fd154f02660870 /src | |
| parent | 7a76a0ab447afdba5851d1fb9e0c07db90389782 (diff) | |
| download | emacs-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.c | 169 | ||||
| -rw-r--r-- | src/xwidget.h | 2 |
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 | ||
| 104 | struct 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* |
| 108 | struct xwidget* | 101 | struct 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 | ||
| 966 | int 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 */ |
| 969 | struct xwidget_view* | 957 | struct xwidget_view* |
| 970 | xwidget_init_view (struct xwidget *xww, | 958 | xwidget_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 | |||
| 1697 | xwidget_view_delete_all_in_window (struct window *w) | 1679 | xwidget_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* | |||
| 1712 | xwidget_view_lookup (struct xwidget* xw, struct window *w) | 1697 | xwidget_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) | |||
| 1761 | void | 1749 | void |
| 1762 | xwidget_start_redisplay (void) | 1750 | xwidget_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) | |||
| 1845 | void | 1835 | void |
| 1846 | kill_buffer_xwidgets (Lisp_Object buffer) | 1836 | kill_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; |