Repository navigation
feat(plugins): add Keymoji offline emoji keyboard - #206
eduardoaugustolb wants to merge 12 commits into
Conversation
neur0map
left a comment
There was a problem hiding this comment.
🔍 mika reviewed this change; details in the walkthrough comment.
🧹 Nitpicks (5) — optional, not blocking
-
plugins/keymoji/app/i18n/Locale.mjs:3-7— Bug — The desktop language is documented as acceptingAuto, butnormalize("auto")returnsautoas a supported locale. Treat it as unset soresolvefalls through to the process locale instead of selecting a nonexistent…Suggested change
export function normalize(value) {
const name=String(value||'').trim().toLowerCase().replace(/_/g,'-').split(/[.@]/)[0];
if(name==='c'||name==='posix')return 'en';
const base=name.split('-')[0];return languages.indexOf(base)>0?base:null;
}
-
plugins/keymoji/app/Search.mjs:39-44— Performance — Every query splits the searchable text and can run fuzzy matching against every word in all 3,944 entries on the QML thread. Short queries with few matches can therefore block keyboard interaction repeatedly after each d… -
plugins/keymoji/app/shell.qml:151-160— Possible Bug — Ifwtypecannot start, for example because it is missing,onExitedis not sufficient to clearbusyand report the failure. The keyboard can then remain stuck in its inserting state. Handle process start errors and… -
plugins/keymoji/app/Search.mjs:41-45— Suggestion: bug — Match emoji within longer sequencesSuggested change
if(r.e.includes(query.trim()))score+=80;
else if(words.indexOf(t)>=0) score+=80;
else if(words.some(w=>w.indexOf(t)===0))score+=40;
else if(r.search.indexOf(t)>=0)score+=15;
else if(words.some(w=>near(t,w)))score+=5;
else return null;
-
plugins/keymoji/app/i18n/Locale.mjs:3-7— Suggestion: bug — Treat auto as an unset localeSuggested change
export function normalize(value) {
const name=String(value||'').trim().toLowerCase().replace(/_/g,'-').split(/[.@]/)[0];
if(name==='c'||name==='posix')return 'en';
const base=name.split('-')[0];return languages.indexOf(base)>0?base:null;
}
🦊 mika's reviewIncremental review: new commits since the last checkpoint. Summary
Estimated review effort: 2/5 · risk: high 📁 Walkthrough details
|
|
I've reviewed 5 pushes on this PR automatically, so I'll stop doing full passes here and only check whether open threads get fixed. Add the |
|
Addressed the remaining security concern in the latest walkthrough:
The original review's Auto-locale items (duplicates), repeated search tokenization/fuzzy work, process-start failure handling, and matching emoji within longer sequences are also addressed. There are no GitHub review threads to mark resolved; these findings were posted in review/walkthrough summaries. Validation: 29 Bun tests passed, catalogue validation passed, and the local plugin validator has no blocking findings after reviewing the two existing read-only shell.json references. Evidence and remaining interoperability limits are in @ryoku-mika review |
Keymoji 0.4.0
Adds a community QS Bar emoji keyboard with offline search across 3,944 Emoji 17.0 sequences in Portuguese, English, Spanish and French. Includes localized CLDR dictionaries, Unicode attribution, Tabler icons and their licences, a Qt-rendered preview, and a catalogue entry.
The menu supports insertion into the original target, copy-only selection, and choosing the last-used emoji without copying or typing. Its header identifies the active mode. Search receives focus on opening; arrows, paging, Home/End and Enter navigate/select. Dismissal immediately releases input and unmaps the surface; compositor animations own opening/closing. Theme, language and internal motion follow Ryoku settings, including reduced-motion and low-power preferences.
A resident windowless service pastes the latest recent emoji and serializes a bounded repeat queue. It uses wl-copy and the fixed, manifest-declared keymoji-paste command. The bundled portable implementation sends Ctrl+V with wtype; a desktop integration may provide the same declared command through normal PATH resolution. No environment variable selects an executable path, and no compositor-specific IPC is included in the plugin. Desktop shortcuts are configured locally by the contributor; the plugin installs none automatically.
Runtime requires Quickshell, wtype, wl-copy and the declared shell utilities. Bun is development-only. State writes are confined to the plugin state directory. Palette/language references to shell.json are read-only and documented for static-screen review. No network access, privileged commands, automatic keybind edits or security-policy changes are added.
Validation
plugins/keymoji/docs/validation.md.Maintained by Eduardo Augusto; this is community content, not an official Ryoku product. Ongoing maintenance remains the contributor's responsibility.