mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
vc: separate state
There are two copies of some members of struct vc_data. This is because we need to save them and restore later. Move these memebers to a separate structure called vc_state. So now instead of members like: vc_x, vc_y and vc_saved_x, vc_saved_y we have state and saved_state (of type: struct vc_state) containing state.x, state.y and saved_state.x, saved_state.y This change: * makes clear what is saved & restored * eases save & restore by using memcpy (see save_cur and restore_cur) Finally, we document the newly added struct vc_state using kernel-doc. Signed-off-by: Jiri Slaby <jslaby@suse.cz> Link: https://lore.kernel.org/r/20200615074910.19267-1-jslaby@suse.cz Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
96564ac680
commit
28bc24fc46
@@ -109,16 +109,16 @@ static void braille_write(u16 *buf)
|
||||
/* Follow the VC cursor*/
|
||||
static void vc_follow_cursor(struct vc_data *vc)
|
||||
{
|
||||
vc_x = vc->vc_x - (vc->vc_x % WIDTH);
|
||||
vc_y = vc->vc_y;
|
||||
lastvc_x = vc->vc_x;
|
||||
lastvc_y = vc->vc_y;
|
||||
vc_x = vc->state.x - (vc->state.x % WIDTH);
|
||||
vc_y = vc->state.y;
|
||||
lastvc_x = vc->state.x;
|
||||
lastvc_y = vc->state.y;
|
||||
}
|
||||
|
||||
/* Maybe the VC cursor moved, if so follow it */
|
||||
static void vc_maybe_cursor_moved(struct vc_data *vc)
|
||||
{
|
||||
if (vc->vc_x != lastvc_x || vc->vc_y != lastvc_y)
|
||||
if (vc->state.x != lastvc_x || vc->state.y != lastvc_y)
|
||||
vc_follow_cursor(vc);
|
||||
}
|
||||
|
||||
|
||||
@@ -263,8 +263,8 @@ static unsigned char get_attributes(struct vc_data *vc, u16 *pos)
|
||||
|
||||
static void speakup_date(struct vc_data *vc)
|
||||
{
|
||||
spk_x = spk_cx = vc->vc_x;
|
||||
spk_y = spk_cy = vc->vc_y;
|
||||
spk_x = spk_cx = vc->state.x;
|
||||
spk_y = spk_cy = vc->state.y;
|
||||
spk_pos = spk_cp = vc->vc_pos;
|
||||
spk_old_attr = spk_attr;
|
||||
spk_attr = get_attributes(vc, (u_short *)spk_pos);
|
||||
@@ -1551,9 +1551,9 @@ static void do_handle_cursor(struct vc_data *vc, u_char value, char up_flag)
|
||||
*/
|
||||
is_cursor = value + 1;
|
||||
old_cursor_pos = vc->vc_pos;
|
||||
old_cursor_x = vc->vc_x;
|
||||
old_cursor_y = vc->vc_y;
|
||||
speakup_console[vc->vc_num]->ht.cy = vc->vc_y;
|
||||
old_cursor_x = vc->state.x;
|
||||
old_cursor_y = vc->state.y;
|
||||
speakup_console[vc->vc_num]->ht.cy = vc->state.y;
|
||||
cursor_con = vc->vc_num;
|
||||
if (cursor_track == CT_Highlight)
|
||||
reset_highlight_buffers(vc);
|
||||
@@ -1574,8 +1574,8 @@ static void update_color_buffer(struct vc_data *vc, const u16 *ic, int len)
|
||||
i = 0;
|
||||
if (speakup_console[vc_num]->ht.highsize[bi] == 0) {
|
||||
speakup_console[vc_num]->ht.rpos[bi] = vc->vc_pos;
|
||||
speakup_console[vc_num]->ht.rx[bi] = vc->vc_x;
|
||||
speakup_console[vc_num]->ht.ry[bi] = vc->vc_y;
|
||||
speakup_console[vc_num]->ht.rx[bi] = vc->state.x;
|
||||
speakup_console[vc_num]->ht.ry[bi] = vc->state.y;
|
||||
}
|
||||
while ((hi < COLOR_BUFFER_SIZE) && (i < len)) {
|
||||
if (ic[i] > 32) {
|
||||
@@ -1664,9 +1664,9 @@ static int speak_highlight(struct vc_data *vc)
|
||||
return 0;
|
||||
hc = get_highlight_color(vc);
|
||||
if (hc != -1) {
|
||||
d = vc->vc_y - speakup_console[vc_num]->ht.cy;
|
||||
d = vc->state.y - speakup_console[vc_num]->ht.cy;
|
||||
if ((d == 1) || (d == -1))
|
||||
if (speakup_console[vc_num]->ht.ry[hc] != vc->vc_y)
|
||||
if (speakup_console[vc_num]->ht.ry[hc] != vc->state.y)
|
||||
return 0;
|
||||
spk_parked |= 0x01;
|
||||
spk_do_flush();
|
||||
@@ -1693,8 +1693,8 @@ static void cursor_done(struct timer_list *unused)
|
||||
}
|
||||
speakup_date(vc);
|
||||
if (win_enabled) {
|
||||
if (vc->vc_x >= win_left && vc->vc_x <= win_right &&
|
||||
vc->vc_y >= win_top && vc->vc_y <= win_bottom) {
|
||||
if (vc->state.x >= win_left && vc->state.x <= win_right &&
|
||||
vc->state.y >= win_top && vc->state.y <= win_bottom) {
|
||||
spk_keydown = 0;
|
||||
is_cursor = 0;
|
||||
goto out;
|
||||
@@ -1757,7 +1757,7 @@ static void speakup_con_write(struct vc_data *vc, u16 *str, int len)
|
||||
if (!spin_trylock_irqsave(&speakup_info.spinlock, flags))
|
||||
/* Speakup output, discard */
|
||||
return;
|
||||
if (spk_bell_pos && spk_keydown && (vc->vc_x == spk_bell_pos - 1))
|
||||
if (spk_bell_pos && spk_keydown && (vc->state.x == spk_bell_pos - 1))
|
||||
bleep(3);
|
||||
if ((is_cursor) || (cursor_track == read_all_mode)) {
|
||||
if (cursor_track == CT_Highlight)
|
||||
@@ -1766,8 +1766,8 @@ static void speakup_con_write(struct vc_data *vc, u16 *str, int len)
|
||||
return;
|
||||
}
|
||||
if (win_enabled) {
|
||||
if (vc->vc_x >= win_left && vc->vc_x <= win_right &&
|
||||
vc->vc_y >= win_top && vc->vc_y <= win_bottom) {
|
||||
if (vc->state.x >= win_left && vc->state.x <= win_right &&
|
||||
vc->state.y >= win_top && vc->state.y <= win_bottom) {
|
||||
spin_unlock_irqrestore(&speakup_info.spinlock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -488,7 +488,7 @@ static void mdacon_cursor(struct vc_data *c, int mode)
|
||||
return;
|
||||
}
|
||||
|
||||
mda_set_cursor(c->vc_y*mda_num_columns*2 + c->vc_x*2);
|
||||
mda_set_cursor(c->state.y * mda_num_columns * 2 + c->state.x * 2);
|
||||
|
||||
switch (c->vc_cursor_type & 0x0f) {
|
||||
|
||||
|
||||
@@ -132,10 +132,10 @@ static void sticon_cursor(struct vc_data *conp, int mode)
|
||||
{
|
||||
unsigned short car1;
|
||||
|
||||
car1 = conp->vc_screenbuf[conp->vc_x + conp->vc_y * conp->vc_cols];
|
||||
car1 = conp->vc_screenbuf[conp->state.x + conp->state.y * conp->vc_cols];
|
||||
switch (mode) {
|
||||
case CM_ERASE:
|
||||
sti_putc(sticon_sti, car1, conp->vc_y, conp->vc_x);
|
||||
sti_putc(sticon_sti, car1, conp->state.y, conp->state.x);
|
||||
break;
|
||||
case CM_MOVE:
|
||||
case CM_DRAW:
|
||||
@@ -146,7 +146,7 @@ static void sticon_cursor(struct vc_data *conp, int mode)
|
||||
case CUR_TWO_THIRDS:
|
||||
case CUR_BLOCK:
|
||||
sti_putc(sticon_sti, (car1 & 255) + (0 << 8) + (7 << 11),
|
||||
conp->vc_y, conp->vc_x);
|
||||
conp->state.y, conp->state.x);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -718,9 +718,9 @@ static void vgacon_cursor(struct vc_data *c, int mode)
|
||||
case CM_ERASE:
|
||||
write_vga(14, (c->vc_pos - vga_vram_base) / 2);
|
||||
if (vga_video_type >= VIDEO_TYPE_VGAC)
|
||||
vgacon_set_cursor_size(c->vc_x, 31, 30);
|
||||
vgacon_set_cursor_size(c->state.x, 31, 30);
|
||||
else
|
||||
vgacon_set_cursor_size(c->vc_x, 31, 31);
|
||||
vgacon_set_cursor_size(c->state.x, 31, 31);
|
||||
break;
|
||||
|
||||
case CM_MOVE:
|
||||
@@ -728,7 +728,7 @@ static void vgacon_cursor(struct vc_data *c, int mode)
|
||||
write_vga(14, (c->vc_pos - vga_vram_base) / 2);
|
||||
switch (c->vc_cursor_type & 0x0f) {
|
||||
case CUR_UNDERLINE:
|
||||
vgacon_set_cursor_size(c->vc_x,
|
||||
vgacon_set_cursor_size(c->state.x,
|
||||
c->vc_font.height -
|
||||
(c->vc_font.height <
|
||||
10 ? 2 : 3),
|
||||
@@ -737,21 +737,21 @@ static void vgacon_cursor(struct vc_data *c, int mode)
|
||||
10 ? 1 : 2));
|
||||
break;
|
||||
case CUR_TWO_THIRDS:
|
||||
vgacon_set_cursor_size(c->vc_x,
|
||||
vgacon_set_cursor_size(c->state.x,
|
||||
c->vc_font.height / 3,
|
||||
c->vc_font.height -
|
||||
(c->vc_font.height <
|
||||
10 ? 1 : 2));
|
||||
break;
|
||||
case CUR_LOWER_THIRD:
|
||||
vgacon_set_cursor_size(c->vc_x,
|
||||
vgacon_set_cursor_size(c->state.x,
|
||||
(c->vc_font.height * 2) / 3,
|
||||
c->vc_font.height -
|
||||
(c->vc_font.height <
|
||||
10 ? 1 : 2));
|
||||
break;
|
||||
case CUR_LOWER_HALF:
|
||||
vgacon_set_cursor_size(c->vc_x,
|
||||
vgacon_set_cursor_size(c->state.x,
|
||||
c->vc_font.height / 2,
|
||||
c->vc_font.height -
|
||||
(c->vc_font.height <
|
||||
@@ -759,12 +759,12 @@ static void vgacon_cursor(struct vc_data *c, int mode)
|
||||
break;
|
||||
case CUR_NONE:
|
||||
if (vga_video_type >= VIDEO_TYPE_VGAC)
|
||||
vgacon_set_cursor_size(c->vc_x, 31, 30);
|
||||
vgacon_set_cursor_size(c->state.x, 31, 30);
|
||||
else
|
||||
vgacon_set_cursor_size(c->vc_x, 31, 31);
|
||||
vgacon_set_cursor_size(c->state.x, 31, 31);
|
||||
break;
|
||||
default:
|
||||
vgacon_set_cursor_size(c->vc_x, 1,
|
||||
vgacon_set_cursor_size(c->state.x, 1,
|
||||
c->vc_font.height);
|
||||
break;
|
||||
}
|
||||
@@ -1352,8 +1352,8 @@ static void vgacon_save_screen(struct vc_data *c)
|
||||
* console initialization routines.
|
||||
*/
|
||||
vga_bootup_console = 1;
|
||||
c->vc_x = screen_info.orig_x;
|
||||
c->vc_y = screen_info.orig_y;
|
||||
c->state.x = screen_info.orig_x;
|
||||
c->state.y = screen_info.orig_y;
|
||||
}
|
||||
|
||||
/* We can't copy in more than the size of the video buffer,
|
||||
|
||||
@@ -240,7 +240,7 @@ static void bit_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
|
||||
int w = DIV_ROUND_UP(vc->vc_font.width, 8), c;
|
||||
int y = real_y(ops->p, vc->vc_y);
|
||||
int y = real_y(ops->p, vc->state.y);
|
||||
int attribute, use_sw = (vc->vc_cursor_type & 0x10);
|
||||
int err = 1;
|
||||
char *src;
|
||||
@@ -286,10 +286,10 @@ static void bit_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||
cursor.set |= FB_CUR_SETCMAP;
|
||||
}
|
||||
|
||||
if ((ops->cursor_state.image.dx != (vc->vc_font.width * vc->vc_x)) ||
|
||||
if ((ops->cursor_state.image.dx != (vc->vc_font.width * vc->state.x)) ||
|
||||
(ops->cursor_state.image.dy != (vc->vc_font.height * y)) ||
|
||||
ops->cursor_reset) {
|
||||
ops->cursor_state.image.dx = vc->vc_font.width * vc->vc_x;
|
||||
ops->cursor_state.image.dx = vc->vc_font.width * vc->state.x;
|
||||
ops->cursor_state.image.dy = vc->vc_font.height * y;
|
||||
cursor.set |= FB_CUR_SETPOS;
|
||||
}
|
||||
|
||||
@@ -655,11 +655,11 @@ static void fbcon_prepare_logo(struct vc_data *vc, struct fb_info *info,
|
||||
}
|
||||
if (!save) {
|
||||
int lines;
|
||||
if (vc->vc_y + logo_lines >= rows)
|
||||
lines = rows - vc->vc_y - 1;
|
||||
if (vc->state.y + logo_lines >= rows)
|
||||
lines = rows - vc->state.y - 1;
|
||||
else
|
||||
lines = logo_lines;
|
||||
vc->vc_y += lines;
|
||||
vc->state.y += lines;
|
||||
vc->vc_pos += lines * vc->vc_size_row;
|
||||
}
|
||||
}
|
||||
@@ -677,7 +677,7 @@ static void fbcon_prepare_logo(struct vc_data *vc, struct fb_info *info,
|
||||
vc->vc_size_row *
|
||||
rows);
|
||||
scr_memcpyw(q, save, logo_lines * new_cols * 2);
|
||||
vc->vc_y += logo_lines;
|
||||
vc->state.y += logo_lines;
|
||||
vc->vc_pos += logo_lines * vc->vc_size_row;
|
||||
kfree(save);
|
||||
}
|
||||
|
||||
@@ -225,7 +225,7 @@ static void ccw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
|
||||
int w = (vc->vc_font.height + 7) >> 3, c;
|
||||
int y = real_y(ops->p, vc->vc_y);
|
||||
int y = real_y(ops->p, vc->state.y);
|
||||
int attribute, use_sw = (vc->vc_cursor_type & 0x10);
|
||||
int err = 1, dx, dy;
|
||||
char *src;
|
||||
@@ -284,7 +284,7 @@ static void ccw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||
}
|
||||
|
||||
dx = y * vc->vc_font.height;
|
||||
dy = vyres - ((vc->vc_x + 1) * vc->vc_font.width);
|
||||
dy = vyres - ((vc->state.x + 1) * vc->vc_font.width);
|
||||
|
||||
if (ops->cursor_state.image.dx != dx ||
|
||||
ops->cursor_state.image.dy != dy ||
|
||||
|
||||
@@ -208,7 +208,7 @@ static void cw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
|
||||
int w = (vc->vc_font.height + 7) >> 3, c;
|
||||
int y = real_y(ops->p, vc->vc_y);
|
||||
int y = real_y(ops->p, vc->state.y);
|
||||
int attribute, use_sw = (vc->vc_cursor_type & 0x10);
|
||||
int err = 1, dx, dy;
|
||||
char *src;
|
||||
@@ -267,7 +267,7 @@ static void cw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||
}
|
||||
|
||||
dx = vxres - ((y * vc->vc_font.height) + vc->vc_font.height);
|
||||
dy = vc->vc_x * vc->vc_font.width;
|
||||
dy = vc->state.x * vc->vc_font.width;
|
||||
|
||||
if (ops->cursor_state.image.dx != dx ||
|
||||
ops->cursor_state.image.dy != dy ||
|
||||
|
||||
@@ -255,7 +255,7 @@ static void ud_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
|
||||
int w = (vc->vc_font.width + 7) >> 3, c;
|
||||
int y = real_y(ops->p, vc->vc_y);
|
||||
int y = real_y(ops->p, vc->state.y);
|
||||
int attribute, use_sw = (vc->vc_cursor_type & 0x10);
|
||||
int err = 1, dx, dy;
|
||||
char *src;
|
||||
@@ -315,7 +315,7 @@ static void ud_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||
}
|
||||
|
||||
dy = vyres - ((y * vc->vc_font.height) + vc->vc_font.height);
|
||||
dx = vxres - ((vc->vc_x * vc->vc_font.width) + vc->vc_font.width);
|
||||
dx = vxres - ((vc->state.x * vc->vc_font.width) + vc->vc_font.width);
|
||||
|
||||
if (ops->cursor_state.image.dx != dx ||
|
||||
ops->cursor_state.image.dy != dy ||
|
||||
|
||||
@@ -85,8 +85,8 @@ static void tile_cursor(struct vc_data *vc, struct fb_info *info, int mode,
|
||||
struct fb_tilecursor cursor;
|
||||
int use_sw = (vc->vc_cursor_type & 0x10);
|
||||
|
||||
cursor.sx = vc->vc_x;
|
||||
cursor.sy = vc->vc_y;
|
||||
cursor.sx = vc->state.x;
|
||||
cursor.sy = vc->state.y;
|
||||
cursor.mode = (mode == CM_ERASE || use_sw) ? 0 : 1;
|
||||
cursor.fg = fg;
|
||||
cursor.bg = bg;
|
||||
|
||||
@@ -22,6 +22,37 @@ struct uni_screen;
|
||||
|
||||
#define NPAR 16
|
||||
|
||||
/**
|
||||
* struct vc_state -- state of a VC
|
||||
* @x: cursor's x-position
|
||||
* @y: cursor's y-position
|
||||
* @color: foreground & background colors
|
||||
* @G0_charset: what's G0 slot set to (like GRAF_MAP, LAT1_MAP)
|
||||
* @G1_charset: what's G1 slot set to (like GRAF_MAP, LAT1_MAP)
|
||||
* @charset: what character set to use (0=G0 or 1=G1)
|
||||
* @intensity: 0=half-bright, 1=normal, 2=bold
|
||||
* @reverse: reversed foreground/background colors
|
||||
*
|
||||
* These members are defined separately from struct vc_data as we save &
|
||||
* restore them at times.
|
||||
*/
|
||||
struct vc_state {
|
||||
unsigned int x, y;
|
||||
|
||||
unsigned char color;
|
||||
|
||||
unsigned char G0_charset;
|
||||
unsigned char G1_charset;
|
||||
unsigned int charset : 1;
|
||||
|
||||
/* attribute flags */
|
||||
unsigned int intensity : 2;
|
||||
unsigned int italic : 1;
|
||||
unsigned int underline : 1;
|
||||
unsigned int blink : 1;
|
||||
unsigned int reverse : 1;
|
||||
};
|
||||
|
||||
/*
|
||||
* Example: vc_data of a console that was scrolled 3 lines down.
|
||||
*
|
||||
@@ -57,6 +88,8 @@ struct uni_screen;
|
||||
struct vc_data {
|
||||
struct tty_port port; /* Upper level data */
|
||||
|
||||
struct vc_state state, saved_state;
|
||||
|
||||
unsigned short vc_num; /* Console number */
|
||||
unsigned int vc_cols; /* [#] Console size */
|
||||
unsigned int vc_rows;
|
||||
@@ -73,8 +106,6 @@ struct vc_data {
|
||||
/* attributes for all characters on screen */
|
||||
unsigned char vc_attr; /* Current attributes */
|
||||
unsigned char vc_def_color; /* Default colors */
|
||||
unsigned char vc_color; /* Foreground & background */
|
||||
unsigned char vc_s_color; /* Saved foreground & background */
|
||||
unsigned char vc_ulcolor; /* Color for underline mode */
|
||||
unsigned char vc_itcolor;
|
||||
unsigned char vc_halfcolor; /* Color for half intensity mode */
|
||||
@@ -82,8 +113,6 @@ struct vc_data {
|
||||
unsigned int vc_cursor_type;
|
||||
unsigned short vc_complement_mask; /* [#] Xor mask for mouse pointer */
|
||||
unsigned short vc_s_complement_mask; /* Saved mouse pointer mask */
|
||||
unsigned int vc_x, vc_y; /* Cursor position */
|
||||
unsigned int vc_saved_x, vc_saved_y;
|
||||
unsigned long vc_pos; /* Cursor address */
|
||||
/* fonts */
|
||||
unsigned short vc_hi_font_mask; /* [#] Attribute set for upper 256 chars of font or 0 if not supported */
|
||||
@@ -98,8 +127,6 @@ struct vc_data {
|
||||
int vt_newvt;
|
||||
wait_queue_head_t paste_wait;
|
||||
/* mode flags */
|
||||
unsigned int vc_charset : 1; /* Character set G0 / G1 */
|
||||
unsigned int vc_s_charset : 1; /* Saved character set */
|
||||
unsigned int vc_disp_ctrl : 1; /* Display chars < 32? */
|
||||
unsigned int vc_toggle_meta : 1; /* Toggle high bit? */
|
||||
unsigned int vc_decscnm : 1; /* Screen Mode */
|
||||
@@ -107,17 +134,6 @@ struct vc_data {
|
||||
unsigned int vc_decawm : 1; /* Autowrap Mode */
|
||||
unsigned int vc_deccm : 1; /* Cursor Visible */
|
||||
unsigned int vc_decim : 1; /* Insert Mode */
|
||||
/* attribute flags */
|
||||
unsigned int vc_intensity : 2; /* 0=half-bright, 1=normal, 2=bold */
|
||||
unsigned int vc_italic:1;
|
||||
unsigned int vc_underline : 1;
|
||||
unsigned int vc_blink : 1;
|
||||
unsigned int vc_reverse : 1;
|
||||
unsigned int vc_s_intensity : 2; /* saved rendition */
|
||||
unsigned int vc_s_italic:1;
|
||||
unsigned int vc_s_underline : 1;
|
||||
unsigned int vc_s_blink : 1;
|
||||
unsigned int vc_s_reverse : 1;
|
||||
/* misc */
|
||||
unsigned int vc_priv : 3;
|
||||
unsigned int vc_need_wrap : 1;
|
||||
@@ -129,10 +145,6 @@ struct vc_data {
|
||||
unsigned int vc_tab_stop[8]; /* Tab stops. 256 columns. */
|
||||
unsigned char vc_palette[16*3]; /* Colour palette for VGA+ */
|
||||
unsigned short * vc_translate;
|
||||
unsigned char vc_G0_charset;
|
||||
unsigned char vc_G1_charset;
|
||||
unsigned char vc_saved_G0;
|
||||
unsigned char vc_saved_G1;
|
||||
unsigned int vc_resize_user; /* resize request from user */
|
||||
unsigned int vc_bell_pitch; /* Console bell pitch */
|
||||
unsigned int vc_bell_duration; /* Console bell duration */
|
||||
|
||||
Reference in New Issue
Block a user