aboutsummaryrefslogtreecommitdiffstats
path: root/src/xwidget.c
diff options
context:
space:
mode:
authorPo Lu2021-10-29 11:33:06 +0800
committerLars Ingebrigtsen2021-11-07 02:59:39 +0100
commit5c387ad437872c6e95599710ba5dcdfaa470c5ea (patch)
treedb21cc292335e934f1eb93509828426fee40d0fa /src/xwidget.c
parent61d049aaff2ede48d3d4b357bc1cb06447f15229 (diff)
downloademacs-5c387ad437872c6e95599710ba5dcdfaa470c5ea.tar.gz
emacs-5c387ad437872c6e95599710ba5dcdfaa470c5ea.zip
Enable scrolling optimization for xwidgets
* src/dispextern.h (struct glyph): Store xwidget ID instead of a reference. * src/dispnew.c (scrolling_window): Enable scrolling optimization on xwidget builds. * src/xdisp.c (fill_xwidget_glyph_string, produce_xwidget_glyph): Obtain xwidget from ID. * src/xterm.c (x_scroll_run): Scroll xwidget windows. * src/xwidget.c (id_to_xwidget_map, xwidget_counter): New xwidget variables. (Fmake_xwidget): Assign each xwidget a unique ID, and keep track of that ID. (xwidget_from_id): New function. (syms_of_xwidget): Initialize id_to_xwidget_map. (xwidget_end_redisplay): Lookup xwidgets via ID. * src/xwidget.h (struct xwidget): Add ID field. (xwidget_from_id): New function.
Diffstat (limited to 'src/xwidget.c')
-rw-r--r--src/xwidget.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/xwidget.c b/src/xwidget.c
index 62b30a07ab0..68188eba08c 100644
--- a/src/xwidget.c
+++ b/src/xwidget.c
@@ -41,6 +41,9 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
41#include "nsxwidget.h" 41#include "nsxwidget.h"
42#endif 42#endif
43 43
44static Lisp_Object id_to_xwidget_map;
45static uint32_t xwidget_counter = 0;
46
44#ifdef USE_GTK 47#ifdef USE_GTK
45static Lisp_Object x_window_to_xwv_map; 48static Lisp_Object x_window_to_xwv_map;
46#endif 49#endif
@@ -114,6 +117,9 @@ Returns the newly constructed xwidget, or nil if construction fails. */)
114 XSETXWIDGET (val, xw); 117 XSETXWIDGET (val, xw);
115 Vxwidget_list = Fcons (val, Vxwidget_list); 118 Vxwidget_list = Fcons (val, Vxwidget_list);
116 xw->plist = Qnil; 119 xw->plist = Qnil;
120 xw->xwidget_id = ++xwidget_counter;
121
122 Fputhash (make_fixnum (xw->xwidget_id), val, id_to_xwidget_map);
117 123
118#ifdef USE_GTK 124#ifdef USE_GTK
119 xw->widgetwindow_osr = NULL; 125 xw->widgetwindow_osr = NULL;
@@ -227,6 +233,18 @@ xwidget_hidden (struct xwidget_view *xv)
227 return xv->hidden; 233 return xv->hidden;
228} 234}
229 235
236struct xwidget *
237xwidget_from_id (uint32_t id)
238{
239 Lisp_Object key = make_fixnum (id);
240 Lisp_Object xwidget = Fgethash (key, id_to_xwidget_map, Qnil);
241
242 if (NILP (xwidget))
243 emacs_abort ();
244
245 return XXWIDGET (xwidget);
246}
247
230#ifdef USE_GTK 248#ifdef USE_GTK
231 249
232struct xwidget_view * 250struct xwidget_view *
@@ -1242,6 +1260,9 @@ syms_of_xwidget (void)
1242 1260
1243 Fprovide (intern ("xwidget-internal"), Qnil); 1261 Fprovide (intern ("xwidget-internal"), Qnil);
1244 1262
1263 id_to_xwidget_map = CALLN (Fmake_hash_table, QCtest, Qeq);
1264 staticpro (&id_to_xwidget_map);
1265
1245#ifdef USE_GTK 1266#ifdef USE_GTK
1246 x_window_to_xwv_map = CALLN (Fmake_hash_table, QCtest, Qeq); 1267 x_window_to_xwv_map = CALLN (Fmake_hash_table, QCtest, Qeq);
1247 1268
@@ -1385,7 +1406,7 @@ xwidget_end_redisplay (struct window *w, struct glyph_matrix *matrix)
1385 /* The only call to xwidget_end_redisplay is in dispnew. 1406 /* The only call to xwidget_end_redisplay is in dispnew.
1386 xwidget_end_redisplay (w->current_matrix); */ 1407 xwidget_end_redisplay (w->current_matrix); */
1387 struct xwidget_view *xv 1408 struct xwidget_view *xv
1388 = xwidget_view_lookup (glyph->u.xwidget, w); 1409 = xwidget_view_lookup (xwidget_from_id (glyph->u.xwidget), w);
1389#ifdef USE_GTK 1410#ifdef USE_GTK
1390 /* FIXME: Is it safe to assume xwidget_view_lookup 1411 /* FIXME: Is it safe to assume xwidget_view_lookup
1391 always succeeds here? If so, this comment can be removed. 1412 always succeeds here? If so, this comment can be removed.
@@ -1448,6 +1469,7 @@ kill_buffer_xwidgets (Lisp_Object buffer)
1448 { 1469 {
1449 CHECK_XWIDGET (xwidget); 1470 CHECK_XWIDGET (xwidget);
1450 struct xwidget *xw = XXWIDGET (xwidget); 1471 struct xwidget *xw = XXWIDGET (xwidget);
1472 Fremhash (make_fixnum (xw->xwidget_id), id_to_xwidget_map);
1451#ifdef USE_GTK 1473#ifdef USE_GTK
1452 if (xw->widget_osr && xw->widgetwindow_osr) 1474 if (xw->widget_osr && xw->widgetwindow_osr)
1453 { 1475 {