New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details
Socket
Book a DemoSign in
Socket

xdotool

Package Overview
Dependencies
Maintainers
1
Versions
51
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

xdotool

C++ bindings for Node.js to handle X11 using the full power of libxdo.

latest
npmnpm
Version
2.0.3
Version published
Maintainers
1
Created
Source

xdotool

C++ bindings for Node.js to handle X11 using the full power of libxdo.

Installation

yarn add xdotool

Examples

Key logging

A few lines of code and you're able to spy what key strokes are being pressed on the keyboard:

const bindings = new XdoToolBindings();
const kbd = new KeyboardAsync(bindings);
while(true) { // Keeps printing until you kill the process
    const buffer = Buffer.from(await kbd.queryKeymap(), 0, 32);
    for(let j = 0; j < 32; j++) {
        for(let h = 0; h < 8; h++) {
            if(buffer[j] & (1 << h)) {
                const keycode = j * 8 + h;
                const keysym = kbd.keycodeToKeysym(keycode);
                console.log(kbd.keysymToString(keysym));
            }
        }
    }
}

Activate window

In the example below we look for windows with the name of Visual Studio Code. If any valid match is found, we focus it.

import { XdoToolAsync, XdoToolBindings } from 'xdotool';

// Activate Visual Studio Code window
function activateVisualStudioCodeWindow() {
    const xdo = new XdoToolAsync(new XdoToolBindings());
    const windows = await xdo.searchWindows({
        winclassname: 'Visual Studio Code'
    });
    for(const w of windows) {
        if(!(await xdo.windowHasProperty(w, '_NET_WM_DESKTOP'))) {
            continue;
        }
        await xdo.activateWindow(w);
        break;
    }
}

Screenshot

Our X11-based screenshooter is only capable of returning raw 8-bit RGB image format data at the moment but it is very fast and memory efficient. Getting a screenshot is super simple:

import { ScreenshooterAsync, XdoToolBindings } from 'xdotool';
import { promises as fs } from 'fs';

async function screenshot() {
    const xdo = new XdoToolBindings();
    const screenshooter = new ScreenshooterAsync(xdo);
    const arrayBuffer = await screenshooter.getImage();
    fs.writeFile(`${__dirname}/screenshot_${new Date()}.rgb`, Buffer.from(arrayBuffer));
}

For obvious reasons, the ArrayBuffer returned by screenshooter.getImage is reused on every call. So, unless you create a new instance of screenshooter, if you try to keep the reference, it'll be changed if you're calling this method elsewhere at the same time.

Requirements

  • Boost
  • CMake
  • libx11
  • xdotool

Keywords

x11

FAQs

Package last updated on 29 Jan 2026

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts