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);
});
};