Compare commits

..

8 Commits

6 changed files with 84 additions and 54 deletions

View File

@ -16,12 +16,13 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301 USA # 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_CONFIG_SRCDIR([configure.ac])
AC_PREREQ(2.63) AC_PREREQ(2.63)
AM_INIT_AUTOMAKE AM_INIT_AUTOMAKE
AM_PROG_CC_C_O AM_PROG_CC_C_O
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
LT_INIT LT_INIT
IT_PROG_INTLTOOL([0.35.0]) IT_PROG_INTLTOOL([0.35.0])

View File

@ -123,7 +123,8 @@ eek_gtk_keyboard_finalize (GObject *object)
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(object); EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(object);
gint i; 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++) for (i = 0; i < EEK_KEYSYM_CATEGORY_LAST; i++)
pango_font_description_free (priv->fonts[i]); pango_font_description_free (priv->fonts[i]);
@ -357,7 +358,7 @@ redraw_keyboard (cairo_t *cr,
prepare_keyboard_surface (keyboard); 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]); 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]); gdk_cairo_set_source_color (cr, &style->fg[state]);
cairo_scale (cr, cairo_scale (cr,
key_surface_scale[KEY_SURFACE_LARGE], priv->scale * key_surface_scale[KEY_SURFACE_LARGE],
key_surface_scale[KEY_SURFACE_LARGE]); priv->scale * key_surface_scale[KEY_SURFACE_LARGE]);
eek_draw_key_label (cr, key, priv->fonts); eek_draw_key_label (cr, key, priv->fonts);
break; break;
} }
@ -492,11 +493,13 @@ on_key_released (EekKey *key, gpointer user_data)
EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard); EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard);
cairo_t *cr; cairo_t *cr;
cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (priv->widget)));
if (priv->key) { if (priv->key) {
cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (priv->widget)));
redraw_key (cr, priv->key, KEY_SURFACE_NORMAL, keyboard); redraw_key (cr, priv->key, KEY_SURFACE_NORMAL, keyboard);
cairo_destroy (cr);
priv->key = NULL; priv->key = NULL;
} }
cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (priv->widget)));
redraw_key (cr, key, KEY_SURFACE_NORMAL, keyboard); redraw_key (cr, key, KEY_SURFACE_NORMAL, keyboard);
cairo_destroy (cr); cairo_destroy (cr);
} }
@ -583,6 +586,7 @@ on_size_allocate (GtkWidget *widget,
cairo_surface_destroy (priv->keyboard_surface); cairo_surface_destroy (priv->keyboard_surface);
priv->keyboard_surface = NULL; priv->keyboard_surface = NULL;
} }
g_hash_table_remove_all (priv->key_surfaces);
eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds); eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds);
priv->scale = allocation->width > allocation->height ? priv->scale = allocation->width > allocation->height ?

View File

@ -538,7 +538,6 @@ eek_keyboard_find_key_by_position (EekKeyboard *keyboard,
gdouble y) gdouble y)
{ {
FkbpData data; FkbpData data;
EekSection *section;
EekBounds bounds; EekBounds bounds;
eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds); eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds);

View File

@ -632,9 +632,13 @@ eek_xkb_layout_set_names_full (EekXkbLayout *layout,
...) ...)
{ {
va_list var_args; va_list var_args;
gboolean retval;
va_start (var_args, layout); 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); va_end (var_args);
return retval;
} }
/** /**

View File

@ -244,23 +244,6 @@ eek_xkl_layout_class_init (EekXklLayoutClass *klass)
g_object_class_install_property (gobject_class, PROP_OPTIONS, pspec); 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 static void
eek_xkl_layout_init (EekXklLayout *self) eek_xkl_layout_init (EekXklLayout *self)
{ {
@ -274,13 +257,6 @@ eek_xkl_layout_init (EekXklLayout *self)
g_return_if_fail (display); g_return_if_fail (display);
priv->engine = xkl_engine_get_instance (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); xkl_config_rec_get_from_server (priv->config, priv->engine);
set_xkb_component_names (self, priv->config); set_xkb_component_names (self, priv->config);
} }

View File

@ -229,7 +229,7 @@ static gboolean opt_version = FALSE;
#if HAVE_CLUTTER_GTK #if HAVE_CLUTTER_GTK
static gchar *opt_toolkit = NULL; static gchar *opt_toolkit = NULL;
#endif #endif
static gboolean opt_standalone = FALSE; static gboolean opt_popup = FALSE;
static gchar *opt_config = NULL; static gchar *opt_config = NULL;
static const GOptionEntry options[] = { static const GOptionEntry options[] = {
@ -249,8 +249,8 @@ static const GOptionEntry options[] = {
{"toolkit", 't', 0, G_OPTION_ARG_STRING, &opt_toolkit, {"toolkit", 't', 0, G_OPTION_ARG_STRING, &opt_toolkit,
N_("Toolkit (\"clutter\" or \"gtk\")")}, N_("Toolkit (\"clutter\" or \"gtk\")")},
#endif #endif
{"standalone", 's', 0, G_OPTION_ARG_NONE, &opt_standalone, {"popup", 'p', 0, G_OPTION_ARG_NONE, &opt_popup,
N_("Start as a standalone application")}, N_("Start as a popup window")},
{"config", 'c', 0, G_OPTION_ARG_STRING, &opt_config, {"config", 'c', 0, G_OPTION_ARG_STRING, &opt_config,
N_("Specify configuration file")}, N_("Specify configuration file")},
{"version", 'v', 0, G_OPTION_ARG_NONE, &opt_version, {"version", 'v', 0, G_OPTION_ARG_NONE, &opt_version,
@ -293,6 +293,7 @@ on_quit (gpointer user_data)
if (eekboard->fakekey) if (eekboard->fakekey)
fakekey_release (eekboard->fakekey); fakekey_release (eekboard->fakekey);
eekboard_free (eekboard); eekboard_free (eekboard);
return TRUE;
} }
static void static void
@ -417,7 +418,7 @@ on_key_pressed (EekKeyboard *keyboard,
{ {
Eekboard *eekboard = user_data; Eekboard *eekboard = user_data;
gint group, level; gint group, level;
guint keysym, modifiers = 0; guint keysym;
keysym = eek_key_get_keysym (key); keysym = eek_key_get_keysym (key);
EEKBOARD_NOTE("%s %X", eek_keysym_to_string (keysym), eekboard->modifiers); EEKBOARD_NOTE("%s %X", eek_keysym_to_string (keysym), eekboard->modifiers);
@ -425,7 +426,7 @@ on_key_pressed (EekKeyboard *keyboard,
switch (keysym) { switch (keysym) {
case XK_Shift_L: case XK_Shift_L:
case XK_Shift_R: case XK_Shift_R:
eekboard->modifiers ^= ShiftMask; eekboard->modifiers |= ShiftMask;
eek_keyboard_get_keysym_index (keyboard, &group, &level); eek_keyboard_get_keysym_index (keyboard, &group, &level);
eek_keyboard_set_keysym_index (keyboard, group, eek_keyboard_set_keysym_index (keyboard, group,
(eekboard->modifiers & Mod5Mask) ? 2 : (eekboard->modifiers & Mod5Mask) ? 2 :
@ -433,7 +434,7 @@ on_key_pressed (EekKeyboard *keyboard,
0); 0);
break; break;
case XK_ISO_Level3_Shift: case XK_ISO_Level3_Shift:
eekboard->modifiers ^= Mod5Mask; eekboard->modifiers |= Mod5Mask;
eek_keyboard_get_keysym_index (keyboard, &group, &level); eek_keyboard_get_keysym_index (keyboard, &group, &level);
eek_keyboard_set_keysym_index (keyboard, group, eek_keyboard_set_keysym_index (keyboard, group,
(eekboard->modifiers & Mod5Mask) ? 2 : (eekboard->modifiers & Mod5Mask) ? 2 :
@ -442,14 +443,17 @@ on_key_pressed (EekKeyboard *keyboard,
break; break;
case XK_Control_L: case XK_Control_L:
case XK_Control_R: case XK_Control_R:
eekboard->modifiers ^= ControlMask; eekboard->modifiers |= ControlMask;
break; break;
case XK_Alt_L: case XK_Alt_L:
case XK_Alt_R: case XK_Alt_R:
eekboard->modifiers ^= Mod1Mask; eekboard->modifiers |= Mod1Mask;
break; break;
default: default:
fakekey_press_keysym (eekboard->fakekey, keysym, eekboard->modifiers); 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; 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 *
eekboard_new (gboolean use_clutter, eekboard_new (gboolean use_clutter,
gboolean need_swap_event_workaround, gboolean need_swap_event_workaround,
@ -1200,6 +1235,18 @@ eekboard_new (gboolean use_clutter,
eekboard->engine = xkl_engine_get_instance (eekboard->display); eekboard->engine = xkl_engine_get_instance (eekboard->display);
eekboard->registry = xkl_config_registry_get_instance (eekboard->engine); eekboard->registry = xkl_config_registry_get_instance (eekboard->engine);
xkl_config_registry_load (eekboard->registry, FALSE); 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; return eekboard;
} }
@ -1363,7 +1410,7 @@ config_parser_start_element (GMarkupParseContext *pcontext,
config->rec = xkl_config_rec_new (); config->rec = xkl_config_rec_new ();
context->list = g_slist_prepend (context->list, config); context->list = g_slist_prepend (context->list, config);
} else } else
context->text = g_string_sized_new (100); context->text->len = 0;
} }
static void static void
@ -1388,8 +1435,7 @@ config_parser_end_element (GMarkupParseContext *pcontext,
if (!context->text) if (!context->text)
return; return;
text = g_string_free (context->text, FALSE); text = g_strndup (context->text->str, context->text->len);
context->text = NULL;
if (g_strcmp0 (element_name, "name") == 0) if (g_strcmp0 (element_name, "name") == 0)
config->name = text; config->name = text;
@ -1409,7 +1455,6 @@ config_parser_text (GMarkupParseContext *pcontext,
GError **error) GError **error)
{ {
ConfigContext *context = user_data; ConfigContext *context = user_data;
if (context->text)
context->text = g_string_append_len (context->text, text, text_len); context->text = g_string_append_len (context->text, text, text_len);
} }
@ -1531,7 +1576,6 @@ main (int argc, char *argv[])
GSList *head; GSList *head;
gint i; gint i;
memset (&context, 0, sizeof context);
file = g_file_new_for_path (opt_config); file = g_file_new_for_path (opt_config);
error = NULL; error = NULL;
@ -1542,6 +1586,8 @@ main (int argc, char *argv[])
exit (1); exit (1);
} }
context.list = NULL;
context.text = g_string_sized_new (BUFSIZ);
pcontext = g_markup_parse_context_new (&config_parser, pcontext = g_markup_parse_context_new (&config_parser,
0, 0,
&context, &context,
@ -1565,6 +1611,7 @@ main (int argc, char *argv[])
error = NULL; error = NULL;
g_markup_parse_context_end_parse (pcontext, &error); g_markup_parse_context_end_parse (pcontext, &error);
g_markup_parse_context_free (pcontext); g_markup_parse_context_free (pcontext);
g_string_free (context.text, TRUE);
g_object_unref (file); g_object_unref (file);
if (context.list) { if (context.list) {
@ -1576,9 +1623,9 @@ main (int argc, char *argv[])
} }
} }
window = gtk_window_new (opt_standalone ? window = gtk_window_new (opt_popup ?
GTK_WINDOW_TOPLEVEL : GTK_WINDOW_POPUP :
GTK_WINDOW_POPUP); GTK_WINDOW_TOPLEVEL);
gtk_widget_set_can_focus (window, FALSE); gtk_widget_set_can_focus (window, FALSE);
g_object_set (G_OBJECT(window), "accept_focus", FALSE, NULL); g_object_set (G_OBJECT(window), "accept_focus", FALSE, NULL);
gtk_window_set_title (GTK_WINDOW(window), "Keyboard"); 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); g_object_set_data (G_OBJECT(window), "eekboard", eekboard);
widget = create_widget (eekboard, CSW, CSH); widget = create_widget (eekboard, CSW, CSH);
if (opt_standalone) { if (!opt_popup) {
create_menus (eekboard, window); create_menus (eekboard, window);
menubar = gtk_ui_manager_get_widget (eekboard->ui_manager, "/MainMenu"); menubar = gtk_ui_manager_get_widget (eekboard->ui_manager, "/MainMenu");
gtk_box_pack_start (GTK_BOX (vbox), menubar, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), menubar, FALSE, FALSE, 0);
@ -1632,7 +1679,7 @@ main (int argc, char *argv[])
eekboard->window = window; eekboard->window = window;
eekboard->gconfc = gconfc; eekboard->gconfc = gconfc;
if (eekboard->accessibility_enabled) { if (eekboard->accessibility_enabled) {
if (!opt_standalone) { if (opt_popup) {
NotifyNotification *notification; NotifyNotification *notification;
error = NULL; error = NULL;
@ -1663,8 +1710,7 @@ main (int argc, char *argv[])
gtk_widget_hide (window); gtk_widget_hide (window);
focusListener = focusListener = SPI_createAccessibleEventListener ((AccessibleEventListenerCB)a11y_focus_listener,
SPI_createAccessibleEventListener (a11y_focus_listener,
eekboard); eekboard);
SPI_registerGlobalEventListener (focusListener, SPI_registerGlobalEventListener (focusListener,
"object:state-changed:focused"); "object:state-changed:focused");