diff --git a/metadata/hide-cursor.xml b/metadata/hide-cursor.xml index 8c61fcb..b27f7de 100644 --- a/metadata/hide-cursor.xml +++ b/metadata/hide-cursor.xml @@ -15,5 +15,10 @@ 2000 250 + diff --git a/metadata/keycolor.xml b/metadata/keycolor.xml index d667cc2..0577c94 100644 --- a/metadata/keycolor.xml +++ b/metadata/keycolor.xml @@ -1,19 +1,24 @@ - <_short>Keycolor - Effects - - - + <_short>Keycolor + Effects + + + + diff --git a/src/hide-cursor.cpp b/src/hide-cursor.cpp index c7ffd94..daf8526 100644 --- a/src/hide-cursor.cpp +++ b/src/hide-cursor.cpp @@ -21,6 +21,7 @@ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#include #include #include #include @@ -30,53 +31,101 @@ namespace wf_hide_cursor { + bool hidden; class wayfire_hide_cursor { wf::option_wrapper_t hide_delay{"hide-cursor/hide_delay"}; + wf::view_matcher_t disabled_for{"hide-cursor/disabled_for"}; wf::wl_timer hide_timer; + void restart_hide_timer() + { + hide_timer.disconnect(); + hide_timer.set_timeout(hide_delay, [=] () + { + hide_or_show_cursor(); + }); + } + + void hide_or_show_cursor() + { + auto view = wf::get_core().get_cursor_focus_view(); + + if (view && disabled_for.matches(view)) + { + show_cursor(); + } else + { + hide_cursor(); + } + } + public: - wayfire_hide_cursor() + void hide_cursor() { + hide_timer.disconnect(); + + if (hidden) + return; + + wf::get_core().hide_cursor(); + hidden = true; + } + + void show_cursor() + { + hide_timer.disconnect(); + + if (!hidden) + return; + + wf::get_core().unhide_cursor(); hidden = false; - setup_hide_timer(); - wf::get_core().connect(&pointer_motion); } - wf::signal::connection_t> pointer_motion = - [=] (wf::input_event_signal *ev) + void toggle_cursor() { - setup_hide_timer(); if (hidden) { - wf::get_core().unhide_cursor(); - hidden = false; + show_cursor(); + } else + { + hide_cursor(); } - }; + } - void setup_hide_timer() + wayfire_hide_cursor() { - hide_timer.disconnect(); - hide_timer.set_timeout(hide_delay, [=] () + hidden = false; + restart_hide_timer(); + + wf::get_core().connect(&pointer_motion); + } + + void on_event() + { + if (hidden) { - if (!hidden) - { - wf::get_core().hide_cursor(); - hidden = true; - } - }); + show_cursor(); + } + + restart_hide_timer(); } + wf::signal::connection_t> pointer_motion = + [=] (wf::input_event_signal *ev) + { + on_event(); + }; + ~wayfire_hide_cursor() { pointer_motion.disconnect(); hide_timer.disconnect(); - if (hidden) - { - wf::get_core().unhide_cursor(); - } + + show_cursor(); } }; @@ -86,32 +135,33 @@ class wayfire_hide_cursor_plugin : public wf::per_output_plugin_instance_t wf::activator_callback toggle_cb = [=] (auto) { - hidden = !hidden; - - if (hidden) - { - wf::get_core().hide_cursor(); - } else - { - wf::get_core().unhide_cursor(); - } - + global_idle->toggle_cursor(); return true; }; + wf::signal::connection_t workspace_changed = + [=] (wf::workspace_changed_signal *ev) + { + global_idle->on_event(); + }; + public: void init() override { output->add_activator( wf::option_wrapper_t{"hide-cursor/toggle"}, &toggle_cb); + + output->connect(&workspace_changed); } void fini() override { output->rem_binding(&toggle_cb); + workspace_changed.disconnect(); } }; DECLARE_WAYFIRE_PLUGIN(wf::per_output_plugin_t); + } diff --git a/src/keycolor.cpp b/src/keycolor.cpp index 277c4a0..c15bcf5 100644 --- a/src/keycolor.cpp +++ b/src/keycolor.cpp @@ -30,6 +30,7 @@ #include #include #include +#include static const char *vertex_shader = @@ -243,6 +244,14 @@ class wayfire_keycolor : public wf::plugin_interface_t const std::string transformer_name = "keycolor"; std::map> transformers; + wf::view_matcher_t enabled_for{"keycolor/enabled_for"}; + wf::option_wrapper_t enabled_for_option{"keycolor/enabled_for"}; + + bool should_enable_for(wayfire_view view) + { + return enabled_for.matches(view); + } + void add_transformer(wayfire_view view) { if (view->get_transformed_node()->get_transformer(transformer_name)) @@ -263,6 +272,23 @@ class wayfire_keycolor : public wf::plugin_interface_t } } + void update_view(wayfire_view view) + { + if (view->role == wf::VIEW_ROLE_DESKTOP_ENVIRONMENT) + { + pop_transformer(view); + return; + } + + if (should_enable_for(view)) + { + add_transformer(view); + } else + { + pop_transformer(view); + } + } + void remove_transformers() { for (auto& view : wf::get_core().get_all_views()) @@ -295,16 +321,19 @@ class wayfire_keycolor : public wf::plugin_interface_t program_ref_count++; - wf::get_core().connect(&on_view_map); - - for (auto& view : wf::get_core().get_all_views()) + enabled_for_option.set_callback([=] () { - if (view->role == wf::VIEW_ROLE_DESKTOP_ENVIRONMENT) + for (auto& view : wf::get_core().get_all_views()) { - continue; + update_view(view); } + }); - add_transformer(view); + wf::get_core().connect(&on_view_map); + + for (auto& view : wf::get_core().get_all_views()) + { + update_view(view); } } @@ -316,17 +345,9 @@ class wayfire_keycolor : public wf::plugin_interface_t return; } - if (view->role == wf::VIEW_ROLE_DESKTOP_ENVIRONMENT) - { - return; - } - idle_attach.run_once([=] () { - if (!view->get_transformed_node()->get_transformer(transformer_name)) - { - add_transformer(view); - } + update_view(view); }); };