diff options
| author | Joakim Verona | 2013-07-01 01:07:54 -0700 |
|---|---|---|
| committer | Joakim Verona | 2013-07-01 01:07:54 -0700 |
| commit | 1ce45b902c67b8a0dda8d71bd2812de29a9988a6 (patch) | |
| tree | 358fc8474007d2c88e6f33b39cb376596d55621a | |
| parent | e791b833abdf63dee8195b371dbf0f084b76e512 (diff) | |
| parent | 204e1a81bcba51f955bf5a64782b3e43eea5ea76 (diff) | |
| download | emacs-1ce45b902c67b8a0dda8d71bd2812de29a9988a6.tar.gz emacs-1ce45b902c67b8a0dda8d71bd2812de29a9988a6.zip | |
Merge pull request #6 from daimrod/struct_to_Lisp_Object
Struct to lisp object
| -rw-r--r-- | src/xwidget.c | 185 | ||||
| -rw-r--r-- | src/xwidget.h | 19 |
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 | ||
| 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* |
| @@ -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 | ||
| 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,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 | |||
| 1701 | xwidget_view_delete_all_in_window (struct window *w) | 1679 | xwidget_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* | |||
| 1716 | xwidget_view_lookup (struct xwidget* xw, struct window *w) | 1697 | xwidget_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) | |||
| 1765 | void | 1749 | void |
| 1766 | xwidget_start_redisplay (void) | 1750 | xwidget_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) | |||
| 1849 | void | 1835 | void |
| 1850 | kill_buffer_xwidgets (Lisp_Object buffer) | 1836 | kill_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 |
| 46 | struct xwidget_view{ | 46 | struct 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 | ||
| 80 | struct xwidget_type | 81 | struct xwidget_type |
| 81 | { | 82 | { |