Skip to content

Commit

Permalink
directvt#86 WIP: Fix pro::keybd
Browse files Browse the repository at this point in the history
  • Loading branch information
o-sdn-o committed Dec 17, 2024
1 parent cdf163d commit 4399e0e
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 62 deletions.
43 changes: 22 additions & 21 deletions src/netxs/apps/tile.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,6 @@ namespace netxs::app::tile
: ui::fork::ctor(axis::Y, grip_width == -1 ? 1 : grip_width, slot1, slot2);
node->isroot(faux, base::node) // Set object kind to 1 to be different from others. See node_veer::select.
->template plugin<pro::focus>()
->template plugin<pro::keybd>()
->limits(dot_00)
->invoke([&](auto& boss)
{
Expand Down Expand Up @@ -328,27 +327,27 @@ namespace netxs::app::tile
boss.set_grip_width(grip_width + step);
}
};
auto& keybd = boss.template plugins<pro::keybd>();
keybd.proc(action::TileMoveGrip , [&](hids& gear, txts& args){ gear.set_handled(); boss.base::riseup(tier::preview, app::tile::events::ui::grips::move, { args.size() ? xml::take_or<twod>(args.front(), dot_00) : dot_00 }); });
keybd.proc(action::TileResizeGrip, [&](hids& gear, txts& args){ gear.set_handled(); boss.base::riseup(tier::preview, app::tile::events::ui::grips::resize, { args.size() ? xml::take_or<si32>(args.front(), 0) : 0 }); });
keybd.bind(*grip_bindings_ptr);
});
auto grip = node->attach(slot::_I,
ui::mock::ctor()
->isroot(true)
->template plugin<pro::mover>() //todo GCC 11 requires template keyword
->template plugin<pro::focus>(pro::focus::mode::focusable)
->shader(c3, e2::form::state::focus::count)
->template plugin<pro::shade<cell::shaders::xlight>>()
->invoke([&](auto& boss)
{
boss.LISTEN(tier::release, hids::events::mouse::button::click::right, gear)
{
boss.base::riseup(tier::release, e2::form::size::minimize, gear);
gear.dismiss();
};
})
->active());
auto grip = node->attach(slot::_I, ui::mock::ctor())
->isroot(true)
->active()
->template plugin<pro::mover>() //todo GCC 11 requires template keyword
->template plugin<pro::focus>(pro::focus::mode::focusable)
->template plugin<pro::keybd>()
->shader(c3, e2::form::state::focus::count)
->template plugin<pro::shade<cell::shaders::xlight>>()
->invoke([&](auto& boss)
{
boss.LISTEN(tier::release, hids::events::mouse::button::click::right, gear)
{
boss.base::riseup(tier::release, e2::form::size::minimize, gear);
gear.dismiss();
};
auto& keybd = boss.template plugins<pro::keybd>();
keybd.proc(action::TileMoveGrip , [&](hids& gear, txts& args){ gear.set_handled(); boss.base::riseup(tier::preview, app::tile::events::ui::grips::move, { args.size() ? xml::take_or<twod>(args.front(), dot_00) : dot_00 }); });
keybd.proc(action::TileResizeGrip, [&](hids& gear, txts& args){ gear.set_handled(); boss.base::riseup(tier::preview, app::tile::events::ui::grips::resize, { args.size() ? xml::take_or<si32>(args.front(), 0) : 0 }); });
keybd.bind(*grip_bindings_ptr);
});
return node;
};
auto empty_slot = []
Expand All @@ -370,6 +369,7 @@ namespace netxs::app::tile
{
boss.LISTEN(tier::release, hids::events::mouse::button::click::left, gear)
{
pro::focus::set(boss.This(), gear.id, solo::on);
boss.base::riseup(tier::request, e2::form::proceed::createby, gear);
gear.dismiss(true);
};
Expand Down Expand Up @@ -424,6 +424,7 @@ namespace netxs::app::tile
mouse_subs(boss);
boss.LISTEN(tier::release, hids::events::mouse::button::click::right, gear)
{
pro::focus::set(boss.This(), gear.id, solo::on);
boss.base::riseup(tier::request, e2::form::proceed::createby, gear);
gear.dismiss(true);
};
Expand Down
74 changes: 33 additions & 41 deletions src/netxs/desktopio/controls.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2048,7 +2048,6 @@ namespace netxs::ui

std::unordered_map<text, std::pair<std::list<std::pair<wptr, netxs::sptr<txts>>>, bool>, qiew::hash, qiew::equal> handlers;
std::unordered_map<text, sptr, qiew::hash, qiew::equal> api_map;
subs tokens;
bool interrupt_key_proc;
std::unordered_map<id_t, time> last_key;
si64 instance_id;
Expand Down Expand Up @@ -2129,48 +2128,40 @@ namespace netxs::ui
interrupt_key_proc{ faux },
instance_id{ datetime::now().time_since_epoch().count() }
{

boss.LISTEN(tier::anycast, e2::form::upon::started, root, memo)
boss.LISTEN(tier::general, hids::events::die, gear, memo)
{
last_key.erase(gear.id);
};
boss.LISTEN(tier::release, hids::events::keybd::key::any, gear, memo)
{
tokens.clear();
if (auto focusable_parent_ptr = boss.base::riseup(tier::request, e2::config::plugins::focus::owner))
gear.shared_event = gear.touched && gear.touched != instance_id;
auto& timecod = last_key[gear.id];
if (gear.timecod > timecod)
{
focusable_parent_ptr->LISTEN(tier::release, hids::events::die, gear, tokens)
timecod = gear.timecod;
if (gear.payload == input::keybd::type::keypress)
{
last_key.erase(gear.id);
};
focusable_parent_ptr->LISTEN(tier::release, hids::events::keybd::key::any, gear, tokens)
{
gear.shared_event = gear.touched && gear.touched != instance_id;
auto& timecod = last_key[gear.id];
if (gear.timecod > timecod)
{
timecod = gear.timecod;
if (gear.payload == input::keybd::type::keypress)
{
interrupt_key_proc = faux;
if (!gear.handled) _dispatch(gear, faux, input::key::kmap::any_key);
if (!gear.handled) _dispatch(gear, faux, gear.vkchord);
if (!gear.handled) _dispatch(gear, faux, gear.chchord);
if (!gear.handled) _dispatch(gear, faux, gear.scchord);
}
}
else
{
gear.set_handled();
}
};
focusable_parent_ptr->LISTEN(tier::preview, hids::events::keybd::key::any, gear, tokens)
{
gear.shared_event = gear.touched && gear.touched != instance_id;
if (gear.payload == input::keybd::type::keypress)
{
if (!gear.touched && !gear.handled) _dispatch(gear, true, gear.vkchord);
if (!gear.touched && !gear.handled) _dispatch(gear, true, gear.chchord);
if (!gear.touched && !gear.handled) _dispatch(gear, true, gear.scchord);
if (!gear.touched && !gear.handled) _dispatch(gear, true, input::key::kmap::any_key);
}
};
interrupt_key_proc = faux;
if (!gear.handled) _dispatch(gear, faux, input::key::kmap::any_key);
if (!gear.handled) _dispatch(gear, faux, gear.vkchord);
if (!gear.handled) _dispatch(gear, faux, gear.chchord);
if (!gear.handled) _dispatch(gear, faux, gear.scchord);
}
}
else
{
gear.set_handled();
}
};
boss.LISTEN(tier::preview, hids::events::keybd::key::any, gear, memo)
{
gear.shared_event = gear.touched && gear.touched != instance_id;
if (gear.payload == input::keybd::type::keypress)
{
if (!gear.touched && !gear.handled) _dispatch(gear, true, gear.vkchord);
if (!gear.touched && !gear.handled) _dispatch(gear, true, gear.chchord);
if (!gear.touched && !gear.handled) _dispatch(gear, true, gear.scchord);
if (!gear.touched && !gear.handled) _dispatch(gear, true, input::key::kmap::any_key);
}
};
proc("Noop", [&](hids& gear, txts&){ gear.set_handled(); interrupt_key_proc = true; });
Expand All @@ -2188,7 +2179,8 @@ namespace netxs::ui
}
void proc(qiew name, func proc)
{
api_map[name] = ptr::shared(std::move(proc));
//api_map[name] = ptr::shared(std::move(proc));
api_map[name] = ptr::shared(proc);
}
auto bind(qiew chord_str, auto&& proc_names, bool preview = faux)
{
Expand Down

0 comments on commit 4399e0e

Please sign in to comment.