Subject: bug#47832: 28.0.50; define-fringe-bitmap and emacs --daemon

From: Gregory Heytings <[email-masked]>
Date: Tue, 25 May 2021 12:44:34 +0000

>> diff --git a/src/fringe.c b/src/fringe.c
>> index 65c9a84..47615f5 100644
>> --- a/src/fringe.c
>> +++ b/src/fringe.c
>> @@ -1776,14 +1776,15 @@ gui_init_fringe (struct redisplay_interface *rif)
>>    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);
>> +      if (!fringe_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++)
>> +  for (bt = NO_FRINGE_BITMAP + 1; bt < max_used_fringe_bitmap; bt++)
>>      {
>>        struct fringe_bitmap *fb = fringe_bitmaps[bt];
>>        if (fb)
>
> Why does the second for-loop go again over the bitmaps that the first 
> one already processed?  Or what am I missing?
>

Each loop processes its "own" bitmaps.  In the first loop 
define_fringe_bitmap is called only if (!fringe_bitmaps[bt]), in the 
second loop it is called only if (fringe_bitmaps[bt]).  IOW, the first 
loop processes the standard bitmaps that are not overridden by 
user-defined bitmaps, and the second loop processes user-defined bitmaps.