[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-7806":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":32,"readmeContent":33,"aiSummary":34,"trendingCount":16,"starSnapshotCount":16,"syncStatus":35,"lastSyncTime":36,"discoverSource":37},7806,"fusuma","iberianpig\u002Ffusuma","iberianpig","Multitouch gestures with libinput driver on Linux","",null,"Ruby",3890,148,34,20,0,3,6,9,66.62,"MIT License",false,"main",true,[26,27,28,29,30,31],"gesture","gesture-recognition","libinput","linux","swipe","touchpad","2026-06-12 04:00:35","# Fusuma\n![Gem](https:\u002F\u002Fimg.shields.io\u002Fgem\u002Fv\u002Ffusuma?color=brightgreen) [![Build Status](https:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma\u002Factions\u002Fworkflows\u002Fmain.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma\u002Factions\u002Fworkflows\u002Fmain.yml)\n\nFusuma is a powerful tool designed to enable multitouch gesture recognition on Linux, providing intuitive operations for users. By utilizing gestures like swipes and pinches on laptops and devices with touchpads, you can create a more efficient working environment.\n\n![fusuma_image](https:\u002F\u002Frepository-images.githubusercontent.com\u002F69813387\u002F60879a00-166c-11ea-9875-3bf0818c62ec)\n\n襖(Fusuma) means sliding door used to partition off rooms in a Japanese house.\n\n## Features\n\n- **Easy Installation**: Easy to install via RubyGems.\n- **Flexible Configuration**: Customize gestures and actions freely in YAML file format.\n- **Sensitivity Settings**: Fine-tune gesture recognition with adjustable thresholds and intervals to suit your preferences and enhance precision.\n- **Extension through Plugins**: A [plugin system](https:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma\u002F#fusuma-plugins) allows for additional functionality as needed.\n\nEnhance your Linux experience by evolving your interaction with Fusuma!\n\n## Installation\n\n### Grant permission to read the touchpad device\n\n**IMPORTANT**: You **MUST** be a member of the **INPUT** group to read touchpad by Fusuma.\n\n```sh\nsudo gpasswd -a $USER input\n```\n\nThen, You apply the change with no logout or reboot.\n\n```sh\nnewgrp input\n```\n\n**IMPORTANT**: This makes `\u002Fdev\u002Finput\u002F` readable, so if that's an issue for you for some reason (like for privacy- or security concerns etc. or if it causes other parts of your OS to misbehave), **consider this your heads-up.** \n\n\u003Cdetails>\n\u003Csummary>For Debian Based Distros (Ubuntu, Debian, Mint, Pop!_OS)\u003C\u002Fsummary>\n\n### For Debian Based Distros (Ubuntu, Debian, Mint, Pop!_OS)\n\n#### 1. Install libinput-tools\n\nYou need `libinput` release 1.0 or later.\n\n```sh\nsudo apt-get install libinput-tools\n```\n\n#### 2. Install Ruby\n\nFusuma runs in Ruby, so you must install it first.\n\n```sh\nsudo apt-get install ruby\n```\n\n#### 3. Install Fusuma\n\n```sh\nsudo gem install fusuma\n```\n\n#### 4. Install xdotool (optional)\n\nFor sending shortcuts:\n\n```sh\nsudo apt-get install xdotool\n```\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary> For Arch Based Distros (Manjaro, Arch) \u003C\u002Fsummary>\n\n### For Arch Based Distros (Manjaro, Arch)\n\n#### 1. Install libinput.\n\nYou need `libinput` release 1.0 or later. This is most probably installed by default on Manjaro\n\n```sh\nsudo pacman -Syu libinput-tools\n```\n\n#### 2. Install Ruby\n\nFusuma runs in Ruby, so you must install it first.\n\n```sh\nsudo pacman -Syu ruby\n```\n\n#### 3. Install Fusuma\n\n**Note:** By default in Arch Linux, when running `gem`, gems are installed per-user (into `~\u002F.gem\u002Fruby\u002F`), instead of system-wide (into `\u002Fusr\u002Flib\u002Fruby\u002Fgems\u002F`). This is considered the best way to manage gems on Arch, because otherwise they might interfere with gems installed by Pacman. (From Arch Wiki)\n\nTo install gems system-wide, see any of the methods listed on [Arch Wiki](https:\u002F\u002Fwiki.archlinux.org\u002Findex.php\u002Fruby#Installing_gems_system-wide)\n\n```sh\nsudo gem install fusuma\n```\n\n#### 4. Install xdotool (optional)\n\nFor sending shortcuts:\n\n```sh\nsudo pacman -Syu xdotool\n```\n**For the truly lazy people:** As with pretty much anything else available as Open-Source-Software, you can install Fusuma via a package from the AUR. The package you would want is called `ruby-fusuma`.\n\nPlease keep in mind that this community-built package is NOT officially supported here and while it might do the job, it is not the intended way to install.\nInstalling Fusuma this way means that if things do not work as intended during or after the installation, you are on your own.\nSo please do not bombard the Issues-Page here on Github if Fusuma isn't working correctly after installing it via the AUR.\nFusuma's plugins as listed below here in this Readme can be installed as optional dependencies also via the AUR, namescheme being `ruby-fusuma-replacewithnameofplugin`.\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>For Fedora\u003C\u002Fsummary>\n\n### For Fedora\n\n#### 1. Install libinput-tools\n\nYou need `libinput` release 1.0 or later.\n\n```sh\nsudo dnf install libinput\n```\n\n#### 2. Install Ruby\n\nFusuma runs in Ruby, so you must install it first.\n\n```sh\nsudo dnf install ruby\n```\n\n#### 3. Install Fusuma\n\n```sh\nsudo gem install fusuma\n```\n\n#### 4. Install xdotool (optional)\n\nFor sending shortcuts:\n\n```sh\nsudo dnf install xdotool\n```\n\u003C\u002Fdetails>\n\n### Touchpad not working in GNOME\n\nEnsure the touchpad events are being sent to the GNOME desktop by running the following command:\n\n```sh\ngsettings set org.gnome.desktop.peripherals.touchpad send-events enabled\n```\n\n## Usage\n\n```sh\nfusuma\n```\n\n## Update\n\n```sh\nsudo gem update fusuma\n```\n\n## Customize Gesture Mapping\n\nYou can customize the settings for gestures to put and edit `~\u002F.config\u002Ffusuma\u002Fconfig.yml`.\n**NOTE: You will need to create the `~\u002F.config\u002Ffusuma` directory if it doesn't exist yet.**\n\n```sh\nmkdir -p ~\u002F.config\u002Ffusuma        # create config directory\nnano ~\u002F.config\u002Ffusuma\u002Fconfig.yml # edit config file.\n```\n\n\n### Available gestures\n\n#### swipe:\n\n * support `3:`, `4:` fingers\n * support `left:`, `right:`, `up:`, `down:` directions\n * support `begin:`, `update:`, `end:` events\n\n#### pinch:\n\n * support `2:`, `3:`, `4:` fingers\n * support `in:`, `out:` directions\n * support `begin:`, `update:`, `end:` events\n\n#### rotate:\n\n * support `2:`, `3:`, `4:` fingers\n * support `clockwise:`,`counterclockwise:` directions\n * support `begin:`, `update:`, `end:` events\n\n#### hold:\n * require libinput version 1.19.0 or later\n * support `1:`, `2:`, `3:`, `4:` fingers\n * support `begin:`, `end:`, `cancelled:` events\n\n### About YAML Basic Syntax\n\n- Comments in YAML begins with the `#` character.\n- Comments must be separated from other tokens by whitespaces.\n- Indentation of whitespace is used to denote structure.\n- Tabs are not included as indentation for YAML files.\n\n### Example: Gesture Mapping for Ubuntu\n\nhttps:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma\u002Fwiki\u002FUbuntu\n\n```yaml\nswipe:\n  3:\n    left:\n      command: \"xdotool key alt+Right\" # History forward\n    right:\n      command: \"xdotool key alt+Left\" # History back\n    up:\n      command: \"xdotool key super\" # Activity\n    down:\n      command: \"xdotool key super\" # Activity\n  4:\n    left:\n      command: \"xdotool key ctrl+alt+Down\" # Switch to next workspace\n    right:\n      command: \"xdotool key ctrl+alt+Up\" # Switch to previous workspace\n    up:\n      command: \"xdotool key ctrl+alt+Down\" # Switch to next workspace\n    down:\n      command: \"xdotool key ctrl+alt+Up\" # Switch to previous workspace\npinch:\n  in:\n    command: \"xdotool keydown ctrl click 4 keyup ctrl\" # Zoom in\n  out:\n    command: \"xdotool keydown ctrl click 5 keyup ctrl\" # Zoom out\nhold:\n  4:\n    command: \"xdotool key super\" # Activity\n```\n\n### More Example of config.yml\n\nThe following wiki pages can be edited by everyone.\n\n- [Ubuntu](https:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma\u002Fwiki\u002FUbuntu)\n- [elementary OS](https:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma\u002Fwiki\u002Felementary-OS)\n- [i3](https:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma\u002Fwiki\u002Fi3)\n- [KDE to mimic MacOS](https:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma\u002Fwiki\u002FKDE-to-mimic-MacOS)\n- [Pop!_OS with Cinnamon](https:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma\u002Fwiki\u002FPOP-OS-with-Cinnamon)\n- [Pop!_OS Default Gnome](https:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma\u002Fwiki\u002FPopOS-Default-Gnome)\n- [Ubuntu OS to mimic Mac a little](https:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma\u002Fwiki\u002FUbuntu-OS-to-mimic-Mac-a-little)\n- [3 fingers Drag (OS X Style)](https:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma\u002Fwiki\u002F3-fingers-Drag-(OS-X-Style))\n- [3 fingers Alt Tab Switcher(Windows Style)](https:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma\u002Fwiki\u002F3-fingers-Alt-Tab-Switcher(Windows-Style))\n\nIf you have a nice configuration, please share `~\u002F.config\u002Ffusuma\u002Fconfig.yml` with everyone.\n\n### Threshold and Interval\n\nif `command:` properties are blank, the swipe\u002Fpinch\u002Fhold doesn't execute command.\n\n`threshold:` is sensitivity to swipe\u002Fpinch\u002Fhold. Default value is 1.\nIf the swipe's threshold is `0.5`, shorten swipe-length by half.\n\n`interval:` is delay between swipes\u002Fpinches\u002Fhold. Default value is 1.\nIf the swipe's interval is `0.5`, shorten swipe-interval by half to recognize a next swipe.\n\n### Example of `threshold:` \u002F `interval:` settings\n\n```yaml\nswipe:\n  3:\n    left:\n      command: 'xdotool key alt+Right' # threshold: 0.5, interval: 0.75\n      threshold: 0.5\n    right:\n      command: 'xdotool key alt+Left' # threshold: 0.5, interval: 0.75\n      threshold: 0.5\n    up:\n      command: 'xdotool key super' # threshold: 1, interval: 0.75\n    down:\n      command: 'xdotool key super' # threshold: 1, interval: 0.75\npinch:\n  2:\n    in:\n      command: \"xdotool keydown ctrl click 4 keyup ctrl\" # threshold: 0.5, interval: 0.5\n    out:\n      command: \"xdotool keydown ctrl click 5 keyup ctrl\" # threshold: 0.5, interval: 0.5\n\nthreshold:\n  pinch: 0.5\n\ninterval:\n  swipe: 0.75\n  pinch: 0.5\n```\n\nThere are three priorities of `threshold:` and `interval:`.\nThe individual `threshold:` and `interval:` settings (under \"direction\") have a higher priority than the global one (under \"root\")\n\n1. child elements in the direction (left\u002Fright\u002Fdown\u002Fup → threshold\u002Finterval)\n1. root child elements (threshold\u002Finterval → swipe\u002Fpinch\u002Fhold)\n1. default value (= 1)\n\n### `command:` property for assigning commands\n\nOn fusuma version 0.4 `command:` property is available!\nYou can assign any command each gestures.\n\n**`shortcut:` property is deprecated**, **it was removed on fusuma version 1.0**.\nYou need to replace to `command:` property.\n\n```diff\nswipe:\n  3:\n    left:\n-      shortcut: 'alt+Left'\n+      command: 'xdotool key alt+Left'\n    right:\n-      shortcut: 'alt+Right'\n+      command: 'xdotool key alt+Right'\n```\n\n### About xdotool\n\n- xdotool manual (https:\u002F\u002Fgithub.com\u002Fjordansissel\u002Fxdotool\u002Fblob\u002Fmaster\u002Fxdotool.pod)\n- Available keys' hint (https:\u002F\u002Fgithub.com\u002Fjordansissel\u002Fxdotool\u002Fissues\u002F212#issuecomment-406156157)\n\n**NOTE: xdotool has some issues**\n\n- Gestures take a few seconds to react(https:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma\u002Fissues\u002F113)\n\n#### Alternatives to xdotool\n\n- [fusuma-plugin-sendkey](https:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma-plugin-sendkey)\n  - Emulates keyboard events\n  - Low latency\n  - Wayland compatible\n\n- `xte`\n  - [xte(1) - Linux man page](https:\u002F\u002Flinux.die.net\u002Fman\u002F1\u002Fxte)\n  - install with `sudo apt install xautomation`\n\n- [ydotool](https:\u002F\u002Fgithub.com\u002FReimuNotMoe\u002Fydotool)\n  - Wayland compatible\n  - Needs more maintainers.\n\n\n\n## Options\n\n- `-c`, `--config=path\u002Fto\u002Ffile` : Use an alternative config file\n- `-d`, `--daemon` : Daemonize process\n- `-l`, `--list-devices` : List available devices\n- `-v`, `--verbose` : Show details about the results of running fusuma\n- `--version` : Show fusuma version\n- `--log-file=path\u002Fto\u002Ffile` : Set path of log file\n\n### Specify touchpads by device name\nSet the following options to recognize multi-touch gestures only for the specified touchpad device.\n\n```yaml\nplugin:\n  filters:\n    libinput_device_filter:\n      keep_device_names:\n        - \"BUILT-IN TOUCHPAD NAME\"\n        - \"EXTERNAL TOUCHPAD NAME\"\n```\n\n## Autostart\n\n### Method 1: Using gnome-session-properties\n\n1. Check the path where you installed fusuma with `which fusuma`\n2. Open `gnome-session-properties`\n3. Add Fusuma and enter the location where the above path was checked in the command input field\n4. Add the `-d` option at the end of the command input field\n\n### Method 2: Creating a Desktop Entry Manually\n\n1. Check the path where you installed fusuma with `which fusuma`\n2. Create a new file named `fusuma.desktop` in the `~\u002F.config\u002Fautostart\u002F` directory.\n3. Add the following content to the `fusuma.desktop` file:\n\n```ini\n[Desktop Entry]\nName=fusuma\nComment=run fusuma\nExec={path_to_fusuma} -d --log=\u002Ftmp\u002Ffusuma.log\nIcon=input-touchpad\nX-GNOME-Autostart-enabled=true\nType=Application\n```\n\n   Replace `{path_to_fusuma}` with the path obtained from `which fusuma`.\n4. Save the file and ensure its permissions are correctly set to be executable.\n5. Restart your system or session to verify that fusuma starts automatically.\n\n### Method 3: systemd user service\n\nUseful when you want fusuma to be supervised by systemd (auto-restart on failure, journal-based logs, start\u002Fstop with `systemctl --user`).\n\n1. Check the path where you installed fusuma with `which fusuma`\n2. Create `~\u002F.config\u002Fsystemd\u002Fuser\u002Ffusuma.service` with the following content. Replace `{path_to_fusuma}` with the path from step 1.\n\n```ini\n[Unit]\nDescription=Fusuma (multitouch gesture recognizer)\nDocumentation=https:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma\nPartOf=graphical-session.target\nAfter=graphical-session.target\n\n[Service]\nType=simple\nExecStart={path_to_fusuma}\nRestart=on-failure\nRestartSec=3\nStandardOutput=journal\nStandardError=journal\n\n[Install]\nWantedBy=graphical-session.target\n```\n\n3. Reload, enable, and start the service:\n\n```sh\nsystemctl --user daemon-reload\nsystemctl --user enable --now fusuma.service\n```\n\n4. Verify it is running and inspect logs:\n\n```sh\nsystemctl --user status fusuma.service\njournalctl --user -u fusuma.service -f\n```\n\nNotes:\n\n- Do not pass `-d` \u002F `--daemon`; systemd manages the process itself, so fusuma should run in the foreground (`Type=simple`).\n- Make sure your user is in the `input` group (see [Grant permission to read the touchpad device](#grant-permission-to-read-the-touchpad-device)).\n- `graphical-session.target` is started by your desktop session manager. If the service does not start at login, your session may not pull the target in — replace both `graphical-session.target` lines with `default.target`, or start the service manually with `systemctl --user start fusuma.service`.\n- If you installed fusuma via a Ruby version manager (rbenv, asdf, mise, etc.), `which fusuma` returns a shim that relies on the manager's `PATH`. Resolve the real binary with `readlink -f $(which fusuma)` and use that as `ExecStart`.\n\n## Fusuma Plugins\n\nFusuma's functionality can be extended with a variety of plugins. Below is a list of available plugins along with their purposes:\n\n### Available Plugins\n\nFusuma plugins are provided with the `fusuma-plugin-XXXXX` naming convention and hosted on [RubyGems](https:\u002F\u002Frubygems.org\u002Fsearch?utf8=%E2%9C%93&query=fusuma-plugins).\n\n| Name                                                                               | Version                                                                         | About                                                        |\n| ---                                                                                | ---                                                                             | ---                                                          |\n| [fusuma-plugin-sendkey](https:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma-plugin-sendkey)       | ![Gem](https:\u002F\u002Fimg.shields.io\u002Fgem\u002Fv\u002Ffusuma-plugin-sendkey?color=brightgreen)    | Emulates keyboard events(Wayland compatible)                 |\n| [fusuma-plugin-wmctrl](https:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma-plugin-wmctrl)         | ![Gem](https:\u002F\u002Fimg.shields.io\u002Fgem\u002Fv\u002Ffusuma-plugin-wmctrl?color=brightgreen)     | Manages Window and Workspace                                 |\n| [fusuma-plugin-keypress](https:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma-plugin-keypress)     | ![Gem](https:\u002F\u002Fimg.shields.io\u002Fgem\u002Fv\u002Ffusuma-plugin-keypress?color=brightgreen)   | Detecting a combination of key presses and touchpad gestures |\n| [fusuma-plugin-appmatcher](https:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma-plugin-appmatcher) | ![Gem](https:\u002F\u002Fimg.shields.io\u002Fgem\u002Fv\u002Ffusuma-plugin-appmatcher?color=brightgreen) | Configure app-specific gestures                              |\n| [fusuma-plugin-thumbsense](https:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma-plugin-thumbsense) | ![Gem](https:\u002F\u002Fimg.shields.io\u002Fgem\u002Fv\u002Ffusuma-plugin-thumbsense?color=brightgreen) | Remapper from key to click only while tapping                |\n\n\n### Installation of Fusuma plugins\n\n```sh\n# install fusuma-plugin-XXXXX\nsudo gem install fusuma-plugin-XXXXX\n```\n```sh\n# update\nsudo gem list fusuma-plugin- | cut -d' ' -f1 | xargs --no-run-if-empty sudo gem update\n```\n\n## Tutorial Video\n\n[![Multitouch Touchpad Gestures in Linux with Fusuma](http:\u002F\u002Fimg.youtube.com\u002Fvi\u002Fbn11Iwvf29I\u002F0.jpg)](http:\u002F\u002Fwww.youtube.com\u002Fwatch?v=bn11Iwvf29I \"Multitouch Touchpad Gestures in Linux with Fusuma\")  \n[Multitouch Touchpad Gestures in Linux with Fusuma](http:\u002F\u002Fwww.youtube.com\u002Fwatch?v=bn11Iwvf29I) by [Eric Adams](https:\u002F\u002Fwww.youtube.com\u002Fuser\u002Figster75)\n\n### Support and Sponsorship\n\nIf you enjoy working on Fusuma or find it beneficial, consider supporting the developer through [GitHub Sponsors](https:\u002F\u002Fgithub.com\u002Fsponsors\u002Fiberianpig).\n\nI'm a Freelance Engineer in Japan and working on these products after finishing my regular work or on my holidays.\nCurrently, my open-source contribution times is not enough.\nIf you like my work and want to contribute and become a sponsor, I will be able to focus on my projects.\n\n## Development\n\n### Type Checking\n\nFusuma uses [RBS](https:\u002F\u002Fgithub.com\u002Fruby\u002Frbs) for type signatures and [Steep](https:\u002F\u002Fgithub.com\u002Fsoutaro\u002Fsteep) for type checking.\n\n#### Running Type Checks\n\n```sh\n# Generate RBS signatures and run type checking\nbundle exec rake rbs:generate && bundle exec steep check\n\n# Validate RBS files\nbundle exec rake rbs:validate\n\n# Generate inline RBS from code comments\nbundle exec rbs-inline --opt-out lib --output --base .\n```\n\n#### RBS Development\n\nThe project uses both traditional RBS files and inline RBS comments:\n- Inline RBS comments in source code (processed by `rbs-inline`)\n- Generated RBS files in `sig\u002Fgenerated\u002F`\n- Type checking via Steep with configuration in `Steepfile`\n\n## Contributing\n\nBug reports and pull requests are welcome on GitHub at https:\u002F\u002Fgithub.com\u002Fiberianpig\u002Ffusuma. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http:\u002F\u002Fcontributor-covenant.org) code of conduct.\n\n## License\n\nThe gem is available as open source under the terms of the [MIT License](http:\u002F\u002Fopensource.org\u002Flicenses\u002FMIT).\n","Fusuma 是一个用于在 Linux 系统上实现多点触控手势识别的工具，通过 libinput 驱动程序支持滑动、捏合等手势操作。其核心功能包括简易安装（通过 RubyGems）、灵活配置（使用 YAML 文件自定义手势和动作）、可调节灵敏度设置以及插件扩展能力，允许用户根据个人喜好调整手势识别精度并添加额外功能。适合需要提升工作效率或改善交互体验的笔记本电脑及带触控板设备用户，在日常办公、编程开发等场景下尤为适用。",2,"2026-06-11 03:14:28","top_language"]