From fc5b0934ce14797c486d3bfbf55ded37e2e4a8f6 Mon Sep 17 00:00:00 2001 From: ben Date: Sat, 25 Jan 2003 16:16:45 +0000 Subject: [PATCH] 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(). git-svn-id: svn://svn.tartarus.org/sgt/putty@2721 cda61777-01e9-0310-a592-d414129be87e --- mac/macterm.c | 26 +++++++------------------- putty.h | 4 ++-- terminal.c | 28 ++++++++++++++-------------- unix/pterm.c | 8 +++++--- window.c | 19 ++++++++++++------- 5 files changed, 40 insertions(+), 45 deletions(-) diff --git a/mac/macterm.c b/mac/macterm.c index 4f4a9dbb..61dc4b4e 100644 --- a/mac/macterm.c +++ b/mac/macterm.c @@ -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) { /* diff --git a/putty.h b/putty.h index 52157e25..c8f95ff4 100644 --- a/putty.h +++ b/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 *); diff --git a/terminal.c b/terminal.c index 005bee55..87085c66 100644 --- a/terminal.c +++ b/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 diff --git a/unix/pterm.c b/unix/pterm.c index 402a4e7f..abd2f122 100644 --- a/unix/pterm.c +++ b/unix/pterm.c @@ -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; } diff --git a/window.c b/window.c index 410c37ef..74bfc402 100644 --- a/window.c +++ b/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 { -- 2.11.0