Commit Graph

73492 Commits

Author SHA1 Message Date
Joan Bruguera Micó
238dd2a8ea Ignore spurious map-events on Wayland's wxGLCanvasEGL
In the recent changes for handling map/unmap events on Wayland's
wxGLCanvasEGL, we use the following GTK widget signals:
* The "map-event" signal to create the canvas's subsurface.
  The earlier "map" signal can not be used, as the associated toplevel
  window's Wayland surface may not yet exist by the time we receive it.
* The "unmap" signal to destroy the canvas's subsurface.
  Using the later "unmap-event" signal is problematic, due to other
  resources we build upon being already destroyed by then.

Usually, the "map-event" signal comes before "unmap" and resources are
created and destroyed appropriately. However, there's an edge case:
If a canvas is shown and then immediately hidden (before wxWidgets can
pump from the event loop), "unmap" will come before "map-event".
This happens because signals like "map" and "unmap" are delivered
immediately (when calling e.g. `gtk_widget_hide`), while signals like
"map-event" and "unmap-event" are delivered later on the event loop.

For the same reason, showing a canvas, then immediately hiding it, then
immediately showing it again, will cause two "map-event"s to get
delivered enqueued without a "unmap" in between.

This condition can be hit quite easily when setting up a complex UIs,
and in particular it is triggered by Aegisub during startup, leading to
a crash (Wayland protocol error) when opening a video later, or when
specifying a video directly on the startup command line.

To avoid this breaking our resource management, add some checks to detect
those "map-event"s we shouldn't handle - either the ones that happen
after "unmap", or the duplicate ones without an "unmap" in between.

See #23961, #23968.

(cherry picked from commit 133f7731b25df46bd99519e7c52cf4a90ca2cc1a)
2023-10-30 00:49:12 +01:00
Joan Bruguera Micó
3d235b8da6 Clean up Wayland resources on wxGLCanvas destructor
If the wxGLCanvas is destroyed immediately (without hiding it first),
the GTKs widget's `unmap` signal which usually destroys the Wayland
resources is not emitted. Thus, we need to ensure they are destroyed
on the destructor instead.

This fixes an use-after-free issue, sometimes causing a crash, because
one of the leaked resources is the canvas's Wayland frame callback.

See #24013, #24016.

(cherry picked from commit 22ae7a58b5412463194b446426296b588368bff8)
2023-10-30 00:49:12 +01:00
Vadim Zeitlin
45ac25826b Ensure that we call eglSwapInterval() for the correct context
Calling it from the frame callback might change the swap interval for
the wrong context if the active context got changed in the meanwhile,
but by the time SwapBuffers() is called the correct context must be set.

Doing it there also allows to unify X11 and Wayland code branches.

See #24014.

(cherry picked from commit 64afa9d96341f3696ba5311d36fd3a82f7c9de77)
2023-10-30 00:49:12 +01:00
Vadim Zeitlin
414faff190 Show the window in wxGLCanvasEGL tracing messages
This is useful when there is more than one window using EGL.

(cherry picked from commit 547fb15c51b43b9486c6c5422a60a27fbf53eb43)
2023-10-30 00:49:12 +01:00
Vadim Zeitlin
c4612cd1b9 Fix wxGLCanvasEGL::IsShownOnScreen() under Wayland
Don't use m_readyToDraw in it, as the canvas is still shown even when
it's not ready to draw yet, and use m_wlSubsurface instead as it is
destroyed when the window is unmapped.

See #23899.

(cherry picked from commit cf44a87ec62f9cefb428b8d6c002c2ee342dc4ec)
2023-10-30 00:49:12 +01:00
Vadim Zeitlin
7df5cf53f4 Handle all cases in switch instead of using "default"
No real changes, just clean up the code a bit to make sure we get a
-Wswitch if any elements are added to wxDisplayType enum in the future.

(cherry picked from commit d128afe1e8fff6fbd16c46ffbe30eaba706ff274)
2023-10-30 00:49:12 +01:00
Stefan Csomor
3586813817 Fix showing windows for background apps under macOS Sonoma
Change implementation to use Sonoma-supported version of the application
activation call.

See #23893, #24003.

(cherry picked from commit 695ca042895468a8ce6c1a84422882adb3c63ee9)
2023-10-30 00:49:12 +01:00
Vadim Zeitlin
79aac7a626 Document wxGTK regression fix for console apps linked with GUI
This is rather important to mention in the change log.
2023-10-23 02:00:25 +02:00
Vadim Zeitlin
c816229fc3 Fix losing the other selection contents in wxClipboard
The memory leak fix in b52728a62a (Fix memory leak of wxClipboard data
on exit, 2023-06-21) was too eager and destroyed not just the currently
used selection (e.g. primary), but also the other one (secondary) when
Clear() was called, which was wrong and resulted in the loss of
clipboard contents when discarding the primary selection in wxSTC, for
example.

Fix this by only deleting the object corresponding to the selection
which we're clearing.

See #23661, #23988.

(cherry picked from commit dc6a0c069bdde714f22cb0459efd9ad186ce7179)
2023-10-23 01:57:13 +02:00
Vadim Zeitlin
0b0437af20 Fix refreshing wxGenericListCtrl with multiple selection
Changing the selection could behave wrongly and result in an assert
failure as the selection anchor could have become invalid, due to the
change of the number of items in the control.

Fix this by invalidating it when this happens.

(cherry picked from commit 5885eea5ea72434311f2c706f57cff92a09ade91)
2023-10-23 01:57:13 +02:00
Vadim Zeitlin
cf66599eba Avoid spurious memory leak reports from static MSVC CRT
The leak check is done before the FlsAlloc()-installed callback function
runs in this build variant and so reports wxThreadSpecificInfo object,
and everything it contains, as leaked, even if it isn't, really, so
deallocate it explicitly ourselves in this case.

Also call wxThreadSpecificInfoTLS::CleanUp() from the main thread as
well, which fixes a possible real (albeit one-time only, so not really)
memory leak under XP where FLS API is not available.
2023-10-23 01:57:13 +02:00
Vadim Zeitlin
3f7660f6c1 Remove redundant "const" from wxItemId conversion operator
This "const" is ignored and just results in a warning from MSVS 17.6.

See #23590.

(cherry picked from commit 946aa6bbc430302265aea41754c13729f931edf4)
2023-10-23 01:57:13 +02:00
Vadim Zeitlin
b6e9e37e54 Merge branch 'update-3.2.4' into 3.2
Update version to 3.2.4.
2023-10-23 01:56:39 +02:00
Paul Cornett
1444565855 Avoid crash with GTK3 if console program is linked to GUI library
A console program should not really be linked with the GUI library, but it used
to work, and it's unavoidable with the monolithic build, so fix the regression.
See #23981

(cherry picked from commit 4cabfa111ab5912ae30d6d44b917a9c403845b3f)
2023-10-21 10:22:37 -07:00
Paul Cornett
5560e59330 Build fix for wxUSE_DATETIME==0
(backport of 642f226eb67dae12fd408c2c198c236b3cde5f9f)
2023-10-14 11:52:09 -07:00
Paul Cornett
744d7b8c09 Fix memory leak in wxBitmap with GTK3
Introduced in f7247086c2 (Fix storing wxBitmap data in GdkPixbuf, 2019-09-18)

(cherry picked from commit 7fbe3698c5e3eb89693e8a4e9f54e7f89d69ec87)
2023-10-14 11:51:41 -07:00
Vadim Zeitlin
30f00b81f4 Improve instructions for updating the change log
And add a section for 3.2.4 to it.
2023-10-10 16:11:14 +02:00
Vadim Zeitlin
61beda2a9e Update version to 3.2.4
Run ./misc/scripts/inc_release, bakefile and autoconf.
2023-10-10 16:02:59 +02:00
Vadim Zeitlin
1631d97816 Add a reminder to review libtool version info before the release
It would have been better to do it before 3.2.3 rather than after, but
still better to do it before 3.2.4 than never.
2023-10-10 15:57:14 +02:00
Vadim Zeitlin
df14ec7308 Mention that the final release tag must be of the form vX.Y.Z
Otherwise the Ruby script updating the release statistics would fail.
2023-10-10 15:53:04 +02:00
Vadim Zeitlin
cc7fefd9f1 Update 3.2.3 release check sums
Also mention that MinGW-gcc 13.2.0 binaries are available now.
2023-10-09 21:00:45 +02:00
Vadim Zeitlin
015e120fa8 Install Doxygen in MSW part of make_release workflow
Somehow it's not available by default any longer.
2023-10-07 16:28:50 +02:00
Vadim Zeitlin
ffb9f2e035 Propagate the changes from README to the announcement too
This was forgotten in the last commit.
2023-10-07 16:20:10 +02:00
Vadim Zeitlin
c5114b80fb Update release documentation for 3.2.3
Update the changes section in the README/announcement and the version
number and date everywhere.
2023-10-07 15:31:08 +02:00
Vadim Zeitlin
c55c478965 Fix recently introduced use of nullptr in wxGenericListCtrl
Correct the too hastily backported change of cb69e76897 (Fix not
refreshing generic wxListCtrl after deleting last item, 2023-10-06)
and use NULL instead of nullptr in this branch.
2023-10-07 15:22:40 +02:00
Vadim Zeitlin
ee8dfc6267 Document that wxLogInterposerTemp shouldn't be used
Mark it as deprecated in the documentation without deprecating it
formally in the code, as it seems to be used in some existing code and
there is no urgency to remove it, but using it in new code still doesn't
make any sense.

See #23945.

(cherry picked from commit 543fd3fabcb6d88a6e220520c41501c3f961dd55)
2023-10-06 19:11:38 +02:00
Vadim Zeitlin
cb69e76897 Fix not refreshing generic wxListCtrl after deleting last item
The check for the line being deleted being in the visible range
prevented us from refreshing anything at all if the line which was just
deleted was the last line of the control.

(cherry picked from commit 8d036af8160d303b67944d781d27ff58b058f839)
2023-10-06 19:11:31 +02:00
Vadim Zeitlin
20d4f2fb43 Fix using *.* and similar patterns in wxDir under MSW
These patterns are supposed to match all files and not only files with
extensions, but our own code only matched the latter.

Switch to using shell PathMatchSpec() function to check for matching
instead to use the usual Windows rules.

See #23905, #23910.

(cherry picked from commit a4d2e36cec16d511e461496f3eecbcb6f3e7343b)
2023-10-06 17:16:49 +02:00
Vadim Zeitlin
d178223745 Add AddAvailableCatalog() and use it in AddStdCatalog()
The new function only returns true if the catalog could be really
loaded and not if it is considered not to be needed because the message
ID language (which is typically "en-US") happens to be present in the
preferred UI languages list (which seems to always include "en-US" in at
least Western European MSW).

This allows to distinguish, albeit in a rather awkward (but
backwards-compatible) way between having a translation for the given
language and not needed such translation.

It is still not clear if it is really correct to return "en-US" from the
list of preferred languages even if the user has never intentionally
configured the OS to indicate that English is acceptable, but at least
now we can work around this issue and use AddAvailableCatalog() in
AddStdCatalog() to make sure we only skip loading unversioned wxstd.mo
if the versioned wxstd-x.y.mo file is really found instead of never
doing it, as was the case until now (see #23886).

Also add GetBestAvailableTranslation() helper which seems more useful
than the existing GetBestTranslation() one and is similarly related to
it.

See #18227, #23930.

(cherry picked from commit 94b1a17aeb12a1ec723a255089be16cd31a268a2)
2023-10-06 15:42:15 +02:00
Maarten Bent
cbf081db91 CMake: fix RegularExpression::compile errors
When the wxWidgets sources are in a path containing '++', CMake would
show errors on the command line:

[cmake] RegularExpression::compile(): Nested *?+.
[cmake] RegularExpression::compile(): Error in compile

This happens because the full path was interpreted as a regular
expression when creating the source_groups. Without wxSOURCE_DIR the
regular expressions still match and create correct source groups, so
remove it.

See #22738, #23943.

(cherry picked from commit b9b0724de141696edf817fb032aa51daf699b48b)
2023-10-06 01:11:13 +02:00
charvey2718
e30a6a3828 Fix bug with "pass through" mouse events from MSW wxFileDialog
Remove any remaining mouse messages from the input queue after showing
the file dialog because they somehow remain after it is destroyed and
could be processed by the application once wxFileDialog::ShowModal()
returns, resulting in phantom events being processed by the controls
that just happen to be under the button of the file dialog that was
clicked to close it.

See #10924, #23944.

(cherry picked from commit ffc99bd487731629308af9af79205003b7d7e3b0)
2023-10-06 01:11:13 +02:00
Vadim Zeitlin
ed002d3b58 Fix wxComboCtrl popup behaviour under some Wayland compositors
We need to set the window type hint to COMBO in order to use a popup
window for it under Wayland and while not doing it seems to still work
with GNOME/mutter, it is required with the other compositors such as KDE
Plasma or Sway and doesn't seem to do any harm under GNOME, so do it
always and hope that it doesn't result in any problems with not
combobox-like popups.

This basically undoes 62d934aab8 (Don't set HINT_COMBO as wxPopupWindow
is used for different windows as well, 2008-10-07).

See #23931, #23908.

Co-authored-by: Alex Shvartzkop <dudesuchamazing@gmail.com>

(cherry picked from commit 5c0cc72cb838371a823e2469a044a4cf92fb6a5f)
2023-10-04 18:42:21 +02:00
Vadim Zeitlin
78203cd889 Ensure we have "+" button when adding children to wxTreeCtrl item
The control doesn't update the button itself, even in the recent Windows
versions, so do it ourselves.

It might be better to use I_CHILDRENCALLBACK and handle TVN_GETDISPINFO,
but this looks like a safer change, so do this for now.

See #23718, #23734.

(cherry picked from commit 3ed273ce98083e2e9c81bfb550a68ed4b322ae88)
2023-10-04 18:40:46 +02:00
Vadim Zeitlin
8de60c856f Ensure we don't crash when checking for cancelling print job
Don't dereference sm_abortWindow without checking that it is non-null in
wxAbortProc(): even though it's not supposed to happen, it still somehow
does, apparently, so just log a debug message instead of crashing in
this case.

See #23927.

(cherry picked from commit 9a728192c4340b34d2509898f7f16b767a794ac9)
2023-10-04 02:48:21 +02:00
Vadim Zeitlin
0efe1b7c29 Fix wxBusyInfo layout when using wxGTK
Use a dirty hack to ensure the window is created (roughly) as tall as it
needs to be instead of being created too small and truncating the text
in it.

See #23936.

(cherry picked from commit 71001385c6d66412f3f07b0fdc5a8d5ab022f296)
2023-10-04 02:46:40 +02:00
Stefan Hansson
6fdf2fbec1 Implement wxRB_SINGLE support in wxGTK
Create hidden radio button in wxGTK when using wxRB_SINGLE, as
this lets us deactivate the shown button by activating the hidden one.
GTK does not allow deactivating radio buttons by calling them with
gtk_toggle_button_set_active( ..., FALSE), so we need to work around
it like this.

Also update the documentation to mention that this works in wxGTK now.

See #17022, #23652, #23677, #23839.

(modified cherry-pick of b84b45161a2952bc3706fa87619e2bf9d8237f22)
2023-10-03 19:40:39 +02:00
Vadim Zeitlin
701239e6ed Fix wxGTK dark mode code compilation with C++98
This should have been done as part of 3becb59acd (Enable using a dark
theme when Gnome "dark style" is set, 2023-09-30).

See #23764.
2023-10-03 19:40:39 +02:00
Fabrice de Gans
8e97592225 Give better error if EGL version is less than 1.5
Improve error handling when EGL version is less than 1.5: fail earlier
and with more clear error message.

See #22325, #23855.

(cherry picked from commit 19ed2580d39b0f0914ee89556cce340bfe09a1c0)
2023-10-03 18:58:42 +02:00
Vadim Zeitlin
a07ce5bee3 Avoid catastrophic slowdown when hiding wxGLCanvas under Wayland
Set EGL swap interval to 0 to prevent EGL functions from blocking for 1
second when the window is entirely obscured, resulting in catastrophic
slowdown of the entire program whenever this happened.

See #23909, #23512.

(cherry picked from commit aaabb840b59d24796f521a1174dc428999a2a5a3)
2023-10-03 18:50:15 +02:00
Vadim Zeitlin
94e99068f3 Make wxListCtrl checkboxes behaviour more consistent
Improve consistency of checkboxes in wxListCtrl between virtual and
report mode, and between the generic and MSW implementation, see #23869.

See #23890.

(cherry picked from commit e8faf2f56c4f0205a195cbeca66e03874d980577)
2023-10-03 18:39:00 +02:00
Vadim Zeitlin
1c50dac999 Fix initial size of wxPreferencesEditor in wxGTK under Wayland
Setting full size of the dialog before showing it doesn't work, but
setting its client size does.

It could be better to change wxWindow::Fit() itself to do this, but this
might have other effects, while this change should be pretty safe, i.e.
not break anything for the other platforms while fixing a big usability
problem with wxGTK/Wayland: as this dialog is not resizeable, making it
too small initially, as happened before, meant that parts of it couldn't
be used at all.

See #23924.

(cherry picked from commit 532ee2067b5101c079b162644401ed11d418a65f)
2023-10-03 18:34:35 +02:00
Vadim Zeitlin
a0794ca229 Ensure that the currently shown wxSimplebook page has focus
When calling wxSimplebook::ChangeSelection(), the focus remained on the
previous, now hidden, page, unless it was explicitly set to one of the
controls on the new page.

This was completely unexpected as it could result in the user
(inadvertently) changing the values of the already "accepted" controls
on the last page, so don't let this happen and always set the focus to
the new page explicitly, even if this hasn't been done by
ShowWithEffect() which doesn't do it at least under wxMSW.

See #23914.

(cherry picked from commit 7e9d06f58436300243fe3b8b076dc222b63dea2e)
2023-10-03 18:33:17 +02:00
Vadim Zeitlin
c0519934aa Fix background colour for empty cells in generic wxDataViewCtrl
There were two related problems: first, any attempts to set the
background colour for the cells without values were simply ignored
because we didn't call wxDataViewModel::GetAttr() at all from
PrepareForItem() in this case and, second, PrepareForItem() itself was
not called when repainting the control neither, resulting in the
existing attribute being reused for the items without values, meaning
that they used the last background colour that was set instead of at
least not using any background at all.

Fix both of the problems for the generic version. Unfortunately the GTK
one still doesn't allow setting the background for the empty cells, but
at least when not doing it the code now consistently leaves them without
any background.

The following code can be added to MyMusicTreeModel in the dataview
sample for testing this:

--------------------------------- >8 --------------------------------------
    bool GetAttr( const wxDataViewItem& item, unsigned int col, wxDataViewItemAttr& attr) const override
    {
        if (col != 1)
            return false;

        if (IsContainer(item))
        {
            if (item != m_pop)
                return false;

            attr.SetBackgroundColour(*wxYELLOW);
        }
        else
        {
            attr.SetColour(*wxYELLOW);
            attr.SetBackgroundColour(*wxLIGHT_GREY);
        }

        return true;
    }
--------------------------------- >8 --------------------------------------

See #23708, #23902.

(cherry picked from commit fe420caa3bc966b968be985fbba0c0ff5a897546)
2023-10-03 18:32:31 +02:00
Václav Slavík
6c53ccbf91 Fix invisible wxStaticLine on macOS >= 13
NSBox used as a separator must have its type set to NSBoxSeparator.

This apparently didn't matter before in practice, but starting with
macOS 13, separators - i.e. narrow NSBoxes - without the type correctly
set are invisible.

See #23913.

(cherry picked from commit f25103313ed0512837b50774fb81bdb40ad45a41)
2023-10-03 18:32:31 +02:00
Paul Cornett
3becb59acd Enable using a dark theme when Gnome "dark style" is set
The dark style setting does not cause a dark theme to be used
automatically, so request it explicitly.

See #23764.

(cherry picked from commit 9b9ec141fbcd604aa8bfc83da6f16fc9bf5c32e0)

Co-authored-by: Colin Kinloch
2023-10-03 18:32:31 +02:00
Paul Cornett
c81c3538ac Fix showing popup menu with GTK/Wayland without active event
Since a261c80 (Avoid Gdk-CRITICAL warnings when using PopupMenu() with
Wayland, 2022-04-22) popup menus shown when there is no related current
event did not work when using default positioning. Fix this by always
providing a GdkWindow and a GdkEvent, and using a suitable substitute
when a real event is not available.

See #23892

(cherry picked from commit df6366ff57371f9d2d41f748514d25259e393203)
2023-09-25 14:29:31 +02:00
Vadim Zeitlin
acea4afa5e Prevent pasting invalid characters when using wxTextValidator
It shouldn't be possible to put characters that can't be entered into
the associated control directly by pasting them, so intercept paste
events too and filter out any invalid characters.

See #10281, #23812.

(cherry picked from commit bd4650767fe52f8dd2955b802d2dfb3262cc8dd0)
2023-09-22 16:37:04 +02:00
Joan Bruguera Micó
1fb96180f4 Handle map/unmap events on Wayland's wxGLCanvasEGL
Fixes hiding a wxGLCanvas on Wayland, either directly (`->Show(false)`)
or indirectly (e.g. when it is contained in a wxNotebook).

On Wayland, unlike on X11, to show the canvas on the screen, we need to
create a Wayland subsurface. This subsurface is detached from the GTK
widget associated to the canvas, thus it is not automatically mapped or
unmapped when the associated GTK widget is.
Rather, we need to manually keep it in sync with the widget's state.

Knowing what has to be done to map and unmap the canvas, while dealing
with edge cases properly, is not easy to someone not used to Wayland.
When the canvas is mapped, we have this graph of resources:

  EGL Surface (m_surface)
             |
             |
             v
  wl_egl window (m_wlEGLWindow)
             |
             |
             v
     Canvas wl_surface         GDK's toplevel window wl_surface
       (m_wlSurface)        (gdk_wayland_window_get_wl_surface(w))
              \                   which is shown to the user
               \                         ^
                \                       /
                 \                     /
                  v                   /
          Subsurface (m_wlSubsurface) to overlay
          the canvas onto the toplevel window

A simple way would be to destroy everything (m_surface, m_wlEGLWindow,
m_wlSurface, m_wlSubsurface) on unmap, and re-create it again on map.
Inefficiencies aside, this mostly works. However, it can mess with the
current OpenGL context. For example, suppose we have a (fragile)
program that places a canvas inside one of wxNotebook's tabs, and makes
the OpenGL context current only once at startup (e.g. on wxEVT_SHOW).
Switching between tabs will destroy and re-create the EGL Surface, so
the canvas will not be properly rendered when going back to its tab.

So we need to be smarter, and find some way to hide the subsurface
instead. The obvious way would be to unmap the canvas wl_surface
(m_wlSurface), as according to the Wayland spec., "a sub-surface is
hidden [...] if a NULL wl_buffer is applied [to the canvas surface]."
(https://wayland.freedesktop.org/docs/html/apa.html#protocol-spec-wl_subsurface)
However, as far as I can tell, this can't be done. There's no API to
hide an wl_egl window, and directly applying a NULL wl_buffer to the
canvas surface initially hides it, but seems to breaks the associated
window so that it crashes when one attempts to show it again.

So what remains, is destroying the overlay subsurface (m_wlSubsurface).
When doing it, to the spec, "the wl_surface is unmapped immediately.".

And not only does this work, but it also deals with the annoying fact
that on current GTK3 versions, when the GDK's toplevel window is
unmapped, its wl_surface is not just unmapped, but entirely destroyed.
(Side note: This may not have been intended, and has been changed for
GTK4, see: https://gitlab.gnome.org/GNOME/gtk/-/commit/5d3cec5441ca)
So we'd have to re-create the subsurface because of this anyway.

So, this works nicely, and as far as I can tell (documentation is a bit
scarce), there's no problem to leaving m_wlSurface (and its associated
m_wlEGLWindow and m_surface) unmapped in this way.

See #22580, #23835.

(cherry picked from commit 952de605f622cc7a3c30257365046ecd1a307808)
2023-09-22 16:37:04 +02:00
Stefan Csomor
952fcf7382 Send key down events ourselves if macOS didn't do it
Set a flag in insertText and send wxEVT_KEY_DOWN ourselves from
DoHandleKeyEvent() if it wasn't set to ensure that we generate these
events for the keys ignored by the standard insertText, such as
⌘+⎇+Letter combination.

See #23671, #23699.

(cherry picked from commit 30fbb9405335ff9a2843a35e1bfe26b22bb114e7)
2023-09-22 16:36:59 +02:00
Vadim Zeitlin
c76d4e69ec Update screenshots of controls under wxMSW in documentation
See #23842.

(cherry picked from commit d22275ce0a73def3320ed3c4284e184ebe34e15f)
2023-09-21 23:14:07 +02:00