Compare commits
8 Commits
eekboard-0
...
eekboard-0
| Author | SHA1 | Date | |
|---|---|---|---|
| cf4d1109d3 | |||
| c7c6d06907 | |||
| 384d43bb80 | |||
| 29c55b6ca3 | |||
| 910b0be5a5 | |||
| 706fa6310b | |||
| 248699d771 | |||
| 6343e37bc1 |
@ -16,12 +16,13 @@
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
# 02110-1301 USA
|
||||
|
||||
AC_INIT([eekboard], [0.0.6], [ueno@unixuser.org])
|
||||
AC_INIT([eekboard], [0.0.7], [ueno@unixuser.org])
|
||||
AC_CONFIG_SRCDIR([configure.ac])
|
||||
AC_PREREQ(2.63)
|
||||
AM_INIT_AUTOMAKE
|
||||
AM_PROG_CC_C_O
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
|
||||
LT_INIT
|
||||
IT_PROG_INTLTOOL([0.35.0])
|
||||
|
||||
|
||||
@ -123,7 +123,8 @@ eek_gtk_keyboard_finalize (GObject *object)
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(object);
|
||||
gint i;
|
||||
|
||||
g_hash_table_unref (priv->key_surfaces);
|
||||
cairo_surface_destroy (priv->keyboard_surface);
|
||||
g_hash_table_destroy (priv->key_surfaces);
|
||||
|
||||
for (i = 0; i < EEK_KEYSYM_CATEGORY_LAST; i++)
|
||||
pango_font_description_free (priv->fonts[i]);
|
||||
@ -357,7 +358,7 @@ redraw_keyboard (cairo_t *cr,
|
||||
|
||||
prepare_keyboard_surface (keyboard);
|
||||
}
|
||||
g_return_val_if_fail (priv->keyboard_surface, FALSE);
|
||||
g_return_if_fail (priv->keyboard_surface);
|
||||
|
||||
gdk_cairo_set_source_color (cr, &style->fg[state]);
|
||||
|
||||
@ -464,8 +465,8 @@ redraw_key (cairo_t *cr,
|
||||
gdk_cairo_set_source_color (cr, &style->fg[state]);
|
||||
|
||||
cairo_scale (cr,
|
||||
key_surface_scale[KEY_SURFACE_LARGE],
|
||||
key_surface_scale[KEY_SURFACE_LARGE]);
|
||||
priv->scale * key_surface_scale[KEY_SURFACE_LARGE],
|
||||
priv->scale * key_surface_scale[KEY_SURFACE_LARGE]);
|
||||
eek_draw_key_label (cr, key, priv->fonts);
|
||||
break;
|
||||
}
|
||||
@ -492,11 +493,13 @@ on_key_released (EekKey *key, gpointer user_data)
|
||||
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard);
|
||||
cairo_t *cr;
|
||||
|
||||
cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (priv->widget)));
|
||||
if (priv->key) {
|
||||
cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (priv->widget)));
|
||||
redraw_key (cr, priv->key, KEY_SURFACE_NORMAL, keyboard);
|
||||
cairo_destroy (cr);
|
||||
priv->key = NULL;
|
||||
}
|
||||
cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (priv->widget)));
|
||||
redraw_key (cr, key, KEY_SURFACE_NORMAL, keyboard);
|
||||
cairo_destroy (cr);
|
||||
}
|
||||
@ -583,6 +586,7 @@ on_size_allocate (GtkWidget *widget,
|
||||
cairo_surface_destroy (priv->keyboard_surface);
|
||||
priv->keyboard_surface = NULL;
|
||||
}
|
||||
g_hash_table_remove_all (priv->key_surfaces);
|
||||
|
||||
eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds);
|
||||
priv->scale = allocation->width > allocation->height ?
|
||||
|
||||
@ -538,7 +538,6 @@ eek_keyboard_find_key_by_position (EekKeyboard *keyboard,
|
||||
gdouble y)
|
||||
{
|
||||
FkbpData data;
|
||||
EekSection *section;
|
||||
EekBounds bounds;
|
||||
|
||||
eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds);
|
||||
|
||||
@ -632,9 +632,13 @@ eek_xkb_layout_set_names_full (EekXkbLayout *layout,
|
||||
...)
|
||||
{
|
||||
va_list var_args;
|
||||
gboolean retval;
|
||||
|
||||
va_start (var_args, layout);
|
||||
eek_xkb_layout_set_names_full_valist (layout, var_args);
|
||||
retval = eek_xkb_layout_set_names_full_valist (layout, var_args);
|
||||
va_end (var_args);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -244,23 +244,6 @@ eek_xkl_layout_class_init (EekXklLayoutClass *klass)
|
||||
g_object_class_install_property (gobject_class, PROP_OPTIONS, pspec);
|
||||
}
|
||||
|
||||
/* Disabled since the current EekXklLayout implementation does not
|
||||
change the server setting. */
|
||||
#if 0
|
||||
static void
|
||||
on_state_changed (XklEngine *xklengine,
|
||||
XklEngineStateChange type,
|
||||
gint value,
|
||||
gboolean restore,
|
||||
gpointer user_data)
|
||||
{
|
||||
EekLayout *layout = user_data;
|
||||
|
||||
if (type == GROUP_CHANGED)
|
||||
g_signal_emit_by_name (layout, "group_changed", value);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
eek_xkl_layout_init (EekXklLayout *self)
|
||||
{
|
||||
@ -274,13 +257,6 @@ eek_xkl_layout_init (EekXklLayout *self)
|
||||
g_return_if_fail (display);
|
||||
|
||||
priv->engine = xkl_engine_get_instance (display);
|
||||
/* Disabled since the current EekXklLayout implementation does not
|
||||
change the server setting. */
|
||||
#if 0
|
||||
g_signal_connect (priv->engine, "X-state-changed",
|
||||
G_CALLBACK(on_state_changed), self);
|
||||
xkl_engine_start_listen (priv->engine, XKLL_TRACK_KEYBOARD_STATE);
|
||||
#endif
|
||||
xkl_config_rec_get_from_server (priv->config, priv->engine);
|
||||
set_xkb_component_names (self, priv->config);
|
||||
}
|
||||
|
||||
@ -229,7 +229,7 @@ static gboolean opt_version = FALSE;
|
||||
#if HAVE_CLUTTER_GTK
|
||||
static gchar *opt_toolkit = NULL;
|
||||
#endif
|
||||
static gboolean opt_standalone = FALSE;
|
||||
static gboolean opt_popup = FALSE;
|
||||
static gchar *opt_config = NULL;
|
||||
|
||||
static const GOptionEntry options[] = {
|
||||
@ -249,8 +249,8 @@ static const GOptionEntry options[] = {
|
||||
{"toolkit", 't', 0, G_OPTION_ARG_STRING, &opt_toolkit,
|
||||
N_("Toolkit (\"clutter\" or \"gtk\")")},
|
||||
#endif
|
||||
{"standalone", 's', 0, G_OPTION_ARG_NONE, &opt_standalone,
|
||||
N_("Start as a standalone application")},
|
||||
{"popup", 'p', 0, G_OPTION_ARG_NONE, &opt_popup,
|
||||
N_("Start as a popup window")},
|
||||
{"config", 'c', 0, G_OPTION_ARG_STRING, &opt_config,
|
||||
N_("Specify configuration file")},
|
||||
{"version", 'v', 0, G_OPTION_ARG_NONE, &opt_version,
|
||||
@ -293,6 +293,7 @@ on_quit (gpointer user_data)
|
||||
if (eekboard->fakekey)
|
||||
fakekey_release (eekboard->fakekey);
|
||||
eekboard_free (eekboard);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -417,7 +418,7 @@ on_key_pressed (EekKeyboard *keyboard,
|
||||
{
|
||||
Eekboard *eekboard = user_data;
|
||||
gint group, level;
|
||||
guint keysym, modifiers = 0;
|
||||
guint keysym;
|
||||
|
||||
keysym = eek_key_get_keysym (key);
|
||||
EEKBOARD_NOTE("%s %X", eek_keysym_to_string (keysym), eekboard->modifiers);
|
||||
@ -425,7 +426,7 @@ on_key_pressed (EekKeyboard *keyboard,
|
||||
switch (keysym) {
|
||||
case XK_Shift_L:
|
||||
case XK_Shift_R:
|
||||
eekboard->modifiers ^= ShiftMask;
|
||||
eekboard->modifiers |= ShiftMask;
|
||||
eek_keyboard_get_keysym_index (keyboard, &group, &level);
|
||||
eek_keyboard_set_keysym_index (keyboard, group,
|
||||
(eekboard->modifiers & Mod5Mask) ? 2 :
|
||||
@ -433,7 +434,7 @@ on_key_pressed (EekKeyboard *keyboard,
|
||||
0);
|
||||
break;
|
||||
case XK_ISO_Level3_Shift:
|
||||
eekboard->modifiers ^= Mod5Mask;
|
||||
eekboard->modifiers |= Mod5Mask;
|
||||
eek_keyboard_get_keysym_index (keyboard, &group, &level);
|
||||
eek_keyboard_set_keysym_index (keyboard, group,
|
||||
(eekboard->modifiers & Mod5Mask) ? 2 :
|
||||
@ -442,14 +443,17 @@ on_key_pressed (EekKeyboard *keyboard,
|
||||
break;
|
||||
case XK_Control_L:
|
||||
case XK_Control_R:
|
||||
eekboard->modifiers ^= ControlMask;
|
||||
eekboard->modifiers |= ControlMask;
|
||||
break;
|
||||
case XK_Alt_L:
|
||||
case XK_Alt_R:
|
||||
eekboard->modifiers ^= Mod1Mask;
|
||||
eekboard->modifiers |= Mod1Mask;
|
||||
break;
|
||||
default:
|
||||
fakekey_press_keysym (eekboard->fakekey, keysym, eekboard->modifiers);
|
||||
eekboard->modifiers = 0;
|
||||
eek_keyboard_get_keysym_index (keyboard, &group, &level);
|
||||
eek_keyboard_set_keysym_index (keyboard, group, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1143,6 +1147,37 @@ parse_layouts (XklConfigRec *rec, const gchar *_layouts)
|
||||
rec->variants = variants;
|
||||
}
|
||||
|
||||
static GdkFilterReturn
|
||||
filter_xkl_event (GdkXEvent * xev,
|
||||
GdkEvent * event,
|
||||
gpointer user_data)
|
||||
{
|
||||
XEvent *xevent = (XEvent *) xev;
|
||||
Eekboard *eekboard = user_data;
|
||||
|
||||
xkl_engine_filter_events (eekboard->engine, xevent);
|
||||
return GDK_FILTER_CONTINUE;
|
||||
}
|
||||
|
||||
static void
|
||||
on_xkl_config_changed (XklEngine *xklengine,
|
||||
gpointer user_data)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
on_xkl_state_changed (XklEngine *xklengine,
|
||||
XklEngineStateChange type,
|
||||
gint value,
|
||||
gboolean restore,
|
||||
gpointer user_data)
|
||||
{
|
||||
Eekboard *eekboard = user_data;
|
||||
|
||||
if (type == GROUP_CHANGED)
|
||||
g_signal_emit_by_name (eekboard->layout, "group_changed", value);
|
||||
}
|
||||
|
||||
Eekboard *
|
||||
eekboard_new (gboolean use_clutter,
|
||||
gboolean need_swap_event_workaround,
|
||||
@ -1200,6 +1235,18 @@ eekboard_new (gboolean use_clutter,
|
||||
eekboard->engine = xkl_engine_get_instance (eekboard->display);
|
||||
eekboard->registry = xkl_config_registry_get_instance (eekboard->engine);
|
||||
xkl_config_registry_load (eekboard->registry, FALSE);
|
||||
g_signal_connect (eekboard->engine, "X-config-changed",
|
||||
G_CALLBACK(on_xkl_config_changed), eekboard);
|
||||
g_signal_connect (eekboard->engine, "X-state-changed",
|
||||
G_CALLBACK(on_xkl_state_changed), eekboard);
|
||||
|
||||
gdk_window_add_filter (NULL,
|
||||
(GdkFilterFunc)filter_xkl_event,
|
||||
eekboard);
|
||||
gdk_window_add_filter (gdk_get_default_root_window (),
|
||||
(GdkFilterFunc) filter_xkl_event,
|
||||
eekboard);
|
||||
xkl_engine_start_listen (eekboard->engine, XKLL_TRACK_KEYBOARD_STATE);
|
||||
|
||||
return eekboard;
|
||||
}
|
||||
@ -1363,7 +1410,7 @@ config_parser_start_element (GMarkupParseContext *pcontext,
|
||||
config->rec = xkl_config_rec_new ();
|
||||
context->list = g_slist_prepend (context->list, config);
|
||||
} else
|
||||
context->text = g_string_sized_new (100);
|
||||
context->text->len = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1388,8 +1435,7 @@ config_parser_end_element (GMarkupParseContext *pcontext,
|
||||
if (!context->text)
|
||||
return;
|
||||
|
||||
text = g_string_free (context->text, FALSE);
|
||||
context->text = NULL;
|
||||
text = g_strndup (context->text->str, context->text->len);
|
||||
|
||||
if (g_strcmp0 (element_name, "name") == 0)
|
||||
config->name = text;
|
||||
@ -1409,7 +1455,6 @@ config_parser_text (GMarkupParseContext *pcontext,
|
||||
GError **error)
|
||||
{
|
||||
ConfigContext *context = user_data;
|
||||
if (context->text)
|
||||
context->text = g_string_append_len (context->text, text, text_len);
|
||||
}
|
||||
|
||||
@ -1531,7 +1576,6 @@ main (int argc, char *argv[])
|
||||
GSList *head;
|
||||
gint i;
|
||||
|
||||
memset (&context, 0, sizeof context);
|
||||
file = g_file_new_for_path (opt_config);
|
||||
|
||||
error = NULL;
|
||||
@ -1542,6 +1586,8 @@ main (int argc, char *argv[])
|
||||
exit (1);
|
||||
}
|
||||
|
||||
context.list = NULL;
|
||||
context.text = g_string_sized_new (BUFSIZ);
|
||||
pcontext = g_markup_parse_context_new (&config_parser,
|
||||
0,
|
||||
&context,
|
||||
@ -1565,6 +1611,7 @@ main (int argc, char *argv[])
|
||||
error = NULL;
|
||||
g_markup_parse_context_end_parse (pcontext, &error);
|
||||
g_markup_parse_context_free (pcontext);
|
||||
g_string_free (context.text, TRUE);
|
||||
g_object_unref (file);
|
||||
|
||||
if (context.list) {
|
||||
@ -1576,9 +1623,9 @@ main (int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
window = gtk_window_new (opt_standalone ?
|
||||
GTK_WINDOW_TOPLEVEL :
|
||||
GTK_WINDOW_POPUP);
|
||||
window = gtk_window_new (opt_popup ?
|
||||
GTK_WINDOW_POPUP :
|
||||
GTK_WINDOW_TOPLEVEL);
|
||||
gtk_widget_set_can_focus (window, FALSE);
|
||||
g_object_set (G_OBJECT(window), "accept_focus", FALSE, NULL);
|
||||
gtk_window_set_title (GTK_WINDOW(window), "Keyboard");
|
||||
@ -1590,7 +1637,7 @@ main (int argc, char *argv[])
|
||||
g_object_set_data (G_OBJECT(window), "eekboard", eekboard);
|
||||
widget = create_widget (eekboard, CSW, CSH);
|
||||
|
||||
if (opt_standalone) {
|
||||
if (!opt_popup) {
|
||||
create_menus (eekboard, window);
|
||||
menubar = gtk_ui_manager_get_widget (eekboard->ui_manager, "/MainMenu");
|
||||
gtk_box_pack_start (GTK_BOX (vbox), menubar, FALSE, FALSE, 0);
|
||||
@ -1632,7 +1679,7 @@ main (int argc, char *argv[])
|
||||
eekboard->window = window;
|
||||
eekboard->gconfc = gconfc;
|
||||
if (eekboard->accessibility_enabled) {
|
||||
if (!opt_standalone) {
|
||||
if (opt_popup) {
|
||||
NotifyNotification *notification;
|
||||
|
||||
error = NULL;
|
||||
@ -1663,8 +1710,7 @@ main (int argc, char *argv[])
|
||||
|
||||
gtk_widget_hide (window);
|
||||
|
||||
focusListener =
|
||||
SPI_createAccessibleEventListener (a11y_focus_listener,
|
||||
focusListener = SPI_createAccessibleEventListener ((AccessibleEventListenerCB)a11y_focus_listener,
|
||||
eekboard);
|
||||
SPI_registerGlobalEventListener (focusListener,
|
||||
"object:state-changed:focused");
|
||||
|
||||
Reference in New Issue
Block a user