Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .clang-format
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
BasedOnStyle: Google
IndentWidth: 2

AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortEnumsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Empty
AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine: Empty
AllowShortLoopsOnASingleLine: false
DerivePointerAlignment: false
PointerAlignment: Left
33 changes: 23 additions & 10 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,16 @@ const path = require("path");
const shortcut = require("windows-shortcuts");
const lib = require("bindings")("serenade-driver.node");

const defaultKeyDelay = () => {
if (os.platform() == "darwin") {
return 8;
} else if (os.platform() == "win32") {
return 2;
}

return 3;
};

const applicationMatches = (application, possible, aliases) => {
let alias = application;
if (aliases && aliases[application]) {
Expand Down Expand Up @@ -105,10 +115,6 @@ exports.getEditorState = () => {
return lib.getEditorState();
};

exports.getEditorStateFallback = (paragraph) => {
return lib.getEditorStateFallback(!!paragraph);
};

exports.getInstalledApplications = async () => {
const search = async (root, depth, max) => {
let result = [];
Expand Down Expand Up @@ -150,8 +156,7 @@ exports.getInstalledApplications = async () => {
max
)
)
.concat(await search("C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs", 0, max)
);
.concat(await search("C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs", 0, max));
}

return Promise.resolve([]);
Expand Down Expand Up @@ -226,11 +231,15 @@ exports.mouseUp = (button) => {
return lib.mouseUp(button);
};

exports.pressKey = (key, modifiers, count) => {
exports.pressKey = (key, modifiers, count, delay) => {
if (!modifiers) {
modifiers = [];
}

if (delay === undefined) {
delay = defaultKeyDelay();
}

if (count === undefined || count === false) {
count = 1;
}
Expand All @@ -239,7 +248,7 @@ exports.pressKey = (key, modifiers, count) => {
return;
}

return lib.pressKey(key, modifiers, count);
return lib.pressKey(key, modifiers, count, delay);
};

exports.quitApplication = async (application, aliases) => {
Expand Down Expand Up @@ -301,10 +310,14 @@ exports.setMouseLocation = (x, y) => {
return lib.setMouseLocation(x, y);
};

exports.typeText = (text) => {
exports.typeText = (text, delay) => {
if (!text) {
return;
}

return lib.typeText(text);
if (delay === undefined) {
delay = defaultKeyDelay();
}

return lib.typeText(text, delay);
};
37 changes: 7 additions & 30 deletions src/driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -155,30 +155,6 @@ Napi::Promise GetEditorState(const Napi::CallbackInfo& info) {
return deferred.Promise();
}

Napi::Promise GetEditorStateFallback(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
Napi::Promise::Deferred deferred = Napi::Promise::Deferred::New(env);

bool paragraph = info[0].As<Napi::Boolean>().Value();

#ifdef __linux__
Display* display = XOpenDisplay(NULL);
std::tuple<std::string, int, bool> state = driver::GetEditorStateFallback(display, paragraph);
XCloseDisplay(display);
#else
std::tuple<std::string, int, bool> state;
AUTORELEASE(state = driver::GetEditorStateFallback(paragraph));
#endif

Napi::Object result = Napi::Object::New(env);
result.Set("text", std::get<0>(state));
result.Set("cursor", std::get<1>(state));
result.Set("error", std::get<2>(state));
deferred.Resolve(result);

return deferred.Promise();
}

Napi::Promise GetMouseLocation(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
Napi::Promise::Deferred deferred = Napi::Promise::Deferred::New(env);
Expand Down Expand Up @@ -247,6 +223,8 @@ Napi::Promise PressKey(const Napi::CallbackInfo& info) {

Napi::Array modifierArray = info[1].As<Napi::Array>();
int count = info[2].As<Napi::Number>().Int32Value();
int delay = info[3].As<Napi::Number>().Int32Value();

if (count < 1) {
deferred.Resolve(env.Undefined());
return deferred.Promise();
Expand All @@ -264,9 +242,9 @@ Napi::Promise PressKey(const Napi::CallbackInfo& info) {

for (int i = 0; i < count; i++) {
#ifdef __linux__
driver::PressKey(display, info[0].As<Napi::String>().Utf8Value(), modifiers);
driver::PressKey(display, info[0].As<Napi::String>().Utf8Value(), modifiers, delay);
#else
AUTORELEASE(driver::PressKey(info[0].As<Napi::String>().Utf8Value(), modifiers));
AUTORELEASE(driver::PressKey(info[0].As<Napi::String>().Utf8Value(), modifiers, delay));
#endif
}

Expand Down Expand Up @@ -309,16 +287,17 @@ Napi::Promise TypeText(const Napi::CallbackInfo& info) {

std::vector<std::string> modifiers;
std::string text = info[0].As<Napi::String>().Utf8Value();
int delay = info[1].As<Napi::Number>().Int32Value();

#ifdef __linux__
Display* display = XOpenDisplay(NULL);
#endif

for (char c : text) {
#ifdef __linux__
driver::PressKey(display, std::string(1, c), modifiers);
driver::PressKey(display, std::string(1, c), modifiers, delay);
#else
AUTORELEASE(driver::PressKey(std::string(1, c), modifiers));
AUTORELEASE(driver::PressKey(std::string(1, c), modifiers, delay));
#endif
}

Expand All @@ -342,8 +321,6 @@ Napi::Object Init(Napi::Env env, Napi::Object exports) {
exports.Set(Napi::String::New(env, "getClickableButtons"),
Napi::Function::New(env, GetClickableButtons));
exports.Set(Napi::String::New(env, "getEditorState"), Napi::Function::New(env, GetEditorState));
exports.Set(Napi::String::New(env, "getEditorStateFallback"),
Napi::Function::New(env, GetEditorStateFallback));
exports.Set(Napi::String::New(env, "getMouseLocation"),
Napi::Function::New(env, GetMouseLocation));
exports.Set(Napi::String::New(env, "getRunningApplications"),
Expand Down
1 change: 0 additions & 1 deletion src/driver.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ Napi::Promise GetActiveApplication(const Napi::CallbackInfo& info);
Napi::Promise GetActiveApplicationWindowBounds(const Napi::CallbackInfo& info);
Napi::Promise GetClickableButtons(const Napi::CallbackInfo& info);
Napi::Promise GetEditorState(const Napi::CallbackInfo& info);
Napi::Promise GetEditorStateFallback(const Napi::CallbackInfo& info);
Napi::Promise GetMouseLocation(const Napi::CallbackInfo& info);
Napi::Promise GetRunningApplications(const Napi::CallbackInfo& info);
Napi::Promise MouseDown(const Napi::CallbackInfo& info);
Expand Down
32 changes: 2 additions & 30 deletions src/linux.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -176,34 +176,6 @@ std::tuple<std::string, int, bool> GetEditorState(Display* display) {
return result;
}

std::tuple<std::string, int, bool> GetEditorStateFallback(Display* display,
bool paragraph) {
std::tuple<std::string, int, bool> result;

unsigned long color = BlackPixel(display, DefaultScreen(display));
Window window = XCreateSimpleWindow(display, DefaultRootWindow(display), 0, 0,
1, 1, 0, color, color);

PressKey(display, paragraph ? "up" : "home",
std::vector<std::string>{"control", "shift"});
PressKey(display, "c", std::vector<std::string>{"control"});
usleep(10000);
PressKey(display, "right", std::vector<std::string>{});
std::string left = GetClipboard(display, window);

PressKey(display, paragraph ? "down" : "end",
std::vector<std::string>{"control", "shift"});
PressKey(display, "c", std::vector<std::string>{"control"});
usleep(10000);
PressKey(display, "left", std::vector<std::string>{});
std::string right = GetClipboard(display, window);

std::get<0>(result) = left + right;
std::get<1>(result) = left.length();
std::get<2>(result) = false;
return result;
}

std::tuple<int, bool, bool> GetKeycodeAndModifiers(Display* display,
const std::string& key) {
std::tuple<int, bool, bool> result;
Expand Down Expand Up @@ -453,7 +425,7 @@ void MouseUp(Display* display, const std::string& button) {
}

void PressKey(Display* display, std::string key,
std::vector<std::string> modifiers) {
std::vector<std::string> modifiers, int delay) {
std::tuple<int, bool, bool> keycodeAndModifiers =
GetKeycodeAndModifiers(display, key);
int keycode = std::get<0>(keycodeAndModifiers);
Expand Down Expand Up @@ -489,7 +461,7 @@ void PressKey(Display* display, std::string key,
ToggleKey(display, "shift", false);
}

usleep(3000);
usleep(delay * 1000);
}

std::string ProcessName(Display* display, Window window) {
Expand Down
4 changes: 1 addition & 3 deletions src/linux.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ std::tuple<int, int, int, int> GetActiveApplicationWindowBounds();
std::vector<Window> GetAllWindows(Display* display);
std::string GetClipboard(Display* display, Window window);
std::tuple<std::string, int, bool> GetEditorState(Display* display);
std::tuple<std::string, int, bool> GetEditorStateFallback(Display* display,
bool paragraph);
std::tuple<int, bool, bool> GetKeycodeAndModifiers(Display* display,
const std::string& key);
std::tuple<int, int> GetMouseLocation();
Expand All @@ -25,7 +23,7 @@ std::vector<std::string> GetRunningApplications();
void MouseDown(Display* display, const std::string& button);
void MouseUp(Display* display, const std::string& button);
void PressKey(Display* display, std::string key,
std::vector<std::string> modifiers);
std::vector<std::string> modifiers, int delay);
std::string ProcessName(Display* display, Window window);
void SetMouseLocation(int x, int y);
void ToggleKey(Display* display, const std::string& key, bool down);
Expand Down
Loading