diff options
| author | Stefan Monnier | 2014-03-23 18:30:47 -0400 |
|---|---|---|
| committer | Stefan Monnier | 2014-03-23 18:30:47 -0400 |
| commit | f6614a4770f298ad6ccdf6995adb706cc4d03c11 (patch) | |
| tree | 689644fd288b74045fe77137e614bf58c15c9651 /src/buffer.c | |
| parent | ee79b33f490f476db6ebde90eff5268588d32207 (diff) | |
| download | emacs-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.c | 49 |
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 | ||
| 3152 | static int | 3153 | static 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 | } |