blob: 7e84a5992271bca1279def03c59d4b0b5729cc14 [file] [log] [blame] [edit]
/*
* libbrlapi - A library providing access to braille terminals for applications.
*
* Copyright (C) 2006-2023 by Dave Mielke <dave@mielke.cc>
*
* libbrlapi comes with ABSOLUTELY NO WARRANTY.
*
* This is free software, placed under the terms of the
* GNU Lesser General Public License, as published by the Free Software
* Foundation; either version 2.1 of the License, or (at your option) any
* later version. Please see the file LICENSE-LGPL for details.
*
* Web Page: http://brltty.app/
*
* This software is maintained by Dave Mielke <dave@mielke.cc>.
*/
#define BRLAPI_NO_SINGLE_SESSION
#include "prologue.h"
#include <brlapi.h>
#include <emacs-module.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
int plugin_is_GPL_compatible;
static const char *error_name = "brlapi-error";
static const char *error_message = "BrlAPI Error";
static inline emacs_value
cons(emacs_env *env, emacs_value car, emacs_value cdr) {
emacs_value args[] = { car, cdr };
return env->funcall(env, env->intern(env, "cons"), ARRAY_COUNT(args), args);
}
static inline emacs_value
list(emacs_env *env, ptrdiff_t nargs, emacs_value *args) {
return env->funcall(env, env->intern(env, "list"), nargs, args);
}
static void
error(emacs_env *env) {
const char *const str = brlapi_strerror(&brlapi_error);
emacs_value error_symbol = env->intern(env, error_name);
emacs_value data[] = {
env->make_string(env, str, strlen(str)),
env->make_integer(env, brlapi_errno),
env->make_integer(env, brlapi_libcerrno),
env->make_integer(env, brlapi_gaierrno)
};
env->non_local_exit_signal(env,
error_symbol, list(env, ARRAY_COUNT(data), data)
);
}
static emacs_value
getLibraryVersion(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data) {
int major, minor, revision;
brlapi_getLibraryVersion(&major, &minor, &revision);
{
emacs_value data[] = {
env->intern(env, ":major"), env->make_integer(env, major),
env->intern(env, ":minor"), env->make_integer(env, minor),
env->intern(env, ":revision"), env->make_integer(env, revision)
};
return list(env, ARRAY_COUNT(data), data);
}
}
static char *
extract_string(emacs_env *env, ptrdiff_t nargs, ptrdiff_t arg, emacs_value *args) {
if (arg < nargs) {
if (env->is_not_nil(env, args[arg])) {
ptrdiff_t size;
if (env->copy_string_contents(env, args[arg], NULL, &size)) {
char *string = malloc(size);
if (env->copy_string_contents(env, args[arg], string, &size)) {
return string;
}
}
}
}
return NULL;
}
static emacs_value
openConnection(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data) {
brlapi_handle_t *const handle = malloc(brlapi_getHandleSize());
char *host = extract_string(env, nargs, 0, args);
char *auth = extract_string(env, nargs, 1, args);
const brlapi_connectionSettings_t desiredSettings = {
.host = host, .auth = auth
};
brlapi_connectionSettings_t actualSettings;
int result;
if (env->non_local_exit_check(env) != emacs_funcall_exit_return) {
if (handle) free(handle);
if (host) free(host);
if (auth) free(auth);
return NULL;
}
result = brlapi__openConnection(handle, &desiredSettings, &actualSettings);
if (host) free(host);
if (auth) free(auth);
if (result == -1) {
error(env);
free(handle);
return NULL;
}
return env->make_user_ptr(env, free, handle);
}
static emacs_value
getString(
emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data,
int BRLAPI_STDCALL (*get) (brlapi_handle_t *, char *, size_t)
) {
brlapi_handle_t *const handle = env->get_user_ptr(env, args[0]);
if (handle) {
char name[BRLAPI_MAXNAMELENGTH + 1];
size_t length = get(handle, name, sizeof(name));
if (length != -1) {
if (length > 0) length--;
return env->make_string(env, name, length);
}
error(env);
}
return NULL;
}
static emacs_value
getDriverName(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data) {
return getString(env, nargs, args, data, brlapi__getDriverName);
}
static emacs_value
getModelIdentifier(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data) {
return getString(env, nargs, args, data, brlapi__getModelIdentifier);
}
static emacs_value
getDisplaySize(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data) {
brlapi_handle_t *const handle = env->get_user_ptr(env, args[0]);
if (handle) {
unsigned int x, y;
if (brlapi__getDisplaySize(handle, &x, &y) != -1) {
return cons(env, env->make_integer(env, x), env->make_integer(env, y));
}
error(env);
}
return NULL;
}
static char *
extract_driver(emacs_env *env, emacs_value arg) {
ptrdiff_t size;
if (env->copy_string_contents(env, arg, NULL, &size)) {
char *driver = malloc(size);
if (env->copy_string_contents(env, arg, driver, &size)) {
return driver;
}
}
return NULL;
}
static emacs_value
enterTtyMode(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data) {
brlapi_handle_t *const handle = env->get_user_ptr(env, args[0]);
emacs_value result = NULL;
if (handle) {
int tty = nargs > 1 && env->is_not_nil(env, args[1])?
env->extract_integer(env, args[1]): BRLAPI_TTY_DEFAULT;
char *driver = nargs > 2? extract_driver(env, args[2]): NULL;
if (env->non_local_exit_check(env) == emacs_funcall_exit_return) {
tty = brlapi__enterTtyMode(handle, tty, driver);
if (tty != -1) {
result = env->make_integer(env, tty);
} else {
error(env);
}
}
if (driver) free(driver);
}
return result;
}
static emacs_value
leaveTtyMode(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data) {
brlapi_handle_t *const handle = env->get_user_ptr(env, args[0]);
if (handle) {
if (brlapi__leaveTtyMode(handle) != -1) {
return env->intern(env, "nil");
}
error(env);
}
return NULL;
}
static inline int
extract_cursor(emacs_env *env, emacs_value arg) {
if (!env->is_not_nil(env, arg)) return BRLAPI_CURSOR_OFF;
if (env->eq(env, arg, env->intern(env, "leave"))) return BRLAPI_CURSOR_LEAVE;
return env->extract_integer(env, arg);
}
static emacs_value
writeText(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data) {
brlapi_handle_t *const handle = env->get_user_ptr(env, args[0]);
if (handle) {
ptrdiff_t size;
if (env->copy_string_contents(env, args[1], NULL, &size)) {
char text[size];
if (env->copy_string_contents(env, args[1], text, &size)) {
int cursor = nargs > 2? extract_cursor(env, args[2]): BRLAPI_CURSOR_OFF;
if (env->non_local_exit_check(env) == emacs_funcall_exit_return) {
if (brlapi__writeText(handle, cursor, text) != -1) {
return env->intern(env, "nil");
}
error(env);
}
}
}
}
return NULL;
}
static emacs_value
readKey(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data) {
brlapi_handle_t *const handle = env->get_user_ptr(env, args[0]);
const int wait = nargs > 1? env->is_not_nil(env, args[1]): 0;
brlapi_keyCode_t keyCode;
int result;
if (handle == NULL) return NULL;
do {
if (env->process_input(env) != emacs_process_input_continue)
return NULL;
result = brlapi__readKey(handle, wait, &keyCode);
} while (result == -1 &&
brlapi_errno == BRLAPI_ERROR_LIBCERR &&
brlapi_libcerrno == EINTR);
if (result == -1) {
error(env);
return NULL;
}
if (result == 0) return env->intern(env, "nil");
return env->make_integer(env, (intmax_t)keyCode);
}
static emacs_value
readKeyWithTimeout(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data) {
brlapi_handle_t *const handle = env->get_user_ptr(env, args[0]);
const int timeout_ms = env->extract_integer(env, args[1]);
brlapi_keyCode_t keyCode;
int result;
do {
if (env->process_input(env) != emacs_process_input_continue)
return NULL;
result = brlapi__readKeyWithTimeout(handle, timeout_ms, &keyCode);
} while (result == -1 &&
timeout_ms < 0 &&
brlapi_errno == BRLAPI_ERROR_LIBCERR &&
brlapi_libcerrno == EINTR);
if (result == -1) {
error(env);
return NULL;
}
if (result == 0) return env->intern(env, "nil");
return env->make_integer(env, (intmax_t)keyCode);
}
static inline brlapi_keyCode_t
extract_keyCode(emacs_env *env, emacs_value value) {
return (brlapi_keyCode_t)env->extract_integer(env, value);
}
static const ptrdiff_t changeKeysMinArity = 2;
static emacs_value
changeKeys (
emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data,
int BRLAPI_STDCALL (*change) (
brlapi_handle_t *, brlapi_rangeType_t, const brlapi_keyCode_t[], unsigned int
)
) {
brlapi_handle_t *const handle = env->get_user_ptr(env, args[0]);
if (handle) {
static const char *rangeNames[] = {
"all", "code", "command", "key", "type", NULL
};
static const brlapi_rangeType_t rangeTypes[] = {
brlapi_rangeType_all,
brlapi_rangeType_code,
brlapi_rangeType_command,
brlapi_rangeType_key,
brlapi_rangeType_type
};
size_t rangeIndex = 0;
while (rangeNames[rangeIndex]) {
if (env->eq(env, args[1], env->intern(env, rangeNames[rangeIndex]))) {
break;
}
rangeIndex++;
}
if (rangeNames[rangeIndex]) {
const brlapi_rangeType_t range = rangeTypes[rangeIndex];
if (range == brlapi_rangeType_all) {
if (change(handle, range, NULL, 0) != -1) {
return env->intern(env, "nil");
}
error(env);
} else {
brlapi_keyCode_t keys[nargs - changeKeysMinArity];
for (ptrdiff_t index = 0; index < ARRAY_COUNT(keys); index++) {
keys[index] = extract_keyCode(env, args[changeKeysMinArity + index]);
if (env->non_local_exit_check(env) != emacs_funcall_exit_return)
return NULL;
}
if (change(handle, range, keys, ARRAY_COUNT(keys)) != -1) {
return env->intern(env, "nil");
}
error(env);
}
return NULL;
}
{ /* (signal 'wrong-type-argument (list 'symbolp arg)) */
emacs_value data[] = {
env->intern(env, "symbolp"), args[1]
};
env->non_local_exit_signal(env,
env->intern(env, "wrong-type-argument"),
list(env, ARRAY_COUNT(data), data)
);
}
}
return NULL;
}
static emacs_value
acceptKeys(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data) {
return changeKeys(env, nargs, args, data, brlapi__acceptKeys);
}
static emacs_value
ignoreKeys(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data) {
return changeKeys(env, nargs, args, data, brlapi__ignoreKeys);
}
static emacs_value
describeKeyCode(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data) {
const brlapi_keyCode_t keyCode = extract_keyCode(env, args[0]);
if (env->non_local_exit_check(env) == emacs_funcall_exit_return) {
brlapi_describedKeyCode_t description;
if (brlapi_describeKeyCode(keyCode, &description) != -1) {
static const size_t min_len = 3;
emacs_value data[min_len + description.flags];
data[0] = env->intern(env, description.type);
data[1] = env->intern(env, description.command);
data[2] = env->make_integer(env, description.argument);
for (size_t index = 0; index < description.flags; index += 1) {
data[min_len+index] = env->intern(env, description.flag[index]);
}
return list(env, ARRAY_COUNT(data), data);
}
error(env);
}
return NULL;
}
static emacs_value
getStringParameter(
emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data,
brlapi_param_t param
) {
brlapi_handle_t *const handle = env->get_user_ptr(env, args[0]);
if (handle) {
static const brlapi_param_flags_t flags = BRLAPI_PARAMF_GLOBAL;
size_t count;
char *string = brlapi__getParameterAlloc(handle, param, 0, flags, &count);
if (string) {
emacs_value result = env->make_string(env, string, count);
free(string);
return result;
}
error(env);
}
return NULL;
}
static emacs_value
setStringParameter(
emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data,
brlapi_param_t param
) {
brlapi_handle_t *const handle = env->get_user_ptr(env, args[0]);
if (handle) {
ptrdiff_t length;
if (env->copy_string_contents(env, args[1], NULL, &length)) {
char string[length];
if (env->copy_string_contents(env, args[1], string, &length)) {
static const brlapi_param_flags_t flags = BRLAPI_PARAMF_GLOBAL;
if (brlapi__setParameter(handle, param, 0, flags, string, length) != -1) {
return env->intern(env, "nil");
}
error(env);
}
}
}
return NULL;
}
static emacs_value
getDriverCode(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data) {
return getStringParameter(env, nargs, args, data,
BRLAPI_PARAM_DRIVER_CODE);
}
static emacs_value
getDriverVersion(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data) {
return getStringParameter(env, nargs, args, data,
BRLAPI_PARAM_DRIVER_VERSION);
}
static emacs_value
getClipboardContent(
emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data
) {
return getStringParameter(env, nargs, args, data,
BRLAPI_PARAM_CLIPBOARD_CONTENT);
}
static emacs_value
setClipboardContent(
emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data
) {
return setStringParameter(env, nargs, args, data,
BRLAPI_PARAM_CLIPBOARD_CONTENT);
}
static emacs_value
getComputerBrailleTable(
emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data
) {
return getStringParameter(env, nargs, args, data,
BRLAPI_PARAM_COMPUTER_BRAILLE_TABLE);
}
static emacs_value
setComputerBrailleTable(
emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data
) {
return setStringParameter(env, nargs, args, data,
BRLAPI_PARAM_COMPUTER_BRAILLE_TABLE);
}
static emacs_value
getLiteraryBrailleTable(
emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data
) {
return getStringParameter(env, nargs, args, data,
BRLAPI_PARAM_LITERARY_BRAILLE_TABLE);
}
static emacs_value
setLiteraryBrailleTable(
emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data
) {
return setStringParameter(env, nargs, args, data,
BRLAPI_PARAM_LITERARY_BRAILLE_TABLE);
}
static emacs_value
getMessageLocae(
emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data
) {
return getStringParameter(env, nargs, args, data,
BRLAPI_PARAM_MESSAGE_LOCALE);
}
static emacs_value
setMessageLocale(
emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data
) {
return setStringParameter(env, nargs, args, data,
BRLAPI_PARAM_MESSAGE_LOCALE);
}
static emacs_value
getKeycodes(
emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data,
brlapi_param_t param
) {
brlapi_handle_t *const handle = env->get_user_ptr(env, args[0]);
if (handle) {
static const brlapi_param_flags_t flags = BRLAPI_PARAMF_GLOBAL;
size_t count;
brlapi_keyCode_t *codes = brlapi__getParameterAlloc(
handle, param, 0, flags, &count
);
if (codes != NULL) {
count /= sizeof(brlapi_keyCode_t);
{
emacs_value data[count];
for (size_t i = 0; i < count; i += 1) {
data[i] = env->make_integer(env, (intmax_t)codes[i]);
}
free(codes);
return list(env, ARRAY_COUNT(data), data);
}
}
error(env);
}
return NULL;
}
static emacs_value
getBoundCommandKeycodes(
emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data
) {
return getKeycodes(env, nargs, args, data,
BRLAPI_PARAM_BOUND_COMMAND_KEYCODES
);
}
static emacs_value
getDefinedDriverKeycodes(
emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data
) {
return getKeycodes(env, nargs, args, data,
BRLAPI_PARAM_DEFINED_DRIVER_KEYCODES
);
}
static emacs_value
getKeycodeName(
emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data,
brlapi_param_t param
) {
brlapi_handle_t *const handle = env->get_user_ptr(env, args[0]);
if (handle) {
brlapi_keyCode_t keyCode = extract_keyCode(env, args[1]);
if (env->non_local_exit_check(env) == emacs_funcall_exit_return) {
char *name = brlapi__getParameterAlloc(handle,
param, keyCode, BRLAPI_PARAMF_GLOBAL, NULL
);
if (name) {
emacs_value result = env->intern(env, name);
free(name);
return result;
}
error(env);
}
}
return NULL;
}
static emacs_value
getCommandKeycodeName(
emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data
) {
return getKeycodeName(env, nargs, args, data,
BRLAPI_PARAM_COMMAND_KEYCODE_NAME
);
}
static emacs_value
getDriverKeycodeName(
emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data
) {
return getKeycodeName(env, nargs, args, data,
BRLAPI_PARAM_DRIVER_KEYCODE_NAME
);
}
static emacs_value
getKeycodeSummary(
emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data,
brlapi_param_t param
) {
brlapi_handle_t *const handle = env->get_user_ptr(env, args[0]);
if (handle) {
brlapi_keyCode_t keyCode = extract_keyCode(env, args[1]);
if (env->non_local_exit_check(env) == emacs_funcall_exit_return) {
size_t count;
char *summary = brlapi__getParameterAlloc(handle,
param, keyCode, BRLAPI_PARAMF_GLOBAL, &count
);
if (summary) {
emacs_value result = env->make_string(env, summary, count);
free(summary);
return result;
}
error(env);
}
}
return NULL;
}
static emacs_value
getCommandKeycodeSummary(
emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data
) {
return getKeycodeSummary(env, nargs, args, data,
BRLAPI_PARAM_COMMAND_KEYCODE_SUMMARY
);
}
static emacs_value
getDriverKeycodeSummary(
emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data
) {
return getKeycodeSummary(env, nargs, args, data,
BRLAPI_PARAM_DRIVER_KEYCODE_SUMMARY
);
}
static emacs_value
closeConnection(emacs_env *env, ptrdiff_t nargs, emacs_value *args, void *data) {
brlapi_handle_t *const handle = env->get_user_ptr(env, args[0]);
if (handle) {
brlapi__closeConnection(handle);
return env->intern(env, "nil");
}
return NULL;
}
int
emacs_module_init(struct emacs_runtime *runtime) {
emacs_env *const env = runtime->get_environment(runtime);
if (runtime->size < sizeof(*runtime)) return 1;
if (env->size < sizeof(*env)) return 2;
{ /* (define-error 'brlapi-error "BrlAPI Error") */
emacs_value args[] = {
env->intern(env, error_name),
env->make_string(env, error_message, strlen(error_message))
};
env->funcall(env, env->intern(env, "define-error"), ARRAY_COUNT(args), args);
}
#define register_function(func, minargs, maxargs, name, doc) \
{ \
emacs_value args[] = { \
env->intern(env, "brlapi-" name), \
env->make_function(env, minargs, maxargs, func, doc, NULL) \
}; \
env->funcall(env, env->intern(env, "defalias"), ARRAY_COUNT(args), args); \
}
register_function(getLibraryVersion, 0, 0, "get-library-version",
"Get the version of BrlAPI."
)
register_function(openConnection, 0, 2, "open-connection",
"Open a new connection to BRLTTY."
"\n\nHOST is a string of the form \"host:0\" where the number after the colon"
"\nspecifies the instance of BRLTTY on the given host."
"\n\nIf AUTH is non-nil, specifies the path to the secret key."
"\n\nAlso see `brlapi-close-connection'."
"\n\n(fn &optional HOST AUTH)"
)
register_function(getDriverName, 1, 1, "get-driver-name",
"Get the complete name of the driver used by BRLTTY."
"\n\n(fn CONNECTION)"
)
register_function(getModelIdentifier, 1, 1, "get-model-identifier",
"Get model identifier."
"\n\n(fn CONNECTION)"
)
register_function(getDisplaySize, 1, 1, "get-display-size",
"Get the size of the braille display reachable via CONNECTION."
"\n\nReturns a `cons' where `car' is the x dimension and `cdr' the y dimension."
"\n\n(fn CONNECTION)"
)
register_function(enterTtyMode, 1, 3, "enter-tty-mode",
"Enter TTY mode."
"\n\n(fn CONNECTION &optional TTY DRIVER)"
)
register_function(leaveTtyMode, 1, 1, "leave-tty-mode",
"Leave TTY mode."
"\n\n(fn CONNECTION)"
)
register_function(writeText, 2, 3, "write-text",
"Write STRING to the braille display."
"\n\nCURSOR is either an integer or the symbol `leave'."
"\n\n(fn CONNECTION STRING CURSOR)"
)
register_function(readKey, 1, 2, "read-key",
"Read a keypress from CONNECTION."
"\n\nIf WAIT is non-nil, wait until a keypress actually arrives."
"\n\n(fn CONNECTION WAIT)"
)
register_function(readKeyWithTimeout, 2, 2, "read-key-with-timeout",
"Read a keypress from CONNECTION waiting MILISECONDS."
"\n\n(fn CONNECTION MILISECONDS)"
)
register_function(acceptKeys, changeKeysMinArity, emacs_variadic_function, "accept-keys",
"Ask the server to give KEY-CODES to the application."
"\n\nTYPE should be one of the following symbols:"
"\n 'all' for all keys"
"\n 'type' for keys of a given type"
"\n 'command' for keys of a given command block, i.e. matching the key type and command parts"
"\n 'key' for a given key with any flags"
"\n 'code' for a given key code"
"\n\n(fn CONNECTION TYPE &rest KEY-CODES)"
)
register_function(ignoreKeys, changeKeysMinArity, emacs_variadic_function, "ignore-keys",
"Ask the server to handle KEY-CODES by brltty."
"\n\nSee `brlapi-accept-keys' for a description of the TYPE argument."
"\n\n(fn CONNECTION TYPE &rest KEY-CODES)"
)
register_function(describeKeyCode, 1, 1, "describe-key-code",
"Decode KEY-CODE into its individual symbolic components."
"\n\n(fn KEY-CODE)"
)
register_function(getDriverCode, 1, 1, "get-driver-code",
"Get the driver code (a 2 letter string) of CONNECTION."
"\n\n(fn CONNECTION)"
)
register_function(getDriverVersion, 1, 1, "get-driver-version",
"Get the driver version(a string) of CONNECTION."
"\n\n(fn CONNECTION)"
)
register_function(getClipboardContent, 1, 1, "get-clipboard-content",
"Get the content of the clipboard of CONNECTION."
"\n\n(fn CONNECTION)"
)
register_function(setClipboardContent, 2, 2, "set-clipboard-content",
"Set the content of the clipboard of CONNECTION to STRING."
"\n\n(fn CONNECTION STRING)"
)
register_function(getComputerBrailleTable, 1, 1, "get-computer-braille-table",
"Get the computer braille table of CONNECTION."
"\n\n(fn CONNECTION)"
)
register_function(setComputerBrailleTable, 2, 2, "set-computer-braille-table",
"Set the computer braille table of CONNECTION to STRING."
"\n\n(fn CONNECTION STRING)"
)
register_function(getLiteraryBrailleTable, 1, 1, "get-literary-braille-table",
"Get the literary braille table of CONNECTION."
"\n\n(fn CONNECTION)"
)
register_function(setLiteraryBrailleTable, 2, 2, "set-literary-braille-table",
"Set the literary braille table of CONNECTION to STRING."
"\n\n(fn CONNECTION STRING)"
)
register_function(getMessageLocae, 1, 1, "get-message-locale",
"Get the message locale of CONNECTION."
"\n\n(fn CONNECTION)"
)
register_function(setMessageLocale, 2, 2, "set-message-locale",
"Set the message locale of CONNECTION to STRING."
"\n\n(fn CONNECTION STRING)"
)
register_function(getBoundCommandKeycodes, 1, 1, "get-bound-command-keycodes",
"Get commands bound by the driver."
"\n\n(fn CONNECTION)"
)
register_function(getCommandKeycodeName, 2, 2, "get-command-keycode-name",
"Get the name (a symbol) of the given command KEYCODE."
"\n\n(fn KEYCODE)"
)
register_function(getCommandKeycodeSummary, 2, 2, "get-command-keycode-summary",
"Get a description for a command KEYCODE."
"\n\n(fn KEYCODE)"
)
register_function(getDefinedDriverKeycodes, 1, 1, "get-defined-driver-keycodes",
"Get a list of defined driver specific keycodes."
"\n\n(fn CONNECTION)"
)
register_function(getDriverKeycodeName, 2, 2, "get-driver-keycode-name",
"Get the name (a symbol) of the driver specific KEYCODE."
"\n\n(fn KEYCODE)"
)
register_function(getDriverKeycodeSummary, 2, 2, "get-driver-keycode-summary",
"Get a description for a driver specific KEYCODE."
"\n\n(fn KEYCODE)"
)
register_function(closeConnection, 1, 1, "close-connection",
"Close the connection."
"\n\n(fn CONNECTION)"
)
#undef register_function
return 0;
}