]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - src/patches/slang-utf8-acs.patch
OpenVPN: Added 'valid til (days)' field for N2N.
[people/pmueller/ipfire-2.x.git] / src / patches / slang-utf8-acs.patch
1 --- slang-1.4.5/src/slang.h.acs 2002-07-09 00:03:57.000000000 -0400
2 +++ slang-1.4.5/src/slang.h 2002-07-09 00:11:06.000000000 -0400
3 @@ -1255,6 +1255,8 @@
4
5 #ifdef UTF8
6 typedef int SLsmg_Char_Type;
7 +extern SLtt_Char_Type SLcurses_Acs_Map [128];
8 +#define acs_map SLcurses_Acs_Map
9 #define SLSMG_EXTRACT_CHAR(x) ((x) & 0xFFFFFF)
10 #define SLSMG_EXTRACT_COLOR(x) (((x)>>24)&0xFF)
11 #define SLSMG_BUILD_CHAR(ch,color) (((SLsmg_Char_Type)(wchar_t)(ch))|((color)<<24))
12 @@ -1396,7 +1398,11 @@
13 extern void SLsmg_set_screen_start (int *, int *);
14 extern void SLsmg_draw_hline (unsigned int);
15 extern void SLsmg_draw_vline (int);
16 +#ifdef UTF8
17 +extern void SLsmg_draw_object (int, int, SLsmg_Char_Type);
18 +#else
19 extern void SLsmg_draw_object (int, int, unsigned char);
20 +#endif
21 extern void SLsmg_draw_box (int, int, unsigned int, unsigned int);
22 extern int SLsmg_get_column(void);
23 extern int SLsmg_get_row(void);
24 @@ -1408,6 +1414,9 @@
25 extern int SLsmg_Display_Eight_Bit;
26 extern int SLsmg_Tab_Width;
27
28 +extern int SLsmg_Is_Unicode;
29 +extern int SLsmg_Setlocale;
30 +
31 #define SLSMG_NEWLINE_IGNORED 0 /* default */
32 #define SLSMG_NEWLINE_MOVES 1 /* moves to next line, column 0 */
33 #define SLSMG_NEWLINE_SCROLLS 2 /* moves but scrolls at bottom of screen */
34 @@ -1465,31 +1474,79 @@
35 # define SLSMG_BOARD_CHAR '#'
36 # define SLSMG_BLOCK_CHAR '#'
37 # else
38 -# define SLSMG_HLINE_CHAR 'q'
39 -# define SLSMG_VLINE_CHAR 'x'
40 -# define SLSMG_ULCORN_CHAR 'l'
41 -# define SLSMG_URCORN_CHAR 'k'
42 -# define SLSMG_LLCORN_CHAR 'm'
43 -# define SLSMG_LRCORN_CHAR 'j'
44 -# define SLSMG_CKBRD_CHAR 'a'
45 -# define SLSMG_RTEE_CHAR 'u'
46 -# define SLSMG_LTEE_CHAR 't'
47 -# define SLSMG_UTEE_CHAR 'w'
48 -# define SLSMG_DTEE_CHAR 'v'
49 -# define SLSMG_PLUS_CHAR 'n'
50 -# define SLSMG_DIAMOND_CHAR '`'
51 -# define SLSMG_DEGREE_CHAR 'f'
52 -# define SLSMG_PLMINUS_CHAR 'g'
53 -# define SLSMG_BULLET_CHAR '~'
54 -# define SLSMG_LARROW_CHAR ','
55 -# define SLSMG_RARROW_CHAR '+'
56 -# define SLSMG_DARROW_CHAR '.'
57 -# define SLSMG_UARROW_CHAR '-'
58 -# define SLSMG_BOARD_CHAR 'h'
59 -# define SLSMG_BLOCK_CHAR '0'
60 +# define SLSMG_HLINE_CHAR (acs_map['q'])
61 +# define SLSMG_VLINE_CHAR (acs_map['x'])
62 +# define SLSMG_ULCORN_CHAR (acs_map['l'])
63 +# define SLSMG_URCORN_CHAR (acs_map['k'])
64 +# define SLSMG_LLCORN_CHAR (acs_map['m'])
65 +# define SLSMG_LRCORN_CHAR (acs_map['j'])
66 +# define SLSMG_CKBRD_CHAR (acs_map['a'])
67 +# define SLSMG_RTEE_CHAR (acs_map['u'])
68 +# define SLSMG_LTEE_CHAR (acs_map['t'])
69 +# define SLSMG_UTEE_CHAR (acs_map['v'])
70 +# define SLSMG_DTEE_CHAR (acs_map['w'])
71 +# define SLSMG_PLUS_CHAR (acs_map['n'])
72 +# define SLSMG_DIAMOND_CHAR (acs_map['`'])
73 +# define SLSMG_DEGREE_CHAR (acs_map['f'])
74 +# define SLSMG_PLMINUS_CHAR (acs_map['g'])
75 +# define SLSMG_BULLET_CHAR (acs_map['~'])
76 +# define SLSMG_LARROW_CHAR (acs_map[','])
77 +# define SLSMG_RARROW_CHAR (acs_map['+'])
78 +# define SLSMG_DARROW_CHAR (acs_map['.'])
79 +# define SLSMG_UARROW_CHAR (acs_map['-'])
80 +# define SLSMG_BOARD_CHAR (acs_map['h'])
81 +# define SLSMG_BLOCK_CHAR (acs_map['0'])
82 +#
83 +# define SLSMG_HLINE_CHAR_TERM 'q'
84 +# define SLSMG_VLINE_CHAR_TERM 'x'
85 +# define SLSMG_ULCORN_CHAR_TERM 'l'
86 +# define SLSMG_URCORN_CHAR_TERM 'k'
87 +# define SLSMG_LLCORN_CHAR_TERM 'm'
88 +# define SLSMG_LRCORN_CHAR_TERM 'j'
89 +# define SLSMG_CKBRD_CHAR_TERM 'a'
90 +# define SLSMG_RTEE_CHAR_TERM 'u'
91 +# define SLSMG_LTEE_CHAR_TERM 't'
92 +# define SLSMG_UTEE_CHAR_TERM 'v'
93 +# define SLSMG_DTEE_CHAR_TERM 'w'
94 +# define SLSMG_PLUS_CHAR_TERM 'n'
95 +# define SLSMG_DIAMOND_CHAR_TERM '`'
96 +# define SLSMG_DEGREE_CHAR_TERM 'f'
97 +# define SLSMG_PLMINUS_CHAR_TERM 'g'
98 +# define SLSMG_BULLET_CHAR_TERM '~'
99 +# define SLSMG_LARROW_CHAR_TERM ','
100 +# define SLSMG_RARROW_CHAR_TERM '+'
101 +# define SLSMG_DARROW_CHAR_TERM '.'
102 +# define SLSMG_UARROW_CHAR_TERM '-'
103 +# define SLSMG_BOARD_CHAR_TERM 'h'
104 +# define SLSMG_BLOCK_CHAR_TERM '0'
105 # endif /* AMIGA */
106 #endif /* IBMPC_SYSTEM */
107
108 +#ifdef UTF8
109 +# define SLSMG_HLINE_CHAR_UNICODE 0x2500
110 +# define SLSMG_VLINE_CHAR_UNICODE 0x2502
111 +# define SLSMG_ULCORN_CHAR_UNICODE 0x250c
112 +# define SLSMG_URCORN_CHAR_UNICODE 0x2510
113 +# define SLSMG_LLCORN_CHAR_UNICODE 0x2514
114 +# define SLSMG_LRCORN_CHAR_UNICODE 0x2518
115 +# define SLSMG_RTEE_CHAR_UNICODE 0x2524
116 +# define SLSMG_LTEE_CHAR_UNICODE 0x251c
117 +# define SLSMG_UTEE_CHAR_UNICODE 0x2534
118 +# define SLSMG_DTEE_CHAR_UNICODE 0x252c
119 +# define SLSMG_PLUS_CHAR_UNICODE 0x253c
120 +# define SLSMG_CKBRD_CHAR_UNICODE 0x2592
121 +# define SLSMG_DIAMOND_CHAR_UNICODE 0x25c6
122 +# define SLSMG_DEGREE_CHAR_UNICODE 0x00b0
123 +# define SLSMG_PLMINUS_CHAR_UNICODE 0x00b1
124 +# define SLSMG_BULLET_CHAR_UNICODE 0x00b7
125 +# define SLSMG_LARROW_CHAR_UNICODE 0x2190
126 +# define SLSMG_RARROW_CHAR_UNICODE 0x2192
127 +# define SLSMG_DARROW_CHAR_UNICODE 0x2193
128 +# define SLSMG_UARROW_CHAR_UNICODE 0x2191
129 +# define SLSMG_BOARD_CHAR_UNICODE 0x2592
130 +# define SLSMG_BLOCK_CHAR_UNICODE 0x25ae
131 +#endif
132 +
133 #ifndef IBMPC_SYSTEM
134 # define SLSMG_COLOR_BLACK 0x000000
135 # define SLSMG_COLOR_RED 0x000001
136 --- slang-1.4.5/src/slcurses.c.acs 2002-07-09 00:03:57.000000000 -0400
137 +++ slang-1.4.5/src/slcurses.c 2002-07-09 00:09:03.000000000 -0400
138 @@ -331,40 +331,63 @@
139 /* SLtt_set_mono (A_BLINK >> 8, NULL, SLTT_BLINK_MASK); */
140 SLtt_set_mono ((A_BOLD|A_UNDERLINE) >> 8, NULL, SLTT_ULINE_MASK|SLTT_BOLD_MASK);
141 SLtt_set_mono ((A_REVERSE|A_UNDERLINE) >> 8, NULL, SLTT_ULINE_MASK|SLTT_REV_MASK);
142 +
143 + SLcurses_init_acs_map();
144 +
145 + return SLcurses_Stdscr;
146 +}
147
148 +void SLcurses_init_acs_map()
149 +{
150 if (SLtt_Has_Alt_Charset)
151 {
152 - SLcurses_Acs_Map[SLSMG_ULCORN_CHAR] = SLSMG_ULCORN_CHAR | A_ALTCHARSET;
153 - SLcurses_Acs_Map[SLSMG_URCORN_CHAR] = SLSMG_URCORN_CHAR | A_ALTCHARSET;
154 - SLcurses_Acs_Map[SLSMG_LLCORN_CHAR] = SLSMG_LLCORN_CHAR | A_ALTCHARSET;
155 - SLcurses_Acs_Map[SLSMG_LRCORN_CHAR] = SLSMG_LRCORN_CHAR | A_ALTCHARSET;
156 - SLcurses_Acs_Map[SLSMG_UTEE_CHAR] = SLSMG_UTEE_CHAR | A_ALTCHARSET;
157 - SLcurses_Acs_Map[SLSMG_DTEE_CHAR] = SLSMG_DTEE_CHAR | A_ALTCHARSET;
158 - SLcurses_Acs_Map[SLSMG_LTEE_CHAR] = SLSMG_LTEE_CHAR | A_ALTCHARSET;
159 - SLcurses_Acs_Map[SLSMG_RTEE_CHAR] = SLSMG_RTEE_CHAR | A_ALTCHARSET;
160 - SLcurses_Acs_Map[SLSMG_VLINE_CHAR] = SLSMG_VLINE_CHAR | A_ALTCHARSET;
161 - SLcurses_Acs_Map[SLSMG_HLINE_CHAR] = SLSMG_HLINE_CHAR | A_ALTCHARSET;
162 - SLcurses_Acs_Map[SLSMG_PLUS_CHAR] = SLSMG_PLUS_CHAR | A_ALTCHARSET;
163 - SLcurses_Acs_Map[SLSMG_CKBRD_CHAR] = SLSMG_CKBRD_CHAR | A_ALTCHARSET;
164 + if (SLsmg_Is_Unicode)
165 + {
166 + SLcurses_Acs_Map['l'] = SLSMG_ULCORN_CHAR_UNICODE;
167 + SLcurses_Acs_Map['k'] = SLSMG_URCORN_CHAR_UNICODE;
168 + SLcurses_Acs_Map['m'] = SLSMG_LLCORN_CHAR_UNICODE;
169 + SLcurses_Acs_Map['j'] = SLSMG_LRCORN_CHAR_UNICODE;
170 + SLcurses_Acs_Map['v'] = SLSMG_UTEE_CHAR_UNICODE;
171 + SLcurses_Acs_Map['w'] = SLSMG_DTEE_CHAR_UNICODE;
172 + SLcurses_Acs_Map['t'] = SLSMG_LTEE_CHAR_UNICODE;
173 + SLcurses_Acs_Map['u'] = SLSMG_RTEE_CHAR_UNICODE;
174 + SLcurses_Acs_Map['x'] = SLSMG_VLINE_CHAR_UNICODE;
175 + SLcurses_Acs_Map['q'] = SLSMG_HLINE_CHAR_UNICODE;
176 + SLcurses_Acs_Map['n'] = SLSMG_PLUS_CHAR_UNICODE;
177 + SLcurses_Acs_Map['a'] = SLSMG_CKBRD_CHAR_UNICODE;
178 + }
179 + else
180 + {
181 + SLcurses_Acs_Map['l'] = SLSMG_ULCORN_CHAR_TERM | A_ALTCHARSET;
182 + SLcurses_Acs_Map['k'] = SLSMG_URCORN_CHAR_TERM | A_ALTCHARSET;
183 + SLcurses_Acs_Map['m'] = SLSMG_LLCORN_CHAR_TERM | A_ALTCHARSET;
184 + SLcurses_Acs_Map['j'] = SLSMG_LRCORN_CHAR_TERM | A_ALTCHARSET;
185 + SLcurses_Acs_Map['v'] = SLSMG_UTEE_CHAR_TERM | A_ALTCHARSET;
186 + SLcurses_Acs_Map['w'] = SLSMG_DTEE_CHAR_TERM | A_ALTCHARSET;
187 + SLcurses_Acs_Map['t'] = SLSMG_LTEE_CHAR_TERM | A_ALTCHARSET;
188 + SLcurses_Acs_Map['u'] = SLSMG_RTEE_CHAR_TERM | A_ALTCHARSET;
189 + SLcurses_Acs_Map['x'] = SLSMG_VLINE_CHAR_TERM | A_ALTCHARSET;
190 + SLcurses_Acs_Map['q'] = SLSMG_HLINE_CHAR_TERM | A_ALTCHARSET;
191 + SLcurses_Acs_Map['n'] = SLSMG_PLUS_CHAR_TERM | A_ALTCHARSET;
192 + SLcurses_Acs_Map['a'] = SLSMG_CKBRD_CHAR_TERM | A_ALTCHARSET;
193 + }
194 }
195 else
196 {
197 /* ugly defaults to use on terminals which don't support graphics */
198 - SLcurses_Acs_Map[SLSMG_ULCORN_CHAR] = '+';
199 - SLcurses_Acs_Map[SLSMG_URCORN_CHAR] = '+';
200 - SLcurses_Acs_Map[SLSMG_LLCORN_CHAR] = '+';
201 - SLcurses_Acs_Map[SLSMG_LRCORN_CHAR] = '+';
202 - SLcurses_Acs_Map[SLSMG_UTEE_CHAR] = '+';
203 - SLcurses_Acs_Map[SLSMG_DTEE_CHAR] = '+';
204 - SLcurses_Acs_Map[SLSMG_LTEE_CHAR] = '+';
205 - SLcurses_Acs_Map[SLSMG_RTEE_CHAR] = '+';
206 - SLcurses_Acs_Map[SLSMG_VLINE_CHAR] = '|';
207 - SLcurses_Acs_Map[SLSMG_HLINE_CHAR] = '-';
208 - SLcurses_Acs_Map[SLSMG_PLUS_CHAR] = '+';
209 - SLcurses_Acs_Map[SLSMG_CKBRD_CHAR] = '#';
210 + SLcurses_Acs_Map['l'] = '+';
211 + SLcurses_Acs_Map['k'] = '+';
212 + SLcurses_Acs_Map['m'] = '+';
213 + SLcurses_Acs_Map['j'] = '+';
214 + SLcurses_Acs_Map['v'] = '+';
215 + SLcurses_Acs_Map['w'] = '+';
216 + SLcurses_Acs_Map['t'] = '+';
217 + SLcurses_Acs_Map['u'] = '+';
218 + SLcurses_Acs_Map['x'] = '|';
219 + SLcurses_Acs_Map['q'] = '-';
220 + SLcurses_Acs_Map['n'] = '+';
221 + SLcurses_Acs_Map['a'] = '#';
222 }
223 -
224 - return SLcurses_Stdscr;
225 }
226
227 int SLcurses_wattrset (SLcurses_Window_Type *w, SLtt_Char_Type ch)
228 --- slang-1.4.5/src/slcurses.h.acs 2002-02-10 02:39:19.000000000 -0500
229 +++ slang-1.4.5/src/slcurses.h 2002-07-09 00:03:57.000000000 -0400
230 @@ -141,6 +141,7 @@
231
232 extern int SLcurses_nodelay (SLcurses_Window_Type *, int);
233 extern SLcurses_Window_Type *SLcurses_initscr (void);
234 +extern void SLcurses_init_acs_map (void);
235 #define initscr SLcurses_initscr
236
237 extern int SLcurses_cbreak (void);
238 @@ -222,21 +222,21 @@
239 extern SLtt_Char_Type SLcurses_Acs_Map [128];
240 #define acs_map SLcurses_Acs_Map
241
242 -#define ACS_ULCORNER (acs_map[SLSMG_ULCORN_CHAR])
243 -#define ACS_URCORNER (acs_map[SLSMG_URCORN_CHAR])
244 -#define ACS_LRCORNER (acs_map[SLSMG_LRCORN_CHAR])
245 -#define ACS_LLCORNER (acs_map[SLSMG_LLCORN_CHAR])
246 -#define ACS_TTEE (acs_map[SLSMG_UTEE_CHAR])
247 -#define ACS_LTEE (acs_map[SLSMG_LTEE_CHAR])
248 -#define ACS_RTEE (acs_map[SLSMG_RTEE_CHAR])
249 -#define ACS_BTEE (acs_map[SLSMG_DTEE_CHAR])
250 -#define ACS_PLUS (acs_map[SLSMG_PLUS_CHAR])
251 -#define ACS_VLINE (acs_map[SLSMG_VLINE_CHAR])
252 -#define ACS_HLINE (acs_map[SLSMG_HLINE_CHAR])
253 +#define ACS_ULCORNER SLSMG_ULCORN_CHAR
254 +#define ACS_URCORNER SLSMG_URCORN_CHAR
255 +#define ACS_LRCORNER SLSMG_LRCORN_CHAR
256 +#define ACS_LLCORNER SLSMG_LLCORN_CHAR
257 +#define ACS_TTEE SLSMG_UTEE_CHAR
258 +#define ACS_LTEE SLSMG_LTEE_CHAR
259 +#define ACS_RTEE SLSMG_RTEE_CHAR
260 +#define ACS_BTEE SLSMG_DTEE_CHAR
261 +#define ACS_PLUS SLSMG_PLUS_CHAR
262 +#define ACS_VLINE SLSMG_VLINE_CHAR
263 +#define ACS_HLINE SLSMG_HLINE_CHAR
264 #define ACS_S1 '-'
265 #define ACS_S9 '-'
266 #define ACS_DIAMOND '&'
267 -#define ACS_CKBOARD (acs_map[SLSMG_CKBRD_CHAR])
268 +#define ACS_CKBOARD SLSMG_CKBRD_CHAR
269 #define ACS_DEGREE 'o'
270 #define ACS_PLMINUS '+'
271 #define ACS_BULLET '*'
272 --- slang-1.4.5/src/slsmg.c.acs 2002-07-09 00:03:57.000000000 -0400
273 +++ slang-1.4.5/src/slsmg.c 2002-07-09 00:03:57.000000000 -0400
274 @@ -10,6 +10,9 @@
275
276 #include "slang.h"
277 #include "_slang.h"
278 +#include "slcurses.h"
279 +
280 +#include <locale.h>
281
282 typedef struct Screen_Type
283 {
284 @@ -44,9 +47,9 @@
285 */
286
287 #ifndef IBMPC_SYSTEM
288 -#define ALT_CHAR_FLAG 0x80
289 +static int ALT_CHAR_FLAG=0x80;
290 #else
291 -#define ALT_CHAR_FLAG 0x00
292 +static int ALT_CHAR_FLAG=0x00;
293 #endif
294
295 #if SLTT_HAS_NON_BCE_SUPPORT && !defined(IBMPC_SYSTEM)
296 @@ -54,6 +57,8 @@
297 static int Bce_Color_Offset;
298 #endif
299
300 +int SLsmg_Is_Unicode = 0;
301 +int SLsmg_Setlocale = 1;
302 int SLsmg_Newline_Behavior = 0;
303 int SLsmg_Backspace_Moves = 0;
304 /* Backward compatibility. Not used. */
305 @@ -184,6 +189,8 @@
306 return;/* alt chars not used and the alt bit
307 * is used to indicate a blink.
308 */
309 + if (SLsmg_Is_Unicode)
310 + ALT_CHAR_FLAG=0x00;
311
312 if (i) This_Alt_Char = ALT_CHAR_FLAG;
313 else This_Alt_Char = 0;
314 @@ -348,6 +355,8 @@
315 #ifndef IBMPC_SYSTEM
316 int alt_char_set_flag;
317
318 + if (SLsmg_Is_Unicode)
319 + ALT_CHAR_FLAG = 0x00;
320 alt_char_set_flag = ((This_Color & ALT_CHAR_FLAG)
321 && ((tt_Use_Blink_For_ACS == NULL)
322 || (*tt_Use_Blink_For_ACS == 0)));
323 @@ -1221,6 +1230,20 @@
324 Smg_Inited = 0;
325 }
326
327 +static void SLsmg_check_unicode(void)
328 +{
329 + char *s,*t;
330 +
331 + if (SLsmg_Setlocale)
332 + s = setlocale(LC_ALL, "");
333 + else
334 + s = setlocale(LC_ALL, NULL);
335 + if (s && (strstr(s,"UTF-8") || strstr(s,"utf8"))) {
336 + SLsmg_Is_Unicode = 1;
337 + return;
338 + }
339 + SLsmg_Is_Unicode = 0;
340 +}
341
342 static int init_smg (void)
343 {
344 @@ -1242,6 +1265,8 @@
345 This_Col = This_Row = Start_Col = Start_Row = 0;
346
347 This_Alt_Char = 0;
348 + SLsmg_check_unicode ();
349 + SLcurses_init_acs_map ();
350 SLsmg_set_color (0);
351 Cls_Flag = 1;
352 #ifndef IBMPC_SYSTEM
353 @@ -1386,7 +1411,11 @@
354 }
355 }
356
357 +#ifdef UTF8
358 +void SLsmg_draw_object (int r, int c, SLsmg_Char_Type object)
359 +#else
360 void SLsmg_draw_object (int r, int c, unsigned char object)
361 +#endif
362 {
363 This_Row = r; This_Col = c;
364
365 @@ -1405,7 +1434,7 @@
366
367 void SLsmg_draw_hline (unsigned int n)
368 {
369 - static unsigned char hbuf[16];
370 + SLsmg_Char_Type ch = SLSMG_HLINE_CHAR;
371 int count;
372 int cmin, cmax;
373 int final_col = This_Col + (int) n;
374 @@ -1421,11 +1450,6 @@
375 return;
376 }
377
378 - if (hbuf[0] == 0)
379 - {
380 - SLMEMSET ((char *) hbuf, SLSMG_HLINE_CHAR, 16);
381 - }
382 -
383 n = (unsigned int)(cmax - cmin);
384 count = n / 16;
385
386 @@ -1433,10 +1457,10 @@
387 This_Color |= ALT_CHAR_FLAG;
388 This_Col = cmin;
389
390 - SLsmg_write_nchars ((char *) hbuf, n % 16);
391 - while (count-- > 0)
392 + SLsmg_draw_object(This_Row, This_Col, ch);
393 + while (n-- > 0)
394 {
395 - SLsmg_write_nchars ((char *) hbuf, 16);
396 + SLsmg_draw_object(This_Row, This_Col, ch);
397 }
398
399 This_Color = save_color;
400 @@ -1445,7 +1469,7 @@
401
402 void SLsmg_draw_vline (int n)
403 {
404 - unsigned char ch = SLSMG_VLINE_CHAR;
405 + SLsmg_Char_Type ch = SLSMG_VLINE_CHAR;
406 int c = This_Col, rmin, rmax;
407 int final_row = This_Row + n;
408 int save_color;
409 @@ -1466,7 +1490,7 @@
410 for (This_Row = rmin; This_Row < rmax; This_Row++)
411 {
412 This_Col = c;
413 - SLsmg_write_nchars ((char *) &ch, 1);
414 + SLsmg_draw_object (This_Row, This_Col, ch);
415 }
416
417 This_Col = c; This_Row = final_row;