aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.c
diff options
context:
space:
mode:
authorStefan Monnier2014-03-23 18:30:47 -0400
committerStefan Monnier2014-03-23 18:30:47 -0400
commitf6614a4770f298ad6ccdf6995adb706cc4d03c11 (patch)
tree689644fd288b74045fe77137e614bf58c15c9651 /src/buffer.c
parentee79b33f490f476db6ebde90eff5268588d32207 (diff)
downloademacs-f6614a4770f298ad6ccdf6995adb706cc4d03c11.tar.gz
emacs-f6614a4770f298ad6ccdf6995adb706cc4d03c11.zip
* lisp/simple.el (redisplay-highlight-region-function): Increase priority of
overlay to make sure boundaries are visible. * src/buffer.c (struct sortvec): Add field `spriority'. (compare_overlays): Use it. (sort_overlays): Set it. Fixes: debbugs:15899
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c49
1 files changed, 36 insertions, 13 deletions
diff --git a/src/buffer.c b/src/buffer.c
index daafbcef0e4..a1678951984 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -3147,6 +3147,7 @@ struct sortvec
3147 Lisp_Object overlay; 3147 Lisp_Object overlay;
3148 ptrdiff_t beg, end; 3148 ptrdiff_t beg, end;
3149 EMACS_INT priority; 3149 EMACS_INT priority;
3150 EMACS_INT spriority; /* Secondary priority. */
3150}; 3151};
3151 3152
3152static int 3153static int
@@ -3154,19 +3155,28 @@ compare_overlays (const void *v1, const void *v2)
3154{ 3155{
3155 const struct sortvec *s1 = v1; 3156 const struct sortvec *s1 = v1;
3156 const struct sortvec *s2 = v2; 3157 const struct sortvec *s2 = v2;
3158 /* Return 1 if s1 should take precedence, -1 if v2 should take precedence,
3159 and 0 if they're equal. */
3157 if (s1->priority != s2->priority) 3160 if (s1->priority != s2->priority)
3158 return s1->priority < s2->priority ? -1 : 1; 3161 return s1->priority < s2->priority ? -1 : 1;
3159 if (s1->beg != s2->beg) 3162 /* If the priority is equal, give precedence to the one not covered by the
3160 return s1->beg < s2->beg ? -1 : 1; 3163 other. If neither covers the other, obey spriority. */
3161 if (s1->end != s2->end) 3164 else if (s1->beg < s2->beg)
3165 return (s1->end < s2->end && s1->spriority > s2->spriority ? 1 : -1);
3166 else if (s1->beg > s2->beg)
3167 return (s1->end > s2->end && s1->spriority < s2->spriority ? -1 : 1);
3168 else if (s1->end != s2->end)
3162 return s2->end < s1->end ? -1 : 1; 3169 return s2->end < s1->end ? -1 : 1;
3163 /* Avoid the non-determinism of qsort by choosing an arbitrary ordering 3170 else if (s1->spriority != s2->spriority)
3164 between "equal" overlays. The result can still change between 3171 return (s1->spriority < s2->spriority ? -1 : 1);
3165 invocations of Emacs, but it won't change in the middle of 3172 else if (EQ (s1->overlay, s2->overlay))
3166 `find_field' (bug#6830). */ 3173 return 0;
3167 if (!EQ (s1->overlay, s2->overlay)) 3174 else
3175 /* Avoid the non-determinism of qsort by choosing an arbitrary ordering
3176 between "equal" overlays. The result can still change between
3177 invocations of Emacs, but it won't change in the middle of
3178 `find_field' (bug#6830). */
3168 return XLI (s1->overlay) < XLI (s2->overlay) ? -1 : 1; 3179 return XLI (s1->overlay) < XLI (s2->overlay) ? -1 : 1;
3169 return 0;
3170} 3180}
3171 3181
3172/* Sort an array of overlays by priority. The array is modified in place. 3182/* Sort an array of overlays by priority. The array is modified in place.
@@ -3209,10 +3219,23 @@ sort_overlays (Lisp_Object *overlay_vec, ptrdiff_t noverlays, struct window *w)
3209 sortvec[j].beg = OVERLAY_POSITION (OVERLAY_START (overlay)); 3219 sortvec[j].beg = OVERLAY_POSITION (OVERLAY_START (overlay));
3210 sortvec[j].end = OVERLAY_POSITION (OVERLAY_END (overlay)); 3220 sortvec[j].end = OVERLAY_POSITION (OVERLAY_END (overlay));
3211 tem = Foverlay_get (overlay, Qpriority); 3221 tem = Foverlay_get (overlay, Qpriority);
3212 if (INTEGERP (tem)) 3222 if (NILP (tem))
3213 sortvec[j].priority = XINT (tem); 3223 {
3214 else 3224 sortvec[j].priority = 0;
3215 sortvec[j].priority = 0; 3225 sortvec[j].spriority = 0;
3226 }
3227 else if (INTEGERP (tem))
3228 {
3229 sortvec[j].priority = XINT (tem);
3230 sortvec[j].spriority = 0;
3231 }
3232 else if (CONSP (tem))
3233 {
3234 Lisp_Object car = XCAR (tem);
3235 Lisp_Object cdr = XCDR (tem);
3236 sortvec[j].priority = INTEGERP (car) ? XINT (car) : 0;
3237 sortvec[j].spriority = INTEGERP (cdr) ? XINT (cdr) : 0;
3238 }
3216 j++; 3239 j++;
3217 } 3240 }
3218 } 3241 }