From e712f1cac9b3dba310c6812129d484e8a0e11a93 Mon Sep 17 00:00:00 2001 From: Scott Talbert Date: Tue, 13 Sep 2016 23:09:57 -0400 Subject: [PATCH] Add patch to resolve wxGetKeyState() crash on Wayland (#1266743) - Add patch to fix wxFontEnumerator stop function - Add patch to fix wxNativeFontInfo::InitFromFont() --- wxGTK3-3.0.2-font-enumerator-stop.patch | 47 +++++++++ wxGTK3-3.0.2-gtk-show-uri.patch | 48 ++++++++++ wxGTK3-3.0.2-init-from-font.patch | 39 ++++++++ wxGTK3-3.0.2-wxgetkeystate.patch | 121 ++++++++++++++++++++++++ wxGTK3.spec | 25 ++++- 5 files changed, 279 insertions(+), 1 deletion(-) create mode 100644 wxGTK3-3.0.2-font-enumerator-stop.patch create mode 100644 wxGTK3-3.0.2-gtk-show-uri.patch create mode 100644 wxGTK3-3.0.2-init-from-font.patch create mode 100644 wxGTK3-3.0.2-wxgetkeystate.patch diff --git a/wxGTK3-3.0.2-font-enumerator-stop.patch b/wxGTK3-3.0.2-font-enumerator-stop.patch new file mode 100644 index 0000000..f587882 --- /dev/null +++ b/wxGTK3-3.0.2-font-enumerator-stop.patch @@ -0,0 +1,47 @@ +From a19e512e80acdb2a777c3e44923ad0b1178db35a Mon Sep 17 00:00:00 2001 +From: Scott Talbert +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); diff --git a/wxGTK3-3.0.2-gtk-show-uri.patch b/wxGTK3-3.0.2-gtk-show-uri.patch new file mode 100644 index 0000000..e886120 --- /dev/null +++ b/wxGTK3-3.0.2-gtk-show-uri.patch @@ -0,0 +1,48 @@ +From 2dd407609b8987634180c045e9a6d131db6f947e Mon Sep 17 00:00:00 2001 +From: Paul Cornett +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 ++#include + #ifdef GDK_WINDOWING_X11 + #include + #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 diff --git a/wxGTK3-3.0.2-init-from-font.patch b/wxGTK3-3.0.2-init-from-font.patch new file mode 100644 index 0000000..d251a8c --- /dev/null +++ b/wxGTK3-3.0.2-init-from-font.patch @@ -0,0 +1,39 @@ +From 238a948ed01f27e05e2c0e08932e8da207590648 Mon Sep 17 00:00:00 2001 +From: Scott Talbert +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 diff --git a/wxGTK3-3.0.2-wxgetkeystate.patch b/wxGTK3-3.0.2-wxgetkeystate.patch new file mode 100644 index 0000000..7ab7093 --- /dev/null +++ b/wxGTK3-3.0.2-wxgetkeystate.patch @@ -0,0 +1,121 @@ +From 98065821bbf0178981b50515094f565b703fcaa8 Mon Sep 17 00:00:00 2001 +From: Scott Talbert +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 + // ---------------------------------------------------------------------------- diff --git a/wxGTK3.spec b/wxGTK3.spec index 94d4729..a7bd134 100644 --- a/wxGTK3.spec +++ b/wxGTK3.spec @@ -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 - 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 - 3.0.2-20 - Fix alternatives with wxGTK (#1077718)