Repository files navigation

What is this?

These is a system service to enhance the compatibility of the Logitech Trackball Marble, Logitech MX Anywhere 2S, and other devices I may have with the Linux OS. It contains scripts that start during system boot and map the device inputs into special commands, like Back, Forward, Scrolling, Alt+Tab, macros, and so on. If a device is not present/detected it simply ignores the enhancements. It is also aware of the current focused window. For instance, "Switch Tabs" will map to different shortcuts deppending on your app.

Usage

Logitech Trackball Marble

Buttons

Normal Mode

ShortcutAction
ALeft Click
BGo to Declaration / Open in new Tab
CRight Click
DMiddle Click
EMove Cursor

Holding B

ShortcutAction
B + AShow All Windows
B + CBack
B + DForward
B + EVertical and Horizontal Scrolling

Holding C

ShortcutAction
C + ASearch Selection
C + BReopen Tab
C + DNew Tab or Document
C + EChange Volume (Vertical) or Undo / Redo (Horizontal)

Holding D

ShortcutAction
D + AClose Tab or Terminal
D + BClose Window
D + CAdvanced Search: Tabs, Files, Content, Symbols, so on
D + ESwitch Tabs (Vertical) or Switch Windows (Horizontal)

Macro Keyboard

Buttons

ShortcutAction
REC + MACRO_NStart recording / reset recording keyboard input sequence in buffer N (activates blue led)
MACRO_N (blue led on)Finish recording the macro (deactivates led)
MACRO_N (blue led off)Play the recorded sequence of keys
TOGGLE_NToggle macro MACRO_N between two sets, MACRO_1 to MACRO_6 (left) or MACRO_7 to MACRO_12 (right)
Yellow ledIndicates a key is being pressed

XPPEN Deco Pro

Buttons

KeyModeCan draw?Show drawingBackground
ATransparentYesYesNone
BOpaqueYesYesOpaque
CPassthroughNoYesNone
DDisabledNoNoNone

Transparent/Opaque/Passthrough Modes

KeyAction
EPrevious page
FNext page
GUndo
HRedo
IChange brush size
JMove paper
KTouch the tablet to draw
LEraser mode
MOpen Menu (Planned)

Disabled Mode

KeyAction
EPlanning
FPlanning
GPlanning
HPlanning
IPlanning
JPlanning
KLeft mouse click
LMiddle mouse click
MRight mouse click

Nulea M512

Buttons

Normal Mode

ShortcutAction
AMiddle Click
CRight Click
DLeft Click
EChange Tabs
FChange Volume
GMove Cursor

Holding B

ShortcutAction
B + AClose Window
B + CClose Tab
B + DPlay / Pause
B + EChange Windows
B + FZoom In / Out
B + GVertical and Horizontal Scroll

Logitech MX Master 3S and MX Anywhwere 2S

Buttons

Notes:

  • This shadow assumes logid is installed. Check the dependencies bellow on how to configure it.
  • Blue rows represent a scroll input.
  • Yellow rows require a clean button release (no combination was made)
  • Gray rows count as a combination if pressed on a deeper state
  • White rows never invalidate a clear state.
  • Some keys are not available for every mouse due to their physical limitations.

Dependencies

This daemon requires python3, pip, evdev, inotifywait, xclip, edid-decode, and logiops/logid. It has only been tested in Ubuntu 24.04 LTS, you can install its dependencies with the following commands.

sudo apt update
sudo apt install -yq libpython3-dev inotify-tools xclip edid-decode
sudo pip3 install evdev
sudo apt install logiops # Only necessary if you use Logitech MX Master 3S

If you are using the Logitech MX Master 3S, you need to map its upper button (G) to the keyboard key KEY_B. Example Logid config file (/etc/logid.cfg):

devices: ({name: "MX Master 3S";
hiresscroll:
{
hires: true;
invert: false;
target: false;};
smartshift:
{
on: false;
threshold: 30;
torque: 10;};
dpi: 2000;
buttons: ({cid: 0xc4;
action: {
type: "Keypress";
keys: ["KEY_B"];};},{
cid: 0x52;action={type: "ToggleSmartShift";};});});

Install

Install the python service and compiled programs

# Make sure your qmake is installed and accessible via PATH. For instance, qt creator would install it around your home directory:
sudo bash -c "PATH='/home/$USER/Qt/6.4.0/gcc_64/bin/':\$PATH ./install.sh"# Start the service in the system
sudo service devstream start
# Activate autostart during system boot
sudo systemctl enable devstream

Uninstall

# Stop services, uninstall them, and remove all files
sudo ./uninstall.sh

About

Intercept and transform events from Linux systems 🎾

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, '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

Repository files navigation

What is this?

These is a system service to enhance the compatibility of the Logitech Trackball Marble, Logitech MX Anywhere 2S, and other devices I may have with the Linux OS. It contains scripts that start during system boot and map the device inputs into special commands, like Back, Forward, Scrolling, Alt+Tab, macros, and so on. If a device is not present/detected it simply ignores the enhancements. It is also aware of the current focused window. For instance, "Switch Tabs" will map to different shortcuts deppending on your app.

Usage

Logitech Trackball Marble

Buttons

Normal Mode

ShortcutAction
ALeft Click
BGo to Declaration / Open in new Tab
CRight Click
DMiddle Click
EMove Cursor

Holding B

ShortcutAction
B + AShow All Windows
B + CBack
B + DForward
B + EVertical and Horizontal Scrolling

Holding C

ShortcutAction
C + ASearch Selection
C + BReopen Tab
C + DNew Tab or Document
C + EChange Volume (Vertical) or Undo / Redo (Horizontal)

Holding D

ShortcutAction
D + AClose Tab or Terminal
D + BClose Window
D + CAdvanced Search: Tabs, Files, Content, Symbols, so on
D + ESwitch Tabs (Vertical) or Switch Windows (Horizontal)

Macro Keyboard

Buttons

ShortcutAction
REC + MACRO_NStart recording / reset recording keyboard input sequence in buffer N (activates blue led)
MACRO_N (blue led on)Finish recording the macro (deactivates led)
MACRO_N (blue led off)Play the recorded sequence of keys
TOGGLE_NToggle macro MACRO_N between two sets, MACRO_1 to MACRO_6 (left) or MACRO_7 to MACRO_12 (right)
Yellow ledIndicates a key is being pressed

XPPEN Deco Pro

Buttons

KeyModeCan draw?Show drawingBackground
ATransparentYesYesNone
BOpaqueYesYesOpaque
CPassthroughNoYesNone
DDisabledNoNoNone

Transparent/Opaque/Passthrough Modes

KeyAction
EPrevious page
FNext page
GUndo
HRedo
IChange brush size
JMove paper
KTouch the tablet to draw
LEraser mode
MOpen Menu (Planned)

Disabled Mode

KeyAction
EPlanning
FPlanning
GPlanning
HPlanning
IPlanning
JPlanning
KLeft mouse click
LMiddle mouse click
MRight mouse click

Nulea M512

Buttons

Normal Mode

ShortcutAction
AMiddle Click
CRight Click
DLeft Click
EChange Tabs
FChange Volume
GMove Cursor

Holding B

ShortcutAction
B + AClose Window
B + CClose Tab
B + DPlay / Pause
B + EChange Windows
B + FZoom In / Out
B + GVertical and Horizontal Scroll

Logitech MX Master 3S and MX Anywhwere 2S

Buttons

Notes:

  • This shadow assumes logid is installed. Check the dependencies bellow on how to configure it.
  • Blue rows represent a scroll input.
  • Yellow rows require a clean button release (no combination was made)
  • Gray rows count as a combination if pressed on a deeper state
  • White rows never invalidate a clear state.
  • Some keys are not available for every mouse due to their physical limitations.

Dependencies

This daemon requires python3, pip, evdev, inotifywait, xclip, edid-decode, and logiops/logid. It has only been tested in Ubuntu 24.04 LTS, you can install its dependencies with the following commands.

sudo apt update
sudo apt install -yq libpython3-dev inotify-tools xclip edid-decode
sudo pip3 install evdev
sudo apt install logiops # Only necessary if you use Logitech MX Master 3S

If you are using the Logitech MX Master 3S, you need to map its upper button (G) to the keyboard key KEY_B. Example Logid config file (/etc/logid.cfg):

devices: ({name: "MX Master 3S";
hiresscroll:
{
hires: true;
invert: false;
target: false;};
smartshift:
{
on: false;
threshold: 30;
torque: 10;};
dpi: 2000;
buttons: ({cid: 0xc4;
action: {
type: "Keypress";
keys: ["KEY_B"];};},{
cid: 0x52;action={type: "ToggleSmartShift";};});});

Install

Install the python service and compiled programs

# Make sure your qmake is installed and accessible via PATH. For instance, qt creator would install it around your home directory:
sudo bash -c "PATH='/home/$USER/Qt/6.4.0/gcc_64/bin/':\$PATH ./install.sh"# Start the service in the system
sudo service devstream start
# Activate autostart during system boot
sudo systemctl enable devstream

Uninstall

# Stop services, uninstall them, and remove all files
sudo ./uninstall.sh

About

Intercept and transform events from Linux systems 🎾

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, '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

Repository files navigation

What is this?

These is a system service to enhance the compatibility of the Logitech Trackball Marble, Logitech MX Anywhere 2S, and other devices I may have with the Linux OS. It contains scripts that start during system boot and map the device inputs into special commands, like Back, Forward, Scrolling, Alt+Tab, macros, and so on. If a device is not present/detected it simply ignores the enhancements. It is also aware of the current focused window. For instance, "Switch Tabs" will map to different shortcuts deppending on your app.

Usage

Logitech Trackball Marble

Buttons

Normal Mode

ShortcutAction
ALeft Click
BGo to Declaration / Open in new Tab
CRight Click
DMiddle Click
EMove Cursor

Holding B

ShortcutAction
B + AShow All Windows
B + CBack
B + DForward
B + EVertical and Horizontal Scrolling

Holding C

ShortcutAction
C + ASearch Selection
C + BReopen Tab
C + DNew Tab or Document
C + EChange Volume (Vertical) or Undo / Redo (Horizontal)

Holding D

ShortcutAction
D + AClose Tab or Terminal
D + BClose Window
D + CAdvanced Search: Tabs, Files, Content, Symbols, so on
D + ESwitch Tabs (Vertical) or Switch Windows (Horizontal)

Macro Keyboard

Buttons

ShortcutAction
REC + MACRO_NStart recording / reset recording keyboard input sequence in buffer N (activates blue led)
MACRO_N (blue led on)Finish recording the macro (deactivates led)
MACRO_N (blue led off)Play the recorded sequence of keys
TOGGLE_NToggle macro MACRO_N between two sets, MACRO_1 to MACRO_6 (left) or MACRO_7 to MACRO_12 (right)
Yellow ledIndicates a key is being pressed

XPPEN Deco Pro

Buttons

KeyModeCan draw?Show drawingBackground
ATransparentYesYesNone
BOpaqueYesYesOpaque
CPassthroughNoYesNone
DDisabledNoNoNone

Transparent/Opaque/Passthrough Modes

KeyAction
EPrevious page
FNext page
GUndo
HRedo
IChange brush size
JMove paper
KTouch the tablet to draw
LEraser mode
MOpen Menu (Planned)

Disabled Mode

KeyAction
EPlanning
FPlanning
GPlanning
HPlanning
IPlanning
JPlanning
KLeft mouse click
LMiddle mouse click
MRight mouse click

Nulea M512

Buttons

Normal Mode

ShortcutAction
AMiddle Click
CRight Click
DLeft Click
EChange Tabs
FChange Volume
GMove Cursor

Holding B

ShortcutAction
B + AClose Window
B + CClose Tab
B + DPlay / Pause
B + EChange Windows
B + FZoom In / Out
B + GVertical and Horizontal Scroll

Logitech MX Master 3S and MX Anywhwere 2S

Buttons

Notes:

  • This shadow assumes logid is installed. Check the dependencies bellow on how to configure it.
  • Blue rows represent a scroll input.
  • Yellow rows require a clean button release (no combination was made)
  • Gray rows count as a combination if pressed on a deeper state
  • White rows never invalidate a clear state.
  • Some keys are not available for every mouse due to their physical limitations.

Dependencies

This daemon requires python3, pip, evdev, inotifywait, xclip, edid-decode, and logiops/logid. It has only been tested in Ubuntu 24.04 LTS, you can install its dependencies with the following commands.

sudo apt update
sudo apt install -yq libpython3-dev inotify-tools xclip edid-decode
sudo pip3 install evdev
sudo apt install logiops # Only necessary if you use Logitech MX Master 3S

If you are using the Logitech MX Master 3S, you need to map its upper button (G) to the keyboard key KEY_B. Example Logid config file (/etc/logid.cfg):

devices: ({name: "MX Master 3S";
hiresscroll:
{
hires: true;
invert: false;
target: false;};
smartshift:
{
on: false;
threshold: 30;
torque: 10;};
dpi: 2000;
buttons: ({cid: 0xc4;
action: {
type: "Keypress";
keys: ["KEY_B"];};},{
cid: 0x52;action={type: "ToggleSmartShift";};});});

Install

Install the python service and compiled programs

# Make sure your qmake is installed and accessible via PATH. For instance, qt creator would install it around your home directory:
sudo bash -c "PATH='/home/$USER/Qt/6.4.0/gcc_64/bin/':\$PATH ./install.sh"# Start the service in the system
sudo service devstream start
# Activate autostart during system boot
sudo systemctl enable devstream

Uninstall

# Stop services, uninstall them, and remove all files
sudo ./uninstall.sh

About

Intercept and transform events from Linux systems 🎾

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, '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

Repository files navigation

What is this?

These is a system service to enhance the compatibility of the Logitech Trackball Marble, Logitech MX Anywhere 2S, and other devices I may have with the Linux OS. It contains scripts that start during system boot and map the device inputs into special commands, like Back, Forward, Scrolling, Alt+Tab, macros, and so on. If a device is not present/detected it simply ignores the enhancements. It is also aware of the current focused window. For instance, "Switch Tabs" will map to different shortcuts deppending on your app.

Usage

Logitech Trackball Marble

Buttons

Normal Mode

ShortcutAction
ALeft Click
BGo to Declaration / Open in new Tab
CRight Click
DMiddle Click
EMove Cursor

Holding B

ShortcutAction
B + AShow All Windows
B + CBack
B + DForward
B + EVertical and Horizontal Scrolling

Holding C

ShortcutAction
C + ASearch Selection
C + BReopen Tab
C + DNew Tab or Document
C + EChange Volume (Vertical) or Undo / Redo (Horizontal)

Holding D

ShortcutAction
D + AClose Tab or Terminal
D + BClose Window
D + CAdvanced Search: Tabs, Files, Content, Symbols, so on
D + ESwitch Tabs (Vertical) or Switch Windows (Horizontal)

Macro Keyboard

Buttons

ShortcutAction
REC + MACRO_NStart recording / reset recording keyboard input sequence in buffer N (activates blue led)
MACRO_N (blue led on)Finish recording the macro (deactivates led)
MACRO_N (blue led off)Play the recorded sequence of keys
TOGGLE_NToggle macro MACRO_N between two sets, MACRO_1 to MACRO_6 (left) or MACRO_7 to MACRO_12 (right)
Yellow ledIndicates a key is being pressed

XPPEN Deco Pro

Buttons

KeyModeCan draw?Show drawingBackground
ATransparentYesYesNone
BOpaqueYesYesOpaque
CPassthroughNoYesNone
DDisabledNoNoNone

Transparent/Opaque/Passthrough Modes

KeyAction
EPrevious page
FNext page
GUndo
HRedo
IChange brush size
JMove paper
KTouch the tablet to draw
LEraser mode
MOpen Menu (Planned)

Disabled Mode

KeyAction
EPlanning
FPlanning
GPlanning
HPlanning
IPlanning
JPlanning
KLeft mouse click
LMiddle mouse click
MRight mouse click

Nulea M512

Buttons

Normal Mode

ShortcutAction
AMiddle Click
CRight Click
DLeft Click
EChange Tabs
FChange Volume
GMove Cursor

Holding B

ShortcutAction
B + AClose Window
B + CClose Tab
B + DPlay / Pause
B + EChange Windows
B + FZoom In / Out
B + GVertical and Horizontal Scroll

Logitech MX Master 3S and MX Anywhwere 2S

Buttons

Notes:

  • This shadow assumes logid is installed. Check the dependencies bellow on how to configure it.
  • Blue rows represent a scroll input.
  • Yellow rows require a clean button release (no combination was made)
  • Gray rows count as a combination if pressed on a deeper state
  • White rows never invalidate a clear state.
  • Some keys are not available for every mouse due to their physical limitations.

Dependencies

This daemon requires python3, pip, evdev, inotifywait, xclip, edid-decode, and logiops/logid. It has only been tested in Ubuntu 24.04 LTS, you can install its dependencies with the following commands.

sudo apt update
sudo apt install -yq libpython3-dev inotify-tools xclip edid-decode
sudo pip3 install evdev
sudo apt install logiops # Only necessary if you use Logitech MX Master 3S

If you are using the Logitech MX Master 3S, you need to map its upper button (G) to the keyboard key KEY_B. Example Logid config file (/etc/logid.cfg):

devices: ({name: "MX Master 3S";
hiresscroll:
{
hires: true;
invert: false;
target: false;};
smartshift:
{
on: false;
threshold: 30;
torque: 10;};
dpi: 2000;
buttons: ({cid: 0xc4;
action: {
type: "Keypress";
keys: ["KEY_B"];};},{
cid: 0x52;action={type: "ToggleSmartShift";};});});

Install

Install the python service and compiled programs

# Make sure your qmake is installed and accessible via PATH. For instance, qt creator would install it around your home directory:
sudo bash -c "PATH='/home/$USER/Qt/6.4.0/gcc_64/bin/':\$PATH ./install.sh"# Start the service in the system
sudo service devstream start
# Activate autostart during system boot
sudo systemctl enable devstream

Uninstall

# Stop services, uninstall them, and remove all files
sudo ./uninstall.sh

About

Intercept and transform events from Linux systems 🎾

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, '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

Repository files navigation

What is this?

These is a system service to enhance the compatibility of the Logitech Trackball Marble, Logitech MX Anywhere 2S, and other devices I may have with the Linux OS. It contains scripts that start during system boot and map the device inputs into special commands, like Back, Forward, Scrolling, Alt+Tab, macros, and so on. If a device is not present/detected it simply ignores the enhancements. It is also aware of the current focused window. For instance, "Switch Tabs" will map to different shortcuts deppending on your app.

Usage

Logitech Trackball Marble

Buttons

Normal Mode

ShortcutAction
ALeft Click
BGo to Declaration / Open in new Tab
CRight Click
DMiddle Click
EMove Cursor

Holding B

ShortcutAction
B + AShow All Windows
B + CBack
B + DForward
B + EVertical and Horizontal Scrolling

Holding C

ShortcutAction
C + ASearch Selection
C + BReopen Tab
C + DNew Tab or Document
C + EChange Volume (Vertical) or Undo / Redo (Horizontal)

Holding D

ShortcutAction
D + AClose Tab or Terminal
D + BClose Window
D + CAdvanced Search: Tabs, Files, Content, Symbols, so on
D + ESwitch Tabs (Vertical) or Switch Windows (Horizontal)

Macro Keyboard

Buttons

ShortcutAction
REC + MACRO_NStart recording / reset recording keyboard input sequence in buffer N (activates blue led)
MACRO_N (blue led on)Finish recording the macro (deactivates led)
MACRO_N (blue led off)Play the recorded sequence of keys
TOGGLE_NToggle macro MACRO_N between two sets, MACRO_1 to MACRO_6 (left) or MACRO_7 to MACRO_12 (right)
Yellow ledIndicates a key is being pressed

XPPEN Deco Pro

Buttons

KeyModeCan draw?Show drawingBackground
ATransparentYesYesNone
BOpaqueYesYesOpaque
CPassthroughNoYesNone
DDisabledNoNoNone

Transparent/Opaque/Passthrough Modes

KeyAction
EPrevious page
FNext page
GUndo
HRedo
IChange brush size
JMove paper
KTouch the tablet to draw
LEraser mode
MOpen Menu (Planned)

Disabled Mode

KeyAction
EPlanning
FPlanning
GPlanning
HPlanning
IPlanning
JPlanning
KLeft mouse click
LMiddle mouse click
MRight mouse click

Nulea M512

Buttons

Normal Mode

ShortcutAction
AMiddle Click
CRight Click
DLeft Click
EChange Tabs
FChange Volume
GMove Cursor

Holding B

ShortcutAction
B + AClose Window
B + CClose Tab
B + DPlay / Pause
B + EChange Windows
B + FZoom In / Out
B + GVertical and Horizontal Scroll

Logitech MX Master 3S and MX Anywhwere 2S

Buttons

Notes:

  • This shadow assumes logid is installed. Check the dependencies bellow on how to configure it.
  • Blue rows represent a scroll input.
  • Yellow rows require a clean button release (no combination was made)
  • Gray rows count as a combination if pressed on a deeper state
  • White rows never invalidate a clear state.
  • Some keys are not available for every mouse due to their physical limitations.

Dependencies

This daemon requires python3, pip, evdev, inotifywait, xclip, edid-decode, and logiops/logid. It has only been tested in Ubuntu 24.04 LTS, you can install its dependencies with the following commands.

sudo apt update
sudo apt install -yq libpython3-dev inotify-tools xclip edid-decode
sudo pip3 install evdev
sudo apt install logiops # Only necessary if you use Logitech MX Master 3S

If you are using the Logitech MX Master 3S, you need to map its upper button (G) to the keyboard key KEY_B. Example Logid config file (/etc/logid.cfg):

devices: ({name: "MX Master 3S";
hiresscroll:
{
hires: true;
invert: false;
target: false;};
smartshift:
{
on: false;
threshold: 30;
torque: 10;};
dpi: 2000;
buttons: ({cid: 0xc4;
action: {
type: "Keypress";
keys: ["KEY_B"];};},{
cid: 0x52;action={type: "ToggleSmartShift";};});});

Install

Install the python service and compiled programs

# Make sure your qmake is installed and accessible via PATH. For instance, qt creator would install it around your home directory:
sudo bash -c "PATH='/home/$USER/Qt/6.4.0/gcc_64/bin/':\$PATH ./install.sh"# Start the service in the system
sudo service devstream start
# Activate autostart during system boot
sudo systemctl enable devstream

Uninstall

# Stop services, uninstall them, and remove all files
sudo ./uninstall.sh

About

Intercept and transform events from Linux systems 🎾

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, '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

Repository files navigation

What is this?

These is a system service to enhance the compatibility of the Logitech Trackball Marble, Logitech MX Anywhere 2S, and other devices I may have with the Linux OS. It contains scripts that start during system boot and map the device inputs into special commands, like Back, Forward, Scrolling, Alt+Tab, macros, and so on. If a device is not present/detected it simply ignores the enhancements. It is also aware of the current focused window. For instance, "Switch Tabs" will map to different shortcuts deppending on your app.

Usage

Logitech Trackball Marble

Buttons

Normal Mode

ShortcutAction
ALeft Click
BGo to Declaration / Open in new Tab
CRight Click
DMiddle Click
EMove Cursor

Holding B

ShortcutAction
B + AShow All Windows
B + CBack
B + DForward
B + EVertical and Horizontal Scrolling

Holding C

ShortcutAction
C + ASearch Selection
C + BReopen Tab
C + DNew Tab or Document
C + EChange Volume (Vertical) or Undo / Redo (Horizontal)

Holding D

ShortcutAction
D + AClose Tab or Terminal
D + BClose Window
D + CAdvanced Search: Tabs, Files, Content, Symbols, so on
D + ESwitch Tabs (Vertical) or Switch Windows (Horizontal)

Macro Keyboard

Buttons

ShortcutAction
REC + MACRO_NStart recording / reset recording keyboard input sequence in buffer N (activates blue led)
MACRO_N (blue led on)Finish recording the macro (deactivates led)
MACRO_N (blue led off)Play the recorded sequence of keys
TOGGLE_NToggle macro MACRO_N between two sets, MACRO_1 to MACRO_6 (left) or MACRO_7 to MACRO_12 (right)
Yellow ledIndicates a key is being pressed

XPPEN Deco Pro

Buttons

KeyModeCan draw?Show drawingBackground
ATransparentYesYesNone
BOpaqueYesYesOpaque
CPassthroughNoYesNone
DDisabledNoNoNone

Transparent/Opaque/Passthrough Modes

KeyAction
EPrevious page
FNext page
GUndo
HRedo
IChange brush size
JMove paper
KTouch the tablet to draw
LEraser mode
MOpen Menu (Planned)

Disabled Mode

KeyAction
EPlanning
FPlanning
GPlanning
HPlanning
IPlanning
JPlanning
KLeft mouse click
LMiddle mouse click
MRight mouse click

Nulea M512

Buttons

Normal Mode

ShortcutAction
AMiddle Click
CRight Click
DLeft Click
EChange Tabs
FChange Volume
GMove Cursor

Holding B

ShortcutAction
B + AClose Window
B + CClose Tab
B + DPlay / Pause
B + EChange Windows
B + FZoom In / Out
B + GVertical and Horizontal Scroll

Logitech MX Master 3S and MX Anywhwere 2S

Buttons

Notes:

  • This shadow assumes logid is installed. Check the dependencies bellow on how to configure it.
  • Blue rows represent a scroll input.
  • Yellow rows require a clean button release (no combination was made)
  • Gray rows count as a combination if pressed on a deeper state
  • White rows never invalidate a clear state.
  • Some keys are not available for every mouse due to their physical limitations.

Dependencies

This daemon requires python3, pip, evdev, inotifywait, xclip, edid-decode, and logiops/logid. It has only been tested in Ubuntu 24.04 LTS, you can install its dependencies with the following commands.

sudo apt update
sudo apt install -yq libpython3-dev inotify-tools xclip edid-decode
sudo pip3 install evdev
sudo apt install logiops # Only necessary if you use Logitech MX Master 3S

If you are using the Logitech MX Master 3S, you need to map its upper button (G) to the keyboard key KEY_B. Example Logid config file (/etc/logid.cfg):

devices: ({name: "MX Master 3S";
hiresscroll:
{
hires: true;
invert: false;
target: false;};
smartshift:
{
on: false;
threshold: 30;
torque: 10;};
dpi: 2000;
buttons: ({cid: 0xc4;
action: {
type: "Keypress";
keys: ["KEY_B"];};},{
cid: 0x52;action={type: "ToggleSmartShift";};});});

Install

Install the python service and compiled programs

# Make sure your qmake is installed and accessible via PATH. For instance, qt creator would install it around your home directory:
sudo bash -c "PATH='/home/$USER/Qt/6.4.0/gcc_64/bin/':\$PATH ./install.sh"# Start the service in the system
sudo service devstream start
# Activate autostart during system boot
sudo systemctl enable devstream

Uninstall

# Stop services, uninstall them, and remove all files
sudo ./uninstall.sh

About

Intercept and transform events from Linux systems 🎾

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, '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

Repository files navigation

What is this?

These is a system service to enhance the compatibility of the Logitech Trackball Marble, Logitech MX Anywhere 2S, and other devices I may have with the Linux OS. It contains scripts that start during system boot and map the device inputs into special commands, like Back, Forward, Scrolling, Alt+Tab, macros, and so on. If a device is not present/detected it simply ignores the enhancements. It is also aware of the current focused window. For instance, "Switch Tabs" will map to different shortcuts deppending on your app.

Usage

Logitech Trackball Marble

Buttons

Normal Mode

ShortcutAction
ALeft Click
BGo to Declaration / Open in new Tab
CRight Click
DMiddle Click
EMove Cursor

Holding B

ShortcutAction
B + AShow All Windows
B + CBack
B + DForward
B + EVertical and Horizontal Scrolling

Holding C

ShortcutAction
C + ASearch Selection
C + BReopen Tab
C + DNew Tab or Document
C + EChange Volume (Vertical) or Undo / Redo (Horizontal)

Holding D

ShortcutAction
D + AClose Tab or Terminal
D + BClose Window
D + CAdvanced Search: Tabs, Files, Content, Symbols, so on
D + ESwitch Tabs (Vertical) or Switch Windows (Horizontal)

Macro Keyboard

Buttons

ShortcutAction
REC + MACRO_NStart recording / reset recording keyboard input sequence in buffer N (activates blue led)
MACRO_N (blue led on)Finish recording the macro (deactivates led)
MACRO_N (blue led off)Play the recorded sequence of keys
TOGGLE_NToggle macro MACRO_N between two sets, MACRO_1 to MACRO_6 (left) or MACRO_7 to MACRO_12 (right)
Yellow ledIndicates a key is being pressed

XPPEN Deco Pro

Buttons

KeyModeCan draw?Show drawingBackground
ATransparentYesYesNone
BOpaqueYesYesOpaque
CPassthroughNoYesNone
DDisabledNoNoNone

Transparent/Opaque/Passthrough Modes

KeyAction
EPrevious page
FNext page
GUndo
HRedo
IChange brush size
JMove paper
KTouch the tablet to draw
LEraser mode
MOpen Menu (Planned)

Disabled Mode

KeyAction
EPlanning
FPlanning
GPlanning
HPlanning
IPlanning
JPlanning
KLeft mouse click
LMiddle mouse click
MRight mouse click

Nulea M512

Buttons

Normal Mode

ShortcutAction
AMiddle Click
CRight Click
DLeft Click
EChange Tabs
FChange Volume
GMove Cursor

Holding B

ShortcutAction
B + AClose Window
B + CClose Tab
B + DPlay / Pause
B + EChange Windows
B + FZoom In / Out
B + GVertical and Horizontal Scroll

Logitech MX Master 3S and MX Anywhwere 2S

Buttons

Notes:

  • This shadow assumes logid is installed. Check the dependencies bellow on how to configure it.
  • Blue rows represent a scroll input.
  • Yellow rows require a clean button release (no combination was made)
  • Gray rows count as a combination if pressed on a deeper state
  • White rows never invalidate a clear state.
  • Some keys are not available for every mouse due to their physical limitations.

Dependencies

This daemon requires python3, pip, evdev, inotifywait, xclip, edid-decode, and logiops/logid. It has only been tested in Ubuntu 24.04 LTS, you can install its dependencies with the following commands.

sudo apt update
sudo apt install -yq libpython3-dev inotify-tools xclip edid-decode
sudo pip3 install evdev
sudo apt install logiops # Only necessary if you use Logitech MX Master 3S

If you are using the Logitech MX Master 3S, you need to map its upper button (G) to the keyboard key KEY_B. Example Logid config file (/etc/logid.cfg):

devices: ({name: "MX Master 3S";
hiresscroll:
{
hires: true;
invert: false;
target: false;};
smartshift:
{
on: false;
threshold: 30;
torque: 10;};
dpi: 2000;
buttons: ({cid: 0xc4;
action: {
type: "Keypress";
keys: ["KEY_B"];};},{
cid: 0x52;action={type: "ToggleSmartShift";};});});

Install

Install the python service and compiled programs

# Make sure your qmake is installed and accessible via PATH. For instance, qt creator would install it around your home directory:
sudo bash -c "PATH='/home/$USER/Qt/6.4.0/gcc_64/bin/':\$PATH ./install.sh"# Start the service in the system
sudo service devstream start
# Activate autostart during system boot
sudo systemctl enable devstream

Uninstall

# Stop services, uninstall them, and remove all files
sudo ./uninstall.sh

About

Intercept and transform events from Linux systems 🎾

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, '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

Repository files navigation

What is this?

These is a system service to enhance the compatibility of the Logitech Trackball Marble, Logitech MX Anywhere 2S, and other devices I may have with the Linux OS. It contains scripts that start during system boot and map the device inputs into special commands, like Back, Forward, Scrolling, Alt+Tab, macros, and so on. If a device is not present/detected it simply ignores the enhancements. It is also aware of the current focused window. For instance, "Switch Tabs" will map to different shortcuts deppending on your app.

Usage

Logitech Trackball Marble

Buttons

Normal Mode

ShortcutAction
ALeft Click
BGo to Declaration / Open in new Tab
CRight Click
DMiddle Click
EMove Cursor

Holding B

ShortcutAction
B + AShow All Windows
B + CBack
B + DForward
B + EVertical and Horizontal Scrolling

Holding C

ShortcutAction
C + ASearch Selection
C + BReopen Tab
C + DNew Tab or Document
C + EChange Volume (Vertical) or Undo / Redo (Horizontal)

Holding D

ShortcutAction
D + AClose Tab or Terminal
D + BClose Window
D + CAdvanced Search: Tabs, Files, Content, Symbols, so on
D + ESwitch Tabs (Vertical) or Switch Windows (Horizontal)

Macro Keyboard

Buttons

ShortcutAction
REC + MACRO_NStart recording / reset recording keyboard input sequence in buffer N (activates blue led)
MACRO_N (blue led on)Finish recording the macro (deactivates led)
MACRO_N (blue led off)Play the recorded sequence of keys
TOGGLE_NToggle macro MACRO_N between two sets, MACRO_1 to MACRO_6 (left) or MACRO_7 to MACRO_12 (right)
Yellow ledIndicates a key is being pressed

XPPEN Deco Pro

Buttons

KeyModeCan draw?Show drawingBackground
ATransparentYesYesNone
BOpaqueYesYesOpaque
CPassthroughNoYesNone
DDisabledNoNoNone

Transparent/Opaque/Passthrough Modes

KeyAction
EPrevious page
FNext page
GUndo
HRedo
IChange brush size
JMove paper
KTouch the tablet to draw
LEraser mode
MOpen Menu (Planned)

Disabled Mode

KeyAction
EPlanning
FPlanning
GPlanning
HPlanning
IPlanning
JPlanning
KLeft mouse click
LMiddle mouse click
MRight mouse click

Nulea M512

Buttons

Normal Mode

ShortcutAction
AMiddle Click
CRight Click
DLeft Click
EChange Tabs
FChange Volume
GMove Cursor

Holding B

ShortcutAction
B + AClose Window
B + CClose Tab
B + DPlay / Pause
B + EChange Windows
B + FZoom In / Out
B + GVertical and Horizontal Scroll

Logitech MX Master 3S and MX Anywhwere 2S

Buttons

Notes:

  • This shadow assumes logid is installed. Check the dependencies bellow on how to configure it.
  • Blue rows represent a scroll input.
  • Yellow rows require a clean button release (no combination was made)
  • Gray rows count as a combination if pressed on a deeper state
  • White rows never invalidate a clear state.
  • Some keys are not available for every mouse due to their physical limitations.

Dependencies

This daemon requires python3, pip, evdev, inotifywait, xclip, edid-decode, and logiops/logid. It has only been tested in Ubuntu 24.04 LTS, you can install its dependencies with the following commands.

sudo apt update
sudo apt install -yq libpython3-dev inotify-tools xclip edid-decode
sudo pip3 install evdev
sudo apt install logiops # Only necessary if you use Logitech MX Master 3S

If you are using the Logitech MX Master 3S, you need to map its upper button (G) to the keyboard key KEY_B. Example Logid config file (/etc/logid.cfg):

devices: ({name: "MX Master 3S";
hiresscroll:
{
hires: true;
invert: false;
target: false;};
smartshift:
{
on: false;
threshold: 30;
torque: 10;};
dpi: 2000;
buttons: ({cid: 0xc4;
action: {
type: "Keypress";
keys: ["KEY_B"];};},{
cid: 0x52;action={type: "ToggleSmartShift";};});});

Install

Install the python service and compiled programs

# Make sure your qmake is installed and accessible via PATH. For instance, qt creator would install it around your home directory:
sudo bash -c "PATH='/home/$USER/Qt/6.4.0/gcc_64/bin/':\$PATH ./install.sh"# Start the service in the system
sudo service devstream start
# Activate autostart during system boot
sudo systemctl enable devstream

Uninstall

# Stop services, uninstall them, and remove all files
sudo ./uninstall.sh

About

Intercept and transform events from Linux systems 🎾

Topics

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages