summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.0665
blob: ec258e96ff56d03232294f523f6fde3a8f73e73b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
To: vim_dev@googlegroups.com
Subject: Patch 8.1.0665
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------

Patch 8.1.0665
Problem:    Text property display wrong when 'spell' is set. (Dominique Pelle)
Solution:   Remove unnecessary assignment to char_attr.  Combine attributes if
            needed.  Add a screenshot test.
Files:	    src/screen.c, src/testdir/test_textprop.vim,
            src/testdir/dumps/Test_textprop_01.dump


*** ../vim-8.1.0664/src/screen.c	2018-12-30 22:07:35.596868093 +0100
--- src/screen.c	2018-12-31 13:38:32.001788595 +0100
***************
*** 3051,3056 ****
--- 3051,3088 ----
  }
  #endif /* FEAT_FOLDING */
  
+ #ifdef FEAT_TEXT_PROP
+ static textprop_T	*current_text_props = NULL;
+ static buf_T		*current_buf = NULL;
+ 
+     static int
+ #ifdef __BORLANDC__
+ _RTLENTRYF
+ #endif
+ text_prop_compare(const void *s1, const void *s2)
+ {
+     int  idx1, idx2;
+     proptype_T  *pt1, *pt2;
+     colnr_T col1, col2;
+ 
+     idx1 = *(int *)s1;
+     idx2 = *(int *)s2;
+     pt1 = text_prop_type_by_id(current_buf, current_text_props[idx1].tp_type);
+     pt2 = text_prop_type_by_id(current_buf, current_text_props[idx2].tp_type);
+     if (pt1 == pt2)
+ 	return 0;
+     if (pt1 == NULL)
+ 	return -1;
+     if (pt2 == NULL)
+ 	return 1;
+     if (pt1->pt_priority != pt2->pt_priority)
+ 	return pt1->pt_priority > pt2->pt_priority ? 1 : -1;
+     col1 = current_text_props[idx1].tp_col;
+     col2 = current_text_props[idx2].tp_col;
+     return col1 == col2 ? 0 : col1 > col2 ? 1 : -1;
+ }
+ #endif
+ 
  /*
   * Display line "lnum" of window 'wp' on the screen.
   * Start at row "startrow", stop when "endrow" is reached.
***************
*** 4322,4355 ****
  			   && vcol >= text_props[text_prop_next].tp_col - 1)
  		    text_prop_idxs[text_props_active++] = text_prop_next++;
  
! 		text_prop_type = NULL;
  		if (text_props_active > 0)
  		{
! 		    int max_priority = INT_MIN;
! 		    int max_col = 0;
  
- 		    // Get the property type with the highest priority
- 		    // and/or starting last.
  		    for (pi = 0; pi < text_props_active; ++pi)
  		    {
! 			int		tpi = text_prop_idxs[pi];
! 			proptype_T  *pt;
  
! 			pt = text_prop_type_by_id(
! 				curwin->w_buffer, text_props[tpi].tp_type);
! 			if (pt != NULL
! 				&& (pt->pt_priority > max_priority
! 				    || (pt->pt_priority == max_priority
! 				    && text_props[tpi].tp_col >= max_col)))
  			{
  			    text_prop_type = pt;
! 			    max_priority = pt->pt_priority;
! 			    max_col = text_props[tpi].tp_col;
  			}
  		    }
- 		    if (text_prop_type != NULL)
- 			text_prop_attr =
- 				     syn_id2attr(text_prop_type->pt_hl_id);
  		}
  	    }
  #endif
--- 4354,4385 ----
  			   && vcol >= text_props[text_prop_next].tp_col - 1)
  		    text_prop_idxs[text_props_active++] = text_prop_next++;
  
! 		text_prop_attr = 0;
  		if (text_props_active > 0)
  		{
! 		    // Sort the properties on priority and/or starting last.
! 		    // Then combine the attributes, highest priority last.
! 		    current_text_props = text_props;
! 		    current_buf = wp->w_buffer;
! 		    qsort((void *)text_prop_idxs, (size_t)text_props_active,
! 					       sizeof(int), text_prop_compare);
  
  		    for (pi = 0; pi < text_props_active; ++pi)
  		    {
! 			int	    tpi = text_prop_idxs[pi];
! 			proptype_T  *pt = text_prop_type_by_id(wp->w_buffer, text_props[tpi].tp_type);
  
! 			if (pt != NULL)
  			{
+ 			    int pt_attr = syn_id2attr(pt->pt_hl_id);
+ 
  			    text_prop_type = pt;
! 			    if (text_prop_attr == 0)
! 				text_prop_attr = pt_attr;
! 			    else
! 				text_prop_attr = hl_combine_attr(text_prop_attr, pt_attr);
  			}
  		    }
  		}
  	    }
  #endif
***************
*** 4775,4784 ****
  		if (has_spell && v >= word_end && v > cur_checked_col)
  		{
  		    spell_attr = 0;
- # ifdef FEAT_SYN_HL
- 		    if (!attr_pri)
- 			char_attr = syntax_attr;
- # endif
  		    if (c != 0 && (
  # ifdef FEAT_SYN_HL
  				!has_syntax ||
--- 4805,4810 ----
*** ../vim-8.1.0664/src/testdir/test_textprop.vim	2018-12-28 23:22:36.270750732 +0100
--- src/testdir/test_textprop.vim	2018-12-31 12:41:37.979473855 +0100
***************
*** 5,10 ****
--- 5,12 ----
    finish
  endif
  
+ source screendump.vim
+ 
  func Test_proptype_global()
    call prop_type_add('comment', {'highlight': 'Directory', 'priority': 123, 'start_incl': 1, 'end_incl': 1})
    let proptypes = prop_type_list()
***************
*** 283,287 ****
    call prop_type_delete('comment')
  endfunc
  
! 
! " TODO: screenshot test with highlighting
--- 285,311 ----
    call prop_type_delete('comment')
  endfunc
  
! " screenshot test with textprop highlighting
! funct Test_textprop_screenshots()
!   if !CanRunVimInTerminal()
!     return
!   endif
!   call writefile([
! 	\ "call setline(1, ['One two', 'Number 123 and then 4567.', 'Three'])",
! 	\ "hi NumberProp ctermfg=blue",
! 	\ "hi LongProp ctermbg=yellow",
! 	\ "call prop_type_add('number', {'highlight': 'NumberProp'})",
! 	\ "call prop_type_add('long', {'highlight': 'LongProp'})",
! 	\ "call prop_add(1, 4, {'end_lnum': 3, 'end_col': 3, 'type': 'long'})",
! 	\ "call prop_add(2, 8, {'length': 3, 'type': 'number'})",
! 	\ "call prop_add(2, 21, {'length': 4, 'type': 'number'})",
! 	\ "set number",
! 	\ "set spell",
! 	\], 'XtestProp')
!   let buf = RunVimInTerminal('-S XtestProp', {})
!   call VerifyScreenDump(buf, 'Test_textprop_01', {})
! 
!   " clean up
!   call StopVimInTerminal(buf)
!   call delete('Xtest_folds_with_rnu')
! endfunc
*** ../vim-8.1.0664/src/testdir/dumps/Test_textprop_01.dump	2018-12-31 13:54:54.313537883 +0100
--- src/testdir/dumps/Test_textprop_01.dump	2018-12-31 12:43:50.366431472 +0100
***************
*** 0 ****
--- 1,20 ----
+ | +0#af5f00255#ffffff0@1|1| >O+0#0000000&|n|e| +0&#ffff4012|t|w|o| +0&#ffffff0@63
+ | +0#af5f00255&@1|2| |N+0#0000000#ffff4012|u|m|b|e|r| |1+0#4040ff13#ffffff0|2|3| +0#0000000#ffff4012|a|n|d| |t|h|e|n| |4+0#4040ff13#ffffff0|5|6|7|.+0#0000000#ffff4012| +0&#ffffff0@45
+ | +0#af5f00255&@1|3| |T+0#0000000#ffff4012|h|r|e+0&#ffffff0@1| @65
+ |~+0#4040ff13&| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ |~| @73
+ | +0#0000000&@56|1|,|1| @10|A|l@1| 
*** ../vim-8.1.0664/src/version.c	2018-12-30 22:55:43.671136682 +0100
--- src/version.c	2018-12-31 12:16:31.671760142 +0100
***************
*** 801,802 ****
--- 801,804 ----
  {   /* Add new patch number below this line */
+ /**/
+     665,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
91. It's Saturday afternoon in the middle of May and you
    are on computer.

 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///