[Git][wxwidgets/wxwidgets][3.2] 5 commits: Fix handling window total size under GNOME with X11

2 views
Skip to first unread message

Vadim Zeitlin (@_VZ_)

unread,
May 25, 2025, 1:59:53 PMMay 25
to wx-commi...@googlegroups.com

Vadim Zeitlin pushed to branch 3.2 at wxWidgets / wxWidgets

Commits:

  • fca32498
    by Vadim Zeitlin at 2025-04-29T19:14:51+02:00
    Fix handling window total size under GNOME with X11
    
    Due to getting two notifications about _NET_REQUEST_FRAME_EXTENTS from
    mutter (GNOME WM), we didn't do the right thing as the second one
    arrived after mapping the window and the code assumed that in this case
    the window already has the correct size and only internal size needs to
    be adjusted.
    
    In this case, however, the window doesn't have the correct size and we
    need to adjust it once we get the real decoration sizes values and not
    just zeroes for all of them that we get during the first notification.
    
    Note that we can't just filter out that first notification because then
    we never map the window and so never get the second one.
    
    See #25348.
    
    (cherry picked from commit 9537141500371fe498ac98d9d48494e58f662b55)
    
  • eec195c0
    by Václav Slavík at 2025-05-07T19:29:35+02:00
    Implement GetMainWindowOfCompositeControl for wxDataViewCtrl
    
    Implement GetMainWindowOfCompositeControl() in the generic version of
    wxDataViewCtrl so that focus is reported correctly.
    
    See #25372.
    
    (cherry picked from commit 863e18f5969ad121c42719f36d200d2dde93d5fe)
    
  • 6269297a
    by Vadim Zeitlin at 2025-05-20T21:03:09+02:00
    Fix defining ELF symbols versions when flavour is used
    
    Unfortunately the changes of f3eb19ce2e (Fix ABI breakage for versioned
    symbols in 3.2.7, 2025-04-14) themselves broke another use case, as they
    didn't take into account the fact that ELF version includes the library
    flavour and hardcoded the version without it in elfversion.h.
    
    Fix this by defining wxELF_VERSION_PREFIX in configure and using it in
    this header to use proper symver value even when flavour is not empty.
    
    See #25327.
    
    Closes #25436.
    
  • f2b84430
    by Vadim Zeitlin at 2025-05-25T17:10:39+02:00
    Fix test for .symver asm directive support in configure
    
    We need to use it with the correct, i.e. existing, symbol name, which
    means the mangled name actually used by the linker and not just the name
    of the function as it appears in the source.
    
    Fix the test to actually detect lack of support for .symver when using
    clang with -flto.
    
    Closes #25438.
    
  • 5db4aebd
    by Vadim Zeitlin at 2025-05-25T19:37:33+02:00
    Add 3.2.8.1 section to the change log
    
    Document that these changes were made in 3.2.8.1 and not 3.2.9 as
    initially planned.
    

7 changed files:

Changes:

  • configure
    ... ... @@ -33873,18 +33873,26 @@ if ${wx_cv_elf_symver_multiple+:} false; then :
    33873 33873
     else
    
    33874 33874
     
    
    33875 33875
                         echo "lib_new {}; lib_old { *; };" >conftest.sym
    
    33876
    +                    ac_ext=cpp
    
    33877
    +ac_cpp='$CXXCPP $CPPFLAGS'
    
    33878
    +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
    
    33879
    +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
    
    33880
    +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
    
    33881
    +
    
    33876 33882
                         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
    
    33877 33883
     /* end confdefs.h.  */
    
    33878 33884
     
    
    33879 33885
     
    
    33880 33886
                                 #include "wx/private/elfversion.h"
    
    33881
    -                            wxELF_SYMVER("foo","foo@lib_old")
    
    33882
    -                            wxELF_SYMVER("foo","foo@@lib_new")
    
    33887
    +                            extern "C" {
    
    33888
    +                            wxELF_SYMVER("_foo","_foo@lib_old")
    
    33889
    +                            wxELF_SYMVER("_foo","_foo@@lib_new")
    
    33883 33890
                                 void foo() {}
    
    33891
    +                            }
    
    33884 33892
                                 int main() { return 0; }
    
    33885 33893
     
    
    33886 33894
     _ACEOF
    
    33887
    -if ac_fn_c_try_link "$LINENO"; then :
    
    33895
    +if ac_fn_cxx_try_link "$LINENO"; then :
    
    33888 33896
       wx_cv_elf_symver_multiple=yes
    
    33889 33897
     else
    
    33890 33898
       wx_cv_elf_symver_multiple=no
    
    ... ... @@ -33892,6 +33900,12 @@ else
    33892 33900
     fi
    
    33893 33901
     rm -f core conftest.err conftest.$ac_objext \
    
    33894 33902
         conftest$ac_exeext conftest.$ac_ext
    
    33903
    +                    ac_ext=c
    
    33904
    +ac_cpp='$CPP $CPPFLAGS'
    
    33905
    +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
    
    33906
    +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
    
    33907
    +ac_compiler_gnu=$ac_cv_c_compiler_gnu
    
    33908
    +
    
    33895 33909
                         rm -f conftest.sym
    
    33896 33910
     
    
    33897 33911
     
    
    ... ... @@ -33909,17 +33923,25 @@ if ${wx_cv_elf_symver+:} false; then :
    33909 33923
     else
    
    33910 33924
     
    
    33911 33925
                             echo "lib_new {}; lib_old { *; };" >conftest.sym
    
    33926
    +                        ac_ext=cpp
    
    33927
    +ac_cpp='$CXXCPP $CPPFLAGS'
    
    33928
    +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
    
    33929
    +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
    
    33930
    +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
    
    33931
    +
    
    33912 33932
                             cat confdefs.h - <<_ACEOF >conftest.$ac_ext
    
    33913 33933
     /* end confdefs.h.  */
    
    33914 33934
     
    
    33915 33935
     
    
    33916 33936
                                     #include "wx/private/elfversion.h"
    
    33917
    -                                wxELF_SYMVER("foo","foo@@lib_new")
    
    33937
    +                                extern "C" {
    
    33938
    +                                wxELF_SYMVER("_foo","_foo@@lib_new")
    
    33918 33939
                                     void foo() {}
    
    33940
    +                                }
    
    33919 33941
                                     int main() { return 0; }
    
    33920 33942
     
    
    33921 33943
     _ACEOF
    
    33922
    -if ac_fn_c_try_link "$LINENO"; then :
    
    33944
    +if ac_fn_cxx_try_link "$LINENO"; then :
    
    33923 33945
       wx_cv_elf_symver=yes
    
    33924 33946
     else
    
    33925 33947
       wx_cv_elf_symver=no
    
    ... ... @@ -33927,6 +33949,12 @@ else
    33927 33949
     fi
    
    33928 33950
     rm -f core conftest.err conftest.$ac_objext \
    
    33929 33951
         conftest$ac_exeext conftest.$ac_ext
    
    33952
    +                        ac_ext=c
    
    33953
    +ac_cpp='$CPP $CPPFLAGS'
    
    33954
    +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
    
    33955
    +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
    
    33956
    +ac_compiler_gnu=$ac_cv_c_compiler_gnu
    
    33957
    +
    
    33930 33958
                             rm -f conftest.sym
    
    33931 33959
     
    
    33932 33960
     
    
    ... ... @@ -34309,7 +34337,14 @@ if test "$wxUSE_DEBUG_INFO" = "yes"; then
    34309 34337
         DEBUG_INFO=1
    
    34310 34338
     fi
    
    34311 34339
     
    
    34312
    -WX_VERSION_TAG=`echo WX${lib_unicode_suffix}${WX_LIB_FLAVOUR}_${WX_RELEASE} | tr '[a-z]' '[A-Z]'`
    
    34340
    +wxELF_VERSION_PREFIX=`echo WX${lib_unicode_suffix}${WX_LIB_FLAVOUR}_ | tr '[a-z]' '[A-Z]'`
    
    34341
    +if test "$wxUSE_ELF_SYMVER" != "no"; then
    
    34342
    +    cat >>confdefs.h <<_ACEOF
    
    34343
    +#define wxELF_VERSION_PREFIX "$wxELF_VERSION_PREFIX"
    
    34344
    +_ACEOF
    
    34345
    +
    
    34346
    +fi
    
    34347
    +WX_VERSION_TAG="${wxELF_VERSION_PREFIX}${WX_RELEASE}"
    
    34313 34348
     
    
    34314 34349
     TOOLCHAIN_NAME="${TOOLKIT_DIR}${TOOLKIT_VERSION}${WIDGET_SET}${lib_unicode_suffix}${WX_LIB_FLAVOUR}-${WX_RELEASE}${HOST_SUFFIX}"
    
    34315 34350
     
    

  • configure.in
    ... ... @@ -4025,17 +4025,21 @@ if test "$wxUSE_SHARED" = "yes"; then
    4025 4025
                     wx_cv_elf_symver_multiple,
    
    4026 4026
                     [
    
    4027 4027
                         echo "lib_new {}; lib_old { *; };" >conftest.sym
    
    4028
    +                    AC_LANG_PUSH(C++)
    
    4028 4029
                         AC_LINK_IFELSE([
    
    4029 4030
                             AC_LANG_SOURCE([
    
    4030 4031
                                 #include "wx/private/elfversion.h"
    
    4031
    -                            wxELF_SYMVER("foo","foo@lib_old")
    
    4032
    -                            wxELF_SYMVER("foo","foo@@lib_new")
    
    4032
    +                            extern "C" {
    
    4033
    +                            wxELF_SYMVER("_foo","_foo@lib_old")
    
    4034
    +                            wxELF_SYMVER("_foo","_foo@@lib_new")
    
    4033 4035
                                 void foo() {}
    
    4036
    +                            }
    
    4034 4037
                                 int main() { return 0; }
    
    4035 4038
                             ])],
    
    4036 4039
                             wx_cv_elf_symver_multiple=yes,
    
    4037 4040
                             wx_cv_elf_symver_multiple=no
    
    4038 4041
                         )
    
    4042
    +                    AC_LANG_POP()
    
    4039 4043
                         rm -f conftest.sym
    
    4040 4044
                     ]
    
    4041 4045
                 )
    
    ... ... @@ -4047,16 +4051,20 @@ if test "$wxUSE_SHARED" = "yes"; then
    4047 4051
                         wx_cv_elf_symver,
    
    4048 4052
                         [
    
    4049 4053
                             echo "lib_new {}; lib_old { *; };" >conftest.sym
    
    4054
    +                        AC_LANG_PUSH(C++)
    
    4050 4055
                             AC_LINK_IFELSE([
    
    4051 4056
                                 AC_LANG_SOURCE([
    
    4052 4057
                                     #include "wx/private/elfversion.h"
    
    4053
    -                                wxELF_SYMVER("foo","foo@@lib_new")
    
    4058
    +                                extern "C" {
    
    4059
    +                                wxELF_SYMVER("_foo","_foo@@lib_new")
    
    4054 4060
                                     void foo() {}
    
    4061
    +                                }
    
    4055 4062
                                     int main() { return 0; }
    
    4056 4063
                                 ])],
    
    4057 4064
                                 wx_cv_elf_symver=yes,
    
    4058 4065
                                 wx_cv_elf_symver=no
    
    4059 4066
                             )
    
    4067
    +                        AC_LANG_POP()
    
    4060 4068
                             rm -f conftest.sym
    
    4061 4069
                         ]
    
    4062 4070
                     )
    
    ... ... @@ -4204,7 +4212,11 @@ if test "$wxUSE_DEBUG_INFO" = "yes"; then
    4204 4212
         DEBUG_INFO=1
    
    4205 4213
     fi
    
    4206 4214
     
    
    4207
    -WX_VERSION_TAG=`echo WX${lib_unicode_suffix}${WX_LIB_FLAVOUR}_${WX_RELEASE} | tr '[[a-z]]' '[[A-Z]]'`
    
    4215
    +wxELF_VERSION_PREFIX=`echo WX${lib_unicode_suffix}${WX_LIB_FLAVOUR}_ | tr '[[a-z]]' '[[A-Z]]'`
    
    4216
    +if test "$wxUSE_ELF_SYMVER" != "no"; then
    
    4217
    +    AC_DEFINE_UNQUOTED(wxELF_VERSION_PREFIX, "$wxELF_VERSION_PREFIX")
    
    4218
    +fi
    
    4219
    +WX_VERSION_TAG="${wxELF_VERSION_PREFIX}${WX_RELEASE}"
    
    4208 4220
     
    
    4209 4221
     TOOLCHAIN_NAME="${TOOLKIT_DIR}${TOOLKIT_VERSION}${WIDGET_SET}${lib_unicode_suffix}${WX_LIB_FLAVOUR}-${WX_RELEASE}${HOST_SUFFIX}"
    
    4210 4222
     
    

  • docs/changes.txt
    ... ... @@ -252,11 +252,23 @@ Changes in behaviour which may result in build errors
    252 252
     3.2.9: (released 2025-??-??)
    
    253 253
     ----------------------------
    
    254 254
     
    
    255
    +wxGTK:
    
    256
    +
    
    257
    +- Fix handling total window size with GNOME with X11 (#25348).
    
    258
    +
    
    255 259
     wxOSX:
    
    256 260
     
    
    257 261
     - Do not activate "Close" button on Cmd-C (nobugshere, #25346).
    
    258 262
     
    
    259 263
     
    
    264
    +3.2.8.1: (released 2025-05-25)
    
    265
    +------------------------------
    
    266
    +
    
    267
    +This hotfix release corrects regressions in 3.2.8 for configure builds on
    
    268
    +platforms using ELF if --with-flavour is specified (#25436) or LTO is used
    
    269
    +with clang (#25438).
    
    270
    +
    
    271
    +
    
    260 272
     3.2.8: (released 2025-04-24)
    
    261 273
     ----------------------------
    
    262 274
     
    

  • include/wx/private/elfversion.h
    ... ... @@ -34,12 +34,8 @@
    34 34
             #define wxELF_SYMVER_NON_DEFAULT(sym, ver)
    
    35 35
         #endif
    
    36 36
     
    
    37
    -    // Our version tag depends on whether we're using Unicode or not.
    
    38
    -    #if wxUSE_UNICODE
    
    39
    -        #define wxMAKE_ELF_VERSION_TAG(ver) "WXU_" ver
    
    40
    -    #else
    
    41
    -        #define wxMAKE_ELF_VERSION_TAG(ver) "WX_" ver
    
    42
    -    #endif
    
    37
    +    // wxELF_VERSION_PREFIX is defined by configure if wxHAVE_ELF_SYMVER is.
    
    38
    +    #define wxMAKE_ELF_VERSION_TAG(ver) wxELF_VERSION_PREFIX ver
    
    43 39
     
    
    44 40
         // This macro is used to repair ABI compatibility problems with the symbols
    
    45 41
         // versions: unfortunately, some symbols were initially added with the
    

  • setup.h.in
    ... ... @@ -23,6 +23,9 @@
    23 23
     /* Are multiple versions of the same symbol supported? */
    
    24 24
     #undef wxHAVE_ELF_SYMVER_MULTIPLE
    
    25 25
     
    
    26
    +/* Prefix for the ELF version used for the library symbols. */
    
    27
    +#undef wxELF_VERSION_PREFIX
    
    28
    +
    
    26 29
     /* Define if ssize_t type is available.  */
    
    27 30
     #undef HAVE_SSIZE_T
    
    28 31
     
    

  • src/generic/datavgen.cpp
    ... ... @@ -301,6 +301,9 @@ public:
    301 301
         wxDataViewCtrl *GetOwner() const
    
    302 302
             { return static_cast<wxDataViewCtrl *>(GetParent()); }
    
    303 303
     
    
    304
    +    virtual wxWindow *GetMainWindowOfCompositeControl() wxOVERRIDE
    
    305
    +        { return GetOwner(); }
    
    306
    +
    
    304 307
         // Add/Remove additional column to sorting columns
    
    305 308
         void ToggleSortByColumn(int column)
    
    306 309
         {
    
    ... ... @@ -774,6 +777,9 @@ public:
    774 777
         wxDataViewModel* GetModel() { return GetOwner()->GetModel(); }
    
    775 778
         const wxDataViewModel* GetModel() const { return GetOwner()->GetModel(); }
    
    776 779
     
    
    780
    +    virtual wxWindow *GetMainWindowOfCompositeControl() wxOVERRIDE
    
    781
    +        { return GetOwner(); }
    
    782
    +
    
    777 783
     #if wxUSE_DRAG_AND_DROP
    
    778 784
         wxBitmap CreateItemBitmap( unsigned int row, int &indent );
    
    779 785
     #endif // wxUSE_DRAG_AND_DROP
    

  • src/gtk/toplevel.cpp
    ... ... @@ -1500,7 +1500,19 @@ void wxTopLevelWindowGTK::GTKUpdateDecorSize(const DecorSize& decorSize)
    1500 1500
                 }
    
    1501 1501
                 DoSetSizeHints(m_minWidth, m_minHeight, m_maxWidth, m_maxHeight, m_incWidth, m_incHeight);
    
    1502 1502
             }
    
    1503
    -        if (m_deferShow)
    
    1503
    +
    
    1504
    +        // We decide to defer showing the window only when its total (and not
    
    1505
    +        // client) size had been set, and in this case we didn't set it
    
    1506
    +        // correctly because we didn't have the correct decorations sizes when
    
    1507
    +        // we did it -- but now that we do, we can adjust the size to the
    
    1508
    +        // desired value.
    
    1509
    +        //
    
    1510
    +        // Note that we can't test for m_deferShow itself here because it may
    
    1511
    +        // have been already reset to false if a WM had generated a
    
    1512
    +        // notification with wrong _NET_REQUEST_FRAME_EXTENTS values first (as
    
    1513
    +        // mutter does, at least in GNOME 3.48, where it sends 0 values for the
    
    1514
    +        // not yet mapped window).
    
    1515
    +        if (m_deferShowAllowed)
    
    1504 1516
             {
    
    1505 1517
                 // keep overall size unchanged by shrinking m_widget
    
    1506 1518
                 int w, h;
    
    ... ... @@ -1517,7 +1529,11 @@ void wxTopLevelWindowGTK::GTKUpdateDecorSize(const DecorSize& decorSize)
    1517 1529
             }
    
    1518 1530
             if (!resized)
    
    1519 1531
             {
    
    1520
    -            // adjust overall size to match change in frame extents
    
    1532
    +            // We can't resize the window, either because it's already shown
    
    1533
    +            // (i.e. we didn't defer showing it) or because resizing it would
    
    1534
    +            // make it smaller than its minimum size. In this case we have to
    
    1535
    +            // adjust the stored size to accurately reflect the actual size of
    
    1536
    +            // the window.
    
    1521 1537
                 m_width  += diff.x;
    
    1522 1538
                 m_height += diff.y;
    
    1523 1539
                 if (m_width  < 1) m_width  = 1;
    

Reply all
Reply to author
Forward
0 new messages