summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2019-08-13 17:49:51 +0300
committerEli Zaretskii <eliz@gnu.org>2019-08-13 17:49:51 +0300
commitc90975f92fd71be7282293e0ed1098c0fa5d62a0 (patch)
treeaa873f81d0436527a3b80e6f26bd41c5cd889934 /src
parent2b329ed420eb15f6738edd402697ac2876b2aa61 (diff)
downloademacs-c90975f92fd71be7282293e0ed1098c0fa5d62a0.tar.gz
Fix initialization of user-defined fringe bitmaps in daemon mode
* src/fringe.c (gui_init_fringe): Rename from w32_init_fringe or x_cr_init_fringe, and make unconditionally compiled; all callers changed. Do nothing if the frame's redisplay_interface doesn't implement the define_fringe_bitmap method. Set up any user-defined fringe bitmaps in addition to the standard bitmaps. Suggested by Liam Quinlan <liamkquinlan@gmail.com> in https://lists.gnu.org/archive/html/emacs-devel/2019-08/msg00259.html. (w32_reset_fringes) [HAVE_NTGUI]: Do nothing if the frame's redisplay_interface doesn't implement the destroy_fringe_bitmap method. * src/w32fns.c (Fx_create_frame): Call gui_init_fringe when the first GUI frame is created for this session. * src/dispextern.h (w32_init_fringe): Rename to gui_init_fringe and make unconditional. (x_cr_init_fringe): Remove prototype.
Diffstat (limited to 'src')
-rw-r--r--src/dispextern.h6
-rw-r--r--src/fringe.c25
-rw-r--r--src/w32fns.c6
-rw-r--r--src/w32term.c2
-rw-r--r--src/xterm.c2
5 files changed, 25 insertions, 16 deletions
diff --git a/src/dispextern.h b/src/dispextern.h
index 4e947daa253..05f199ff353 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -3360,13 +3360,11 @@ void draw_row_fringe_bitmaps (struct window *, struct glyph_row *);
bool draw_window_fringes (struct window *, bool);
bool update_window_fringes (struct window *, bool);
+void gui_init_fringe (struct redisplay_interface *);
+
#ifdef HAVE_NTGUI
-void w32_init_fringe (struct redisplay_interface *);
void w32_reset_fringes (void);
#endif
-#ifdef USE_CAIRO
-void x_cr_init_fringe (struct redisplay_interface *);
-#endif
extern unsigned row_hash (struct glyph_row *);
diff --git a/src/fringe.c b/src/fringe.c
index d0d599223d5..4c5a4d748fb 100644
--- a/src/fringe.c
+++ b/src/fringe.c
@@ -1765,27 +1765,32 @@ init_fringe (void)
fringe_faces = xzalloc (max_fringe_bitmaps * sizeof *fringe_faces);
}
-#if defined (HAVE_NTGUI) || defined (USE_CAIRO)
-
void
-#ifdef HAVE_NTGUI
-w32_init_fringe (struct redisplay_interface *rif)
-#else
-x_cr_init_fringe (struct redisplay_interface *rif)
-#endif
+gui_init_fringe (struct redisplay_interface *rif)
{
int bt;
- if (!rif)
+ if (!rif || !rif->define_fringe_bitmap)
return;
+ /* Set up the standard fringe bitmaps. */
for (bt = NO_FRINGE_BITMAP + 1; bt < MAX_STANDARD_FRINGE_BITMAPS; bt++)
{
struct fringe_bitmap *fb = &standard_bitmaps[bt];
rif->define_fringe_bitmap (bt, fb->bits, fb->height, fb->width);
}
+
+ /* Set up user-defined fringe bitmaps that might have been defined
+ before the frame of this kind was initialized. This can happen
+ if Emacs is started as a daemon and the init files define fringe
+ bitmaps. */
+ for ( ; bt < max_used_fringe_bitmap; bt++)
+ {
+ struct fringe_bitmap *fb = fringe_bitmaps[bt];
+ if (fb)
+ rif->define_fringe_bitmap (bt, fb->bits, fb->height, fb->width);
+ }
}
-#endif
#ifdef HAVE_NTGUI
void
@@ -1795,7 +1800,7 @@ w32_reset_fringes (void)
int bt;
struct redisplay_interface *rif = FRAME_RIF (SELECTED_FRAME ());
- if (!rif)
+ if (!rif || !rif->destroy_fringe_bitmap)
return;
for (bt = NO_FRINGE_BITMAP + 1; bt < max_used_fringe_bitmap; bt++)
diff --git a/src/w32fns.c b/src/w32fns.c
index fc80e018834..d6fd8f53490 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -5798,6 +5798,12 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
f->output_data.w32 = xzalloc (sizeof (struct w32_output));
FRAME_FONTSET (f) = -1;
+ /* Need to finish setting up of user-defined fringe bitmaps that
+ were defined before the first GUI frame was created (e.g., while
+ in daemon mode). */
+ if (!f->terminal->reference_count)
+ gui_init_fringe (f->terminal->rif);
+
fset_icon_name (f, gui_display_get_arg (dpyinfo,
parameters,
Qicon_name,
diff --git a/src/w32term.c b/src/w32term.c
index ad96287a43a..e5874f2d365 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -7299,7 +7299,7 @@ w32_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name)
horizontally reflected compared to how they appear on X, so we
need to bitswap and convert to unsigned shorts before creating
the bitmaps. */
- w32_init_fringe (terminal->rif);
+ gui_init_fringe (terminal->rif);
unblock_input ();
diff --git a/src/xterm.c b/src/xterm.c
index bbe68ef6221..0d224063d76 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -13531,7 +13531,7 @@ x_initialize (void)
#endif
#ifdef USE_CAIRO
- x_cr_init_fringe (&x_redisplay_interface);
+ gui_init_fringe (&x_redisplay_interface);
#endif
/* Note that there is no real way portable across R3/R4 to get the