Closed GoogleCodeExporter closed 9 years ago
Looks like their is a large overhaul in the accessibility API for 10.9; I will
put in a patch shortly. Updated code is now hosted on github, see
https://github.com/kwhat
Original comment by a...@1stleg.com
on 11 Dec 2013 at 6:25
Thanks - I'll follow the project on GitHub. I cloned from GitHub and tried to
build with ant and found that I had to run "brew install automake" to get past
this:
bootstrap-libuiohook:
[echo] Bootstrapping libUIOHook...
[autoreconf] autoreconf --verbose --force --install
[autoreconf] sh: autoreconf: command not found
once I had installed automake I ran into this:
[autoreconf] configure.ac:94: error: possibly undefined macro:
AC_LIBTOOL_WIN32_DLL
[autoreconf] If this token and others are legitimate, please use
m4_pattern_allow.
[autoreconf] See the Autoconf documentation.
[autoreconf] configure.ac:99: error: possibly undefined macro: AC_PROG_LIBTOOL
[autoreconf] autoreconf: /usr/local/Cellar/autoconf/2.69/bin/autoconf failed
with exit status: 1
Original comment by J...@joncrowell.org
on 11 Dec 2013 at 6:43
Correct, version 1.2 (github) will require autoconf, libtool, pkgconfig and gcc
to compile. I have only tested the build system on Linux at this point. Apple
is next ;)
Original comment by a...@1stleg.com
on 11 Dec 2013 at 7:17
Something like this should do the trick if you would like to backport.
// Required to dynamically check for AXIsProcessTrustedWithOptions availability.
// FIXME Move to osx_input_helper.h after testing.
extern Boolean AXIsProcessTrustedWithOptions(CFDictionaryRef options)
__attribute__((weak_import));
extern CFStringRef kAXTrustedCheckOptionPrompt __attribute__((weak_import));
...
bool accessibilityEnabled = false;
// Check and make sure assistive devices is enabled.
if (AXIsProcessTrustedWithOptions != NULL) {
// 10.9 and later
const void * keys[] = { kAXTrustedCheckOptionPrompt };
const void * values[] = { kCFBooleanTrue };
CFDictionaryRef options = CFDictionaryCreate(
kCFAllocatorDefault,
keys,
values,
sizeof(keys) / sizeof(*keys),
&kCFCopyStringDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
accessibilityEnabled = AXIsProcessTrustedWithOptions(options);
}
else {
// 10.8 and older
accessibilityEnabled = AXAPIEnabled();
}
if (accessibilityEnabled == true) {
Original comment by a...@1stleg.com
on 11 Dec 2013 at 9:22
Thanks. I would like to backport. I tried adding the code you provided in
src/native/osx/NativeThread.c
You can see the modified file in this non-public gist:
https://gist.github.com/jononomo/84e25d53a6b15bcd8217
Unfortunately, the "ant all" command still gives a compilation error. So I
adjusted the file to simply not include the problematic line, as can be seen in
the comment on the gist.
Original comment by J...@joncrowell.org
on 12 Dec 2013 at 2:00
I figured it would probably still warn. The only way to get rid of that would
be to use something like dlopen() with dlsym() to try and dynamically check for
and call the appropriate function. The code above will work with the new 10.9
method and fallback to the deprecated function only if it is unavailable. To
force it to compile modify the generated build.properties file and modify the
native.cc.args line to either remove the -Werror flag or add either
-Wno-deprecated or -Wno-deprecated-declarations after -Wextra. Let me know
which (if any) of those flags works for you. I will look into a better
solution in the near future.
Original comment by a...@1stleg.com
on 12 Dec 2013 at 3:18
One more thing; Please let me know if you get prompted to allow for
accessibility with the patch in place on 10.9. You may need to disable it
globally but I am not exactly sure. I don't have a mac new enough to run 10.9
so I have no way to test the AXIsProcessTrustedWithOptions function. Thanks!
Original comment by a...@1stleg.com
on 12 Dec 2013 at 3:38
I have better patch in place now. It doesnt quite work the way I would like it
to but it will do for now.
#ifndef USE_WEAK_IMPORT
#include <dlfcn.h>
#endif
...
// FIXME Move to osx_input_helper.h after testing.
#ifdef USE_WEAK_IMPORT
// Required to dynamically check for AXIsProcessTrustedWithOptions availability.
extern Boolean AXIsProcessTrustedWithOptions(CFDictionaryRef options)
__attribute__((weak_import));
extern CFStringRef kAXTrustedCheckOptionPrompt __attribute__((weak_import));
#else
typedef Boolean (*AXIsProcessTrustedWithOptions_t)(CFDictionaryRef options);
typedef Boolean (*AXAPIEnabled_t)(void);
#endif
...
bool accessibilityEnabled = false;
// FIXME Move to osx_input_helper.h after testing.
#ifdef USE_WEAK_IMPORT
// Check and make sure assistive devices is enabled.
if (AXIsProcessTrustedWithOptions != NULL) {
// New accessibility API 10.9 and later.
const void * keys[] = { kAXTrustedCheckOptionPrompt };
const void * values[] = { kCFBooleanTrue };
CFDictionaryRef options = CFDictionaryCreate(
kCFAllocatorDefault,
keys,
values,
sizeof(keys) / sizeof(*keys),
&kCFCopyStringDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
accessibilityEnabled = AXIsProcessTrustedWithOptions(options);
}
else {
// Old accessibility check 10.8 and older.
accessibilityEnabled = AXAPIEnabled();
}
#else
const char *dlError = NULL;
void *libApplicaitonServices = dlopen("/System/Library/Frameworks/ApplicationServices.framework/ApplicationServices", RTLD_LAZY);
dlError = dlerror();
if (libApplicaitonServices != NULL && dlError == NULL) {
// Check for the new function AXIsProcessTrustedWithOptions().
AXIsProcessTrustedWithOptions_t fpAXIsProcessTrustedWithOptions = (AXIsProcessTrustedWithOptions_t) dlsym(libApplicaitonServices, "AXIsProcessTrustedWithOptions");
dlError = dlerror();
if (fpAXIsProcessTrustedWithOptions != NULL && dlError == NULL) {
// New accessibility API 10.9 and later.
const void * keys[] = { kAXTrustedCheckOptionPrompt };
const void * values[] = { kCFBooleanTrue };
CFDictionaryRef options = CFDictionaryCreate(
kCFAllocatorDefault,
keys,
values,
sizeof(keys) / sizeof(*keys),
&kCFCopyStringDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
accessibilityEnabled = (*fpAXIsProcessTrustedWithOptions)(options);
}
else {
logger(LOG_LEVEL_DEBUG, "%s [%u]: Failed to locate AXIsProcessTrustedWithOptions(). (%s)\n",
__FUNCTION__, __LINE__, dlError);
// Check for the fallback function AXAPIEnabled().
AXAPIEnabled_t fpAXAPIEnabled = (AXAPIEnabled_t) dlsym(libApplicaitonServices, "AXAPIEnabled");
dlError = dlerror();
if (fpAXAPIEnabled != NULL && dlError == NULL) {
// Old accessibility check 10.8 and older.
accessibilityEnabled = (*fpAXAPIEnabled)();
}
else {
// Could not load the AXAPIEnabled function!
logger(LOG_LEVEL_ERROR, "%s [%u]: Failed to locate AXAPIEnabled()! (%s)\n",
__FUNCTION__, __LINE__, dlError);
}
}
dlclose(libApplicaitonServices);
}
else {
// Could not load the ApplicationServices framework!
logger(LOG_LEVEL_ERROR, "%s [%u]: Failed to lazy load the ApplicationServices framework! (%s)\n",
__FUNCTION__, __LINE__, dlError);
}
#endif
if (accessibilityEnabled == true) {
Original comment by a...@1stleg.com
on 13 Dec 2013 at 1:05
Thanks for the improved patch. I did get prompted to allow accessibility when
I finally got the code to run on my computer. It prompts you to open Security
and Privacy settings in System Preferences and give the app access from there.
Since I launched the java app from iTerm, I guess it thinks iTerm is the app
that wants the access. It automatically added iTerm to the list of apps that
want to be able to "control your computer" and prompted me to grant it access.
Screenshot attached.
Original comment by J...@joncrowell.org
on 13 Dec 2013 at 1:52
Attachments:
Original comment by a...@1stleg.com
on 13 Dec 2013 at 1:56
[deleted comment]
Hi,
Can someone post a compiled version of all of this? at leats all the OSX lib.
Thx a lots!
Original comment by sebastie...@gmail.com
on 13 Jan 2014 at 9:12
Building on OS X is remarkably simple thanks to all the hard work done by the
MacPorts project. Start by installing MacPorts from
http://www.macports.org/install.php
The run the following commands as root:
port -d sync
port -v selfupdate
port -v upgrade outdated
port install autoconf automake gcc48 libtool pkgconfig apache-ant
Then switch back to your normal user, checkout the master branch from github
and run ant compile jar
There maybe still be an issue running on 10.9 related to line 95 and 100 here:
https://github.com/kwhat/libuiohook/blob/master/src/darwin/hook_thread.c#L95
I am guessing that kAXTrustedCheckOptionPrompt_t just needs to be dereferenced
but I cant check because I have very limited access to a mac capable of running
OS X 10.9.
Original comment by a...@1stleg.com
on 15 Jan 2014 at 2:03
Perfect thx a lots for the informations.
Now i need to find a mac! ;)
Original comment by sebastie...@gmail.com
on 15 Jan 2014 at 2:40
Just a small update for those following this thread. I am nearly ready to
build 1.2-beta-1 however Apple has tried really hard to make cross compiling
for their platform impossible. If anyone has any tips for getting a gcc
compatible compiler to build for apple targets on non-apple hardware running
linux please contact me. Until I can figure out a way to make this work, apple
will not receive any binary support going forward. I refuse to shell out more
cash for additional hardware I don't need so I can support a platform I don't
like and a development model I don't agree with.
Original comment by a...@1stleg.com
on 15 Jan 2014 at 6:53
LLVM/CLANG to the rescue! I have successfully cross compiled some simple
applications using clang. Lots of build script support still needs to be added
to make this a viable option, but it is looking promising.
Original comment by a...@1stleg.com
on 19 Feb 2014 at 6:05
The orignal issue should be solved as of
https://github.com/kwhat/libuiohook/commit/26bef61d98a5ac16811f68788f2c4b4a60897
460
Additionally, the trunk should now support LLVM's clang compiler with minimal
effort. To compile using clang use `ant -Dant.build.native.toolchain=clang
distclean compile jar`. I have only tested on Linux and OS X. Please open a
new bug if it is related to LLVM. Binaries for OS X will be available in
1.2.0-beta2.
Original comment by a...@1stleg.com
on 21 Mar 2014 at 6:23
Original issue reported on code.google.com by
J...@joncrowell.org
on 11 Dec 2013 at 6:18