Dynamic key remapper for X11 and Wayland

Overview

π‘‹π‘Ÿπ‘’π‘šπ‘Žπ‘ ⌨️ cargo

xremap is a key remapper for Linux. Unlike xmodmap, it supports app-specific remapping and Wayland.

Concept

  • Fast - Xremap is written in Rust, which is faster than JIT-less interpreters like Python.

  • Cross-platform - Xremap uses evdev and uinput, which works whether you use X11 or Wayland.

  • Language-agnostic - The config is JSON-compatible. Generate it from any language, e.g. Ruby, Python.

Features

  • You can remap any keys, e.g. Ctrl or CapsLock.
  • You can remap any key combination to another, even to a key sequence.
  • You can also remap a key sequence as well. You could do something like Emacs's C-x C-c.
  • Application-specific remapping. Even if it's not supported by your application, xremap can.

Prerequisite

xremap assumes that you can use evdev and uinput without sudo. You can configure it as follows:

sudo gpasswd -a YOUR_USER input
echo 'KERNEL=="uinput", GROUP="input"' | sudo tee /etc/udev/rules.d/input.rules

Then reboot your machine to make sure the udev rule is applied.

Installation

After the reboot, download a binary from Releases.

If it doesn't work, please install Rust and run one of the following commands in this repository and use target/release/xremap:

# X11
cargo build xremap --release --features x11

# GNOME Wayland
cargo build xremap --release --features gnome

# Sway
cargo build xremap --release --features sway

# Others
cargo build xremap --release

You may also need to install libx11-dev to run the xremap binary for X11.

Usage

Write a config file directly, or generate it with xremap-ruby or xremap-python. Then run:

xremap config.yml

Dynamic binding

Xremap supports application-specific key remapping.

While Xremap uses evdev and uinput, which is a lower layer than X11 and Wayland, Xremap also uses X11 or Wayland compositor-specific protocols to support application config. If you need this feature, make sure you specify the correct binary or --features option, and pay attention to the error messages from xremap.

Configuration

Your config.yml should look like this:

modmap:
  - name: Except Chrome
    application:
      not: Google-chrome
    remap:
      CapsLock: Esc
keymap:
  - name: Emacs binding
    application:
      only: Slack
    remap:
      C-b: left
      C-f: right
      C-p: up
      C-n: down

See also: example/config.yml

modmap

modmap is for key-to-key remapping like xmodmap. If you want to remap modifier keys, you need to use modmap. Note that modmap remapping happens before keymap remapping.

modmap:
  - name: Name # Required
    remap: # Required
      KEY_XXX: KEY_YYY
    application: # Optional
      not: [Application, ...]
      # or
      only: [Application, ...]

For KEY_XXX and KEY_YYY, use these names. You can skip KEY_ and the name is case-insensitive. So KEY_CAPSLOCK, CAPSLOCK, and CapsLock are the same thing. Some custom aliases like SHIFT_R, CONTROL_L, etc. are provided.

keymap

modmap is for remapping a sequence of key combinations to another sequence of key combinations or other actions.

modmap:
  - name: Name # Required
    remap: # Required
      # key press -> key press
      MOD1-KEY_XXX: MOD2-KEY_YYY
      # sequence (MOD1-KEY_XXX, MOD2-KEY_YYY) -> key press (MOD3-KEY_ZZZ)
      MOD1-KEY_XXX:
        remap:
          MOD2-KEY_YYY: MOD3-KEY_ZZZ
      # key press (MOD1-KEY_XXX) -> sequence (MOD2-KEY_YYY, MOD3-KEY_ZZZ)
      MOD1-KEY_XXX: [MOD2-KEY_YYY, MOD3-KEY_ZZZ]
    application: # Optional
      not: [Application, ...]
      # or
      only: [Application, ...]

For KEY_XXX, use these names. You can skip KEY_ and the name is case-insensitive. So KEY_CAPSLOCK, CAPSLOCK, and CapsLock are the same thing.

For the MOD1- part, the following prefixes can be used (also case-insensitive):

  • Shift: SHIFT-
  • Control: C-, CTRL-, CONTROL-
  • Alt: M-, ALT-
  • Windows: SUPER-, WIN-, WINDOWS-

You may use multiple prefixes like C-M-Shift-a.

application

application can be used for both modmap and keymap, which allows you to specify application-specific remapping.

application:
  not: Application
  # or
  not: [Application, ...]
  # or
  only: Application
  # or
  only: [Application, ...]

To check the application names, you can use the following commands:

X11

$ wmctrl -x -l
0x0280000a  0 gnome-terminal-server.Gnome-terminal  ubuntu-focal Terminal
0x02600001  0 nocturn.Nocturn       ubuntu-focal Nocturn

Use the name after . in the third column (WM_CLASS), i.e. Gnome-terminal or Nocturn in the above output.

GNOME Wayland

busctl --user call org.gnome.Shell /org/gnome/Shell org.gnome.Shell Eval s 'global.get_window_actors().map(a => a.get_meta_window().get_wm_class());'

Sway

swaymsg -t get_tree

Locate app_id in the output.

License

The gem is available as open source under the terms of the MIT License.

Comments
  • Is there a way to listen for the second keystroke with timeout?

    Is there a way to listen for the second keystroke with timeout?

    Hello,

    I would like to implement something that's similiar to how key mappings are handled in vim.

    say for example I want to remap jk to escape instead of pressing jk all at once I can press j first then I have a short amount of milliseconds to follow with k

    is there a way to implement this using Xremap? and if yes can I control the timeout too? If the second key isn't presessed within the given timeout, that should cancel the listening thank you.

    opened by cipherlogs 35
  • application remapping (modmap)

    application remapping (modmap)

    I was trying out application specific remapping, but unable to do so. The ramapping i want to use is: BTN_SIDE: KEY_LEFTALT. This works as expected without an application restriction, but when a application restriction is applied it either does nothing, in case the application is open, or it freezes all listed input-devices when to application is closed.
    The config i am using:

    modmap:
      - name: Global
        remap:
          BTN_EXTRA: KEY_LEFTCTRL
          
      - name: Test
        remap:
          BTN_SIDE: KEY_LEFTALT
        application:
          only: dolphin
    
    

    I am using ubuntu 21.04 with KDE on x11.

    opened by N4tus 30
  • Support logical modifier keys

    Support logical modifier keys

    Hello,

    I'm trying to map capslock + ijkl keys to arrow keys and extra: o -> end, u -> home, p -> pageup, ; -> pagedown. The mapping should be compatible with (shift, alt, ctrl, shift+ctrl and shift+alt) + Arrow for editing in vscode for example.

    What i tried:

    • Mapping capslock to hyper(super) but on KDE Plasma super(which is the win key) opens app menu.
    • Using capslock as Alt_R as a workaround but i use it for my (EurKey) layout to use üâÀß, therefore Alt_R wont work for me.

    In xmodmap i used to use mode_switch which works fine with win key:

    clear Lock
    keycode 66 = Mode_switch
    keysym h = h H Left
    keysym l = l L Right
    keysym k = k K Up
    keysym j = j J Down
    

    Is there maybe an extra layer of modifier i didn't find? Any suggestions on how i can do it? This is a common used mapping navigation. Would appreciate anyones help. :)

    Extra: xremap ❀ Rust

    opened by nullbyto 24
  • Feature request: support keydown/keyup event

    Feature request: support keydown/keyup event

    I am looking a way to show tint2 bar on windows keydown and hide it on windows key up. There are other uses and a similar request on xkeysnail repo https://github.com/mooz/xkeysnail/issues/93

    Thank you!

    opened by QiangF 21
  • --watch not working due to permission denied error

    --watch not working due to permission denied error

    First, thank you for this awesome tool!

    I've tried the --watch option, and it doesn't seem to work as intended on my machine. I've forked the repo and added a few println! statements to understand what's going on, so here's what I did to reproduce the issue with the forked version:

    1. Start ./target/release/xremap --watch /path/to/config.yml. So far, everything's working as intended: It correctly detects /dev/event3 as my keyboard. This is the output:

      Path "/dev/input/event4" cannot be opened: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }
      Selecting devices from the following list:
      ------------------------------------------------------------------------------
      /dev/input/event0 : Power Button
      /dev/input/event1 : Power Button
      /dev/input/event2 : USB Keyboard Consumer Control
      /dev/input/event3 : USB Keyboard
      /dev/input/event5 : UVC Camera (046d:0825)
      /dev/input/event6 : PixArt USB Optical Mouse
      /dev/input/event7 : HDA ATI HDMI HDMI/DP,pcm=3
      /dev/input/event8 : HDA ATI HDMI HDMI/DP,pcm=7
      /dev/input/event9 : HDA ATI HDMI HDMI/DP,pcm=8
      /dev/input/event10: HDA ATI HDMI HDMI/DP,pcm=9
      /dev/input/event11: HDA ATI HDMI HDMI/DP,pcm=10
      /dev/input/event12: HDA ATI HDMI HDMI/DP,pcm=11
      /dev/input/event13: HD-Audio Generic Front Mic
      /dev/input/event14: HD-Audio Generic Rear Mic
      /dev/input/event15: HD-Audio Generic Line
      /dev/input/event16: HD-Audio Generic Line Out Front
      /dev/input/event17: HD-Audio Generic Line Out Surround
      /dev/input/event18: HD-Audio Generic Line Out CLFE
      /dev/input/event19: HD-Audio Generic Front Headphone
      /dev/input/event20: BurrBrown from Texas Instruments USB AUDIO  CODEC
      /dev/input/event21: USB Keyboard System Control
      ------------------------------------------------------------------------------
      Selected keyboards automatically since --device options weren't specified:
      ------------------------------------------------------------------------------
      /dev/input/event3 : USB Keyboard
      ------------------------------------------------------------------------------
      Received events from inotify: Err(EAGAIN)
      
    2. Disconnect the keyboard. This is the output:

      Received events from inotify: Ok([InotifyEvent { wd: WatchDescriptor { wd: 1 },
      mask: IN_ATTRIB, cookie: 0, name: Some("event3") }])
      Detected device changes. Reselecting devices.
      Path "/dev/input/event2" cannot be opened: Os { code: 13, kind:
      PermissionDenied, message: "Permission denied" }
      Selecting devices from the following list:
      ------------------------------------------------------------------------------
      /dev/input/event0 : Power Button
      /dev/input/event1 : Power Button
      /dev/input/event5 : UVC Camera (046d:0825)
      /dev/input/event6 : PixArt USB Optical Mouse
      /dev/input/event7 : HDA ATI HDMI HDMI/DP,pcm=3
      /dev/input/event8 : HDA ATI HDMI HDMI/DP,pcm=7
      /dev/input/event9 : HDA ATI HDMI HDMI/DP,pcm=8
      /dev/input/event10: HDA ATI HDMI HDMI/DP,pcm=9
      /dev/input/event11: HDA ATI HDMI HDMI/DP,pcm=10
      /dev/input/event12: HDA ATI HDMI HDMI/DP,pcm=11
      /dev/input/event13: HD-Audio Generic Front Mic
      /dev/input/event14: HD-Audio Generic Rear Mic
      /dev/input/event15: HD-Audio Generic Line
      /dev/input/event16: HD-Audio Generic Line Out Front
      /dev/input/event17: HD-Audio Generic Line Out Surround
      /dev/input/event18: HD-Audio Generic Line Out CLFE
      /dev/input/event19: HD-Audio Generic Front Headphone
      /dev/input/event20: BurrBrown from Texas Instruments USB AUDIO  CODEC
      /dev/input/event21: USB Keyboard System Control
      ------------------------------------------------------------------------------
      Selected keyboards automatically since --device options weren't specified:
      ------------------------------------------------------------------------------
      warning: No device was selected, but --watch is waiting for new devices.
      ------------------------------------------------------------------------------
      
    3. Reconnect the keyboard. Notice that in the output, event2 and event3 (the keyboard) cannot be opened (PermissionDenied).

      Received events from inotify: Ok([InotifyEvent { wd: WatchDescriptor { wd: 1 }, mask: IN_CREATE, cookie: 0, name: Some("event3") }, InotifyEvent { wd: WatchDescriptor { wd: 1 }, mask: IN_ATTRIB, cookie: 0, name: Some("event3") }])
      Detected device changes. Reselecting devices.
      Path "/dev/input/event21" cannot be opened: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }
      Path "/dev/input/event4" cannot be opened: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }
      Path "/dev/input/event2" cannot be opened: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }
      Path "/dev/input/event3" cannot be opened: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }
      Selecting devices from the following list:
      ------------------------------------------------------------------------------
      /dev/input/event0 : Power Button
      /dev/input/event1 : Power Button
      /dev/input/event5 : UVC Camera (046d:0825)
      /dev/input/event6 : PixArt USB Optical Mouse
      /dev/input/event7 : HDA ATI HDMI HDMI/DP,pcm=3
      /dev/input/event8 : HDA ATI HDMI HDMI/DP,pcm=7
      /dev/input/event9 : HDA ATI HDMI HDMI/DP,pcm=8
      /dev/input/event10: HDA ATI HDMI HDMI/DP,pcm=9
      /dev/input/event11: HDA ATI HDMI HDMI/DP,pcm=10
      /dev/input/event12: HDA ATI HDMI HDMI/DP,pcm=11
      /dev/input/event13: HD-Audio Generic Front Mic
      /dev/input/event14: HD-Audio Generic Rear Mic
      /dev/input/event15: HD-Audio Generic Line
      /dev/input/event16: HD-Audio Generic Line Out Front
      /dev/input/event17: HD-Audio Generic Line Out Surround
      /dev/input/event18: HD-Audio Generic Line Out CLFE
      /dev/input/event19: HD-Audio Generic Front Headphone
      /dev/input/event20: BurrBrown from Texas Instruments USB AUDIO  CODEC
      ------------------------------------------------------------------------------
      Selected keyboards automatically since --device options weren't specified:
      ------------------------------------------------------------------------------
      warning: No device was selected, but --watch is waiting for new devices.
      ------------------------------------------------------------------------------
      

    So to my understanding, this is a race condition where the USB device is not yet readable immediately after the inotify event. According to the inotify println! statements that I've added, we receive an IN_ATTRIB event in addition to the IN_CREATE event when the device is reconnected. So apparently, even after the first IN_ATTRIB event, the device is still not readable.

    I ran notifywait -r -m /dev/input | grep 'event3' to see what events occur after the keyboard is connected, here's the output:

    /dev/input/ CREATE event3
    /dev/input/ ATTRIB event3
    /dev/input/ OPEN event3
    /dev/input/ CLOSE_NOWRITE,CLOSE event3
    /dev/input/ OPEN event3
    /dev/input/ ATTRIB event3
    /dev/input/ ATTRIB event3
    /dev/input/ ATTRIB event3
    /dev/input/ CLOSE_NOWRITE,CLOSE event3
    /dev/input/ OPEN event3
    /dev/input/ CLOSE_WRITE,CLOSE event3
    /dev/input/ OPEN event3
    /dev/input/ CLOSE_WRITE,CLOSE event3
    /dev/input/ OPEN event3
    /dev/input/ MODIFY event3
    

    I really have no idea why I get so many ATTRIB events, and why it closes the file multiple times after the device has been connected. But those are definitely the events that occur after the device has been connected.

    A simple workaround is to just sleep for 100 milliseconds before listing the files in /dev/input, but perhaps there's a more elegant fix.

    If you can't reproduce this issue on your machine, I'm happy to help, let me know if you want me test any patches.

    opened by nroi 19
  • Add application filter support for vnc environment

    Add application filter support for vnc environment

    Xremap works under vnc environment, but cannot filter different software. I noticed x-set-keys (https://github.com/kawao/x-set-keys), which supports filter for window class under vnc. So there must be a way for Xremap to support similar thing. Thanks so much for this great software and your hard work!

    opened by hitswint 17
  • Executing a command

    Executing a command

    First of all, thanks for xremap. I am trying to map Alt-1 to lunch kate, but I am not able to make it work. Am I doing it correctly?

    keymap:
      - name: Test
        application:
        remap:
          C-b: left
          C-f: right
          M-KEY_1:
             launch: ["bash", "-c", "kate"]
    
    opened by medwatt 16
  • Per-application remapping and GNOME 42 - The Return of the Bug

    Per-application remapping and GNOME 42 - The Return of the Bug

    Hey, first of all, thanks for this majestic piece of software.

    Running per-app remappings, I get this again:

    GnomeClient#connect() failed: I/O error: No such file or directory (os error 2)
    GnomeClient#connect() failed: I/O error: No such file or directory (os error 2)
    application-client: GNOME (supported: false)
    

    I:

    • am running xremap with sudo;
    • am running GNOME 42.4;
    • properly edited my DBus session configuration:
      <policy context="default">
        <allow user="root"/>
        <!-- Allow everything to be sent -->
        <allow send_destination="*" eavesdrop="true"/>
        <!-- Allow everything to be received -->
        <allow eavesdrop="true"/>
        <!-- Allow anyone to own anything -->
        <allow own="*"/>
      </policy>
    

    But still looks like the GNOME client doesn't like something in the middle and can't connect to dbus

    blaster@localhost [12:05:28] [~] 
    -> % echo $DBUS_SESSION_BUS_ADDRESS                                                                              
    unix:path=/run/user/1000/bus
    

    The socket file is actually there. I'm really running out of things coming to my mind, my last resort is asking here :smile:

    opened by dottorblaster 14
  • Key press / release is too fast for gnome-terminal

    Key press / release is too fast for gnome-terminal

    I just started using xremap over xbindkeys and I love it, but I noticed one issue. I think the fault is in gnome-terminal, because other apps (chrome, firefox, nautilus) are fine. I have the following setup:

    keymap:
      - name: Tab shifting
        remap:
          LEFTCTRL-SHIFT-RIGHTBRACE: LEFTCTRL-PAGEDOWN
          LEFTCTRL-SHIFT-LEFTBRACE: LEFTCTRL-PAGEUP
    

    This gives me mac-style shortcuts for switching tabs.

    Unfortunately it doesn't work in gnome-terminal or tilix (so it might be a bug in the underlying vte). They don't seem to register the combination, they just end up scrolling up/down or inserting some escape characters into the terminal.

    I found that adding a tiny sleep here makes it work:

    diff --git src/event_handler.rs src/event_handler.rs
    index f1d2267..369e753 100644
    --- src/event_handler.rs
    +++ src/event_handler.rs
    @@ -343,6 +343,7 @@ impl EventHandler {
     
             // Press the main key
             self.send_key(&key_press.key, PRESS)?;
    +        std::thread::sleep(std::time::Duration::from_millis(20));
             self.send_key(&key_press.key, RELEASE)?;
     
             // Resurrect the original modifiers
    

    Obviously this a is dumb workaround and not xremap's fault, but would you be open to a PR which added some kind of keypress_duration config which controlled whether we do a short sleep between pressing and releasing the key?

    opened by timbertson 13
  • Add timeout_millis for nested remap

    Add timeout_millis for nested remap

    Example

    I updated the implementation. This YAML:

    keymap:
      - remap:
          j:
            remap:
              k: Esc
            timeout_millis: 200
    
    • j -> 100ms -> k
      • Esc
    • j -> 300ms -> k
      • j -> k
    • j -> any ms -> l
      • j -> l
    • j -> 200ms
      • j
    opened by k0kubun 13
  • Support dwt for libinput

    Support dwt for libinput

    This is not really a bug of xremap I think, but a configuration problem.

    Problem

    With xremap activated, dwt libinputs "disable-while-typing" is not working.

    Reproduce

    Run xremap on a laptop and enable dwt (e.g. for sway, you do that by adding input * dwt enabled to your config).

    While typing, try to move your mouse with the touchpad, if it was working correctly your touchpad should not be controlling your mouse (this should also be the case without xremap running).

    On my device, the touchpad disabling while typing did not work when xremap is running, but did work when I killed xremap.

    Proposed solution

    Following https://gitlab.freedesktop.org/libinput/libinput/-/issues/524 the solution would be to convince libinput that the xremap keyboard is an internal keyboard if the source is.

    Maybe this requires manual intervention to just put something similar to Depau in the /etc/libinput/local-overrides.quirks:

    [xremap]
    MatchUdevType=keyboard
    MatchBus=usb //or whatever we need
    MatchName= // whatever xremap uses
    AttrKeyboardIntegration=internal
    
    opened by ModProg 10
  • `--watch=config` Reloading Config causes key mapping to stop working

    `--watch=config` Reloading Config causes key mapping to stop working

    I'm running into an issue where I'm trying to use the --watch=device,config option and whenever I change the config file I get the message "Reloading Config" from XRemap, but then it just stops remapping keys and I have to restart it manually. At first I thought maybe this only happened if I had a configuration error, but then I checked and it stops working even if I start xremap and immediately save the config file without any changes.

    I'm trying to use systemctl to run xremap on startup, but this issue also appears even if I run it with sudo from a terminal.

    For now my workaround is just to run xremap without hot-reloading, and restart it manually whenever I'm making changes.

    System Info

    • xremap 0.7.15
    • Pop!OS 22.04
    • Command I'm using to run xremap: /home/me/.cargo/bin/xremap /home/me/.config/xremap/config.yml --watch=device,config

    config file

    modmap:
      - name: Global
        remap:
          Super_L: Ctrl_L
          Ctrl_L: Super_L
    keymap:
      - name: Terminal
        application:
          only: Gnome-terminal
        remap:
          Super-c: C-c
    
    opened by DavidPD 1
  • support `mode` feature on `modmap`

    support `mode` feature on `modmap`

    First of all, thank you for creating this awesome software.

    When I tried remap Super key to the Left Mouse Button,

    modmap:
      - name: Super -> Left Mouse Button
        remap:
          LEFTMETA: BTN_LEFT
    

    I couldn't use my other remaps in keymap related to the Super key:

      - remap:
        LEFTMETA-KP8:
          launch: ["cmus-remote", "--volume", "+7%"]
    

    I am heavily using mode feature inside keymap and I really like it

    keymap:
      - mode: Normal
        remap:
          RIGHTALT-L:
            [
              launch:
                ["notify-send", "-u", "critical", "-r", "945", "Xremap MODE", "Launcher mode activated"],
              { set_mode: Launcher },
            ]
      - name: Quick Launch apps
        mode: Launcher
        remap:
          f:
            launch: ["firefox"]
          Esc:
            [
              launch: ["notify-send", "-r", "945", "Xremap MODE", "Back to Normal mode"],
              { set_mode: Normal },
            ]
    

    And I was hoping I could also use mode feature inside modmap but unfortunately it doesn't work.

    modmap:
      - mode: InsideModmap
        remap:
          LEFTMETA: BTN_LEFT
          Esc: { set_mode: Normal },
    
    default_mode: Normal
    keymap:
      - mode: Normal
        remap:
          LEFTMETA-m: { set_mode: InsideModmap }
    
    opened by U1s2e3r4n5a6m7e 2
  • Trigger a key sequence, keeping modifiers

    Trigger a key sequence, keeping modifiers

    keymap:
      - remap:
          a:
            - Ctrl-Shift-u
            - Ctrl-Shift-2
            - Ctrl-Shift-0
            - Ctrl-Shift-a
            - Ctrl-Shift-c
    

    This holds and releases Ctrl and Shift for each action, but it neds to be held during the entire sequence to make it input a Unicode character in some environments.

    original: https://www.reddit.com/r/Ubuntu/comments/rmqm5m/comment/j15xlju/?utm_source=reddit&utm_medium=web2x&context=3

    opened by k0kubun 1
  • [Feature request] Import files in config

    [Feature request] Import files in config

    It would be nice if we could import files in a config file to reduce duplication. Here's an idea of the syntax:

    import:
      - name: application-specific
        file1.yml # the extension is optional
        file2     # imports file2.yml
    
    modmap:
      ...
    
    keymap:
      ...
    

    This would be useful for people who have keyboards with different layouts. For example, I have a MacBook Air keyboard where the mod key is between the space and alt key, and a wireless keyboard where the mod and alt keys are swapped. I have a config file for each device, where the keymaps are the same. The two files differ only by their modmap. Being able to import files would allow me to factor out the common keymaps instead of having to apply the same changes to both files.

    opened by ChingChang9 12
  • Absolute input support for tablets

    Absolute input support for tablets

    Hi, I use xorg with i3. I wanted to try xremap to map my tablet buttons to specific shortcuts for xournalpp. After configuring my button remaps I noticed that my pen doesn't work anymore xd, after looking into the code I noticed that the virtualdevice doesn't register any absolute axes. When I added these axes locally xorg still ignored the uinput events.

    I doubt you have a tablet to test this so I'm open for providing more information, if this is solvable at all because I'm a bit stumped

    opened by ToxicMushroom 4
Releases(v0.7.15)
Owner
Takashi Kokubun
Ruby committer developing JIT compiler. Maintainer of ERB and Haml.
Takashi Kokubun
Steno for Wayland

WayPlover Steno for Wayland Description A Steno Stroke Interpreter for Wayland. Open Steno Project Learn Plover Usage wayplover --port /dev/ttyACM0 --

Travis Davis 9 Oct 23, 2022
A wallpaper daemon for Wayland compositors

Paper A wallpaper daemon for Wayland compositors implementing the layer-shell protocol. Features Supports png and jpg format Tiled wallpapers Bordered

snakedye 20 Nov 26, 2022
Turn off monitors to save power (for Wayland)

Same as xset dpms force off, but for Wayland. It requires zwlr_output_power_manager_v1 and org_kde_kwin_idle support from the Wayland compositer. wlro

依云 15 Dec 8, 2022
Wallpaper daemon for Wayland

wpaperd wpaperd is a minimal wallpaper daemon for Wayland. It allows the user to choose a different image for each output (aka for each monitor) just

Danilo Spinella 53 Dec 28, 2022
Default implementation of the Wayland protocol for use with wl

Wayland An implementation of core Wayland interfaces and convenience functions for accelerating the development of Wayland clients and servers using t

AidoP 1 Jan 24, 2022
A simple clipboard manager for wayland.

Wpilman A simple clipboard manager for wayland. Installation Just compile it yourself or install the AUR package: paru -S wlipman-git # or yay -S wlip

null 3 Jan 13, 2023
Wayland clipboard manager that will make you clap πŸ‘

Clapboard - clipboard manager that makes you clap ?? Clapboard is a simple clipboard manager for Wayland, built in Rust. It saves a history of your cl

Yo'av Moshe 18 Jan 28, 2023
xdotool-like for KDE Wayland

kdotool - a xdotool clone for KDE Wayland Introduction Wayland, for security concerns, removed most of the X11 APIs that xdotool uses to simulate user

Jin Liu 25 Dec 3, 2023
A dynamic output configuration tool that automatically detects and configures connected outputs based on a set of profiles.

shikane A dynamic output configuration tool that automatically detects and configures connected outputs based on a set of profiles. Each profile speci

Hendrik Wolff 15 May 4, 2023
A boiler plate code to create dynamic link library in rust.

?? rust-dll-bp This is a boiler plate code that will be generated as a dll binary. I personally cache this here for me but if you're intend to create

s3pt3mb3r 9 Nov 7, 2022
A scripting language that allows complex key remapping on Linux.

Map2 A scripting language that allows complex key remapping on Linux, written in Rust. All of the functionality related to interacting with graphical

Matt 99 Dec 6, 2022
A little tribute to the Dango Daikazoku from Clannad (by Key, KyoAni, et al)

dango A little tribute to the Dango Daikazoku from Clannad (by Key, KyoAni, et al) Try it with your friends at http://ernestwong.nz/dango-tribute/serv

Ernest Wong 19 Nov 21, 2022
69-key split mechanical keyboard (PCB, case, firmware)

ErgoNICE An open source 69-key column-staggered split mechanical keyboard with a rotary knob, extra connectors, a 3D printed case with "floating key"

null 12 Oct 1, 2022
A Rust proc-macro crate which derives functions to compile and parse back enums and structs to and from a bytecode representation

Bytecode A simple way to derive bytecode for you Enums and Structs. What is this This is a crate that provides a proc macro which will derive bytecode

null 4 Sep 3, 2022
A library and tool for automata and formal languages, inspired by JFLAP

Sugarcubes is a library and application for automata and formal languages. It is inspired by JFLAP, and is intended to eventually to be an alternative to JFLAP.

Henry Sloan 22 Nov 2, 2022
A stupid macro that compiles and executes Rust and spits the output directly into your Rust code

inline-rust This is a stupid macro inspired by inline-python that compiles and executes Rust and spits the output directly into your Rust code. There

William 19 Nov 29, 2022
This is a Discord bot written in Rust to translate to and from the Bottom Encoding Standard using bottom-rs and Serenity.

bottom-bot This is a Discord bot written in Rust to translate to and from the Bottom Encoding Standard using bottom-rs and Serenity. Ever had this pro

Bottom Software Foundation 11 Dec 10, 2022
An implementation of Code Generation and Factoring for Fast Evaluation of Low-order Spherical Harmonic Products and Squares

sh_product An implementation of Code Generation and Factoring for Fast Evaluation of Low-order Spherical Harmonic Products and Squares (paper by John

Simon Brown 7 Dec 2, 2022
lightweight and customizable rust s-expression (s-expr) parser and printer

s-expr Rust library for S-expression like parsing and printing parser keeps track of spans, and representation (e.g. number base) number and decimal d

Vincent Hanquez 5 Oct 26, 2022