diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index b33df33b00..449cf38521 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3920,6 +3920,7 @@ STR_5578 :Russian Rouble (R) STR_5579 :Window scale factor: STR_5580 :Czech koruna (Kc) STR_5581 :Show FPS +STR_5582 :Trap mouse cursor in window ##################### # Rides/attractions # diff --git a/src/config.c b/src/config.c index 47aecd3b5c..77683b1d69 100644 --- a/src/config.c +++ b/src/config.c @@ -200,6 +200,7 @@ config_property_definition _generalDefinitions[] = { { offsetof(general_configuration, steam_overlay_pause), "steam_overlay_pause", CONFIG_VALUE_TYPE_BOOLEAN, true, NULL }, { offsetof(general_configuration, window_scale), "window_scale", CONFIG_VALUE_TYPE_FLOAT, { .value_float = 1.0f }, NULL }, { offsetof(general_configuration, show_fps), "show_fps", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, + { offsetof(general_configuration, trap_cursor), "trap_cursor", CONFIG_VALUE_TYPE_BOOLEAN, false, NULL }, }; config_property_definition _interfaceDefinitions[] = { diff --git a/src/config.h b/src/config.h index b376954884..dc6c5d1259 100644 --- a/src/config.h +++ b/src/config.h @@ -169,6 +169,7 @@ typedef struct { uint8 steam_overlay_pause; float window_scale; uint8 show_fps; + uint8 trap_cursor; } general_configuration; typedef struct { diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index c373de4cf7..027107c96b 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2180,6 +2180,8 @@ enum { STR_SHOW_FPS = 5581, + STR_TRAP_MOUSE = 5582, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 }; diff --git a/src/platform/shared.c b/src/platform/shared.c index b1a981842a..08c3277b79 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -739,11 +739,14 @@ static void platform_create_window() gWindow = SDL_CreateWindow( "OpenRCT2", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_RESIZABLE ); + if (!gWindow) { log_fatal("SDL_CreateWindow failed %s", SDL_GetError()); exit(-1); } + SDL_SetWindowGrab(gWindow, gConfigGeneral.trap_cursor ? SDL_TRUE : SDL_FALSE); + // Set the update palette function pointer RCT2_GLOBAL(0x009E2BE4, update_palette_func) = platform_update_palette; diff --git a/src/windows/options.c b/src/windows/options.c index 73c2851089..136cc017ac 100644 --- a/src/windows/options.c +++ b/src/windows/options.c @@ -122,6 +122,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { // Controls and interface WIDX_CONTROLS_GROUP = WIDX_PAGE_START, WIDX_SCREEN_EDGE_SCROLLING, + WIDX_TRAP_CURSOR, WIDX_INVERT_DRAG, WIDX_HOTKEY_DROPDOWN, WIDX_THEMES_GROUP, @@ -233,23 +234,24 @@ static rct_widget window_options_audio_widgets[] = { static rct_widget window_options_controls_and_interface_widgets[] = { MAIN_OPTIONS_WIDGETS, - { WWT_GROUPBOX, 1, 5, 304, 53, 114, STR_CONTROLS_GROUP, STR_NONE }, // Controls group - { WWT_CHECKBOX, 2, 10, 299, 68, 79, STR_SCREEN_EDGE_SCROLLING, STR_SCREEN_EDGE_SCROLLING_TIP }, // Edge scrolling - { WWT_CHECKBOX, 2, 10, 299, 83, 94, STR_INVERT_RIGHT_MOUSE_DRAG, STR_NONE }, // Invert right mouse dragging - { WWT_DROPDOWN_BUTTON, 1, 26, 185, 98, 109, STR_HOTKEY, STR_HOTKEY_TIP }, // Set hotkeys buttons + { WWT_GROUPBOX, 1, 5, 304, 53, 129, STR_CONTROLS_GROUP, STR_NONE }, // Controls group + { WWT_CHECKBOX, 2, 10, 299, 68, 79, STR_SCREEN_EDGE_SCROLLING, STR_SCREEN_EDGE_SCROLLING_TIP }, // Edge scrolling + { WWT_CHECKBOX, 2, 10, 299, 83, 94, STR_TRAP_MOUSE, STR_NONE }, // Trap mouse + { WWT_CHECKBOX, 2, 10, 299, 98, 109, STR_INVERT_RIGHT_MOUSE_DRAG, STR_NONE }, // Invert right mouse dragging + { WWT_DROPDOWN_BUTTON, 1, 26, 185, 113, 124, STR_HOTKEY, STR_HOTKEY_TIP }, // Set hotkeys buttons - { WWT_GROUPBOX, 1, 5, 304, 118, 164, STR_THEMES_GROUP, STR_NONE }, // Toolbar buttons group - { WWT_DROPDOWN, 1, 155, 299, 132, 143, STR_NONE, STR_NONE }, // Themes - { WWT_DROPDOWN_BUTTON, 1, 288, 298, 133, 142, STR_DROPDOWN_GLYPH, STR_NONE }, - { WWT_DROPDOWN_BUTTON, 1, 10, 145, 148, 159, STR_EDIT_THEMES_BUTTON, STR_NONE }, // Themes button + { WWT_GROUPBOX, 1, 5, 304, 133, 179, STR_THEMES_GROUP, STR_NONE }, // Toolbar buttons group + { WWT_DROPDOWN, 1, 155, 299, 147, 158, STR_NONE, STR_NONE }, // Themes + { WWT_DROPDOWN_BUTTON, 1, 288, 298, 148, 157, STR_DROPDOWN_GLYPH, STR_NONE }, + { WWT_DROPDOWN_BUTTON, 1, 10, 145, 163, 174, STR_EDIT_THEMES_BUTTON, STR_NONE }, // Themes button - { WWT_GROUPBOX, 1, 5, 304, 168, 230, STR_TOOLBAR_BUTTONS_GROUP, STR_NONE }, // Toolbar buttons group - { WWT_CHECKBOX, 2, 10, 145, 199, 210, STR_FINANCES_BUTTON_ON_TOOLBAR, STR_NONE }, // Finances - { WWT_CHECKBOX, 2, 10, 145, 214, 225, STR_RESEARCH_BUTTON_ON_TOOLBAR, STR_NONE }, // Research - { WWT_CHECKBOX, 2, 155, 299, 199, 210, STR_CHEATS_BUTTON_ON_TOOLBAR, STR_NONE }, // Cheats - { WWT_CHECKBOX, 2, 155, 299, 214, 225, STR_SHOW_RECENT_MESSAGES_ON_TOOLBAR, STR_NONE }, // Recent messages + { WWT_GROUPBOX, 1, 5, 304, 183, 245, STR_TOOLBAR_BUTTONS_GROUP, STR_NONE }, // Toolbar buttons group + { WWT_CHECKBOX, 2, 10, 145, 214, 225, STR_FINANCES_BUTTON_ON_TOOLBAR, STR_NONE }, // Finances + { WWT_CHECKBOX, 2, 10, 145, 229, 240, STR_RESEARCH_BUTTON_ON_TOOLBAR, STR_NONE }, // Research + { WWT_CHECKBOX, 2, 155, 299, 214, 225, STR_CHEATS_BUTTON_ON_TOOLBAR, STR_NONE }, // Cheats + { WWT_CHECKBOX, 2, 155, 299, 229, 240, STR_SHOW_RECENT_MESSAGES_ON_TOOLBAR, STR_NONE }, // Recent messages - { WWT_CHECKBOX, 2, 10, 299, 239, 250, STR_SELECT_BY_TRACK_TYPE, STR_SELECT_BY_TRACK_TYPE_TIP }, // Select by track type + { WWT_CHECKBOX, 2, 10, 299, 254, 265, STR_SELECT_BY_TRACK_TYPE, STR_SELECT_BY_TRACK_TYPE_TIP }, // Select by track type { WIDGETS_END }, }; @@ -404,6 +406,7 @@ static uint32 window_options_page_enabled_widgets[] = { MAIN_OPTIONS_ENABLED_WIDGETS | (1 << WIDX_SCREEN_EDGE_SCROLLING) | + (1 << WIDX_TRAP_CURSOR) | (1 << WIDX_INVERT_DRAG) | (1 << WIDX_HOTKEY_DROPDOWN) | (1 << WIDX_TOOLBAR_SHOW_FINANCES) | @@ -590,6 +593,12 @@ static void window_options_mouseup(rct_window *w, int widgetIndex) config_save_default(); window_invalidate(w); break; + case WIDX_TRAP_CURSOR: + gConfigGeneral.trap_cursor ^= 1; + config_save_default(); + SDL_SetWindowGrab(gWindow, gConfigGeneral.trap_cursor ? SDL_TRUE : SDL_FALSE); + window_invalidate(w); + break; case WIDX_TOOLBAR_SHOW_FINANCES: gConfigInterface.toolbar_show_finances ^= 1; config_save_default(); @@ -1285,6 +1294,7 @@ static void window_options_invalidate(rct_window *w) case WINDOW_OPTIONS_PAGE_CONTROLS_AND_INTERFACE: widget_set_checkbox_value(w, WIDX_SCREEN_EDGE_SCROLLING, gConfigGeneral.edge_scrolling); + widget_set_checkbox_value(w, WIDX_TRAP_CURSOR, gConfigGeneral.trap_cursor); widget_set_checkbox_value(w, WIDX_INVERT_DRAG, gConfigGeneral.invert_viewport_drag); widget_set_checkbox_value(w, WIDX_TOOLBAR_SHOW_FINANCES, gConfigInterface.toolbar_show_finances); widget_set_checkbox_value(w, WIDX_TOOLBAR_SHOW_RESEARCH, gConfigInterface.toolbar_show_research); @@ -1296,6 +1306,7 @@ static void window_options_invalidate(rct_window *w) window_options_controls_and_interface_widgets[WIDX_THEMES_DROPDOWN].type = WWT_DROPDOWN_BUTTON; window_options_controls_and_interface_widgets[WIDX_THEMES_BUTTON].type = WWT_DROPDOWN_BUTTON; window_options_controls_and_interface_widgets[WIDX_SCREEN_EDGE_SCROLLING].type = WWT_CHECKBOX; + window_options_controls_and_interface_widgets[WIDX_TRAP_CURSOR].type = WWT_CHECKBOX; window_options_controls_and_interface_widgets[WIDX_HOTKEY_DROPDOWN].type = WWT_DROPDOWN_BUTTON; window_options_controls_and_interface_widgets[WIDX_TOOLBAR_SHOW_FINANCES].type = WWT_CHECKBOX; window_options_controls_and_interface_widgets[WIDX_TOOLBAR_SHOW_RESEARCH].type = WWT_CHECKBOX;