Port GLX_INTEL_swap_event work around from Clutter-Gtk to eekboard.c.

This commit is contained in:
Daiki Ueno
2010-07-01 11:02:54 +09:00
parent a1f7d628bb
commit 687b2a83b4
3 changed files with 49 additions and 19 deletions

View File

@ -69,18 +69,15 @@ if test x$enable_clutter = xyes; then
PKG_CHECK_MODULES([CLUTTER], [clutter-1.0], , PKG_CHECK_MODULES([CLUTTER], [clutter-1.0], ,
[AC_MSG_ERROR([Clutter not found -- install it or add --disable-clutter])]) [AC_MSG_ERROR([Clutter not found -- install it or add --disable-clutter])])
AC_DEFINE([HAVE_CLUTTER], [1], [Define if Clutter is found]) AC_DEFINE([HAVE_CLUTTER], [1], [Define if Clutter is found])
PKG_CHECK_MODULES([CLUTTER_GTK], [clutter-gtk-0.90], need_swap_event_workaround=no
[enable_clutter_gtk=yes]) PKG_CHECK_MODULES([CLUTTER_GTK], [clutter-gtk-0.90],,
if test x$enable_clutter_gtk = xno; then [PKG_CHECK_MODULES([CLUTTER_GTK], [clutter-gtk-0.10 clutter-x11-1.0],
PKG_CHECK_MODULES([CLUTTER_GTK], [clutter-gtk-0.10], [need_swap_event_workaround=yes])])
[enable_clutter_gtk=yes]) AC_DEFINE([HAVE_CLUTTER_GTK], [1], [Define if Clutter-Gtk is found])
fi AC_DEFINE([NEED_SWAP_EVENT_WORKAROUND], [1],
if test x$enable_clutter_gtk = xyes; then [Define if GLX_INTEL_swap_event work around is needed])
AC_DEFINE([HAVE_CLUTTER_GTK], [1], [Define if Clutter-Gtk is found])
fi
fi fi
AM_CONDITIONAL(HAVE_CLUTTER, [test x$enable_clutter = xyes]) AM_CONDITIONAL(HAVE_CLUTTER, [test x$enable_clutter = xyes])
AM_CONDITIONAL(HAVE_CLUTTER_GTK, [test x$enable_clutter_gtk = xyes])
GTK_DOC_CHECK([1.14],[--flavour no-tmpl]) GTK_DOC_CHECK([1.14],[--flavour no-tmpl])

View File

@ -37,12 +37,7 @@ eekboard_LDFLAGS = \
$(LIBFAKEKEY_LIBS) $(LIBFAKEKEY_LIBS)
if HAVE_CLUTTER if HAVE_CLUTTER
eekboard_CFLAGS += $(CLUTTER_CFLAGS) eekboard_CFLAGS += $(CLUTTER_CFLAGS) $(CLUTTER_GTK_CFLAGS)
eekboard_LDFLAGS += $(CLUTTER_LIBS) eekboard_LDFLAGS += $(CLUTTER_LIBS) $(top_builddir)/eek/libeek-clutter.la $(CLUTTER_GTK_LIBS)
endif
if HAVE_CLUTTER_GTK
eekboard_CFLAGS += $(CLUTTER_GTK_CFLAGS)
eekboard_LDFLAGS += $(top_builddir)/eek/libeek-clutter.la $(CLUTTER_GTK_LIBS)
endif endif
endif endif

View File

@ -22,6 +22,9 @@
#if HAVE_CLUTTER_GTK #if HAVE_CLUTTER_GTK
#include <clutter-gtk/clutter-gtk.h> #include <clutter-gtk/clutter-gtk.h>
#if NEED_SWAP_EVENT_WORKAROUND
#include <clutter/x11/clutter-x11.h>
#endif
#endif #endif
#include <glib/gi18n.h> #include <glib/gi18n.h>
@ -75,6 +78,7 @@
struct _Eekboard { struct _Eekboard {
gboolean use_clutter; gboolean use_clutter;
gboolean need_swap_event_workaround;
Display *display; Display *display;
FakeKey *fakekey; FakeKey *fakekey;
GtkWidget *widget; GtkWidget *widget;
@ -920,6 +924,26 @@ create_widget_gtk (Eekboard *eekboard,
} }
#if HAVE_CLUTTER_GTK #if HAVE_CLUTTER_GTK
#if NEED_SWAP_EVENT_WORKAROUND
static GdkFilterReturn
gtk_clutter_filter_func (GdkXEvent *native_event,
GdkEvent *event,
gpointer user_data)
{
XEvent *xevent = native_event;
clutter_x11_handle_event (xevent);
return GDK_FILTER_CONTINUE;
}
static void
on_gtk_clutter_embed_realize (GtkWidget *widget, gpointer user_data)
{
gdk_window_add_filter (NULL, gtk_clutter_filter_func, widget);
}
#endif
static GtkWidget * static GtkWidget *
create_widget_clutter (Eekboard *eekboard, create_widget_clutter (Eekboard *eekboard,
gint initial_width, gint initial_width,
@ -942,6 +966,11 @@ create_widget_clutter (Eekboard *eekboard,
G_CALLBACK(on_key_released), eekboard); G_CALLBACK(on_key_released), eekboard);
eekboard->widget = gtk_clutter_embed_new (); eekboard->widget = gtk_clutter_embed_new ();
#if NEED_SWAP_EVENT_WORKAROUND
if (eekboard->need_swap_event_workaround)
g_signal_connect (eekboard->widget, "realize",
G_CALLBACK(on_gtk_clutter_embed_realize), NULL);
#endif
stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED(eekboard->widget)); stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED(eekboard->widget));
clutter_stage_set_color (CLUTTER_STAGE(stage), &stage_color); clutter_stage_set_color (CLUTTER_STAGE(stage), &stage_color);
clutter_stage_set_user_resizable (CLUTTER_STAGE (stage), TRUE); clutter_stage_set_user_resizable (CLUTTER_STAGE (stage), TRUE);
@ -969,12 +998,13 @@ create_widget (Eekboard *eekboard,
#endif #endif
Eekboard * Eekboard *
eekboard_new (gboolean use_clutter) eekboard_new (gboolean use_clutter, gboolean need_swap_event_workaround)
{ {
Eekboard *eekboard; Eekboard *eekboard;
eekboard = g_slice_new0 (Eekboard); eekboard = g_slice_new0 (Eekboard);
eekboard->use_clutter = use_clutter; eekboard->use_clutter = use_clutter;
eekboard->need_swap_event_workaround = need_swap_event_workaround;
eekboard->display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); eekboard->display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
if (!eekboard->display) { if (!eekboard->display) {
g_slice_free (Eekboard, eekboard); g_slice_free (Eekboard, eekboard);
@ -1104,6 +1134,7 @@ main (int argc, char *argv[])
{ {
const gchar *env; const gchar *env;
gboolean use_clutter = USE_CLUTTER; gboolean use_clutter = USE_CLUTTER;
gboolean need_swap_event_workaround = FALSE;
Eekboard *eekboard; Eekboard *eekboard;
GtkWidget *widget, *vbox, *menubar, *window; GtkWidget *widget, *vbox, *menubar, *window;
GOptionContext *context; GOptionContext *context;
@ -1133,6 +1164,13 @@ main (int argc, char *argv[])
g_warning ("Can't init Clutter-Gtk...fallback to GTK"); g_warning ("Can't init Clutter-Gtk...fallback to GTK");
use_clutter = FALSE; use_clutter = FALSE;
} }
#ifdef NEED_SWAP_EVENT_WORKAROUND
if (use_clutter &&
clutter_feature_available (CLUTTER_FEATURE_SWAP_EVENTS)) {
g_warning ("Enabling GLX_INTEL_swap_event workaround for Clutter-Gtk");
need_swap_event_workaround = TRUE;
}
#endif
#endif #endif
if (!use_clutter && !gtk_init_check (&argc, &argv)) { if (!use_clutter && !gtk_init_check (&argc, &argv)) {
@ -1140,7 +1178,7 @@ main (int argc, char *argv[])
exit (1); exit (1);
} }
eekboard = eekboard_new (use_clutter); eekboard = eekboard_new (use_clutter, need_swap_event_workaround);
if (opt_list_models) { if (opt_list_models) {
xkl_config_registry_foreach_model (eekboard->registry, xkl_config_registry_foreach_model (eekboard->registry,
print_item, print_item,