mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-10 01:48:00 +00:00
Introduce alternative cursor shapes: underline, vertical line
[originally from svn r870]
This commit is contained in:
parent
e364010d4f
commit
c68959b584
2
putty.h
2
putty.h
@ -24,6 +24,7 @@
|
||||
#define ATTR_PASCURS 0x40000000UL /* passive cursor (box) */
|
||||
#define ATTR_INVALID 0x20000000UL
|
||||
#define ATTR_WRAPPED 0x10000000UL
|
||||
#define ATTR_RIGHTCURS 0x10000000UL /* doubles as cursor-on-RHS indicator */
|
||||
|
||||
#define LATTR_NORM 0x00000000UL
|
||||
#define LATTR_WIDE 0x01000000UL
|
||||
@ -179,6 +180,7 @@ typedef struct {
|
||||
int dec_om;
|
||||
int wrap_mode;
|
||||
int lfhascr;
|
||||
int cursor_type; /* 0=block 1=underline 2=vertical */
|
||||
int blink_cur;
|
||||
int beep;
|
||||
int scrollbar;
|
||||
|
@ -93,6 +93,7 @@ void save_settings (char *section, int do_host, Config *cfg) {
|
||||
write_setting_i (sesskey, "ComposeKey", cfg->compose_key);
|
||||
write_setting_i (sesskey, "LdiscTerm", cfg->ldisc_term);
|
||||
write_setting_i (sesskey, "AlwaysOnTop", cfg->alwaysontop);
|
||||
write_setting_i (sesskey, "CurType", cfg->cursor_type);
|
||||
write_setting_i (sesskey, "BlinkCur", cfg->blink_cur);
|
||||
write_setting_i (sesskey, "Beep", cfg->beep);
|
||||
write_setting_i (sesskey, "ScrollbackLines", cfg->savelines);
|
||||
@ -226,6 +227,7 @@ void load_settings (char *section, int do_host, Config *cfg) {
|
||||
gppi (sesskey, "ComposeKey", 0, &cfg->compose_key);
|
||||
gppi (sesskey, "LdiscTerm", 0, &cfg->ldisc_term);
|
||||
gppi (sesskey, "AlwaysOnTop", 0, &cfg->alwaysontop);
|
||||
gppi (sesskey, "CurType", 0, &cfg->cursor_type);
|
||||
gppi (sesskey, "BlinkCur", 0, &cfg->blink_cur);
|
||||
gppi (sesskey, "Beep", 1, &cfg->beep);
|
||||
gppi (sesskey, "ScrollbackLines", 200, &cfg->savelines);
|
||||
|
@ -1771,6 +1771,8 @@ static void do_paint (Context ctx, int may_optimise){
|
||||
}
|
||||
else
|
||||
cursor = ATTR_PASCURS;
|
||||
if (wrapnext)
|
||||
cursor |= ATTR_RIGHTCURS;
|
||||
}
|
||||
else cursor = 0;
|
||||
rv = (rvideo ? ATTR_REVERSE : 0);
|
||||
@ -1781,11 +1783,10 @@ static void do_paint (Context ctx, int may_optimise){
|
||||
int lattr = (disptop[idx+cols] & LATTR_MODE);
|
||||
for (j=0; j<=cols; j++,idx++) {
|
||||
unsigned long *d = disptop+idx;
|
||||
wanttext[idx] = lattr | ((*d ^ rv
|
||||
wanttext[idx] = lattr | (((*d &~ ATTR_WRAPPED) ^ rv
|
||||
^ (selstart <= d && d < selend ?
|
||||
ATTR_REVERSE : 0)) |
|
||||
(i==our_curs_y && j==curs_x ? cursor : 0));
|
||||
|
||||
if (blink_is_real) {
|
||||
if (has_focus && tblinker && (wanttext[idx]&ATTR_BLINK) )
|
||||
{
|
||||
|
29
windlg.c
29
windlg.c
@ -274,6 +274,10 @@ enum { IDCX_ABOUT = IDC_ABOUT, IDCX_TVSTATIC, IDCX_TREEVIEW, controlstartvalue,
|
||||
IDC_BOX_APPEARANCE1, IDC_BOXT_APPEARANCE1,
|
||||
IDC_BOX_APPEARANCE2, IDC_BOXT_APPEARANCE2,
|
||||
IDC_BOX_APPEARANCE3, IDC_BOXT_APPEARANCE3,
|
||||
IDC_CURSTATIC,
|
||||
IDC_CURBLOCK,
|
||||
IDC_CURUNDER,
|
||||
IDC_CURVERT,
|
||||
IDC_BLINKCUR,
|
||||
IDC_FONTSTATIC,
|
||||
IDC_CHOOSEFONT,
|
||||
@ -472,6 +476,9 @@ static void init_dlg_ctrls(HWND hwnd) {
|
||||
|
||||
SetDlgItemText (hwnd, IDC_WINEDIT, cfg.wintitle);
|
||||
CheckDlgButton (hwnd, IDC_WINNAME, cfg.win_name_always);
|
||||
CheckRadioButton (hwnd, IDC_CURBLOCK, IDC_CURVERT,
|
||||
cfg.cursor_type==0 ? IDC_CURBLOCK :
|
||||
cfg.cursor_type==1 ? IDC_CURUNDER : IDC_CURVERT);
|
||||
CheckDlgButton (hwnd, IDC_BLINKCUR, cfg.blink_cur);
|
||||
CheckDlgButton (hwnd, IDC_SCROLLBAR, cfg.scrollbar);
|
||||
CheckDlgButton (hwnd, IDC_LOCKSIZE, cfg.locksize);
|
||||
@ -828,7 +835,7 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
|
||||
treeview_insert(&tvfaff, 0, "Window");
|
||||
}
|
||||
|
||||
/* The Appearance panel. Accelerators used: [acgo] rmkhti */
|
||||
/* The Appearance panel. Accelerators used: [acgo] rmkhtibluv */
|
||||
{
|
||||
struct ctlpos cp;
|
||||
ctlposinit(&cp, hwnd, 80, 3, 13);
|
||||
@ -836,6 +843,11 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
|
||||
IDC_TITLE_APPEARANCE);
|
||||
beginbox(&cp, "Adjust the use of the cursor",
|
||||
IDC_BOX_APPEARANCE1, IDC_BOXT_APPEARANCE1);
|
||||
radioline(&cp, "Cursor appearance:", IDC_CURSTATIC, 3,
|
||||
"B&lock", IDC_CURBLOCK,
|
||||
"&Underline", IDC_CURUNDER,
|
||||
"&Vertical line", IDC_CURVERT,
|
||||
NULL);
|
||||
checkbox(&cp, "Cursor &blinks", IDC_BLINKCUR);
|
||||
endbox(&cp);
|
||||
beginbox(&cp, "Set the font used in the terminal window",
|
||||
@ -1417,6 +1429,21 @@ static int GenericMainDlgProc (HWND hwnd, UINT msg,
|
||||
HIWORD(wParam) == BN_DOUBLECLICKED)
|
||||
cfg.win_name_always = IsDlgButtonChecked (hwnd, IDC_WINNAME);
|
||||
break;
|
||||
case IDC_CURBLOCK:
|
||||
if (HIWORD(wParam) == BN_CLICKED ||
|
||||
HIWORD(wParam) == BN_DOUBLECLICKED)
|
||||
cfg.cursor_type = 0;
|
||||
break;
|
||||
case IDC_CURUNDER:
|
||||
if (HIWORD(wParam) == BN_CLICKED ||
|
||||
HIWORD(wParam) == BN_DOUBLECLICKED)
|
||||
cfg.cursor_type = 1;
|
||||
break;
|
||||
case IDC_CURVERT:
|
||||
if (HIWORD(wParam) == BN_CLICKED ||
|
||||
HIWORD(wParam) == BN_DOUBLECLICKED)
|
||||
cfg.cursor_type = 2;
|
||||
break;
|
||||
case IDC_BLINKCUR:
|
||||
if (HIWORD(wParam) == BN_CLICKED ||
|
||||
HIWORD(wParam) == BN_DOUBLECLICKED)
|
||||
|
25
window.c
25
window.c
@ -1663,7 +1663,7 @@ void do_text (Context ctx, int x, int y, char *text, int len,
|
||||
x *= fnt_width;
|
||||
y *= font_height;
|
||||
|
||||
if (attr & ATTR_ACTCURS) {
|
||||
if ((attr & ATTR_ACTCURS) && cfg.cursor_type == 0) {
|
||||
attr &= (bold_mode == BOLD_COLOURS ? 0x300200 : 0x300300);
|
||||
attr ^= ATTR_CUR_XOR;
|
||||
}
|
||||
@ -1824,7 +1824,7 @@ void do_text (Context ctx, int x, int y, char *text, int len,
|
||||
oldpen = SelectObject (hdc, oldpen);
|
||||
DeleteObject (oldpen);
|
||||
}
|
||||
if (attr & ATTR_PASCURS) {
|
||||
if ((attr & ATTR_PASCURS) && cfg.cursor.type == 0) {
|
||||
POINT pts[5];
|
||||
HPEN oldpen;
|
||||
pts[0].x = pts[1].x = pts[4].x = x;
|
||||
@ -1836,6 +1836,27 @@ void do_text (Context ctx, int x, int y, char *text, int len,
|
||||
oldpen = SelectObject (hdc, oldpen);
|
||||
DeleteObject (oldpen);
|
||||
}
|
||||
if ((attr & (ATTR_ACTCURS | ATTR_PASCURS)) && cfg.cursor_type != 0) {
|
||||
HPEN oldpen;
|
||||
int pentype;
|
||||
if (attr & ATTR_PASCURS)
|
||||
pentype = PS_DOTTED;
|
||||
else
|
||||
pentype = PS_SOLID;
|
||||
oldpen = SelectObject (hdc, CreatePen(pentype, 0, colours[23]));
|
||||
if (cfg.cursor_type == 1) {
|
||||
MoveToEx (hdc, x, y+descent, NULL);
|
||||
LineTo (hdc, x+fnt_width-1, y+descent);
|
||||
} else {
|
||||
int xadjust = 0;
|
||||
if (attr & ATTR_RIGHTCURS)
|
||||
xadjust = fnt_width-1;
|
||||
MoveToEx (hdc, x+xadjust, y, NULL);
|
||||
LineTo (hdc, x+xadjust, y+font_height-1);
|
||||
}
|
||||
oldpen = SelectObject (hdc, oldpen);
|
||||
DeleteObject (oldpen);
|
||||
}
|
||||
}
|
||||
|
||||
static int check_compose(int first, int second) {
|
||||
|
Loading…
Reference in New Issue
Block a user