Better kobo support - #238

Draft
pcouy wants to merge 9 commits into
rmkit-dev:masterfrom
pcouy:master
Draft

Better kobo support#238
pcouy wants to merge 9 commits into
rmkit-dev:masterfrom
pcouy:master

Conversation

@pcouy

@pcouypcouy commented May 5, 2026

Copy link
Copy Markdown

This branch contains a few tweaks I implemented after trying rmkit (more specifically remux) on my Elipsa 2E. The commits can be grouped into a few categories :

  • Build related changes : upgrade a docker image and add a missing CROSS_TC env var to a build script
  • Deal with some stability issues (remux going to stable 90% CPU use and not showing on gesture) by :
    1. Letting me manually restart remux by killing any previously running instance in the wrapper script
    2. Fixing an exception storm when using remux's API to show/hide it
  • Improve app switching by :
    1. Changing the interface of perform_redraw(...) to have an optional second boolean parameter to control screen flashing with FBInk, and using it when showing/hiding remux. This fixed ghosting for me
    2. Preventing nickel from grabbing inputs by grabbing them first, which let other apps detect rotation and power button presses on my Kobo Elipsa 2E (with this, I can have nickel and koreader running side by side, both working well with the remux flow)

This is a lot of different things, but I tried to make each commit as atomic as possible, and wrote detailed commit messages when the commit changed more than a couple of lines. I hope this helps with the review.

If needed, I can make a separate branch with only the commits you want to merge.

pcouy added 9 commits May 5, 2026 11:53
- Add kobo/ output dir to .gitignore
- Fix `make remux_docker` and other similar targets for kobo => Build
is a lot faster than rebuilding everything everytime
Updated the kobo wrapper script. Before this, I would sometimes have 2
remux instances running at the same time when testing, which caused
weird issues. This is kind of a dirty hack that was quicker than finding
the root cause
Before this, when sending commands through the API, stdout would fill
with exceptions with the call eventually working. After a few calls,
remux would crash.
Changed the locking logic in `TaskQueue`, mainly by repurposing `task_m`
(which I could not find the purpose of, or anywhere in the code that
acquired this lock) to prevent having more than 1 task thread running at
a time.
Updated method signatures for all backends, only implemented it for
FBInk
Done by grabbing the inputs on first launch and releasing them only
after the nickel process is running.
Context :
I added a modified version of koreader.sh to my remux, which does not
kill nickel before launching koreader. The goal is to seamlessly switch
between nickel and koreader, and to use bluetooth on y Elipsa 2E without
fearing a wipe on my /mnt/onboard if I accidentaly restart nickel
instead of rebooting the e-reader. This introduced an issue where koreader
would not handle rotations or the power button because nickel grabs
these devices and never releases them.
WARNING :
I have only tested this on my Kobo Elipsa 2E (Condor), this may break
on other devices. Not sure why input grabbing was disabled by the
preprocessor for Kobo target, but disabling it did not break anything on
Condor.
I also needed to add the `gpio` device to inputs, which emits orientation
change events on my Condor. The `EV_MSC` + `MSC_RAW` filter might match
other input devices on other e-readers. I think this would be harmless
anyway, but is worth checking before merging
After commit 2fd7055 most apps would not build for the kobo target.
Example build output below :
```
$ TARGET=kobo DOCKERFILE=Dockerfile.kobo FBINK=1 make harmony_docker
CXX=arm-kobo-linux-gnueabihf-g++ okp -sh -ig "RMKIT_IMPLEMENTATION" -ns -ni -for -d ../.rmkit.h_cpp/ -o ../build/rmkit.h rmkit.cpy ../build/stb.arm.o -- -D"KOBO=1" -D"RMKIT_IMPLEMENTATION" -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -D"RMKIT_FBINK=1" -O2 -static -static-libstdc++ -static-libgcc
compile flags: -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -O2 -static -static-libstdc++ -static-libgcc
missing file: ../shared/proc.h
missing file: ../shared/string.h
generating single header /rmkit/src/rmkit/../build/rmkit.h
MISSING FILE! /rmkit/src/.rmkit.h_cpp/shared/proc.h
MISSING FILE! /rmkit/src/.rmkit.h_cpp/shared/string.h
compiled into /rmkit/src/.rmkit.h_cpp
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/string.h
make[2]: Leaving directory '/rmkit/src/rmkit'
make[1]: Leaving directory '/rmkit/src/rmkit'
cd src/harmony && make
make[1]: Entering directory '/rmkit/src/harmony'
make compile_kobo
make[2]: Entering directory '/rmkit/src/harmony'
make[3]: Entering directory '/rmkit/src/vendor/FBInk'
make[3]: Nothing to be done for 'staticlib'.
make[3]: Leaving directory '/rmkit/src/vendor/FBInk'
CXX=arm-kobo-linux-gnueabihf-g++ okp -ig "RMKIT_IMPLEMENTATION" -ns -ni -for -d ../.harmony_cpp/ -o ../build/harmony main.cpy ../build/stb.arm.o -- -D"KOBO=1" -D"RMKIT_IMPLEMENTATION" -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -D"RMKIT_FBINK=1" -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
compile flags: -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
arm-kobo-linux-gnueabihf-g++ -c /rmkit/src/.harmony_cpp/main.cpp -o /rmkit/src/.harmony_cpp/main.o -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
In file included from /rmkit/src/.harmony_cpp/main.cpp:3:
/rmkit/src/.harmony_cpp/../build/rmkit.h: In lambda function:
/rmkit/src/.harmony_cpp/../build/rmkit.h:22492:22: error: 'proc' has not been declared
22492 | auto procs = proc::list_procs(bins);
| ^~~~
missing file: stb_image.h
missing file: stb_image_resize.h
Couldn't compile /rmkit/src/.harmony_cpp/main.cpp aborting
compiled into /rmkit/src/.harmony_cpp
make[2]: *** [../actions.make:42: compile_kobo] Error 1
make[2]: Leaving directory '/rmkit/src/harmony'
make[1]: Leaving directory '/rmkit/src/harmony'
make[1]: *** [../actions.make:11: compile] Error 2
make: *** [Makefile:18: harmony] Error 2
```
@pcouy
pcouy marked this pull request as draft May 13, 2026 14:31
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pcouy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Better kobo support - #238

Draft
pcouy wants to merge 9 commits into
rmkit-dev:masterfrom
pcouy:master
Draft

Better kobo support#238
pcouy wants to merge 9 commits into
rmkit-dev:masterfrom
pcouy:master

Conversation

@pcouy

@pcouypcouy commented May 5, 2026

Copy link
Copy Markdown

This branch contains a few tweaks I implemented after trying rmkit (more specifically remux) on my Elipsa 2E. The commits can be grouped into a few categories :

  • Build related changes : upgrade a docker image and add a missing CROSS_TC env var to a build script
  • Deal with some stability issues (remux going to stable 90% CPU use and not showing on gesture) by :
    1. Letting me manually restart remux by killing any previously running instance in the wrapper script
    2. Fixing an exception storm when using remux's API to show/hide it
  • Improve app switching by :
    1. Changing the interface of perform_redraw(...) to have an optional second boolean parameter to control screen flashing with FBInk, and using it when showing/hiding remux. This fixed ghosting for me
    2. Preventing nickel from grabbing inputs by grabbing them first, which let other apps detect rotation and power button presses on my Kobo Elipsa 2E (with this, I can have nickel and koreader running side by side, both working well with the remux flow)

This is a lot of different things, but I tried to make each commit as atomic as possible, and wrote detailed commit messages when the commit changed more than a couple of lines. I hope this helps with the review.

If needed, I can make a separate branch with only the commits you want to merge.

pcouy added 9 commits May 5, 2026 11:53
- Add kobo/ output dir to .gitignore
- Fix `make remux_docker` and other similar targets for kobo => Build
is a lot faster than rebuilding everything everytime
Updated the kobo wrapper script. Before this, I would sometimes have 2
remux instances running at the same time when testing, which caused
weird issues. This is kind of a dirty hack that was quicker than finding
the root cause
Before this, when sending commands through the API, stdout would fill
with exceptions with the call eventually working. After a few calls,
remux would crash.
Changed the locking logic in `TaskQueue`, mainly by repurposing `task_m`
(which I could not find the purpose of, or anywhere in the code that
acquired this lock) to prevent having more than 1 task thread running at
a time.
Updated method signatures for all backends, only implemented it for
FBInk
Done by grabbing the inputs on first launch and releasing them only
after the nickel process is running.
Context :
I added a modified version of koreader.sh to my remux, which does not
kill nickel before launching koreader. The goal is to seamlessly switch
between nickel and koreader, and to use bluetooth on y Elipsa 2E without
fearing a wipe on my /mnt/onboard if I accidentaly restart nickel
instead of rebooting the e-reader. This introduced an issue where koreader
would not handle rotations or the power button because nickel grabs
these devices and never releases them.
WARNING :
I have only tested this on my Kobo Elipsa 2E (Condor), this may break
on other devices. Not sure why input grabbing was disabled by the
preprocessor for Kobo target, but disabling it did not break anything on
Condor.
I also needed to add the `gpio` device to inputs, which emits orientation
change events on my Condor. The `EV_MSC` + `MSC_RAW` filter might match
other input devices on other e-readers. I think this would be harmless
anyway, but is worth checking before merging
After commit 2fd7055 most apps would not build for the kobo target.
Example build output below :
```
$ TARGET=kobo DOCKERFILE=Dockerfile.kobo FBINK=1 make harmony_docker
CXX=arm-kobo-linux-gnueabihf-g++ okp -sh -ig "RMKIT_IMPLEMENTATION" -ns -ni -for -d ../.rmkit.h_cpp/ -o ../build/rmkit.h rmkit.cpy ../build/stb.arm.o -- -D"KOBO=1" -D"RMKIT_IMPLEMENTATION" -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -D"RMKIT_FBINK=1" -O2 -static -static-libstdc++ -static-libgcc
compile flags: -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -O2 -static -static-libstdc++ -static-libgcc
missing file: ../shared/proc.h
missing file: ../shared/string.h
generating single header /rmkit/src/rmkit/../build/rmkit.h
MISSING FILE! /rmkit/src/.rmkit.h_cpp/shared/proc.h
MISSING FILE! /rmkit/src/.rmkit.h_cpp/shared/string.h
compiled into /rmkit/src/.rmkit.h_cpp
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/string.h
make[2]: Leaving directory '/rmkit/src/rmkit'
make[1]: Leaving directory '/rmkit/src/rmkit'
cd src/harmony && make
make[1]: Entering directory '/rmkit/src/harmony'
make compile_kobo
make[2]: Entering directory '/rmkit/src/harmony'
make[3]: Entering directory '/rmkit/src/vendor/FBInk'
make[3]: Nothing to be done for 'staticlib'.
make[3]: Leaving directory '/rmkit/src/vendor/FBInk'
CXX=arm-kobo-linux-gnueabihf-g++ okp -ig "RMKIT_IMPLEMENTATION" -ns -ni -for -d ../.harmony_cpp/ -o ../build/harmony main.cpy ../build/stb.arm.o -- -D"KOBO=1" -D"RMKIT_IMPLEMENTATION" -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -D"RMKIT_FBINK=1" -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
compile flags: -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
arm-kobo-linux-gnueabihf-g++ -c /rmkit/src/.harmony_cpp/main.cpp -o /rmkit/src/.harmony_cpp/main.o -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
In file included from /rmkit/src/.harmony_cpp/main.cpp:3:
/rmkit/src/.harmony_cpp/../build/rmkit.h: In lambda function:
/rmkit/src/.harmony_cpp/../build/rmkit.h:22492:22: error: 'proc' has not been declared
22492 | auto procs = proc::list_procs(bins);
| ^~~~
missing file: stb_image.h
missing file: stb_image_resize.h
Couldn't compile /rmkit/src/.harmony_cpp/main.cpp aborting
compiled into /rmkit/src/.harmony_cpp
make[2]: *** [../actions.make:42: compile_kobo] Error 1
make[2]: Leaving directory '/rmkit/src/harmony'
make[1]: Leaving directory '/rmkit/src/harmony'
make[1]: *** [../actions.make:11: compile] Error 2
make: *** [Makefile:18: harmony] Error 2
```
@pcouy
pcouy marked this pull request as draft May 13, 2026 14:31
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pcouy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Better kobo support - #238

Draft
pcouy wants to merge 9 commits into
rmkit-dev:masterfrom
pcouy:master
Draft

Better kobo support#238
pcouy wants to merge 9 commits into
rmkit-dev:masterfrom
pcouy:master

Conversation

@pcouy

@pcouypcouy commented May 5, 2026

Copy link
Copy Markdown

This branch contains a few tweaks I implemented after trying rmkit (more specifically remux) on my Elipsa 2E. The commits can be grouped into a few categories :

  • Build related changes : upgrade a docker image and add a missing CROSS_TC env var to a build script
  • Deal with some stability issues (remux going to stable 90% CPU use and not showing on gesture) by :
    1. Letting me manually restart remux by killing any previously running instance in the wrapper script
    2. Fixing an exception storm when using remux's API to show/hide it
  • Improve app switching by :
    1. Changing the interface of perform_redraw(...) to have an optional second boolean parameter to control screen flashing with FBInk, and using it when showing/hiding remux. This fixed ghosting for me
    2. Preventing nickel from grabbing inputs by grabbing them first, which let other apps detect rotation and power button presses on my Kobo Elipsa 2E (with this, I can have nickel and koreader running side by side, both working well with the remux flow)

This is a lot of different things, but I tried to make each commit as atomic as possible, and wrote detailed commit messages when the commit changed more than a couple of lines. I hope this helps with the review.

If needed, I can make a separate branch with only the commits you want to merge.

pcouy added 9 commits May 5, 2026 11:53
- Add kobo/ output dir to .gitignore
- Fix `make remux_docker` and other similar targets for kobo => Build
is a lot faster than rebuilding everything everytime
Updated the kobo wrapper script. Before this, I would sometimes have 2
remux instances running at the same time when testing, which caused
weird issues. This is kind of a dirty hack that was quicker than finding
the root cause
Before this, when sending commands through the API, stdout would fill
with exceptions with the call eventually working. After a few calls,
remux would crash.
Changed the locking logic in `TaskQueue`, mainly by repurposing `task_m`
(which I could not find the purpose of, or anywhere in the code that
acquired this lock) to prevent having more than 1 task thread running at
a time.
Updated method signatures for all backends, only implemented it for
FBInk
Done by grabbing the inputs on first launch and releasing them only
after the nickel process is running.
Context :
I added a modified version of koreader.sh to my remux, which does not
kill nickel before launching koreader. The goal is to seamlessly switch
between nickel and koreader, and to use bluetooth on y Elipsa 2E without
fearing a wipe on my /mnt/onboard if I accidentaly restart nickel
instead of rebooting the e-reader. This introduced an issue where koreader
would not handle rotations or the power button because nickel grabs
these devices and never releases them.
WARNING :
I have only tested this on my Kobo Elipsa 2E (Condor), this may break
on other devices. Not sure why input grabbing was disabled by the
preprocessor for Kobo target, but disabling it did not break anything on
Condor.
I also needed to add the `gpio` device to inputs, which emits orientation
change events on my Condor. The `EV_MSC` + `MSC_RAW` filter might match
other input devices on other e-readers. I think this would be harmless
anyway, but is worth checking before merging
After commit 2fd7055 most apps would not build for the kobo target.
Example build output below :
```
$ TARGET=kobo DOCKERFILE=Dockerfile.kobo FBINK=1 make harmony_docker
CXX=arm-kobo-linux-gnueabihf-g++ okp -sh -ig "RMKIT_IMPLEMENTATION" -ns -ni -for -d ../.rmkit.h_cpp/ -o ../build/rmkit.h rmkit.cpy ../build/stb.arm.o -- -D"KOBO=1" -D"RMKIT_IMPLEMENTATION" -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -D"RMKIT_FBINK=1" -O2 -static -static-libstdc++ -static-libgcc
compile flags: -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -O2 -static -static-libstdc++ -static-libgcc
missing file: ../shared/proc.h
missing file: ../shared/string.h
generating single header /rmkit/src/rmkit/../build/rmkit.h
MISSING FILE! /rmkit/src/.rmkit.h_cpp/shared/proc.h
MISSING FILE! /rmkit/src/.rmkit.h_cpp/shared/string.h
compiled into /rmkit/src/.rmkit.h_cpp
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/string.h
make[2]: Leaving directory '/rmkit/src/rmkit'
make[1]: Leaving directory '/rmkit/src/rmkit'
cd src/harmony && make
make[1]: Entering directory '/rmkit/src/harmony'
make compile_kobo
make[2]: Entering directory '/rmkit/src/harmony'
make[3]: Entering directory '/rmkit/src/vendor/FBInk'
make[3]: Nothing to be done for 'staticlib'.
make[3]: Leaving directory '/rmkit/src/vendor/FBInk'
CXX=arm-kobo-linux-gnueabihf-g++ okp -ig "RMKIT_IMPLEMENTATION" -ns -ni -for -d ../.harmony_cpp/ -o ../build/harmony main.cpy ../build/stb.arm.o -- -D"KOBO=1" -D"RMKIT_IMPLEMENTATION" -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -D"RMKIT_FBINK=1" -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
compile flags: -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
arm-kobo-linux-gnueabihf-g++ -c /rmkit/src/.harmony_cpp/main.cpp -o /rmkit/src/.harmony_cpp/main.o -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
In file included from /rmkit/src/.harmony_cpp/main.cpp:3:
/rmkit/src/.harmony_cpp/../build/rmkit.h: In lambda function:
/rmkit/src/.harmony_cpp/../build/rmkit.h:22492:22: error: 'proc' has not been declared
22492 | auto procs = proc::list_procs(bins);
| ^~~~
missing file: stb_image.h
missing file: stb_image_resize.h
Couldn't compile /rmkit/src/.harmony_cpp/main.cpp aborting
compiled into /rmkit/src/.harmony_cpp
make[2]: *** [../actions.make:42: compile_kobo] Error 1
make[2]: Leaving directory '/rmkit/src/harmony'
make[1]: Leaving directory '/rmkit/src/harmony'
make[1]: *** [../actions.make:11: compile] Error 2
make: *** [Makefile:18: harmony] Error 2
```
@pcouy
pcouy marked this pull request as draft May 13, 2026 14:31
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pcouy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Better kobo support - #238

Draft
pcouy wants to merge 9 commits into
rmkit-dev:masterfrom
pcouy:master
Draft

Better kobo support#238
pcouy wants to merge 9 commits into
rmkit-dev:masterfrom
pcouy:master

Conversation

@pcouy

@pcouypcouy commented May 5, 2026

Copy link
Copy Markdown

This branch contains a few tweaks I implemented after trying rmkit (more specifically remux) on my Elipsa 2E. The commits can be grouped into a few categories :

  • Build related changes : upgrade a docker image and add a missing CROSS_TC env var to a build script
  • Deal with some stability issues (remux going to stable 90% CPU use and not showing on gesture) by :
    1. Letting me manually restart remux by killing any previously running instance in the wrapper script
    2. Fixing an exception storm when using remux's API to show/hide it
  • Improve app switching by :
    1. Changing the interface of perform_redraw(...) to have an optional second boolean parameter to control screen flashing with FBInk, and using it when showing/hiding remux. This fixed ghosting for me
    2. Preventing nickel from grabbing inputs by grabbing them first, which let other apps detect rotation and power button presses on my Kobo Elipsa 2E (with this, I can have nickel and koreader running side by side, both working well with the remux flow)

This is a lot of different things, but I tried to make each commit as atomic as possible, and wrote detailed commit messages when the commit changed more than a couple of lines. I hope this helps with the review.

If needed, I can make a separate branch with only the commits you want to merge.

pcouy added 9 commits May 5, 2026 11:53
- Add kobo/ output dir to .gitignore
- Fix `make remux_docker` and other similar targets for kobo => Build
is a lot faster than rebuilding everything everytime
Updated the kobo wrapper script. Before this, I would sometimes have 2
remux instances running at the same time when testing, which caused
weird issues. This is kind of a dirty hack that was quicker than finding
the root cause
Before this, when sending commands through the API, stdout would fill
with exceptions with the call eventually working. After a few calls,
remux would crash.
Changed the locking logic in `TaskQueue`, mainly by repurposing `task_m`
(which I could not find the purpose of, or anywhere in the code that
acquired this lock) to prevent having more than 1 task thread running at
a time.
Updated method signatures for all backends, only implemented it for
FBInk
Done by grabbing the inputs on first launch and releasing them only
after the nickel process is running.
Context :
I added a modified version of koreader.sh to my remux, which does not
kill nickel before launching koreader. The goal is to seamlessly switch
between nickel and koreader, and to use bluetooth on y Elipsa 2E without
fearing a wipe on my /mnt/onboard if I accidentaly restart nickel
instead of rebooting the e-reader. This introduced an issue where koreader
would not handle rotations or the power button because nickel grabs
these devices and never releases them.
WARNING :
I have only tested this on my Kobo Elipsa 2E (Condor), this may break
on other devices. Not sure why input grabbing was disabled by the
preprocessor for Kobo target, but disabling it did not break anything on
Condor.
I also needed to add the `gpio` device to inputs, which emits orientation
change events on my Condor. The `EV_MSC` + `MSC_RAW` filter might match
other input devices on other e-readers. I think this would be harmless
anyway, but is worth checking before merging
After commit 2fd7055 most apps would not build for the kobo target.
Example build output below :
```
$ TARGET=kobo DOCKERFILE=Dockerfile.kobo FBINK=1 make harmony_docker
CXX=arm-kobo-linux-gnueabihf-g++ okp -sh -ig "RMKIT_IMPLEMENTATION" -ns -ni -for -d ../.rmkit.h_cpp/ -o ../build/rmkit.h rmkit.cpy ../build/stb.arm.o -- -D"KOBO=1" -D"RMKIT_IMPLEMENTATION" -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -D"RMKIT_FBINK=1" -O2 -static -static-libstdc++ -static-libgcc
compile flags: -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -O2 -static -static-libstdc++ -static-libgcc
missing file: ../shared/proc.h
missing file: ../shared/string.h
generating single header /rmkit/src/rmkit/../build/rmkit.h
MISSING FILE! /rmkit/src/.rmkit.h_cpp/shared/proc.h
MISSING FILE! /rmkit/src/.rmkit.h_cpp/shared/string.h
compiled into /rmkit/src/.rmkit.h_cpp
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/string.h
make[2]: Leaving directory '/rmkit/src/rmkit'
make[1]: Leaving directory '/rmkit/src/rmkit'
cd src/harmony && make
make[1]: Entering directory '/rmkit/src/harmony'
make compile_kobo
make[2]: Entering directory '/rmkit/src/harmony'
make[3]: Entering directory '/rmkit/src/vendor/FBInk'
make[3]: Nothing to be done for 'staticlib'.
make[3]: Leaving directory '/rmkit/src/vendor/FBInk'
CXX=arm-kobo-linux-gnueabihf-g++ okp -ig "RMKIT_IMPLEMENTATION" -ns -ni -for -d ../.harmony_cpp/ -o ../build/harmony main.cpy ../build/stb.arm.o -- -D"KOBO=1" -D"RMKIT_IMPLEMENTATION" -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -D"RMKIT_FBINK=1" -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
compile flags: -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
arm-kobo-linux-gnueabihf-g++ -c /rmkit/src/.harmony_cpp/main.cpp -o /rmkit/src/.harmony_cpp/main.o -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
In file included from /rmkit/src/.harmony_cpp/main.cpp:3:
/rmkit/src/.harmony_cpp/../build/rmkit.h: In lambda function:
/rmkit/src/.harmony_cpp/../build/rmkit.h:22492:22: error: 'proc' has not been declared
22492 | auto procs = proc::list_procs(bins);
| ^~~~
missing file: stb_image.h
missing file: stb_image_resize.h
Couldn't compile /rmkit/src/.harmony_cpp/main.cpp aborting
compiled into /rmkit/src/.harmony_cpp
make[2]: *** [../actions.make:42: compile_kobo] Error 1
make[2]: Leaving directory '/rmkit/src/harmony'
make[1]: Leaving directory '/rmkit/src/harmony'
make[1]: *** [../actions.make:11: compile] Error 2
make: *** [Makefile:18: harmony] Error 2
```
@pcouy
pcouy marked this pull request as draft May 13, 2026 14:31
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pcouy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Better kobo support - #238

Draft
pcouy wants to merge 9 commits into
rmkit-dev:masterfrom
pcouy:master
Draft

Better kobo support#238
pcouy wants to merge 9 commits into
rmkit-dev:masterfrom
pcouy:master

Conversation

@pcouy

@pcouypcouy commented May 5, 2026

Copy link
Copy Markdown

This branch contains a few tweaks I implemented after trying rmkit (more specifically remux) on my Elipsa 2E. The commits can be grouped into a few categories :

  • Build related changes : upgrade a docker image and add a missing CROSS_TC env var to a build script
  • Deal with some stability issues (remux going to stable 90% CPU use and not showing on gesture) by :
    1. Letting me manually restart remux by killing any previously running instance in the wrapper script
    2. Fixing an exception storm when using remux's API to show/hide it
  • Improve app switching by :
    1. Changing the interface of perform_redraw(...) to have an optional second boolean parameter to control screen flashing with FBInk, and using it when showing/hiding remux. This fixed ghosting for me
    2. Preventing nickel from grabbing inputs by grabbing them first, which let other apps detect rotation and power button presses on my Kobo Elipsa 2E (with this, I can have nickel and koreader running side by side, both working well with the remux flow)

This is a lot of different things, but I tried to make each commit as atomic as possible, and wrote detailed commit messages when the commit changed more than a couple of lines. I hope this helps with the review.

If needed, I can make a separate branch with only the commits you want to merge.

pcouy added 9 commits May 5, 2026 11:53
- Add kobo/ output dir to .gitignore
- Fix `make remux_docker` and other similar targets for kobo => Build
is a lot faster than rebuilding everything everytime
Updated the kobo wrapper script. Before this, I would sometimes have 2
remux instances running at the same time when testing, which caused
weird issues. This is kind of a dirty hack that was quicker than finding
the root cause
Before this, when sending commands through the API, stdout would fill
with exceptions with the call eventually working. After a few calls,
remux would crash.
Changed the locking logic in `TaskQueue`, mainly by repurposing `task_m`
(which I could not find the purpose of, or anywhere in the code that
acquired this lock) to prevent having more than 1 task thread running at
a time.
Updated method signatures for all backends, only implemented it for
FBInk
Done by grabbing the inputs on first launch and releasing them only
after the nickel process is running.
Context :
I added a modified version of koreader.sh to my remux, which does not
kill nickel before launching koreader. The goal is to seamlessly switch
between nickel and koreader, and to use bluetooth on y Elipsa 2E without
fearing a wipe on my /mnt/onboard if I accidentaly restart nickel
instead of rebooting the e-reader. This introduced an issue where koreader
would not handle rotations or the power button because nickel grabs
these devices and never releases them.
WARNING :
I have only tested this on my Kobo Elipsa 2E (Condor), this may break
on other devices. Not sure why input grabbing was disabled by the
preprocessor for Kobo target, but disabling it did not break anything on
Condor.
I also needed to add the `gpio` device to inputs, which emits orientation
change events on my Condor. The `EV_MSC` + `MSC_RAW` filter might match
other input devices on other e-readers. I think this would be harmless
anyway, but is worth checking before merging
After commit 2fd7055 most apps would not build for the kobo target.
Example build output below :
```
$ TARGET=kobo DOCKERFILE=Dockerfile.kobo FBINK=1 make harmony_docker
CXX=arm-kobo-linux-gnueabihf-g++ okp -sh -ig "RMKIT_IMPLEMENTATION" -ns -ni -for -d ../.rmkit.h_cpp/ -o ../build/rmkit.h rmkit.cpy ../build/stb.arm.o -- -D"KOBO=1" -D"RMKIT_IMPLEMENTATION" -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -D"RMKIT_FBINK=1" -O2 -static -static-libstdc++ -static-libgcc
compile flags: -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -O2 -static -static-libstdc++ -static-libgcc
missing file: ../shared/proc.h
missing file: ../shared/string.h
generating single header /rmkit/src/rmkit/../build/rmkit.h
MISSING FILE! /rmkit/src/.rmkit.h_cpp/shared/proc.h
MISSING FILE! /rmkit/src/.rmkit.h_cpp/shared/string.h
compiled into /rmkit/src/.rmkit.h_cpp
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/string.h
make[2]: Leaving directory '/rmkit/src/rmkit'
make[1]: Leaving directory '/rmkit/src/rmkit'
cd src/harmony && make
make[1]: Entering directory '/rmkit/src/harmony'
make compile_kobo
make[2]: Entering directory '/rmkit/src/harmony'
make[3]: Entering directory '/rmkit/src/vendor/FBInk'
make[3]: Nothing to be done for 'staticlib'.
make[3]: Leaving directory '/rmkit/src/vendor/FBInk'
CXX=arm-kobo-linux-gnueabihf-g++ okp -ig "RMKIT_IMPLEMENTATION" -ns -ni -for -d ../.harmony_cpp/ -o ../build/harmony main.cpy ../build/stb.arm.o -- -D"KOBO=1" -D"RMKIT_IMPLEMENTATION" -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -D"RMKIT_FBINK=1" -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
compile flags: -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
arm-kobo-linux-gnueabihf-g++ -c /rmkit/src/.harmony_cpp/main.cpp -o /rmkit/src/.harmony_cpp/main.o -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
In file included from /rmkit/src/.harmony_cpp/main.cpp:3:
/rmkit/src/.harmony_cpp/../build/rmkit.h: In lambda function:
/rmkit/src/.harmony_cpp/../build/rmkit.h:22492:22: error: 'proc' has not been declared
22492 | auto procs = proc::list_procs(bins);
| ^~~~
missing file: stb_image.h
missing file: stb_image_resize.h
Couldn't compile /rmkit/src/.harmony_cpp/main.cpp aborting
compiled into /rmkit/src/.harmony_cpp
make[2]: *** [../actions.make:42: compile_kobo] Error 1
make[2]: Leaving directory '/rmkit/src/harmony'
make[1]: Leaving directory '/rmkit/src/harmony'
make[1]: *** [../actions.make:11: compile] Error 2
make: *** [Makefile:18: harmony] Error 2
```
@pcouy
pcouy marked this pull request as draft May 13, 2026 14:31
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pcouy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Better kobo support - #238

Draft
pcouy wants to merge 9 commits into
rmkit-dev:masterfrom
pcouy:master
Draft

Better kobo support#238
pcouy wants to merge 9 commits into
rmkit-dev:masterfrom
pcouy:master

Conversation

@pcouy

@pcouypcouy commented May 5, 2026

Copy link
Copy Markdown

This branch contains a few tweaks I implemented after trying rmkit (more specifically remux) on my Elipsa 2E. The commits can be grouped into a few categories :

  • Build related changes : upgrade a docker image and add a missing CROSS_TC env var to a build script
  • Deal with some stability issues (remux going to stable 90% CPU use and not showing on gesture) by :
    1. Letting me manually restart remux by killing any previously running instance in the wrapper script
    2. Fixing an exception storm when using remux's API to show/hide it
  • Improve app switching by :
    1. Changing the interface of perform_redraw(...) to have an optional second boolean parameter to control screen flashing with FBInk, and using it when showing/hiding remux. This fixed ghosting for me
    2. Preventing nickel from grabbing inputs by grabbing them first, which let other apps detect rotation and power button presses on my Kobo Elipsa 2E (with this, I can have nickel and koreader running side by side, both working well with the remux flow)

This is a lot of different things, but I tried to make each commit as atomic as possible, and wrote detailed commit messages when the commit changed more than a couple of lines. I hope this helps with the review.

If needed, I can make a separate branch with only the commits you want to merge.

pcouy added 9 commits May 5, 2026 11:53
- Add kobo/ output dir to .gitignore
- Fix `make remux_docker` and other similar targets for kobo => Build
is a lot faster than rebuilding everything everytime
Updated the kobo wrapper script. Before this, I would sometimes have 2
remux instances running at the same time when testing, which caused
weird issues. This is kind of a dirty hack that was quicker than finding
the root cause
Before this, when sending commands through the API, stdout would fill
with exceptions with the call eventually working. After a few calls,
remux would crash.
Changed the locking logic in `TaskQueue`, mainly by repurposing `task_m`
(which I could not find the purpose of, or anywhere in the code that
acquired this lock) to prevent having more than 1 task thread running at
a time.
Updated method signatures for all backends, only implemented it for
FBInk
Done by grabbing the inputs on first launch and releasing them only
after the nickel process is running.
Context :
I added a modified version of koreader.sh to my remux, which does not
kill nickel before launching koreader. The goal is to seamlessly switch
between nickel and koreader, and to use bluetooth on y Elipsa 2E without
fearing a wipe on my /mnt/onboard if I accidentaly restart nickel
instead of rebooting the e-reader. This introduced an issue where koreader
would not handle rotations or the power button because nickel grabs
these devices and never releases them.
WARNING :
I have only tested this on my Kobo Elipsa 2E (Condor), this may break
on other devices. Not sure why input grabbing was disabled by the
preprocessor for Kobo target, but disabling it did not break anything on
Condor.
I also needed to add the `gpio` device to inputs, which emits orientation
change events on my Condor. The `EV_MSC` + `MSC_RAW` filter might match
other input devices on other e-readers. I think this would be harmless
anyway, but is worth checking before merging
After commit 2fd7055 most apps would not build for the kobo target.
Example build output below :
```
$ TARGET=kobo DOCKERFILE=Dockerfile.kobo FBINK=1 make harmony_docker
CXX=arm-kobo-linux-gnueabihf-g++ okp -sh -ig "RMKIT_IMPLEMENTATION" -ns -ni -for -d ../.rmkit.h_cpp/ -o ../build/rmkit.h rmkit.cpy ../build/stb.arm.o -- -D"KOBO=1" -D"RMKIT_IMPLEMENTATION" -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -D"RMKIT_FBINK=1" -O2 -static -static-libstdc++ -static-libgcc
compile flags: -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -O2 -static -static-libstdc++ -static-libgcc
missing file: ../shared/proc.h
missing file: ../shared/string.h
generating single header /rmkit/src/rmkit/../build/rmkit.h
MISSING FILE! /rmkit/src/.rmkit.h_cpp/shared/proc.h
MISSING FILE! /rmkit/src/.rmkit.h_cpp/shared/string.h
compiled into /rmkit/src/.rmkit.h_cpp
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/string.h
make[2]: Leaving directory '/rmkit/src/rmkit'
make[1]: Leaving directory '/rmkit/src/rmkit'
cd src/harmony && make
make[1]: Entering directory '/rmkit/src/harmony'
make compile_kobo
make[2]: Entering directory '/rmkit/src/harmony'
make[3]: Entering directory '/rmkit/src/vendor/FBInk'
make[3]: Nothing to be done for 'staticlib'.
make[3]: Leaving directory '/rmkit/src/vendor/FBInk'
CXX=arm-kobo-linux-gnueabihf-g++ okp -ig "RMKIT_IMPLEMENTATION" -ns -ni -for -d ../.harmony_cpp/ -o ../build/harmony main.cpy ../build/stb.arm.o -- -D"KOBO=1" -D"RMKIT_IMPLEMENTATION" -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -D"RMKIT_FBINK=1" -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
compile flags: -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
arm-kobo-linux-gnueabihf-g++ -c /rmkit/src/.harmony_cpp/main.cpp -o /rmkit/src/.harmony_cpp/main.o -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
In file included from /rmkit/src/.harmony_cpp/main.cpp:3:
/rmkit/src/.harmony_cpp/../build/rmkit.h: In lambda function:
/rmkit/src/.harmony_cpp/../build/rmkit.h:22492:22: error: 'proc' has not been declared
22492 | auto procs = proc::list_procs(bins);
| ^~~~
missing file: stb_image.h
missing file: stb_image_resize.h
Couldn't compile /rmkit/src/.harmony_cpp/main.cpp aborting
compiled into /rmkit/src/.harmony_cpp
make[2]: *** [../actions.make:42: compile_kobo] Error 1
make[2]: Leaving directory '/rmkit/src/harmony'
make[1]: Leaving directory '/rmkit/src/harmony'
make[1]: *** [../actions.make:11: compile] Error 2
make: *** [Makefile:18: harmony] Error 2
```
@pcouy
pcouy marked this pull request as draft May 13, 2026 14:31
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pcouy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Better kobo support - #238

Draft
pcouy wants to merge 9 commits into
rmkit-dev:masterfrom
pcouy:master
Draft

Better kobo support#238
pcouy wants to merge 9 commits into
rmkit-dev:masterfrom
pcouy:master

Conversation

@pcouy

@pcouypcouy commented May 5, 2026

Copy link
Copy Markdown

This branch contains a few tweaks I implemented after trying rmkit (more specifically remux) on my Elipsa 2E. The commits can be grouped into a few categories :

  • Build related changes : upgrade a docker image and add a missing CROSS_TC env var to a build script
  • Deal with some stability issues (remux going to stable 90% CPU use and not showing on gesture) by :
    1. Letting me manually restart remux by killing any previously running instance in the wrapper script
    2. Fixing an exception storm when using remux's API to show/hide it
  • Improve app switching by :
    1. Changing the interface of perform_redraw(...) to have an optional second boolean parameter to control screen flashing with FBInk, and using it when showing/hiding remux. This fixed ghosting for me
    2. Preventing nickel from grabbing inputs by grabbing them first, which let other apps detect rotation and power button presses on my Kobo Elipsa 2E (with this, I can have nickel and koreader running side by side, both working well with the remux flow)

This is a lot of different things, but I tried to make each commit as atomic as possible, and wrote detailed commit messages when the commit changed more than a couple of lines. I hope this helps with the review.

If needed, I can make a separate branch with only the commits you want to merge.

pcouy added 9 commits May 5, 2026 11:53
- Add kobo/ output dir to .gitignore
- Fix `make remux_docker` and other similar targets for kobo => Build
is a lot faster than rebuilding everything everytime
Updated the kobo wrapper script. Before this, I would sometimes have 2
remux instances running at the same time when testing, which caused
weird issues. This is kind of a dirty hack that was quicker than finding
the root cause
Before this, when sending commands through the API, stdout would fill
with exceptions with the call eventually working. After a few calls,
remux would crash.
Changed the locking logic in `TaskQueue`, mainly by repurposing `task_m`
(which I could not find the purpose of, or anywhere in the code that
acquired this lock) to prevent having more than 1 task thread running at
a time.
Updated method signatures for all backends, only implemented it for
FBInk
Done by grabbing the inputs on first launch and releasing them only
after the nickel process is running.
Context :
I added a modified version of koreader.sh to my remux, which does not
kill nickel before launching koreader. The goal is to seamlessly switch
between nickel and koreader, and to use bluetooth on y Elipsa 2E without
fearing a wipe on my /mnt/onboard if I accidentaly restart nickel
instead of rebooting the e-reader. This introduced an issue where koreader
would not handle rotations or the power button because nickel grabs
these devices and never releases them.
WARNING :
I have only tested this on my Kobo Elipsa 2E (Condor), this may break
on other devices. Not sure why input grabbing was disabled by the
preprocessor for Kobo target, but disabling it did not break anything on
Condor.
I also needed to add the `gpio` device to inputs, which emits orientation
change events on my Condor. The `EV_MSC` + `MSC_RAW` filter might match
other input devices on other e-readers. I think this would be harmless
anyway, but is worth checking before merging
After commit 2fd7055 most apps would not build for the kobo target.
Example build output below :
```
$ TARGET=kobo DOCKERFILE=Dockerfile.kobo FBINK=1 make harmony_docker
CXX=arm-kobo-linux-gnueabihf-g++ okp -sh -ig "RMKIT_IMPLEMENTATION" -ns -ni -for -d ../.rmkit.h_cpp/ -o ../build/rmkit.h rmkit.cpy ../build/stb.arm.o -- -D"KOBO=1" -D"RMKIT_IMPLEMENTATION" -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -D"RMKIT_FBINK=1" -O2 -static -static-libstdc++ -static-libgcc
compile flags: -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -O2 -static -static-libstdc++ -static-libgcc
missing file: ../shared/proc.h
missing file: ../shared/string.h
generating single header /rmkit/src/rmkit/../build/rmkit.h
MISSING FILE! /rmkit/src/.rmkit.h_cpp/shared/proc.h
MISSING FILE! /rmkit/src/.rmkit.h_cpp/shared/string.h
compiled into /rmkit/src/.rmkit.h_cpp
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/string.h
make[2]: Leaving directory '/rmkit/src/rmkit'
make[1]: Leaving directory '/rmkit/src/rmkit'
cd src/harmony && make
make[1]: Entering directory '/rmkit/src/harmony'
make compile_kobo
make[2]: Entering directory '/rmkit/src/harmony'
make[3]: Entering directory '/rmkit/src/vendor/FBInk'
make[3]: Nothing to be done for 'staticlib'.
make[3]: Leaving directory '/rmkit/src/vendor/FBInk'
CXX=arm-kobo-linux-gnueabihf-g++ okp -ig "RMKIT_IMPLEMENTATION" -ns -ni -for -d ../.harmony_cpp/ -o ../build/harmony main.cpy ../build/stb.arm.o -- -D"KOBO=1" -D"RMKIT_IMPLEMENTATION" -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -D"RMKIT_FBINK=1" -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
compile flags: -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
arm-kobo-linux-gnueabihf-g++ -c /rmkit/src/.harmony_cpp/main.cpp -o /rmkit/src/.harmony_cpp/main.o -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
In file included from /rmkit/src/.harmony_cpp/main.cpp:3:
/rmkit/src/.harmony_cpp/../build/rmkit.h: In lambda function:
/rmkit/src/.harmony_cpp/../build/rmkit.h:22492:22: error: 'proc' has not been declared
22492 | auto procs = proc::list_procs(bins);
| ^~~~
missing file: stb_image.h
missing file: stb_image_resize.h
Couldn't compile /rmkit/src/.harmony_cpp/main.cpp aborting
compiled into /rmkit/src/.harmony_cpp
make[2]: *** [../actions.make:42: compile_kobo] Error 1
make[2]: Leaving directory '/rmkit/src/harmony'
make[1]: Leaving directory '/rmkit/src/harmony'
make[1]: *** [../actions.make:11: compile] Error 2
make: *** [Makefile:18: harmony] Error 2
```
@pcouy
pcouy marked this pull request as draft May 13, 2026 14:31
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pcouy
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Better kobo support - #238

Draft
pcouy wants to merge 9 commits into
rmkit-dev:masterfrom
pcouy:master
Draft

Better kobo support#238
pcouy wants to merge 9 commits into
rmkit-dev:masterfrom
pcouy:master

Conversation

@pcouy

@pcouypcouy commented May 5, 2026

Copy link
Copy Markdown

This branch contains a few tweaks I implemented after trying rmkit (more specifically remux) on my Elipsa 2E. The commits can be grouped into a few categories :

  • Build related changes : upgrade a docker image and add a missing CROSS_TC env var to a build script
  • Deal with some stability issues (remux going to stable 90% CPU use and not showing on gesture) by :
    1. Letting me manually restart remux by killing any previously running instance in the wrapper script
    2. Fixing an exception storm when using remux's API to show/hide it
  • Improve app switching by :
    1. Changing the interface of perform_redraw(...) to have an optional second boolean parameter to control screen flashing with FBInk, and using it when showing/hiding remux. This fixed ghosting for me
    2. Preventing nickel from grabbing inputs by grabbing them first, which let other apps detect rotation and power button presses on my Kobo Elipsa 2E (with this, I can have nickel and koreader running side by side, both working well with the remux flow)

This is a lot of different things, but I tried to make each commit as atomic as possible, and wrote detailed commit messages when the commit changed more than a couple of lines. I hope this helps with the review.

If needed, I can make a separate branch with only the commits you want to merge.

pcouy added 9 commits May 5, 2026 11:53
- Add kobo/ output dir to .gitignore
- Fix `make remux_docker` and other similar targets for kobo => Build
is a lot faster than rebuilding everything everytime
Updated the kobo wrapper script. Before this, I would sometimes have 2
remux instances running at the same time when testing, which caused
weird issues. This is kind of a dirty hack that was quicker than finding
the root cause
Before this, when sending commands through the API, stdout would fill
with exceptions with the call eventually working. After a few calls,
remux would crash.
Changed the locking logic in `TaskQueue`, mainly by repurposing `task_m`
(which I could not find the purpose of, or anywhere in the code that
acquired this lock) to prevent having more than 1 task thread running at
a time.
Updated method signatures for all backends, only implemented it for
FBInk
Done by grabbing the inputs on first launch and releasing them only
after the nickel process is running.
Context :
I added a modified version of koreader.sh to my remux, which does not
kill nickel before launching koreader. The goal is to seamlessly switch
between nickel and koreader, and to use bluetooth on y Elipsa 2E without
fearing a wipe on my /mnt/onboard if I accidentaly restart nickel
instead of rebooting the e-reader. This introduced an issue where koreader
would not handle rotations or the power button because nickel grabs
these devices and never releases them.
WARNING :
I have only tested this on my Kobo Elipsa 2E (Condor), this may break
on other devices. Not sure why input grabbing was disabled by the
preprocessor for Kobo target, but disabling it did not break anything on
Condor.
I also needed to add the `gpio` device to inputs, which emits orientation
change events on my Condor. The `EV_MSC` + `MSC_RAW` filter might match
other input devices on other e-readers. I think this would be harmless
anyway, but is worth checking before merging
After commit 2fd7055 most apps would not build for the kobo target.
Example build output below :
```
$ TARGET=kobo DOCKERFILE=Dockerfile.kobo FBINK=1 make harmony_docker
CXX=arm-kobo-linux-gnueabihf-g++ okp -sh -ig "RMKIT_IMPLEMENTATION" -ns -ni -for -d ../.rmkit.h_cpp/ -o ../build/rmkit.h rmkit.cpy ../build/stb.arm.o -- -D"KOBO=1" -D"RMKIT_IMPLEMENTATION" -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -D"RMKIT_FBINK=1" -O2 -static -static-libstdc++ -static-libgcc
compile flags: -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -O2 -static -static-libstdc++ -static-libgcc
missing file: ../shared/proc.h
missing file: ../shared/string.h
generating single header /rmkit/src/rmkit/../build/rmkit.h
MISSING FILE! /rmkit/src/.rmkit.h_cpp/shared/proc.h
MISSING FILE! /rmkit/src/.rmkit.h_cpp/shared/string.h
compiled into /rmkit/src/.rmkit.h_cpp
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/proc.h
missing file: ../shared/string.h
make[2]: Leaving directory '/rmkit/src/rmkit'
make[1]: Leaving directory '/rmkit/src/rmkit'
cd src/harmony && make
make[1]: Entering directory '/rmkit/src/harmony'
make compile_kobo
make[2]: Entering directory '/rmkit/src/harmony'
make[3]: Entering directory '/rmkit/src/vendor/FBInk'
make[3]: Nothing to be done for 'staticlib'.
make[3]: Leaving directory '/rmkit/src/vendor/FBInk'
CXX=arm-kobo-linux-gnueabihf-g++ okp -ig "RMKIT_IMPLEMENTATION" -ns -ni -for -d ../.harmony_cpp/ -o ../build/harmony main.cpy ../build/stb.arm.o -- -D"KOBO=1" -D"RMKIT_IMPLEMENTATION" -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -D"RMKIT_FBINK=1" -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
compile flags: -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
arm-kobo-linux-gnueabihf-g++ -c /rmkit/src/.harmony_cpp/main.cpp -o /rmkit/src/.harmony_cpp/main.o -DKOBO=1 -DRMKIT_IMPLEMENTATION -ldl -pthread -lpthread -fdata-sections -ffunction-sections -Wl,--gc-sections -L/rmkit/src/vendor/FBInk/Release -l:libfbink.a -DRMKIT_FBINK=1 -Wno-psabi -O2 -static -static-libstdc++ -static-libgcc
In file included from /rmkit/src/.harmony_cpp/main.cpp:3:
/rmkit/src/.harmony_cpp/../build/rmkit.h: In lambda function:
/rmkit/src/.harmony_cpp/../build/rmkit.h:22492:22: error: 'proc' has not been declared
22492 | auto procs = proc::list_procs(bins);
| ^~~~
missing file: stb_image.h
missing file: stb_image_resize.h
Couldn't compile /rmkit/src/.harmony_cpp/main.cpp aborting
compiled into /rmkit/src/.harmony_cpp
make[2]: *** [../actions.make:42: compile_kobo] Error 1
make[2]: Leaving directory '/rmkit/src/harmony'
make[1]: Leaving directory '/rmkit/src/harmony'
make[1]: *** [../actions.make:11: compile] Error 2
make: *** [Makefile:18: harmony] Error 2
```
@pcouy
pcouy marked this pull request as draft May 13, 2026 14:31
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@pcouy