Update to 0.3.3 release
This commit is contained in:
parent
16aebe50a6
commit
ccf38f1b04
@ -1,119 +0,0 @@
|
|||||||
changeset: 111:95f570fc49e1
|
|
||||||
user: "Daniel P. Berrange <berrange@redhat.com>"
|
|
||||||
date: Wed Jan 09 23:54:24 2008 -0500
|
|
||||||
files: src/vncdisplay.c
|
|
||||||
description:
|
|
||||||
Track keystate & send fake events for GTK key-repeat flaw & to reset state on focus out
|
|
||||||
|
|
||||||
|
|
||||||
diff -r 73b4f4043cb5 -r 95f570fc49e1 src/vncdisplay.c
|
|
||||||
--- a/src/vncdisplay.c Tue Jan 01 14:57:39 2008 -0600
|
|
||||||
+++ b/src/vncdisplay.c Wed Jan 09 23:54:24 2008 -0500
|
|
||||||
@@ -43,6 +43,8 @@ struct _VncDisplayPrivate
|
|
||||||
|
|
||||||
gboolean in_pointer_grab;
|
|
||||||
gboolean in_keyboard_grab;
|
|
||||||
+
|
|
||||||
+ guint down_keyval[16];
|
|
||||||
|
|
||||||
int button_mask;
|
|
||||||
int last_x;
|
|
||||||
@@ -392,7 +394,58 @@ static gboolean key_event(GtkWidget *wid
|
|
||||||
&level,
|
|
||||||
&consumed);
|
|
||||||
|
|
||||||
- gvnc_key_event(priv->gvnc, key->type == GDK_KEY_PRESS ? 1 : 0, keyval);
|
|
||||||
+ /*
|
|
||||||
+ * More VNC suckiness with key state & modifiers in particular
|
|
||||||
+ *
|
|
||||||
+ * Because VNC has no concept of modifiers, we have to track what keys are
|
|
||||||
+ * pressed and when the widget looses focus send fake key up events for all
|
|
||||||
+ * keys current held down. This is because upon gaining focus any keys held
|
|
||||||
+ * down are no longer likely to be down. This would thus result in keys
|
|
||||||
+ * being 'stuck on' in the remote server. eg upon Alt-Tab to switch window
|
|
||||||
+ * focus you'd never see key up for the Alt or Tab keys without this :-(
|
|
||||||
+ *
|
|
||||||
+ * This is mostly a problem with modifier keys, but its best to just track
|
|
||||||
+ * all key presses regardless. There's a limit to how many keys a user can
|
|
||||||
+ * press at once due to a max of 10 fingers (normally :-), so down_key_vals
|
|
||||||
+ * is only storing upto 16 for now. Should be plenty...
|
|
||||||
+ *
|
|
||||||
+ * Arggggh.
|
|
||||||
+ */
|
|
||||||
+ if (key->type == GDK_KEY_PRESS) {
|
|
||||||
+ int i;
|
|
||||||
+ for (i = 0 ; i < (int)(sizeof(priv->down_keyval)/sizeof(priv->down_keyval[0])) ; i++) {
|
|
||||||
+ if (priv->down_keyval[i] == 0) {
|
|
||||||
+ priv->down_keyval[i] = keyval;
|
|
||||||
+ /* Send the actual key event we're dealing with */
|
|
||||||
+ gvnc_key_event(priv->gvnc, 1, keyval);
|
|
||||||
+ break;
|
|
||||||
+ } else if (priv->down_keyval[i] == keyval) {
|
|
||||||
+ /* Got an press when we're already pressed ! Why ... ?
|
|
||||||
+ *
|
|
||||||
+ * Well, GTK merges sequential press+release pairs of the same
|
|
||||||
+ * key so instead of press+release,press+release,press+release
|
|
||||||
+ * we only get press+press+press+press+press+release. This
|
|
||||||
+ * really annoys some VNC servers, so we have to un-merge
|
|
||||||
+ * them into a sensible stream of press+release pairs
|
|
||||||
+ */
|
|
||||||
+ /* Fake an up event for the previous down event */
|
|
||||||
+ gvnc_key_event(priv->gvnc, 0, keyval);
|
|
||||||
+ /* Now send our actual ldown event */
|
|
||||||
+ gvnc_key_event(priv->gvnc, 1, keyval);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ } else {
|
|
||||||
+ int i;
|
|
||||||
+ for (i = 0 ; i < (int)(sizeof(priv->down_keyval)/sizeof(priv->down_keyval[0])) ; i++) {
|
|
||||||
+ /* We were pressed, and now we're released, so... */
|
|
||||||
+ if (priv->down_keyval[i] == keyval) {
|
|
||||||
+ priv->down_keyval[i] = 0;
|
|
||||||
+ /* ..send the key releae event we're dealing with */
|
|
||||||
+ gvnc_key_event(priv->gvnc, 0, keyval);
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
|
|
||||||
if (key->type == GDK_KEY_PRESS &&
|
|
||||||
((keyval == GDK_Control_L && (key->state & GDK_MOD1_MASK)) ||
|
|
||||||
@@ -436,6 +489,28 @@ static gboolean leave_event(GtkWidget *w
|
|
||||||
|
|
||||||
if (priv->grab_keyboard)
|
|
||||||
do_keyboard_ungrab(VNC_DISPLAY(widget), FALSE);
|
|
||||||
+
|
|
||||||
+ return TRUE;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+static gboolean focus_event(GtkWidget *widget, GdkEventFocus *focus G_GNUC_UNUSED,
|
|
||||||
+ gpointer data G_GNUC_UNUSED)
|
|
||||||
+{
|
|
||||||
+ VncDisplayPrivate *priv = VNC_DISPLAY(widget)->priv;
|
|
||||||
+ int i;
|
|
||||||
+
|
|
||||||
+ if (priv->gvnc == NULL || !gvnc_is_initialized(priv->gvnc))
|
|
||||||
+ return TRUE;
|
|
||||||
+
|
|
||||||
+ for (i = 0 ; i < (int)(sizeof(priv->down_keyval)/sizeof(priv->down_keyval[0])) ; i++) {
|
|
||||||
+ /* We are currently pressed so... */
|
|
||||||
+ if (priv->down_keyval[i] != 0) {
|
|
||||||
+ /* ..send the fake key releae event to match */
|
|
||||||
+ gvnc_key_event(priv->gvnc, 0, priv->down_keyval[i]);
|
|
||||||
+ priv->down_keyval[i] = 0;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
@@ -1128,6 +1203,8 @@ static void vnc_display_init(VncDisplay
|
|
||||||
G_CALLBACK(enter_event), NULL);
|
|
||||||
g_signal_connect(obj, "leave-notify-event",
|
|
||||||
G_CALLBACK(leave_event), NULL);
|
|
||||||
+ g_signal_connect(obj, "focus-out-event",
|
|
||||||
+ G_CALLBACK(focus_event), NULL);
|
|
||||||
|
|
||||||
GTK_WIDGET_SET_FLAGS(obj, GTK_CAN_FOCUS);
|
|
||||||
|
|
||||||
|
|
42
gtk-vnc.spec
42
gtk-vnc.spec
@ -1,16 +1,22 @@
|
|||||||
# -*- rpm-spec -*-
|
# -*- rpm-spec -*-
|
||||||
|
|
||||||
|
# Plugin isn't ready for real world use yet - it needs
|
||||||
|
# a security audit at very least
|
||||||
|
%define with_plugin 0
|
||||||
|
|
||||||
Summary: A GTK widget for VNC clients
|
Summary: A GTK widget for VNC clients
|
||||||
Name: gtk-vnc
|
Name: gtk-vnc
|
||||||
Version: 0.3.2
|
Version: 0.3.3
|
||||||
Release: 2%{?dist}
|
Release: 1%{?dist}
|
||||||
License: LGPLv2+
|
License: LGPLv2+
|
||||||
Group: Development/Libraries
|
Group: Development/Libraries
|
||||||
Source: http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.gz
|
Source: http://downloads.sourceforge.net/%{name}/%{name}-%{version}.tar.gz
|
||||||
Patch1: %{name}-%{version}-keystate-tracking.patch
|
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||||
URL: http://gtk-vnc.sf.net/
|
URL: http://gtk-vnc.sf.net/
|
||||||
BuildRequires: gtk2-devel pygtk2-devel python-devel gnutls-devel zlib-devel
|
BuildRequires: gtk2-devel pygtk2-devel python-devel gnutls-devel zlib-devel
|
||||||
|
%if %{with_plugin}
|
||||||
|
BuildRequires: firefox-devel
|
||||||
|
%endif
|
||||||
|
|
||||||
%description
|
%description
|
||||||
gtk-vnc is a VNC viewer widget for GTK. It is built using coroutines
|
gtk-vnc is a VNC viewer widget for GTK. It is built using coroutines
|
||||||
@ -40,12 +46,27 @@ allowing it to be completely asynchronous while remaining single threaded.
|
|||||||
|
|
||||||
A module allowing use of the GTK-VNC widget from python
|
A module allowing use of the GTK-VNC widget from python
|
||||||
|
|
||||||
|
%package plugin
|
||||||
|
Summary: Mozilla plugin for the gtk-vnc library
|
||||||
|
Group: Development/Libraries
|
||||||
|
Requires: %{name} = %{version}
|
||||||
|
|
||||||
|
%description plugin
|
||||||
|
gtk-vnc is a VNC viewer widget for GTK. It is built using coroutines
|
||||||
|
allowing it to be completely asynchronous while remaining single threaded.
|
||||||
|
|
||||||
|
This package provides a web browser plugin for Mozilla compatible
|
||||||
|
browsers.
|
||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q
|
%setup -q
|
||||||
%patch1 -p1
|
|
||||||
|
|
||||||
%build
|
%build
|
||||||
|
%if %{with_plugin}
|
||||||
|
%configure --enable-plugin=yes
|
||||||
|
%else
|
||||||
%configure
|
%configure
|
||||||
|
%endif
|
||||||
make
|
make
|
||||||
|
|
||||||
%install
|
%install
|
||||||
@ -55,6 +76,10 @@ rm -f %{buildroot}%{_libdir}/*.a
|
|||||||
rm -f %{buildroot}%{_libdir}/*.la
|
rm -f %{buildroot}%{_libdir}/*.la
|
||||||
rm -f %{buildroot}%{_libdir}/python*/site-packages/*.a
|
rm -f %{buildroot}%{_libdir}/python*/site-packages/*.a
|
||||||
rm -f %{buildroot}%{_libdir}/python*/site-packages/*.la
|
rm -f %{buildroot}%{_libdir}/python*/site-packages/*.la
|
||||||
|
%if %{with_plugin}
|
||||||
|
rm -f %{buildroot}%{_libdir}/mozilla/plugins/%{name}-plugin.a
|
||||||
|
rm -f %{buildroot}%{_libdir}/mozilla/plugins/%{name}-plugin.la
|
||||||
|
%endif
|
||||||
|
|
||||||
%clean
|
%clean
|
||||||
rm -fr %{buildroot}
|
rm -fr %{buildroot}
|
||||||
@ -81,7 +106,16 @@ rm -fr %{buildroot}
|
|||||||
%doc examples/gvncviewer.py
|
%doc examples/gvncviewer.py
|
||||||
%{_libdir}/python*/site-packages/gtkvnc.so
|
%{_libdir}/python*/site-packages/gtkvnc.so
|
||||||
|
|
||||||
|
%if %{with_plugin}
|
||||||
|
%files plugin
|
||||||
|
%defattr(-, root, root)
|
||||||
|
%{_libdir}/mozilla/plugins/%{name}-plugin.so
|
||||||
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Sun Feb 3 2008 Daniel P. Berrange <berrange@redhat.com> - 0.3.3-1.fc9
|
||||||
|
- Update to 0.3.3 release
|
||||||
|
|
||||||
* Mon Jan 14 2008 Daniel P. Berrange <berrange@redhat.com> - 0.3.2-2.fc9
|
* Mon Jan 14 2008 Daniel P. Berrange <berrange@redhat.com> - 0.3.2-2.fc9
|
||||||
- Track keystate to avoid stuck modifier keys
|
- Track keystate to avoid stuck modifier keys
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user