diff options
| author | Po Lu | 2021-10-29 11:33:06 +0800 |
|---|---|---|
| committer | Lars Ingebrigtsen | 2021-11-07 02:59:39 +0100 |
| commit | 5c387ad437872c6e95599710ba5dcdfaa470c5ea (patch) | |
| tree | db21cc292335e934f1eb93509828426fee40d0fa /src/xwidget.c | |
| parent | 61d049aaff2ede48d3d4b357bc1cb06447f15229 (diff) | |
| download | emacs-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.c | 24 |
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 | ||
| 44 | static Lisp_Object id_to_xwidget_map; | ||
| 45 | static uint32_t xwidget_counter = 0; | ||
| 46 | |||
| 44 | #ifdef USE_GTK | 47 | #ifdef USE_GTK |
| 45 | static Lisp_Object x_window_to_xwv_map; | 48 | static 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 | ||
| 236 | struct xwidget * | ||
| 237 | xwidget_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 | ||
| 232 | struct xwidget_view * | 250 | struct 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 | { |