widelands-dev team mailing list archive
-
widelands-dev team
-
Mailing list archive
-
Message #17880
[Merge] lp:~widelands-dev/widelands/arrow-keys-map-movement into lp:widelands
GunChleoc has proposed merging lp:~widelands-dev/widelands/arrow-keys-map-movement into lp:widelands.
Commit message:
Fixes for keyboard map movement
- Stop minimized windows from handling key presses.
- Handle map movement by key at the proper place.
Requested reviews:
Widelands Developers (widelands-dev)
Related bugs:
Bug #1772076 in widelands: "Minimized chat window still handles some keys"
https://bugs.launchpad.net/widelands/+bug/1772076
For more details, see:
https://code.launchpad.net/~widelands-dev/widelands/arrow-keys-map-movement/+merge/370687
--
Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/arrow-keys-map-movement into lp:widelands.
=== modified file 'src/ui_basic/panel.cc'
--- src/ui_basic/panel.cc 2019-06-01 08:18:58 +0000
+++ src/ui_basic/panel.cc 2019-07-27 11:28:41 +0000
@@ -57,7 +57,7 @@
last_child_(nullptr),
mousein_child_(nullptr),
focus_(nullptr),
- flags_(pf_handle_mouse | pf_thinks | pf_visible),
+ flags_(pf_handle_mouse | pf_thinks | pf_visible | pf_handle_keypresses),
x_(nx),
y_(ny),
w_(nw),
@@ -912,6 +912,10 @@
return true;
}
+ if (!handles_keypresses()) {
+ return false;
+ }
+
// If we handle text, it does not matter if we handled this key
// or not, it should not propagate.
if (handle_key(down, code) || handles_textinput()) {
=== modified file 'src/ui_basic/panel.h'
--- src/ui_basic/panel.h 2019-06-01 08:18:58 +0000
+++ src/ui_basic/panel.h 2019-07-27 11:28:41 +0000
@@ -79,6 +79,8 @@
pf_layout_toplevel = 512,
/// whether widget wants to receive unicode textinput messages
pf_handle_textinput = 1024,
+ /// whether widget and its parents will handle any key presses
+ pf_handle_keypresses = 2048,
};
Panel(Panel* const nparent,
@@ -303,6 +305,15 @@
flags_ |= pf_handle_textinput;
}
+ // This panel will never receive keypresses (do_key) or textinput (do_textinput).
+ void set_handle_keypresses(bool const on) {
+ if (on) {
+ flags_ |= pf_handle_keypresses;
+ } else {
+ flags_ &= ~pf_handle_keypresses;
+ }
+ }
+
// Defines if think() should be called repeatedly. This is true on construction.
void set_thinks(bool yes);
@@ -325,6 +336,14 @@
bool handles_mouse() const {
return (flags_ & pf_handle_mouse) != 0;
}
+
+ bool handles_keypresses() const {
+ if (get_parent() != nullptr && !get_parent()->handles_keypresses()) {
+ return false;
+ }
+ return (flags_ & pf_handle_keypresses) != 0;
+ }
+
bool handles_textinput() const {
return (flags_ & pf_handle_textinput) != 0;
}
=== modified file 'src/ui_basic/window.cc'
--- src/ui_basic/window.cc 2019-05-26 17:21:15 +0000
+++ src/ui_basic/window.cc 2019-07-27 11:28:41 +0000
@@ -431,6 +431,7 @@
set_inner_size(get_inner_w(), oldh_);
update_desired_size();
move_inside_parent();
+ set_handle_keypresses(true);
}
void Window::minimize() {
assert(!is_minimal_);
@@ -446,6 +447,7 @@
set_border(get_lborder(), get_rborder(), get_tborder(), 0);
set_size(get_w(), TP_B_PIXMAP_THICKNESS);
set_pos(Vector2i(x, y)); // If on border, this feels more natural
+ set_handle_keypresses(false);
}
/**
=== modified file 'src/wui/interactive_base.cc'
--- src/wui/interactive_base.cc 2019-05-29 15:43:40 +0000
+++ src/wui/interactive_base.cc 2019-07-27 11:28:41 +0000
@@ -510,27 +510,6 @@
===============
*/
void InteractiveBase::think() {
- // If one of the arrow keys is pressed, scroll here
- const uint32_t scrollval = 10;
-
- if (keyboard_free() && Panel::allow_user_input()) {
- if (get_key_state(SDL_SCANCODE_UP) ||
- (get_key_state(SDL_SCANCODE_KP_8) && (SDL_GetModState() ^ KMOD_NUM))) {
- map_view_.pan_by(Vector2i(0, -scrollval));
- }
- if (get_key_state(SDL_SCANCODE_DOWN) ||
- (get_key_state(SDL_SCANCODE_KP_2) && (SDL_GetModState() ^ KMOD_NUM))) {
- map_view_.pan_by(Vector2i(0, scrollval));
- }
- if (get_key_state(SDL_SCANCODE_LEFT) ||
- (get_key_state(SDL_SCANCODE_KP_4) && (SDL_GetModState() ^ KMOD_NUM))) {
- map_view_.pan_by(Vector2i(-scrollval, 0));
- }
- if (get_key_state(SDL_SCANCODE_RIGHT) ||
- (get_key_state(SDL_SCANCODE_KP_6) && (SDL_GetModState() ^ KMOD_NUM))) {
- map_view_.pan_by(Vector2i(scrollval, 0));
- }
- }
egbase().think(); // Call game logic here. The game advances.
// Cleanup found port spaces if the ship sailed on or was destroyed
@@ -1011,8 +990,12 @@
}
bool InteractiveBase::handle_key(bool const down, SDL_Keysym const code) {
- if (quick_navigation_.handle_key(down, code))
+ if (quick_navigation_.handle_key(down, code)) {
return true;
+ }
+
+ // If one of the arrow keys is pressed, scroll here
+ constexpr uint32_t kScrollDistance = 10;
if (down) {
switch (code.sym) {
@@ -1050,6 +1033,40 @@
}
}
return true;
+ // Scroll the map
+ case SDLK_KP_8:
+ if (SDL_GetModState() & KMOD_NUM) {
+ break;
+ }
+ FALLS_THROUGH;
+ case SDLK_UP:
+ map_view_.pan_by(Vector2i(0, -kScrollDistance));
+ return true;
+ case SDLK_KP_2:
+ if (SDL_GetModState() & KMOD_NUM) {
+ break;
+ }
+ FALLS_THROUGH;
+ case SDLK_DOWN:
+ map_view_.pan_by(Vector2i(0, kScrollDistance));
+ return true;
+ case SDLK_KP_4:
+ if (SDL_GetModState() & KMOD_NUM) {
+ break;
+ }
+ FALLS_THROUGH;
+ case SDLK_LEFT:
+ map_view_.pan_by(Vector2i(-kScrollDistance, 0));
+ return true;
+ case SDLK_KP_6:
+ if (SDL_GetModState() & KMOD_NUM) {
+ break;
+ }
+ FALLS_THROUGH;
+ case SDLK_RIGHT:
+ map_view_.pan_by(Vector2i(kScrollDistance, 0));
+ return true;
+
#ifndef NDEBUG // only in debug builds
case SDLK_F6:
GameChatMenu::create_script_console(
Follow ups