Skip to content

Commit b131d34

Browse files
committed
Improve state manaagement in tap-hold
1 parent bba9f28 commit b131d34

File tree

2 files changed

+14
-11
lines changed

2 files changed

+14
-11
lines changed

src/picker/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ impl ObjectImpl for PickerInner {
7474

7575
let tap_hold = cascade! {
7676
tap_hold::TapHold::new();
77-
..connect_selected(clone!(@weak picker => move |keycode| {
77+
..connect_select(clone!(@weak picker => move |keycode| {
7878
picker.set_keycode(keycode);
7979
}));
8080
};

src/picker/tap_hold.rs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ impl ObjectImpl for TapHoldInner {
5656
fn signals() -> &'static [Signal] {
5757
static SIGNALS: Lazy<Vec<Signal>> = Lazy::new(|| {
5858
vec![Signal::builder(
59-
"selected",
59+
"select",
6060
&[Keycode::static_type().into()],
6161
glib::Type::UNIT.into(),
6262
)
@@ -177,18 +177,17 @@ impl TapHold {
177177
match self.inner().hold.get() {
178178
Hold::Mods(mods) => {
179179
if !mods.is_empty() {
180-
self.emit_by_name::<()>("selected", &[&Keycode::MT(mods, keycode.to_string())]);
180+
self.emit_by_name::<()>("select", &[&Keycode::MT(mods, keycode.to_string())]);
181181
}
182182
}
183183
Hold::Layer(layer) => {
184-
self.emit_by_name::<()>("selected", &[&Keycode::LT(layer, keycode.to_string())]);
184+
self.emit_by_name::<()>("select", &[&Keycode::LT(layer, keycode.to_string())]);
185185
}
186186
}
187187
}
188188

189-
// XXX naming vs set_selected
190-
pub fn connect_selected<F: Fn(Keycode) + 'static>(&self, cb: F) -> glib::SignalHandlerId {
191-
self.connect_local("selected", false, move |values| {
189+
pub fn connect_select<F: Fn(Keycode) + 'static>(&self, cb: F) -> glib::SignalHandlerId {
190+
self.connect_local("select", false, move |values| {
192191
cb(values[1].get::<Keycode>().unwrap());
193192
None
194193
})
@@ -206,10 +205,7 @@ impl TapHold {
206205
Default::default()
207206
};
208207

209-
// TODO how to deal with internal state?
210-
211208
for i in self.inner().mod_buttons.iter() {
212-
// XXX left vs right
213209
let mod_ = Mods::from_mod_str(i.name()).unwrap();
214210
i.set_selected(
215211
mods.contains(mod_) && (mods.contains(Mods::RIGHT) == mod_.contains(Mods::RIGHT)),
@@ -220,14 +216,21 @@ impl TapHold {
220216
i.set_selected(Some(n as u8) == layer);
221217
}
222218

223-
if let Some(keycode) = keycode {
219+
if let Some(keycode) = keycode.clone() {
224220
self.inner()
225221
.picker_group_box
226222
.set_selected(vec![Keycode::Basic(Mods::empty(), keycode)]);
227223
} else {
228224
self.inner().picker_group_box.set_selected(Vec::new());
229225
}
230226

227+
self.inner().hold.set(if let Some(layer) = layer {
228+
Hold::Layer(layer)
229+
} else {
230+
Hold::Mods(mods)
231+
});
232+
*self.inner().keycode.borrow_mut() = keycode;
233+
231234
self.invalidate_sensitivity();
232235
}
233236

0 commit comments

Comments
 (0)