Quellcode durchsuchen

LibGUI: Remove bitrotted automatic keybinds feature

This feature hasn't been working at all for several months, so let's
just remove it and simplify GWindow event handling.
Andreas Kling vor 5 Jahren
Ursprung
Commit
23e16a3e2e

+ 0 - 1
Libraries/LibGUI/GAbstractButton.h

@@ -30,7 +30,6 @@ public:
 
     virtual void click() = 0;
     virtual bool accepts_focus() const override { return true; }
-    virtual bool supports_keyboard_activation() const override { return true; }
     virtual bool is_uncheckable() const { return true; }
 
     int auto_repeat_interval() const { return m_auto_repeat_interval; }

+ 0 - 5
Libraries/LibGUI/GButton.cpp

@@ -72,11 +72,6 @@ void GButton::click()
         m_action->activate(this);
 }
 
-bool GButton::supports_keyboard_activation() const
-{
-    return is_enabled();
-}
-
 void GButton::set_action(GAction& action)
 {
     m_action = action.make_weak_ptr();

+ 0 - 1
Libraries/LibGUI/GButton.h

@@ -31,7 +31,6 @@ public:
     void set_action(GAction&);
 
     virtual bool accepts_focus() const override { return m_focusable; }
-    virtual bool supports_keyboard_activation() const override;
     virtual bool is_uncheckable() const override;
 
     void set_focusable(bool b) { m_focusable = b; }

+ 0 - 1
Libraries/LibGUI/GWidget.h

@@ -121,7 +121,6 @@ public:
     void update(const Rect&);
 
     virtual bool accepts_focus() const { return false; }
-    virtual bool supports_keyboard_activation() const { return false; }
 
     bool is_focused() const;
     void set_focus(bool);

+ 4 - 116
Libraries/LibGUI/GWindow.cpp

@@ -1,7 +1,6 @@
 #include <AK/HashMap.h>
 #include <AK/JsonObject.h>
 #include <AK/NeverDestroyed.h>
-#include <AK/StringBuilder.h>
 #include <LibC/SharedBuffer.h>
 #include <LibC/stdio.h>
 #include <LibC/stdlib.h>
@@ -230,8 +229,6 @@ void GWindow::event(CEvent& event)
         for (auto& rect : rects)
             m_main_widget->dispatch_event(*make<GPaintEvent>(rect), this);
 
-        paint_keybinds();
-
         if (m_double_buffering_enabled)
             flip(rects);
         else if (created_new_backing_store)
@@ -247,53 +244,14 @@ void GWindow::event(CEvent& event)
     }
 
     if (event.type() == GEvent::KeyUp || event.type() == GEvent::KeyDown) {
-        auto keyevent = static_cast<GKeyEvent&>(event);
-        if (keyevent.logo() && event.type() == GEvent::KeyUp) {
-            if (m_keybind_mode) {
-                m_keybind_mode = false;
-            } else {
-                m_keybind_mode = true;
-                collect_keyboard_activation_targets();
-                m_entered_keybind = "";
-            }
-            update();
-            return;
-        }
-
-        if (m_keybind_mode) {
-            if (event.type() == GEvent::KeyUp) {
-                StringBuilder builder;
-                builder.append(m_entered_keybind);
-                builder.append(keyevent.text());
-                m_entered_keybind = builder.to_string();
-
-                auto found_widget = m_keyboard_activation_targets.find(m_entered_keybind);
-                if (found_widget != m_keyboard_activation_targets.end()) {
-                    m_keybind_mode = false;
-                    auto event = make<GMouseEvent>(GEvent::MouseDown, Point(), 0, GMouseButton::Left, 0, 0);
-                    found_widget->value->dispatch_event(*event, this);
-                    event = make<GMouseEvent>(GEvent::MouseUp, Point(), 0, GMouseButton::Left, 0, 0);
-                    found_widget->value->dispatch_event(*event, this);
-                } else if (m_entered_keybind.length() >= m_max_keybind_length) {
-                    m_keybind_mode = false;
-                }
-                update();
-            }
-        } else {
-            if (m_focused_widget)
-                return m_focused_widget->dispatch_event(event, this);
-            if (m_main_widget)
-                return m_main_widget->dispatch_event(event, this);
-        }
+        if (m_focused_widget)
+            return m_focused_widget->dispatch_event(event, this);
+        if (m_main_widget)
+            return m_main_widget->dispatch_event(event, this);
         return;
     }
 
     if (event.type() == GEvent::WindowBecameActive || event.type() == GEvent::WindowBecameInactive) {
-        if (event.type() == GEvent::WindowBecameInactive && m_keybind_mode) {
-            m_keybind_mode = false;
-            update();
-        }
-
         m_is_active = event.type() == GEvent::WindowBecameActive;
         if (m_main_widget)
             m_main_widget->dispatch_event(event, this);
@@ -335,76 +293,6 @@ void GWindow::event(CEvent& event)
     CObject::event(event);
 }
 
-void GWindow::paint_keybinds()
-{
-    if (!m_keybind_mode)
-        return;
-    GPainter painter(*m_main_widget);
-
-    for (auto& keypair : m_keyboard_activation_targets) {
-        if (!keypair.value)
-            continue;
-        auto& widget = *keypair.value;
-        bool could_be_keybind = true;
-        for (size_t i = 0; i < m_entered_keybind.length(); ++i) {
-            if (keypair.key.characters()[i] != m_entered_keybind.characters()[i]) {
-                could_be_keybind = false;
-                break;
-            }
-        }
-
-        if (could_be_keybind) {
-            Rect rect { widget.x() - 5, widget.y() - 5, 4 + Font::default_font().width(keypair.key), 16 };
-            Rect highlight_rect { widget.x() - 3, widget.y() - 5, 0, 16 };
-
-            painter.fill_rect(rect, Color::WarmGray);
-            painter.draw_rect(rect, Color::Black);
-            painter.draw_text(rect, keypair.key.characters(), TextAlignment::Center, Color::Black);
-            painter.draw_text(highlight_rect, m_entered_keybind.characters(), TextAlignment::CenterLeft, Color::MidGray);
-        }
-    }
-}
-
-static void collect_keyboard_activation_targets_impl(GWidget& widget, Vector<GWidget*>& targets)
-{
-    widget.for_each_child_widget([&](auto& child) {
-        if (child.supports_keyboard_activation()) {
-            targets.append(&child);
-            collect_keyboard_activation_targets_impl(child, targets);
-        }
-        return IterationDecision::Continue;
-    });
-}
-
-void GWindow::collect_keyboard_activation_targets()
-{
-    m_keyboard_activation_targets.clear();
-    if (!m_main_widget)
-        return;
-
-    Vector<GWidget*> targets;
-    collect_keyboard_activation_targets_impl(*m_main_widget, targets);
-
-    m_max_keybind_length = ceil_div(targets.size(), ('z' - 'a'));
-    size_t buffer_length = m_max_keybind_length + 1;
-    char keybind_buffer[buffer_length];
-    for (size_t i = 0; i < buffer_length - 1; ++i)
-        keybind_buffer[i] = 'a';
-    keybind_buffer[buffer_length - 1] = '\0';
-
-    for (auto& widget : targets) {
-        m_keyboard_activation_targets.set(String(keybind_buffer), widget->make_weak_ptr());
-        for (size_t i = 0; i < buffer_length - 1; ++i) {
-            if (keybind_buffer[i] >= 'z') {
-                keybind_buffer[i] = 'a';
-            } else {
-                ++keybind_buffer[i];
-                break;
-            }
-        }
-    }
-}
-
 bool GWindow::is_visible() const
 {
     return m_window_id != 0;

+ 0 - 8
Libraries/LibGUI/GWindow.h

@@ -145,10 +145,6 @@ protected:
 private:
     virtual bool is_window() const override final { return true; }
 
-    void paint_keybinds();
-
-    void collect_keyboard_activation_targets();
-
     NonnullRefPtr<GraphicsBitmap> create_backing_bitmap(const Size&);
     NonnullRefPtr<GraphicsBitmap> create_shared_bitmap(GraphicsBitmap::Format, const Size&);
     void set_current_backing_bitmap(GraphicsBitmap&, bool flush_immediately = false);
@@ -178,9 +174,5 @@ private:
     bool m_resizable { true };
     bool m_fullscreen { false };
     bool m_show_titlebar { true };
-    bool m_keybind_mode { false };
-    String m_entered_keybind;
-    size_t m_max_keybind_length { 0 };
-    HashMap<String, WeakPtr<GWidget>> m_keyboard_activation_targets;
     bool m_layout_pending { false };
 };