diff -Naur -x .svn src/gfx.cpp src/gfx.cpp --- src/gfx.cpp 2009-06-01 00:06:47.000000000 +0200 +++ src/gfx.cpp 2009-05-31 20:36:24.000000000 +0200 @@ -31,10 +31,12 @@ bool _ctrl_pressed; ///< Is Ctrl pressed? bool _shift_pressed; ///< Is Shift pressed? byte _fast_forward; -bool _left_button_down; ///< Is left mouse button pressed? -bool _left_button_clicked; ///< Is left mouse button clicked? -bool _right_button_down; ///< Is right mouse button pressed? -bool _right_button_clicked; ///< Is right mouse button clicked? +bool _left_button_down; ///< Is left mouse button pressed? +bool _left_button_clicked; ///< Is left mouse button clicked? +bool _right_button_down; ///< Is right mouse button pressed? +bool _right_button_clicked; ///< Is right mouse button clicked? +bool _middle_button_down; ///< Is middle mouse button pressed? +bool _middle_button_clicked; ///< Is middle mouse button clicked? DrawPixelInfo _screen; bool _screen_disable_anim = false; ///< Disable palette animation (important for 32bpp-anim blitter during giant screenshot) bool _exit_game; diff -Naur -x .svn src/gfx_func.h src/gfx_func.h --- src/gfx_func.h 2009-05-31 23:58:34.000000000 +0200 +++ src/gfx_func.h 2009-05-17 22:16:21.000000000 +0200 @@ -53,6 +53,8 @@ extern bool _left_button_clicked; extern bool _right_button_down; extern bool _right_button_clicked; +extern bool _middle_button_down; +extern bool _middle_button_clicked; extern DrawPixelInfo _screen; extern bool _screen_disable_anim; ///< Disable palette animation (important for 32bpp-anim blitter during giant screenshot) diff -Naur -x .svn src/lang/english.txt src/lang/english.txt --- src/lang/english.txt 2009-06-01 00:00:49.000000000 +0200 +++ src/lang/english.txt 2009-05-31 20:36:17.000000000 +0200 @@ -1023,6 +1023,11 @@ STR_CONFIG_SETTING_SHADE_ON_SCROLL_ON_CAPTION_BUTTON :Shade window if it has a shade button STR_CONFIG_SETTING_SHADE_ON_SCROLL_ON_CAPTION_ALL :Shade window +STR_CONFIG_SETTING_SHADE_ON_MIDDLE_CLICK :{LTBLUE}Middle-click on window: {ORANGE}{STRING1} +STR_CONFIG_SETTING_SHADE_ON_MIDDLE_CLICK_NONE :Off +STR_CONFIG_SETTING_SHADE_ON_MIDDLE_CLICK_BUTTON :Shade window if it has a shade button +STR_CONFIG_SETTING_SHADE_ON_MIDDLE_CLICK_ALL :Shade window + STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU :{LTBLUE}Right-click emulation: {ORANGE}{STRING1} STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_COMMAND :Command+Click STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_CONTROL :Ctrl+Click diff -Naur -x .svn src/settings.cpp src/settings.cpp --- src/settings.cpp 2009-06-01 00:51:12.000000000 +0200 +++ src/settings.cpp 2009-05-31 20:36:23.000000000 +0200 @@ -963,7 +963,8 @@ Window *w; /* If both scrolling and middle-clicking are disabled, unshade * all shaded windows */ - if (_settings_client.gui.shade_on_scroll_on_caption == 0) { + if ((_settings_client.gui.shade_on_middle_click == 0) && + (_settings_client.gui.shade_on_scroll_on_caption == 0)) { FOR_ALL_WINDOWS_FROM_BACK(w) { if (w->flags4 & WF_SHADE) UnShadeWindow(w); } diff -Naur -x .svn src/settings_gui.cpp src/settings_gui.cpp --- src/settings_gui.cpp 2009-06-01 00:01:13.000000000 +0200 +++ src/settings_gui.cpp 2009-05-31 20:36:23.000000000 +0200 @@ -1160,6 +1160,7 @@ SettingEntry("gui.scrollwheel_scrolling"), SettingEntry("gui.scrollwheel_multiplier"), SettingEntry("gui.shade_on_scroll_on_caption"), + SettingEntry("gui.shade_on_middle_click"), #ifdef __APPLE__ /* We might need to emulate a right mouse button on mac */ SettingEntry("gui.right_mouse_btn_emulation"), diff -Naur -x .svn src/settings_type.h src/settings_type.h --- src/settings_type.h 2009-06-01 00:03:14.000000000 +0200 +++ src/settings_type.h 2009-05-31 20:36:23.000000000 +0200 @@ -69,6 +69,7 @@ uint8 scrollwheel_scrolling; ///< scrolling using the scroll wheel? uint8 scrollwheel_multiplier; ///< how much 'wheel' per incoming event from the OS? uint8 shade_on_scroll_on_caption; ///< shade window when scrolling on window caption: 0=never, 1=windows with shadebutton, 2=all windows + uint8 shade_on_middle_click; ///< shade window when clicked with middle mouse button: 0=never, 1=windows with shadebutton, 2=all windows bool left_mouse_btn_scrolling; ///< left mouse button scroll bool pause_on_newgame; ///< whether to start new games paused or not bool enable_signal_gui; ///< show the signal GUI when the signal button is pressed diff -Naur -x .svn src/table/settings.h src/table/settings.h --- src/table/settings.h 2009-06-01 00:01:37.000000000 +0200 +++ src/table/settings.h 2009-05-31 20:36:18.000000000 +0200 @@ -535,6 +535,7 @@ SDTC_VAR(gui.scrollwheel_scrolling, SLE_UINT8, S, MS, 0, 0, 2, 0, STR_CONFIG_SETTING_SCROLLWHEEL_SCROLLING, NULL), SDTC_VAR(gui.scrollwheel_multiplier, SLE_UINT8, S, 0, 5, 1, 15, 1, STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER, NULL), SDTC_VAR(gui.shade_on_scroll_on_caption,SLE_UINT8, S, MS, 1, 0, 2, 1, STR_CONFIG_SETTING_SHADE_ON_SCROLL_ON_CAPTION, ShadeWindowModelChanged), + SDTC_VAR(gui.shade_on_middle_click, SLE_UINT8, S, MS, 1, 0, 2, 1, STR_CONFIG_SETTING_SHADE_ON_MIDDLE_CLICK, ShadeWindowModelChanged), SDTC_BOOL(gui.pause_on_newgame, S, 0, false, STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME, NULL), SDTC_VAR(gui.advanced_vehicle_list, SLE_UINT8, S, MS, 1, 0, 2, 0, STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS, NULL), SDTC_BOOL(gui.timetable_in_ticks, S, 0, false, STR_CONFIG_SETTING_TIMETABLE_IN_TICKS, NULL), diff -Naur -x .svn src/video/allegro_v.cpp src/video/allegro_v.cpp --- src/video/allegro_v.cpp 2009-06-01 14:04:47.000000000 +0200 +++ src/video/allegro_v.cpp 2009-06-01 14:04:57.000000000 +0200 @@ -310,6 +310,7 @@ enum { LEFT_BUTTON, RIGHT_BUTTON, + MIDDLE_BUTTON, }; static void PollEvent() @@ -341,6 +342,11 @@ _right_button_clicked = true; break; + case MIDDLE_BUTTON: + _middle_button_down = true; + _middle_button_clicked = true; + break; + default: /* ignore rest */ break; @@ -356,6 +362,9 @@ _left_button_clicked = false; } else if (button == RIGHT_BUTTON) { _right_button_down = false; + } else if (button == MIDDLE_BUTTON) { + _middle_button_down = false; + _middle_button_clicked = false; } } } diff -Naur -x .svn src/video/sdl_v.cpp src/video/sdl_v.cpp --- src/video/sdl_v.cpp 2009-05-31 23:59:10.000000000 +0200 +++ src/video/sdl_v.cpp 2009-05-17 22:16:21.000000000 +0200 @@ -363,6 +363,11 @@ _right_button_clicked = true; break; + case SDL_BUTTON_MIDDLE: + _middle_button_down = true; + _middle_button_clicked = true; + break; + case SDL_BUTTON_WHEELUP: _cursor.wheel--; break; case SDL_BUTTON_WHEELDOWN: _cursor.wheel++; break; @@ -381,6 +386,9 @@ _left_button_clicked = false; } else if (ev.button.button == SDL_BUTTON_RIGHT) { _right_button_down = false; + } else if (ev.button.button == SDL_BUTTON_MIDDLE) { + _middle_button_down = false; + _middle_button_clicked = false; } HandleMouseEvents(); break; diff -Naur -x .svn src/video/win32_v.cpp src/video/win32_v.cpp --- src/video/win32_v.cpp 2009-05-31 23:59:30.000000000 +0200 +++ src/video/win32_v.cpp 2009-05-17 22:16:21.000000000 +0200 @@ -399,6 +399,20 @@ HandleMouseEvents(); return 0; + case WM_MBUTTONDOWN: + SetCapture(hwnd); + _middle_button_down = true; + _middle_button_clicked = true; + HandleMouseEvents(); + return 0; + + case WM_MBUTTONUP: + ReleaseCapture(); + _middle_button_down = false; + _middle_button_clicked = false; + HandleMouseEvents(); + return 0; + case WM_MOUSELEAVE: UndrawMouseCursor(); _cursor.in_window = false; diff -Naur -x .svn src/window.cpp src/window.cpp --- src/window.cpp 2009-06-01 14:04:48.000000000 +0200 +++ src/window.cpp 2009-06-01 14:04:58.000000000 +0200 @@ -385,6 +385,28 @@ w->OnRightClick(pt, widget); } +static void DispatchMiddleClickEvent(Window *w, int x, int y) +{ + int widget = 0; + + widget = GetWidgetFromPos(w, x, y); + if (widget < 0) return; // exit if clicked outside of widgets + + if ((_settings_client.gui.shade_on_middle_click != 0) && + ((_settings_client.gui.shade_on_middle_click == 2) || (w->desc_flags & WDF_SHADE_BUTTON))) { + if (w->flags4 & WF_SHADE) { + UnShadeWindow(w); + } + else if (!(w->flags4 & WF_SHADE)) { + ShadeWindow(w); + } + return; + } + + Point pt = { x, y }; + w->OnMiddleClick(pt, widget); +} + /** * Dispatch the mousewheel-action to the window. * The window will scroll any compatible scrollbars if the mouse is pointed over the bar or its contents @@ -1995,6 +2017,7 @@ MC_LEFT, MC_RIGHT, MC_DOUBLE_LEFT, + MC_MIDDLE, MAX_OFFSET_DOUBLE_CLICK = 5, ///< How much the mouse is allowed to move to call it a double click TIME_BETWEEN_DOUBLE_CLICK = 500, ///< Time between 2 left clicks before it becoming a double click, in ms @@ -2124,6 +2147,10 @@ } break; + case MC_MIDDLE: + DispatchMiddleClickEvent(w, x - w->left, y - w->top); + break; + default: break; } @@ -2144,6 +2171,8 @@ /* fallthough */ case MC_RIGHT: DispatchRightClickEvent(w, x - w->left, y - w->top); break; + + case MC_MIDDLE: DispatchMiddleClickEvent(w, x - w->left, y - w->top); break; } } } @@ -2186,6 +2215,10 @@ _right_button_clicked = false; click = MC_RIGHT; _input_events_this_tick++; + } else if (_middle_button_clicked) { + _middle_button_clicked = false; + click = MC_MIDDLE; + _input_events_this_tick++; } int mousewheel = 0; diff -Naur -x .svn src/window_gui.h src/window_gui.h --- src/window_gui.h 2009-06-01 00:02:58.000000000 +0200 +++ src/window_gui.h 2009-05-31 23:43:03.000000000 +0200 @@ -453,6 +453,13 @@ virtual void OnRightClick(Point pt, int widget) {} /** + * A click with the middle mouse button has been made on the window. + * @param pt the point inside the window that has been clicked. + * @param widget the clicked widget. + */ + virtual void OnMiddleClick(Point pt, int widget) {} + + /** * A dragged 'object' has been released. * @param pt the point inside the window where the release took place. * @param widget the widget where the release took place.