mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-09 09:27:59 +00:00
Change the term_mouse interface a little so that it gets passed
both the raw and the cooked mouse button, with the mapping being done in advance by the front-end. This is useful because it allows the front-end to use information other than the raw button (e.g. the modifier state) to decide which cooked button to generate. . Front ends other than the Mac one are untested, but they just call translate_button() themselves and pass the result to term_mouse(). [originally from svn r2721]
This commit is contained in:
parent
3f01fc87ec
commit
af4be2e83e
@ -1,4 +1,4 @@
|
||||
/* $Id: macterm.c,v 1.53 2003/01/25 15:15:40 ben Exp $ */
|
||||
/* $Id: macterm.c,v 1.54 2003/01/25 16:16:44 ben Exp $ */
|
||||
/*
|
||||
* Copyright (c) 1999 Simon Tatham
|
||||
* Copyright (c) 1999, 2002 Ben Harris
|
||||
@ -502,8 +502,8 @@ static void text_click(Session *s, EventRecord *event) {
|
||||
lastact == MA_3CLK ? MA_CLICK : MA_NOTHING);
|
||||
else
|
||||
lastact = MA_CLICK;
|
||||
/* Fake right button with shift key */
|
||||
term_mouse(s->term, event->modifiers & shiftKey ? MBT_RIGHT : MBT_LEFT,
|
||||
term_mouse(s->term, MBT_LEFT,
|
||||
event->modifiers & shiftKey ? MBT_EXTEND : MBT_SELECT,
|
||||
lastact, col, row, event->modifiers & shiftKey,
|
||||
event->modifiers & controlKey, event->modifiers & optionKey);
|
||||
lastsess = s;
|
||||
@ -513,8 +513,8 @@ static void text_click(Session *s, EventRecord *event) {
|
||||
GetMouse(&localwhere);
|
||||
col = PTOCC(localwhere.h);
|
||||
row = PTOCR(localwhere.v);
|
||||
term_mouse(s->term,
|
||||
event->modifiers & shiftKey ? MBT_RIGHT : MBT_LEFT,
|
||||
term_mouse(s->term, MBT_LEFT,
|
||||
event->modifiers & shiftKey ? MBT_EXTEND : MBT_SELECT,
|
||||
MA_DRAG, col, row, event->modifiers & shiftKey,
|
||||
event->modifiers & controlKey,
|
||||
event->modifiers & optionKey);
|
||||
@ -523,25 +523,13 @@ static void text_click(Session *s, EventRecord *event) {
|
||||
else if (row < 0)
|
||||
term_scroll(s->term, 0, row);
|
||||
}
|
||||
term_mouse(s->term, event->modifiers & shiftKey ? MBT_RIGHT : MBT_LEFT,
|
||||
term_mouse(s->term, MBT_LEFT,
|
||||
event->modifiers & shiftKey ? MBT_EXTEND : MBT_SELECT,
|
||||
MA_RELEASE, col, row, event->modifiers & shiftKey,
|
||||
event->modifiers & controlKey, event->modifiers & optionKey);
|
||||
lastwhen = TickCount();
|
||||
}
|
||||
|
||||
Mouse_Button translate_button(void *frontend, Mouse_Button button)
|
||||
{
|
||||
|
||||
switch (button) {
|
||||
case MBT_LEFT:
|
||||
return MBT_SELECT;
|
||||
case MBT_RIGHT:
|
||||
return MBT_EXTEND;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void write_clip(void *cookie, wchar_t *data, int len, int must_deselect) {
|
||||
|
||||
/*
|
||||
|
4
putty.h
4
putty.h
@ -432,7 +432,6 @@ void write_clip(void *frontend, wchar_t *, int, int);
|
||||
void get_clip(void *frontend, wchar_t **, int *);
|
||||
void optimised_move(void *frontend, int, int, int);
|
||||
void set_raw_mouse_mode(void *frontend, int);
|
||||
Mouse_Button translate_button(void *frontend, Mouse_Button b);
|
||||
void connection_fatal(void *frontend, char *, ...);
|
||||
void fatalbox(char *, ...);
|
||||
void modalfatalbox(char *, ...);
|
||||
@ -505,7 +504,8 @@ void term_paint(Terminal *, Context, int, int, int, int, int);
|
||||
void term_scroll(Terminal *, int, int);
|
||||
void term_pwron(Terminal *);
|
||||
void term_clrsb(Terminal *);
|
||||
void term_mouse(Terminal *, Mouse_Button, Mouse_Action, int,int,int,int,int);
|
||||
void term_mouse(Terminal *, Mouse_Button, Mouse_Button, Mouse_Action,
|
||||
int,int,int,int,int);
|
||||
void term_deselect(Terminal *);
|
||||
void term_update(Terminal *);
|
||||
void term_invalidate(Terminal *);
|
||||
|
28
terminal.c
28
terminal.c
@ -3802,8 +3802,8 @@ void term_do_paste(Terminal *term)
|
||||
get_clip(term->frontend, NULL, NULL);
|
||||
}
|
||||
|
||||
void term_mouse(Terminal *term, Mouse_Button b, Mouse_Action a, int x, int y,
|
||||
int shift, int ctrl, int alt)
|
||||
void term_mouse(Terminal *term, Mouse_Button braw, Mouse_Button bcooked,
|
||||
Mouse_Action a, int x, int y, int shift, int ctrl, int alt)
|
||||
{
|
||||
pos selpoint;
|
||||
unsigned long *ldata;
|
||||
@ -3844,7 +3844,7 @@ void term_mouse(Terminal *term, Mouse_Button b, Mouse_Action a, int x, int y,
|
||||
|
||||
if (term->ldisc) {
|
||||
|
||||
switch (b) {
|
||||
switch (braw) {
|
||||
case MBT_LEFT:
|
||||
encstate = 0x20; /* left button down */
|
||||
break;
|
||||
@ -3873,9 +3873,9 @@ void term_mouse(Terminal *term, Mouse_Button b, Mouse_Action a, int x, int y,
|
||||
term->mouse_is_down = 0;
|
||||
break;
|
||||
case MA_CLICK:
|
||||
if (term->mouse_is_down == b)
|
||||
if (term->mouse_is_down == braw)
|
||||
return;
|
||||
term->mouse_is_down = b;
|
||||
term->mouse_is_down = braw;
|
||||
break;
|
||||
default: break; /* placate gcc warning about enum use */
|
||||
}
|
||||
@ -3892,8 +3892,6 @@ void term_mouse(Terminal *term, Mouse_Button b, Mouse_Action a, int x, int y,
|
||||
return;
|
||||
}
|
||||
|
||||
b = translate_button(term->frontend, b);
|
||||
|
||||
/*
|
||||
* Set the selection type (rectangular or normal) at the start
|
||||
* of a selection attempt, from the state of Alt.
|
||||
@ -3907,13 +3905,13 @@ void term_mouse(Terminal *term, Mouse_Button b, Mouse_Action a, int x, int y,
|
||||
term->seltype = default_seltype;
|
||||
}
|
||||
|
||||
if (b == MBT_SELECT && a == MA_CLICK) {
|
||||
if (bcooked == MBT_SELECT && a == MA_CLICK) {
|
||||
deselect(term);
|
||||
term->selstate = ABOUT_TO;
|
||||
term->seltype = default_seltype;
|
||||
term->selanchor = selpoint;
|
||||
term->selmode = SM_CHAR;
|
||||
} else if (b == MBT_SELECT && (a == MA_2CLK || a == MA_3CLK)) {
|
||||
} else if (bcooked == MBT_SELECT && (a == MA_2CLK || a == MA_3CLK)) {
|
||||
deselect(term);
|
||||
term->selmode = (a == MA_2CLK ? SM_WORD : SM_LINE);
|
||||
term->selstate = DRAGGING;
|
||||
@ -3921,11 +3919,12 @@ void term_mouse(Terminal *term, Mouse_Button b, Mouse_Action a, int x, int y,
|
||||
term->selend = term->selstart;
|
||||
incpos(term->selend);
|
||||
sel_spread(term);
|
||||
} else if ((b == MBT_SELECT && a == MA_DRAG) ||
|
||||
(b == MBT_EXTEND && a != MA_RELEASE)) {
|
||||
} else if ((bcooked == MBT_SELECT && a == MA_DRAG) ||
|
||||
(bcooked == MBT_EXTEND && a != MA_RELEASE)) {
|
||||
if (term->selstate == ABOUT_TO && poseq(term->selanchor, selpoint))
|
||||
return;
|
||||
if (b == MBT_EXTEND && a != MA_DRAG && term->selstate == SELECTED) {
|
||||
if (bcooked == MBT_EXTEND && a != MA_DRAG &&
|
||||
term->selstate == SELECTED) {
|
||||
if (term->seltype == LEXICOGRAPHIC) {
|
||||
/*
|
||||
* For normal selection, we extend by moving
|
||||
@ -3986,7 +3985,8 @@ void term_mouse(Terminal *term, Mouse_Button b, Mouse_Action a, int x, int y,
|
||||
term->selend.y = max(term->selanchor.y, selpoint.y);
|
||||
}
|
||||
sel_spread(term);
|
||||
} else if ((b == MBT_SELECT || b == MBT_EXTEND) && a == MA_RELEASE) {
|
||||
} else if ((bcooked == MBT_SELECT || bcooked == MBT_EXTEND) &&
|
||||
a == MA_RELEASE) {
|
||||
if (term->selstate == DRAGGING) {
|
||||
/*
|
||||
* We've completed a selection. We now transfer the
|
||||
@ -3997,7 +3997,7 @@ void term_mouse(Terminal *term, Mouse_Button b, Mouse_Action a, int x, int y,
|
||||
term->selstate = SELECTED;
|
||||
} else
|
||||
term->selstate = NO_SELECTION;
|
||||
} else if (b == MBT_PASTE
|
||||
} else if (bcooked == MBT_PASTE
|
||||
&& (a == MA_CLICK
|
||||
#if MULTICLICK_ONLY_EVENT
|
||||
|| a == MA_2CLK || a == MA_3CLK
|
||||
|
@ -151,7 +151,7 @@ int font_dimension(void *frontend, int which)/* 0 for width, 1 for height */
|
||||
* mouse or a means of faking it, and there is no need to switch
|
||||
* buttons around at all.
|
||||
*/
|
||||
Mouse_Button translate_button(void *frontend, Mouse_Button button)
|
||||
static Mouse_Button translate_button(void *frontend, Mouse_Button button)
|
||||
{
|
||||
/* struct gui_data *inst = (struct gui_data *)frontend; */
|
||||
|
||||
@ -937,7 +937,8 @@ gint button_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
|
||||
x = (event->x - inst->cfg.window_border) / inst->font_width;
|
||||
y = (event->y - inst->cfg.window_border) / inst->font_height;
|
||||
|
||||
term_mouse(inst->term, button, act, x, y, shift, ctrl, alt);
|
||||
term_mouse(inst->term, button, translate_button(button), act,
|
||||
x, y, shift, ctrl, alt);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@ -964,7 +965,8 @@ gint motion_event(GtkWidget *widget, GdkEventMotion *event, gpointer data)
|
||||
x = (event->x - inst->cfg.window_border) / inst->font_width;
|
||||
y = (event->y - inst->cfg.window_border) / inst->font_height;
|
||||
|
||||
term_mouse(inst->term, button, MA_DRAG, x, y, shift, ctrl, alt);
|
||||
term_mouse(inst->term, button, translate_button(button), MA_DRAG,
|
||||
x, y, shift, ctrl, alt);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
19
window.c
19
window.c
@ -78,6 +78,7 @@
|
||||
#define WHEEL_DELTA 120
|
||||
#endif
|
||||
|
||||
static Mouse_Button translate_button(void *frontend, Mouse_Button button);
|
||||
static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
|
||||
static int TranslateKey(UINT message, WPARAM wParam, LPARAM lParam,
|
||||
unsigned char *output);
|
||||
@ -1560,7 +1561,8 @@ static void click(Mouse_Button b, int x, int y, int shift, int ctrl, int alt)
|
||||
|
||||
if (send_raw_mouse && !(cfg.mouse_override && shift)) {
|
||||
lastbtn = MBT_NOTHING;
|
||||
term_mouse(term, b, MA_CLICK, x, y, shift, ctrl, alt);
|
||||
term_mouse(term, b, translate_button(b), MA_CLICK,
|
||||
x, y, shift, ctrl, alt);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1573,7 +1575,8 @@ static void click(Mouse_Button b, int x, int y, int shift, int ctrl, int alt)
|
||||
lastact = MA_CLICK;
|
||||
}
|
||||
if (lastact != MA_NOTHING)
|
||||
term_mouse(term, b, lastact, x, y, shift, ctrl, alt);
|
||||
term_mouse(term, b, translate_button(b), lastact,
|
||||
x, y, shift, ctrl, alt);
|
||||
lasttime = thistime;
|
||||
}
|
||||
|
||||
@ -1581,7 +1584,7 @@ static void click(Mouse_Button b, int x, int y, int shift, int ctrl, int alt)
|
||||
* Translate a raw mouse button designation (LEFT, MIDDLE, RIGHT)
|
||||
* into a cooked one (SELECT, EXTEND, PASTE).
|
||||
*/
|
||||
Mouse_Button translate_button(void *frontend, Mouse_Button button)
|
||||
static Mouse_Button translate_button(void *frontend, Mouse_Button button)
|
||||
{
|
||||
if (button == MBT_LEFT)
|
||||
return MBT_SELECT;
|
||||
@ -2052,7 +2055,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
|
||||
is_alt_pressed());
|
||||
SetCapture(hwnd);
|
||||
} else {
|
||||
term_mouse(term, button, MA_RELEASE,
|
||||
term_mouse(term, button, translate_button(button), MA_RELEASE,
|
||||
TO_CHR_X(X_POS(lParam)),
|
||||
TO_CHR_Y(Y_POS(lParam)), wParam & MK_SHIFT,
|
||||
wParam & MK_CONTROL, is_alt_pressed());
|
||||
@ -2077,7 +2080,8 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
|
||||
b = MBT_MIDDLE;
|
||||
else
|
||||
b = MBT_RIGHT;
|
||||
term_mouse(term, b, MA_DRAG, TO_CHR_X(X_POS(lParam)),
|
||||
term_mouse(term, b, translate_button(b), MA_DRAG,
|
||||
TO_CHR_X(X_POS(lParam)),
|
||||
TO_CHR_Y(Y_POS(lParam)), wParam & MK_SHIFT,
|
||||
wParam & MK_CONTROL, is_alt_pressed());
|
||||
}
|
||||
@ -2612,12 +2616,13 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
|
||||
if (send_raw_mouse &&
|
||||
!(cfg.mouse_override && shift_pressed)) {
|
||||
/* send a mouse-down followed by a mouse up */
|
||||
term_mouse(term, b,
|
||||
term_mouse(term, b, translate_button(b),
|
||||
MA_CLICK,
|
||||
TO_CHR_X(X_POS(lParam)),
|
||||
TO_CHR_Y(Y_POS(lParam)), shift_pressed,
|
||||
control_pressed, is_alt_pressed());
|
||||
term_mouse(term, b, MA_RELEASE, TO_CHR_X(X_POS(lParam)),
|
||||
term_mouse(term, b, translate_button(b),
|
||||
MA_RELEASE, TO_CHR_X(X_POS(lParam)),
|
||||
TO_CHR_Y(Y_POS(lParam)), shift_pressed,
|
||||
control_pressed, is_alt_pressed());
|
||||
} else {
|
||||
|
Loading…
Reference in New Issue
Block a user