aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/decoration.c7
-rw-r--r--src/nvim/sign.c24
-rw-r--r--src/nvim/sign_defs.h6
-rw-r--r--test/functional/ui/decorations_spec.lua12
4 files changed, 26 insertions, 23 deletions
diff --git a/src/nvim/decoration.c b/src/nvim/decoration.c
index 9767c44897..95502e176c 100644
--- a/src/nvim/decoration.c
+++ b/src/nvim/decoration.c
@@ -664,11 +664,6 @@ next_mark:
return attr;
}
-typedef struct {
- DecorSignHighlight *sh;
- uint32_t id;
-} SignItem;
-
int sign_item_cmp(const void *p1, const void *p2)
{
const SignItem *s1 = (SignItem *)p1;
@@ -683,7 +678,7 @@ int sign_item_cmp(const void *p1, const void *p2)
}
if (s1->sh->sign_add_id != s2->sh->sign_add_id) {
- return s1->sh->sign_add_id > s2->sh->sign_add_id ? 1 : -1;
+ return s1->sh->sign_add_id < s2->sh->sign_add_id ? 1 : -1;
}
return 0;
diff --git a/src/nvim/sign.c b/src/nvim/sign.c
index bd7979153e..05e6814bd3 100644
--- a/src/nvim/sign.c
+++ b/src/nvim/sign.c
@@ -168,7 +168,7 @@ static int buf_findsign(buf_T *buf, int id, char *group)
}
/// qsort() function to sort signs by line number, priority, id and recency.
-int sign_cmp(const void *p1, const void *p2)
+static int sign_row_cmp(const void *p1, const void *p2)
{
const MTKey *s1 = (MTKey *)p1;
const MTKey *s2 = (MTKey *)p2;
@@ -180,20 +180,10 @@ int sign_cmp(const void *p1, const void *p2)
DecorSignHighlight *sh1 = decor_find_sign(mt_decor(*s1));
DecorSignHighlight *sh2 = decor_find_sign(mt_decor(*s2));
assert(sh1 && sh2);
+ SignItem si1 = { sh1, s1->id };
+ SignItem si2 = { sh2, s2->id };
- if (sh1->priority != sh2->priority) {
- return sh1->priority < sh2->priority ? 1 : -1;
- }
-
- if (s1->id != s2->id) {
- return s1->id < s2->id ? 1 : -1;
- }
-
- if (sh1->sign_add_id != sh2->sign_add_id) {
- return sh1->sign_add_id < sh2->sign_add_id ? 1 : -1;
- }
-
- return 0;
+ return sign_item_cmp(&si1, &si2);
}
/// Delete the specified sign(s)
@@ -249,7 +239,7 @@ static int buf_delete_signs(buf_T *buf, char *group, int id, linenr_T atlnum)
// Sort to remove the highest priority sign at a specific line number.
if (kv_size(signs)) {
- qsort((void *)&kv_A(signs, 0), kv_size(signs), sizeof(MTKey), sign_cmp);
+ qsort((void *)&kv_A(signs, 0), kv_size(signs), sizeof(MTKey), sign_row_cmp);
extmark_del_id(buf, kv_A(signs, 0).ns, kv_A(signs, 0).id);
kv_destroy(signs);
} else if (atlnum > 0) {
@@ -304,7 +294,7 @@ static void sign_list_placed(buf_T *rbuf, char *group)
}
if (kv_size(signs)) {
- qsort((void *)&kv_A(signs, 0), kv_size(signs), sizeof(MTKey), sign_cmp);
+ qsort((void *)&kv_A(signs, 0), kv_size(signs), sizeof(MTKey), sign_row_cmp);
for (size_t i = 0; i < kv_size(signs); i++) {
namebuf[0] = '\0';
@@ -1002,7 +992,7 @@ static void sign_get_placed_in_buf(buf_T *buf, linenr_T lnum, int sign_id, const
}
if (kv_size(signs)) {
- qsort((void *)&kv_A(signs, 0), kv_size(signs), sizeof(MTKey), sign_cmp);
+ qsort((void *)&kv_A(signs, 0), kv_size(signs), sizeof(MTKey), sign_row_cmp);
for (size_t i = 0; i < kv_size(signs); i++) {
tv_list_append_dict(l, sign_get_placed_info_dict(kv_A(signs, i)));
}
diff --git a/src/nvim/sign_defs.h b/src/nvim/sign_defs.h
index ce6d7d18d6..ad2a2b737d 100644
--- a/src/nvim/sign_defs.h
+++ b/src/nvim/sign_defs.h
@@ -1,5 +1,6 @@
#pragma once
+#include "nvim/decoration_defs.h"
#include "nvim/types_defs.h"
/// Sign attributes. Used by the screen refresh routines.
@@ -19,5 +20,10 @@ typedef struct {
int sn_num_hl; // highlight ID for line number
} sign_T;
+typedef struct {
+ DecorSignHighlight *sh;
+ uint32_t id;
+} SignItem;
+
enum { SIGN_SHOW_MAX = 9, }; ///< Maximum number of signs shown on a single line
enum { SIGN_DEF_PRIO = 10, }; ///< Default sign highlight priority
diff --git a/test/functional/ui/decorations_spec.lua b/test/functional/ui/decorations_spec.lua
index fd8a06d898..bb24b775c1 100644
--- a/test/functional/ui/decorations_spec.lua
+++ b/test/functional/ui/decorations_spec.lua
@@ -5160,6 +5160,18 @@ l5
|
]]}
end)
+
+ it('correct sort order with multiple namespaces and same id', function()
+ local ns2 = api.nvim_create_namespace('')
+ api.nvim_buf_set_extmark(0, ns, 0, 0, {sign_text = 'S1', id = 1})
+ api.nvim_buf_set_extmark(0, ns2, 0, 0, {sign_text = 'S2', id = 1})
+
+ screen:expect{grid=[[
+ S1S2^ |
+ {2:~ }|*8
+ |
+ ]]}
+ end)
end)
describe('decorations: virt_text', function()