Add patch to resolve wxGetKeyState() crash on Wayland (#1266743)

- Add patch to fix wxFontEnumerator stop function
- Add patch to fix wxNativeFontInfo::InitFromFont()
epel8
Scott Talbert 9 years ago
parent 8b9de376d3
commit e712f1cac9

@ -0,0 +1,47 @@
From a19e512e80acdb2a777c3e44923ad0b1178db35a Mon Sep 17 00:00:00 2001
From: Scott Talbert <swt@techie.net>
Date: Sun, 7 Aug 2016 23:15:41 -0400
Subject: [PATCH] Fix the stop function of wxFontEnumerator for wxGTK
In a wxFontEnumerator, if false is returned from OnFacename() or
OnFontEncoding(), the enumeration is supposed to stop. This was not happening
on wxGTK.
See https://github.com/wxWidgets/wxWidgets/pull/311
(cherry picked from commit 3572c2c6548bca2dbd439a3d25ed403fda99ebe9)
---
src/common/fontenumcmn.cpp | 3 ++-
src/unix/fontenum.cpp | 5 ++++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/common/fontenumcmn.cpp b/src/common/fontenumcmn.cpp
index 1185a86..f0d6f68 100644
--- a/src/common/fontenumcmn.cpp
+++ b/src/common/fontenumcmn.cpp
@@ -124,7 +124,8 @@ bool wxFontEnumerator::EnumerateEncodingsUTF8(const wxString& facename)
for ( size_t n = 0; n < count; n++ )
{
- OnFontEncoding(facenames[n], utf8);
+ if ( !OnFontEncoding(facenames[n], utf8) )
+ break;
}
return true;
diff --git a/src/unix/fontenum.cpp b/src/unix/fontenum.cpp
index cc7ee1d..e3739ed 100644
--- a/src/unix/fontenum.cpp
+++ b/src/unix/fontenum.cpp
@@ -89,7 +89,10 @@ bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding,
#endif
{
const gchar *name = pango_font_family_get_name(families[i]);
- OnFacename(wxString(name, wxConvUTF8));
+ if ( !OnFacename(wxString(name, wxConvUTF8)) )
+ {
+ break;
+ }
}
}
g_free(families);

@ -0,0 +1,48 @@
From 2dd407609b8987634180c045e9a6d131db6f947e Mon Sep 17 00:00:00 2001
From: Paul Cornett <paulcor@users.noreply.github.com>
Date: Mon, 17 Aug 2015 21:54:41 -0700
Subject: [PATCH] use gtk_show_uri() in wxLaunchDefaultBrowser() implementation
for GTK+
(cherry picked from commit 22eec388068044b9ea3c9fd1539d6686574a32df)
---
src/unix/utilsx11.cpp | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/src/unix/utilsx11.cpp b/src/unix/utilsx11.cpp
index 12ff73e..7d5811a 100644
--- a/src/unix/utilsx11.cpp
+++ b/src/unix/utilsx11.cpp
@@ -36,10 +36,11 @@
#endif
#ifdef __WXGTK__
-#include <gdk/gdk.h>
+#include <gtk/gtk.h>
#ifdef GDK_WINDOWING_X11
#include <gdk/gdkx.h>
#endif
+GdkWindow* wxGetTopLevelGDK();
#endif
// Only X11 backend is supported for wxGTK here
@@ -887,6 +888,19 @@ bool wxDoLaunchDefaultBrowser(const wxString& url, int flags)
{
wxUnusedVar(flags);
+#ifdef __WXGTK__
+#if GTK_CHECK_VERSION(2,14,0)
+#ifndef __WXGTK3__
+ if (gtk_check_version(2,14,0) == NULL)
+#endif
+ {
+ GdkScreen* screen = gdk_window_get_screen(wxGetTopLevelGDK());
+ if (gtk_show_uri(screen, url.utf8_str(), GDK_CURRENT_TIME, NULL))
+ return true;
+ }
+#endif // GTK_CHECK_VERSION(2,14,0)
+#endif // __WXGTK__
+
// Our best best is to use xdg-open from freedesktop.org cross-desktop
// compatibility suite xdg-utils
// (see http://portland.freedesktop.org/wiki/) -- this is installed on

@ -0,0 +1,39 @@
From 238a948ed01f27e05e2c0e08932e8da207590648 Mon Sep 17 00:00:00 2001
From: Scott Talbert <swt@techie.net>
Date: Tue, 9 Aug 2016 21:12:58 -0400
Subject: [PATCH] Fix wxNativeFontInfo::InitFromFont() when using Pango
Use pango_font_description_copy() to make a lossless copy of the original font
instead of doing it using wxWidgets API which is less direct and, in addition,
currently is completely broken as SetXXX() methods don't create the Pango font
description if it doesn't exist as they ought to.
See https://github.com/wxWidgets/wxWidgets/pull/312
(cherry picked from commit dbe2a1c2fdba53ad1d08ce36780267217933a876)
---
include/wx/fontutil.h | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/include/wx/fontutil.h b/include/wx/fontutil.h
index 60bb874..9e4d023 100644
--- a/include/wx/fontutil.h
+++ b/include/wx/fontutil.h
@@ -227,6 +227,9 @@ public :
// init with the parameters of the given font
void InitFromFont(const wxFont& font)
{
+#if wxUSE_PANGO
+ Init(*font.GetNativeFontInfo());
+#else
// translate all font parameters
SetStyle((wxFontStyle)font.GetStyle());
SetWeight((wxFontWeight)font.GetWeight());
@@ -252,6 +255,7 @@ public :
// deal with encoding now (it may override the font family and facename
// so do it after setting them)
SetEncoding(font.GetEncoding());
+#endif // !wxUSE_PANGO
}
// accessors and modifiers for the font elements

@ -0,0 +1,121 @@
From 98065821bbf0178981b50515094f565b703fcaa8 Mon Sep 17 00:00:00 2001
From: Scott Talbert <swt@techie.net>
Date: Tue, 13 Sep 2016 13:24:12 +0200
Subject: [PATCH] Fix wxGetKeyState() on non-X11 wxGTK backends (e.g., Wayland)
wxGetKeyState() does not currently work on non-X11 GTK backends, and in some
cases it has been reported to crash. It seems that the most likely use case
for wxGetKeyState() is to query the modifier keys, so on non-X11 backends, use
GTK+ calls to retrieve the modifier key state.
Non-modifier keys are not currently implemented, update the documentation to
mention this.
Closes https://github.com/wxWidgets/wxWidgets/pull/322
(this is a combined backport of 1033fb048dec849906f76ece25f154e6a61fde4e,
9f9c09e24a7f9d86ea51997bd4c55c1ddb7c3159 and
a18fe083cc91bee442863c8ab7f97d6549f2b75c from master)
---
interface/wx/utils.h | 3 +++
src/unix/utilsx11.cpp | 62 +++++++++++++++++++++++++++++++++++++++++++++++++--
2 files changed, 63 insertions(+), 2 deletions(-)
diff --git a/interface/wx/utils.h b/interface/wx/utils.h
index 0bac1c0..f127a74 100644
--- a/interface/wx/utils.h
+++ b/interface/wx/utils.h
@@ -372,6 +372,9 @@ wxString wxGetDisplayName();
Even though there are virtual key codes defined for mouse buttons, they
cannot be used with this function currently.
+ In wxGTK, this function can be only used with modifier keys (@c WXK_ALT, @c
+ WXK_CONTROL and @c WXK_SHIFT) when not using X11 backend currently.
+
@header{wx/utils.h}
*/
bool wxGetKeyState(wxKeyCode key);
diff --git a/src/unix/utilsx11.cpp b/src/unix/utilsx11.cpp
index 6b35551..efc0837 100644
--- a/src/unix/utilsx11.cpp
+++ b/src/unix/utilsx11.cpp
@@ -809,7 +809,7 @@ WXKeySym wxCharCodeWXToX(int id)
// check current state of a key
// ----------------------------------------------------------------------------
-bool wxGetKeyState(wxKeyCode key)
+static bool wxGetKeyStateX11(wxKeyCode key)
{
wxASSERT_MSG(key != WXK_LBUTTON && key != WXK_RBUTTON && key !=
WXK_MBUTTON, wxT("can't use wxGetKeyState() for mouse buttons"));
@@ -851,11 +851,69 @@ bool wxGetKeyState(wxKeyCode key)
// with the least-significant bit in the byte representing key 8N.
char key_vector[32];
XQueryKeymap(pDisplay, key_vector);
- return key_vector[keyCode >> 3] & (1 << (keyCode & 7));
+ return (key_vector[keyCode >> 3] & (1 << (keyCode & 7))) != 0;
}
#endif // !defined(__WXGTK__) || defined(GDK_WINDOWING_X11)
+// We need to use GDK functions when using wxGTK with a non-X11 backend, the
+// X11 code above can't work in this case.
+#ifdef __WXGTK__
+
+// gdk_keymap_get_modifier_state() is only available since 3.4
+#if GTK_CHECK_VERSION(3,4,0)
+
+#define wxHAS_GETKEYSTATE_GTK
+
+extern GtkWidget *wxGetRootWindow();
+
+static bool wxGetKeyStateGTK(wxKeyCode key)
+{
+ if (gtk_check_version(3,4,0) != NULL)
+ return false;
+
+ GdkDisplay* display = gtk_widget_get_display(wxGetRootWindow());
+ GdkKeymap* keymap = gdk_keymap_get_for_display(display);
+ guint state = gdk_keymap_get_modifier_state(keymap);
+ guint mask = 0;
+ switch (key)
+ {
+ case WXK_ALT:
+ mask = GDK_MOD1_MASK;
+ break;
+
+ case WXK_CONTROL:
+ mask = GDK_CONTROL_MASK;
+ break;
+
+ case WXK_SHIFT:
+ mask = GDK_SHIFT_MASK;
+ break;
+
+ default:
+ wxFAIL_MSG(wxS("Unsupported key, only modifiers can be used"));
+ return false;
+ }
+ return (state & mask) != 0;
+}
+
+#endif // GTK+ 3.4
+#endif // __WXGTK__
+
+bool wxGetKeyState(wxKeyCode key)
+{
+#ifdef wxHAS_GETKEYSTATE_GTK
+ GdkDisplay* display = gtk_widget_get_display(wxGetRootWindow());
+ const char* name = g_type_name(G_TYPE_FROM_INSTANCE(display));
+ if (strcmp(name, "GdkX11Display") != 0)
+ {
+ return wxGetKeyStateGTK(key);
+ }
+#endif // GTK+ 3.4+
+
+ return wxGetKeyStateX11(key);
+}
+
// ----------------------------------------------------------------------------
// Launch document with default app
// ----------------------------------------------------------------------------

@ -11,7 +11,7 @@
Name: %{wxgtkname}
Version: 3.0.2
Release: 20%{?dist}
Release: 21%{?dist}
Summary: GTK port of the wxWidgets GUI library
License: wxWidgets
Group: System Environment/Libraries
@ -65,6 +65,20 @@ Patch10: %{name}-%{version}-media-docs.patch
# For more details, see the upstream commit:
# https://github.com/wxWidgets/wxWidgets/commit/9fea81c069f9d803d79c4ce82f87a00a6e10b490
Patch11: %{name}-%{version}-size-alloc-fix.patch
# Fixes the stop function of wxFontEnumerator
# For more details, see the upstream commit:
# https://github.com/wxWidgets/wxWidgets/commit/a19e512e80acdb2a777c3e44923ad0b1178db35a
Patch12: %{name}-%{version}-font-enumerator-stop.patch
# Fixes wxNativeFontInfo::InitFromFont()
# For more details, see the upstream commit:
# https://github.com/wxWidgets/wxWidgets/commit/238a948ed01f27e05e2c0e08932e8da207590648
Patch13: %{name}-%{version}-init-from-font.patch
# Fixes wxGetKeyState() from crashing on Wayland
# For more details, see the upstream commits (first is just a dependency patch):
# https://github.com/wxWidgets/wxWidgets/commit/2dd407609b8987634180c045e9a6d131db6f947e
# https://github.com/wxWidgets/wxWidgets/commit/98065821bbf0178981b50515094f565b703fcaa8
Patch14: %{name}-%{version}-gtk-show-uri.patch
Patch15: %{name}-%{version}-wxgetkeystate.patch
BuildRequires: gtk%{gtkver}-devel
#Note webkitgtk (GTK2) does not appear to be supported
@ -190,6 +204,10 @@ This package provides XML documentation for the %{srcname} library.
%patch9 -p1 -b .wayland-window-sizing2
%patch10 -p1 -b .media-docs
%patch11 -p1 -b .size-alloc-fix
%patch12 -p1 -b .font-enumerator-stop
%patch13 -p1 -b .init-from-font
%patch14 -p1 -b .gtk-show-uri
%patch15 -p1 -b .wxgetkeystate
# patch some installed files to avoid conflicts with 2.8.*
sed -i -e 's|aclocal)|aclocal/wxwin3.m4)|' Makefile.in
@ -343,6 +361,11 @@ fi
%doc docs/doxygen/out/xml/*
%changelog
* Tue Sep 13 2016 Scott Talbert <swt@techie.net> - 3.0.2-21
- Add patch to resolve wxGetKeyState() crash on Wayland (#1266743)
- Add patch to fix wxFontEnumerator stop function
- Add patch to fix wxNativeFontInfo::InitFromFont()
* Sun Aug 28 2016 Jeremy Newton <alexjnewt AT hotmail DOT com> - 3.0.2-20
- Fix alternatives with wxGTK (#1077718)

Loading…
Cancel
Save