Fix the last commit.

This commit is contained in:
Daiki Ueno
2011-03-11 17:39:23 +09:00
parent d62b8b49a2
commit e6d17fa4cb
10 changed files with 166 additions and 44 deletions

2
.gitignore vendored
View File

@ -72,3 +72,5 @@ po/Makefile.in.in
po/POTFILES po/POTFILES
po/stamp-it po/stamp-it
bindings/vala/*.vapi bindings/vala/*.vapi
py-compile

View File

@ -20,7 +20,7 @@ AC_PREREQ(2.63)
dnl AC_CONFIG_SRCDIR([configure.ac]) dnl AC_CONFIG_SRCDIR([configure.ac])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
AC_INIT([eekboard], [0.90.4], [ueno@unixuser.org]) AC_INIT([eekboard], [0.90.5], [ueno@unixuser.org])
dnl Init automake dnl Init automake
AM_INIT_AUTOMAKE AM_INIT_AUTOMAKE

9
data/eekboard.desktop.in Normal file
View File

@ -0,0 +1,9 @@
[Desktop Entry]
Name=Eekboard
GenericName=Eekboard Virtual Keyboard
Comment=Virtual Keyboard
Exec=eekboard-desktop-client
Icon=eekboard
Terminal=false
Type=Application
Categories=GTK;Utility;

View File

@ -249,7 +249,7 @@ eek_container_init (EekContainer *self)
/** /**
* eek_container_foreach_child: * eek_container_foreach_child:
* @container: an #EekContainer * @container: an #EekContainer
* @callback: an #EekCallback * @callback: (scope call): an #EekCallback
* @user_data: additional data passed to @callback * @user_data: additional data passed to @callback
* *
* Enumerate children of @container and run @callback with each child. * Enumerate children of @container and run @callback with each child.

View File

@ -34,6 +34,14 @@ G_BEGIN_DECLS
typedef struct _EekContainerClass EekContainerClass; typedef struct _EekContainerClass EekContainerClass;
typedef struct _EekContainerPrivate EekContainerPrivate; typedef struct _EekContainerPrivate EekContainerPrivate;
/**
* EekCallback:
* @element: an #EekElement
* @user_data: user-supplied data
*
* The type of the callback function used for iterating over the
* children of a container, see eek_container_foreach_child().
*/
typedef void (*EekCallback) (EekElement *element, gpointer user_data); typedef void (*EekCallback) (EekElement *element, gpointer user_data);
typedef gint (*EekCompareFunc) (EekElement *element, gpointer user_data); typedef gint (*EekCompareFunc) (EekElement *element, gpointer user_data);

View File

@ -18,7 +18,8 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301 USA # 02110-1301 USA
import gobject, gtk, eekboard, virtkey import eekboard
import gobject, gtk, virtkey
import sys, os.path, re import sys, os.path, re
KEYCODE_TABLE = { KEYCODE_TABLE = {
@ -33,6 +34,36 @@ KEYCODE_TABLE = {
MARK_UPPER = '~!@#$%^&*()_+{}|:"<>?' MARK_UPPER = '~!@#$%^&*()_+{}|:"<>?'
MARK_LOWER = '`1234567890-=[]\\;\',./' MARK_LOWER = '`1234567890-=[]\\;\',./'
INSCRIPT_MAPS = (
"as-inscript",
"bn-inscript",
"gu-inscript",
"hi-inscript",
"kn-inscript",
"ml-inscript",
"mr-inscript",
"or-inscript",
"pa-inscript",
"sd-inscript",
"ta-inscript",
"te-inscript",
"kn-inscript2",
"kok-inscript2-deva",
"mai-inscript2",
"ml-inscript2",
"mni-inscript2-beng",
"mni-inscript2-mtei",
"mr-inscript2",
"ne-inscript2-deva",
"or-inscript2",
"pa-inscript2-guru",
"sa-inscript2",
"sat-inscript2-deva",
"sat-inscript2-olck",
"sd-inscript2-deva",
"ta-inscript2",
"te-inscript2")
class MapFile(object): class MapFile(object):
MAPENTRY_PATTERN = re.compile(r'\A\s*\((?:\((.*?)\)|"(.*?)")\s*"(.*?)"\)') MAPENTRY_PATTERN = re.compile(r'\A\s*\((?:\((.*?)\)|"(.*?)")\s*"(.*?)"\)')

View File

@ -19,14 +19,25 @@
import inscript import inscript
import gtk import gtk
from optparse import OptionParser from optparse import OptionParser
import sys, os import sys, os, os.path, glob
parser = OptionParser() parser = OptionParser()
parser.add_option("-n", "--name=LANGCODE", dest="langcode", parser.add_option("-n", "--name=LANGCODE", dest="langcode",
help="Specify language code to LANGCODE", help="Specify language code to LANGCODE",
metavar="LANGCODE") metavar="LANGCODE")
parser.add_option("-l", "--list", dest="list", default=False,
action="store_true",
help="List available language codes")
(options, args) = parser.parse_args() (options, args) = parser.parse_args()
if options.list:
pat = os.path.join(os.getenv("M17N_DIR"), "*.mim")
for fname in sorted(glob.glob(pat)):
mname = os.path.basename(fname[:-4])
if mname in inscript.INSCRIPT_MAPS:
print mname
exit(0)
if options.langcode is None: if options.langcode is None:
print >> sys.stderr, "Specify language code with -n" print >> sys.stderr, "Specify language code with -n"
exit(1) exit(1)

View File

@ -36,6 +36,8 @@ static gboolean opt_focus = FALSE;
static gboolean opt_keystroke = FALSE; static gboolean opt_keystroke = FALSE;
#endif /* HAVE_CSPI */ #endif /* HAVE_CSPI */
static gchar *opt_keyboard = NULL;
static gchar *opt_model = NULL; static gchar *opt_model = NULL;
static gchar *opt_layouts = NULL; static gchar *opt_layouts = NULL;
static gchar *opt_options = NULL; static gchar *opt_options = NULL;
@ -55,6 +57,8 @@ static const GOptionEntry options[] = {
{"listen-keystroke", 's', 0, G_OPTION_ARG_NONE, &opt_keystroke, {"listen-keystroke", 's', 0, G_OPTION_ARG_NONE, &opt_keystroke,
N_("Listen keystroke events with AT-SPI")}, N_("Listen keystroke events with AT-SPI")},
#endif /* HAVE_CSPI */ #endif /* HAVE_CSPI */
{"keyboard", 'k', 0, G_OPTION_ARG_STRING, &opt_keyboard,
N_("Specify keyboard file")},
{"model", '\0', 0, G_OPTION_ARG_STRING, &opt_model, {"model", '\0', 0, G_OPTION_ARG_STRING, &opt_model,
N_("Specify model")}, N_("Specify model")},
{"layouts", '\0', 0, G_OPTION_ARG_STRING, &opt_layouts, {"layouts", '\0', 0, G_OPTION_ARG_STRING, &opt_layouts,
@ -198,11 +202,21 @@ main (int argc, char **argv)
} }
#endif /* HAVE_CSPI */ #endif /* HAVE_CSPI */
if (opt_model || opt_layouts || opt_options) { if (opt_keyboard && (opt_model || opt_layouts || opt_options)) {
g_printerr ("Can't use --keyboard option with xklavier options\n");
exit (1);
}
if (opt_keyboard) {
if (!eekboard_client_load_keyboard_from_file (client, opt_keyboard)) {
g_printerr ("Can't load keyboard\n");
exit (1);
}
} else if (opt_model || opt_layouts || opt_options) {
if (!eekboard_client_set_xkl_config (client, if (!eekboard_client_set_xkl_config (client,
opt_model, opt_model,
opt_layouts, opt_layouts,
opt_options)) { opt_options)) {
g_printerr ("Can't set xklavier config\n"); g_printerr ("Can't set xklavier config\n");
exit (1); exit (1);
} }

View File

@ -106,7 +106,10 @@ static SPIBoolean keystroke_listener_cb
(const AccessibleKeystroke *stroke, (const AccessibleKeystroke *stroke,
void *user_data); void *user_data);
#endif /* HAVE_CSPI */ #endif /* HAVE_CSPI */
static gboolean set_keyboard (EekboardClient *client, static gboolean set_keyboard (EekboardClient *client,
gboolean show,
EekLayout *layout);
static gboolean set_xkl_keyboard (EekboardClient *client,
gboolean show, gboolean show,
const gchar *model, const gchar *model,
const gchar *layouts, const gchar *layouts,
@ -287,17 +290,17 @@ eekboard_client_set_xkl_config (EekboardClient *client,
const gchar *options) const gchar *options)
{ {
#ifdef HAVE_CSPI #ifdef HAVE_CSPI
return set_keyboard (client, return set_xkl_keyboard (client,
client->focus_listener ? FALSE : TRUE, client->focus_listener ? FALSE : TRUE,
model, model,
layouts, layouts,
options); options);
#else #else
return set_keyboard (client, return set_xkl_keyboard (client,
TRUE, TRUE,
model, model,
layouts, layouts,
options); options);
#endif #endif
} }
@ -338,10 +341,13 @@ eekboard_client_enable_xkl (EekboardClient *client)
xkl_engine_start_listen (client->xkl_engine, XKLL_TRACK_KEYBOARD_STATE); xkl_engine_start_listen (client->xkl_engine, XKLL_TRACK_KEYBOARD_STATE);
#ifdef HAVE_CSPI #ifdef HAVE_CSPI
return set_keyboard (client, client->focus_listener ? FALSE : TRUE, return set_xkl_keyboard (client,
NULL, NULL, NULL); client->focus_listener ? FALSE : TRUE,
NULL,
NULL,
NULL);
#else #else
return set_keyboard (client, TRUE, NULL, NULL, NULL); return set_xkl_keyboard (client, TRUE, NULL, NULL, NULL);
#endif #endif
} }
@ -519,7 +525,7 @@ on_xkl_config_changed (XklEngine *xklengine,
EekboardClient *client = user_data; EekboardClient *client = user_data;
gboolean retval; gboolean retval;
retval = set_keyboard (client, FALSE, NULL, NULL, NULL); retval = set_xkl_keyboard (client, FALSE, NULL, NULL, NULL);
g_return_if_fail (retval); g_return_if_fail (retval);
#ifdef HAVE_FAKEKEY #ifdef HAVE_FAKEKEY
@ -530,16 +536,40 @@ on_xkl_config_changed (XklEngine *xklengine,
static gboolean static gboolean
set_keyboard (EekboardClient *client, set_keyboard (EekboardClient *client,
gboolean show, gboolean show,
const gchar *model, EekLayout *layout)
const gchar *layouts,
const gchar *options)
{ {
EekLayout *layout;
gchar *keyboard_name; gchar *keyboard_name;
static gint keyboard_serial = 0; static gint keyboard_serial = 0;
guint keyboard_id; guint keyboard_id;
client->keyboard = eek_keyboard_new (layout, CSW, CSH);
eek_keyboard_set_modifier_behavior (client->keyboard,
EEK_MODIFIER_BEHAVIOR_LATCH);
keyboard_name = g_strdup_printf ("keyboard%d", keyboard_serial++);
eek_element_set_name (EEK_ELEMENT(client->keyboard), keyboard_name);
g_free (keyboard_name);
keyboard_id = eekboard_context_add_keyboard (client->context,
client->keyboard,
NULL);
eekboard_context_set_keyboard (client->context, keyboard_id, NULL);
if (show)
eekboard_context_show_keyboard (client->context, NULL);
return TRUE;
}
static gboolean
set_xkl_keyboard (EekboardClient *client,
gboolean show,
const gchar *model,
const gchar *layouts,
const gchar *options)
{
EekLayout *layout;
gboolean retval;
if (client->keyboard) if (client->keyboard)
g_object_unref (client->keyboard); g_object_unref (client->keyboard);
layout = eek_xkl_layout_new (); layout = eek_xkl_layout_new ();
@ -583,22 +613,9 @@ set_keyboard (EekboardClient *client,
} }
} }
client->keyboard = eek_keyboard_new (layout, CSW, CSH); retval = set_keyboard (client, show, layout);
eek_keyboard_set_modifier_behavior (client->keyboard, g_object_unref (layout);
EEK_MODIFIER_BEHAVIOR_LATCH); return retval;
keyboard_name = g_strdup_printf ("keyboard%d", keyboard_serial++);
eek_element_set_name (EEK_ELEMENT(client->keyboard), keyboard_name);
g_free (keyboard_name);
keyboard_id = eekboard_context_add_keyboard (client->context,
client->keyboard,
NULL);
eekboard_context_set_keyboard (client->context, keyboard_id, NULL);
if (show)
eekboard_context_show_keyboard (client->context, NULL);
return TRUE;
} }
static void static void
@ -715,4 +732,31 @@ eekboard_client_disable_fakekey (EekboardClient *client)
g_signal_handler_disconnect (client->keyboard, g_signal_handler_disconnect (client->keyboard,
client->key_released_handler); client->key_released_handler);
} }
gboolean
eekboard_client_load_keyboard_from_file (EekboardClient *client,
const gchar *keyboard_file)
{
GFile *file;
GFileInputStream *input;
GError *error;
EekLayout *layout;
EekKeyboard *keyboard;
guint keyboard_id;
gboolean retval;
file = g_file_new_for_path (keyboard_file);
error = NULL;
input = g_file_read (file, NULL, &error);
if (input == NULL)
return FALSE;
layout = eek_xml_layout_new (G_INPUT_STREAM(input));
g_object_unref (input);
retval = set_keyboard (client, TRUE, layout);
g_object_unref (layout);
return retval;
}
#endif /* HAVE_FAKEKEY */ #endif /* HAVE_FAKEKEY */

View File

@ -33,6 +33,9 @@ typedef struct _EekboardClient EekboardClient;
EekboardClient * eekboard_client_new (GDBusConnection *connection); EekboardClient * eekboard_client_new (GDBusConnection *connection);
gboolean eekboard_client_load_keyboard_from_file
(EekboardClient *client,
const gchar *file);
gboolean eekboard_client_set_xkl_config (EekboardClient *client, gboolean eekboard_client_set_xkl_config (EekboardClient *client,
const gchar *model, const gchar *model,
const gchar *layouts, const gchar *layouts,