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
# 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])

View File

@ -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 ?

View File

@ -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);

View File

@ -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;
}
/**

View File

@ -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);
}

View File

@ -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");