From cdbf8df0b8d1c3735e64cb70e4d1c0f0a73c5c59 Mon Sep 17 00:00:00 2001 From: jub3i Date: Mon, 6 Jul 2015 04:39:13 +0200 Subject: [PATCH 1/6] get and set display name for XOpenDisplay() --- src/robotjs.cc | 28 ++++++++++++++++++++++++++++ src/xdisplay.c | 26 +++++++++++++++++++++++++- src/xdisplay.h | 12 ++++++++++++ 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/robotjs.cc b/src/robotjs.cc index f1a1d311..eb1b75bb 100644 --- a/src/robotjs.cc +++ b/src/robotjs.cc @@ -2,6 +2,7 @@ #include #include #include +#include "string.h" #include "mouse.h" #include "deadbeef_rand.h" #include "keypress.h" @@ -10,6 +11,7 @@ #include "MMBitmap.h" #include "snprintf.h" #include "microsleep.h" +#include "xdisplay.h" using namespace v8; @@ -678,6 +680,26 @@ NAN_METHOD(getScreenSize) info.GetReturnValue().Set(obj); } +NAN_METHOD(getXDisplayName) +{ + NanScope(); + NanReturnValue(NanNew(getXDisplay())); +} + +NAN_METHOD(setXDisplayName) +{ + NanScope(); + + //Convert arg to c-string + //NOTE: surely better way to go from v8::String to char* ? + std::string name = + std::string(*v8::String::Utf8Value(args[0]->ToString())); + char *display_name = strdup(name.c_str()); + + setXDisplay(display_name); + NanReturnUndefined(); +} + NAN_METHOD(captureScreen) { size_t x; @@ -850,6 +872,12 @@ NAN_MODULE_INIT(InitAll) Nan::Set(target, Nan::New("getColor").ToLocalChecked(), Nan::GetFunction(Nan::New(getColor)).ToLocalChecked()); + + Nan::Set(target, Nan::New("getXDisplayName").ToLocalChecked(), + Nan::GetFunction(Nan::New(getXDisplayName)).ToLocalChecked()); + + Nan::Set(target, Nan::New("setXDisplayName").ToLocalChecked(), + Nan::GetFunction(Nan::New(setXDisplayName)).ToLocalChecked()); } NODE_MODULE(robotjs, InitAll) diff --git a/src/xdisplay.c b/src/xdisplay.c index 0df49013..20b8a023 100644 --- a/src/xdisplay.c +++ b/src/xdisplay.c @@ -4,11 +4,25 @@ static Display *mainDisplay = NULL; static int registered = 0; +static char *display_name = ":0.0"; +static int display_name_changed = 0; Display *XGetMainDisplay(void) { + /* Close the display if display_name has changed */ + if (display_name_changed) { + XCloseMainDisplay(); + } + display_name_changed = 0; + if (mainDisplay == NULL) { - mainDisplay = XOpenDisplay(NULL); + /* First try the user set display_name */ + mainDisplay = XOpenDisplay(display_name); + + /* Then try using environment variable DISPLAY */ + if (mainDisplay == NULL) { + mainDisplay = XOpenDisplay(NULL); + } if (mainDisplay == NULL) { fputs("Could not open main display\n", stderr); @@ -28,3 +42,13 @@ void XCloseMainDisplay(void) mainDisplay = NULL; } } + +char *getXDisplay(void) +{ + return display_name; +} + +void setXDisplay(char *name) { + display_name = name; + display_name_changed = 1; +} diff --git a/src/xdisplay.h b/src/xdisplay.h index c965ced7..3c8663c2 100644 --- a/src/xdisplay.h +++ b/src/xdisplay.h @@ -14,4 +14,16 @@ Display *XGetMainDisplay(void); /* Closes the main display if it is open, or does nothing if not. */ void XCloseMainDisplay(void); +#ifdef __cplusplus +extern "C" +{ +#endif + +char *getXDisplay(void); +void setXDisplay(char *name); + +#ifdef __cplusplus +} +#endif + #endif /* XDISPLAY_H */ From 0e457bae03189ee4c1fd17071e760f08b5c49b1c Mon Sep 17 00:00:00 2001 From: jub3i Date: Mon, 6 Jul 2015 08:04:00 +0200 Subject: [PATCH 2/6] improve variable names, move hasDisplayNameChanged reset --- src/xdisplay.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/xdisplay.c b/src/xdisplay.c index 20b8a023..6c51be45 100644 --- a/src/xdisplay.c +++ b/src/xdisplay.c @@ -4,20 +4,20 @@ static Display *mainDisplay = NULL; static int registered = 0; -static char *display_name = ":0.0"; -static int display_name_changed = 0; +static char *displayName = ":0.0"; +static int hasDisplayNameChanged = 0; Display *XGetMainDisplay(void) { - /* Close the display if display_name has changed */ - if (display_name_changed) { + /* Close the display if displayName has changed */ + if (hasDisplayNameChanged) { XCloseMainDisplay(); + hasDisplayNameChanged = 0; } - display_name_changed = 0; if (mainDisplay == NULL) { - /* First try the user set display_name */ - mainDisplay = XOpenDisplay(display_name); + /* First try the user set displayName */ + mainDisplay = XOpenDisplay(displayName); /* Then try using environment variable DISPLAY */ if (mainDisplay == NULL) { @@ -45,10 +45,10 @@ void XCloseMainDisplay(void) char *getXDisplay(void) { - return display_name; + return displayName; } void setXDisplay(char *name) { - display_name = name; - display_name_changed = 1; + displayName = name; + hasDisplayNameChanged = 1; } From 4501a8b88656aad1ad5001280d4d8a9c30a895a3 Mon Sep 17 00:00:00 2001 From: jub3i Date: Thu, 16 Jul 2015 11:23:00 +0200 Subject: [PATCH 3/6] better argument parsing --- src/robotjs.cc | 9 ++------- src/xdisplay.c | 2 +- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/robotjs.cc b/src/robotjs.cc index eb1b75bb..b03d5742 100644 --- a/src/robotjs.cc +++ b/src/robotjs.cc @@ -2,7 +2,6 @@ #include #include #include -#include "string.h" #include "mouse.h" #include "deadbeef_rand.h" #include "keypress.h" @@ -690,13 +689,9 @@ NAN_METHOD(setXDisplayName) { NanScope(); - //Convert arg to c-string - //NOTE: surely better way to go from v8::String to char* ? - std::string name = - std::string(*v8::String::Utf8Value(args[0]->ToString())); - char *display_name = strdup(name.c_str()); + NanUtf8String name(args[0]); + setXDisplay(*name); - setXDisplay(display_name); NanReturnUndefined(); } diff --git a/src/xdisplay.c b/src/xdisplay.c index 6c51be45..ec57f6ad 100644 --- a/src/xdisplay.c +++ b/src/xdisplay.c @@ -49,6 +49,6 @@ char *getXDisplay(void) } void setXDisplay(char *name) { - displayName = name; + displayName = strdup(name); hasDisplayNameChanged = 1; } From 9257211e4a35d4d51f55bb52ed7c6612d9bd59f2 Mon Sep 17 00:00:00 2001 From: jub3i Date: Thu, 16 Jul 2015 11:23:13 +0200 Subject: [PATCH 4/6] change function style, matching rest of code --- src/xdisplay.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/xdisplay.c b/src/xdisplay.c index ec57f6ad..8f0dc8c9 100644 --- a/src/xdisplay.c +++ b/src/xdisplay.c @@ -48,7 +48,8 @@ char *getXDisplay(void) return displayName; } -void setXDisplay(char *name) { +void setXDisplay(char *name) +{ displayName = strdup(name); hasDisplayNameChanged = 1; } From 91cd9ce9ef54575d1ef80724eea94bfce1d73e15 Mon Sep 17 00:00:00 2001 From: jub3i Date: Thu, 16 Jul 2015 12:06:17 +0200 Subject: [PATCH 5/6] fix os compatibility --- src/robotjs.cc | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/robotjs.cc b/src/robotjs.cc index b03d5742..7585fffb 100644 --- a/src/robotjs.cc +++ b/src/robotjs.cc @@ -10,7 +10,9 @@ #include "MMBitmap.h" #include "snprintf.h" #include "microsleep.h" -#include "xdisplay.h" +#if defined(USE_X11) + #include "xdisplay.h" +#endif using namespace v8; @@ -682,17 +684,25 @@ NAN_METHOD(getScreenSize) NAN_METHOD(getXDisplayName) { NanScope(); + + #if defined(USE_X11) NanReturnValue(NanNew(getXDisplay())); + #else + NanThrowError("getXDisplayName is only supported on Linux"); + #endif } NAN_METHOD(setXDisplayName) { NanScope(); + #if defined(USE_X11) NanUtf8String name(args[0]); setXDisplay(*name); - - NanReturnUndefined(); + NanReturnValue(NanNew("1")); + #else + NanThrowError("setXDisplayName is only supported on Linux"); + #endif } NAN_METHOD(captureScreen) From 3f3dc7b3785ca9ccd9c75e1104c75ed103d9c274 Mon Sep 17 00:00:00 2001 From: Michael Eden Date: Wed, 1 Jun 2016 23:05:35 +0400 Subject: [PATCH 6/6] updated jub3i's code to work with new nan, fixes #153 --- src/robotjs.cc | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/robotjs.cc b/src/robotjs.cc index 7585fffb..7c1e668d 100644 --- a/src/robotjs.cc +++ b/src/robotjs.cc @@ -683,25 +683,22 @@ NAN_METHOD(getScreenSize) NAN_METHOD(getXDisplayName) { - NanScope(); - #if defined(USE_X11) - NanReturnValue(NanNew(getXDisplay())); + const char* display = getXDisplay(); + info.GetReturnValue().Set(Nan::New(display).ToLocalChecked()); #else - NanThrowError("getXDisplayName is only supported on Linux"); + Nan::ThrowError("getXDisplayName is only supported on Linux"); #endif } NAN_METHOD(setXDisplayName) { - NanScope(); - #if defined(USE_X11) - NanUtf8String name(args[0]); - setXDisplay(*name); - NanReturnValue(NanNew("1")); + Nan::Utf8String string(info[0]); + setXDisplay(*string); + info.GetReturnValue().Set(Nan::New(1)); #else - NanThrowError("setXDisplayName is only supported on Linux"); + Nan::ThrowError("setXDisplayName is only supported on Linux"); #endif }