Port GLX_INTEL_swap_event work around from Clutter-Gtk to eekboard.c.
This commit is contained in:
17
configure.ac
17
configure.ac
@ -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])
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user