Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
476a7b1302 | ||
|
|
6070436860 | ||
|
|
f075cdcb98 | ||
|
|
e6db086729 | ||
|
|
f8a718b338 | ||
|
|
a0f2ea0c29 | ||
|
|
3225bfea9d | ||
|
|
5f78baafe2 | ||
|
|
376ad61a5e | ||
|
|
5b81536be2 | ||
|
|
5e3a526b72 | ||
|
|
5f0534ffd4 | ||
|
|
33894bb46b | ||
|
|
17b0eda7f8 | ||
|
|
ec22321a4b | ||
|
|
5e861b31f9 | ||
|
|
334ba8f84d | ||
|
|
418623e2c5 | ||
|
|
cf476637d4 | ||
|
|
ceadec4e2d | ||
|
|
92b3068cf6 | ||
|
|
e45f5846b2 | ||
|
|
f0be15df9e | ||
|
|
0ddb86bec7 | ||
|
|
fe30bfe7c7 | ||
|
|
44675778e2 | ||
|
|
b870835b01 | ||
|
|
ea464401be | ||
|
|
4540a98c58 | ||
|
|
76cf64d6c9 | ||
|
|
8d7df2684d | ||
|
|
62bd8c3743 | ||
|
|
936daee0e6 | ||
|
|
9a161692b5 | ||
|
|
eb071f30f8 | ||
|
|
931b07364a | ||
|
|
34c2c926d1 | ||
|
|
fc56ad002a | ||
|
|
7b75fe02c8 | ||
|
|
2f6de2ed86 | ||
|
|
172f492b74 | ||
|
|
b74fac92a5 |
@@ -6,7 +6,7 @@ description: Use when writing, modifying, reviewing or debugging any OrcaSlicer
|
|||||||
# OrcaSlicer wxWidgets GUI
|
# OrcaSlicer wxWidgets GUI
|
||||||
|
|
||||||
This skill is how OrcaSlicer's wxWidgets GUI is written, changed, fixed and reviewed. Its core is
|
This skill is how OrcaSlicer's wxWidgets GUI is written, changed, fixed and reviewed. Its core is
|
||||||
**wxWidgets 3.3.4 API usage** — the documented contracts, the per-platform behaviour and the known
|
**wxWidgets 3.3.2 API usage** — the documented contracts, the per-platform behaviour and the known
|
||||||
limitations of the wx version Orca pins — layered with the OrcaSlicer conventions, wrappers, custom
|
limitations of the wx version Orca pins — layered with the OrcaSlicer conventions, wrappers, custom
|
||||||
widget library and stable component designs a contributor must follow. Every reference file opens
|
widget library and stable component designs a contributor must follow. Every reference file opens
|
||||||
with a numbered **Rules** checklist (what a diff is checked against), followed by sections that give
|
with a numbered **Rules** checklist (what a diff is checked against), followed by sections that give
|
||||||
@@ -15,12 +15,9 @@ wrong → right pairs with the commit that fixed each one.
|
|||||||
|
|
||||||
## Ground truth: the wx tree in deps/
|
## Ground truth: the wx tree in deps/
|
||||||
|
|
||||||
Orca pins upstream **wxWidgets 3.3.4** (`github.com/wxWidgets/wxWidgets`, tag `v3.3.4`,
|
Orca pins **wxWidgets 3.3.2** from the fork `github.com/SoftFever/Orca-deps-wxWidgets` (tag `v3.3.2`,
|
||||||
`deps/wxWidgets/wxWidgets.cmake`), built static (Flatpak: shared). Two in-tree patches are applied: an
|
`deps/wxWidgets/wxWidgets.cmake`), built static (Flatpak: shared). Facts about this build that change
|
||||||
Apple-only sRGB colour-component fix (`0001-macos-use-srgb-colour-components.patch`) and a Windows-only
|
how you read the wx docs:
|
||||||
clang-cl sibling-compiler search fix for the installed `wxWidgetsConfig.cmake`
|
|
||||||
(`0002-clang-cl-sibling-compiler-prefix.patch`); neither applies on Linux. Facts about this build that
|
|
||||||
change how you read the wx docs:
|
|
||||||
|
|
||||||
- **Linux builds against GTK3** (`DEP_WX_GTK3` defaults ON in `deps/CMakeLists.txt`). Target GTK3 on
|
- **Linux builds against GTK3** (`DEP_WX_GTK3` defaults ON in `deps/CMakeLists.txt`). Target GTK3 on
|
||||||
both X11 and Wayland; GTK-guarded code must still compile on GTK2, an opt-out build Orca does not ship.
|
both X11 and Wayland; GTK-guarded code must still compile on GTK2, an opt-out build Orca does not ship.
|
||||||
@@ -36,7 +33,7 @@ Look things up in the source the app is built from — it beats memory, and 3.3
|
|||||||
WX=$(find -L deps -maxdepth 5 -type d -path '*dep_wxWidgets-prefix/src/dep_wxWidgets' 2>/dev/null | head -1)
|
WX=$(find -L deps -maxdepth 5 -type d -path '*dep_wxWidgets-prefix/src/dep_wxWidgets' 2>/dev/null | head -1)
|
||||||
# macOS: deps/build/<arch>/dep_wxWidgets-prefix/src/dep_wxWidgets Linux, Windows: deps/<tree>/dep_wxWidgets-prefix/...
|
# macOS: deps/build/<arch>/dep_wxWidgets-prefix/src/dep_wxWidgets Linux, Windows: deps/<tree>/dep_wxWidgets-prefix/...
|
||||||
# -L follows a worktree's deps/<tree> symlinked to the main checkout. Not a glob: zsh aborts on one that matches nothing.
|
# -L follows a worktree's deps/<tree> symlinked to the main checkout. Not a glob: zsh aborts on one that matches nothing.
|
||||||
# If deps are not built: git clone --depth 1 -b v3.3.4 https://github.com/wxWidgets/wxWidgets
|
# If deps are not built: git clone --depth 1 -b v3.3.2 https://github.com/SoftFever/Orca-deps-wxWidgets
|
||||||
grep -n "CaptureMouse" -A 30 $WX/interface/wx/window.h # documented contract (doxygen source)
|
grep -n "CaptureMouse" -A 30 $WX/interface/wx/window.h # documented contract (doxygen source)
|
||||||
grep -rn "@onlyfor\|not implemented" $WX/interface/wx/popupwin.h # documented platform limits
|
grep -rn "@onlyfor\|not implemented" $WX/interface/wx/popupwin.h # documented platform limits
|
||||||
ls $WX/docs/doxygen/overviews/ # eventhandling.h, sizer.h, high_dpi.md, windowdeletion.h, ...
|
ls $WX/docs/doxygen/overviews/ # eventhandling.h, sizer.h, high_dpi.md, windowdeletion.h, ...
|
||||||
@@ -222,15 +219,14 @@ known class with a pitfall entry and a fixing commit.
|
|||||||
any wx key event; Control+click arrives as a right-click.
|
any wx key event; Control+click arrives as a right-click.
|
||||||
- **Windows:** `IsDark()` and `wxSYS_COLOUR_*` follow the system app mode, not Orca's theme — use
|
- **Windows:** `IsDark()` and `wxSYS_COLOUR_*` follow the system app mode, not Orca's theme — use
|
||||||
`dark_mode()`; menu bitmaps follow `check_dark_mode()`; windows are not double-buffered by default in
|
`dark_mode()`; menu bitmaps follow `check_dark_mode()`; windows are not double-buffered by default in
|
||||||
3.3.4; `ProcessLeftDown` is never called for popups; a popup that must close with the frame calls
|
3.3.2; `ProcessLeftDown` is never called for popups; a popup that must close with the frame calls
|
||||||
`BindUnfocusEvent()`.
|
`BindUnfocusEvent()`.
|
||||||
- **Linux GTK3:** dialogs without size hints collapse (only sizer-fitting calls, not `Fit()`, are
|
- **Linux GTK3:** dialogs without size hints collapse (only sizer-fitting calls, not `Fit()`, are
|
||||||
replayed at the first `Show()`); command events from a popup's children are not stopped at the popup
|
replayed at the first `Show()`); command events from a popup's children are not stopped at the popup
|
||||||
(MSW/macOS stop them); chained popups need `transient_for` set to the mapped parent right before
|
(MSW/macOS stop them); chained popups need `transient_for` set to the mapped parent right before
|
||||||
showing; native borders leak through custom widgets (`RemoveButtonBorder`/`RemoveInputBorder`).
|
showing; native borders leak through custom widgets (`RemoveButtonBorder`/`RemoveInputBorder`).
|
||||||
- **Wayland:** no global pointer position, no window positioning, `wxClientDC`, `Update()` and `SetIcon`
|
- **Wayland:** no global pointer position, no window positioning, `wxClientDC`, `Update()` and `SetIcon`
|
||||||
do nothing, AUI floating is disabled (wx 3.3.4 can drag a floating frame via system drag sessions, but
|
do nothing, no floating AUI panes, GL is EGL only.
|
||||||
its docking hints still need global positions), GL is EGL only.
|
|
||||||
|
|
||||||
## Editing this skill
|
## Editing this skill
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ Contents: [Rules](#rules) · [wxColour](#wxcolour) · [System colours and appear
|
|||||||
|
|
||||||
**Contract.** Constructors: `()`, `(r, g, b, a = wxALPHA_OPAQUE)`, `(unsigned long|long|int|unsigned int)` ("A
|
**Contract.** Constructors: `()`, `(r, g, b, a = wxALPHA_OPAQUE)`, `(unsigned long|long|int|unsigned int)` ("A
|
||||||
packed RGB value", `interface/wx/colour.h:98-101`), `(const wxString&|const char*|const wchar_t*)`;
|
packed RGB value", `interface/wx/colour.h:98-101`), `(const wxString&|const char*|const wchar_t*)`;
|
||||||
`wxColour(bool) = delete` (`include/wx/colour.h:225-240`; `docs/changes.txt:278-280`: code "unintentionally
|
`wxColour(bool) = delete` (`include/wx/colour.h:225-240`; `docs/changes.txt:246-248`: code "unintentionally
|
||||||
and mistakenly using wxColour ctor from bool … doesn't compile any longer").
|
and mistakenly using wxColour ctor from bool … doesn't compile any longer").
|
||||||
|
|
||||||
| Fact | Cite |
|
| Fact | Cite |
|
||||||
@@ -121,7 +121,7 @@ returned colour is always valid" (`interface/wx/settings.h:44-48`, `:398-407`).
|
|||||||
|
|
||||||
| Method | Contract |
|
| Method | Contract |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `IsDark()` | "checks the appearance of the current application and not the other applications on the system, so under MSW … will return false even if dark mode is used system-wide unless the application opted in using dark mode using wxApp::MSWEnableDarkMode()" (`:332-346`). An incompatible 3.3 change (`docs/changes.txt:77-79`). |
|
| `IsDark()` | "checks the appearance of the current application and not the other applications on the system, so under MSW … will return false even if dark mode is used system-wide unless the application opted in using dark mode using wxApp::MSWEnableDarkMode()" (`:332-346`). An incompatible 3.3 change (`docs/changes.txt:71-73`). |
|
||||||
| `AreAppsDark()` (3.3.0) | system-wide app dark mode "even if it's not enabled for this particular application"; same as `IsDark()` off MSW (`:308-321`). |
|
| `AreAppsDark()` (3.3.0) | system-wide app dark mode "even if it's not enabled for this particular application"; same as `IsDark()` off MSW (`:308-321`). |
|
||||||
| `IsSystemDark()` (3.3.0) | the "Windows mode", which can differ from the "app mode" (`:348-358`). |
|
| `IsSystemDark()` (3.3.0) | the "Windows mode", which can differ from the "app mode" (`:348-358`). |
|
||||||
| `IsUsingDarkBackground()` | luminance fallback, "generally not very useful to call directly" (`:360-370`). |
|
| `IsUsingDarkBackground()` | luminance fallback, "generally not very useful to call directly" (`:360-370`). |
|
||||||
@@ -233,25 +233,25 @@ child handlers.
|
|||||||
`@onlyfor{wxmsw}`, `interface/wx/app.h:1418-1465`):
|
`@onlyfor{wxmsw}`, `interface/wx/app.h:1418-1465`):
|
||||||
- "experimental"; uses "undocumented, and unsupported by Microsoft, functions"; works on Windows 10 later than
|
- "experimental"; uses "undocumented, and unsupported by Microsoft, functions"; works on Windows 10 later than
|
||||||
v1809 (including LTSC 2019) and all Windows 11; testing before 20H1 (v2004) "has been limited".
|
v1809 (including LTSC 2019) and all Windows 11; testing before 20H1 (v2004) "has been limited".
|
||||||
- Flags: `DarkMode_Auto` (default) follows the system ("dark mode is only used if it is the default mode
|
- Flags: default follows the system ("dark mode is only used if it is the default mode for the applications on
|
||||||
for the applications on the current system"); `DarkMode_Always` forces dark, `DarkMode_Never` forces
|
the current system"); `DarkMode_Always` forces dark. **[source]** `DarkMode_Auto = 0` exists in
|
||||||
light. **[source]** the enum also names `DarkMode_Auto = 0` in `include/wx/msw/app.h:46-52`;
|
`include/wx/msw/app.h:48` although only `DarkMode_Always` is documented.
|
||||||
`DarkMode_Never` is new in 3.3.4 (documented at `interface/wx/app.h:1450-1454`).
|
|
||||||
- Returns `true` if enabled, `false` "most likely because the system doesn't support dark mode".
|
- Returns `true` if enabled, `false` "most likely because the system doesn't support dark mode".
|
||||||
- Alternatives: the `msw.dark-mode` system option (1 = `MSWEnableDarkMode()`, 2 = `DarkMode_Always`, settable by
|
- Alternatives: the `msw.dark-mode` system option (1 = `MSWEnableDarkMode()`, 2 = `DarkMode_Always`, settable by
|
||||||
environment variable from outside the app, `interface/wx/sysopt.h:85-89`), or `SetAppearance(System|Light|Dark)`.
|
environment variable from outside the app, `interface/wx/sysopt.h:85-89`), or `SetAppearance(System|Dark)`.
|
||||||
- Known limitations (`interface/wx/app.h:1442-1448`): `wxTimePickerCtrl`, `wxDatePickerCtrl` and
|
- Known limitations (`interface/wx/app.h:1434-1448`): anything `TaskDialog()`-based has no dark mode —
|
||||||
`wxCalendarCtrl` stay light; `wxPrintDialog` on Windows 10 stays light; MDI applications are not
|
`wxMessageBox()`, `wxMessageDialog`, `wxRichMessageDialog`, `wxProgressDialog`, simple `wxAboutBox()` (wx suggests
|
||||||
recommended in dark mode. `wxMessageDialog` gained dark mode in 3.3.3 (#26570) and the common dialogs
|
`wxGenericMessageDialog`/`wxGenericProgressDialog`); common-dialog wrappers `wxColourDialog`, `wxFindReplaceDialog`,
|
||||||
in 3.3.4 (#26780), so the older "anything `TaskDialog()`-based and the common dialogs stay light" note
|
`wxFontDialog`, `wxPageSetupDialog`, `wxPrintDialog`; `wxTimePickerCtrl`, `wxDatePickerCtrl`, `wxCalendarCtrl`
|
||||||
no longer applies.
|
stay light; toolbar items with `wxToolBar::SetDropdownMenu()` draw the drop-down "almost invisible".
|
||||||
|
|
||||||
`AppearanceResult wxApp::SetAppearance(Appearance::System|Light|Dark)` (3.3.0, `interface/wx/app.h:1130-1187`):
|
`AppearanceResult wxApp::SetAppearance(Appearance::System|Light|Dark)` (3.3.0, `interface/wx/app.h:1152-1190`):
|
||||||
GTK/macOS follow the system by default and the call is immediate and "affects all the existing windows as well
|
GTK/macOS follow the system by default and the call is immediate and "affects all the existing windows as well
|
||||||
as any windows created after this call"; "Under MSW, the default appearance is always light" and an app that
|
as any windows created after this call"; "Under MSW, the default appearance is always light" and an app that
|
||||||
wants to follow the system must call it with `Appearance::System`; on MSW it maps to `MSWEnableDarkMode()` and
|
wants to follow the system must call it with `Appearance::System`; "the appearance can be only set before any
|
||||||
returns `Ok`/`Failure` (`interface/wx/app.h:1166-1169`). `Failure` e.g. "because `GTK_THEME` is defined";
|
windows are created and calling this function too late will return AppearanceResult::CannotChange" (only wxMSW
|
||||||
`AppearanceResult::CannotChange` is "currently never returned" (`interface/wx/app.h:1151, 1179-1183`).
|
returns it);
|
||||||
|
`Failure` e.g. "because `GTK_THEME` is defined".
|
||||||
|
|
||||||
`wxDarkModeSettings` (`interface/wx/msw/darkmode.h:30-111`), passed to `MSWEnableDarkMode()`: `GetColour(wxSystemColour)`
|
`wxDarkModeSettings` (`interface/wx/msw/darkmode.h:30-111`), passed to `MSWEnableDarkMode()`: `GetColour(wxSystemColour)`
|
||||||
(defaults "not documented and are subject to change"; the doc example names `0x202020` as the default background);
|
(defaults "not documented and are subject to change"; the doc example names `0x202020` as the default background);
|
||||||
@@ -260,40 +260,34 @@ returns `Ok`/`Failure` (`interface/wx/app.h:1166-1169`). `Failure` e.g. "because
|
|||||||
which "doesn't look very well in dark mode"; the base returns grey.
|
which "doesn't look very well in dark mode"; the base returns grey.
|
||||||
|
|
||||||
**[source] facts the docs do not state:**
|
**[source] facts the docs do not state:**
|
||||||
- As of 3.3.3 (#26516) and 3.3.4 (#26734), MSW dark mode can be switched at runtime: `SetAppearance()` maps to
|
- `SetAppearance` on MSW returns `CannotChange` when any TLW exists **or `MSWEnableDarkMode` was already called**
|
||||||
`MSWEnableDarkMode()` and returns `Ok`/`Failure`, never `CannotChange` (`src/msw/darkmode.cpp:354-375`).
|
(`gs_appMode != AppMode_Default`); `SetAppearance(Light)` returns `Ok` without doing anything
|
||||||
`MSWEnableDarkMode()` re-applies the mode to an existing window by sending it `WM_SYSCOLORCHANGE` (`:345-349`),
|
(`src/msw/darkmode.cpp` `wxApp::SetAppearance`). macOS `System` sets `NSApp.appearance` to
|
||||||
and the window restyles through `wxMSWDarkMode::HasChanged()`/`NotifySysColorChange()`
|
`[NSAppearance currentAppearance]` rather than nil, pinning the current look (`src/osx/cocoa/utils.mm:485-513`);
|
||||||
(`src/msw/window.cpp:5337, 5528-5534`), so a control created before the switch is re-themed too. macOS `System`
|
GTK3 maps to the portal colour-scheme machinery; GTK2 always returns `Failure` (`src/gtk/app.cpp:355-381`).
|
||||||
sets `NSApp.appearance` to `[NSAppearance currentAppearance]` rather than nil, pinning the current look
|
- `MSWEnableDarkMode` may be called any time, but dark title bars are applied only to TLWs **created** afterwards
|
||||||
(`src/osx/cocoa/utils.mm:485-513`); GTK3 maps to the portal colour-scheme machinery; GTK2 always returns
|
|
||||||
`Failure` (`src/gtk/app.cpp:355-381`).
|
|
||||||
- `MSWEnableDarkMode` may be called any time; dark title bars are applied when a TLW is created
|
|
||||||
(`EnableForTLW` at the end of TLW creation, `src/msw/toplevel.cpp:513`) and controls are dark-enabled at creation
|
(`EnableForTLW` at the end of TLW creation, `src/msw/toplevel.cpp:513`) and controls are dark-enabled at creation
|
||||||
(`MSWCreateControl` → `AllowForWindow` and, for some controls, `SetForegroundColour(LISTBOXTEXT)`,
|
(`MSWCreateControl` → `AllowForWindow` and, for some controls, `SetForegroundColour(LISTBOXTEXT)`,
|
||||||
`src/msw/control.cpp:133-140`).
|
`src/msw/control.cpp:133-140`). wx cannot flip existing windows — the reason `SetAppearance` refuses late calls.
|
||||||
- wx takes ownership of the settings pointer (`wxDarkModeModule::SetSettings`) — allocate it with `new`.
|
- wx takes ownership of the settings pointer (`wxDarkModeModule::SetSettings`) — allocate it with `new`.
|
||||||
- `msw.dark-mode` is read in `wxApp::Initialize` (`src/msw/app.cpp:492-494`): a user's `WX_MSW_DARK_MODE`
|
- `msw.dark-mode` is read in `wxApp::Initialize` (`src/msw/app.cpp:492-494`): a user's `WX_MSW_DARK_MODE`
|
||||||
environment variable enables wx dark mode before Orca's own call.
|
environment variable enables wx dark mode before Orca's own call.
|
||||||
- wx's owner-drawn menu path keys on `wxMSWDarkMode::IsActive()` (`src/msw/menuitem.cpp` `wxMenuItem::OnDrawItem`,
|
- wx's owner-drawn menu path keys on `wxMSWDarkMode::IsActive()` (`src/msw/menuitem.cpp` `wxMenuItem::OnDrawItem`,
|
||||||
`GetColourToUse`; `src/msw/menu.cpp`; menu-bar UAH drawing in `src/msw/darkmode.cpp`).
|
`GetColourToUse`; `src/msw/menu.cpp`; menu-bar UAH drawing in `src/msw/darkmode.cpp`).
|
||||||
|
|
||||||
3.3.x dark-mode fix log: 3.3.4 wxMSW (`docs/changes.txt:349-358`: dynamic dark mode, dark mode for
|
3.3.x dark-mode fix log: 3.3.2 wxMSW (`docs/changes.txt:297-308`: checkbox accessibility in dark mode, rendering of
|
||||||
wxFontPickerCtrl, wxNotebook, wxSpinButton and the common dialogs), 3.3.3 (`:433` "Implement support for
|
several controls, toolbar, menus; also "Revert use of WS_EX_COMPOSITED"), 3.3.1 (`:358-372`: wxStaticBitmap-in-notebook
|
||||||
switching between light/dark modes"; `:426` wxMessageDialog, `:429` combo/listbox on Windows 11, `:431`
|
crash, disabled wxButton bitmaps and wxStaticText, notebook high-contrast background, wxDataViewCtrl light-mode
|
||||||
wxCheckBox label in screen readers), 3.3.2 (`:492-501`: checkbox accessibility in dark mode, rendering of
|
border regression, selected toolbar buttons, wxComboCtrl, wxTE_RICH wxTextCtrl), 3.3.0 (`:385` "Add experimental dark
|
||||||
several controls, toolbar, menus; also "Revert use of WS_EX_COMPOSITED"), 3.3.1 (`:553-565`:
|
mode support to wxMSW"); XRC dark colour variants (`:494`).
|
||||||
wxStaticBitmap-in-notebook crash, disabled wxButton bitmaps and wxStaticText, notebook high-contrast
|
|
||||||
background, wxDataViewCtrl light-mode border regression, selected toolbar buttons, wxComboCtrl, wxTE_RICH
|
|
||||||
wxTextCtrl), 3.3.0 (`:578` "Add experimental dark mode support to wxMSW"); XRC dark colour variants (`:687`).
|
|
||||||
|
|
||||||
**OrcaSlicer.** `GUI_App::on_init_inner` (`#ifdef __WINDOWS__`) calls `MSWEnableDarkMode(DarkMode_Auto)` and then
|
**OrcaSlicer.** `GUI_App::on_init_inner` (`#ifdef __WINDOWS__`) calls `MSWEnableDarkMode(DarkMode_Auto)` and then
|
||||||
`NppDarkMode::InitDarkMode(init_dark_color_mode, init_sys_menu_enabled)`. wx's call exists so that wx-drawn
|
`NppDarkMode::InitDarkMode(init_dark_color_mode, init_sys_menu_enabled)`. wx's call exists only so that wx-drawn
|
||||||
menus get dark borders; NppDarkMode does Orca's theming (title bars, explorer theme, scrollbars, list headers).
|
menus get dark borders; NppDarkMode does the theming (title bars, explorer theme, scrollbars, list headers) because
|
||||||
The code comment "Orca: todo switch to native dark mode support in wxWidgets and remove NppDarkMode" records the
|
it can switch live and wx cannot. The code comment "Orca: todo switch to native dark mode support in wxWidgets and
|
||||||
intent. The old blocker — a live Preferences toggle would be restart-only because `SetAppearance` returned
|
remove NppDarkMode" records the intent; the blocker is that a live Preferences toggle would become restart-only
|
||||||
`CannotChange` and existing windows could not be restyled — is gone as of 3.3.3/3.3.4 (above). Orca still keeps
|
(`SetAppearance` returns `CannotChange` after startup, existing windows cannot be restyled) and TaskDialog/common
|
||||||
NppDarkMode, and Orca's own `MsgDialog` family and `ProgressDialog` remain its message/progress UI.
|
dialogs/pickers stay light anyway — which is also why Orca has its own `MsgDialog` family and `ProgressDialog`.
|
||||||
**[source]** consequences of `DarkMode_Auto`: wx's internal "dark" stays `AllowDark` and follows the **system app
|
**[source]** consequences of `DarkMode_Auto`: wx's internal "dark" stays `AllowDark` and follows the **system app
|
||||||
mode**; NppDarkMode's later `SetPreferredAppMode` call does not touch wx's `gs_appMode`. So with Windows light +
|
mode**; NppDarkMode's later `SetPreferredAppMode` call does not touch wx's `gs_appMode`. So with Windows light +
|
||||||
Orca dark, wx's dark machinery (menus, `GetColour()`, `IsDark()`) stays off; with Windows dark + Orca light it is
|
Orca dark, wx's dark machinery (menus, `GetColour()`, `IsDark()`) stays off; with Windows dark + Orca light it is
|
||||||
@@ -318,15 +312,11 @@ on: `GetColour()` returns the dark palette, new native controls are dark-enabled
|
|||||||
```
|
```
|
||||||
Cite: bf397a0632 (`GUI_App.cpp`, `GUI_App::on_init_inner`).
|
Cite: bf397a0632 (`GUI_App.cpp`, `GUI_App::on_init_inner`).
|
||||||
- **Rule:** Do not call `wxTheApp->SetAppearance(...)` in Orca.
|
- **Rule:** Do not call `wxTheApp->SetAppearance(...)` in Orca.
|
||||||
**Why:** MSW would switch wx's own mode out of step with NppDarkMode and `dark_color_mode` (wx's mode is driven
|
**Why:** MSW returns `CannotChange` (Orca already called `MSWEnableDarkMode`), GTK2 fails, and macOS pins
|
||||||
by `MSWEnableDarkMode(DarkMode_Auto)` and follows the system), GTK2 fails, and macOS pins
|
|
||||||
`NSApp.appearance` while `GUI_App::dark_mode()` keeps reading the system `AppleInterfaceStyle` — the two would
|
`NSApp.appearance` while `GUI_App::dark_mode()` keeps reading the system `AppleInterfaceStyle` — the two would
|
||||||
disagree.
|
disagree.
|
||||||
- **Rule:** Do not show wx's TaskDialog-based or common dialogs; use `MessageDialog` and friends
|
- **Rule:** Do not show wx's TaskDialog-based or common dialogs where dark mode matters; use `MessageDialog` and
|
||||||
(`MsgDialog.hpp`, see `references/windows-dialogs.md`).
|
friends (`MsgDialog.hpp`, see `references/windows-dialogs.md`).
|
||||||
**Why:** Orca's dialogs are owner-drawn and consistent with the rest of the UI. The old dark-mode gap
|
|
||||||
closed — `wxMessageDialog` gained dark mode in 3.3.3 (#26570) and the common dialogs in 3.3.4 (#26780) —
|
|
||||||
but the convention stands.
|
|
||||||
|
|
||||||
## Window colours, inheritance and native-control limits
|
## Window colours, inheritance and native-control limits
|
||||||
|
|
||||||
@@ -381,7 +371,7 @@ macOS paints the system grey.
|
|||||||
|
|
||||||
| Port | Behaviour |
|
| Port | Behaviour |
|
||||||
|---|---|
|
|---|---|
|
||||||
| MSW | `wxButton`/`wxToggleButton` `SetBackgroundColour`/`SetForegroundColour` switch the native button to `BS_OWNERDRAW` (`src/msw/anybutton.cpp` `wxAnyButton::MakeOwnerDrawn`, `:1324-1390`) — the colour works but native theming is gone. `wxCheckBox`/`wxRadioButton` foreground makes them owner-drawn when themes are active (`src/msw/control.cpp` `MSWMakeOwnerDrawnIfNecessary`); 3.3.2 fixed checkbox accessibility in that mode (`docs/changes.txt:492-493`). Static-text-like children paint the ancestor brush only if that ancestor's background is inheritable. |
|
| MSW | `wxButton`/`wxToggleButton` `SetBackgroundColour`/`SetForegroundColour` switch the native button to `BS_OWNERDRAW` (`src/msw/anybutton.cpp` `wxAnyButton::MakeOwnerDrawn`, `:1324-1390`) — the colour works but native theming is gone. `wxCheckBox`/`wxRadioButton` foreground makes them owner-drawn when themes are active (`src/msw/control.cpp` `MSWMakeOwnerDrawnIfNecessary`); 3.3.2 fixed checkbox accessibility in that mode (`docs/changes.txt:299-300`). Static-text-like children paint the ancestor brush only if that ancestor's background is inheritable. |
|
||||||
| macOS | `SetBackgroundColour` reaches the NSView only if it `respondsToSelector:setBackgroundColor:` and the style is not `wxBG_STYLE_TRANSPARENT` (`src/osx/cocoa/window.mm:3514-3531`): **NSButton (`wxButton`) ignores the background colour**. Foreground uses `setTextColor:` when the view has it (`:3885-3887`); stock NSButton has none. `wxStaticText` is an NSTextField with `setDrawsBackground:NO` — its background is never painted (`src/osx/cocoa/stattext.mm:154`). `wxTextCtrl`'s `setEnabled:` resets the text colour: multi-line (`wxNSTextView`) always, to `controlTextColor`/`disabledControlTextColor`; single-line (`wxNSTextField`) when it does not draw its background, to `controlTextColor`/`secondarySelectedControlColor` (`src/osx/cocoa/textctrl.mm`). |
|
| macOS | `SetBackgroundColour` reaches the NSView only if it `respondsToSelector:setBackgroundColor:` and the style is not `wxBG_STYLE_TRANSPARENT` (`src/osx/cocoa/window.mm:3514-3531`): **NSButton (`wxButton`) ignores the background colour**. Foreground uses `setTextColor:` when the view has it (`:3885-3887`); stock NSButton has none. `wxStaticText` is an NSTextField with `setDrawsBackground:NO` — its background is never painted (`src/osx/cocoa/stattext.mm:154`). `wxTextCtrl`'s `setEnabled:` resets the text colour: multi-line (`wxNSTextView`) always, to `controlTextColor`/`disabledControlTextColor`; single-line (`wxNSTextField`) when it does not draw its background, to `controlTextColor`/`secondarySelectedControlColor` (`src/osx/cocoa/textctrl.mm`). |
|
||||||
| GTK3 | `SetBackgroundColour/SetForegroundColour/SetFont` install a per-widget CSS provider `*{color:..;background:..;font:..}` at `GTK_STYLE_PROVIDER_PRIORITY_APPLICATION` (`src/gtk/window.cpp` `wxWindowGTK::GTKApplyStyle`); `wxButton`/`wxCheckBox` apply it to their inner label too (`src/gtk/button.cpp:325-335`, `src/gtk/checkbox.cpp:233-237`). User CSS (priority USER) can still override. |
|
| GTK3 | `SetBackgroundColour/SetForegroundColour/SetFont` install a per-widget CSS provider `*{color:..;background:..;font:..}` at `GTK_STYLE_PROVIDER_PRIORITY_APPLICATION` (`src/gtk/window.cpp` `wxWindowGTK::GTKApplyStyle`); `wxButton`/`wxCheckBox` apply it to their inner label too (`src/gtk/button.cpp:325-335`, `src/gtk/checkbox.cpp:233-237`). User CSS (priority USER) can still override. |
|
||||||
| GTK2 | colours applied with `gtk_widget_modify_style` — pixmap-engine themes may ignore them. |
|
| GTK2 | colours applied with `gtk_widget_modify_style` — pixmap-engine themes may ignore them. |
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ The general wx rule is that setters do not send events. The exceptions are the b
|
|||||||
| `wxTextEntry::SetValue(s)` | **yes**, one `wxEVT_TEXT`, even when `s` equals the current text | `interface/wx/textentry.h:539-542`; [source] `src/common/textentrycmn.cpp:236-254`, `src/msw/textctrl.cpp:1133-1145` |
|
| `wxTextEntry::SetValue(s)` | **yes**, one `wxEVT_TEXT`, even when `s` equals the current text | `interface/wx/textentry.h:539-542`; [source] `src/common/textentrycmn.cpp:236-254`, `src/msw/textctrl.cpp:1133-1145` |
|
||||||
| `wxTextEntry::ChangeValue(s)` | no | `interface/wx/textentry.h:177-178` |
|
| `wxTextEntry::ChangeValue(s)` | no | `interface/wx/textentry.h:177-178` |
|
||||||
| `wxTextEntry::Clear()` | yes (= `SetValue("")`) | `interface/wx/textentry.h:193-194` |
|
| `wxTextEntry::Clear()` | yes (= `SetValue("")`) | `interface/wx/textentry.h:193-194` |
|
||||||
| `wxTextCtrl::SetLabel/SetLabelText` | nothing at all (3.3) | `docs/changes.txt:117-119`; `src/common/textcmn.cpp:934-937` |
|
| `wxTextCtrl::SetLabel/SetLabelText` | nothing at all (3.3) | `docs/changes.txt:111-113`; `src/common/textcmn.cpp:934-937` |
|
||||||
| `SetSelection/SetStringSelection` on wxChoice, wxComboBox, wxListBox, wxRadioBox | no | `interface/wx/ctrlsub.h:102-103,126` |
|
| `SetSelection/SetStringSelection` on wxChoice, wxComboBox, wxListBox, wxRadioBox | no | `interface/wx/ctrlsub.h:102-103,126` |
|
||||||
| `wxComboBox::SetValue` | `wxEVT_TEXT` if editable; none with `wxCB_READONLY` | `interface/wx/combobox.h:256-272` |
|
| `wxComboBox::SetValue` | `wxEVT_TEXT` if editable; none with `wxCB_READONLY` | `interface/wx/combobox.h:256-272` |
|
||||||
| `wxComboBox::Popup()/Dismiss()` | DROPDOWN/CLOSEUP, except on wxOSX | `interface/wx/combobox.h:279-281,292-294` |
|
| `wxComboBox::Popup()/Dismiss()` | DROPDOWN/CLOSEUP, except on wxOSX | `interface/wx/combobox.h:279-281,292-294` |
|
||||||
@@ -184,7 +184,7 @@ Pitfalls:
|
|||||||
ctrl->GetTextCtrl()->SetLabel(s); // Wrong: no-op
|
ctrl->GetTextCtrl()->SetLabel(s); // Wrong: no-op
|
||||||
ctrl->GetTextCtrl()->ChangeValue(s); // Right (or SetValue if listeners must react)
|
ctrl->GetTextCtrl()->ChangeValue(s); // Right (or SetValue if listeners must react)
|
||||||
```
|
```
|
||||||
Cite: `docs/changes.txt:117-119`.
|
Cite: `docs/changes.txt:111-113`.
|
||||||
- **Rule:** Handle `wxEVT_TEXT_ENTER` without `Skip()` unless you want the default button activated as well.
|
- **Rule:** Handle `wxEVT_TEXT_ENTER` without `Skip()` unless you want the default button activated as well.
|
||||||
**Why:** a skipped Enter falls through to the dialog's default button and closes it.
|
**Why:** a skipped Enter falls through to the dialog's default button and closes it.
|
||||||
```cpp
|
```cpp
|
||||||
@@ -213,7 +213,7 @@ Contract:
|
|||||||
verbatim, and `wxControl::EscapeMnemonics()` escapes it (`interface/wx/control.h:174-195, 379-387`). This applies
|
verbatim, and `wxControl::EscapeMnemonics()` escapes it (`interface/wx/control.h:174-195, 379-387`). This applies
|
||||||
to `wxStaticText`, `wxCheckBox`, `wxRadioButton`, `wxButton` labels and to book page titles: all `wx*book`
|
to `wxStaticText`, `wxCheckBox`, `wxRadioButton`, `wxButton` labels and to book page titles: all `wx*book`
|
||||||
classes interpret mnemonics in page text (`interface/wx/bookctrl.h:141-147`), and since 3.3 wxListbook and
|
classes interpret mnemonics in page text (`interface/wx/bookctrl.h:141-147`), and since 3.3 wxListbook and
|
||||||
wxChoicebook do too (`docs/changes.txt:134-136`).
|
wxChoicebook do too (`docs/changes.txt:128-130`).
|
||||||
- `SetLabelMarkup()` needs well-formed markup or the label "won't be shown at all" (returns false, keeps the old
|
- `SetLabelMarkup()` needs well-formed markup or the label "won't be shown at all" (returns false, keeps the old
|
||||||
label). A bare `&` is still a mnemonic. Multi-line markup works only on GTK and macOS; the generic version used on
|
label). A bare `&` is still a mnemonic. Multi-line markup works only on GTK and macOS; the generic version used on
|
||||||
MSW handles single lines (`interface/wx/control.h:338-347`). Quote untrusted text with
|
MSW handles single lines (`interface/wx/control.h:338-347`). Quote untrusted text with
|
||||||
@@ -383,10 +383,10 @@ Pitfalls:
|
|||||||
|
|
||||||
- Virtual list (`wxLC_REPORT|wxLC_VIRTUAL`): call `SetItemCount()` and override `OnGetItemText` (optionally
|
- Virtual list (`wxLC_REPORT|wxLC_VIRTUAL`): call `SetItemCount()` and override `OnGetItemText` (optionally
|
||||||
`OnGetItemImage`/`OnGetItemAttr`) (`interface/wx/listctrl.h:128-134`). `EditLabel()` asserts without
|
`OnGetItemImage`/`OnGetItemAttr`) (`interface/wx/listctrl.h:128-134`). `EditLabel()` asserts without
|
||||||
`wxLC_EDIT_LABELS` (`docs/changes.txt:74-75`).
|
`wxLC_EDIT_LABELS` (`docs/changes.txt:68-69`).
|
||||||
- Images: prefer `SetImages(std::vector<wxBitmapBundle>)`; `wxImageList` is discouraged
|
- Images: prefer `SetImages(std::vector<wxBitmapBundle>)`; `wxImageList` is discouraged
|
||||||
(`interface/wx/withimages.h:21-40`) and is measured in physical pixels in 3.3 (`docs/changes.txt:91-94`); calling
|
(`interface/wx/withimages.h:21-40`) and is measured in physical pixels in 3.3 (`docs/changes.txt:85-88`); calling
|
||||||
its methods on an invalid (unsized) list now asserts, i.e. fails silently in Orca (`docs/changes.txt:59-62`).
|
its methods on an invalid (unsized) list now asserts, i.e. fails silently in Orca (`docs/changes.txt:53-56`).
|
||||||
`Assign*` transfers ownership, `Set*ImageList` does not (`interface/wx/withimages.h:90-110`). Sizing:
|
`Assign*` transfers ownership, `Set*ImageList` does not (`interface/wx/withimages.h:90-110`). Sizing:
|
||||||
`references/dpi-bitmaps-fonts.md`.
|
`references/dpi-bitmaps-fonts.md`.
|
||||||
- `wxTreeCtrl`: `SelectItem` emits events ([table](#events-from-programmatic-changes)).
|
- `wxTreeCtrl`: `SelectItem` emits events ([table](#events-from-programmatic-changes)).
|
||||||
@@ -402,7 +402,7 @@ Contract:
|
|||||||
selection's blocks).
|
selection's blocks).
|
||||||
- `FreezeTo(row, col)` returns false (an assert, silent in Orca) for out-of-range values, merged cells or the native
|
- `FreezeTo(row, col)` returns false (an assert, silent in Orca) for out-of-range values, merged cells or the native
|
||||||
header (`interface/wx/grid.h:5747-5772`); [source] also when rows/columns were reordered or drag-moving is enabled
|
header (`interface/wx/grid.h:5747-5772`); [source] also when rows/columns were reordered or drag-moving is enabled
|
||||||
(`src/generic/grid.cpp:5742-5750`). In 3.3 it freezes even when the grid is too small (`docs/changes.txt:54-57`).
|
(`src/generic/grid.cpp:5742-5750`). In 3.3 it freezes even when the grid is too small (`docs/changes.txt:48-51`).
|
||||||
- Editor contract: `EndEdit` must not modify the grid — it stores the value and returns true if it changed;
|
- Editor contract: `EndEdit` must not modify the grid — it stores the value and returns true if it changed;
|
||||||
`ApplyEdit` writes it after `wxEVT_GRID_CELL_CHANGING` was not vetoed (`interface/wx/grid.h:610-638`). Editors,
|
`ApplyEdit` writes it after `wxEVT_GRID_CELL_CHANGING` was not vetoed (`interface/wx/grid.h:610-638`). Editors,
|
||||||
renderers and attrs are ref-counted and the setters take ownership (`:1263-1305, 1739-1770, 2681-2701`).
|
renderers and attrs are ref-counted and the setters take ownership (`:1263-1305, 1739-1770, 2681-2701`).
|
||||||
@@ -492,7 +492,7 @@ All cites `interface/wx/dataview.h`. MSW uses the generic implementation; wxGTK
|
|||||||
Other per-port facts: editing starts on a slow double-click or a platform key — "F2 is typical on Windows, Space
|
Other per-port facts: editing starts on a slow double-click or a platform key — "F2 is typical on Windows, Space
|
||||||
and/or Enter is common elsewhere" (2604-2607, 1915-1918); a custom renderer's `StartDrag()` is "Not yet supported"
|
and/or Enter is common elsewhere" (2604-2607, 1915-1918); a custom renderer's `StartDrag()` is "Not yet supported"
|
||||||
(2717-2719); `RenderText()` should be used inside `Render()` so text matches native renderers (2708-2714). Calling
|
(2717-2719); `RenderText()` should be used inside `Render()` so text matches native renderers (2708-2714). Calling
|
||||||
`Collapse()` from an event handler was fixed in 3.3.1 (`docs/changes.txt:539`; the generic re-check is described
|
`Collapse()` from an event handler was fixed in 3.3.1 (`docs/changes.txt:346`; the generic re-check is described
|
||||||
under [DVC control API](#wxdataviewctrl-control-api)).
|
under [DVC control API](#wxdataviewctrl-control-api)).
|
||||||
|
|
||||||
OrcaSlicer: `ParamsViewCtrl` (`EditGCodeDialog`) and `DiffViewCtrl` (`UnsavedChangesDialog`) use
|
OrcaSlicer: `ParamsViewCtrl` (`EditGCodeDialog`) and `DiffViewCtrl` (`UnsavedChangesDialog`) use
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# DPI, bitmaps and fonts
|
# DPI, bitmaps and fonts
|
||||||
|
|
||||||
How wx 3.3.4 maps DIP, logical and physical pixels on each platform, how DPI changes reach a window,
|
How wx 3.3.2 maps DIP, logical and physical pixels on each platform, how DPI changes reach a window,
|
||||||
and how OrcaSlicer sizes layout (`FromDIP`, `em_unit`), rescales (`DPIAware`), rasterizes icons
|
and how OrcaSlicer sizes layout (`FromDIP`, `em_unit`), rescales (`DPIAware`), rasterizes icons
|
||||||
(`BitmapCache`, `create_scaled_bitmap`, `ScalableBitmap`) and chooses fonts (`Label` table). Read it
|
(`BitmapCache`, `create_scaled_bitmap`, `ScalableBitmap`) and chooses fonts (`Label` table). Read it
|
||||||
for any fixed size, icon, bitmap, image list, font, or `on_dpi_changed` work, and when a bug looks
|
for any fixed size, icon, bitmap, image list, font, or `on_dpi_changed` work, and when a bug looks
|
||||||
@@ -488,7 +488,7 @@ handler bound there runs once more after every DPI change.
|
|||||||
inherits the DC's scale (`interface/wx/bitmap.h:370-385`).
|
inherits the DC's scale (`interface/wx/bitmap.h:370-385`).
|
||||||
- `wxBitmap(const wxCursor&)` is invalid on GTK under Wayland (`interface/wx/bitmap.h:388-401`).
|
- `wxBitmap(const wxCursor&)` is invalid on GTK under Wayland (`interface/wx/bitmap.h:388-401`).
|
||||||
- wxMSW `wxBitmap::Create(size, dc)` no longer multiplies by the DC's content scale
|
- wxMSW `wxBitmap::Create(size, dc)` no longer multiplies by the DC's content scale
|
||||||
(`docs/changes.txt:100-102`).
|
(`docs/changes.txt:94-96`).
|
||||||
|
|
||||||
**Offscreen drawing.** "The scaling factor of the bitmap determines the scaling factor used by
|
**Offscreen drawing.** "The scaling factor of the bitmap determines the scaling factor used by
|
||||||
this device context" (`interface/wx/dcmemory.h:41-58`); `wxMemoryDC(wxDC*)` does **not** inherit
|
this device context" (`interface/wx/dcmemory.h:41-58`); `wxMemoryDC(wxDC*)` does **not** inherit
|
||||||
@@ -740,7 +740,7 @@ are in `references/popups-menus.md`.
|
|||||||
in the new code as it doesn't support showing DPI-dependent bitmaps. Please use
|
in the new code as it doesn't support showing DPI-dependent bitmaps. Please use
|
||||||
wxWithImages::SetImages() instead"; "the size is specified in physical pixels and must correspond
|
wxWithImages::SetImages() instead"; "the size is specified in physical pixels and must correspond
|
||||||
to the size of bitmaps … that will be added". 3.3 made the size physical and makes calls on an
|
to the size of bitmaps … that will be added". 3.3 made the size physical and makes calls on an
|
||||||
invalid list assert (`docs/changes.txt:59-62, 91-94`) — silently in Orca's assert-free build.
|
invalid list assert (`docs/changes.txt:53-56, 85-88`) — silently in Orca's assert-free build.
|
||||||
When a list is unavoidable, `wxBitmapBundle::CreateImageList(win, bundles)` builds one at the
|
When a list is unavoidable, `wxBitmapBundle::CreateImageList(win, bundles)` builds one at the
|
||||||
consensus size (public but undocumented, [source] `include/wx/bmpbndl.h`).
|
consensus size (public but undocumented, [source] `include/wx/bmpbndl.h`).
|
||||||
```cpp
|
```cpp
|
||||||
@@ -761,7 +761,7 @@ wxArtProvider::GetBitmapBundle(wxART_WARNING, wxART_OTHER, wxSize(16, 16));
|
|||||||
```
|
```
|
||||||
|
|
||||||
**`wxImage`** resizing (`interface/wx/image.h:28-89`): `wxIMAGE_QUALITY_NEAREST` is no longer an
|
**`wxImage`** resizing (`interface/wx/image.h:28-89`): `wxIMAGE_QUALITY_NEAREST` is no longer an
|
||||||
alias of `NORMAL` since 3.3.0 (`docs/changes.txt:104-105`; `wxIMAGE_QUALITY_FAST` is the speed
|
alias of `NORMAL` since 3.3.0 (`docs/changes.txt:98-99`; `wxIMAGE_QUALITY_FAST` is the speed
|
||||||
synonym). `NORMAL` (default) = bilinear down to an integer multiple, then box average; `HIGH` =
|
synonym). `NORMAL` (default) = bilinear down to an integer multiple, then box average; `HIGH` =
|
||||||
box average when shrinking, bicubic when enlarging; `BILINEAR`, `BICUBIC`, `BOX_AVERAGE` explicit.
|
box average when shrinking, bicubic when enlarging; `BILINEAR`, `BICUBIC`, `BOX_AVERAGE` explicit.
|
||||||
High-quality scaling "may not work as expected when using a single mask colour for
|
High-quality scaling "may not work as expected when using a single mask colour for
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Events: binding, dispatch, posting and deferred calls
|
# Events: binding, dispatch, posting and deferred calls
|
||||||
|
|
||||||
How wx 3.3.4 finds, runs, propagates, queues and drops event handlers, and how OrcaSlicer code
|
How wx 3.3.2 finds, runs, propagates, queues and drops event handlers, and how OrcaSlicer code
|
||||||
binds, emits and defers. Read it before writing any `Bind`/`Unbind`, `Skip()`, `ProcessEvent`,
|
binds, emits and defers. Read it before writing any `Bind`/`Unbind`, `Skip()`, `ProcessEvent`,
|
||||||
`wxPostEvent`/`wxQueueEvent` or `CallAfter`, before defining a custom event, and when debugging a
|
`wxPostEvent`/`wxQueueEvent` or `CallAfter`, before defining a custom event, and when debugging a
|
||||||
handler that never runs, runs twice, runs on a dead object, or swallows a widget's own behaviour.
|
handler that never runs, runs twice, runs on a dead object, or swallows a widget's own behaviour.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Mouse, keyboard and focus
|
# Mouse, keyboard and focus
|
||||||
|
|
||||||
How input reaches wx windows in the wxWidgets 3.3.4 build Orca ships, and the Orca conventions on
|
How input reaches wx windows in the wxWidgets 3.3.2 build Orca ships, and the Orca conventions on
|
||||||
top: mouse capture, mouse and key events, accelerators and Orca's shortcut registry, focus,
|
top: mouse capture, mouse and key events, accelerators and Orca's shortcut registry, focus,
|
||||||
tooltips and cursors. Read it when a widget captures the mouse or tracks hover, when adding or
|
tooltips and cursors. Read it when a widget captures the mouse or tracks hover, when adding or
|
||||||
changing a keyboard shortcut, when touching focus, tooltip or cursor code, and when debugging an
|
changing a keyboard shortcut, when touching focus, tooltip or cursor code, and when debugging an
|
||||||
@@ -297,7 +297,7 @@ Per port [source]:
|
|||||||
non-enter event while the cached position is invalid is treated as the enter.
|
non-enter event while the cached position is invalid is treated as the enter.
|
||||||
- **GTK:** crossing events with a grab/ungrab mode are ignored; outside capture wx re-derives the
|
- **GTK:** crossing events with a grab/ungrab mode are ignored; outside capture wx re-derives the
|
||||||
window under the pointer on each motion (`src/gtk/window.cpp:2073-2117, 2384-2456`; fixes #24339
|
window under the pointer on each motion (`src/gtk/window.cpp:2073-2117, 2384-2456`; fixes #24339
|
||||||
and #24931–#24933 are in this release, `docs/changes.txt:730, 740`).
|
and #24931–#24933 are in this release, `docs/changes.txt:537, 547`).
|
||||||
- **macOS:** each view's `NSTrackingArea` uses `NSTrackingInVisibleRect`
|
- **macOS:** each view's `NSTrackingArea` uses `NSTrackingInVisibleRect`
|
||||||
(`src/osx/cocoa/window.mm:3924`) and covers its children, so do not rely on the parent getting
|
(`src/osx/cocoa/window.mm:3924`) and covers its children, so do not rely on the parent getting
|
||||||
LEAVE when the pointer moves onto a child. `NSMouseMoved` is delivered only to the deepest view
|
LEAVE when the pointer moves onto a child. `NSMouseMoved` is delivered only to the deepest view
|
||||||
@@ -334,7 +334,7 @@ A composite's hover state must therefore track its children. Orca's `StateHandle
|
|||||||
`CS_DBLCLKS`, `src/msw/app.cpp:584`). GTK drops the surplus press before `GDK_2BUTTON_PRESS`
|
`CS_DBLCLKS`, `src/msw/app.cpp:584`). GTK drops the surplus press before `GDK_2BUTTON_PRESS`
|
||||||
(`src/gtk/window.cpp:1798-1817`), and GTK2 also suppresses triple clicks (`:1818-1829`). On wxOSX the
|
(`src/gtk/window.cpp:1798-1817`), and GTK2 also suppresses triple clicks (`:1818-1829`). On wxOSX the
|
||||||
third press of a triple click is a DOWN again, as on MSW (`src/osx/cocoa/window.mm:4105-4140`;
|
third press of a triple click is a DOWN again, as on MSW (`src/osx/cocoa/window.mm:4105-4140`;
|
||||||
#25886, `docs/changes.txt:509`). `GetClickCount()` is "implemented only in wxMac and returns -1
|
#25886, `docs/changes.txt:316`). `GetClickCount()` is "implemented only in wxMac and returns -1
|
||||||
for the other platforms" (`interface/wx/event.h:2965-2974`).
|
for the other platforms" (`interface/wx/event.h:2965-2974`).
|
||||||
- **Context menu:** "under MSW the context menu event is generated after EVT_RIGHT_UP … but under
|
- **Context menu:** "under MSW the context menu event is generated after EVT_RIGHT_UP … but under
|
||||||
GTK … after EVT_RIGHT_DOWN", so a window handling `wxEVT_CONTEXT_MENU` must not handle (or must
|
GTK … after EVT_RIGHT_DOWN", so a window handling `wxEVT_CONTEXT_MENU` must not handle (or must
|
||||||
@@ -398,7 +398,7 @@ A diagonal trackpad scroll on macOS sends two events, vertical first, then one w
|
|||||||
| `ClientToScreen()`, `ScreenToClient()`, `GetScreenRect()` | — | add the top-level window's `gdk_window_get_origin()` (`src/gtk/window.cpp:4630-4698`). Without a global origin the result is only meaningful relative to the same top-level window: fine for deltas and hit tests inside one window, wrong across windows or for absolute placement |
|
| `ClientToScreen()`, `ScreenToClient()`, `GetScreenRect()` | — | add the top-level window's `gdk_window_get_origin()` (`src/gtk/window.cpp:4630-4698`). Without a global origin the result is only meaningful relative to the same top-level window: fine for deltas and hit tests inside one window, wrong across windows or for absolute placement |
|
||||||
| `wxFindWindowAtPoint(pt)` | deepest window at a screen point; disabled children count, hidden ones are skipped (`interface/wx/utils.h:385-394`) | built on screen rectangles, so unreliable. On GTK it is `wxGenericFindWindowAtPoint`, a walk over every top-level window and child (`src/gtk/utilsgtk.cpp:98-101`, `src/common/utilscmn.cpp:1294-1345`) |
|
| `wxFindWindowAtPoint(pt)` | deepest window at a screen point; disabled children count, hidden ones are skipped (`interface/wx/utils.h:385-394`) | built on screen rectangles, so unreliable. On GTK it is `wxGenericFindWindowAtPoint`, a walk over every top-level window and child (`src/gtk/utilsgtk.cpp:98-101`, `src/common/utilscmn.cpp:1294-1345`) |
|
||||||
| `wxGetKeyState(key)` | "In wxGTK, this function can be only used with modifier keys … when not using X11 backend" (`interface/wx/utils.h:352-358`) | Ctrl/Alt/Shift and Caps/Num/Scroll Lock only; any other key returns false (`src/unix/utilsx11.cpp:2596-2662`) |
|
| `wxGetKeyState(key)` | "In wxGTK, this function can be only used with modifier keys … when not using X11 backend" (`interface/wx/utils.h:352-358`) | Ctrl/Alt/Shift and Caps/Num/Scroll Lock only; any other key returns false (`src/unix/utilsx11.cpp:2596-2662`) |
|
||||||
| `WarpPointer()` | Apple's HIG forbids it; on Wayland it works only with a compositor implementing the pointer-warp protocol, and mutter also needs a pressed button (`interface/wx/window.h:3895-3914`; `docs/changes.txt:487`) | — |
|
| `WarpPointer()` | Apple's HIG forbids it; on Wayland it works only with a compositor implementing the pointer-warp protocol, and mutter also needs a pressed button (`interface/wx/window.h:3895-3914`; `docs/changes.txt:294`) | — |
|
||||||
| `wxUIActionSimulator` | "doesn't work when using Wayland" (`interface/wx/uiaction.h:20`) | — |
|
| `wxUIActionSimulator` | "doesn't work when using Wayland" (`interface/wx/uiaction.h:20`) | — |
|
||||||
| `PopupMenu(x, y)` | — | GTK ≥ 3.22 positions it relative to the window (`gtk_menu_popup_at_rect`, `src/gtk/window.cpp:6520-6565`), so it is safe |
|
| `PopupMenu(x, y)` | — | GTK ≥ 3.22 positions it relative to the window (`gtk_menu_popup_at_rect`, `src/gtk/window.cpp:6520-6565`), so it is safe |
|
||||||
|
|
||||||
@@ -540,7 +540,7 @@ The full Esc/close path is in `references/windows-dialogs.md`.
|
|||||||
layout"; specials are their `WXK_*` (`:1371-1394`). A Cyrillic `ц` gives `'W'`, so Ctrl+letter
|
layout"; specials are their `WXK_*` (`:1371-1394`). A Cyrillic `ц` gives `'W'`, so Ctrl+letter
|
||||||
shortcuts work across layouts, but an AZERTY key reports its own label (`$` where US has `]`), so
|
shortcuts work across layouts, but an AZERTY key reports its own label (`$` where US has `]`), so
|
||||||
`Ctrl-;`-style punctuation accelerators may be untypeable on some layouts (`:1396-1407`). wxGTK
|
`Ctrl-;`-style punctuation accelerators may be untypeable on some layouts (`:1396-1407`). wxGTK
|
||||||
got the non-Latin mapping in 3.3.0 (#23379, `docs/changes.txt:733`).
|
got the non-Latin mapping in 3.3.0 (#23379, `docs/changes.txt:540`).
|
||||||
- `wxEVT_CHAR` reflects Shift and the layout. Ctrl+letter gives 1..26 (`WXK_CONTROL_A` …,
|
- `wxEVT_CHAR` reflects Shift and the layout. Ctrl+letter gives 1..26 (`WXK_CONTROL_A` …,
|
||||||
`:1409-1421`). Exception: on macOS Cmd+letter's CHAR is the letter itself (`'a'`/`'A'`); only the
|
`:1409-1421`). Exception: on macOS Cmd+letter's CHAR is the letter itself (`'a'`/`'A'`); only the
|
||||||
physical Control key yields 1..26 (`src/osx/cocoa/window.mm:304-307`).
|
physical Control key yields 1..26 (`src/osx/cocoa/window.mm:304-307`).
|
||||||
@@ -629,14 +629,8 @@ Space/Return holds the mouse capture until its KEY_UP reaches the button. On MSW
|
|||||||
|
|
||||||
### Contract
|
### Contract
|
||||||
|
|
||||||
- "An accelerator takes precedence over normal processing" (`interface/wx/accel.h:178`). Since 3.3.4 this
|
- "An accelerator takes precedence over normal processing" (`interface/wx/accel.h:178`), but it
|
||||||
holds on every port (wxGTK used to let the focused window handle the key first), unless the focused
|
runs after `wxEVT_CHAR_HOOK` on every port (table above).
|
||||||
window claims the key. The accelerator walk still runs after `wxEVT_CHAR_HOOK` (table above). The new
|
|
||||||
`wxEVT_ACCELERATOR_KEY` event (`interface/wx/event.h:1740-1801`, `@since 3.3.4`) is sent to the focus
|
|
||||||
window — and propagated to its parents — before an accelerator is used; it is sent after
|
|
||||||
`wxEVT_CHAR_HOOK` on most ports and before it on macOS. Its handler can call `UseAccelerator()`, and a
|
|
||||||
window that must keep the key overrides `wxWindow::ClaimsKeyBeforeAccelerator()`
|
|
||||||
(`interface/wx/window.h:4554-4583`).
|
|
||||||
- [source] On GTK and macOS a hit is sent as `wxEVT_MENU` with the entry's id and, if unprocessed,
|
- [source] On GTK and macOS a hit is sent as `wxEVT_MENU` with the entry's id and, if unprocessed,
|
||||||
retried as `wxEVT_BUTTON`; macOS treats the key as consumed either way
|
retried as `wxEVT_BUTTON`; macOS treats the key as consumed either way
|
||||||
(`src/gtk/window.cpp:1340-1366`, `src/osx/window_osx.cpp:2563-2590`). On MSW the `WM_COMMAND` goes to
|
(`src/gtk/window.cpp:1340-1366`, `src/osx/window_osx.cpp:2563-2590`). On MSW the `WM_COMMAND` goes to
|
||||||
@@ -660,16 +654,11 @@ Space/Return holds the mouse capture until its KEY_UP reaches the button. On MSW
|
|||||||
them in `wxMenuBar::RebuildAccelTable` (`src/msw/menu.cpp:1264-1292`); GTK adds the menu's accel
|
them in `wxMenuBar::RebuildAccelTable` (`src/msw/menu.cpp:1264-1292`); GTK adds the menu's accel
|
||||||
group to the top-level window in `AttachToFrame` (`src/gtk/menu.cpp:239-247`). A menu shown with
|
group to the top-level window in `AttachToFrame` (`src/gtk/menu.cpp:239-247`). A menu shown with
|
||||||
`PopupMenu` treats `"\tCtrl+X"` as display text.
|
`PopupMenu` treats `"\tCtrl+X"` as display text.
|
||||||
- **Text-entry controls claim their editing keys on every port since 3.3.4.** A `wxTextCtrl`, a
|
- **MSW:** accelerators are not translated while a `wxTextCtrl`/`wxComboBox`/`wxSpinCtrl` has focus and
|
||||||
non-read-only `wxComboBox` or a `wxSpinCtrl` overrides `ClaimsKeyBeforeAccelerator()` to return
|
the key is a text-editing key: Ctrl+A/C/V/X/Ins/Del/Home/End/Left/Right, Shift+those navigation
|
||||||
`wxTextEntryBase::IsUsedForEditing()` (`src/common/textcmn.cpp:136-140`;
|
keys, bare Del/Home/End, Alt+Backspace (`src/msw/textentry.cpp:1073-1150`). Multi-line controls also
|
||||||
`src/common/spinctrlcmn.cpp:160-167`; `src/msw/combobox.cpp:389-395`, `src/gtk/combobox.cpp:205-211`):
|
keep Enter (`src/msw/textctrl.cpp:2110-2135`).
|
||||||
Alt+Backspace; any printable key with no modifier or Shift (except Delete, so Esc/Enter/Tab stay
|
- **GTK:** the accelerator walk has no such exemption (`src/gtk/window.cpp:1340-1366`). As menu
|
||||||
usable); Backspace/Delete/Home/End with no modifier or Shift; Ctrl+A/C/V/X; and Insert/Delete/Home/
|
|
||||||
End/Left/Right with Ctrl or Shift. A matching menu accelerator does not fire while such a control has
|
|
||||||
focus. The set lives in `IsUsedForEditing` (`src/common/textentrycmn.cpp:441-509`).
|
|
||||||
- **GTK:** the accelerator walk now consults `ClaimsKeyBeforeAccelerator()` too
|
|
||||||
(`src/gtk/window.cpp:1524-1539`), so the text-control exemption above applies here since 3.3.4. As menu
|
|
||||||
accelerators, Shift with non-alphabetic keys does not work, bare arrow keys do not work, and the
|
accelerators, Shift with non-alphabetic keys does not work, bare arrow keys do not work, and the
|
||||||
listed keys (Tab, the modifiers, locks …) are unsupported (`interface/wx/menuitem.h:562-575`).
|
listed keys (Tab, the modifiers, locks …) are unsupported (`interface/wx/menuitem.h:562-575`).
|
||||||
- **macOS:** menu-bar items become `NSMenuItem` key equivalents
|
- **macOS:** menu-bar items become `NSMenuItem` key equivalents
|
||||||
|
|||||||
@@ -69,12 +69,9 @@ Contents: [The stack](#the-stack-orcas-gui-is-built-on) ·
|
|||||||
|
|
||||||
## The stack Orca's GUI is built on
|
## The stack Orca's GUI is built on
|
||||||
|
|
||||||
- **wxWidgets 3.3.4, upstream.** `deps/wxWidgets/wxWidgets.cmake` fetches
|
- **wxWidgets 3.3.2, SoftFever fork.** `deps/wxWidgets/wxWidgets.cmake` fetches
|
||||||
`https://github.com/wxWidgets/wxWidgets` at tag `v3.3.4` and builds it static
|
`https://github.com/SoftFever/Orca-deps-wxWidgets` at tag `v3.3.2` and builds it static
|
||||||
(`-DwxBUILD_SHARED=OFF`); Flatpak builds build it shared. Two in-tree platform patches apply on
|
(`-DwxBUILD_SHARED=OFF`); Flatpak builds build it shared. Linux builds against **GTK3** by default
|
||||||
Apple and Windows only (`0001-macos-use-srgb-colour-components.patch`,
|
|
||||||
`0002-clang-cl-sibling-compiler-prefix.patch`) — `references/platforms.md`. Linux builds against
|
|
||||||
**GTK3** by default
|
|
||||||
(`option(DEP_WX_GTK3 "Build wxWidgets against GTK3" ON)` in `deps/CMakeLists.txt`, `SLIC3R_GTK`
|
(`option(DEP_WX_GTK3 "Build wxWidgets against GTK3" ON)` in `deps/CMakeLists.txt`, `SLIC3R_GTK`
|
||||||
default `"3"`, Flatpak uses gtk3). GTK2 exists only as an opt-out (`-DDEP_WX_GTK3=OFF`) and loses
|
default `"3"`, Flatpak uses gtk3). GTK2 exists only as an opt-out (`-DDEP_WX_GTK3=OFF`) and loses
|
||||||
EGL, WebKit2 and DIP pixels. Code guarded for GTK should still compile on GTK2, but GTK3 under X11
|
EGL, WebKit2 and DIP pixels. Code guarded for GTK should still compile on GTK2, but GTK3 under X11
|
||||||
@@ -88,12 +85,11 @@ Contents: [The stack](#the-stack-orcas-gui-is-built-on) ·
|
|||||||
- **Orca's own widget library.** New UI code largely does not use raw wx controls: the owner-drawn
|
- **Orca's own widget library.** New UI code largely does not use raw wx controls: the owner-drawn
|
||||||
widgets in `src/slic3r/GUI/Widgets/` (`Button`, `CheckBox`, `ComboBox`, `TextInput`, `SpinInput`,
|
widgets in `src/slic3r/GUI/Widgets/` (`Button`, `CheckBox`, `ComboBox`, `TextInput`, `SpinInput`,
|
||||||
`SwitchButton`, `RadioGroup`, `Label`, `DialogButtons`, …) replace them. Reasons: native controls
|
`SwitchButton`, `RadioGroup`, `Label`, `DialogButtons`, …) replace them. Reasons: native controls
|
||||||
cannot follow Orca's look or its app-level dark-mode toggle; on Windows wx's native dark mode reaches
|
cannot follow Orca's look or its app-level dark-mode toggle; on Windows wx's native dark mode does
|
||||||
the `TaskDialog()`-based boxes (`wxMessageBox`, `wxMessageDialog`, `wxRichMessageDialog`,
|
not reach anything built on `TaskDialog()` (`wxMessageBox`, `wxMessageDialog`, `wxRichMessageDialog`,
|
||||||
`wxProgressDialog`) since 3.3.3 and the wrapped common dialogs (`wxColourDialog`, `wxFontDialog`, …)
|
`wxProgressDialog`) nor the wrapped common dialogs (`wxColourDialog`, `wxFontDialog`, …)
|
||||||
since 3.3.4, but the date/time/calendar controls, `wxPrintDialog` on Windows 10 and MDI applications
|
(`interface/wx/app.h:1434-1443`), so Orca shows the `MsgDialog` family and its own generic
|
||||||
stay light (`interface/wx/app.h:1442-1448`), so Orca shows the `MsgDialog` family and its own generic
|
`Widgets/ProgressDialog` instead; and on GTK the theme's borders bleed through wrapped native
|
||||||
`Widgets/ProgressDialog` for a consistent look; and on GTK the theme's borders bleed through wrapped native
|
|
||||||
controls (the widgets call `RemoveButtonBorder` / `RemoveInputBorder` under `__WXGTK__`).
|
controls (the widgets call `RemoveButtonBorder` / `RemoveInputBorder` under `__WXGTK__`).
|
||||||
Plain containers stay raw (`wxPanel`, `wxBoxSizer`, `wxScrolledWindow`).
|
Plain containers stay raw (`wxPanel`, `wxBoxSizer`, `wxScrolledWindow`).
|
||||||
- **Namespaces.** Most widgets are in the global namespace; a few (`DialogButtons`, `HyperLink`,
|
- **Namespaces.** Most widgets are in the global namespace; a few (`DialogButtons`, `HyperLink`,
|
||||||
|
|||||||
@@ -67,10 +67,9 @@ Contents: [Rules](#rules) · [Why the library exists](#why-the-library-exists)
|
|||||||
Native controls cannot carry Orca's flat, rounded, palette-coloured look, and they cannot follow all of Orca's
|
Native controls cannot carry Orca's flat, rounded, palette-coloured look, and they cannot follow all of Orca's
|
||||||
theming:
|
theming:
|
||||||
- On Windows the theme is an app-level setting (Preferences "Enable dark Mode", Windows-only) layered on
|
- On Windows the theme is an app-level setting (Preferences "Enable dark Mode", Windows-only) layered on
|
||||||
`MSWEnableDarkMode`; wx's MSW dark mode now reaches the `TaskDialog()`-based dialogs (`wxMessageBox`,
|
`MSWEnableDarkMode`, and wx's MSW dark mode does not reach `TaskDialog()`-based dialogs (`wxMessageBox`,
|
||||||
`wxMessageDialog`, `wxRichMessageDialog`, `wxProgressDialog`) since 3.3.3 and the common dialogs since 3.3.4,
|
`wxMessageDialog`, `wxRichMessageDialog`, `wxProgressDialog`), the common dialogs or the date/time pickers
|
||||||
but the date/time pickers, `wxPrintDialog` on Windows 10 and MDI applications stay light
|
(`interface/wx/app.h:1436-1445`). Hence the `MsgDialog` family (`references/windows-dialogs.md`) and Orca's own
|
||||||
(`interface/wx/app.h:1442-1448`). Hence the `MsgDialog` family (`references/windows-dialogs.md`) and Orca's own
|
|
||||||
`ProgressDialog`.
|
`ProgressDialog`.
|
||||||
- On macOS and Linux Orca follows the system appearance; native controls are themed by the toolkit, but any
|
- On macOS and Linux Orca follows the system appearance; native controls are themed by the toolkit, but any
|
||||||
light palette colour set on them still needs the `UpdateDarkUI` pass (`references/colours-dark-mode.md`).
|
light palette colour set on them still needs the `UpdateDarkUI` pass (`references/colours-dark-mode.md`).
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ to write a custom control on the wx side and how to author an Orca widget on the
|
|||||||
`StaticBox`/`StateHandler` foundation. Read it before writing or reviewing any `wxEVT_PAINT`
|
`StaticBox`/`StateHandler` foundation. Read it before writing or reviewing any `wxEVT_PAINT`
|
||||||
handler, `render`/`doRender` method, `messureSize`, or a new class under `src/slic3r/GUI/Widgets/`.
|
handler, `render`/`doRender` method, `messureSize`, or a new class under `src/slic3r/GUI/Widgets/`.
|
||||||
|
|
||||||
wx cites are relative to the pinned wx 3.3.4 tree (located as in `SKILL.md` §Ground truth).
|
wx cites are relative to the pinned wx 3.3.2 tree (located as in `SKILL.md` §Ground truth).
|
||||||
Orca builds wx with `wxBUILD_DEBUG_LEVEL=0` and `libslic3r_gui` with `wxDEBUG_LEVEL=0`: every
|
Orca builds wx with `wxBUILD_DEBUG_LEVEL=0` and `libslic3r_gui` with `wxDEBUG_LEVEL=0`: every
|
||||||
wx assert below is compiled out and `wxCHECK*` returns silently, so paint misuse shows up only as
|
wx assert below is compiled out and `wxCHECK*` returns silently, so paint misuse shows up only as
|
||||||
wrong, missing or stale pixels, never as an assert dialog.
|
wrong, missing or stale pixels, never as an assert dialog.
|
||||||
@@ -116,7 +116,7 @@ Bind(wxEVT_PAINT, [this](wxPaintEvent&) {
|
|||||||
|
|
||||||
| Situation | MSW | macOS | GTK3 (X11 and Wayland) | GTK2 (opt-out build) |
|
| Situation | MSW | macOS | GTK3 (X11 and Wayland) | GTK2 (opt-out build) |
|
||||||
|---|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
| Handler creates no `wxPaintDC` | `wxWindowMSW::HandlePaint` sees no DC and lets `DefWindowProc` validate the region: no `WM_PAINT` storm in 3.3.4, but drawing is unclipped and the contract is broken (`src/msw/window.cpp` `HandlePaint`) | no error; the window shows only what the background step left (undetermined under `wxBG_STYLE_PAINT`) | same | same |
|
| Handler creates no `wxPaintDC` | `wxWindowMSW::HandlePaint` sees no DC and lets `DefWindowProc` validate the region: no `WM_PAINT` storm in 3.3.2, but drawing is unclipped and the contract is broken (`src/msw/window.cpp` `HandlePaint`) | no error; the window shows only what the background step left (undetermined under `wxBG_STYLE_PAINT`) | same | same |
|
||||||
| Handler creates a DC, then `Skip()`s | default `OnPaint` (native painting) runs as well | — | — | — |
|
| Handler creates a DC, then `Skip()`s | default `OnPaint` (native painting) runs as well | — | — | — |
|
||||||
| `wxPaintDC` outside a paint event | `wxCHECK_RET(!paintStack.empty(), "wxPaintDC can't be created outside wxEVT_PAINT handler")` (also for a window other than the one being repainted): the DC gets no HDC and every draw call is a silent no-op (`src/msw/dcclient.cpp` `wxPaintDCImpl::wxPaintDCImpl`) | no visible effect | `wxCHECK_RET(cr, "using wxPaintDC without being in a native paint event")`, every draw call is a silent no-op (`src/gtk/dc.cpp:518`) | works (GDK) |
|
| `wxPaintDC` outside a paint event | `wxCHECK_RET(!paintStack.empty(), "wxPaintDC can't be created outside wxEVT_PAINT handler")` (also for a window other than the one being repainted): the DC gets no HDC and every draw call is a silent no-op (`src/msw/dcclient.cpp` `wxPaintDCImpl::wxPaintDCImpl`) | no visible effect | `wxCHECK_RET(cr, "using wxPaintDC without being in a native paint event")`, every draw call is a silent no-op (`src/gtk/dc.cpp:518`) | works (GDK) |
|
||||||
| `wxClientDC` drawing | works on non-composited windows; the doc lists "wxMSW when using double buffering" (`WS_EX_COMPOSITED`, see below) as non-working (`interface/wx/dcclient.h:82-84`), yet `CanBeUsedForDrawing` returns `true` unconditionally (`include/wx/msw/dcclient.h:60`), so it cannot detect that case | never; `CanBeUsedForDrawing` is `false` (`include/wx/osx/dcclient.h:58`) | X11 works; Wayland has no effect, `CanBeUsedForDrawing` is `false` on `wxDisplayWayland` (`src/gtk/dc.cpp` `wxClientDCImpl::CanBeUsedForDrawing`) | works |
|
| `wxClientDC` drawing | works on non-composited windows; the doc lists "wxMSW when using double buffering" (`WS_EX_COMPOSITED`, see below) as non-working (`interface/wx/dcclient.h:82-84`), yet `CanBeUsedForDrawing` returns `true` unconditionally (`include/wx/msw/dcclient.h:60`), so it cannot detect that case | never; `CanBeUsedForDrawing` is `false` (`include/wx/osx/dcclient.h:58`) | X11 works; Wayland has no effect, `CanBeUsedForDrawing` is `false` on `wxDisplayWayland` (`src/gtk/dc.cpp` `wxClientDCImpl::CanBeUsedForDrawing`) | works |
|
||||||
@@ -283,8 +283,8 @@ void MyCard::OnPaint(wxPaintEvent&) {
|
|||||||
ancestor up to the TLW (`src/msw/window.cpp` `wxWindowMSW::IsDoubleBuffered`);
|
ancestor up to the TLW (`src/msw/window.cpp` `wxWindowMSW::IsDoubleBuffered`);
|
||||||
`SetDoubleBuffered(on)` toggles that style; `MSWDisableComposited()` removes it up the chain.
|
`SetDoubleBuffered(on)` toggles that style; `MSWDisableComposited()` removes it up the chain.
|
||||||
`WS_EX_COMPOSITED` makes the whole subtree paint bottom-up into one buffer.
|
`WS_EX_COMPOSITED` makes the whole subtree paint bottom-up into one buffer.
|
||||||
- wx 3.3.0 enabled double buffering for all MSW windows (#22851, `docs/changes.txt:750`) and 3.3.2
|
- wx 3.3.0 enabled double buffering for all MSW windows (#22851, `docs/changes.txt:557`) and 3.3.2
|
||||||
reverted it (#25808, `docs/changes.txt:501`). In 3.3.4 nothing in wx sets `WS_EX_COMPOSITED`
|
reverted it (#25808, `docs/changes.txt:308`). In 3.3.2 nothing in wx sets `WS_EX_COMPOSITED`
|
||||||
unless the app calls `SetDoubleBuffered(true)`: MSW windows are not double-buffered by default,
|
unless the app calls `SetDoubleBuffered(true)`: MSW windows are not double-buffered by default,
|
||||||
exactly as in 3.2.
|
exactly as in 3.2.
|
||||||
- macOS: always double-buffered, `IsDoubleBuffered()` returns `true` (`include/wx/osx/window.h:161`);
|
- macOS: always double-buffered, `IsDoubleBuffered()` returns `true` (`include/wx/osx/window.h:161`);
|
||||||
@@ -439,7 +439,7 @@ Two variants exist:
|
|||||||
(`src/msw/gdiimage.cpp` `wxGDIImage::GetScaleFactor`, `src/msw/dcmemory.cpp`; details in
|
(`src/msw/gdiimage.cpp` `wxGDIImage::GetScaleFactor`, `src/msw/dcmemory.cpp`; details in
|
||||||
`references/dpi-bitmaps-fonts.md §wxBitmap`), while `GetLogicalSize()` stays the physical size there.
|
`references/dpi-bitmaps-fonts.md §wxBitmap`), while `GetLogicalSize()` stays the physical size there.
|
||||||
- MSW `wxBitmap::Create(size, dc)` no longer multiplies by the DC content scale; the size is
|
- MSW `wxBitmap::Create(size, dc)` no longer multiplies by the DC content scale; the size is
|
||||||
physical (`docs/changes.txt:100-102`).
|
physical (`docs/changes.txt:94-96`).
|
||||||
|
|
||||||
**Usage — portable back buffer.**
|
**Usage — portable back buffer.**
|
||||||
```cpp
|
```cpp
|
||||||
@@ -556,7 +556,7 @@ already prepared ([Buffered painting](#buffered-painting-and-double-buffering)).
|
|||||||
must set the appropriate fonts and colours" (`interface/wx/dc.h:775-780`). `GetFont()` returns `wxNullFont` until
|
must set the appropriate fonts and colours" (`interface/wx/dc.h:775-780`). `GetFont()` returns `wxNullFont` until
|
||||||
`SetFont()` is called (`interface/wx/dc.h:715-720`).
|
`SetFont()` is called (`interface/wx/dc.h:715-720`).
|
||||||
- wx 3.3 moved the non-drawing members to `wxReadOnlyDC` and several overridable measuring virtuals
|
- wx 3.3 moved the non-drawing members to `wxReadOnlyDC` and several overridable measuring virtuals
|
||||||
now take it (`docs/changes.txt:260-263`); see `references/wx-33-changes.md`.
|
now take it (`docs/changes.txt:228-231`); see `references/wx-33-changes.md`.
|
||||||
|
|
||||||
**OrcaSlicer.** Orca widgets measure in `messureSize()`. A `messureSize()` that builds a
|
**OrcaSlicer.** Orca widgets measure in `messureSize()`. A `messureSize()` that builds a
|
||||||
`wxClientDC dc(this)` (`Button::messureSize`, `TextInput::messureSize`) measures correctly on every
|
`wxClientDC dc(this)` (`Button::messureSize`, `TextInput::messureSize`) measures correctly on every
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Platforms, the wx build, and platform-specific code
|
# Platforms, the wx build, and platform-specific code
|
||||||
|
|
||||||
Read this when code has to differ per platform, when a bug shows up on only one OS, toolkit or display
|
Read this when code has to differ per platform, when a bug shows up on only one OS, toolkit or display
|
||||||
server, or when you need to know how Orca's wxWidgets is built. It covers the wx source pin and its build
|
server, or when you need to know how Orca's wxWidgets is built. It covers the wx fork and its build
|
||||||
options, platform macros, per-platform summaries that point into the topic files, and where
|
options, platform macros, per-platform summaries that point into the topic files, and where
|
||||||
platform-specific code lives. It also owns runtime X11/Wayland detection, the Wayland gap list, custom
|
platform-specific code lives. It also owns runtime X11/Wayland detection, the Wayland gap list, custom
|
||||||
title bars and window decoration, GTK native-chrome removal, and the cross-platform test checklist.
|
title bars and window decoration, GTK native-chrome removal, and the cross-platform test checklist.
|
||||||
@@ -58,46 +58,37 @@ Contents: [Rules](#rules) · [The wx build Orca uses](#the-wx-build-orca-uses)
|
|||||||
|
|
||||||
## The wx build Orca uses
|
## The wx build Orca uses
|
||||||
|
|
||||||
### Source, pin and local patches
|
### Source, pin and local patch
|
||||||
|
|
||||||
- `deps/wxWidgets/wxWidgets.cmake` builds upstream `https://github.com/wxWidgets/wxWidgets` at tag
|
- `deps/wxWidgets/wxWidgets.cmake` builds `https://github.com/SoftFever/Orca-deps-wxWidgets` at tag
|
||||||
**`v3.3.4`** (`GIT_SHALLOW ON`, submodules `3rdparty/catch`, `3rdparty/pcre` and `3rdparty/libwebp`
|
**`v3.3.2`** (`GIT_SHALLOW ON`, submodules `3rdparty/catch`, `3rdparty/pcre` and `3rdparty/libwebp`
|
||||||
only). Two in-tree patches under `deps/wxWidgets/` are applied, one per platform, so neither applies
|
only). The fork carries Orca's build fixes, the clang-cl fix among them; do not duplicate
|
||||||
on Linux: `0001-macos-use-srgb-colour-components.patch` on Apple and
|
a fork fix as a local patch under `deps/wxWidgets/` (cc390f11ee removed the local
|
||||||
`0002-clang-cl-sibling-compiler-prefix.patch` on Windows. The clang-cl patch is the old fork's
|
`0001-Clang-CL-fix.patch` once the fork carried the fix). The fork's clang-cl fix is the MSVC lib-dir
|
||||||
clang-cl fix ported back to a local patch: it changes the MSVC lib-dir selection in the installed
|
selection in the installed `wxWidgetsConfig.cmake`: it looks for `<prefix>_<arch>_lib` (or `_dll`)
|
||||||
`wxWidgetsConfig.cmake` so it looks for `<prefix>_<arch>_lib` (or `_dll`) under the consuming
|
under the consuming compiler's prefix first and then the sibling one (`clang` ↔ `vc`), because cl
|
||||||
compiler's prefix first and then the sibling one (`clang` ↔ `vc`), because cl and clang-cl share an
|
and clang-cl share an ABI and either can consume either build
|
||||||
ABI and either can consume either build (`build/cmake/wxWidgetsConfig.cmake.in:53-73`). Because the
|
(`build/cmake/wxWidgetsConfig.cmake.in:53-73`).
|
||||||
pin is upstream, every other build fix must live as a local patch under `deps/wxWidgets/`.
|
- **The one local patch** is `deps/wxWidgets/0001-macos-use-srgb-colour-components.patch`, applied
|
||||||
- **The Apple patch** is `deps/wxWidgets/0001-macos-use-srgb-colour-components.patch`, applied
|
|
||||||
only `if (APPLE)`. The `PATCH_COMMAND` first runs `git checkout -f -- src/osx/cocoa/colour.mm` and
|
only `if (APPLE)`. The `PATCH_COMMAND` first runs `git checkout -f -- src/osx/cocoa/colour.mm` and
|
||||||
then `git apply`, so the step can run again safely (a7775296b0). The patch makes the wxOSX
|
then `git apply`, so the step can run again safely (a7775296b0). The patch makes the wxOSX
|
||||||
`wxColour` component getters (`wxNSColorRefData::Red/Green/Blue/Alpha` and `IsSolid`) convert the
|
`wxColour` component getters (`wxNSColorRefData::Red/Green/Blue/Alpha` and `IsSolid`) convert the
|
||||||
`NSColor` with `[NSColorSpace sRGBColorSpace]` instead of `NSCalibratedRGBColorSpace`, so colours
|
`NSColor` with `[NSColorSpace sRGBColorSpace]` instead of `NSCalibratedRGBColorSpace`, so colours
|
||||||
read back on macOS match their sRGB values (custom-colour accuracy). Colour usage:
|
read back on macOS match their sRGB values (custom-colour accuracy). Colour usage:
|
||||||
`references/colours-dark-mode.md`.
|
`references/colours-dark-mode.md`.
|
||||||
- **The Windows patch** is `deps/wxWidgets/0002-clang-cl-sibling-compiler-prefix.patch`, applied only
|
|
||||||
`if (WIN32)`. Its `PATCH_COMMAND` first runs
|
|
||||||
`git checkout -f -- build/cmake/wxWidgetsConfig.cmake.in` and then `git apply`, so the step can run
|
|
||||||
again safely. It rewrites the `WIN32_MSVC_NAMING` branch of `build/cmake/wxWidgetsConfig.cmake.in`
|
|
||||||
to try the consuming compiler's prefix first and then the sibling one (`clang` ↔ `vc`) when locating
|
|
||||||
the installed `<prefix>_<arch>_lib`/`_dll` directory.
|
|
||||||
- The checked-out source is the tree that every wx citation in this skill refers to:
|
- The checked-out source is the tree that every wx citation in this skill refers to:
|
||||||
`deps/build/<arch>/dep_wxWidgets-prefix/src/dep_wxWidgets` on macOS and
|
`deps/build/<arch>/dep_wxWidgets-prefix/src/dep_wxWidgets` on macOS and
|
||||||
`deps/<tree>/dep_wxWidgets-prefix/src/dep_wxWidgets` on Linux and Windows (`deps/build` for a
|
`deps/<tree>/dep_wxWidgets-prefix/src/dep_wxWidgets` on Linux and Windows (`deps/build` for a
|
||||||
release build; `build_win.bat` names the others). Locate it with the bash or PowerShell lookup in
|
release build; `build_win.bat` names the others). Locate it with the bash or PowerShell lookup in
|
||||||
`SKILL.md` §Ground truth. On macOS its
|
`SKILL.md` §Ground truth. On macOS its
|
||||||
`src/osx/cocoa/colour.mm` already has the Apple patch applied; on Windows its
|
`src/osx/cocoa/colour.mm` already has the patch applied.
|
||||||
`build/cmake/wxWidgetsConfig.cmake.in` already has the clang-cl patch applied.
|
|
||||||
- **Flatpak builds wx separately.** `deps/CMakeLists.txt` leaves `dep_wxWidgets` out of the deps
|
- **Flatpak builds wx separately.** `deps/CMakeLists.txt` leaves `dep_wxWidgets` out of the deps
|
||||||
target when `FLATPAK` is set. Instead, `scripts/flatpak/com.orcaslicer.OrcaSlicer.yml` has its own
|
target when `FLATPAK` is set. Instead, `scripts/flatpak/com.orcaslicer.OrcaSlicer.yml` has its own
|
||||||
`wxWidgets` module whose config-opts "mirror deps/wxWidgets/wxWidgets.cmake with FLATPAK=ON,
|
`wxWidgets` module whose config-opts "mirror deps/wxWidgets/wxWidgets.cmake with FLATPAK=ON,
|
||||||
DEP_WX_GTK3=ON": `-DwxBUILD_TOOLKIT=gtk3`, a shared build (`wxBUILD_SHARED=ON`,
|
DEP_WX_GTK3=ON": `-DwxBUILD_TOOLKIT=gtk3`, a shared build (`wxBUILD_SHARED=ON`,
|
||||||
`BUILD_SHARED_LIBS=ON`, `d` debug postfix), and `wxUSE_LIBWEBP=sys`, because the builtin webp
|
`BUILD_SHARED_LIBS=ON`, `d` debug postfix), and `wxUSE_LIBWEBP=sys`, because the builtin webp
|
||||||
libraries are installed only by static builds. It links with lld and pins upstream `v3.3.4` at
|
libraries are installed only by static builds. It links with lld and pins the fork's tag
|
||||||
commit `6a42a4b999b127cf28a8b5fe686da6b8ca93a9b8`. Option and version changes must be made in both
|
`orca-3.3.2` at a fixed commit. Option and version changes must be made in both files.
|
||||||
files; it applies neither patch (GTK3, no MSVC).
|
|
||||||
|
|
||||||
### Toolkit per platform
|
### Toolkit per platform
|
||||||
|
|
||||||
@@ -197,7 +188,7 @@ Its `wx/gtk/private*` includes are commented out. The per-port headers outside t
|
|||||||
`wx/msw/private.h` (`BitmapComboBox.cpp`, `PresetComboBoxes.cpp`, Windows-guarded) and
|
`wx/msw/private.h` (`BitmapComboBox.cpp`, `PresetComboBoxes.cpp`, Windows-guarded) and
|
||||||
`wx/osx/private.h` (`Utils/MacDarkMode.mm`), come with the regular wx install. Private headers are
|
`wx/osx/private.h` (`Utils/MacDarkMode.mm`), come with the regular wx install. Private headers are
|
||||||
port-specific and unversioned. Include one only under the same macro wx uses for that port or
|
port-specific and unversioned. Include one only under the same macro wx uses for that port or
|
||||||
feature, and re-check it whenever the wx pin is bumped.
|
feature, and re-check it whenever the fork is bumped.
|
||||||
|
|
||||||
### wxInspector
|
### wxInspector
|
||||||
|
|
||||||
@@ -277,8 +268,8 @@ Each bullet names the mechanism and the file that owns it.
|
|||||||
popups with it are dismissed on deactivation, deferred through `CallAfter`. No key dismisses a
|
popups with it are dismissed on deactivation, deferred through `CallAfter`. No key dismisses a
|
||||||
popup, and `ProcessLeftDown` is never called. `PopupWindow::BindUnfocusEvent` is MSW-only →
|
popup, and `ProcessLeftDown` is never called. `PopupWindow::BindUnfocusEvent` is MSW-only →
|
||||||
`references/popups-menus.md` §5.
|
`references/popups-menus.md` §5.
|
||||||
- **Painting:** in 3.3.4 windows are not double-buffered by default (the 3.3.0 global
|
- **Painting:** in 3.3.2 windows are not double-buffered by default (the 3.3.0 global
|
||||||
`WS_EX_COMPOSITED` was reverted, `docs/changes.txt:501`). Custom widgets buffer by hand →
|
`WS_EX_COMPOSITED` was reverted, `docs/changes.txt:308`). Custom widgets buffer by hand →
|
||||||
`references/painting-custom-widgets.md`.
|
`references/painting-custom-widgets.md`.
|
||||||
- **Building large panels:** every control is a native child window, and outside a sizer pass a move
|
- **Building large panels:** every control is a native child window, and outside a sizer pass a move
|
||||||
or resize is immediate, repainting when the window is shown [source: `src/msw/window.cpp:2036`
|
or resize is immediate, repainting when the window is shown [source: `src/msw/window.cpp:2036`
|
||||||
@@ -293,9 +284,8 @@ Each bullet names the mechanism and the file that owns it.
|
|||||||
- **Mouse capture:** `wxEVT_MOUSE_CAPTURE_LOST` and `wxEVT_MOUSE_CAPTURE_CHANGED` are delivered →
|
- **Mouse capture:** `wxEVT_MOUSE_CAPTURE_LOST` and `wxEVT_MOUSE_CAPTURE_CHANGED` are delivered →
|
||||||
`references/mouse-keyboard-focus.md`.
|
`references/mouse-keyboard-focus.md`.
|
||||||
- **Controls:** `wxDataViewCtrl` is the generic implementation (`references/controls-dataview.md`).
|
- **Controls:** `wxDataViewCtrl` is the generic implementation (`references/controls-dataview.md`).
|
||||||
TaskDialog-based dialogs (since 3.3.3) and common dialogs (since 3.3.4) follow wx dark mode; the
|
TaskDialog-based dialogs and common dialogs stay light in wx dark mode
|
||||||
date/time/calendar controls, `wxPrintDialog` on Windows 10 and MDI applications stay light
|
(`interface/wx/app.h:1434-1448`); Orca's `MsgDialog` family is owner-drawn →
|
||||||
(`interface/wx/app.h:1442-1448`); Orca's `MsgDialog` family is owner-drawn →
|
|
||||||
`references/windows-dialogs.md`.
|
`references/windows-dialogs.md`.
|
||||||
- **WebView:** Edge (WebView2). It needs the runtime (checked by `GUI_App::init_webview_runtime`),
|
- **WebView:** Edge (WebView2). It needs the runtime (checked by `GUI_App::init_webview_runtime`),
|
||||||
creates asynchronously, serves custom schemes as `https://<scheme>.wxsite`, and allows one script
|
creates asynchronously, serves custom schemes as `https://<scheme>.wxsite`, and allows one script
|
||||||
@@ -626,16 +616,16 @@ headers. Rows marked [source] or "protocol" come from the implementation or from
|
|||||||
| Area | What happens on Wayland | Cite | Orca handling / owner |
|
| Area | What happens on Wayland | Cite | Orca handling / owner |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| Global pointer position | `wxGetMousePosition()` / `wxGetMouseState()` call `gdk_device_get_position` [source], but Wayland gives clients no global pointer position, so the result is not a screen position | `src/gtk/window.cpp` `wxGetMousePosition` | use event coordinates + `ClientToScreen` (`BBLTopbar`); dismiss popups by focus tracking (`SearchDialog::Dismiss`) → `references/mouse-keyboard-focus.md` |
|
| Global pointer position | `wxGetMousePosition()` / `wxGetMouseState()` call `gdk_device_get_position` [source], but Wayland gives clients no global pointer position, so the result is not a screen position | `src/gtk/window.cpp` `wxGetMousePosition` | use event coordinates + `ClientToScreen` (`BBLTopbar`); dismiss popups by focus tracking (`SearchDialog::Dismiss`) → `references/mouse-keyboard-focus.md` |
|
||||||
| Top-level position | the compositor places windows, and `SetPosition()` / `Move()` on a TLW have no effect (protocol). 3.3.4 added geometry restore through the Wayland XDG session-management protocol (`SaveGeometry`/`RestoreToGeometry` with the new `SaveString`/`RestoreString` fields) | `interface/wx/toplevel.h:439-455, 474-490` | `GUI_App::window_pos_restore` restores only size and maximised state; moves go through `gtk_window_begin_move_drag` |
|
| Top-level position | the compositor places windows, and `SetPosition()` / `Move()` on a TLW have no effect (protocol) | — | `GUI_App::window_pos_restore` restores only size and maximised state; moves go through `gtk_window_begin_move_drag` |
|
||||||
| Window icon | `SetIcon()` / `SetIcons()` "doesn't do anything when using Wayland … create a `.desktop` file" | `interface/wx/toplevel.h:517-521, 538-542` | `src/dev-utils/platform/unix/com.orcaslicer.OrcaSlicer.desktop` (`Icon=OrcaSlicer`, `StartupWMClass=orca-slicer`) |
|
| Window icon | `SetIcon()` / `SetIcons()` "doesn't do anything when using Wayland … create a `.desktop` file" | `interface/wx/toplevel.h:517-521, 538-542` | `src/dev-utils/platform/unix/com.orcaslicer.OrcaSlicer.desktop` (`Icon=OrcaSlicer`, `StartupWMClass=orca-slicer`) |
|
||||||
| App id | `wxAppConsole::SetClassName()` is the xdg `app_id` with GTK ≥ 3.24.22 (and the AUMID on Windows); it must be set before any TLW. wx applies it when a TLW is mapped, and only if it is non-empty [source: `wxTopLevelWindowGTK::GTKHandleMapped`] | `interface/wx/app.h:765-812` | Orca calls only `SetAppName(SLIC3R_APP_KEY)`, so GTK's default applies. On Windows, `SetClassName` would also change shell behaviour (MRU, Shift+middle-click) |
|
| App id | `wxAppConsole::SetClassName()` is the xdg `app_id` with GTK ≥ 3.24.22 (and the AUMID on Windows); it must be set before any TLW. wx applies it when a TLW is mapped, and only if it is non-empty [source: `wxTopLevelWindowGTK::GTKHandleMapped`] | `interface/wx/app.h:765-812` | Orca calls only `SetAppName(SLIC3R_APP_KEY)`, so GTK's default applies. On Windows, `SetClassName` would also change shell behaviour (MRU, Shift+middle-click) |
|
||||||
| `wxClientDC` | deprecated in 3.3 ("please use wxInfoDC instead for obtaining information", `interface/wx/dcclient.h:43-46`). Drawing through it "simply doesn't have any effect" on GTK3/Wayland or wxOSX. `CanBeUsedForDrawing()` [source]: false on Wayland only for wxGTK (`src/gtk/dc.cpp`), always false on wxOSX, always true on wxMSW (`include/wx/{osx,msw}/dcclient.h`), although its doc also lists "wxMSW when using double buffering" | `interface/wx/dcclient.h:48-53, 80-88` | draw only in `wxPaintDC` after `Refresh()`/`RefreshRect()` → `references/painting-custom-widgets.md` |
|
| `wxClientDC` | deprecated in 3.3 ("please use wxInfoDC instead for obtaining information", `interface/wx/dcclient.h:43-46`). Drawing through it "simply doesn't have any effect" on GTK3/Wayland or wxOSX. `CanBeUsedForDrawing()` [source]: false on Wayland only for wxGTK (`src/gtk/dc.cpp`), always false on wxOSX, always true on wxMSW (`include/wx/{osx,msw}/dcclient.h`), although its doc also lists "wxMSW when using double buffering" | `interface/wx/dcclient.h:48-53, 80-88` | draw only in `wxPaintDC` after `Refresh()`/`RefreshRect()` → `references/painting-custom-widgets.md` |
|
||||||
| `wxWindow::Update()` | "doesn't do anything in wxGTK port when using Wayland". [source] wx skips the GDK update calls there because they broke later updates (#25036) | `interface/wx/window.h:2405-2407` | never rely on `Update()` to paint synchronously |
|
| `wxWindow::Update()` | "doesn't do anything in wxGTK port when using Wayland". [source] wx skips the GDK update calls there because they broke later updates (#25036) | `interface/wx/window.h:2405-2407` | never rely on `Update()` to paint synchronously |
|
||||||
| `WarpPointer()` | works only if the compositor implements the pointer-warp protocol; mutter also needs a mouse button held | `interface/wx/window.h:3902-3907`; `docs/changes.txt:487` | Orca never warps the pointer |
|
| `WarpPointer()` | works only if the compositor implements the pointer-warp protocol; mutter also needs a mouse button held | `interface/wx/window.h:3902-3907`; `docs/changes.txt:294` | Orca never warps the pointer |
|
||||||
| `wxUIActionSimulator` | "currently doesn't work when using Wayland with wxGTK" | `interface/wx/uiaction.h:20` | not used; Orca also builds `wxUSE_XTEST=OFF` |
|
| `wxUIActionSimulator` | "currently doesn't work when using Wayland with wxGTK" | `interface/wx/uiaction.h:20` | not used; Orca also builds `wxUSE_XTEST=OFF` |
|
||||||
| `wxBitmap(const wxCursor&)` | creates an invalid bitmap | `interface/wx/bitmap.h:393-395` | — |
|
| `wxBitmap(const wxCursor&)` | creates an invalid bitmap | `interface/wx/bitmap.h:393-395` | — |
|
||||||
| OpenGL | only EGL; `PreferGLX()` has no effect. Without EGL in the build, wxGTK's `wxGLCanvas` shows a fatal message and refuses to work [source: `src/gtk/glcanvas.cpp` `IsAvailable`]. The EGL surface is a subsurface over the canvas, ready only after map and a frame callback [source: `src/unix/glegl.cpp`] | `interface/wx/glcanvas.h:1094-1095` | `CLI::run` forces X11 when wx lacks EGL; overlays are drawn in GL/ImGui, never as wx children over the canvas → `references/webview-gl-aui-media.md` |
|
| OpenGL | only EGL; `PreferGLX()` has no effect. Without EGL in the build, wxGTK's `wxGLCanvas` shows a fatal message and refuses to work [source: `src/gtk/glcanvas.cpp` `IsAvailable`]. The EGL surface is a subsurface over the canvas, ready only after map and a frame callback [source: `src/unix/glegl.cpp`] | `interface/wx/glcanvas.h:1094-1095` | `CLI::run` forces X11 when wx lacks EGL; overlays are drawn in GL/ImGui, never as wx children over the canvas → `references/webview-gl-aui-media.md` |
|
||||||
| AUI | the doc note "live resize is always used … for wxOSX and wxGTK3 when using Wayland" is obsolete: "As of wxWidgets 3.3.0 this function always returns false", and `wxAUI_MGR_LIVE_RESIZE` is in the default flags. AUI's docking-hint logic still needs global positions; 3.3.4 added system drag sessions (`StartDragSession`) so wx can move a pane's floating frame under Wayland anyway | `interface/wx/aui/framemanager.h:336-345`; `src/aui/framemanager.cpp:4574-4599` | `Plater::priv::priv` clears `wxAUI_MGR_ALLOW_FLOATING`; `sanitize_window_layout_for_wayland` strips floating state from the saved layout → `references/webview-gl-aui-media.md` §wxAuiManager |
|
| AUI | the doc note "live resize is always used … for wxOSX and wxGTK3 when using Wayland" is obsolete: "As of wxWidgets 3.3.0 this function always returns false", and `wxAUI_MGR_LIVE_RESIZE` is in the default flags. Floating panes need global positions | `interface/wx/aui/framemanager.h:336-345` | `Plater::priv::priv` clears `wxAUI_MGR_ALLOW_FLOATING`; `sanitize_window_layout_for_wayland` strips floating state from the saved layout → `references/webview-gl-aui-media.md` §wxAuiManager |
|
||||||
| Popups | a GTK popup is an `xdg_popup` only for COMBO/DROPDOWN/POPUP_MENU hints, so wx creates popups with `GDK_WINDOW_TYPE_HINT_COMBO` [source]. A chained popup's parent must be the mapped popup, and mapping it with a grab deactivates the toplevel (Orca's comments in `DropDown::mouseMove`, `DropDown::ShouldDismissOnTopWindowDeactivate`) | `src/gtk/popupwin.cpp:110-114` | `DropDown` transient-for chain, `ShouldDismissOnTopWindowDeactivate` → `references/popups-menus.md` |
|
| Popups | a GTK popup is an `xdg_popup` only for COMBO/DROPDOWN/POPUP_MENU hints, so wx creates popups with `GDK_WINDOW_TYPE_HINT_COMBO` [source]. A chained popup's parent must be the mapped popup, and mapping it with a grab deactivates the toplevel (Orca's comments in `DropDown::mouseMove`, `DropDown::ShouldDismissOnTopWindowDeactivate`) | `src/gtk/popupwin.cpp:110-114` | `DropDown` transient-for chain, `ShouldDismissOnTopWindowDeactivate` → `references/popups-menus.md` |
|
||||||
| Fractional scale | arrives as an integer GDK scale | `docs/doxygen/overviews/high_dpi.md:348-351` | → `references/dpi-bitmaps-fonts.md` |
|
| Fractional scale | arrives as an integer GDK scale | `docs/doxygen/overviews/high_dpi.md:348-351` | → `references/dpi-bitmaps-fonts.md` |
|
||||||
| Window decorations | some desktop environments draw a title bar on undecorated windows anyway | — | [Undecorated windows](#wayland-undecorated-top-level-windows-splash) |
|
| Window decorations | some desktop environments draw a title bar on undecorated windows anyway | — | [Undecorated windows](#wayland-undecorated-top-level-windows-splash) |
|
||||||
@@ -646,9 +636,7 @@ were two-finger scrolling (703, 3.1.3), the EGL-based `wxGLCanvas` for Wayland (
|
|||||||
support (498, both 3.1.5). New with the upgrade: "Many bug fixes for Wayland-specific problem" (397)
|
support (498, both 3.1.5). New with the upgrade: "Many bug fixes for Wayland-specific problem" (397)
|
||||||
and a `wxMediaCtrl` fix (402) in 3.1.6, GDK errors from `PopupMenu()` avoided (317, 3.1.7),
|
and a `wxMediaCtrl` fix (402) in 3.1.6, GDK errors from `PopupMenu()` avoided (317, 3.1.7),
|
||||||
`wxCURSOR_SIZING` fixed (261, 3.2.0). In 3.3, `WarpPointer()` on supported compositors
|
`wxCURSOR_SIZING` fixed (261, 3.2.0). In 3.3, `WarpPointer()` on supported compositors
|
||||||
(`docs/changes.txt:487`) and the EGL/Wayland high-DPI scale fix (`changes.txt:731`); in 3.3.4, a fix for
|
(`docs/changes.txt:294`) and the EGL/Wayland high-DPI scale fix (`changes.txt:538`).
|
||||||
the crash on pointer/seat disconnect (`changes.txt:371`), AUI pane dragging via system drag sessions
|
|
||||||
(`:372`) and window-geometry restore via XDG session management (`:373`).
|
|
||||||
|
|
||||||
## Window decoration and custom title bars
|
## Window decoration and custom title bars
|
||||||
|
|
||||||
@@ -670,7 +658,7 @@ There is no `wxCAPTION` on any platform; each port then needs its own handling.
|
|||||||
**Contract** [source + documented]. Since wx **3.3.0**, `wxTopLevelWindowMSW::MSWGetStyle` adds
|
**Contract** [source + documented]. Since wx **3.3.0**, `wxTopLevelWindowMSW::MSWGetStyle` adds
|
||||||
`WS_CAPTION` whenever any of `wxCAPTION | wxMINIMIZE_BOX | wxMAXIMIZE_BOX | wxCLOSE_BOX` is set
|
`WS_CAPTION` whenever any of `wxCAPTION | wxMINIMIZE_BOX | wxMAXIMIZE_BOX | wxCLOSE_BOX` is set
|
||||||
(`src/msw/toplevel.cpp:133-135`). The 3.3.0 wxMSW change list says "Turn wxCAPTION on automatically if
|
(`src/msw/toplevel.cpp:133-135`). The 3.3.0 wxMSW change list says "Turn wxCAPTION on automatically if
|
||||||
required by other styles (#23575)" (`docs/changes.txt:774`). Commit eefdabcd98 attributes this to
|
required by other styles (#23575)" (`docs/changes.txt:581`). Commit eefdabcd98 attributes this to
|
||||||
3.3.2, but it is a 3.3.0 change. `SetWindowStyleFlag()` recomputes the native style through
|
3.3.2, but it is a 3.3.0 change. `SetWindowStyleFlag()` recomputes the native style through
|
||||||
`MSWGetStyle` and turns the bits back on (`src/msw/window.cpp` `wxWindowMSW::MSWUpdateStyle`).
|
`MSWGetStyle` and turns the bits back on (`src/msw/window.cpp` `wxWindowMSW::MSWUpdateStyle`).
|
||||||
|
|
||||||
@@ -880,11 +868,10 @@ do both). Cite: 6148ba16b3, 988b500f33.
|
|||||||
|
|
||||||
## wx 3.3 migration notes
|
## wx 3.3 migration notes
|
||||||
|
|
||||||
Orca moved from **3.1.5** to **3.3.2** in 8248b06337 ("Updated wxWidgets to 3.3.2", #12941; build system
|
Orca moved from **3.1.5** to 3.3.2 in 8248b06337 ("Updated wxWidgets to 3.3.2", #12941; build system
|
||||||
in 2d7e26292b); the pin is now upstream **3.3.4** (`deps/wxWidgets/wxWidgets.cmake`, tag `v3.3.4`), so
|
in 2d7e26292b), so the 3.1.6–3.2.0 incompatible changes (`docs/changes_32.txt`) apply as well as
|
||||||
the 3.1.6–3.2.0 incompatible changes (`docs/changes_32.txt`) apply as well as `docs/changes.txt`. The
|
`docs/changes.txt`. The version digest, every migration commit as a rule for new code, and the
|
||||||
version digest, every migration commit as a rule for new code, and the post-upgrade regressions to
|
post-upgrade regressions to watch are owned by `references/wx-33-changes.md` (§8). The
|
||||||
watch are owned by `references/wx-33-changes.md` (§10); the 3.3.3 and 3.3.4 changes are its §8–§9. The
|
|
||||||
platform-specific ones are described in this file: the `MainFrame` `WS_CAPTION` handling
|
platform-specific ones are described in this file: the `MainFrame` `WS_CAPTION` handling
|
||||||
([MSW title bar](#msw-the-mainframe-custom-title-bar)), the macOS `kAEGetURL` re-registration and the
|
([MSW title bar](#msw-the-mainframe-custom-title-bar)), the macOS `kAEGetURL` re-registration and the
|
||||||
`SidePopup` anchoring ([ifdef landscape](#the-ifdef-landscape)), and the GTK criticals filter
|
`SidePopup` anchoring ([ifdef landscape](#the-ifdef-landscape)), and the GTK criticals filter
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Popups, transient windows and menus
|
# Popups, transient windows and menus
|
||||||
|
|
||||||
How wx 3.3.4 popups and menus behave on each port, and the Orca wrappers built on them: `PopupWindow`,
|
How wx 3.3.2 popups and menus behave on each port, and the Orca wrappers built on them: `PopupWindow`,
|
||||||
`DropDown`/`ComboBox`, `SidePopup`, the search popups, frameless dialogs used as popups, `MenuFactory`,
|
`DropDown`/`ComboBox`, `SidePopup`, the search popups, frameless dialogs used as popups, `MenuFactory`,
|
||||||
`append_menu_item`, `Plater::PopupMenu` and the macOS menubar versus `BBLTopbar`. Read it before you add
|
`append_menu_item`, `Plater::PopupMenu` and the macOS menubar versus `BBLTopbar`. Read it before you add
|
||||||
or change anything that opens over other UI and must close by itself, or any context menu or menubar item.
|
or change anything that opens over other UI and must close by itself, or any context menu or menubar item.
|
||||||
@@ -791,7 +791,7 @@ created with `wxBORDER_NONE | wxFRAME_NO_TASKBAR | wxFRAME_FLOAT_ON_PARENT | wxF
|
|||||||
`wxWindow`. "The window automatically destroys itself when the user clicks on it or it loses the focus"
|
`wxWindow`. "The window automatically destroys itself when the user clicks on it or it loses the focus"
|
||||||
(`interface/wx/tipwin.h:13-14`). Since 3.3.2 use `static Ref New(parent, text, maxLength, rectBound)`. The
|
(`interface/wx/tipwin.h:13-14`). Since 3.3.2 use `static Ref New(parent, text, maxLength, rectBound)`. The
|
||||||
returned `wxTipWindow::Ref` is "guaranteed to become invalid when the tip window is closed", and the raw
|
returned `wxTipWindow::Ref` is "guaranteed to become invalid when the tip window is closed", and the raw
|
||||||
constructor is deprecated (`tipwin.h:27-132`; `docs/changes.txt:479`). `Create` positions the tip at the mouse
|
constructor is deprecated (`tipwin.h:27-132`; `docs/changes.txt:286`). `Create` positions the tip at the mouse
|
||||||
and pops it up immediately (`src/generic/tipwin.cpp:171-240`); on GTK it also captures the mouse.
|
and pops it up immediately (`src/generic/tipwin.cpp:171-240`); on GTK it also captures the mouse.
|
||||||
`SetBoundingRect` closes the tip when the mouse leaves that rectangle (`tipwin.h:160-172`). Orca:
|
`SetBoundingRect` closes the tip when the mouse leaves that rectangle (`tipwin.h:160-172`). Orca:
|
||||||
`Button::OnParentMotion` (MSW-only tooltips for disabled buttons) keeps a `wxTipWindow::Ref`.
|
`Button::OnParentMotion` (MSW-only tooltips for disabled buttons) keeps a `wxTipWindow::Ref`.
|
||||||
@@ -800,11 +800,11 @@ created with `wxBORDER_NONE | wxFRAME_NO_TASKBAR | wxFRAME_FLOAT_ON_PARENT | wxF
|
|||||||
`wxRichToolTipPopup` (`src/generic/richtooltipg.cpp`). Re-check it on every wx update.
|
`wxRichToolTipPopup` (`src/generic/richtooltipg.cpp`). Re-check it on every wx update.
|
||||||
- **`wxInfoBar`** "calls its parent wxWindow::Layout() method and assumes that it will change the parent
|
- **`wxInfoBar`** "calls its parent wxWindow::Layout() method and assumes that it will change the parent
|
||||||
layout": add it to the parent's sizer (`interface/wx/infobar.h:38-44`). It is generic on all ports and native
|
layout": add it to the parent's sizer (`interface/wx/infobar.h:38-44`). It is generic on all ports and native
|
||||||
in wxGTK. Use `ShowMessage(msg, flags)`/`Dismiss()`. 3.3 adds `ShowCheckBox` (`docs/changes.txt:653`).
|
in wxGTK. Use `ShowMessage(msg, flags)`/`Dismiss()`. 3.3 adds `ShowCheckBox` (`docs/changes.txt:460`).
|
||||||
- **`wxNotificationMessage`** is "not a window", native on MSW, macOS and GTK (`interface/wx/notifmsg.h:12-18`).
|
- **`wxNotificationMessage`** is "not a window", native on MSW, macOS and GTK (`interface/wx/notifmsg.h:12-18`).
|
||||||
MSW recommends `MSWUseToasts()` before the first notification, macOS needs the alert notification style for
|
MSW recommends `MSWUseToasts()` before the first notification, macOS needs the alert notification style for
|
||||||
actions, and GTK ignores the timeout for warnings and errors (`notifmsg.h:23-38`, 179-182). 3.3 reports the
|
actions, and GTK ignores the timeout for warnings and errors (`notifmsg.h:23-38`, 179-182). 3.3 reports the
|
||||||
dismissal reason (`docs/changes.txt:681`). Orca does not use it. Its in-app notifications are the GL-canvas
|
dismissal reason (`docs/changes.txt:488`). Orca does not use it. Its in-app notifications are the GL-canvas
|
||||||
`NotificationManager`.
|
`NotificationManager`.
|
||||||
|
|
||||||
## 13. wxMenu and wxMenuItem
|
## 13. wxMenu and wxMenuItem
|
||||||
@@ -862,7 +862,7 @@ submenu (it leaks), `Destroy(id)` deletes it, and `Remove()` returns ownership (
|
|||||||
an item switch it to owner-drawn (`MSWMustUseOwnerDrawn`, `src/msw/menuitem.cpp:1371-1377`). "Owner drawn items
|
an item switch it to owner-drawn (`MSWMustUseOwnerDrawn`, `src/msw/menuitem.cpp:1371-1377`). "Owner drawn items
|
||||||
are also incompatible with dark mode support and using them makes the entire menu containing them to use
|
are also incompatible with dark mode support and using them makes the entire menu containing them to use
|
||||||
standard light mode colours even in dark mode." 3.3.2 reworked MSW dark-mode menu rendering
|
standard light mode colours even in dark mode." 3.3.2 reworked MSW dark-mode menu rendering
|
||||||
(`docs/changes.txt:498-499`); owner-drawn items still opt out of it.
|
(`docs/changes.txt:305-306`); owner-drawn items still opt out of it.
|
||||||
|
|
||||||
**Labels and accelerators** (`menuitem.h:460-490`, 555-570).
|
**Labels and accelerators** (`menuitem.h:460-490`, 555-570).
|
||||||
- The syntax is `"&Label\tCtrl+X"`; `&&` is a literal ampersand. `CTRL` means Cmd on macOS, and `RAWCTRL` gives
|
- The syntax is `"&Label\tCtrl+X"`; `&&` is a literal ampersand. `CTRL` means Cmd on macOS, and `RAWCTRL` gives
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Sizers and layout
|
# Sizers and layout
|
||||||
|
|
||||||
How wx 3.3.4 computes window sizes and lays out children, and how OrcaSlicer builds layouts on top of
|
How wx 3.3.2 computes window sizes and lays out children, and how OrcaSlicer builds layouts on top of
|
||||||
that: sizers and flags, best/min size, the fitting functions (`SetSizerAndFit`, `SetSizeHints`, `Fit`,
|
that: sizers and flags, best/min size, the fitting functions (`SetSizerAndFit`, `SetSizeHints`, `Fit`,
|
||||||
`Layout`, `FitInside`) per platform, show/hide relayout, Freeze/Thaw, scrolled windows, `wxStaticText`
|
`Layout`, `FitInside`) per platform, show/hide relayout, Freeze/Thaw, scrolled windows, `wxStaticText`
|
||||||
wrapping, layout on DPI change, and Orca's layout idioms. Read it when building or reviewing any dialog
|
wrapping, layout on DPI change, and Orca's layout idioms. Read it when building or reviewing any dialog
|
||||||
@@ -604,7 +604,7 @@ Ordinary dialogs and the sidebar use plain `wxScrolledWindow`.
|
|||||||
without spaces never wraps with `wxStaticText::Wrap`.
|
without spaces never wraps with `wxStaticText::Wrap`.
|
||||||
- `wxST_WRAP` (new in 3.3.2): "Wrap label text on multiple lines if necessary, using the available
|
- `wxST_WRAP` (new in 3.3.2): "Wrap label text on multiple lines if necessary, using the available
|
||||||
horizontal space. This style only works when the control is used inside a sizer"
|
horizontal space. This style only works when the control is used inside a sizer"
|
||||||
(`interface/wx/stattext.h:46-49`; `docs/changes.txt:473`). It is opt-in; labels without it are
|
(`interface/wx/stattext.h:46-49`; `docs/changes.txt:280`). It is opt-in; labels without it are
|
||||||
unaffected. It is implemented with `GetMinSizeFromKnownDirection` (`stattextcmn.cpp:285-312`).
|
unaffected. It is implemented with `GetMinSizeFromKnownDirection` (`stattextcmn.cpp:285-312`).
|
||||||
**[source]** The initial `CalcMin` still uses the unwrapped best size, so a fitted dialog grows to the
|
**[source]** The initial `CalcMin` still uses the unwrapped best size, so a fitted dialog grows to the
|
||||||
full one-line width and nothing wraps; constrain the width another way (a fixed or min width on the
|
full one-line width and nothing wraps; constrain the width another way (a fixed or min width on the
|
||||||
|
|||||||
@@ -44,8 +44,7 @@ Contents: [Rules](#rules) · [Build facts](#build-facts-that-decide-string-behav
|
|||||||
12. One complete sentence per msgid, placeholders instead of concatenated fragments, the number
|
12. One complete sentence per msgid, placeholders instead of concatenated fragments, the number
|
||||||
placeholder in both plural forms, `// TRN` for ambiguous strings, a context for homonyms.
|
placeholder in both plural forms, `// TRN` for ambiguous strings, a context for homonyms.
|
||||||
→ §Plurals and contexts
|
→ §Plurals and contexts
|
||||||
13. A wrapper that converts a translation (`wxString::FromUTF8`, `ToUTF8()`, `format_wxstr`) returns
|
13. A wrapper around `wxGetTranslation` returns `wxString` by value. → §Translation
|
||||||
by value; `wxGetTranslation()` itself returns `const wxString&`. → §Translation
|
|
||||||
14. User-supplied text (preset, filament, file, printer names) in a mnemonic-interpreting label
|
14. User-supplied text (preset, filament, file, printer names) in a mnemonic-interpreting label
|
||||||
goes through `SetLabelText` or `wxControl::EscapeMnemonics`. → §Labels
|
goes through `SetLabelText` or `wxControl::EscapeMnemonics`. → §Labels
|
||||||
15. File dialogs: filters from `file_wildcards(FT_*)`, default dir `from_u8(app_config->get_last_dir())`,
|
15. File dialogs: filters from `file_wildcards(FT_*)`, default dir `from_u8(app_config->get_last_dir())`,
|
||||||
@@ -187,11 +186,11 @@ was the splash screen's event filter, fixed in 4088a36095; see `references/threa
|
|||||||
**modifies the string**. Use `s[n].GetValue()` or an explicit `int`/`wchar_t` type
|
**modifies the string**. Use `s[n].GetValue()` or an explicit `int`/`wchar_t` type
|
||||||
(`interface/wx/string.h:171-226`).
|
(`interface/wx/string.h:171-226`).
|
||||||
- Since 3.3 `wxstr = {"Hello", 2}` is ambiguous (the `string_view` constructor); write
|
- Since 3.3 `wxstr = {"Hello", 2}` is ambiguous (the `string_view` constructor); write
|
||||||
`wxString{"Hello", 2}` (`docs/changes.txt:223-226`).
|
`wxString{"Hello", 2}` (`docs/changes.txt:191-194`).
|
||||||
- Never pass a `wxString`, `c_str()` or `mb_str()` to a real C vararg function (`printf`); use
|
- Never pass a `wxString`, `c_str()` or `mb_str()` to a real C vararg function (`printf`); use
|
||||||
`wxString::Format`/`wxPrintf` or convert explicitly (`interface/wx/string.h:262-300`).
|
`wxString::Format`/`wxPrintf` or convert explicitly (`interface/wx/string.h:262-300`).
|
||||||
- `wxUSE_STL` no longer exists; wx 3.3 re-enables implicit `wxString` → `std::string` only through
|
- `wxUSE_STL` no longer exists; wx 3.3 re-enables implicit `wxString` → `std::string` only through
|
||||||
`wxUSE_STD_STRING_CONV_IN_WXSTRING=1` (`docs/changes.txt:195-198`). Orca keeps it 0 and adds
|
`wxUSE_STD_STRING_CONV_IN_WXSTRING=1` (`docs/changes.txt:163-166`). Orca keeps it 0 and adds
|
||||||
`wxNO_UNSAFE_WXSTRING_CONV`; do not enable either conversion, the compile error is the guard.
|
`wxNO_UNSAFE_WXSTRING_CONV`; do not enable either conversion, the compile error is the guard.
|
||||||
|
|
||||||
### Pitfalls
|
### Pitfalls
|
||||||
@@ -323,13 +322,10 @@ language's decimal separator; `wxString::ToCDouble`/`FromCDouble` do not.
|
|||||||
**wx contract** (`interface/wx/translation.h:577-640`): `wxGetTranslation(string, domain = "",
|
**wx contract** (`interface/wx/translation.h:577-640`): `wxGetTranslation(string, domain = "",
|
||||||
context = "")` returns the original string when no catalog has it; a non-empty context needs a
|
context = "")` returns the original string when no catalog has it; a non-empty context needs a
|
||||||
matching `msgctxt` in the catalog; the plural overload returns `string` for `n == 1` and `plural`
|
matching `msgctxt` in the catalog; the plural overload returns `string` for `n == 1` and `plural`
|
||||||
otherwise when no catalog is found; "This function is thread-safe". It returns **`const wxString&`**
|
otherwise when no catalog is found; "This function is thread-safe". Since 3.3 it returns
|
||||||
(`interface/wx/translation.h:615`; `include/wx/translation.h:277-309`). 3.3.2 changed this to a
|
**`wxString` by value**, not a const reference: "please change the return type of the function to
|
||||||
by-value `wxString` and **3.3.3 reverted it** to the 3.2.x reference, so the reference points at the
|
wxString" (`docs/changes.txt:139-142`). Orca's `I18N::translate` overloads already return by value;
|
||||||
catalog's own string or at `wxTranslations::GetUntranslatedString()`, both of which outlive the call.
|
keep any new wrapper that way, a `const wxString&` return now dangles.
|
||||||
Forwarding that reference is therefore safe; what must return by value is a wrapper that constructs a
|
|
||||||
temporary — `wxString::FromUTF8`, `ToUTF8()`, `format_wxstr`. Orca's `I18N::translate` overloads
|
|
||||||
return `wxString` by value and `translate_utf8`/`_u8L` return `std::string`.
|
|
||||||
|
|
||||||
**OrcaSlicer macros** (`src/slic3r/GUI/I18N.hpp`):
|
**OrcaSlicer macros** (`src/slic3r/GUI/I18N.hpp`):
|
||||||
|
|
||||||
@@ -433,7 +429,7 @@ using this class doesn't affect the native controls and dialogs", and on macOS 1
|
|||||||
C locale can break the menus (`interface/wx/intl.h:282-292`): native file dialogs, the app menu and
|
C locale can break the menus (`interface/wx/intl.h:282-292`): native file dialogs, the app menu and
|
||||||
standard buttons follow the system language. `wxLocale::IsAvailable` builds a region tag and asks
|
standard buttons follow the system language. `wxLocale::IsAvailable` builds a region tag and asks
|
||||||
`wxUILocale(...).IsSupported()` (`src/common/intl.cpp` `wxLocale::IsAvailable`), which on Unix no
|
`wxUILocale(...).IsSupported()` (`src/common/intl.cpp` `wxLocale::IsAvailable`), which on Unix no
|
||||||
longer falls back to another region of the same language (`docs/changes.txt:81-85`); keep the
|
longer falls back to another region of the same language (`docs/changes.txt:75-79`); keep the
|
||||||
fallbacks in `load_language`.
|
fallbacks in `load_language`.
|
||||||
|
|
||||||
- **Rule:** translate at use; never store a translated string in a namespace-scope or function-local
|
- **Rule:** translate at use; never store a translated string in a namespace-scope or function-local
|
||||||
@@ -461,7 +457,7 @@ call `SetLabel(label)`) [source]. `SetLabelMarkup` also treats an
|
|||||||
unescaped `&` as a mnemonic, needs `&`/`<` for literal characters, strips the markup where it
|
unescaped `&` as a mnemonic, needs `&`/`<` for literal characters, strips the markup where it
|
||||||
is unsupported, and leaves the label unchanged (returns false) when the string is not well-formed
|
is unsupported, and leaves the label unchanged (returns false) when the string is not well-formed
|
||||||
(`interface/wx/control.h:200-360`); user text inside markup must be XML-escaped.
|
(`interface/wx/control.h:200-360`); user text inside markup must be XML-escaped.
|
||||||
Since 3.3 wxListbook/wxChoicebook also interpret mnemonics in page titles (`docs/changes.txt:134-136`);
|
Since 3.3 wxListbook/wxChoicebook also interpret mnemonics in page titles (`docs/changes.txt:128-130`);
|
||||||
Orca uses neither, but the rule is the same for every book control.
|
Orca uses neither, but the rule is the same for every book control.
|
||||||
|
|
||||||
**OrcaSlicer.** `Label` (`Widgets/Label.cpp`) derives from `wxStaticText`; `Label::SetLabel` stores
|
**OrcaSlicer.** `Label` (`Widgets/Label.cpp`) derives from `wxStaticText`; `Label::SetLabel` stores
|
||||||
@@ -499,7 +495,7 @@ so build it from the wide form (`into_path(w).wstring()`) or stay with boost. At
|
|||||||
expands `$VAR`/`%VAR%` inside file names (`interface/wx/filename.h:90-103`); use `MakeAbsolute()` or
|
expands `$VAR`/`%VAR%` inside file names (`interface/wx/filename.h:90-103`); use `MakeAbsolute()` or
|
||||||
explicit `wxPATH_NORM_DOTS | wxPATH_NORM_ABSOLUTE`. 3.3 adds `IsMSWExtendedLengthPath()` for `\\?\`
|
explicit `wxPATH_NORM_DOTS | wxPATH_NORM_ABSOLUTE`. 3.3 adds `IsMSWExtendedLengthPath()` for `\\?\`
|
||||||
paths "avoiding the 260 character path length restriction" (`interface/wx/filename.h:1040-1051`,
|
paths "avoiding the 260 character path length restriction" (`interface/wx/filename.h:1040-1051`,
|
||||||
`docs/changes.txt:744`). `wxFileSystem::FileNameToURL`/`URLToFileName` convert to and from `file:`
|
`docs/changes.txt:551`). `wxFileSystem::FileNameToURL`/`URLToFileName` convert to and from `file:`
|
||||||
URLs (`interface/wx/filesys.h:96-103, 175-180`).
|
URLs (`interface/wx/filesys.h:96-103, 175-180`).
|
||||||
|
|
||||||
**`wxStandardPaths`** (`interface/wx/stdpaths.h`): the directories "may or may not exist"
|
**`wxStandardPaths`** (`interface/wx/stdpaths.h`): the directories "may or may not exist"
|
||||||
@@ -556,9 +552,9 @@ for (const wxString& p : paths)
|
|||||||
|
|
||||||
| | Behaviour |
|
| | Behaviour |
|
||||||
|---|---|
|
|---|---|
|
||||||
| MSW | New-style `IFileDialog`: wx calls `SetDefaultExtension` with the selected filter's first extension and no longer calls `AppendExtension` itself (`src/msw/filedlg.cpp:1644-1656, 1738-1740`; `docs/changes.txt:749`). `SetExtraControlCreator` → XP-style dialog. |
|
| MSW | New-style `IFileDialog`: wx calls `SetDefaultExtension` with the selected filter's first extension and no longer calls `AppendExtension` itself (`src/msw/filedlg.cpp:1644-1656, 1738-1740`; `docs/changes.txt:556`). `SetExtraControlCreator` → XP-style dialog. |
|
||||||
| macOS | Open dialogs show **no filter choice** and apply all wildcards at once unless `wxSystemOptions::SetOption(wxOSX_FILEDIALOG_ALWAYS_SHOW_TYPES, 1)`, and even then non-matching files are only greyed (`interface/wx/filedlg.h:117-128`). Matching compares the lower-cased last path extension (`wxOpenSavePanelDelegate panel:shouldEnableURL:`, `src/osx/cocoa/filedlg.mm:58-88`) [source]: case-insensitive, and a multi-dot pattern such as `*.gcode.3mf` or `*.zip.amf` never matches by itself. `wxFD_OVERWRITE_PROMPT` is always on (`:172-175`); `wxFD_OPEN` always behaves as `wxFD_FILE_MUST_EXIST` (`:184-189`). The save panel replaces the initial file name's extension with the first one in the wildcard (Orca's comment on `file_wildcards`). The native panel runs `runModal` and does not re-raise the parent dialog afterwards (`src/osx/cocoa/filedlg.mm` `ShowModal`); see `references/windows-dialogs.md` for the deferred re-raise. |
|
| macOS | Open dialogs show **no filter choice** and apply all wildcards at once unless `wxSystemOptions::SetOption(wxOSX_FILEDIALOG_ALWAYS_SHOW_TYPES, 1)`, and even then non-matching files are only greyed (`interface/wx/filedlg.h:117-128`). Matching compares the lower-cased last path extension (`wxOpenSavePanelDelegate panel:shouldEnableURL:`, `src/osx/cocoa/filedlg.mm:58-88`) [source]: case-insensitive, and a multi-dot pattern such as `*.gcode.3mf` or `*.zip.amf` never matches by itself. `wxFD_OVERWRITE_PROMPT` is always on (`:172-175`); `wxFD_OPEN` always behaves as `wxFD_FILE_MUST_EXIST` (`:184-189`). The save panel replaces the initial file name's extension with the first one in the wildcard (Orca's comment on `file_wildcards`). The native panel runs `runModal` and does not re-raise the parent dialog afterwards (`src/osx/cocoa/filedlg.mm` `ShowModal`); see `references/windows-dialogs.md` for the deferred re-raise. |
|
||||||
| GTK3 | `GtkFileChooserNative` (portal-capable, e.g. Flatpak) when GTK ≥ 3.20 at runtime and neither `wxFD_PREVIEW` nor an extra control/customize hook is used (`src/gtk/filedlg.cpp:265-274, 437-443`; `src/gtk/dirdlg.cpp:122-130`; `docs/changes.txt:586`). It runs through `gtk_native_dialog_run`: there is no wx window, so size/position calls do nothing (`wxFileDialog::DoSetSize` is empty). Patterns go to `gtk_file_filter_add_pattern` per token and are **case-sensitive** (`src/gtk/filectrl.cpp:169`). The chooser is transient for the parent left after `GetParentForModalDialog`, which replaces a null (or hidden, dying or `wxWS_EX_TRANSIENT`) parent with the active top-level window, else the app's main top window (`src/gtk/filedlg.cpp:206, 223-225`; `src/common/dlgcmn.cpp:180-203` `DoGetParentForDialog`) [source]. `wxFD_PREVIEW` is GTK-only (`interface/wx/filedlg.h:195-197`). |
|
| GTK3 | `GtkFileChooserNative` (portal-capable, e.g. Flatpak) when GTK ≥ 3.20 at runtime and neither `wxFD_PREVIEW` nor an extra control/customize hook is used (`src/gtk/filedlg.cpp:265-274, 437-443`; `src/gtk/dirdlg.cpp:122-130`; `docs/changes.txt:393`). It runs through `gtk_native_dialog_run`: there is no wx window, so size/position calls do nothing (`wxFileDialog::DoSetSize` is empty). Patterns go to `gtk_file_filter_add_pattern` per token and are **case-sensitive** (`src/gtk/filectrl.cpp:169`). The chooser is transient for the parent left after `GetParentForModalDialog`, which replaces a null (or hidden, dying or `wxWS_EX_TRANSIENT`) parent with the active top-level window, else the app's main top window (`src/gtk/filedlg.cpp:206, 223-225`; `src/common/dlgcmn.cpp:180-203` `DoGetParentForDialog`) [source]. `wxFD_PREVIEW` is GTK-only (`interface/wx/filedlg.h:195-197`). |
|
||||||
| GTK2 (opt-out build) | never uses the native chooser; patterns case-sensitive. |
|
| GTK2 (opt-out build) | never uses the native chooser; patterns case-sensitive. |
|
||||||
|
|
||||||
**OrcaSlicer:**
|
**OrcaSlicer:**
|
||||||
@@ -654,7 +650,7 @@ dtor, and `!lock` tests `IsOpened()`.
|
|||||||
|
|
||||||
| | Behaviour |
|
| | Behaviour |
|
||||||
|---|---|
|
|---|---|
|
||||||
| MSW | `SetData`/`GetData` do not check `Open()` (`src/msw/clipbrd.cpp` `wxClipboard::SetData`), so code that forgets it works here only. `wxTextDataObject::SetData()` size must now include the 2-byte NUL (`docs/changes.txt:68-72`); use `SetText()` or the ctor. |
|
| MSW | `SetData`/`GetData` do not check `Open()` (`src/msw/clipbrd.cpp` `wxClipboard::SetData`), so code that forgets it works here only. `wxTextDataObject::SetData()` size must now include the 2-byte NUL (`docs/changes.txt:62-66`); use `SetText()` or the ctor. |
|
||||||
| macOS | without `Open()`, `SetData`/`AddData`/`GetData` return false through `wxCHECK_MSG(m_open, …)` without taking the object (`src/osx/carbon/clipbrd.cpp:84-105, 140-147`); a successful write is flushed to the pasteboard immediately (`:110-114`). |
|
| macOS | without `Open()`, `SetData`/`AddData`/`GetData` return false through `wxCHECK_MSG(m_open, …)` without taking the object (`src/osx/carbon/clipbrd.cpp:84-105, 140-147`); a successful write is flushed to the pasteboard immediately (`:110-114`). |
|
||||||
| GTK | same `wxCHECK_MSG(m_open, …)` early return (`src/gtk/clipbrd.cpp:643-647, 775`). `GetData`/`IsSupported` are asynchronous underneath: `wxClipboardSync` spins `YieldFor(wxEVT_CATEGORY_CLIPBOARD)` until GTK answers and forbids re-entrancy (`src/gtk/clipbrd.cpp:68-92`). PRIMARY selection exists. Under Wayland, Wayland MIME types are advertised next to the X11 atoms (`src/gtk/clipbrd.cpp:655-700`). |
|
| GTK | same `wxCHECK_MSG(m_open, …)` early return (`src/gtk/clipbrd.cpp:643-647, 775`). `GetData`/`IsSupported` are asynchronous underneath: `wxClipboardSync` spins `YieldFor(wxEVT_CATEGORY_CLIPBOARD)` until GTK answers and forbids re-entrancy (`src/gtk/clipbrd.cpp:68-92`). PRIMARY selection exists. Under Wayland, Wayland MIME types are advertised next to the X11 atoms (`src/gtk/clipbrd.cpp:655-700`). |
|
||||||
|
|
||||||
@@ -797,8 +793,8 @@ from a non-main thread on wxOSX (`:39-40`); `wxCANCEL_DEFAULT` is ignored on wxO
|
|||||||
`wxID_OK/wxID_CANCEL/wxID_YES/wxID_NO/wxID_HELP` (`:269-275`), but **`wxMessageBox()` returns
|
`wxID_OK/wxID_CANCEL/wxID_YES/wxID_NO/wxID_HELP` (`:269-275`), but **`wxMessageBox()` returns
|
||||||
`wxYES/wxNO/wxCANCEL/wxOK/wxHELP`** (`:308-312`). `wxRichMessageDialog` is native only on MSW and
|
`wxYES/wxNO/wxCANCEL/wxOK/wxHELP`** (`:308-312`). `wxRichMessageDialog` is native only on MSW and
|
||||||
generic elsewhere (`interface/wx/richmsgdlg.h:18-23`). On MSW every `TaskDialog`-based dialog
|
generic elsewhere (`interface/wx/richmsgdlg.h:18-23`). On MSW every `TaskDialog`-based dialog
|
||||||
(`wxMessageBox`, `wxMessageDialog`, `wxRichMessageDialog`, `wxProgressDialog`) has followed dark mode
|
(`wxMessageBox`, `wxMessageDialog`, `wxRichMessageDialog`, `wxProgressDialog`) ignores dark mode
|
||||||
since 3.3.3 (`interface/wx/app.h:1442-1448`).
|
(`interface/wx/app.h:1436-1440`).
|
||||||
|
|
||||||
**OrcaSlicer.** UI code uses the MsgDialog family (`MessageDialog`, `RichMessageDialog`,
|
**OrcaSlicer.** UI code uses the MsgDialog family (`MessageDialog`, `RichMessageDialog`,
|
||||||
`WarningDialog`, `ErrorDialog`, `InfoDialog`; `references/windows-dialogs.md` §MsgDialog family) for
|
`WarningDialog`, `ErrorDialog`, `InfoDialog`; `references/windows-dialogs.md` §MsgDialog family) for
|
||||||
@@ -852,7 +848,7 @@ Orca does not use `wxConfig`/`wxFileConfig` (so the 3.3 change of the Unix defau
|
|||||||
|
|
||||||
**Contract** (`interface/wx/secretstore.h`): on Unix it needs libsecret and a running secret service, so
|
**Contract** (`interface/wx/secretstore.h`): on Unix it needs libsecret and a running secret service, so
|
||||||
always check `IsOk(&errmsg)` (`:193-210, 257`); libsecret is no longer required at run time
|
always check `IsOk(&errmsg)` (`:193-210, 257`); libsecret is no longer required at run time
|
||||||
(`docs/changes.txt:726`), so a missing library or service shows up only as `IsOk()` false.
|
(`docs/changes.txt:533`), so a missing library or service shows up only as `IsOk()` false.
|
||||||
`GetDefault()` "may show a dialog to the user under some platforms, so it can take an arbitrarily long
|
`GetDefault()` "may show a dialog to the user under some platforms, so it can take an arbitrarily long
|
||||||
time to return" (`:243-246`). One username per service (`:260-268`).
|
time to return" (`:243-246`). One username per service (`:260-268`).
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ yields and nested event loops, progress dialogs, startup, shutdown and exception
|
|||||||
screen, and the access rules for `wxGetApp()` and `app_config`. Read it whenever code runs off the
|
screen, and the access rules for `wxGetApp()` and `app_config`. Read it whenever code runs off the
|
||||||
main thread, defers work, starts a timer, yields, shows progress, or runs during startup or shutdown.
|
main thread, defers work, starts a timer, yields, shows progress, or runs during startup or shutdown.
|
||||||
|
|
||||||
wx cites are relative to the pinned wx 3.3.4 tree (located as in `SKILL.md` §Ground truth).
|
wx cites are relative to the pinned wx 3.3.2 tree (located as in `SKILL.md` §Ground truth).
|
||||||
Orca builds wx with `wxBUILD_DEBUG_LEVEL=0` and `libslic3r_gui` with `wxDEBUG_LEVEL=0`, so `wxASSERT`
|
Orca builds wx with `wxBUILD_DEBUG_LEVEL=0` and `libslic3r_gui` with `wxDEBUG_LEVEL=0`, so `wxASSERT`
|
||||||
is compiled out and `wxCHECK*` returns silently: a timer started off the main thread never fires on macOS,
|
is compiled out and `wxCHECK*` returns silently: a timer started off the main thread never fires on macOS,
|
||||||
`Exit()` on a loop that is not the active one is ignored, `Start(0)` on macOS fails — all without
|
`Exit()` on a loop that is not the active one is ignored, `Start(0)` on macOS fails — all without
|
||||||
@@ -454,12 +454,12 @@ and aborts the whole app. Wrap the entire body; log and convert to a status the
|
|||||||
`wxMessageQueue::Post(T&&)` accepts move-only types (`interface/wx/msgqueue.h:90-97`).
|
`wxMessageQueue::Post(T&&)` accepts move-only types (`interface/wx/msgqueue.h:90-97`).
|
||||||
- `wxTHREAD_WAIT_DEFAULT` is now `wxTHREAD_WAIT_BLOCK`; `wxTHREAD_WAIT_YIELD` "is dangerous" and "is
|
- `wxTHREAD_WAIT_DEFAULT` is now `wxTHREAD_WAIT_BLOCK`; `wxTHREAD_WAIT_YIELD` "is dangerous" and "is
|
||||||
only implemented in wxMSW and simply ignored under the other platforms" (`interface/wx/thread.h:648-675`),
|
only implemented in wxMSW and simply ignored under the other platforms" (`interface/wx/thread.h:648-675`),
|
||||||
so the 3.3 default change (`docs/changes.txt:45-47`) only affects MSW code calling
|
so the 3.3 default change (`docs/changes.txt:39-41`) only affects MSW code calling
|
||||||
`Wait()`/`Delete()` from the GUI thread.
|
`Wait()`/`Delete()` from the GUI thread.
|
||||||
- `wxCRITICAL_SECTION(name)` declares a function-static critical section, which is initialised
|
- `wxCRITICAL_SECTION(name)` declares a function-static critical section, which is initialised
|
||||||
safely only if the function is first called from the main thread before other threads call it;
|
safely only if the function is first called from the main thread before other threads call it;
|
||||||
otherwise make it a global (`interface/wx/thread.h:1762-1779`). Prefer `std::mutex`.
|
otherwise make it a global (`interface/wx/thread.h:1762-1779`). Prefer `std::mutex`.
|
||||||
- `wxSecretStore` documents no thread-affinity notes in 3.3.4 (`interface/wx/secretstore.h`).
|
- `wxSecretStore` documents no thread-affinity notes in 3.3.2 (`interface/wx/secretstore.h`).
|
||||||
|
|
||||||
## The Jobs framework
|
## The Jobs framework
|
||||||
|
|
||||||
@@ -829,8 +829,8 @@ nothing) (`interface/wx/utils.h:1203-1212, 1243-1248`; see `references/strings-i
|
|||||||
|
|
||||||
**Platforms.** On MSW `wxProgressDialog` is native: a TaskDialog run by a
|
**Platforms.** On MSW `wxProgressDialog` is native: a TaskDialog run by a
|
||||||
`wxProgressDialogTaskRunner` **wxThread**, yielding `ALL & ~USER_INPUT` (TIMER and THREAD included)
|
`wxProgressDialogTaskRunner` **wxThread**, yielding `ALL & ~USER_INPUT` (TIMER and THREAD included)
|
||||||
(`src/msw/progdlg.cpp` `DispatchEvents`) **[source]**; the native `TaskDialog` follows wx dark mode
|
(`src/msw/progdlg.cpp` `DispatchEvents`) **[source]**; anything based on `TaskDialog()` has no dark
|
||||||
since 3.3.3 (`interface/wx/app.h:1442-1448`). On macOS and GTK it is `wxGenericProgressDialog`, which creates
|
mode (`interface/wx/app.h:1436-1440`). On macOS and GTK it is `wxGenericProgressDialog`, which creates
|
||||||
a temporary event loop if none is active (`src/generic/progdlgg.cpp:360-366`). On MSW (native
|
a temporary event loop if none is active (`src/generic/progdlgg.cpp:360-366`). On MSW (native
|
||||||
dialog or Orca's generic one) and macOS, `CallAfter` bodies run inside `Update()`/`Pulse()`; on GTK
|
dialog or Orca's generic one) and macOS, `CallAfter` bodies run inside `Update()`/`Pulse()`; on GTK
|
||||||
the masked yield runs no queued event, so they wait until control returns to an event loop
|
the masked yield runs no queued event, so they wait until control returns to an event loop
|
||||||
@@ -839,7 +839,7 @@ the masked yield runs no queued event, so they wait until control returns to an
|
|||||||
**OrcaSlicer.**
|
**OrcaSlicer.**
|
||||||
- `Slic3r::GUI::ProgressDialog` (`Widgets/ProgressDialog.hpp`) is a themed fork of
|
- `Slic3r::GUI::ProgressDialog` (`Widgets/ProgressDialog.hpp`) is a themed fork of
|
||||||
`wxGenericProgressDialog`: same `YieldFor(UI | USER_INPUT)` semantics, temporary event loop when
|
`wxGenericProgressDialog`: same `YieldFor(UI | USER_INPUT)` semantics, temporary event loop when
|
||||||
none is active, generic on every platform (so it is themed by Orca, not the native TaskDialog).
|
none is active, generic on every platform (so no TaskDialog dark-mode gap).
|
||||||
- `detail::run_off_thread_with_progress` (`PluginsDialog.hpp`, wrapped by
|
- `detail::run_off_thread_with_progress` (`PluginsDialog.hpp`, wrapped by
|
||||||
`PluginsDialog::run_with_dialog`/`run_with_dialog_wait`): a heap wx `wxProgressDialog` (the native
|
`PluginsDialog::run_with_dialog`/`run_with_dialog_wait`): a heap wx `wxProgressDialog` (the native
|
||||||
TaskDialog on MSW, the generic dialog on macOS and GTK) pulsed by a
|
TaskDialog on MSW, the generic dialog on macOS and GTK) pulsed by a
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# WebView, OpenGL canvas, AUI docking and media
|
# WebView, OpenGL canvas, AUI docking and media
|
||||||
|
|
||||||
How wxWebView, wxGLCanvas/wxGLContext, wxAuiManager/wxAuiToolBar and the camera view behave in the
|
How wxWebView, wxGLCanvas/wxGLContext, wxAuiManager/wxAuiToolBar and the camera view behave in the
|
||||||
wx 3.3.4 tree Orca builds, and the Orca wrappers built on them: `WebView`, `WebViewHostDialog` and
|
wx 3.3.2 tree Orca builds, and the Orca wrappers built on them: `WebView`, `WebViewHostDialog` and
|
||||||
the web dialogs/panels, `OpenGLManager`, `GLCanvas3D` and its ImGui layer, the Plater docking
|
the web dialogs/panels, `OpenGLManager`, `GLCanvas3D` and its ImGui layer, the Plater docking
|
||||||
manager, `BBLTopbar`, `wxMediaCtrl3`. Read it before touching any browser view, GL canvas, docked
|
manager, `BBLTopbar`, `wxMediaCtrl3`. Read it before touching any browser view, GL canvas, docked
|
||||||
pane, the top bar or the camera view, or when debugging a blank web page, a black or garbled 3D
|
pane, the top bar or the camera view, or when debugging a blank web page, a black or garbled 3D
|
||||||
@@ -242,7 +242,7 @@ a single message handler and the Chromium and IE backends do not support script
|
|||||||
| `Add…` return | `false` if *any* handler already exists, whatever its name (`src/msw/webview_edge.cpp:1635-1645`) | always `true` (`src/osx/webview_webkit.mm:620-629`); a duplicate name makes WebKit raise an NSException that cannot be caught and kills the app ([external]: Apple behaviour, recorded in the `WebView::CreateWebView` comment) | `false` on a duplicate or with no view, **but** `g_signal_connect` runs before registration, so a duplicate add leaves a second connection (`src/gtk/webview_webkit2.cpp:1638-1657`) |
|
| `Add…` return | `false` if *any* handler already exists, whatever its name (`src/msw/webview_edge.cpp:1635-1645`) | always `true` (`src/osx/webview_webkit.mm:620-629`); a duplicate name makes WebKit raise an NSException that cannot be caught and kills the app ([external]: Apple behaviour, recorded in the `WebView::CreateWebView` comment) | `false` on a duplicate or with no view, **but** `g_signal_connect` runs before registration, so a duplicate add leaves a second connection (`src/gtk/webview_webkit2.cpp:1638-1657`) |
|
||||||
| `Remove…` | clears the single name (`1647-1652`) | removes the native handler (`632-636`) | unregisters but **does not disconnect** the signal (`1659-1664`): Remove + Add delivers every later message **twice** |
|
| `Remove…` | clears the single name (`1647-1652`) | removes the native handler (`632-636`) | unregisters but **does not disconnect** the signal (`1659-1664`): Remove + Add delivers every later message **twice** |
|
||||||
| `window.<name>` alias | user script `window.<name> = window.chrome.webview` + `ExecuteScript` (`1030-1046`) | `AddUserScript` + **synchronous** `RunScript` (`626-628`) | `AddUserScript` + **synchronous** `RunScript` (`1650-1654`) |
|
| `window.<name>` alias | user script `window.<name> = window.chrome.webview` + `ExecuteScript` (`1030-1046`) | `AddUserScript` + **synchronous** `RunScript` (`626-628`) | `AddUserScript` + **synchronous** `RunScript` (`1650-1654`) |
|
||||||
| Delivery | queued with `AddPendingEvent` (`785-813`); [documented] "Queue Edge wxWebView events" (`docs/changes.txt:718`) | `ProcessWindowEvent` **inside** the `WKScriptMessageHandler` delegate (`1324-1361`) | `HandleWindowEvent` **inside** the GTK signal (`397-409`) |
|
| Delivery | queued with `AddPendingEvent` (`785-813`); [documented] "Queue Edge wxWebView events" (`docs/changes.txt:525`) | `ProcessWindowEvent` **inside** the `WKScriptMessageHandler` delegate (`1324-1361`) | `HandleWindowEvent` **inside** the GTK signal (`397-409`) |
|
||||||
| Event fields | handler name and event object set | name set, **no event object** | **empty `GetMessageHandler()`, no event object** |
|
| Event fields | handler name and event object set | name set, **no event object** | **empty `GetMessageHandler()`, no event object** |
|
||||||
| Body | `get_WebMessageAsJson`, JSON-decoded when it is a string (`798-809`) | NSString as is; dict/array → JSON; NSNumber → `stringValue` (booleans arrive as `1`/`0`); NSNull → `"null"` | object → JSON string, otherwise `ToString` (`64-94`) |
|
| Body | `get_WebMessageAsJson`, JSON-decoded when it is a string (`798-809`) | NSString as is; dict/array → JSON; NSNumber → `stringValue` (booleans arrive as `1`/`0`); NSNull → `"null"` | object → JSON string, otherwise `ToString` (`64-94`) |
|
||||||
|
|
||||||
@@ -710,8 +710,8 @@ the environment variable `wx_opengl_egl=0` does the same; it exists only when `w
|
|||||||
returns true only when EGL is in use (false when `wxHAS_EGL` is undefined); `GetGLXVersion()` returns 0
|
returns true only when EGL is in use (false when `wxHAS_EGL` is undefined); `GetGLXVersion()` returns 0
|
||||||
when GLX is not in use; both exist only when `wxHAS_GLX` is defined (`interface/wx/glcanvas.h:999-1030`).
|
when GLX is not in use; both exist only when `wxHAS_GLX` is defined (`interface/wx/glcanvas.h:999-1030`).
|
||||||
`wxGLCanvas::CreateSurface()` was removed "as exposing it doesn't make sense when wxGLCanvas may use
|
`wxGLCanvas::CreateSurface()` was removed "as exposing it doesn't make sense when wxGLCanvas may use
|
||||||
either EGL or GLX" (`docs/changes.txt:282-284`); "Allow using GLX and EGL in same program (#26023)" is
|
either EGL or GLX" (`docs/changes.txt:250-252`); "Allow using GLX and EGL in same program (#26023)" is
|
||||||
an upstream 3.3.2 wxGTK change (`docs/changes.txt:485`).
|
an upstream 3.3.2 wxGTK change (`docs/changes.txt:290-292`).
|
||||||
|
|
||||||
**Source** [source]:
|
**Source** [source]:
|
||||||
- When both backends are built, **EGL is the default even on X11** unless `PreferGLX()` or the
|
- When both backends are built, **EGL is the default even on X11** unless `PreferGLX()` or the
|
||||||
@@ -727,7 +727,7 @@ an upstream 3.3.2 wxGTK change (`docs/changes.txt:485`).
|
|||||||
(`src/unix/glegl.cpp:801-860`).
|
(`src/unix/glegl.cpp:801-860`).
|
||||||
- The EGL-based `wxGLCanvas` for Wayland dates from 3.1.5 (`docs/changes_32.txt:497`), so it predates
|
- The EGL-based `wxGLCanvas` for Wayland dates from 3.1.5 (`docs/changes_32.txt:497`), so it predates
|
||||||
Orca's upgrade; its
|
Orca's upgrade; its
|
||||||
high-DPI scale under EGL/Wayland was fixed in 3.3.0 (`docs/changes.txt:731`).
|
high-DPI scale under EGL/Wayland was fixed in 3.3.0 (`docs/changes.txt:538`).
|
||||||
|
|
||||||
**OrcaSlicer.**
|
**OrcaSlicer.**
|
||||||
- `deps/wxWidgets/wxWidgets.cmake` passes `-DwxUSE_GLCANVAS_EGL=ON` (also in the Flatpak manifest).
|
- `deps/wxWidgets/wxWidgets.cmake` passes `-DwxUSE_GLCANVAS_EGL=ON` (also in the Flatpak manifest).
|
||||||
@@ -956,13 +956,13 @@ widgets beside the canvas (a sibling, not a child over it), or in a popup.
|
|||||||
`src/aui/framemanager.cpp:910-920`; `OnPaneButton`); `DestroyOnClose` panes are detached and `Destroy()`ed
|
`src/aui/framemanager.cpp:910-920`; `OnPaneButton`); `DestroyOnClose` panes are detached and `Destroy()`ed
|
||||||
(`ClosePane`, `1431-1467`). With several handlers bound, each must `Skip()`.
|
(`ClosePane`, `1431-1467`). With several handlers bound, each must `Skip()`.
|
||||||
- **3.3 changes.** `wxAUI_MGR_HINT_FADE` left the default flags (`interface/wx/aui/framemanager.h:43-50`;
|
- **3.3 changes.** `wxAUI_MGR_HINT_FADE` left the default flags (`interface/wx/aui/framemanager.h:43-50`;
|
||||||
`docs/changes.txt:138`); `wxAUI_MGR_LIVE_RESIZE` joined them (`interface/wx/aui/framemanager.h:59-62`); `AlwaysUsesLiveResize()` "always
|
`docs/changes.txt:132`); `wxAUI_MGR_LIVE_RESIZE` joined them (`interface/wx/aui/framemanager.h:59-62`); `AlwaysUsesLiveResize()` "always
|
||||||
returns false" as of 3.3.0 (`interface/wx/aui/framemanager.h:345`; `src/aui/framemanager.cpp:711-714`), non-live resize being
|
returns false" as of 3.3.0 (`interface/wx/aui/framemanager.h:345`; `src/aui/framemanager.cpp:711-714`), non-live resize being
|
||||||
restored (`docs/changes.txt:683`) — the older "live resize is always used on wxOSX and GTK3/Wayland"
|
restored (`docs/changes.txt:490`) — the older "live resize is always used on wxOSX and GTK3/Wayland"
|
||||||
statement (`interface/wx/aui/framemanager.h:336-340`) is obsolete. Docking hints for floating frames use
|
statement (`interface/wx/aui/framemanager.h:336-340`) is obsolete. Docking hints for floating frames use
|
||||||
`::wxGetMousePosition()` (`src/aui/framemanager.cpp:4139-4148`, `4242-4251`), which Wayland cannot supply.
|
`::wxGetMousePosition()` (`src/aui/framemanager.cpp:4139-4148`, `4242-4251`), which Wayland cannot supply.
|
||||||
- `wxAuiNotebook` (not used by Orca): page indices are logical; use `GetPagePosition()` for on-screen
|
- `wxAuiNotebook` (not used by Orca): page indices are logical; use `GetPagePosition()` for on-screen
|
||||||
order (`docs/changes.txt:128-132`); the default tab art changed (`41-43`).
|
order (`docs/changes.txt:121-126`); the default tab art changed (`35-37`).
|
||||||
|
|
||||||
**OrcaSlicer.** Orca's docks use `AuiMgr` (`AuiMgr.hpp`), a `wxAuiManager` whose `CreateFloatingFrame`
|
**OrcaSlicer.** Orca's docks use `AuiMgr` (`AuiMgr.hpp`), a `wxAuiManager` whose `CreateFloatingFrame`
|
||||||
returns a `wxAuiFloatingFrame` that applies `UpdateFrameDarkUI`. `init(window)` calls
|
returns a `wxAuiFloatingFrame` that applies `UpdateFrameDarkUI`. `init(window)` calls
|
||||||
@@ -1034,10 +1034,8 @@ Plater (Prepare and Preview); `DesignPanel::m_aui` manages the Design tab's body
|
|||||||
```
|
```
|
||||||
- **Rule:** Disable floating on Wayland (clear `wxAUI_MGR_ALLOW_FLOATING`, `Floatable(false)`, strip
|
- **Rule:** Disable floating on Wayland (clear `wxAUI_MGR_ALLOW_FLOATING`, `Floatable(false)`, strip
|
||||||
floating state from saved layouts).
|
floating state from saved layouts).
|
||||||
**Why:** AUI's docking-hint logic needs global pointer positions and top-level window moves
|
**Why:** AUI's floating and docking-hint logic needs global pointer positions and top-level window
|
||||||
(`wxGetMousePosition`, `wxEVT_MOVE`), which Wayland does not provide. 3.3.4 added system drag sessions
|
moves (`wxGetMousePosition`, `wxEVT_MOVE`), which Wayland does not provide.
|
||||||
so wx can move a pane's floating frame there anyway (`src/aui/framemanager.cpp` `StartDragSession`),
|
|
||||||
but the drop/docking hints still cannot work, so Orca keeps floating disabled.
|
|
||||||
|
|
||||||
## wxAuiToolBar and BBLTopbar
|
## wxAuiToolBar and BBLTopbar
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ port; what Orca's `DPIDialog`/`DPIFrame` add; the Orca dialog recipe; and the `M
|
|||||||
Read it before writing or reviewing any dialog, frame, close handler, `Destroy()`/`delete`, or code
|
Read it before writing or reviewing any dialog, frame, close handler, `Destroy()`/`delete`, or code
|
||||||
that keeps a pointer to a window across an event, a `CallAfter` or a modal loop.
|
that keeps a pointer to a window across an event, a `CallAfter` or a modal loop.
|
||||||
|
|
||||||
wx cites are relative to the pinned wx 3.3.4 tree (located as in `SKILL.md` §Ground truth). wx is
|
wx cites are relative to the pinned wx 3.3.2 tree (located as in `SKILL.md` §Ground truth). wx is
|
||||||
built with `wxBUILD_DEBUG_LEVEL=0` and `libslic3r_gui` with `wxDEBUG_LEVEL=0`: every wx assert
|
built with `wxBUILD_DEBUG_LEVEL=0` and `libslic3r_gui` with `wxDEBUG_LEVEL=0`: every wx assert
|
||||||
quoted below is compiled out, so misuse fails silently (dropped call, stuck loop, freed memory), never with an assert dialog. "GTK" below
|
quoted below is compiled out, so misuse fails silently (dropped call, stuck loop, freed memory), never with an assert dialog. "GTK" below
|
||||||
means wxGTK as Orca builds it on Linux: GTK3 by default (X11 or Wayland); GTK2 is only an opt-out.
|
means wxGTK as Orca builds it on Linux: GTK3 by default (X11 or Wayland); GTK2 is only an opt-out.
|
||||||
@@ -424,7 +424,7 @@ mapped (`src/gtk/toplevel.cpp:1141-1243`).
|
|||||||
|
|
||||||
**Raise.** "only requests the window manager to raise this window… If the window is currently hidden,
|
**Raise.** "only requests the window manager to raise this window… If the window is currently hidden,
|
||||||
this function does *not* show it", top-level windows only (`interface/wx/window.h:3013-3033`); true on all ports
|
this function does *not* show it", top-level windows only (`interface/wx/window.h:3013-3033`); true on all ports
|
||||||
since 3.3 (`docs/changes.txt:145-147`). **[source]** MSW = `::SetForegroundWindow`, subject to the
|
since 3.3 (`docs/changes.txt:144-146`). **[source]** MSW = `::SetForegroundWindow`, subject to the
|
||||||
foreground lock — Windows may only flash the taskbar button (`src/msw/toplevel.cpp:650-655`); GTK =
|
foreground lock — Windows may only flash the taskbar button (`src/msw/toplevel.cpp:650-655`); GTK =
|
||||||
`gtk_window_present` only if shown (`src/gtk/toplevel.cpp:1301-1310`; during a deferred X11 first show it
|
`gtk_window_present` only if shown (`src/gtk/toplevel.cpp:1301-1310`; during a deferred X11 first show it
|
||||||
already counts as shown); macOS = `makeKeyAndOrderFront` only if shown (`src/osx/nonownedwnd_osx.cpp:289-295`, `src/osx/cocoa/nonownedwnd.mm:897-899`),
|
already counts as shown); macOS = `makeKeyAndOrderFront` only if shown (`src/osx/nonownedwnd_osx.cpp:289-295`, `src/osx/cocoa/nonownedwnd.mm:897-899`),
|
||||||
@@ -910,9 +910,8 @@ buttons are chosen — in numeric id order, so `{"Save", "OK"}` makes Save prima
|
|||||||
**Rule.** Never `wxMessageBox`/`wxMessageDialog`/`wxRichMessageDialog` once the GUI exists; use the themed
|
**Rule.** Never `wxMessageBox`/`wxMessageDialog`/`wxRichMessageDialog` once the GUI exists; use the themed
|
||||||
replacements in `src/slic3r/GUI/MsgDialog.hpp` (`Slic3r::GUI`), rooted in `MsgDialog : DPIDialog` (logo on the
|
replacements in `src/slic3r/GUI/MsgDialog.hpp` (`Slic3r::GUI`), rooted in `MsgDialog : DPIDialog` (logo on the
|
||||||
left, content on the right, `Button` row underneath, dark-mode and DPI aware). Why: on MSW the TaskDialog-based
|
left, content on the right, `Button` row underneath, dark-mode and DPI aware). Why: on MSW the TaskDialog-based
|
||||||
native boxes (`wxMessageBox`, `wxMessageDialog`, `wxRichMessageDialog`, `wxProgressDialog`) now follow dark mode
|
native boxes (`wxMessageBox`, `wxMessageDialog`, `wxRichMessageDialog`, `wxProgressDialog`) ignore dark mode
|
||||||
since 3.3.3, so only the date/time/calendar controls, `wxPrintDialog` on Windows 10 and MDI applications stay
|
(`interface/wx/app.h:1436-1446`), and native boxes cannot match Orca's look. `wxMessageBox` remains only for
|
||||||
light (`interface/wx/app.h:1442-1448`); native boxes cannot match Orca's look. `wxMessageBox` remains only for
|
|
||||||
failures before the GUI exists (e.g. `GUI_App::load_language`). Native message-box style limits:
|
failures before the GUI exists (e.g. `GUI_App::load_language`). Native message-box style limits:
|
||||||
`references/strings-i18n-files.md`. Return-value trap when reading old code: `wxMessageBox()` returns
|
`references/strings-i18n-files.md`. Return-value trap when reading old code: `wxMessageBox()` returns
|
||||||
`wxYES/wxNO/wxCANCEL/wxOK/wxHELP`, while `ShowModal()` returns `wxID_YES/…` (`interface/wx/msgdlg.h:269-276` vs `309-311`).
|
`wxYES/wxNO/wxCANCEL/wxOK/wxHELP`, while `ShowModal()` returns `wxID_YES/…` (`interface/wx/msgdlg.h:269-276` vs `309-311`).
|
||||||
|
|||||||
@@ -1,19 +1,17 @@
|
|||||||
# wx 3.1.5 → 3.3.4: changes Orca code can trip on
|
# wx 3.1.5 → 3.3.2: changes Orca code can trip on
|
||||||
|
|
||||||
OrcaSlicer moved from wxWidgets **3.1.5** to **3.3.2** (8248b06337, #12941) and the pin is now upstream
|
OrcaSlicer moved from wxWidgets **3.1.5** to **3.3.2** (8248b06337, #12941). This file digests the
|
||||||
**3.3.4** (`deps/wxWidgets/wxWidgets.cmake`, tag `v3.3.4`). This file digests the
|
|
||||||
changes between those versions that matter to GUI code — the 3.1.6–3.2.0 incompatible changes, the
|
changes between those versions that matter to GUI code — the 3.1.6–3.2.0 incompatible changes, the
|
||||||
3.3 incompatible changes, and the notable 3.3.0/3.3.1/3.3.2/3.3.3/3.3.4 changes — each with what it
|
3.3 incompatible changes, and the notable 3.3.0/3.3.1/3.3.2 changes — each with what it means for
|
||||||
means for Orca, plus the migration already done in Orca as rules for new code. Read it when code
|
Orca, plus the migration already done in Orca as rules for new code. Read it when code written
|
||||||
written from older wx knowledge behaves oddly, when a wx doc says "since 3.3", or when reviewing code
|
from older wx knowledge behaves oddly, when a wx doc says "since 3.3", or when reviewing code near
|
||||||
near the workarounds in §10. Where this file and prior wx knowledge disagree, this file wins.
|
the workarounds in §8. Where this file and prior wx knowledge disagree, this file wins.
|
||||||
|
|
||||||
Contents: [Rules](#rules) · [1 Reading the change logs](#1-reading-the-change-logs) ·
|
Contents: [Rules](#rules) · [1 Reading the change logs](#1-reading-the-change-logs) ·
|
||||||
[2 3.1.6 → 3.2.0](#2-changes-from-316-to-320) · [3 3.3 behaviour changes](#3-33-behaviour-changes-that-compile) ·
|
[2 3.1.6 → 3.2.0](#2-changes-from-316-to-320) · [3 3.3 behaviour changes](#3-33-behaviour-changes-that-compile) ·
|
||||||
[4 3.3 build changes](#4-33-changes-that-break-the-build) · [5 3.3.0](#5-330-notable-changes) ·
|
[4 3.3 build changes](#4-33-changes-that-break-the-build) · [5 3.3.0](#5-330-notable-changes) ·
|
||||||
[6 3.3.1](#6-331-notable-fixes) · [7 3.3.2](#7-332-notable-changes) ·
|
[6 3.3.1](#6-331-notable-fixes) · [7 3.3.2](#7-332-notable-changes) ·
|
||||||
[8 3.3.3](#8-333-notable-changes) · [9 3.3.4](#9-334-notable-changes) ·
|
[8 Migration done in Orca](#8-migration-already-done-in-orca)
|
||||||
[10 Migration done in Orca](#10-migration-already-done-in-orca)
|
|
||||||
|
|
||||||
All `docs/`, `interface/`, `include/`, `src/`, `build/` cites are relative to the pinned wx tree
|
All `docs/`, `interface/`, `include/`, `src/`, `build/` cites are relative to the pinned wx tree
|
||||||
(located as in `SKILL.md` §Ground truth), except paths
|
(located as in `SKILL.md` §Ground truth), except paths
|
||||||
@@ -23,8 +21,8 @@ explicitly called Orca's (`deps/…`, Orca's `src/CMakeLists.txt`) and bare Orca
|
|||||||
|
|
||||||
1. Read every "now asserts" in the change logs as "now silently returns or does nothing" in Orca:
|
1. Read every "now asserts" in the change logs as "now silently returns or does nothing" in Orca:
|
||||||
wx asserts are compiled out. Validate arguments yourself. → [§1](#1-reading-the-change-logs)
|
wx asserts are compiled out. Validate arguments yourself. → [§1](#1-reading-the-change-logs)
|
||||||
2. Target 3.3.4 only. Do not add `wxCHECK_VERSION` / `wxVERSION_NUMBER` /
|
2. Target 3.3.2 only. Do not add `wxCHECK_VERSION` / `wxVERSION_NUMBER` /
|
||||||
`wxVERSION_EQUAL_OR_GREATER_THAN` branches for older wx. → [§10](#10-migration-already-done-in-orca)
|
`wxVERSION_EQUAL_OR_GREATER_THAN` branches for older wx. → [§8](#8-migration-already-done-in-orca)
|
||||||
3. Mark every override of a wx virtual `override`. 3.2/3.3 changed parameter types (`wxBitmapBundle`,
|
3. Mark every override of a wx virtual `override`. 3.2/3.3 changed parameter types (`wxBitmapBundle`,
|
||||||
`wxReadOnlyDC`, `wxWindowBase*`, `wxVersionContext`); a stale signature must fail to compile, not
|
`wxReadOnlyDC`, `wxWindowBase*`, `wxVersionContext`); a stale signature must fail to compile, not
|
||||||
become a silent overload. → [§4](#4-33-changes-that-break-the-build)
|
become a silent overload. → [§4](#4-33-changes-that-break-the-build)
|
||||||
@@ -41,36 +39,33 @@ explicitly called Orca's (`deps/…`, Orca's `src/CMakeLists.txt`) and bare Orca
|
|||||||
`WX_GL_SAMPLES`); `wxGLAttributes::Defaults()` no longer includes it. → [§3](#3-33-behaviour-changes-that-compile)
|
`WX_GL_SAMPLES`); `wxGLAttributes::Defaults()` no longer includes it. → [§3](#3-33-behaviour-changes-that-compile)
|
||||||
9. Size a `wxImageList` in physical pixels (the bitmaps' `GetSize()`), or use the `wxBitmapBundle`
|
9. Size a `wxImageList` in physical pixels (the bitmaps' `GetSize()`), or use the `wxBitmapBundle`
|
||||||
image APIs. → [§3](#3-33-behaviour-changes-that-compile)
|
image APIs. → [§3](#3-33-behaviour-changes-that-compile)
|
||||||
10. `wxGetTranslation()` returns `const wxString&` (3.3.2 made it by-value; 3.3.3 reverted that); a
|
10. Return translated strings as `wxString` by value. → [§3](#3-33-behaviour-changes-that-compile)
|
||||||
wrapper that converts a translation returns by value. → [§3](#3-33-behaviour-changes-that-compile)
|
|
||||||
11. Escape `&` in user text used as a control label or book page title. → [§3](#3-33-behaviour-changes-that-compile)
|
11. Escape `&` in user text used as a control label or book page title. → [§3](#3-33-behaviour-changes-that-compile)
|
||||||
12. `wxDynamicCast` only on a pointer whose static type derives from `wxObject`; use `dynamic_cast`
|
12. `wxDynamicCast` only on a pointer whose static type derives from `wxObject`; use `dynamic_cast`
|
||||||
for mixin interfaces (`wxComboPopup`, `wxItemContainer`, `wxTextEntry`). → [§4](#4-33-changes-that-break-the-build)
|
for mixin interfaces (`wxComboPopup`, `wxItemContainer`, `wxTextEntry`). → [§4](#4-33-changes-that-break-the-build)
|
||||||
13. Build a `wxArrayString` with `Add()` or an initializer list, walk wx lists with
|
13. Build a `wxArrayString` with `Add()` or an initializer list, walk wx lists with
|
||||||
`compatibility_iterator` or range-for, and make a `wxString` the first operand of a mixed
|
`compatibility_iterator` or range-for, and make a `wxString` the first operand of a mixed
|
||||||
`+` chain. → [§4](#4-33-changes-that-break-the-build)
|
`+` chain. → [§4](#4-33-changes-that-break-the-build)
|
||||||
14. MSW windows are not double-buffered by default in 3.3.4; a custom-painted control buffers itself.
|
14. MSW windows are not double-buffered by default in 3.3.2; a custom-painted control buffers itself.
|
||||||
→ [§5](#5-330-notable-changes)
|
→ [§5](#5-330-notable-changes)
|
||||||
15. `wxEVT_DPI_CHANGED` now fires on GTK3 too; such handlers must be correct on GTK, and every handler
|
15. `wxEVT_DPI_CHANGED` now fires on GTK3 too; such handlers must be correct on GTK, and every handler
|
||||||
you bind calls `Skip()` (`DPIAware`'s own is the one exception). → [§5](#5-330-notable-changes)
|
you bind calls `Skip()` (`DPIAware`'s own is the one exception). → [§5](#5-330-notable-changes)
|
||||||
16. wx MSW dark mode became runtime-switchable in 3.3.3/3.3.4 (`SetAppearance`/`MSWEnableDarkMode`
|
16. wx MSW dark mode cannot be switched at runtime; do not replace Orca's NppDarkMode with it without
|
||||||
restyle existing windows); Orca still keeps NppDarkMode for its own chrome.
|
keeping live theme switching. → [§5](#5-330-notable-changes)
|
||||||
→ [§5](#5-330-notable-changes), [§9](#9-334-notable-changes)
|
|
||||||
17. After `wxStaticText::SetLabel`, re-wrap with `Wrap(-1); Wrap(w);` (or use `Label`); `wxST_WRAP`
|
17. After `wxStaticText::SetLabel`, re-wrap with `Wrap(-1); Wrap(w);` (or use `Label`); `wxST_WRAP`
|
||||||
is opt-in and works only inside a sizer. → [§7](#7-332-notable-changes)
|
is opt-in and works only inside a sizer. → [§7](#7-332-notable-changes)
|
||||||
18. On Linux/X11 call `wxGLCanvas::PreferGLX()` before any GL use; on Unix set a swap interval explicitly
|
18. On Linux/X11 call `wxGLCanvas::PreferGLX()` before any GL use; on Unix set a swap interval explicitly
|
||||||
if frame pacing matters (wx forces 0). → [§7](#7-332-notable-changes)
|
if frame pacing matters (wx forces 0). → [§7](#7-332-notable-changes)
|
||||||
19. Compare `wxGrid::GetSelectedBlocks()` `begin()` with `end()` before dereferencing.
|
19. Compare `wxGrid::GetSelectedBlocks()` `begin()` with `end()` before dereferencing.
|
||||||
→ [§10](#10-migration-already-done-in-orca)
|
→ [§8](#8-migration-already-done-in-orca)
|
||||||
20. Keep the post-upgrade workarounds (MainFrame `WS_CAPTION` masking, macOS deep-link handler,
|
20. Keep the post-upgrade workarounds (MainFrame `WS_CAPTION` masking, macOS deep-link handler,
|
||||||
`MSWEnableDarkMode` ordering, `SidePopup` anchoring, MSW `GLCanvas3D::on_paint` render) when
|
`MSWEnableDarkMode` ordering, `SidePopup` anchoring, MSW `GLCanvas3D::on_paint` render) when
|
||||||
touching that code. → [§10](#10-migration-already-done-in-orca)
|
touching that code. → [§8](#8-migration-already-done-in-orca)
|
||||||
|
|
||||||
## 1 Reading the change logs
|
## 1 Reading the change logs
|
||||||
|
|
||||||
**Sources.** `docs/changes.txt` lists changes since 3.2: incompatible behaviour changes :11-178,
|
**Sources.** `docs/changes.txt` lists changes since 3.2: incompatible behaviour changes :11-146,
|
||||||
build-breaking changes :181-292, 3.3.4 :295-385, 3.3.3 :388-445, 3.3.2 :448-523, 3.3.1 :526-570,
|
build-breaking changes :149-252, 3.3.2 :255-330, 3.3.1 :333-377, 3.3.0 :380-622.
|
||||||
3.3.0 :573-815.
|
|
||||||
`docs/changes_32.txt` covers 3.x → 3.2.0: the cumulative "INCOMPATIBLE CHANGES SINCE 3.0.x" list
|
`docs/changes_32.txt` covers 3.x → 3.2.0: the cumulative "INCOMPATIBLE CHANGES SINCE 3.0.x" list
|
||||||
:9-233, 3.2.0 :235-276, 3.1.7 :279-340, 3.1.6 :343-444. wxQt, wxiOS, wxUniv, wxMotif and wxGTK1
|
:9-233, 3.2.0 :235-276, 3.1.7 :279-340, 3.1.6 :343-444. wxQt, wxiOS, wxUniv, wxMotif and wxGTK1
|
||||||
items are left out here.
|
items are left out here.
|
||||||
@@ -78,14 +73,11 @@ items are left out here.
|
|||||||
**Coverage gaps.**
|
**Coverage gaps.**
|
||||||
- The "since 3.0.x" list in `changes_32.txt` is cumulative over all of 3.1.x. Most of it was already
|
- The "since 3.0.x" list in `changes_32.txt` is cumulative over all of 3.1.x. Most of it was already
|
||||||
in force in 3.1.5; §2.1 lists only what was added after 3.1.5, §2.3 the older items worth knowing.
|
in force in 3.1.5; §2.1 lists only what was added after 3.1.5, §2.3 the older items worth knowing.
|
||||||
- `changes_32.txt` in this tree stops at 3.2.0. The 3.2.1–3.2.12 maintenance fixes are not listed
|
- `changes_32.txt` in this tree stops at 3.2.0. The 3.2.1–3.2.10 maintenance fixes are not listed
|
||||||
anywhere in the tree.
|
anywhere in the tree.
|
||||||
- 3.3.0's list is relative to 3.2.8 (`changes.txt:576`). 3.3.2's list is relative to 3.2.10, and the
|
- 3.3.0's list is relative to 3.2.8 (`changes.txt:383`). 3.3.2's list is relative to 3.2.10, and the
|
||||||
full set of changes since 3.3.1 *also includes* the 3.2.9 and 3.2.10 fixes, which are **not**
|
full set of changes since 3.3.1 *also includes* the 3.2.9 and 3.2.10 fixes, which are **not**
|
||||||
listed in this file (`changes.txt:451-452`). 3.3.3's list is relative to 3.2.11, and its changes
|
listed in this file (`changes.txt:258-259`).
|
||||||
since 3.3.2 *also include* the 3.2.10–3.2.11 fixes (`changes.txt:391-392`); 3.3.4's list is
|
|
||||||
relative to 3.2.11 too, and its changes since 3.3.3 *also include* the 3.2.11–3.2.12 fixes
|
|
||||||
(`changes.txt:298-299`).
|
|
||||||
|
|
||||||
**"Asserts" mean silence in Orca.** wx is built with `-DwxBUILD_DEBUG_LEVEL=0`
|
**"Asserts" mean silence in Orca.** wx is built with `-DwxBUILD_DEBUG_LEVEL=0`
|
||||||
(`deps/wxWidgets/wxWidgets.cmake` → `build/cmake/init.cmake:245-246`), and `libslic3r_gui` gets
|
(`deps/wxWidgets/wxWidgets.cmake` → `build/cmake/init.cmake:245-246`), and `libslic3r_gui` gets
|
||||||
@@ -125,7 +117,7 @@ the 3.1.7-specific section.
|
|||||||
| `wxSpinCtrl::SetValue(wxString)` sends no events on MSW (as documented) | :129-130 | do not rely on setter events (`controls-dataview.md`) |
|
| `wxSpinCtrl::SetValue(wxString)` sends no events on MSW (as documented) | :129-130 | do not rely on setter events (`controls-dataview.md`) |
|
||||||
| `wxButton::GetBitmap{Current,Disabled,Focus,Pressed}()` return a valid bitmap on MSW only if set | :132-134 | check `IsOk()` |
|
| `wxButton::GetBitmap{Current,Disabled,Focus,Pressed}()` return a valid bitmap on MSW only if set | :132-134 | check `IsOk()` |
|
||||||
| `wxFileName::GetVolume()` returns `\\share` for UNC paths and `\\?\Volume{GUID}` for GUID paths | :136-140 | path code comparing volumes |
|
| `wxFileName::GetVolume()` returns `\\share` for UNC paths and `\\?\Volume{GUID}` for GUID paths | :136-140 | path code comparing volumes |
|
||||||
| `wxBitmapComboBoxBase::SetItemBitmap()` takes `wxBitmapBundle` | :152-153 | the bundle change also retyped `OnAddBitmap` (5f365b5c6b, §10) |
|
| `wxBitmapComboBoxBase::SetItemBitmap()` takes `wxBitmapBundle` | :152-153 | the bundle change also retyped `OnAddBitmap` (5f365b5c6b, §8) |
|
||||||
| MSW also links `oleacc` (3.1.5 already needed `shlwapi`, `uxtheme`, `version`) | :158-163 | automatic with MSVC |
|
| MSW also links `oleacc` (3.1.5 already needed `shlwapi`, `uxtheme`, `version`) | :158-163 | automatic with MSVC |
|
||||||
| Xcode projects drop i386, add arm64 | :205-207 | none (CMake build) |
|
| Xcode projects drop i386, add arm64 | :205-207 | none (CMake build) |
|
||||||
| `wxImage` ctor from XPM data is `explicit` | :225-226 | write `wxImage(xpm)` |
|
| `wxImage` ctor from XPM data is `explicit` | :225-226 | write `wxImage(xpm)` |
|
||||||
@@ -144,7 +136,7 @@ the 3.1.7-specific section.
|
|||||||
| MSW: TLW resizing on DPI change improved and overridable — a handler that sizes the TLW itself does not `Skip()` (3.2.0) | `changes_32.txt:269`; `interface/wx/event.h` (`wxDPIChangedEvent`) | Orca's `DPIAware` handler does not `Skip()` (`dpi-bitmaps-fonts.md`) |
|
| MSW: TLW resizing on DPI change improved and overridable — a handler that sizes the TLW itself does not `Skip()` (3.2.0) | `changes_32.txt:269`; `interface/wx/event.h` (`wxDPIChangedEvent`) | Orca's `DPIAware` handler does not `Skip()` (`dpi-bitmaps-fonts.md`) |
|
||||||
| `wxUILocale` (3.1.6); `wxLocale::IsAvailable` is now implemented through it | `changes_32.txt:348`; `src/common/intl.cpp:740-781` | see `wxUILocale::IsSupported` in §3 |
|
| `wxUILocale` (3.1.6); `wxLocale::IsAvailable` is now implemented through it | `changes_32.txt:348`; `src/common/intl.cpp:740-781` | see `wxUILocale::IsSupported` in §3 |
|
||||||
| `wxWebView::RunScriptAsync()` (3.1.6) | `changes_32.txt:382` | `webview-gl-aui-media.md` |
|
| `wxWebView::RunScriptAsync()` (3.1.6) | `changes_32.txt:382` | `webview-gl-aui-media.md` |
|
||||||
| wxOSX: "Allow user input in `wxPopupTransientWindow`" (3.1.7) — the popup's child holds mouse capture while the cursor is outside it and releases it inside, toggled from `OnIdle` [source] | `changes_32.txt:334`; `src/common/popupcmn.cpp:438-471` | how wxOSX transient popups track the mouse; the macOS gap-dismissal worked around in `SidePopup::Popup` is not traced to a specific wx change (§10; `popups-menus.md`) |
|
| wxOSX: "Allow user input in `wxPopupTransientWindow`" (3.1.7) — the popup's child holds mouse capture while the cursor is outside it and releases it inside, toggled from `OnIdle` [source] | `changes_32.txt:334`; `src/common/popupcmn.cpp:438-471` | how wxOSX transient popups track the mouse; the macOS gap-dismissal worked around in `SidePopup::Popup` is not traced to a specific wx change (§8; `popups-menus.md`) |
|
||||||
| wxGTK: Wayland fixes (3.1.6), no GDK errors from `PopupMenu()` on Wayland (3.1.7), `wxCURSOR_SIZING` on Wayland (3.2.0) | `changes_32.txt:397, 317, 261` | `platforms.md` |
|
| wxGTK: Wayland fixes (3.1.6), no GDK errors from `PopupMenu()` on Wayland (3.1.7), `wxCURSOR_SIZING` on Wayland (3.2.0) | `changes_32.txt:397, 317, 261` | `platforms.md` |
|
||||||
| MSW: all native modal dialogs are app-modal (3.1.6) | `changes_32.txt:409` | `windows-dialogs.md` |
|
| MSW: all native modal dialogs are app-modal (3.1.6) | `changes_32.txt:409` | `windows-dialogs.md` |
|
||||||
| Also new: `wxKeyEvent::IsAutoRepeat()`, `wxSpinCtrl::GetTextValue()/SetIncrement()`, `wxTopLevelWindow::SetContentProtection()`, `wxEVT_SPLITTER_SASH_POS_RESIZE`, OSX full-screen view options, OSX `wxEVT_CHAR` from `wxDataViewCtrl` | `changes_32.txt:364-436` | available API |
|
| Also new: `wxKeyEvent::IsAutoRepeat()`, `wxSpinCtrl::GetTextValue()/SetIncrement()`, `wxTopLevelWindow::SetContentProtection()`, `wxEVT_SPLITTER_SASH_POS_RESIZE`, OSX full-screen view options, OSX `wxEVT_CHAR` from `wxDataViewCtrl` | `changes_32.txt:364-436` | available API |
|
||||||
@@ -175,7 +167,7 @@ These were already in force in 3.1.5, so the upgrade did not change them, but co
|
|||||||
|
|
||||||
## 3 3.3 behaviour changes that compile
|
## 3 3.3 behaviour changes that compile
|
||||||
|
|
||||||
`changes.txt` "Changes in behaviour not resulting in compilation errors" (:11-178). Each row: the
|
`changes.txt` "Changes in behaviour not resulting in compilation errors" (:11-146). Each row: the
|
||||||
change, its line, and what it means for Orca.
|
change, its line, and what it means for Orca.
|
||||||
|
|
||||||
| Change | Line | Orca relevance |
|
| Change | Line | Orca relevance |
|
||||||
@@ -185,30 +177,31 @@ change, its line, and what it means for Orca.
|
|||||||
| `wxGLCanvas` no longer multisamples by default | :21-23 | pitfall below |
|
| `wxGLCanvas` no longer multisamples by default | :21-23 | pitfall below |
|
||||||
| `wxFileConfig` on Unix defaults to XDG `~/.config/appname.conf` (old file still used; `wxCONFIG_USE_XDG`/`wxCONFIG_USE_HOME`, `MigrateLocalFile()`) | :25-29 | none: Orca uses `AppConfig`, no `wxConfig` (`strings-i18n-files.md`) |
|
| `wxFileConfig` on Unix defaults to XDG `~/.config/appname.conf` (old file still used; `wxCONFIG_USE_XDG`/`wxCONFIG_USE_HOME`, `MigrateLocalFile()`) | :25-29 | none: Orca uses `AppConfig`, no `wxConfig` (`strings-i18n-files.md`) |
|
||||||
| `wxColourDatabase` uses CSS values; `UseScheme()` restores the old ones (`interface/wx/gdicmn.h:845, 973-996`) | :31-33 | none: stock colours (`*wxGREEN`, …) are fixed RGB (`src/common/gdicmn.cpp:789-830`) and Orca builds colours from hex/RGB. Do not build colours from names |
|
| `wxColourDatabase` uses CSS values; `UseScheme()` restores the old ones (`interface/wx/gdicmn.h:845, 973-996`) | :31-33 | none: stock colours (`*wxGREEN`, …) are fixed RGB (`src/common/gdicmn.cpp:789-830`) and Orca builds colours from hex/RGB. Do not build colours from names |
|
||||||
| `wxAuiNotebook` default art is the new flat art; `wxAuiNativeTabArt` (or `"native"` in XRC) keeps the old look | :41-43 | none: no `wxAuiNotebook` in Orca |
|
| `wxAuiNotebook` default art is the new flat art; `wxAuiNativeTabArt` (or `"native"` in XRC) keeps the old look | :35-37 | none: no `wxAuiNotebook` in Orca |
|
||||||
| `wxTHREAD_WAIT_DEFAULT` is `wxTHREAD_WAIT_BLOCK`: `wxThread::Delete()/Wait()` no longer pump events | :45-47 | Orca uses std/boost threads (`wxThread` only for `IsMain()`); a new `wxThread` whose exit needs the main loop would deadlock |
|
| `wxTHREAD_WAIT_DEFAULT` is `wxTHREAD_WAIT_BLOCK`: `wxThread::Delete()/Wait()` no longer pump events | :39-41 | Orca uses std/boost threads (`wxThread` only for `IsMain()`); a new `wxThread` whose exit needs the main loop would deadlock |
|
||||||
| `wxDocument::OnCloseDocument()` runs once, after the views are destroyed (it used to run twice when the document was closed from the menu); an override must not rely on any view existing | :49-52 | none: no doc/view |
|
| `wxDocument::OnCloseDocument()` runs once, after the views are destroyed (it used to run twice when the document was closed from the menu); an override must not rely on any view existing | :43-46 | none: no doc/view |
|
||||||
| `wxGrid::FreezeTo()` asserts on out-of-range counts, and freezes even when the grid is too small | :54-57 | silent `false` in Orca; it also refuses reordered or drag-movable rows/columns [source] (`src/generic/grid.cpp:5742-5750`). Clamp arguments (`controls-dataview.md`) |
|
| `wxGrid::FreezeTo()` asserts on out-of-range counts, and freezes even when the grid is too small | :48-51 | silent `false` in Orca; it also refuses reordered or drag-movable rows/columns [source] (`src/generic/grid.cpp:5742-5750`). Clamp arguments (`controls-dataview.md`) |
|
||||||
| Invalid `wxImageList` calls assert | :59-62 | silent in Orca; `wxCHECK` returns (generic `Add` → -1). Create the list with a valid size before use |
|
| Invalid `wxImageList` calls assert | :53-56 | silent in Orca; `wxCHECK` returns (generic `Add` → -1). Create the list with a valid size before use |
|
||||||
| `wxTRANSPARENT_WINDOW` does nothing (`#define wxTRANSPARENT_WINDOW 0`, `include/wx/defs.h:1449`); MSW code that needs it can set `WS_EX_TRANSPARENT` | :64-66 | pitfall below; 026b105dcb |
|
| `wxTRANSPARENT_WINDOW` does nothing (`#define wxTRANSPARENT_WINDOW 0`, `include/wx/defs.h:1449`); MSW code that needs it can set `WS_EX_TRANSPARENT` | :58-60 | pitfall below; 026b105dcb |
|
||||||
| MSW `wxTextDataObject::SetData()` size includes the 2-byte NUL (consistent with `GetDataSize()`); an old-style size chops the last character | :68-72 | none: Orca uses the `wxTextDataObject(text)` ctor; use `SetText()`, never `SetData()` |
|
| MSW `wxTextDataObject::SetData()` size includes the 2-byte NUL (consistent with `GetDataSize()`); an old-style size chops the last character | :62-66 | none: Orca uses the `wxTextDataObject(text)` ctor; use `SetText()`, never `SetData()` |
|
||||||
| `wxListCtrl::EditLabel()` asserts without `wxLC_EDIT_LABELS` | :74-75 | silent no-op in Orca; add the style where editing is intended |
|
| `wxListCtrl::EditLabel()` asserts without `wxLC_EDIT_LABELS` | :68-69 | silent no-op in Orca; add the style where editing is intended |
|
||||||
| MSW `wxSystemAppearance::IsDark()` reports the app's own mode; `AreAppsDark()`/`IsSystemDark()` report the OS | :77-79 | pitfall below |
|
| MSW `wxSystemAppearance::IsDark()` reports the app's own mode; `AreAppsDark()`/`IsSystemDark()` report the OS | :71-73 | pitfall below |
|
||||||
| Unix `wxUILocale::IsSupported()` no longer falls back to another region of the same language; pass just `"fr"` to accept any `fr_XX` | :81-85 | `wxLocale::IsAvailable` builds the region-qualified tag (`GetCanonicalWithRegion()`) and calls `IsSupported()` [source] (`src/common/intl.cpp:740-781`); `GUI_App::load_language` relies on it, so on Linux a language whose canonical locale (e.g. `fr_FR`) is not installed reports unavailable. Keep the fallbacks in `load_language` |
|
| Unix `wxUILocale::IsSupported()` no longer falls back to another region of the same language; pass just `"fr"` to accept any `fr_XX` | :75-79 | `wxLocale::IsAvailable` builds the region-qualified tag (`GetCanonicalWithRegion()`) and calls `IsSupported()` [source] (`src/common/intl.cpp:740-781`); `GUI_App::load_language` relies on it, so on Linux a language whose canonical locale (e.g. `fr_FR`) is not installed reports unavailable. Keep the fallbacks in `load_language` |
|
||||||
| Deprecated `wxPGCellRenderer::DrawCaptionSelectionRect()` overload not called; override the overload taking `wxWindow*`, or enable 3.0 compatibility | :87-89 | none: no propgrid in Orca's own code |
|
| Deprecated `wxPGCellRenderer::DrawCaptionSelectionRect()` overload not called; override the overload taking `wxWindow*`, or enable 3.0 compatibility | :81-83 | none: no propgrid in Orca's own code |
|
||||||
| `wxImageList` size is in physical pixels | :91-94 | pitfall below |
|
| `wxImageList` size is in physical pixels | :85-88 | pitfall below |
|
||||||
| Mac `wxWebRequest` no longer uses persistent storage. The entry names `wxWebRequest::EnablePersistentStorage()`; the real API is `wxWebSession::EnablePersistentStorage(bool)` (`interface/wx/webrequest.h:1612-1629`; also `wxWebSessionSync`, :1835), macOS-only, before the first request | :96-98 | none: Orca uses `wxWebRequest` only for image downloads (`wxWebSession::GetDefault().CreateRequest` in `StatusPanel`, `SliceInfoPanel`, `ReleaseNote`, `DeviceErrorDialog`); network and login agents use libcurl (`Slic3r::Http`) |
|
| Mac `wxWebRequest` no longer uses persistent storage. The entry names `wxWebRequest::EnablePersistentStorage()`; the real API is `wxWebSession::EnablePersistentStorage(bool)` (`interface/wx/webrequest.h:1612-1629`; also `wxWebSessionSync`, :1835), macOS-only, before the first request | :90-92 | none: Orca uses `wxWebRequest` only for image downloads (`wxWebSession::GetDefault().CreateRequest` in `StatusPanel`, `SliceInfoPanel`, `ReleaseNote`, `DeviceErrorDialog`); network and login agents use libcurl (`Slic3r::Http`) |
|
||||||
| MSW `wxBitmap::Create(size, dc)` no longer multiplies by the DC's content scale; the size is physical | :100-102 | remove compensating scaling; use `CreateWithLogicalSize` for logical sizes |
|
| MSW `wxBitmap::Create(size, dc)` no longer multiplies by the DC's content scale; the size is physical | :94-96 | remove compensating scaling; use `CreateWithLogicalSize` for logical sizes |
|
||||||
| `wxIMAGE_QUALITY_NEAREST` has a new value and is no longer `wxIMAGE_QUALITY_NORMAL`; `NORMAL` (the `Scale`/`Rescale` default) is bilinear + box average (`interface/wx/image.h:31-67`) | :104-105 | never store or compare the enum numerically; default-quality thumbnails and icons look smoother than under 3.1.5; pass `wxIMAGE_QUALITY_NEAREST` for pixel-exact scaling |
|
| `wxIMAGE_QUALITY_NEAREST` has a new value and is no longer `wxIMAGE_QUALITY_NORMAL`; `NORMAL` (the `Scale`/`Rescale` default) is bilinear + box average (`interface/wx/image.h:31-67`) | :98-99 | never store or compare the enum numerically; default-quality thumbnails and icons look smoother than under 3.1.5; pass `wxIMAGE_QUALITY_NEAREST` for pixel-exact scaling |
|
||||||
| `wxTextCtrl::{Save,Load}File()` treat `.rtf` as RTF | :107-110 | pass `wxTEXT_TYPE_PLAIN` to keep plain text |
|
| `wxTextCtrl::{Save,Load}File()` treat `.rtf` as RTF | :101-104 | pass `wxTEXT_TYPE_PLAIN` to keep plain text |
|
||||||
| `wxClientDC`/`wxPaintDC` offset their origin by a `wxFrame` toolbar on every port | :112-115 | none: Orca frames have no native toolbar (`BBLTopbar` is a child `wxAuiToolBar`) |
|
| `wxClientDC`/`wxPaintDC` offset their origin by a `wxFrame` toolbar on every port | :106-109 | none: Orca frames have no native toolbar (`BBLTopbar` is a child `wxAuiToolBar`) |
|
||||||
| `wxTextCtrl::SetLabel()` does nothing and asserts on every port (MSW used to act as `SetValue`) | :117-119 | pitfall below |
|
| `wxTextCtrl::SetLabel()` does nothing and asserts on every port (MSW used to act as `SetValue`) | :111-113 | pitfall below |
|
||||||
| `wxAuiGenericTabArt` subclasses (also via `wxAuiMSWTabArt`) override `DrawPageTab()`/`GetPageTabSize()` instead of `DrawTab()`/`GetTabSize()`; direct `wxAuiTabArt` subclasses still work | :121-126 | none: no Orca tab art |
|
| `wxAuiGenericTabArt` subclasses (also via `wxAuiMSWTabArt`) override `DrawPageTab()`/`GetPageTabSize()` instead of `DrawTab()`/`GetTabSize()`; direct `wxAuiTabArt` subclasses still work | :115-120 | none: no Orca tab art |
|
||||||
| `wxAuiNotebook` page index is logical (reorder-independent); `GetPagePosition()` gives the screen position | :128-132 | none; index math under `wxAUI_NB_TAB_MOVE` is what breaks |
|
| `wxAuiNotebook` page index is logical (reorder-independent); `GetPagePosition()` gives the screen position | :122-126 | none; index math under `wxAUI_NB_TAB_MOVE` is what breaks |
|
||||||
| `wxListbook`/`wxChoicebook` interpret mnemonics in page titles "just as the other wx*book classes already did" | :134-136 | Orca uses neither (`BedShapeDialog` uses `wxSimplebook` + a combo); every book interprets `&` (`interface/wx/bookctrl.h:141-147`) → rule 11 |
|
| `wxListbook`/`wxChoicebook` interpret mnemonics in page titles "just as the other wx*book classes already did" | :128-130 | Orca uses neither (`BedShapeDialog` uses `wxSimplebook` + a combo); every book interprets `&` (`interface/wx/bookctrl.h:141-147`) → rule 11 |
|
||||||
| `wxAUI_MGR_HINT_FADE` is not in the default `wxAuiManager` style | :138-139 | Orca's `AuiMgr` keeps the default flags (minus `wxAUI_MGR_ALLOW_FLOATING` on Wayland, `AuiMgr::init`), so the docking hint no longer fades; add the flag if wanted |
|
| `wxAUI_MGR_HINT_FADE` is not in the default `wxAuiManager` style | :132-133 | Orca's `AuiMgr` keeps the default flags (minus `wxAUI_MGR_ALLOW_FLOATING` on Wayland, `AuiMgr::init`), so the docking hint no longer fades; add the flag if wanted |
|
||||||
| `wxPrintDialogData::SetAllPages(false)`/`SetSelection(false)` changed meaning | :141-143 | none |
|
| `wxPrintDialogData::SetAllPages(false)`/`SetSelection(false)` changed meaning | :135-137 | none |
|
||||||
| `wxWindow::Raise()` no longer shows a hidden window on any port | :145-147 | pitfall below; ba867cc534 |
|
| `wxGetTranslation()` returns `wxString` by value | :139-142 | pitfall below |
|
||||||
|
| `wxWindow::Raise()` no longer shows a hidden window on any port | :144-146 | pitfall below; ba867cc534 |
|
||||||
|
|
||||||
**Pitfalls**
|
**Pitfalls**
|
||||||
|
|
||||||
@@ -284,7 +277,7 @@ change, its line, and what it means for Orca.
|
|||||||
// Wrong: m_input_ip->GetTextCtrl()->SetLabelText(m_obj->get_dev_ip());
|
// Wrong: m_input_ip->GetTextCtrl()->SetLabelText(m_obj->get_dev_ip());
|
||||||
// Right: m_input_ip->GetTextCtrl()->ChangeValue(m_obj->get_dev_ip()); // no wxEVT_TEXT
|
// Right: m_input_ip->GetTextCtrl()->ChangeValue(m_obj->get_dev_ip()); // no wxEVT_TEXT
|
||||||
```
|
```
|
||||||
Cite: `docs/changes.txt:117-119`; `controls-dataview.md`.
|
Cite: `docs/changes.txt:111-113`; `controls-dataview.md`.
|
||||||
|
|
||||||
- **Rule:** Size a `wxImageList` from the bitmaps' physical size, or use
|
- **Rule:** Size a `wxImageList` from the bitmaps' physical size, or use
|
||||||
`SetImages(std::vector<wxBitmapBundle>)`.
|
`SetImages(std::vector<wxBitmapBundle>)`.
|
||||||
@@ -300,23 +293,18 @@ change, its line, and what it means for Orca.
|
|||||||
// Right: wxBitmap bmp = create_scaled_bitmap("icon", this, 16);
|
// Right: wxBitmap bmp = create_scaled_bitmap("icon", this, 16);
|
||||||
// m_images = new wxImageList(bmp.GetWidth(), bmp.GetHeight(), false);
|
// m_images = new wxImageList(bmp.GetWidth(), bmp.GetHeight(), false);
|
||||||
```
|
```
|
||||||
Cite: `docs/changes.txt:91-94`; `Tab` builds its list from `bmp().GetWidth()/GetHeight()`;
|
Cite: `docs/changes.txt:85-88`; `Tab` builds its list from `bmp().GetWidth()/GetHeight()`;
|
||||||
`dpi-bitmaps-fonts.md`.
|
`dpi-bitmaps-fonts.md`.
|
||||||
|
|
||||||
- **Rule:** A wrapper that converts a translation returns by value; `wxGetTranslation()` itself
|
- **Rule:** A function that returns a translation returns `wxString` by value.
|
||||||
returns `const wxString&`.
|
**Why:** `wxGetTranslation()` returns by value now (`include/wx/translation.h:278-321`); returning
|
||||||
**Why:** 3.3.2 changed `wxGetTranslation()` to return `wxString` by value, and **3.3.3 reverted it**
|
it as `const wxString&` dangles. Orca's `I18N::translate` overloads and `_L` already return by
|
||||||
(`interface/wx/translation.h:615`, `include/wx/translation.h:277-309`), so the return type is the
|
value.
|
||||||
3.2.x `const wxString&` again. That reference points at the catalog's own string or at
|
|
||||||
`wxTranslations::GetUntranslatedString()`, both of which outlive the call, so forwarding it as a
|
|
||||||
reference is safe. What still dangles is a temporary you construct: `wxString::FromUTF8`,
|
|
||||||
`ToUTF8()`, `format_wxstr`. Orca's `I18N::translate` overloads return `wxString` by value and
|
|
||||||
`translate_utf8`/`_u8L` return `std::string`.
|
|
||||||
```cpp
|
```cpp
|
||||||
// Wrong: const wxString& path() { return wxString::FromUTF8(raw); } // temporary
|
// Wrong: const wxString& title() { return _L("Printer"); }
|
||||||
// Right: wxString path() { return wxString::FromUTF8(raw); }
|
// Right: wxString title() { return _L("Printer"); }
|
||||||
```
|
```
|
||||||
Cite: §8 (the 3.3.3 revert); `I18N.hpp`.
|
Cite: `docs/changes.txt:139-142`; `I18N.hpp`.
|
||||||
|
|
||||||
- **Rule:** Escape `&` in user data (preset, filament, printer, file names) shown as a control label or
|
- **Rule:** Escape `&` in user data (preset, filament, printer, file names) shown as a control label or
|
||||||
book page title.
|
book page title.
|
||||||
@@ -326,37 +314,37 @@ change, its line, and what it means for Orca.
|
|||||||
// Wrong: book->AddPage(page, preset_name);
|
// Wrong: book->AddPage(page, preset_name);
|
||||||
// Right: book->AddPage(page, wxControl::EscapeMnemonics(preset_name)); // or label->SetLabelText(name)
|
// Right: book->AddPage(page, wxControl::EscapeMnemonics(preset_name)); // or label->SetLabelText(name)
|
||||||
```
|
```
|
||||||
Cite: `docs/changes.txt:134-136`; `interface/wx/bookctrl.h:141-147`; `controls-dataview.md`.
|
Cite: `docs/changes.txt:128-130`; `interface/wx/bookctrl.h:141-147`; `controls-dataview.md`.
|
||||||
|
|
||||||
## 4 3.3 changes that break the build
|
## 4 3.3 changes that break the build
|
||||||
|
|
||||||
`changes.txt` "Changes in behaviour which may result in build errors" (:181-292).
|
`changes.txt` "Changes in behaviour which may result in build errors" (:149-252).
|
||||||
|
|
||||||
| Change | Line | Orca relevance |
|
| Change | Line | Orca relevance |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 3.0-deprecated symbols disabled by default (`WXWIN_COMPATIBILITY_3_0=1` at wx build time re-enables them), 2.8-deprecated removed | :184-186 | Orca builds `WXWIN_COMPATIBILITY_3_0 0`, `_3_2 1`: port off 3.0-deprecated API |
|
| 3.0-deprecated symbols disabled by default (`WXWIN_COMPATIBILITY_3_0=1` at wx build time re-enables them), 2.8-deprecated removed | :152-154 | Orca builds `WXWIN_COMPATIBILITY_3_0 0`, `_3_2 1`: port off 3.0-deprecated API |
|
||||||
| `wxUSE_UNICODE=0` unsupported | :188 | none |
|
| `wxUSE_UNICODE=0` unsupported | :156 | none |
|
||||||
| `wxUSE_STD_CONTAINERS=1` by default ("Container Classes" overview); building wx with 0 keeps the old containers | :190-193 | Orca builds with 1 → pitfall below |
|
| `wxUSE_STD_CONTAINERS=1` by default ("Container Classes" overview); building wx with 0 keeps the old containers | :158-161 | Orca builds with 1 → pitfall below |
|
||||||
| `wxUSE_STL` gone; implicit `wxString` → `std::[w]string` only with `wxUSE_STD_STRING_CONV_IN_WXSTRING=1` at wx build time | :195-198 | Orca builds 0: convert explicitly (`into_u8`, `ToStdString`, `ToUTF8()`) |
|
| `wxUSE_STL` gone; implicit `wxString` → `std::[w]string` only with `wxUSE_STD_STRING_CONV_IN_WXSTRING=1` at wx build time | :163-166 | Orca builds 0: convert explicitly (`into_u8`, `ToStdString`, `ToUTF8()`) |
|
||||||
| MSW links `gdiplus.lib`, `msimg32.lib` | :200-204 | automatic with MSVC/wx-config; only static non-MSVC builds add them |
|
| MSW links `gdiplus.lib`, `msimg32.lib` | :168-172 | automatic with MSVC/wx-config; only static non-MSVC builds add them |
|
||||||
| wxMotif, wxGTK1 removed | :206-207 | none |
|
| wxMotif, wxGTK1 removed | :174-175 | none |
|
||||||
| Private containers (e.g. `wxSimpleDataObjectList`) removed; object arrays (`wxImageArray`) compare values in `Index()` | :209-215 | use `std::vector`/`std::list` |
|
| Private containers (e.g. `wxSimpleDataObjectList`) removed; object arrays (`wxImageArray`) compare values in `Index()` | :177-183 | use `std::vector`/`std::list` |
|
||||||
| Operators on wx types are hidden (not global) | :217-221 | pitfall below |
|
| Operators on wx types are hidden (not global) | :185-189 | pitfall below |
|
||||||
| `wxString` from `std::string_view` makes `wxstr = {"Hello", 2}` ambiguous | :223-226 | write `wxString{"Hello", 2}` |
|
| `wxString` from `std::string_view` makes `wxstr = {"Hello", 2}` ambiguous | :191-194 | write `wxString{"Hello", 2}` |
|
||||||
| Generic `wxSearchCtrl` lost multi-line-only methods | :228-229 | none |
|
| Generic `wxSearchCtrl` lost multi-line-only methods | :196-197 | none |
|
||||||
| Wide-filename `wxOnAssert()` overload removed | :231-232 | none |
|
| Wide-filename `wxOnAssert()` overload removed | :199-200 | none |
|
||||||
| 64-bit DLLs carry an `x64` suffix in all build systems | :234-236 | packaging scripts matching DLL names; Orca links wx statically (Flatpak builds it shared in its own manifest) |
|
| 64-bit DLLs carry an `x64` suffix in all build systems | :202-204 | packaging scripts matching DLL names; Orca links wx statically (Flatpak builds it shared in its own manifest) |
|
||||||
| CMake config installs to `lib/cmake/wxWidgets-3.3`; plain `find_package(wxWidgets)` is unaffected, hard-coded paths break | :238-243 | Orca: `find_package(wxWidgets 3.3 CONFIG …)` on Windows/macOS, `wx-config --toolkit=gtk${SLIC3R_GTK}` on Linux (Orca's `src/CMakeLists.txt`) |
|
| CMake config installs to `lib/cmake/wxWidgets-3.3`; plain `find_package(wxWidgets)` is unaffected, hard-coded paths break | :206-211 | Orca: `find_package(wxWidgets 3.3 CONFIG …)` on Windows/macOS, `wx-config --toolkit=gtk${SLIC3R_GTK}` on Linux (Orca's `src/CMakeLists.txt`) |
|
||||||
| Memory-tracing options removed | :245-248 | use ASan |
|
| Memory-tracing options removed | :213-216 | use ASan |
|
||||||
| `wxTEST_DIALOG()` needs a trailing `;` | :250-251 | none |
|
| `wxTEST_DIALOG()` needs a trailing `;` | :218-219 | none |
|
||||||
| `wxWindow::GetDefaultBorderForControl()` not virtual | :253-255 | do not override; use `wxBORDER_THEME` |
|
| `wxWindow::GetDefaultBorderForControl()` not virtual | :221-223 | do not override; use `wxBORDER_THEME` |
|
||||||
| GTK `wxDirButton::Create()` lost `wildcard` | :257-258 | none |
|
| GTK `wxDirButton::Create()` lost `wildcard` | :225-226 | none |
|
||||||
| Several virtuals take `wxReadOnlyDC` | :260-263 | pitfall below |
|
| Several virtuals take `wxReadOnlyDC` | :228-231 | pitfall below |
|
||||||
| `wxSizer::Detach()` takes `wxWindowBase*` | :265-268 | only custom sizer subclasses |
|
| `wxSizer::Detach()` takes `wxWindowBase*` | :233-236 | only custom sizer subclasses |
|
||||||
| `wx/cursor.h` no longer includes `wx/utils.h` | :270-272 | include `<wx/utils.h>` explicitly (8248b06337 added it to `GLCanvas3D.cpp`) |
|
| `wx/cursor.h` no longer includes `wx/utils.h` | :238-240 | include `<wx/utils.h>` explicitly (8248b06337 added it to `GLCanvas3D.cpp`) |
|
||||||
| `wxStyledTextCtrl::AddSelection()` returns void | :274-276 | none: `wxUSE_STC=OFF` |
|
| `wxStyledTextCtrl::AddSelection()` returns void | :242-244 | none: `wxUSE_STC=OFF` |
|
||||||
| `wxColour` from `bool` no longer compiles | :278-280 | use the RGB or string ctor explicitly |
|
| `wxColour` from `bool` no longer compiles | :246-248 | use the RGB or string ctor explicitly |
|
||||||
| `wxGLCanvas::CreateSurface()` removed from EGL builds | :282-284 | none: wx chooses EGL or GLX itself (§7) |
|
| `wxGLCanvas::CreateSurface()` removed from EGL builds | :250-252 | none: wx chooses EGL or GLX itself (§7) |
|
||||||
|
|
||||||
**Pitfalls**
|
**Pitfalls**
|
||||||
|
|
||||||
@@ -378,7 +366,7 @@ change, its line, and what it means for Orca.
|
|||||||
// Wrong: wxSize GetToolSize(wxDC& dc, wxWindow* w, const wxAuiToolBarItem& it); // never called
|
// Wrong: wxSize GetToolSize(wxDC& dc, wxWindow* w, const wxAuiToolBarItem& it); // never called
|
||||||
// Right: wxSize GetToolSize(wxReadOnlyDC& dc, wxWindow* w, const wxAuiToolBarItem& it) override;
|
// Right: wxSize GetToolSize(wxReadOnlyDC& dc, wxWindow* w, const wxAuiToolBarItem& it) override;
|
||||||
```
|
```
|
||||||
Cite: `docs/changes.txt:260-263`; `painting-custom-widgets.md`.
|
Cite: `docs/changes.txt:228-231`; `painting-custom-widgets.md`.
|
||||||
|
|
||||||
- **Rule:** With `wxUSE_STD_CONTAINERS=1`, build a `wxArrayString` with `Add()` or an initializer
|
- **Rule:** With `wxUSE_STD_CONTAINERS=1`, build a `wxArrayString` with `Add()` or an initializer
|
||||||
list, and walk `WX_DECLARE_LIST` lists with `compatibility_iterator` or range-for.
|
list, and walk `WX_DECLARE_LIST` lists with `compatibility_iterator` or range-for.
|
||||||
@@ -398,7 +386,7 @@ change, its line, and what it means for Orca.
|
|||||||
`wchar_t`, `std::string` or `std::wstring`.
|
`wchar_t`, `std::string` or `std::wstring`.
|
||||||
**Why:** wx operators are hidden friends now, found only by argument-dependent lookup on a wx type;
|
**Why:** wx operators are hidden friends now, found only by argument-dependent lookup on a wx type;
|
||||||
"preventing them from implicitly being used with types convertible to wx types"
|
"preventing them from implicitly being used with types convertible to wx types"
|
||||||
(`changes.txt:217-221`). `char + std::wstring + …` compiled under 3.1.5 through the global
|
(`changes.txt:185-189`). `char + std::wstring + …` compiled under 3.1.5 through the global
|
||||||
`operator+(char, const wxString&)`, converting the `std::wstring` implicitly; under 3.3 that
|
`operator+(char, const wxString&)`, converting the `std::wstring` implicitly; under 3.3 that
|
||||||
operator is a hidden friend (`include/wx/string.h:2150`) and no operand is a `wxString`, so it
|
operator is a hidden friend (`include/wx/string.h:2150`) and no operand is a `wxString`, so it
|
||||||
does not.
|
does not.
|
||||||
@@ -425,9 +413,9 @@ change, its line, and what it means for Orca.
|
|||||||
|
|
||||||
## 5 3.3.0 notable changes
|
## 5 3.3.0 notable changes
|
||||||
|
|
||||||
`changes.txt:573-785` (relative to 3.2.8).
|
`changes.txt:380-592` (relative to 3.2.8).
|
||||||
|
|
||||||
**Major changes** (:578-587)
|
**Major changes** (:385-394)
|
||||||
|
|
||||||
| Change | Orca relevance |
|
| Change | Orca relevance |
|
||||||
|---|---|
|
|---|---|
|
||||||
@@ -441,7 +429,7 @@ change, its line, and what it means for Orca.
|
|||||||
| Native GTK file dialogs when possible (#24486, #25104) | the portal dialog is used only with GTK ≥ 3.20 at runtime, without `wxFD_PREVIEW` and without an extra control [source] (`src/gtk/filedlg.cpp:265-273, 438-443`); Orca's `CheckboxFileDialog` (`SetExtraControlCreator`, `GUI_Utils.hpp`) therefore gets the non-native GTK dialog |
|
| Native GTK file dialogs when possible (#24486, #25104) | the portal dialog is used only with GTK ≥ 3.20 at runtime, without `wxFD_PREVIEW` and without an extra control [source] (`src/gtk/filedlg.cpp:265-273, 438-443`); Orca's `CheckboxFileDialog` (`SetExtraControlCreator`, `GUI_Utils.hpp`) therefore gets the non-native GTK dialog |
|
||||||
| Native `wxTextCtrl` contents / RTF (#24626, #24912) | available (`GetRTFValue`, `SearchText`) |
|
| Native `wxTextCtrl` contents / RTF (#24626, #24912) | available (`GetRTFValue`, `SearchText`) |
|
||||||
|
|
||||||
**All** (:591-635)
|
**All** (:398-442)
|
||||||
|
|
||||||
| Change | Orca relevance |
|
| Change | Orca relevance |
|
||||||
|---|---|
|
|---|---|
|
||||||
@@ -451,7 +439,7 @@ change, its line, and what it means for Orca.
|
|||||||
| Environment variables use UTF-8 (#25101) | check round-tripping of non-ASCII paths through `wxGetEnv`/`wxSetEnv` |
|
| Environment variables use UTF-8 (#25101) | check round-tripping of non-ASCII paths through `wxGetEnv`/`wxSetEnv` |
|
||||||
| Improved locale matching (#24855); thread-safe `wxPlatformInfo::Get()` (#25459); `wxXmlParseError` from `wxXmlDocument::Load()` (#24215); customisable error exit code (#24770) | available |
|
| Improved locale matching (#24855); thread-safe `wxPlatformInfo::Get()` (#25459); `wxXmlParseError` from `wxXmlDocument::Load()` (#24215); customisable error exit code (#24770) | available |
|
||||||
|
|
||||||
**All (GUI)** (:637-693)
|
**All (GUI)** (:444-500)
|
||||||
|
|
||||||
| Change | Orca relevance |
|
| Change | Orca relevance |
|
||||||
|---|---|
|
|---|---|
|
||||||
@@ -464,17 +452,17 @@ change, its line, and what it means for Orca.
|
|||||||
| Non-live resize restored in wxAUI and `wxSplitterWindow` (#24193) | `wxAUI_MGR_LIVE_RESIZE` is in `wxAUI_MGR_DEFAULT` since 3.3.0 (`interface/wx/aui/framemanager.h:59-66`). The style table's "always enabled in wxGTK3 and wxOSX ports as non-live resizing is not implemented in them" (:199-206) is as stale as the `AlwaysUsesLiveResize()` note: that function "always returns false" as of 3.3.0 (:345; `src/aui/framemanager.cpp:711-714`), and the flag decides on every port [source] (`HasLiveResize`, :716-719). See `webview-gl-aui-media.md` §AUI docking |
|
| Non-live resize restored in wxAUI and `wxSplitterWindow` (#24193) | `wxAUI_MGR_LIVE_RESIZE` is in `wxAUI_MGR_DEFAULT` since 3.3.0 (`interface/wx/aui/framemanager.h:59-66`). The style table's "always enabled in wxGTK3 and wxOSX ports as non-live resizing is not implemented in them" (:199-206) is as stale as the `AlwaysUsesLiveResize()` note: that function "always returns false" as of 3.3.0 (:345; `src/aui/framemanager.cpp:711-714`), and the flag decides on every port [source] (`HasLiveResize`, :716-719). See `webview-gl-aui-media.md` §AUI docking |
|
||||||
| `wxInfoBar::ShowCheckBox()` (#25394); printing multiple page ranges (#25030); `wxGrid::CopySelection()` (#24124); new default flat AUI tab art (#25316); `wxApp::SetAppearance()` (#24461) | available |
|
| `wxInfoBar::ShowCheckBox()` (#25394); printing multiple page ranges (#25030); `wxGrid::CopySelection()` (#24124); new default flat AUI tab art (#25316); `wxApp::SetAppearance()` (#24461) | available |
|
||||||
|
|
||||||
**All (WebView)** (:703-718) — `wxWebViewConfiguration` + `GetNativeConfiguration()`, `SetProxy()`,
|
**All (WebView)** (:510-525) — `wxWebViewConfiguration` + `GetNativeConfiguration()`, `SetProxy()`,
|
||||||
`ShowDevTools()`, `EnablePersistentStorage()`, `EnableBrowserAcceleratorKeys()`, clearing browsing
|
`ShowDevTools()`, `EnablePersistentStorage()`, `EnableBrowserAcceleratorKeys()`, clearing browsing
|
||||||
data, advanced requests, child-window handling, `IsTargetMainFrame()`, Edge user agent settable after
|
data, advanced requests, child-window handling, `IsTargetMainFrame()`, Edge user agent settable after
|
||||||
creation, and **Edge events queued** (#22744, #19075): Edge handlers run later than on the other
|
creation, and **Edge events queued** (#22744, #19075): Edge handlers run later than on the other
|
||||||
backends. Edge posts its events with `AddPendingEvent` (script messages: `src/msw/webview_edge.cpp:872`)
|
backends. Edge posts its events with `AddPendingEvent` (script messages: `src/msw/webview_edge.cpp:811`)
|
||||||
except the vetoable ones, `wxEVT_WEBVIEW_NAVIGATING` (:655-662) and `wxEVT_WEBVIEW_NEWWINDOW` with its
|
except the vetoable ones, `wxEVT_WEBVIEW_NAVIGATING` (:599) and `wxEVT_WEBVIEW_NEWWINDOW` with its
|
||||||
`NEWWINDOW_FEATURES` follow-up (:783-785, :796-798), which stay synchronous; WebKit and
|
`NEWWINDOW_FEATURES` follow-up (:723, :737), which stay synchronous; WebKit and
|
||||||
WebKit2GTK deliver script messages synchronously (`src/osx/webview_webkit.mm:1360`,
|
WebKit2GTK deliver script messages synchronously (`src/osx/webview_webkit.mm:1360`,
|
||||||
`src/gtk/webview_webkit2.cpp:408`) [source]. `webview-gl-aui-media.md` owns the details.
|
`src/gtk/webview_webkit2.cpp:408`) [source]. `webview-gl-aui-media.md` owns the details.
|
||||||
|
|
||||||
**wxGTK** (:720-740)
|
**wxGTK** (:527-547)
|
||||||
|
|
||||||
| Change | Orca relevance |
|
| Change | Orca relevance |
|
||||||
|---|---|
|
|---|---|
|
||||||
@@ -489,53 +477,46 @@ WebKit2GTK deliver script messages synchronously (`src/osx/webview_webkit.mm:136
|
|||||||
| `wxDC::DrawRoundedRectangle()` radius limited to half the smaller side (#24327) | the clamp is in the GTK2 GDK DC (`src/gtk/dcclient.cpp:874-875`, built only in the GTK2 opt-out, `GTK2_LOWLEVEL_SRC` in `build/files`) and also in the common `wxGraphicsPathData::AddRoundedRectangle` (`src/common/graphcmn.cpp:439-440`, absent in 3.1.5) that `wxGraphicsContext::DrawRoundedRectangle` uses, so every `wxGCDC` clamps: GTK3 (Cairo) and macOS window DCs, and Orca's memory-DC + `wxGCDC` paint paths on all ports [source]. A radius larger than half the smaller side is now clamped instead of drawing overlapping arcs |
|
| `wxDC::DrawRoundedRectangle()` radius limited to half the smaller side (#24327) | the clamp is in the GTK2 GDK DC (`src/gtk/dcclient.cpp:874-875`, built only in the GTK2 opt-out, `GTK2_LOWLEVEL_SRC` in `build/files`) and also in the common `wxGraphicsPathData::AddRoundedRectangle` (`src/common/graphcmn.cpp:439-440`, absent in 3.1.5) that `wxGraphicsContext::DrawRoundedRectangle` uses, so every `wxGCDC` clamps: GTK3 (Cairo) and macOS window DCs, and Orca's memory-DC + `wxGCDC` paint paths on all ports [source]. A radius larger than half the smaller side is now clamped instead of drawing overlapping arcs |
|
||||||
| Read-only `wxBitmapComboBox` height fixed (#25468) | `Slic3r::GUI::BitmapComboBox` on GTK |
|
| Read-only `wxBitmapComboBox` height fixed (#25468) | `Slic3r::GUI::BitmapComboBox` on GTK |
|
||||||
|
|
||||||
**wxMSW** (:742-776)
|
**wxMSW** (:549-583)
|
||||||
|
|
||||||
| Change | Orca relevance |
|
| Change | Orca relevance |
|
||||||
|---|---|
|
|---|---|
|
||||||
| "Enable double buffering for all windows" (#22851) | **reverted in 3.3.2** (#25808) → pitfall below |
|
| "Enable double buffering for all windows" (#22851) | **reverted in 3.3.2** (#25808) → pitfall below |
|
||||||
| `wxOverlay` reimplemented with layered windows (#23261) | none: no `wxOverlay` |
|
| `wxOverlay` reimplemented with layered windows (#23261) | none: no `wxOverlay` |
|
||||||
| `wxBG_STYLE_TRANSPARENT` implemented (#23412) | as `WS_EX_TRANSPARENT` on non-TLW children [source] (`src/msw/window.cpp:1581-1582`); set before `Create()` (`painting-custom-widgets.md`) |
|
| `wxBG_STYLE_TRANSPARENT` implemented (#23412) | as `WS_EX_TRANSPARENT` on non-TLW children [source] (`src/msw/window.cpp:1581-1582`); set before `Create()` (`painting-custom-widgets.md`) |
|
||||||
| `wxCAPTION` turned on when min/max/close boxes are set (#23575) | `WS_CAPTION` is added to the style (`src/msw/toplevel.cpp:132-135`); origin of the MainFrame workaround (§10) |
|
| `wxCAPTION` turned on when min/max/close boxes are set (#23575) | `WS_CAPTION` is added to the style (`src/msw/toplevel.cpp:132-135`); origin of the MainFrame workaround (§8) |
|
||||||
| `wxButton` default size larger in high DPI (#25297) | raw `wxButton` layouts may grow; Orca dialogs use `Button`/`DialogButtons` |
|
| `wxButton` default size larger in high DPI (#25297) | raw `wxButton` layouts may grow; Orca dialogs use `Button`/`DialogButtons` |
|
||||||
| Markup in `wxStaticText` (#25000); `wxHyperlinkCtrl` colour changeable (#23549) | `SetLabelMarkup` now works on MSW (single line) |
|
| Markup in `wxStaticText` (#25000); `wxHyperlinkCtrl` colour changeable (#23549) | `SetLabelMarkup` now works on MSW (single line) |
|
||||||
| Extended-length paths (#25033); `wxFileDialog` no unwanted extension (#24949); UTF-8 build fixes (#23313); non-BMP strings (#25128) | available |
|
| Extended-length paths (#25033); `wxFileDialog` no unwanted extension (#24949); UTF-8 build fixes (#23313); non-BMP strings (#25128) | available |
|
||||||
| `wxDisplay` invalidated on display change (#25396); TLW with one child resized on DPI change (#22983); Aero-snapped geometry saved | multi-monitor geometry |
|
| `wxDisplay` invalidated on display change (#25396); TLW with one child resized on DPI change (#22983); Aero-snapped geometry saved | multi-monitor geometry |
|
||||||
| Modern default `wxTreeCtrl` look (#23844); RTL fixes for `wxOverlay`/`wxScrolled` (#25413) and GDI+ (#25431); `wxBitmap::UseAlpha()` returns `bool` (#23919) | available |
|
| Modern default `wxTreeCtrl` look (#23844); RTL fixes for `wxOverlay`/`wxScrolled` (#25413) and GDI+ (#25431); `wxBitmap::UseAlpha()` returns `bool` (#23919) | available |
|
||||||
|
|
||||||
**wxOSX** (:778-785) — `wxEventLoop::OnExit()` is always called (#25409); TLW cursor setting fixed
|
**wxOSX** (:585-592) — `wxEventLoop::OnExit()` is always called (#25409); TLW cursor setting fixed
|
||||||
(#25131); Cmd-C no longer activates a "Close" button (#25346); `wxCursor` loadable from resources
|
(#25131); Cmd-C no longer activates a "Close" button (#25346); `wxCursor` loadable from resources
|
||||||
(#24374); `wxUIActionSimulator` works (#23692), usable for GUI tests.
|
(#24374); `wxUIActionSimulator` works (#23692), usable for GUI tests.
|
||||||
|
|
||||||
**Pitfalls**
|
**Pitfalls**
|
||||||
|
|
||||||
- **Rule:** Orca keeps its own Windows theming (`NppDarkMode`) and only informs wx with
|
- **Rule:** Do not replace Orca's MSW dark mode with wx's (`SetAppearance`/`MSWEnableDarkMode`)
|
||||||
`MSWEnableDarkMode(DarkMode_Auto)`; do not replace it with wx's dark mode without accounting for the
|
unless live theme switching is kept.
|
||||||
chrome NppDarkMode themes itself.
|
**Why:** wx's MSW dark mode cannot change once any top-level window exists or a mode was chosen:
|
||||||
**Why:** when 8248b06337 landed (3.3.2), wx's MSW dark mode could not be changed once a top-level
|
`SetAppearance` returns `CannotChange` (`src/msw/darkmode.cpp:263-270`;
|
||||||
window existed — `SetAppearance` returned `CannotChange` — so a live Preferences toggle would have
|
`interface/wx/app.h:1166-1173`). TaskDialog-based dialogs (`wxMessageDialog`, `wxProgressDialog`,
|
||||||
been restart-only. That blocker is gone: 3.3.3 (#26516) and 3.3.4 (#26734) made the mode switchable
|
simple `wxAboutBox`), the common dialogs (colour, find/replace, font, page setup, print) and the
|
||||||
at runtime. `MSWEnableDarkMode()` re-applies the mode to an existing window (sends it
|
date/time/calendar controls stay light (`interface/wx/app.h:1434-1448`). Orca switches themes at
|
||||||
`WM_SYSCOLORCHANGE`, `src/msw/darkmode.cpp:345-349`), controls restyle through
|
runtime, which is why 8248b06337 kept NppDarkMode and only informs wx with
|
||||||
`wxMSWDarkMode::HasChanged()`/`NotifySysColorChange()` (`src/msw/window.cpp:5337, 5528-5534`), and
|
`MSWEnableDarkMode(DarkMode_Auto)` (§8).
|
||||||
`SetAppearance()` returns only `Ok`/`Failure`; `AppearanceResult::CannotChange` is no longer
|
|
||||||
returned (`src/msw/darkmode.cpp:289-375`; `interface/wx/app.h:1151, 1179-1183`). The remaining
|
|
||||||
documented limits are the date/time/calendar controls, `wxPrintDialog` on Windows 10 and MDI
|
|
||||||
applications (`interface/wx/app.h:1442-1448`); `wxMessageDialog` (3.3.3, #26570) and the common
|
|
||||||
dialogs (3.3.4, #26780) now do support dark mode. Orca still keeps NppDarkMode because it themes
|
|
||||||
Orca's own chrome (title bars, explorer theme, scrollbars, list headers) and drives the live
|
|
||||||
theme-switch path (§10).
|
|
||||||
Cite: 8248b06337 (PR text); `colours-dark-mode.md`.
|
Cite: 8248b06337 (PR text); `colours-dark-mode.md`.
|
||||||
|
|
||||||
- **Rule:** On MSW, a custom-painted control buffers its own drawing (`wxAutoBufferedPaintDC`/
|
- **Rule:** On MSW, a custom-painted control buffers its own drawing (`wxAutoBufferedPaintDC`/
|
||||||
`wxBufferedPaintDC` with `wxBG_STYLE_PAINT`, or the Orca memory-DC + `wxGCDC` path), or calls
|
`wxBufferedPaintDC` with `wxBG_STYLE_PAINT`, or the Orca memory-DC + `wxGCDC` path), or calls
|
||||||
`SetDoubleBuffered(true)` after creation.
|
`SetDoubleBuffered(true)` after creation.
|
||||||
**Why:** 3.3.0's global `WS_EX_COMPOSITED` was reverted in 3.3.2 (`changes.txt:501`). In 3.3.4
|
**Why:** 3.3.0's global `WS_EX_COMPOSITED` was reverted in 3.3.2 (`changes.txt:308`). In 3.3.2
|
||||||
nothing sets it except an explicit `SetDoubleBuffered(true)` [source] (`src/msw/window.cpp:4704-4721`;
|
nothing sets it except an explicit `SetDoubleBuffered(true)` [source] (`src/msw/window.cpp:4704-4721`;
|
||||||
the only other use is `MSWDisableComposited`, :1643-1652), so MSW windows are not double-buffered by
|
the only other use is `MSWDisableComposited`, :1643-1652), so MSW windows are not double-buffered by
|
||||||
default, exactly as in 3.1.5. `wxAutoBufferedPaintDC` is a `wxBufferedPaintDC` on MSW at compile
|
default, exactly as in 3.1.5. `wxAutoBufferedPaintDC` is a `wxBufferedPaintDC` on MSW at compile
|
||||||
time (`include/wx/dcbuffer.h:18-23, 215-221`). Nothing tuned against 3.3.0/3.3.1 applies.
|
time (`include/wx/dcbuffer.h:18-23, 215-221`). Nothing tuned against 3.3.0/3.3.1 applies.
|
||||||
Cite: `docs/changes.txt:501, 750`; `painting-custom-widgets.md`.
|
Cite: `docs/changes.txt:308, 557`; `painting-custom-widgets.md`.
|
||||||
|
|
||||||
- **Rule:** A `wxEVT_DPI_CHANGED` handler must be correct on GTK3, and every handler you bind — on a
|
- **Rule:** A `wxEVT_DPI_CHANGED` handler must be correct on GTK3, and every handler you bind — on a
|
||||||
child, a control or a `DPIDialog`/`DPIFrame` — calls `Skip()`.
|
child, a control or a `DPIDialog`/`DPIFrame` — calls `Skip()`.
|
||||||
@@ -548,11 +529,11 @@ WebKit2GTK deliver script messages synchronously (`src/osx/webview_webkit.mm:136
|
|||||||
ctor starts at 1 because `get_dpi_for_window` returns 96 on Linux). Double scaling when a window moves between monitors of
|
ctor starts at 1 because `get_dpi_for_window` returns 96 on Linux). Double scaling when a window moves between monitors of
|
||||||
different scale is a risk that has not been verified at runtime; test DPI changes on GTK when
|
different scale is a risk that has not been verified at runtime; test DPI changes on GTK when
|
||||||
touching `DPIAware::rescale` paths.
|
touching `DPIAware::rescale` paths.
|
||||||
Cite: `docs/changes.txt:734`; `dpi-bitmaps-fonts.md` §wxEVT_DPI_CHANGED.
|
Cite: `docs/changes.txt:541`; `dpi-bitmaps-fonts.md` §wxEVT_DPI_CHANGED.
|
||||||
|
|
||||||
## 6 3.3.1 notable fixes
|
## 6 3.3.1 notable fixes
|
||||||
|
|
||||||
`changes.txt:526-570`.
|
`changes.txt:333-377`.
|
||||||
|
|
||||||
| Port | Change | Orca relevance |
|
| Port | Change | Orca relevance |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
@@ -566,7 +547,7 @@ WebKit2GTK deliver script messages synchronously (`src/osx/webview_webkit.mm:136
|
|||||||
|
|
||||||
## 7 3.3.2 notable changes
|
## 7 3.3.2 notable changes
|
||||||
|
|
||||||
`changes.txt:448-511`, relative to 3.2.10 (see §1 for the unlisted 3.2.9/3.2.10 fixes).
|
`changes.txt:255-318`, relative to 3.2.10 (see §1 for the unlisted 3.2.9/3.2.10 fixes).
|
||||||
|
|
||||||
| Port | Change | Orca relevance |
|
| Port | Change | Orca relevance |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
@@ -608,7 +589,7 @@ WebKit2GTK deliver script messages synchronously (`src/osx/webview_webkit.mm:136
|
|||||||
// Wrong: m_static_valid->SetLabel(info_line); m_static_valid->Wrap(FromDIP(300));
|
// Wrong: m_static_valid->SetLabel(info_line); m_static_valid->Wrap(FromDIP(300));
|
||||||
// Right: m_static_valid->SetLabel(info_line); m_static_valid->Wrap(-1); m_static_valid->Wrap(FromDIP(300));
|
// Right: m_static_valid->SetLabel(info_line); m_static_valid->Wrap(-1); m_static_valid->Wrap(FromDIP(300));
|
||||||
```
|
```
|
||||||
Cite: `docs/changes.txt:473`; `sizers-layout.md` §wxStaticText wrapping.
|
Cite: `docs/changes.txt:280`; `sizers-layout.md` §wxStaticText wrapping.
|
||||||
|
|
||||||
- **Rule:** On Linux/X11, call `wxGLCanvas::PreferGLX()` before any GL use, attribute objects
|
- **Rule:** On Linux/X11, call `wxGLCanvas::PreferGLX()` before any GL use, attribute objects
|
||||||
included; set a swap interval explicitly if the canvas needs VSync.
|
included; set a swap interval explicitly if the canvas needs VSync.
|
||||||
@@ -624,7 +605,7 @@ WebKit2GTK deliver script messages synchronously (`src/osx/webview_webkit.mm:136
|
|||||||
```cpp
|
```cpp
|
||||||
// Right (if frame pacing is wanted): canvas->SetSwapInterval(1); // before the first SwapBuffers
|
// Right (if frame pacing is wanted): canvas->SetSwapInterval(1); // before the first SwapBuffers
|
||||||
```
|
```
|
||||||
Cite: `docs/changes.txt:468-469, 485`; `webview-gl-aui-media.md` §EGL vs GLX.
|
Cite: `docs/changes.txt:275-276, 292`; `webview-gl-aui-media.md` §EGL vs GLX.
|
||||||
|
|
||||||
- **Rule:** Do not count clicks from `wxEVT_LEFT_DCLICK` alone on macOS; handle `DOWN` and `DCLICK`
|
- **Rule:** Do not count clicks from `wxEVT_LEFT_DCLICK` alone on macOS; handle `DOWN` and `DCLICK`
|
||||||
as on MSW.
|
as on MSW.
|
||||||
@@ -632,68 +613,13 @@ WebKit2GTK deliver script messages synchronously (`src/osx/webview_webkit.mm:136
|
|||||||
(left and right buttons), so a triple click gives `DOWN, DCLICK, DOWN` as on MSW; previously every
|
(left and right buttons), so a triple click gives `DOWN, DCLICK, DOWN` as on MSW; previously every
|
||||||
click with `clickCount > 1` was a `DCLICK` [source] (`src/osx/cocoa/window.mm:4103-4150`). Per-platform click-count ifdefs
|
click with `clickCount > 1` was a `DCLICK` [source] (`src/osx/cocoa/window.mm:4103-4150`). Per-platform click-count ifdefs
|
||||||
written for 3.1.5 need rechecking.
|
written for 3.1.5 need rechecking.
|
||||||
Cite: `docs/changes.txt:509`; `mouse-keyboard-focus.md`.
|
Cite: `docs/changes.txt:316`; `mouse-keyboard-focus.md`.
|
||||||
|
|
||||||
## 8 3.3.3 notable changes
|
## 8 Migration already done in Orca
|
||||||
|
|
||||||
`changes.txt:388-445`, relative to 3.2.11 (see §1 for the unlisted 3.2.10/3.2.11 fixes).
|
The upgrade landed as 8248b06337 ("Updated wxWidgets to 3.3.2", #12941; build system 2d7e26292b).
|
||||||
|
Its PR kept Orca's own MSW dark mode to avoid broader changes and because wx's needs an app restart to
|
||||||
| Port | Change | Orca relevance |
|
switch. Each row is a rule for new code; the owning file has the detail.
|
||||||
|---|---|---|
|
|
||||||
| All | `wxMoveToTrash()` (#26256); `wxSizer::DetachItem()` (#26512); truncated reads are errors in `wxDataInputStream` (#26600); `wxGetOsDescription()` (#26231); C++20 `<=>` for `wxString` (#26306) | available; Orca detaches windows and has its own file deletion |
|
|
||||||
| All | **`wxGetTranslation()` returns `const wxString&` again**, reverting 3.3.2's by-value change | the by-value rule is retired → §3 pitfall |
|
|
||||||
| GUI | `wxWebView::Print()` print settings (#26239) and `PrintToPDF()` (#26583); `wxWebViewConfiguration::DisableGPUAcceleration()` (#26626) | `webview-gl-aui-media.md` |
|
|
||||||
| GUI | `wxGrid::GetFrozen{Row,Col}LabelWindow()` (#26617); `wxSVGFileDC` accessibility (#26379) and `GetSVGDocument()` (#26344) | `controls-dataview.md`; `wxSVGFileDC` available |
|
|
||||||
| wxGTK | Fix regression when using `wxImageList` in high DPI (#26349) | the physical-pixel image-list rule is unchanged (§3) |
|
|
||||||
| wxGTK | Fix `wxStaticText` label wrapping | the base `Wrap()` cache is unchanged (§7); only the GTK label wrapping was fixed |
|
|
||||||
| wxGTK | Assert when the clipboard has non-ASCII targets fixed (#26263); GTK-without-Wayland build fixed (#26269); high-DPI bitmaps in `wxAboutBox` (#22192) | clipboard |
|
|
||||||
| wxMSW | **Light/dark mode switching implemented** (#26516) | see §5: this removes the old "cannot switch at runtime" blocker |
|
|
||||||
| wxMSW | `wxMessageDialog` dark mode (#26570); combo/listbox dark mode on Windows 11 (#26535); `wxCheckBox` label in screen readers (#26270); `wxPD_CAN_SKIP` regression (#26287); Direct2D text regression (#26259) | dark-mode and accessibility fixes |
|
|
||||||
| wxMSW | Stylus events (#26223); colour emoji via Direct2D (#26657) | available |
|
|
||||||
| wxOSX | Data-view icons under macOS 26 (#26374); `wxOverlay` phantoms in Mission Control (#26380); `wxEVT_DATAVIEW_ITEM_EDITING_DONE` value set (#26367); Xcode project for macOS 27 (#26578) | native look and data view |
|
|
||||||
|
|
||||||
## 9 3.3.4 notable changes
|
|
||||||
|
|
||||||
`changes.txt:295-385`, relative to 3.2.11 (see §1 for the unlisted 3.2.11/3.2.12 fixes).
|
|
||||||
|
|
||||||
| Port | Change | Orca relevance |
|
|
||||||
|---|---|---|
|
|
||||||
| All | `wxString` usable with `{fmt}`/`std::format()` (#27180); `wxPATH_RMDIR_PARENTS`; `fsync()` in `wxTempFile` (#27001); `wxDateTime::GetAsDOS()` after 2038 (#4393); TCP `wxIPC` fixes (#24858) | available |
|
|
||||||
| GUI | **Accelerators take priority over the focused window in all ports** (#22630), with the new `wxEVT_ACCELERATOR_KEY` event and the `wxWindow::ClaimsKeyBeforeAccelerator()` override that text controls use to reserve their editing keys (`interface/wx/event.h:1799`, `interface/wx/window.h:4580`) | pitfall below; `mouse-keyboard-focus.md` |
|
|
||||||
| GUI | wxGrid: `wxGridCellChoiceEditor` UI fixes (#12094), best size for auto-wrapped rows (#14072), `MakeCellVisible()` with variable row heights (#4371), editor-change crash (#21986) | `controls-dataview.md`; the choice-editor `Combo()` cast rule is unchanged |
|
|
||||||
| GUI | AUI: no spurious sash jump on click (#4547); an added pane's best size is respected (#4404) | Plater docking |
|
|
||||||
| GUI | `wxListCtrl` (#15411) and `wxStatusBar` (#24305) accessibility; `wxAuiNotebook` selection after a page removal (#9920); `wxPreviewCanvas` crash (#9822); generic `wxCalendarCtrl` background colour (#21885); LunaSVG with filters (#27176) | available; no `wxAuiNotebook` in Orca |
|
|
||||||
| wxMSW | **Dark mode can be enabled dynamically** (#26734); dark mode for `wxFontPickerCtrl` (#26667), `wxNotebook` (#26694, #26695), `wxSpinButton` (#26682, #26683) and the common dialogs (#26780) | §5 pitfall; `colours-dark-mode.md` |
|
|
||||||
| wxMSW | `wxRenameFile()` no longer copies file attributes (`changes.txt:345-347`, incompatible); Esc closes dialogs used by IME/auto-completion (#16059, #27145); IME handling in wxGrid improved (#24558); `wxPersistent` controls DPI-aware (#18752); non-BMP character input (#27016) | file dialogs, keyboard and IME |
|
|
||||||
| wxGTK | Wayland: crash on pointer/seat disconnect fixed (#27069); **AUI panes draggable via system drag sessions** (#26969); **window geometry restorable** via XDG session management (#26324); overlay-scrollbar client size (#26889) | the Wayland gaps are partly narrowed; `webview-gl-aui-media.md` §AUI |
|
|
||||||
| wxOSX | `wxEVT_CHAR` key codes fixed for events with Ctrl (#26810); context-menu accessibility (#13010); custom controls in sandboxed `wxFileDialog` (#26908) | `mouse-keyboard-focus.md`; macOS keys |
|
|
||||||
|
|
||||||
**Pitfalls**
|
|
||||||
|
|
||||||
- **Rule:** On every port an accelerator now runs before the focused window handles the key, unless
|
|
||||||
that window claims the key; a custom control that must keep a key over an accelerator overrides
|
|
||||||
`wxWindow::ClaimsKeyBeforeAccelerator()`, or handles `wxEVT_ACCELERATOR_KEY` and calls
|
|
||||||
`UseAccelerator()`.
|
|
||||||
**Why:** before 3.3.4 only wxGTK let the focused window handle the key first; the other ports
|
|
||||||
already gave accelerators priority. 3.3.4 made every port consistent and added the
|
|
||||||
`wxEVT_ACCELERATOR_KEY` event, sent after `wxEVT_CHAR_HOOK` (before it on macOS) to the focus
|
|
||||||
window and propagated to its parents (`interface/wx/event.h:1740-1801`;
|
|
||||||
`interface/wx/window.h:4554-4583`). Text controls, `wxComboBox` and `wxSpinCtrl` reserve their
|
|
||||||
editing keys by overriding `ClaimsKeyBeforeAccelerator()` and returning
|
|
||||||
`wxTextEntryBase::IsUsedForEditing()` (`src/common/textcmn.cpp:136-140`;
|
|
||||||
`src/common/textentrycmn.cpp:441-509`; `src/common/spinctrlcmn.cpp:160-167`;
|
|
||||||
`src/msw/combobox.cpp:389-395`, `src/gtk/combobox.cpp:205-211`), and the GTK accelerator walk now
|
|
||||||
consults it (`src/gtk/window.cpp:1524-1539`). Orca's topbar menus are popups whose accelerators are
|
|
||||||
display-only and Orca dispatches its own shortcuts, so few sites are affected; the macOS
|
|
||||||
`ObjectList` `wxAcceleratorTable` and the wxInspector table are the live ones.
|
|
||||||
Cite: `docs/changes.txt:321`; `mouse-keyboard-focus.md` §Accelerators.
|
|
||||||
|
|
||||||
## 10 Migration already done in Orca
|
|
||||||
|
|
||||||
The upgrade landed as 8248b06337 ("Updated wxWidgets to 3.3.2", #12941; build system 2d7e26292b) and
|
|
||||||
the pin later advanced to upstream 3.3.4. Its PR kept Orca's own MSW dark mode to avoid broader
|
|
||||||
changes; wx could then only switch at app start, so a live Orca toggle needed NppDarkMode. Each row is
|
|
||||||
a rule for new code; the owning file has the detail.
|
|
||||||
|
|
||||||
| Commit | Rule for new code | Where | Owner |
|
| Commit | Rule for new code | Where | Owner |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
- release/*
|
- release/*
|
||||||
|
- belt-printer
|
||||||
paths:
|
paths:
|
||||||
- 'deps/**'
|
- 'deps/**'
|
||||||
- 'src/**'
|
- 'src/**'
|
||||||
@@ -261,6 +262,9 @@ jobs:
|
|||||||
date:
|
date:
|
||||||
ver:
|
ver:
|
||||||
ver_pure:
|
ver_pure:
|
||||||
|
# Belt-printer nightlies share the main nightly release but carry a `_belt`
|
||||||
|
# suffix so they never overwrite the main assets.
|
||||||
|
nightly_suffix: ${{ github.ref == 'refs/heads/belt-printer' && '_belt' || '' }}
|
||||||
steps:
|
steps:
|
||||||
- name: "Remove unneeded stuff to free disk space"
|
- name: "Remove unneeded stuff to free disk space"
|
||||||
run:
|
run:
|
||||||
@@ -435,13 +439,13 @@ jobs:
|
|||||||
name: OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak
|
name: OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak
|
||||||
path: '/__w/OrcaSlicer/OrcaSlicer/OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak'
|
path: '/__w/OrcaSlicer/OrcaSlicer/OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak'
|
||||||
- name: Deploy Flatpak to nightly release
|
- name: Deploy Flatpak to nightly release
|
||||||
if: github.repository == 'OrcaSlicer/OrcaSlicer' && github.ref == 'refs/heads/main'
|
if: github.repository == 'OrcaSlicer/OrcaSlicer' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/belt-printer')
|
||||||
uses: WebFreak001/deploy-nightly@v3.2.0
|
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||||
with:
|
with:
|
||||||
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||||
release_id: 137995723
|
release_id: 137995723
|
||||||
asset_path: /__w/OrcaSlicer/OrcaSlicer/OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak
|
asset_path: /__w/OrcaSlicer/OrcaSlicer/OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak
|
||||||
asset_name: OrcaSlicer-Linux-flatpak_nightly_${{ matrix.variant.arch }}.flatpak
|
asset_name: OrcaSlicer-Linux-flatpak_nightly${{ env.nightly_suffix }}_${{ matrix.variant.arch }}.flatpak
|
||||||
asset_content_type: application/octet-stream
|
asset_content_type: application/octet-stream
|
||||||
max_releases: 1 # optional, if there are more releases than this matching the asset_name, the oldest ones are going to be deleted
|
max_releases: 1 # optional, if there are more releases than this matching the asset_name, the oldest ones are going to be deleted
|
||||||
# The asset is /app (the exes link it at runtime) plus the build tree
|
# The asset is /app (the exes link it at runtime) plus the build tree
|
||||||
|
|||||||
@@ -33,6 +33,11 @@ jobs:
|
|||||||
ubuntu-ver: '2404'
|
ubuntu-ver: '2404'
|
||||||
ubuntu-ver-str: '_Ubuntu2404'
|
ubuntu-ver-str: '_Ubuntu2404'
|
||||||
ORCA_UPDATER_SIG_KEY: ${{ secrets.ORCA_UPDATER_SIG_KEY }}
|
ORCA_UPDATER_SIG_KEY: ${{ secrets.ORCA_UPDATER_SIG_KEY }}
|
||||||
|
# Branches whose builds are published to the nightly release. The
|
||||||
|
# belt-printer branch ships alongside main but its assets carry a `_belt`
|
||||||
|
# suffix (nightly_suffix) so they never overwrite the main nightly assets.
|
||||||
|
deploy_nightly: ${{ github.ref == 'refs/heads/main' || github.ref == 'refs/heads/belt-printer' }}
|
||||||
|
nightly_suffix: ${{ github.ref == 'refs/heads/belt-printer' && '_belt' || '' }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
@@ -255,7 +260,7 @@ jobs:
|
|||||||
|
|
||||||
# Thanks to RaySajuuk, it's working now
|
# Thanks to RaySajuuk, it's working now
|
||||||
- name: Sign app and notary
|
- name: Sign app and notary
|
||||||
if: github.repository == 'OrcaSlicer/OrcaSlicer' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/')) && runner.os == 'macOS' && inputs.macos-combine-only
|
if: github.repository == 'OrcaSlicer/OrcaSlicer' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/belt-printer' || startsWith(github.ref, 'refs/heads/release/')) && runner.os == 'macOS' && inputs.macos-combine-only
|
||||||
timeout-minutes: 30
|
timeout-minutes: 30
|
||||||
working-directory: ${{ github.workspace }}
|
working-directory: ${{ github.workspace }}
|
||||||
env:
|
env:
|
||||||
@@ -343,7 +348,7 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Create DMG without notary
|
- name: Create DMG without notary
|
||||||
if: github.ref != 'refs/heads/main' && runner.os == 'macOS' && inputs.macos-combine-only
|
if: github.ref != 'refs/heads/main' && github.ref != 'refs/heads/belt-printer' && runner.os == 'macOS' && inputs.macos-combine-only
|
||||||
working-directory: ${{ github.workspace }}
|
working-directory: ${{ github.workspace }}
|
||||||
run: |
|
run: |
|
||||||
# Load the `retry` helper (retries flaky commands such as `hdiutil create`).
|
# Load the `retry` helper (retries flaky commands such as `hdiutil create`).
|
||||||
@@ -389,13 +394,13 @@ jobs:
|
|||||||
if-no-files-found: ignore
|
if-no-files-found: ignore
|
||||||
|
|
||||||
- name: Deploy Mac release
|
- name: Deploy Mac release
|
||||||
if: github.repository == 'OrcaSlicer/OrcaSlicer' && github.ref == 'refs/heads/main' && runner.os == 'macOS' && inputs.macos-combine-only && !vars.SELF_HOSTED
|
if: github.repository == 'OrcaSlicer/OrcaSlicer' && env.deploy_nightly == 'true' && runner.os == 'macOS' && inputs.macos-combine-only && !vars.SELF_HOSTED
|
||||||
uses: WebFreak001/deploy-nightly@v3.2.0
|
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||||
with:
|
with:
|
||||||
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||||
release_id: 137995723
|
release_id: 137995723
|
||||||
asset_path: ${{ github.workspace }}/OrcaSlicer_Mac_universal_${{ env.ver }}.dmg
|
asset_path: ${{ github.workspace }}/OrcaSlicer_Mac_universal_${{ env.ver }}.dmg
|
||||||
asset_name: OrcaSlicer_Mac_universal_nightly.dmg
|
asset_name: OrcaSlicer_Mac_universal_nightly${{ env.nightly_suffix }}.dmg
|
||||||
asset_content_type: application/octet-stream
|
asset_content_type: application/octet-stream
|
||||||
max_releases: 1 # optional, if there are more releases than this matching the asset_name, the oldest ones are going to be deleted
|
max_releases: 1 # optional, if there are more releases than this matching the asset_name, the oldest ones are going to be deleted
|
||||||
|
|
||||||
@@ -538,24 +543,24 @@ jobs:
|
|||||||
path: ${{ github.workspace }}/build/src/Release/OrcaSlicer_profile_validator.exe
|
path: ${{ github.workspace }}/build/src/Release/OrcaSlicer_profile_validator.exe
|
||||||
|
|
||||||
- name: Deploy Windows release portable
|
- name: Deploy Windows release portable
|
||||||
if: github.repository == 'OrcaSlicer/OrcaSlicer' && github.ref == 'refs/heads/main' && runner.os == 'Windows' && !vars.SELF_HOSTED
|
if: github.repository == 'OrcaSlicer/OrcaSlicer' && env.deploy_nightly == 'true' && runner.os == 'Windows' && !vars.SELF_HOSTED
|
||||||
uses: WebFreak001/deploy-nightly@v3.2.0
|
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||||
with:
|
with:
|
||||||
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||||
release_id: 137995723
|
release_id: 137995723
|
||||||
asset_path: ${{ github.workspace }}/${{ env.BUILD_DIR }}/OrcaSlicer_Windows_${{ env.ver }}${{ env.ARCH_SUFFIX }}_portable.zip
|
asset_path: ${{ github.workspace }}/${{ env.BUILD_DIR }}/OrcaSlicer_Windows_${{ env.ver }}${{ env.ARCH_SUFFIX }}_portable.zip
|
||||||
asset_name: OrcaSlicer_Windows${{ env.ARCH_SUFFIX }}_nightly_portable.zip
|
asset_name: OrcaSlicer_Windows${{ env.ARCH_SUFFIX }}_nightly${{ env.nightly_suffix }}_portable.zip
|
||||||
asset_content_type: application/x-zip-compressed
|
asset_content_type: application/x-zip-compressed
|
||||||
max_releases: 1
|
max_releases: 1
|
||||||
|
|
||||||
- name: Deploy Windows release installer
|
- name: Deploy Windows release installer
|
||||||
if: github.repository == 'OrcaSlicer/OrcaSlicer' && github.ref == 'refs/heads/main' && runner.os == 'Windows' && !vars.SELF_HOSTED
|
if: github.repository == 'OrcaSlicer/OrcaSlicer' && env.deploy_nightly == 'true' && runner.os == 'Windows' && !vars.SELF_HOSTED
|
||||||
uses: WebFreak001/deploy-nightly@v3.2.0
|
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||||
with:
|
with:
|
||||||
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||||
release_id: 137995723
|
release_id: 137995723
|
||||||
asset_path: ${{ github.workspace }}/${{ env.BUILD_DIR }}/OrcaSlicer_Windows_Installer_${{ env.ver }}${{ env.ARCH_SUFFIX }}.exe
|
asset_path: ${{ github.workspace }}/${{ env.BUILD_DIR }}/OrcaSlicer_Windows_Installer_${{ env.ver }}${{ env.ARCH_SUFFIX }}.exe
|
||||||
asset_name: OrcaSlicer_Windows_Installer${{ env.ARCH_SUFFIX }}_nightly.exe
|
asset_name: OrcaSlicer_Windows_Installer${{ env.ARCH_SUFFIX }}_nightly${{ env.nightly_suffix }}.exe
|
||||||
asset_content_type: application/x-msdownload
|
asset_content_type: application/x-msdownload
|
||||||
max_releases: 1
|
max_releases: 1
|
||||||
|
|
||||||
@@ -696,20 +701,23 @@ jobs:
|
|||||||
path: './build/src/dev-utils/Release/generate_system_cache'
|
path: './build/src/dev-utils/Release/generate_system_cache'
|
||||||
|
|
||||||
- name: Deploy Ubuntu release
|
- name: Deploy Ubuntu release
|
||||||
if: ${{ github.repository == 'OrcaSlicer/OrcaSlicer' && ! env.ACT && github.ref == 'refs/heads/main' && runner.os == 'Linux' && !vars.SELF_HOSTED }}
|
if: ${{ github.repository == 'OrcaSlicer/OrcaSlicer' && ! env.ACT && env.deploy_nightly == 'true' && runner.os == 'Linux' && !vars.SELF_HOSTED }}
|
||||||
uses: WebFreak001/deploy-nightly@v3.2.0
|
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||||
with:
|
with:
|
||||||
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||||
release_id: 137995723
|
release_id: 137995723
|
||||||
asset_path: ./build/OrcaSlicer_Linux_AppImage${{ env.ubuntu-ver-str }}${{ env.arch_suffix }}_${{ env.ver }}.AppImage
|
asset_path: ./build/OrcaSlicer_Linux_AppImage${{ env.ubuntu-ver-str }}${{ env.arch_suffix }}_${{ env.ver }}.AppImage
|
||||||
asset_name: OrcaSlicer_Linux_AppImage${{ env.ubuntu-ver-str }}${{ env.arch_suffix }}_nightly.AppImage
|
asset_name: OrcaSlicer_Linux_AppImage${{ env.ubuntu-ver-str }}${{ env.arch_suffix }}_nightly${{ env.nightly_suffix }}.AppImage
|
||||||
asset_content_type: application/octet-stream
|
asset_content_type: application/octet-stream
|
||||||
max_releases: 1 # optional, if there are more releases than this matching the asset_name, the oldest ones are going to be deleted
|
max_releases: 1 # optional, if there are more releases than this matching the asset_name, the oldest ones are going to be deleted
|
||||||
- name: Deploy Ubuntu release
|
- name: Deploy Ubuntu release
|
||||||
if: ${{ github.repository == 'OrcaSlicer/OrcaSlicer' && ! env.ACT && github.ref == 'refs/heads/main' && runner.os == 'Linux' && !vars.SELF_HOSTED && inputs.arch != 'aarch64' }}
|
if: ${{ github.repository == 'OrcaSlicer/OrcaSlicer' && ! env.ACT && github.ref == 'refs/heads/main' && runner.os == 'Linux' && !vars.SELF_HOSTED && inputs.arch != 'aarch64' }}
|
||||||
run: |
|
uses: rickstaa/action-create-tag@v1
|
||||||
git -c user.name="${GITHUB_ACTOR}" -c user.email="${GITHUB_ACTOR}@users.noreply.github.com" tag -f -a nightly-builds "${GITHUB_SHA}" -m nightly-builds
|
with:
|
||||||
git push -f origin refs/tags/nightly-builds
|
tag: "nightly-builds"
|
||||||
|
tag_exists_error: false
|
||||||
|
force_push_tag: true
|
||||||
|
message: "nightly-builds"
|
||||||
|
|
||||||
- name: Deploy Ubuntu OrcaSlicer_profile_validator release
|
- name: Deploy Ubuntu OrcaSlicer_profile_validator release
|
||||||
if: ${{ github.repository == 'OrcaSlicer/OrcaSlicer' && ! env.ACT && github.ref == 'refs/heads/main' && runner.os == 'Linux' && !vars.SELF_HOSTED && inputs.arch != 'aarch64' }}
|
if: ${{ github.repository == 'OrcaSlicer/OrcaSlicer' && ! env.ACT && github.ref == 'refs/heads/main' && runner.os == 'Linux' && !vars.SELF_HOSTED && inputs.arch != 'aarch64' }}
|
||||||
|
|||||||
@@ -74,26 +74,12 @@ jobs:
|
|||||||
set +e
|
set +e
|
||||||
./OrcaSlicer_profile_validator -p ${{ github.workspace }}/resources/profiles -l 2 2>&1 | tee ${{ runner.temp }}/validate_system.log
|
./OrcaSlicer_profile_validator -p ${{ github.workspace }}/resources/profiles -l 2 2>&1 | tee ${{ runner.temp }}/validate_system.log
|
||||||
exit ${PIPESTATUS[0]}
|
exit ${PIPESTATUS[0]}
|
||||||
# The validator above is the nightly build of main, so it cannot slice profiles that use
|
|
||||||
# settings a PR adds to the engine: it reports their placeholders as undefined. A PR that
|
|
||||||
# changes src/ also runs Build all, whose Slice check runs this same sweep with the
|
|
||||||
# validator built from the PR, so the sweep below only runs for the other PRs.
|
|
||||||
- name: Detect engine changes
|
|
||||||
id: engine_changes
|
|
||||||
if: ${{ github.event_name == 'pull_request' }}
|
|
||||||
run: |
|
|
||||||
base=${{ github.event.pull_request.base.sha }}
|
|
||||||
if git fetch --no-tags --depth=1 origin "$base" && ! git diff --quiet "$base" HEAD -- src/; then
|
|
||||||
echo "changed=true" >> "$GITHUB_OUTPUT"
|
|
||||||
echo "::notice::This PR changes src/, so Build all's Slice check slices the profiles with the PR-built validator."
|
|
||||||
fi
|
|
||||||
# Slice a two-colour cube through every printer, and through every system process/filament whose
|
# Slice a two-colour cube through every printer, and through every system process/filament whose
|
||||||
# templates no printer's own slice reaches, so every custom g-code and filename_format shipped is
|
# templates no printer's own slice reaches, so every custom g-code and filename_format shipped is
|
||||||
# expanded (names in {if} branches not taken included) - catches undefined-placeholder /
|
# expanded (names in {if} branches not taken included) - catches undefined-placeholder /
|
||||||
# invalid-flow bugs the static checks above cannot see.
|
# invalid-flow bugs the static checks above cannot see.
|
||||||
- name: validate slice (expand custom g-code)
|
- name: validate slice (expand custom g-code)
|
||||||
id: validate_slice
|
id: validate_slice
|
||||||
if: ${{ steps.engine_changes.outputs.changed != 'true' }}
|
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
run: |
|
run: |
|
||||||
set +e
|
set +e
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y --no-install-recommends \
|
sudo apt-get install -y --no-install-recommends \
|
||||||
libopengl0 libgl1 libegl1 libwebkit2gtk-4.1-0
|
libopengl0 libglu1-mesa libgl1 libegl1 libwebkit2gtk-4.1-0
|
||||||
|
|
||||||
- uses: actions/setup-python@v6
|
- uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
@@ -224,7 +224,7 @@ jobs:
|
|||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install -y --no-install-recommends \
|
sudo apt-get install -y --no-install-recommends \
|
||||||
xvfb xdotool imagemagick openbox mesa-utils \
|
xvfb xdotool imagemagick openbox mesa-utils \
|
||||||
libopengl0 libgl1 libegl1 libwebkit2gtk-4.1-0
|
libopengl0 libglu1-mesa libgl1 libegl1 libwebkit2gtk-4.1-0
|
||||||
|
|
||||||
- name: Run the parity harness
|
- name: Run the parity harness
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -1084,10 +1084,10 @@ endif ()
|
|||||||
|
|
||||||
find_path(SPNAV_INCLUDE_DIR spnav.h)
|
find_path(SPNAV_INCLUDE_DIR spnav.h)
|
||||||
if (SPNAV_INCLUDE_DIR)
|
if (SPNAV_INCLUDE_DIR)
|
||||||
find_library(SPNAV_LIB NAMES libspnav.a spnav)
|
find_library(SPNAV_LIB NAMES libspnav.a) # Force linking libspnav statically
|
||||||
if (SPNAV_LIB)
|
if (SPNAV_LIB)
|
||||||
add_definitions(-DHAVE_SPNAV)
|
add_definitions(-DHAVE_SPNAV)
|
||||||
message(STATUS "SPNAV library found: ${SPNAV_LIB}")
|
message(STATUS "SPNAV library found")
|
||||||
else()
|
else()
|
||||||
message(STATUS "SPNAV library NOT found, Spacenavd not supported")
|
message(STATUS "SPNAV library NOT found, Spacenavd not supported")
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -68,10 +68,6 @@ If you come across any of these in search results, please <b>report them</b> as
|
|||||||
Regular updates fueled by continuous community contributions.
|
Regular updates fueled by continuous community contributions.
|
||||||
- **Wide Printer Compatibility**
|
- **Wide Printer Compatibility**
|
||||||
Supports a broad range of printers: Bambu Lab, Prusa, Creality, Voron, and more.
|
Supports a broad range of printers: Bambu Lab, Prusa, Creality, Voron, and more.
|
||||||
- **[Belt Printer Support](https://www.orcaslicer.com/wiki/belt_printing)**
|
|
||||||
Slice for belt / conveyor (infinite-Z) printers, with belt-aware supports and a tilted-bed preview. Contributed by [Joseph Robertson (@HarrierPigeon)](https://github.com/HarrierPigeon).
|
|
||||||
- **[IDEX/IQEX Parallel Printing Support](https://www.orcaslicer.com/wiki/idex_iqex_parallel_printing)**
|
|
||||||
Print copies or mirror images of a part on every carriage of an IDEX or IQEX printer at once, with the mode chosen per plate and nozzle clearance zones shown on the bed. Contributed by [Clifford (@cgarwood82)](https://github.com/cgarwood82).
|
|
||||||
- Additional features can be found in the [change notes](https://github.com/OrcaSlicer/OrcaSlicer/releases/).
|
- Additional features can be found in the [change notes](https://github.com/OrcaSlicer/OrcaSlicer/releases/).
|
||||||
|
|
||||||
# Wiki
|
# Wiki
|
||||||
@@ -93,6 +89,17 @@ Visit our GitHub Releases page for the latest stable version of OrcaSlicer, reco
|
|||||||
🌙 **[Download the Latest Nightly Build](https://github.com/OrcaSlicer/OrcaSlicer/releases/tag/nightly-builds)**
|
🌙 **[Download the Latest Nightly Build](https://github.com/OrcaSlicer/OrcaSlicer/releases/tag/nightly-builds)**
|
||||||
Explore the latest developments in OrcaSlicer with our nightly builds. Feedback on these versions is highly appreciated.
|
Explore the latest developments in OrcaSlicer with our nightly builds. Feedback on these versions is highly appreciated.
|
||||||
|
|
||||||
|
### Belt Printer Builds
|
||||||
|
|
||||||
|
The [nightly release](https://github.com/OrcaSlicer/OrcaSlicer/releases/tag/nightly-builds) ships **two parallel builds**: the standard build and a belt-printer build. Both are attached to the same release — tell them apart by the filename suffix:
|
||||||
|
|
||||||
|
- **Standard** — no suffix (e.g. `OrcaSlicer_Windows_Installer_x64_nightly.exe`)
|
||||||
|
- **Belt** — `_belt` suffix (e.g. `OrcaSlicer_Windows_Installer_x64_nightly_belt.exe`)
|
||||||
|
|
||||||
|
The `_belt` builds add **experimental support for belt / conveyor (infinite-Z) printers**, where the model is sliced against a tilted belt surface instead of a flat horizontal bed. They include ready-to-use belt printer profiles, the full belt slicing pipeline (mesh rotation and G-code transforms), belt-aware support generation, and a tilted-bed preview.
|
||||||
|
|
||||||
|
> ⚠️ Belt printer support is under active development and is **not yet merged into `main`** — it currently ships only in these parallel `_belt` builds, produced from the [`belt-printer`](https://github.com/OrcaSlicer/OrcaSlicer/tree/belt-printer) branch. See tracking PR [#14394](https://github.com/OrcaSlicer/OrcaSlicer/pull/14394) and the original documentation in [#12998](https://github.com/OrcaSlicer/OrcaSlicer/pull/12998).
|
||||||
|
|
||||||
# How to install
|
# How to install
|
||||||
|
|
||||||
## Windows
|
## Windows
|
||||||
|
|||||||
@@ -8,10 +8,9 @@ SCRIPT_PATH=$(dirname "$(readlink -f "${0}")")
|
|||||||
pushd "${SCRIPT_PATH}" > /dev/null
|
pushd "${SCRIPT_PATH}" > /dev/null
|
||||||
|
|
||||||
function usage() {
|
function usage() {
|
||||||
echo "Usage: ./${SCRIPT_NAME} [-1][-b][-c][-d][-D][-e][-F][-g][-h][-i][-j N][-J N][-p][-r][-s][-t][-u][-l][-L]"
|
echo "Usage: ./${SCRIPT_NAME} [-1][-b][-c][-d][-D][-e][-F][-g][-h][-i][-j N][-p][-r][-s][-t][-u][-l][-L]"
|
||||||
echo " -1: limit builds to one core (where possible)"
|
echo " -1: limit builds to one core (where possible)"
|
||||||
echo " -j N: limit builds to N cores (where possible)"
|
echo " -j N: limit builds to N cores (where possible)"
|
||||||
echo " -J N: build up to N dependencies at a time, each still using -j jobs (default: 1)"
|
|
||||||
echo " -b: build in Debug mode"
|
echo " -b: build in Debug mode"
|
||||||
echo " -c: force a clean build"
|
echo " -c: force a clean build"
|
||||||
echo " -C: enable ANSI-colored compile output (GNU/Clang only)"
|
echo " -C: enable ANSI-colored compile output (GNU/Clang only)"
|
||||||
@@ -37,13 +36,12 @@ function usage() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SLIC3R_PRECOMPILED_HEADERS="ON"
|
SLIC3R_PRECOMPILED_HEADERS="ON"
|
||||||
DEPS_PARALLEL=""
|
|
||||||
|
|
||||||
unset name
|
unset name
|
||||||
BUILD_DIR=build
|
BUILD_DIR=build
|
||||||
BUILD_CONFIG=Release
|
BUILD_CONFIG=Release
|
||||||
FORWARDED_ARGS=()
|
FORWARDED_ARGS=()
|
||||||
while getopts ":1j:J:bcCdDeFghiprstulL" opt ; do
|
while getopts ":1j:bcCdDeFghiprstulL" opt ; do
|
||||||
case ${opt} in
|
case ${opt} in
|
||||||
1 )
|
1 )
|
||||||
export CMAKE_BUILD_PARALLEL_LEVEL=1
|
export CMAKE_BUILD_PARALLEL_LEVEL=1
|
||||||
@@ -53,10 +51,6 @@ while getopts ":1j:J:bcCdDeFghiprstulL" opt ; do
|
|||||||
export CMAKE_BUILD_PARALLEL_LEVEL=$OPTARG
|
export CMAKE_BUILD_PARALLEL_LEVEL=$OPTARG
|
||||||
FORWARDED_ARGS+=("-j" "$OPTARG")
|
FORWARDED_ARGS+=("-j" "$OPTARG")
|
||||||
;;
|
;;
|
||||||
J )
|
|
||||||
DEPS_PARALLEL=$OPTARG
|
|
||||||
FORWARDED_ARGS+=("-J" "$OPTARG")
|
|
||||||
;;
|
|
||||||
b )
|
b )
|
||||||
BUILD_DIR=build-dbg
|
BUILD_DIR=build-dbg
|
||||||
BUILD_CONFIG=Debug
|
BUILD_CONFIG=Debug
|
||||||
@@ -141,11 +135,6 @@ if [[ -n "${CLEAN_DOCKER_IMAGE}" ]] && [[ -z "${USE_DOCKER}" ]] ; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -n "${DEPS_PARALLEL}" ]] && ! [[ "${DEPS_PARALLEL}" =~ ^[1-9][0-9]*$ ]] ; then
|
|
||||||
echo "Error: -J expects a positive integer."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
function check_available_memory_and_disk() {
|
function check_available_memory_and_disk() {
|
||||||
FREE_MEM_GB=$(free --gibi --total | grep 'Mem' | rev | cut --delimiter=" " --fields=1 | rev)
|
FREE_MEM_GB=$(free --gibi --total | grep 'Mem' | rev | cut --delimiter=" " --fields=1 | rev)
|
||||||
MIN_MEM_GB=10
|
MIN_MEM_GB=10
|
||||||
@@ -548,29 +537,7 @@ if [[ -n "${BUILD_DEPS}" ]] ; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
print_and_run cmake -S deps -B deps/$BUILD_DIR "${CMAKE_C_CXX_COMPILER_CLANG[@]}" "${CMAKE_LLD_LINKER_ARGS[@]}" "${CMAKE_CCACHE_ARGS[@]}" -G Ninja "${COLORED_OUTPUT}" "${BUILD_ARGS[@]}"
|
print_and_run cmake -S deps -B deps/$BUILD_DIR "${CMAKE_C_CXX_COMPILER_CLANG[@]}" "${CMAKE_LLD_LINKER_ARGS[@]}" "${CMAKE_CCACHE_ARGS[@]}" -G Ninja "${COLORED_OUTPUT}" "${BUILD_ARGS[@]}"
|
||||||
# The top-level build runs one dependency at a time by default, which keeps the console
|
print_and_run cmake --build deps/$BUILD_DIR -j1
|
||||||
# output readable and lets that dependency's own build use all of CMAKE_BUILD_PARALLEL_LEVEL.
|
|
||||||
# -J raises the top level instead, and -j still applies in full to every dependency, so the
|
|
||||||
# worst case is -J times -j compile jobs at once. Ninja has no job server to share a pool
|
|
||||||
# across the nested builds, so that ceiling is not enforced anywhere: pick -J to suit the RAM.
|
|
||||||
DEPS_JOBS=1
|
|
||||||
if [[ -n "${DEPS_PARALLEL}" ]] ; then
|
|
||||||
DEPS_JOBS=${DEPS_PARALLEL}
|
|
||||||
SAVED_PARALLEL_LEVEL=${CMAKE_BUILD_PARALLEL_LEVEL-}
|
|
||||||
export CMAKE_BUILD_PARALLEL_LEVEL=${CMAKE_BUILD_PARALLEL_LEVEL:-$(nproc)}
|
|
||||||
echo "Building up to ${DEPS_JOBS} dependencies at a time, ${CMAKE_BUILD_PARALLEL_LEVEL} jobs each: up to $(( DEPS_JOBS * CMAKE_BUILD_PARALLEL_LEVEL )) compile jobs at once."
|
|
||||||
fi
|
|
||||||
|
|
||||||
print_and_run cmake --build deps/$BUILD_DIR -j"${DEPS_JOBS}"
|
|
||||||
|
|
||||||
if [[ -n "${DEPS_PARALLEL}" ]] ; then
|
|
||||||
# Give the whole -j back to the OrcaSlicer build below.
|
|
||||||
if [[ -n "${SAVED_PARALLEL_LEVEL}" ]] ; then
|
|
||||||
export CMAKE_BUILD_PARALLEL_LEVEL=${SAVED_PARALLEL_LEVEL}
|
|
||||||
else
|
|
||||||
unset CMAKE_BUILD_PARALLEL_LEVEL
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -n "${BUILD_ORCA}" ]] || [[ -n "${BUILD_TESTS}" ]] ; then
|
if [[ -n "${BUILD_ORCA}" ]] || [[ -n "${BUILD_TESTS}" ]] ; then
|
||||||
|
|||||||
@@ -104,8 +104,8 @@ fi
|
|||||||
|
|
||||||
CMAKE_VERSION=$(cmake --version | head -1 | sed 's/[^0-9]*\([0-9]*\).*/\1/')
|
CMAKE_VERSION=$(cmake --version | head -1 | sed 's/[^0-9]*\([0-9]*\).*/\1/')
|
||||||
if [ "$CMAKE_VERSION" -ge 4 ] 2>/dev/null; then
|
if [ "$CMAKE_VERSION" -ge 4 ] 2>/dev/null; then
|
||||||
export CMAKE_POLICY_VERSION_MINIMUM=3.10
|
export CMAKE_POLICY_VERSION_MINIMUM=3.5
|
||||||
export CMAKE_POLICY_COMPAT="-DCMAKE_POLICY_VERSION_MINIMUM=3.10"
|
export CMAKE_POLICY_COMPAT="-DCMAKE_POLICY_VERSION_MINIMUM=3.5"
|
||||||
echo "Detected CMake 4.x, adding compatibility flag (env + cmake arg)"
|
echo "Detected CMake 4.x, adding compatibility flag (env + cmake arg)"
|
||||||
else
|
else
|
||||||
export CMAKE_POLICY_COMPAT=""
|
export CMAKE_POLICY_COMPAT=""
|
||||||
|
|||||||
@@ -0,0 +1,359 @@
|
|||||||
|
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||||
|
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||||
|
|
||||||
|
# PrusaSlicer specifics:
|
||||||
|
# This file is backported from CMake 3.15 distribution to behave uniformly
|
||||||
|
# across all versions of CMake. It explicitly adds GLEW_STATIC compile
|
||||||
|
# definition to static targets which is needed to prevent link errors.
|
||||||
|
|
||||||
|
#[=======================================================================[.rst:
|
||||||
|
FindGLEW
|
||||||
|
--------
|
||||||
|
|
||||||
|
Find the OpenGL Extension Wrangler Library (GLEW)
|
||||||
|
|
||||||
|
Input Variables
|
||||||
|
^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
The following variables may be set to influence this module’s behavior:
|
||||||
|
|
||||||
|
``GLEW_USE_STATIC_LIBS``
|
||||||
|
to find and create :prop_tgt:`IMPORTED` target for static linkage.
|
||||||
|
|
||||||
|
``GLEW_VERBOSE``
|
||||||
|
to output a detailed log of this module.
|
||||||
|
|
||||||
|
Imported Targets
|
||||||
|
^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
This module defines the following :ref:`Imported Targets <Imported Targets>`:
|
||||||
|
|
||||||
|
|
||||||
|
``GLEW::glew``
|
||||||
|
The GLEW shared library.
|
||||||
|
``GLEW::glew_s``
|
||||||
|
The GLEW static library, if ``GLEW_USE_STATIC_LIBS`` is set to ``TRUE``.
|
||||||
|
``GLEW::GLEW``
|
||||||
|
Duplicates either ``GLEW::glew`` or ``GLEW::glew_s`` based on availability.
|
||||||
|
|
||||||
|
Result Variables
|
||||||
|
^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
This module defines the following variables:
|
||||||
|
|
||||||
|
``GLEW_INCLUDE_DIRS``
|
||||||
|
include directories for GLEW
|
||||||
|
``GLEW_LIBRARIES``
|
||||||
|
libraries to link against GLEW
|
||||||
|
``GLEW_SHARED_LIBRARIES``
|
||||||
|
libraries to link against shared GLEW
|
||||||
|
``GLEW_STATIC_LIBRARIES``
|
||||||
|
libraries to link against static GLEW
|
||||||
|
``GLEW_FOUND``
|
||||||
|
true if GLEW has been found and can be used
|
||||||
|
``GLEW_VERSION``
|
||||||
|
GLEW version
|
||||||
|
``GLEW_VERSION_MAJOR``
|
||||||
|
GLEW major version
|
||||||
|
``GLEW_VERSION_MINOR``
|
||||||
|
GLEW minor version
|
||||||
|
``GLEW_VERSION_MICRO``
|
||||||
|
GLEW micro version
|
||||||
|
|
||||||
|
#]=======================================================================]
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
|
||||||
|
|
||||||
|
if(APPLE)
|
||||||
|
find_package(OpenGL QUIET)
|
||||||
|
|
||||||
|
if(OpenGL_FOUND)
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
message(STATUS "FindGLEW: Found OpenGL Framework.")
|
||||||
|
message(STATUS "FindGLEW: OPENGL_LIBRARIES: ${OPENGL_LIBRARIES}")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
message(STATUS "FindGLEW: could not find GLEW library.")
|
||||||
|
endif()
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
function(__glew_set_find_library_suffix shared_or_static)
|
||||||
|
if((UNIX AND NOT APPLE) AND "${shared_or_static}" MATCHES "SHARED")
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".so")
|
||||||
|
elseif((UNIX AND NOT APPLE) AND "${shared_or_static}" MATCHES "STATIC")
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
||||||
|
elseif(APPLE AND "${shared_or_static}" MATCHES "SHARED")
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib;.so")
|
||||||
|
elseif(APPLE AND "${shared_or_static}" MATCHES "STATIC")
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
||||||
|
elseif(WIN32 AND "${shared_or_static}" MATCHES "SHARED")
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib")
|
||||||
|
elseif(WIN32 AND "${shared_or_static}" MATCHES "STATIC")
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib;.a;.dll.a")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES "${CMAKE_FIND_LIBRARY_SUFFIXES}" PARENT_SCOPE)
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
message(STATUS "FindGLEW: CMAKE_FIND_LIBRARY_SUFFIXES for ${shared_or_static}: ${CMAKE_FIND_LIBRARY_SUFFIXES}")
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
if(DEFINED GLEW_USE_STATIC_LIBS)
|
||||||
|
message(STATUS "FindGLEW: GLEW_USE_STATIC_LIBS: ${GLEW_USE_STATIC_LIBS}.")
|
||||||
|
else()
|
||||||
|
message(STATUS "FindGLEW: GLEW_USE_STATIC_LIBS is undefined. Treated as FALSE.")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_path(GLEW_INCLUDE_DIR GL/glew.h)
|
||||||
|
mark_as_advanced(GLEW_INCLUDE_DIR)
|
||||||
|
|
||||||
|
set(GLEW_INCLUDE_DIRS ${GLEW_INCLUDE_DIR})
|
||||||
|
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
message(STATUS "FindGLEW: GLEW_INCLUDE_DIR: ${GLEW_INCLUDE_DIR}")
|
||||||
|
message(STATUS "FindGLEW: GLEW_INCLUDE_DIRS: ${GLEW_INCLUDE_DIRS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if("${CMAKE_GENERATOR_PLATFORM}" MATCHES "x64" OR "${CMAKE_GENERATOR}" MATCHES "Win64")
|
||||||
|
set(_arch "x64")
|
||||||
|
elseif("${CMAKE_GENERATOR_PLATFORM}" MATCHES "ARM64")
|
||||||
|
set(_arch "x64") # GLEW ships one header set; ARM64 uses the x64 import path
|
||||||
|
else()
|
||||||
|
set(_arch "Win32")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
set(__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||||
|
|
||||||
|
__glew_set_find_library_suffix(SHARED)
|
||||||
|
|
||||||
|
find_library(GLEW_SHARED_LIBRARY_RELEASE
|
||||||
|
NAMES GLEW glew glew32
|
||||||
|
PATH_SUFFIXES lib lib64 libx32 lib/Release/${_arch}
|
||||||
|
PATHS ENV GLEW_ROOT)
|
||||||
|
|
||||||
|
find_library(GLEW_SHARED_LIBRARY_DEBUG
|
||||||
|
NAMES GLEWd glewd glew32d
|
||||||
|
PATH_SUFFIXES lib lib64
|
||||||
|
PATHS ENV GLEW_ROOT)
|
||||||
|
|
||||||
|
|
||||||
|
__glew_set_find_library_suffix(STATIC)
|
||||||
|
|
||||||
|
find_library(GLEW_STATIC_LIBRARY_RELEASE
|
||||||
|
NAMES GLEW glew glew32s
|
||||||
|
PATH_SUFFIXES lib lib64 libx32 lib/Release/${_arch}
|
||||||
|
PATHS ENV GLEW_ROOT)
|
||||||
|
|
||||||
|
find_library(GLEW_STATIC_LIBRARY_DEBUG
|
||||||
|
NAMES GLEWds GLEWd glewd glewds glew32ds
|
||||||
|
PATH_SUFFIXES lib lib64
|
||||||
|
PATHS ENV GLEW_ROOT)
|
||||||
|
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ${__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES})
|
||||||
|
unset(__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES)
|
||||||
|
|
||||||
|
include(SelectLibraryConfigurations)
|
||||||
|
|
||||||
|
select_library_configurations(GLEW_SHARED)
|
||||||
|
select_library_configurations(GLEW_STATIC)
|
||||||
|
|
||||||
|
if(NOT GLEW_USE_STATIC_LIBS)
|
||||||
|
set(GLEW_LIBRARIES ${GLEW_SHARED_LIBRARY})
|
||||||
|
else()
|
||||||
|
set(GLEW_LIBRARIES ${GLEW_STATIC_LIBRARY})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
message(STATUS "FindGLEW: GLEW_SHARED_LIBRARY_RELEASE: ${GLEW_SHARED_LIBRARY_RELEASE}")
|
||||||
|
message(STATUS "FindGLEW: GLEW_STATIC_LIBRARY_RELEASE: ${GLEW_STATIC_LIBRARY_RELEASE}")
|
||||||
|
message(STATUS "FindGLEW: GLEW_SHARED_LIBRARY_DEBUG: ${GLEW_SHARED_LIBRARY_DEBUG}")
|
||||||
|
message(STATUS "FindGLEW: GLEW_STATIC_LIBRARY_DEBUG: ${GLEW_STATIC_LIBRARY_DEBUG}")
|
||||||
|
message(STATUS "FindGLEW: GLEW_SHARED_LIBRARY: ${GLEW_SHARED_LIBRARY}")
|
||||||
|
message(STATUS "FindGLEW: GLEW_STATIC_LIBRARY: ${GLEW_STATIC_LIBRARY}")
|
||||||
|
message(STATUS "FindGLEW: GLEW_LIBRARIES: ${GLEW_LIBRARIES}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
# Read version from GL/glew.h file
|
||||||
|
if(EXISTS "${GLEW_INCLUDE_DIR}/GL/glew.h")
|
||||||
|
file(STRINGS "${GLEW_INCLUDE_DIR}/GL/glew.h" _contents REGEX "^VERSION_.+ [0-9]+")
|
||||||
|
if(_contents)
|
||||||
|
string(REGEX REPLACE ".*VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" GLEW_VERSION_MAJOR "${_contents}")
|
||||||
|
string(REGEX REPLACE ".*VERSION_MINOR[ \t]+([0-9]+).*" "\\1" GLEW_VERSION_MINOR "${_contents}")
|
||||||
|
string(REGEX REPLACE ".*VERSION_MICRO[ \t]+([0-9]+).*" "\\1" GLEW_VERSION_MICRO "${_contents}")
|
||||||
|
set(GLEW_VERSION "${GLEW_VERSION_MAJOR}.${GLEW_VERSION_MINOR}.${GLEW_VERSION_MICRO}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
message(STATUS "FindGLEW: GLEW_VERSION_MAJOR: ${GLEW_VERSION_MAJOR}")
|
||||||
|
message(STATUS "FindGLEW: GLEW_VERSION_MINOR: ${GLEW_VERSION_MINOR}")
|
||||||
|
message(STATUS "FindGLEW: GLEW_VERSION_MICRO: ${GLEW_VERSION_MICRO}")
|
||||||
|
message(STATUS "FindGLEW: GLEW_VERSION: ${GLEW_VERSION}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_package_handle_standard_args(GLEW
|
||||||
|
REQUIRED_VARS GLEW_INCLUDE_DIRS GLEW_LIBRARIES
|
||||||
|
VERSION_VAR GLEW_VERSION)
|
||||||
|
|
||||||
|
if(NOT GLEW_FOUND)
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
message(STATUS "FindGLEW: could not find GLEW library.")
|
||||||
|
endif()
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
if(NOT TARGET GLEW::glew AND NOT GLEW_USE_STATIC_LIBS)
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
message(STATUS "FindGLEW: Creating GLEW::glew imported target.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_library(GLEW::glew UNKNOWN IMPORTED)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::glew
|
||||||
|
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
|
||||||
|
|
||||||
|
if(APPLE)
|
||||||
|
if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.0")
|
||||||
|
set_target_properties(GLEW::glew
|
||||||
|
PROPERTIES INTERFACE_LINK_LIBRARIES "-framework OpenGL")
|
||||||
|
else()
|
||||||
|
set_target_properties(GLEW::glew
|
||||||
|
PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(GLEW_SHARED_LIBRARY_RELEASE)
|
||||||
|
set_property(TARGET GLEW::glew
|
||||||
|
APPEND
|
||||||
|
PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::glew
|
||||||
|
PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_SHARED_LIBRARY_RELEASE}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(GLEW_SHARED_LIBRARY_DEBUG)
|
||||||
|
set_property(TARGET GLEW::glew
|
||||||
|
APPEND
|
||||||
|
PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::glew
|
||||||
|
PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_SHARED_LIBRARY_DEBUG}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
elseif(NOT TARGET GLEW::glew_s AND GLEW_USE_STATIC_LIBS)
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
message(STATUS "FindGLEW: Creating GLEW::glew_s imported target.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_library(GLEW::glew_s UNKNOWN IMPORTED)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::glew_s
|
||||||
|
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
|
||||||
|
|
||||||
|
set_target_properties(GLEW::glew_s PROPERTIES INTERFACE_COMPILE_DEFINITIONS GLEW_STATIC)
|
||||||
|
|
||||||
|
if(APPLE)
|
||||||
|
if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.0")
|
||||||
|
set_target_properties(GLEW::glew_s
|
||||||
|
PROPERTIES INTERFACE_LINK_LIBRARIES "-framework OpenGL")
|
||||||
|
else()
|
||||||
|
set_target_properties(GLEW::glew_s
|
||||||
|
PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(GLEW_STATIC_LIBRARY_RELEASE)
|
||||||
|
set_property(TARGET GLEW::glew_s
|
||||||
|
APPEND
|
||||||
|
PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::glew_s
|
||||||
|
PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_STATIC_LIBRARY_RELEASE}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(GLEW_STATIC_LIBRARY_DEBUG)
|
||||||
|
set_property(TARGET GLEW::glew_s
|
||||||
|
APPEND
|
||||||
|
PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::glew_s
|
||||||
|
PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_STATIC_LIBRARY_DEBUG}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT TARGET GLEW::GLEW)
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
message(STATUS "FindGLEW: Creating GLEW::GLEW imported target.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_library(GLEW::GLEW UNKNOWN IMPORTED)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::GLEW
|
||||||
|
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
|
||||||
|
|
||||||
|
if(APPLE)
|
||||||
|
if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.0")
|
||||||
|
set_target_properties(GLEW::GLEW
|
||||||
|
PROPERTIES INTERFACE_LINK_LIBRARIES "-framework OpenGL")
|
||||||
|
else()
|
||||||
|
set_target_properties(GLEW::GLEW
|
||||||
|
PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(TARGET GLEW::glew)
|
||||||
|
if(GLEW_SHARED_LIBRARY_RELEASE)
|
||||||
|
set_property(TARGET GLEW::GLEW
|
||||||
|
APPEND
|
||||||
|
PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::GLEW
|
||||||
|
PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_SHARED_LIBRARY_RELEASE}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(GLEW_SHARED_LIBRARY_DEBUG)
|
||||||
|
set_property(TARGET GLEW::GLEW
|
||||||
|
APPEND
|
||||||
|
PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::GLEW
|
||||||
|
PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_SHARED_LIBRARY_DEBUG}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
elseif(TARGET GLEW::glew_s)
|
||||||
|
if(GLEW_STATIC_LIBRARY_RELEASE)
|
||||||
|
set_property(TARGET GLEW::GLEW
|
||||||
|
APPEND
|
||||||
|
PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::GLEW
|
||||||
|
PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_STATIC_LIBRARY_RELEASE}"
|
||||||
|
INTERFACE_COMPILE_DEFINITIONS GLEW_STATIC)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(GLEW_STATIC_LIBRARY_DEBUG AND GLEW_USE_STATIC_LIBS)
|
||||||
|
set_property(TARGET GLEW::GLEW
|
||||||
|
APPEND
|
||||||
|
PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::GLEW
|
||||||
|
PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_STATIC_LIBRARY_DEBUG}"
|
||||||
|
INTERFACE_COMPILE_DEFINITIONS GLEW_STATIC)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
elseif(GLEW_VERBOSE)
|
||||||
|
message(WARNING "FindGLEW: no `GLEW::glew` or `GLEW::glew_s` target was created. Something went wrong in FindGLEW target creation.")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "4.0")
|
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "4.0")
|
||||||
set(CMAKE_POLICY_VERSION_MINIMUM 3.10 CACHE STRING "" FORCE)
|
set(CMAKE_POLICY_VERSION_MINIMUM 3.5 CACHE STRING "" FORCE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
#
|
#
|
||||||
@@ -24,7 +24,7 @@ endif()
|
|||||||
# therefore, unfortunately, the installation cannot be copied/moved elsewhere without re-installing wxWidgets.
|
# therefore, unfortunately, the installation cannot be copied/moved elsewhere without re-installing wxWidgets.
|
||||||
#
|
#
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.10)
|
cmake_minimum_required(VERSION 3.2)
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
# if CMAKE_OSX_DEPLOYMENT_TARGET is not set, set it to 12.0 (the lowest Xcode 27 accepts)
|
# if CMAKE_OSX_DEPLOYMENT_TARGET is not set, set it to 12.0 (the lowest Xcode 27 accepts)
|
||||||
if (NOT CMAKE_OSX_DEPLOYMENT_TARGET)
|
if (NOT CMAKE_OSX_DEPLOYMENT_TARGET)
|
||||||
@@ -224,7 +224,7 @@ if (NOT IS_CROSS_COMPILE OR NOT APPLE)
|
|||||||
${_source_dir_arg}
|
${_source_dir_arg}
|
||||||
${_gen}
|
${_gen}
|
||||||
CMAKE_ARGS
|
CMAKE_ARGS
|
||||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.10
|
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
|
||||||
-DCMAKE_INSTALL_PREFIX:STRING=${DESTDIR}
|
-DCMAKE_INSTALL_PREFIX:STRING=${DESTDIR}
|
||||||
-DCMAKE_MODULE_PATH:STRING=${PROJECT_SOURCE_DIR}/../cmake/modules
|
-DCMAKE_MODULE_PATH:STRING=${PROJECT_SOURCE_DIR}/../cmake/modules
|
||||||
-DCMAKE_PREFIX_PATH:STRING=${DESTDIR}
|
-DCMAKE_PREFIX_PATH:STRING=${DESTDIR}
|
||||||
@@ -279,7 +279,7 @@ else()
|
|||||||
${_source_dir_arg}
|
${_source_dir_arg}
|
||||||
${_gen}
|
${_gen}
|
||||||
CMAKE_ARGS
|
CMAKE_ARGS
|
||||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.10
|
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
|
||||||
-DCMAKE_INSTALL_PREFIX:STRING=${DESTDIR}
|
-DCMAKE_INSTALL_PREFIX:STRING=${DESTDIR}
|
||||||
-DCMAKE_PREFIX_PATH:STRING=${DESTDIR}
|
-DCMAKE_PREFIX_PATH:STRING=${DESTDIR}
|
||||||
-DCMAKE_IGNORE_PREFIX_PATH:STRING=${CMAKE_IGNORE_PREFIX_PATH}
|
-DCMAKE_IGNORE_PREFIX_PATH:STRING=${CMAKE_IGNORE_PREFIX_PATH}
|
||||||
@@ -379,8 +379,10 @@ include(Boost/Boost.cmake)
|
|||||||
|
|
||||||
include(Cereal/Cereal.cmake)
|
include(Cereal/Cereal.cmake)
|
||||||
include(Qhull/Qhull.cmake)
|
include(Qhull/Qhull.cmake)
|
||||||
|
include(GLEW/GLEW.cmake)
|
||||||
|
|
||||||
include(GLFW/GLFW.cmake)
|
include(GLFW/GLFW.cmake)
|
||||||
|
include(OpenCSG/OpenCSG.cmake)
|
||||||
set(SLVS_PKG "")
|
set(SLVS_PKG "")
|
||||||
if (SLIC3R_CAD)
|
if (SLIC3R_CAD)
|
||||||
include(SLVS/SLVS.cmake)
|
include(SLVS/SLVS.cmake)
|
||||||
@@ -476,6 +478,7 @@ set(_dep_list
|
|||||||
dep_Draco
|
dep_Draco
|
||||||
dep_NLopt
|
dep_NLopt
|
||||||
dep_OpenVDB
|
dep_OpenVDB
|
||||||
|
dep_OpenCSG
|
||||||
${SLVS_PKG}
|
${SLVS_PKG}
|
||||||
dep_OpenCV
|
dep_OpenCV
|
||||||
dep_Eigen
|
dep_Eigen
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
orcaslicer_add_cmake_project(EXPAT
|
orcaslicer_add_cmake_project(EXPAT
|
||||||
|
# GIT_REPOSITORY https://github.com/nigels-com/glew.git
|
||||||
|
# GIT_TAG 3a8eff7 # 2.1.0
|
||||||
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/expat
|
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/expat
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# We have to check for OpenGL to compile GLEW
|
||||||
|
set(OpenGL_GL_PREFERENCE "LEGACY") # to prevent a nasty warning by cmake
|
||||||
|
find_package(OpenGL QUIET REQUIRED)
|
||||||
|
|
||||||
|
orcaslicer_add_cmake_project(
|
||||||
|
GLEW
|
||||||
|
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/glew
|
||||||
|
CMAKE_ARGS
|
||||||
|
-DGLEW_USE_EGL=OFF
|
||||||
|
)
|
||||||
|
|
||||||
|
if (MSVC)
|
||||||
|
add_debug_dep(dep_GLEW)
|
||||||
|
endif ()
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.0)
|
||||||
|
project(GLEW)
|
||||||
|
|
||||||
|
find_package(OpenGL REQUIRED)
|
||||||
|
|
||||||
|
# Allow parent project to control EGL usage.
|
||||||
|
# Default to OFF since OrcaSlicer forces GDK_BACKEND=x11 (using GLX contexts).
|
||||||
|
# GLEW must use glXGetProcAddressARB (GLX) to match wxWidgets GL canvas.
|
||||||
|
# Using EGL function loading with GLX contexts causes rendering failures.
|
||||||
|
option(GLEW_USE_EGL "Use EGL instead of GLX for OpenGL function loading" OFF)
|
||||||
|
|
||||||
|
if(GLEW_USE_EGL)
|
||||||
|
message(STATUS "Building GLEW with EGL support")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DGLEW_EGL")
|
||||||
|
else()
|
||||||
|
message(STATUS "Building GLEW with GLX support")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_library(GLEW src/glew.c)
|
||||||
|
target_include_directories(GLEW PRIVATE include/)
|
||||||
|
target_link_libraries(GLEW PUBLIC OpenGL::GL)
|
||||||
|
|
||||||
|
if (NOT BUILD_SHARED_LIBS)
|
||||||
|
target_compile_definitions(GLEW PUBLIC GLEW_STATIC)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
|
||||||
|
install(
|
||||||
|
FILES
|
||||||
|
${PROJECT_SOURCE_DIR}/include/GL/glew.h
|
||||||
|
${PROJECT_SOURCE_DIR}/include/GL/wglew.h
|
||||||
|
${PROJECT_SOURCE_DIR}/include/GL/glxew.h
|
||||||
|
${PROJECT_SOURCE_DIR}/include/GL/eglew.h
|
||||||
|
DESTINATION
|
||||||
|
${CMAKE_INSTALL_INCLUDEDIR}/GL
|
||||||
|
)
|
||||||
|
|
||||||
|
install(TARGETS GLEW GLEW
|
||||||
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||||
|
)
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
The OpenGL Extension Wrangler Library
|
||||||
|
Copyright (C) 2002-2007, Milan Ikits <milan ikits[]ieee org>
|
||||||
|
Copyright (C) 2002-2007, Marcelo E. Magallon <mmagallo[]debian org>
|
||||||
|
Copyright (C) 2002, Lev Povalahev
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
* The name of the author may be used to endorse or promote products
|
||||||
|
derived from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||||
|
THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
|
Mesa 3-D graphics library
|
||||||
|
Version: 7.0
|
||||||
|
|
||||||
|
Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
to deal in the Software without restriction, including without limitation
|
||||||
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||||
|
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
|
Copyright (c) 2007 The Khronos Group Inc.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
copy of this software and/or associated documentation files (the
|
||||||
|
"Materials"), to deal in the Materials without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Materials, and to
|
||||||
|
permit persons to whom the Materials are furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included
|
||||||
|
in all copies or substantial portions of the Materials.
|
||||||
|
|
||||||
|
THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
|
||||||
@@ -0,0 +1,251 @@
|
|||||||
|
# GLEW - The OpenGL Extension Wrangler Library
|
||||||
|
|
||||||
|
The OpenGL Extension Wrangler Library (GLEW) is a cross-platform open-source C/C++ extension loading library. GLEW provides efficient run-time mechanisms for determining which OpenGL extensions are supported on the target platform. OpenGL core and extension functionality is exposed in a single header file. GLEW has been tested on a variety of operating systems, including Windows, Linux, Mac OS X, FreeBSD, Irix, and Solaris.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
http://glew.sourceforge.net/
|
||||||
|
|
||||||
|
https://github.com/nigels-com/glew
|
||||||
|
|
||||||
|
[](https://travis-ci.org/nigels-com/glew)
|
||||||
|
[](https://gitter.im/nigels-com/glew?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
|
||||||
|
[](https://sourceforge.net/projects/glew/files/latest/download)
|
||||||
|
|
||||||
|
## Table of Contents
|
||||||
|
|
||||||
|
* [Downloads](#downloads)
|
||||||
|
* [Recent snapshots](#recent-snapshots)
|
||||||
|
* [Build](#build)
|
||||||
|
* [Linux and Mac](#linux-and-mac)
|
||||||
|
* [Using GNU Make](#using-gnu-make)
|
||||||
|
* [Install build tools](#install-build-tools)
|
||||||
|
* [Build](#build-1)
|
||||||
|
* [Linux EGL](#linux-egl)
|
||||||
|
* [Linux mingw-w64](#linux-mingw-w64)
|
||||||
|
* [Using cmake](#using-cmake)
|
||||||
|
* [Install build tools](#install-build-tools-1)
|
||||||
|
* [Build](#build-2)
|
||||||
|
* [Windows](#windows)
|
||||||
|
* [Visual Studio](#visual-studio)
|
||||||
|
* [MSYS/Mingw](#msysmingw)
|
||||||
|
* [MSYS2/Mingw-w64](#msys2mingw-w64)
|
||||||
|
* [glewinfo](#glewinfo)
|
||||||
|
* [Code Generation](#code-generation)
|
||||||
|
* [Authors](#authors)
|
||||||
|
* [Contributions](#contributions)
|
||||||
|
* [Copyright and Licensing](#copyright-and-licensing)
|
||||||
|
|
||||||
|
## Downloads
|
||||||
|
|
||||||
|
Current release is [2.1.0](https://sourceforge.net/projects/glew/files/glew/2.1.0/).
|
||||||
|
[(Change Log)](http://glew.sourceforge.net/log.html)
|
||||||
|
|
||||||
|
Sources available as
|
||||||
|
[ZIP](https://sourceforge.net/projects/glew/files/glew/2.1.0/glew-2.1.0.zip/download) or
|
||||||
|
[TGZ](https://sourceforge.net/projects/glew/files/glew/2.1.0/glew-2.1.0.tgz/download).
|
||||||
|
|
||||||
|
Windows binaries for [32-bit and 64-bit](https://sourceforge.net/projects/glew/files/glew/2.1.0/glew-2.1.0-win32.zip/download).
|
||||||
|
|
||||||
|
### Recent snapshots
|
||||||
|
|
||||||
|
Snapshots may contain new features, bug-fixes or new OpenGL extensions ahead of tested, official releases.
|
||||||
|
|
||||||
|
[glew-20200115.tgz](https://sourceforge.net/projects/glew/files/glew/snapshots/glew-20200115.tgz/download) *GLEW 2.2.0 RC3: fixes*
|
||||||
|
|
||||||
|
[glew-20190928.tgz](https://sourceforge.net/projects/glew/files/glew/snapshots/glew-20190928.tgz/download) *GLEW 2.2.0 RC2: New extensions, bug fixes*
|
||||||
|
|
||||||
|
## Build
|
||||||
|
|
||||||
|
It is highly recommended to build from a tgz or zip release snapshot.
|
||||||
|
The code generation workflow is a complex brew of gnu make, perl and python, that works best on Linux or Mac.
|
||||||
|
The code generation is known to work on Windows using [MSYS2](https://www.msys2.org/).
|
||||||
|
For most end-users of GLEW the official releases are the best choice, with first class support.
|
||||||
|
|
||||||
|
### Linux and Mac
|
||||||
|
|
||||||
|
#### Using GNU Make
|
||||||
|
|
||||||
|
GNU make is the primary build system for GLEW, historically.
|
||||||
|
It includes targets for building the sources and headers, for maintenance purposes.
|
||||||
|
|
||||||
|
##### Install build tools
|
||||||
|
|
||||||
|
Debian/Ubuntu/Mint: `$ sudo apt-get install build-essential libxmu-dev libxi-dev libgl-dev`
|
||||||
|
|
||||||
|
RedHat/CentOS/Fedora: `$ sudo yum install libXmu-devel libXi-devel libGL-devel`
|
||||||
|
|
||||||
|
FreeBSD: `# pkg install xorg lang/gcc git cmake gmake bash python perl5`
|
||||||
|
|
||||||
|
##### Build
|
||||||
|
|
||||||
|
$ make
|
||||||
|
$ sudo make install
|
||||||
|
$ make clean
|
||||||
|
|
||||||
|
Targets: `all, glew.lib (sub-targets: glew.lib.shared, glew.lib.static), glew.bin, clean, install, uninstall`
|
||||||
|
|
||||||
|
Variables: `SYSTEM=linux-clang, GLEW_DEST=/usr/local, STRIP=`
|
||||||
|
|
||||||
|
_Note: you may need to call `make` in the **auto** folder first_
|
||||||
|
|
||||||
|
##### Linux EGL
|
||||||
|
|
||||||
|
$ sudo apt install libegl1-mesa-dev
|
||||||
|
$ make SYSTEM=linux-egl
|
||||||
|
|
||||||
|
##### Linux mingw-w64
|
||||||
|
|
||||||
|
$ sudo apt install mingw-w64
|
||||||
|
$ make SYSTEM=linux-mingw32
|
||||||
|
$ make SYSTEM=linux-mingw64
|
||||||
|
|
||||||
|
#### Using cmake
|
||||||
|
|
||||||
|
The cmake build is mostly contributer maintained.
|
||||||
|
Due to the multitude of use cases this is maintained on a _best effort_ basis.
|
||||||
|
Pull requests are welcome.
|
||||||
|
|
||||||
|
*CMake 2.8.12 or higher is required.*
|
||||||
|
|
||||||
|
##### Install build tools
|
||||||
|
|
||||||
|
Debian/Ubuntu/Mint: `$ sudo apt-get install build-essential libxmu-dev libxi-dev libgl-dev cmake git`
|
||||||
|
|
||||||
|
RedHat/CentOS/Fedora: `$ sudo yum install libXmu-devel libXi-devel libGL-devel cmake git`
|
||||||
|
|
||||||
|
##### Build
|
||||||
|
|
||||||
|
$ cd build
|
||||||
|
$ cmake ./cmake
|
||||||
|
$ make -j4
|
||||||
|
|
||||||
|
| Target | Description |
|
||||||
|
| ---------- | ----------- |
|
||||||
|
| glew | Build the glew shared library. |
|
||||||
|
| glew_s | Build the glew static library. |
|
||||||
|
| glewinfo | Build the `glewinfo` executable (requires `BUILD_UTILS` to be `ON`). |
|
||||||
|
| visualinfo | Build the `visualinfo` executable (requires `BUILD_UTILS` to be `ON`). |
|
||||||
|
| install | Install all enabled targets into `CMAKE_INSTALL_PREFIX`. |
|
||||||
|
| clean | Clean up build artifacts. |
|
||||||
|
| all | Build all enabled targets (default target). |
|
||||||
|
|
||||||
|
| Variables | Description |
|
||||||
|
| --------------- | ----------- |
|
||||||
|
| BUILD_UTILS | Build the `glewinfo` and `visualinfo` executables. |
|
||||||
|
| GLEW_REGAL | Build in Regal mode. |
|
||||||
|
| BUILD_FRAMEWORK | Build as MacOSX Framework. Setting `CMAKE_INSTALL_PREFIX` to `/Library/Frameworks` is recommended. |
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
|
||||||
|
#### Visual Studio
|
||||||
|
|
||||||
|
Use the provided Visual Studio project file in build/vc15/
|
||||||
|
|
||||||
|
Projects for vc6, vc10, vc12 and vc14 are also provided
|
||||||
|
|
||||||
|
#### MSYS/Mingw
|
||||||
|
|
||||||
|
Available from [Mingw](http://www.mingw.org/)
|
||||||
|
|
||||||
|
Requirements: bash, make, gcc
|
||||||
|
|
||||||
|
$ mingw32-make
|
||||||
|
$ mingw32-make install
|
||||||
|
$ mingw32-make install.all
|
||||||
|
|
||||||
|
Alternative toolchain: `SYSTEM=mingw-win32`
|
||||||
|
|
||||||
|
#### MSYS2/Mingw-w64
|
||||||
|
|
||||||
|
Available from [Msys2](http://msys2.github.io/) and/or [Mingw-w64](http://mingw-w64.org/)
|
||||||
|
|
||||||
|
Requirements: bash, make, gcc
|
||||||
|
|
||||||
|
$ pacman -S gcc make mingw-w64-i686-gcc mingw-w64-x86_64-gcc
|
||||||
|
$ make
|
||||||
|
$ make install
|
||||||
|
$ make install.all
|
||||||
|
|
||||||
|
Alternative toolchain: `SYSTEM=msys, SYSTEM=msys-win32, SYSTEM=msys-win64`
|
||||||
|
|
||||||
|
## glewinfo
|
||||||
|
|
||||||
|
`glewinfo` is a command-line tool useful for inspecting the capabilities of an
|
||||||
|
OpenGL implementation and GLEW support for that. Please include `glewinfo.txt`
|
||||||
|
with bug reports, as appropriate.
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
GLEW Extension Info
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
GLEW version 2.0.0
|
||||||
|
Reporting capabilities of pixelformat 3
|
||||||
|
Running on a Intel(R) HD Graphics 3000 from Intel
|
||||||
|
OpenGL version 3.1.0 - Build 9.17.10.4229 is supported
|
||||||
|
|
||||||
|
GL_VERSION_1_1: OK
|
||||||
|
---------------
|
||||||
|
|
||||||
|
GL_VERSION_1_2: OK
|
||||||
|
---------------
|
||||||
|
glCopyTexSubImage3D: OK
|
||||||
|
glDrawRangeElements: OK
|
||||||
|
glTexImage3D: OK
|
||||||
|
glTexSubImage3D: OK
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
## Code Generation
|
||||||
|
|
||||||
|
A Unix or Mac environment is needed for building GLEW from scratch to
|
||||||
|
include new extensions, or customize the code generation. The extension
|
||||||
|
data is regenerated from the top level source directory with:
|
||||||
|
|
||||||
|
make extensions
|
||||||
|
|
||||||
|
An alternative to generating the GLEW sources from scratch is to
|
||||||
|
download a pre-generated (unsupported) snapshot:
|
||||||
|
|
||||||
|
https://sourceforge.net/projects/glew/files/glew/snapshots/
|
||||||
|
|
||||||
|
## Authors
|
||||||
|
|
||||||
|
GLEW is currently maintained by [Nigel Stewart](https://github.com/nigels-com)
|
||||||
|
with bug fixes, new OpenGL extension support and new releases.
|
||||||
|
|
||||||
|
GLEW was developed by [Milan Ikits](http://www.cs.utah.edu/~ikits/)
|
||||||
|
and [Marcelo Magallon](http://wwwvis.informatik.uni-stuttgart.de/~magallon/).
|
||||||
|
Aaron Lefohn, Joe Kniss, and Chris Wyman were the first users and also
|
||||||
|
assisted with the design and debugging process.
|
||||||
|
|
||||||
|
The acronym GLEW originates from Aaron Lefohn.
|
||||||
|
Pasi Kärkkäinen identified and fixed several problems with
|
||||||
|
GLX and SDL. Nate Robins created the `wglinfo` utility, to
|
||||||
|
which modifications were made by Michael Wimmer.
|
||||||
|
|
||||||
|
## Contributions
|
||||||
|
|
||||||
|
GLEW welcomes community contributions. Typically these are co-ordinated
|
||||||
|
via [Issues](https://github.com/nigels-com/glew/issues) or
|
||||||
|
[Pull Requests](https://github.com/nigels-com/glew/pulls) in the
|
||||||
|
GitHub web interface.
|
||||||
|
|
||||||
|
Be sure to mention platform and compiler toolchain details when filing
|
||||||
|
a bug report. The output of `glewinfo` can be quite useful for discussion
|
||||||
|
also.
|
||||||
|
|
||||||
|
Generally GLEW is usually released once a year, around the time of the Siggraph
|
||||||
|
computer graphics conference. If you're not using the current release
|
||||||
|
version of GLEW, be sure to check if the issue or bug is fixed there.
|
||||||
|
|
||||||
|
## Copyright and Licensing
|
||||||
|
|
||||||
|
GLEW is originally derived from the EXTGL project by Lev Povalahev.
|
||||||
|
The source code is licensed under the
|
||||||
|
[Modified BSD License](http://glew.sourceforge.net/glew.txt), the
|
||||||
|
[Mesa 3-D License](http://glew.sourceforge.net/mesa.txt) (MIT) and the
|
||||||
|
[Khronos License](http://glew.sourceforge.net/khronos.txt) (MIT).
|
||||||
|
|
||||||
|
The automatic code generation scripts are released under the
|
||||||
|
[GNU GPL](http://glew.sourceforge.net/gpl.txt).
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
2.2.0
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
diff --git a/src/ModelingAlgorithms/TKMesh/BRepMesh/BRepMesh_ModelPreProcessor.cxx b/src/ModelingAlgorithms/TKMesh/BRepMesh/BRepMesh_ModelPreProcessor.cxx
|
|
||||||
index 6f63781..9b1c08e 100644
|
|
||||||
--- a/src/ModelingAlgorithms/TKMesh/BRepMesh/BRepMesh_ModelPreProcessor.cxx
|
|
||||||
+++ b/src/ModelingAlgorithms/TKMesh/BRepMesh/BRepMesh_ModelPreProcessor.cxx
|
|
||||||
@@ -210,10 +210,10 @@ private:
|
|
||||||
|
|
||||||
// Define two pcurves of the seam-edge.
|
|
||||||
occ::handle<Geom2d_Curve> aPC1, aPC2;
|
|
||||||
- double af, al;
|
|
||||||
+ double af, al, af1, al1;
|
|
||||||
|
|
||||||
aE.Orientation(TopAbs_FORWARD);
|
|
||||||
- aPC1 = BRep_Tool::CurveOnSurface(aE, aF, af, al);
|
|
||||||
+ aPC1 = BRep_Tool::CurveOnSurface(aE, aF, af1, al1);
|
|
||||||
|
|
||||||
aE.Orientation(TopAbs_REVERSED);
|
|
||||||
aPC2 = BRep_Tool::CurveOnSurface(aE, aF, af, al);
|
|
||||||
@@ -224,7 +224,9 @@ private:
|
|
||||||
}
|
|
||||||
|
|
||||||
// Select the correct pcurve of the seam-edge.
|
|
||||||
- const gp_Pnt2d& aFPntOfPC1 = aPC1->Value(aPC1->FirstParameter());
|
|
||||||
+ // Use the edge's first parameter. A Geom2d_Line's FirstParameter() is -Precision::Infinite(),
|
|
||||||
+ // where a direction of (2e-16, -1) from rounding error gives an X far outside the U range.
|
|
||||||
+ const gp_Pnt2d aFPntOfPC1 = aPC1->Value(af1);
|
|
||||||
|
|
||||||
if (std::abs(aLPntOfIPC1.X() - aFPntOfPC1.X()) > Precision::Confusion())
|
|
||||||
{
|
|
||||||
@@ -25,16 +25,9 @@ endif()
|
|||||||
# shipped bytes. Windows ships only the DLLs libslic3r links, so the tab adds the TKFillet,
|
# shipped bytes. Windows ships only the DLLs libslic3r links, so the tab adds the TKFillet,
|
||||||
# TKOffset and TKBool DLLs. See docs/HLSD/design-tab.md.
|
# TKOffset and TKBool DLLs. See docs/HLSD/design-tab.md.
|
||||||
|
|
||||||
if (IN_GIT_REPO)
|
|
||||||
set(OCCT_DIRECTORY_FLAG --directory ${BINARY_DIR_REL}/dep_OCCT-prefix/src/dep_OCCT)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
orcaslicer_add_cmake_project(OCCT
|
orcaslicer_add_cmake_project(OCCT
|
||||||
URL https://github.com/Open-Cascade-SAS/OCCT/archive/refs/tags/V8_0_1.zip
|
URL https://github.com/Open-Cascade-SAS/OCCT/archive/refs/tags/V8_0_1.zip
|
||||||
URL_HASH SHA256=7c033d917ee8f040c0512d289dcc5f02c148889d5bac17c3e25639accb44f0da
|
URL_HASH SHA256=7c033d917ee8f040c0512d289dcc5f02c148889d5bac17c3e25639accb44f0da
|
||||||
# Makes BRepMesh triangulate cone faces whose seam pcurve is slightly tilted
|
|
||||||
# (Open-Cascade-SAS/OCCT#572); remove the patch once an OCCT release includes the fix.
|
|
||||||
PATCH_COMMAND git apply ${OCCT_DIRECTORY_FLAG} --verbose --ignore-space-change --whitespace=fix ${CMAKE_CURRENT_LIST_DIR}/0001-BRepMesh-seam-pcurve-at-edge-parameter.patch
|
|
||||||
#DEPENDS dep_Boost
|
#DEPENDS dep_Boost
|
||||||
DEPENDS ${FREETYPE_PKG}
|
DEPENDS ${FREETYPE_PKG}
|
||||||
CMAKE_ARGS
|
CMAKE_ARGS
|
||||||
|
|||||||
@@ -0,0 +1,101 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.0)
|
||||||
|
|
||||||
|
project(OpenCSG)
|
||||||
|
|
||||||
|
if (NOT BUILD_SHARED_LIBS)
|
||||||
|
set(GLEW_USE_STATIC_LIBS ON)
|
||||||
|
elseif (MSVC)
|
||||||
|
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_package(OpenGL REQUIRED)
|
||||||
|
|
||||||
|
set(GLEW_VERBOSE ON)
|
||||||
|
find_package(GLEW 1.13.0 REQUIRED)
|
||||||
|
|
||||||
|
set(_srcfiles
|
||||||
|
src/area.cpp
|
||||||
|
src/batch.cpp
|
||||||
|
src/context.cpp
|
||||||
|
src/channelManager.cpp
|
||||||
|
src/frameBufferObject.cpp
|
||||||
|
src/frameBufferObjectExt.cpp
|
||||||
|
src/occlusionQuery.cpp
|
||||||
|
src/opencsgRender.cpp
|
||||||
|
src/openglHelper.cpp
|
||||||
|
src/pBufferTexture.cpp
|
||||||
|
src/primitive.cpp
|
||||||
|
src/primitiveHelper.cpp
|
||||||
|
src/renderGoldfeather.cpp
|
||||||
|
src/renderSCS.cpp
|
||||||
|
src/scissorMemo.cpp
|
||||||
|
src/settings.cpp
|
||||||
|
src/stencilManager.cpp
|
||||||
|
RenderTexture/RenderTexture.cpp
|
||||||
|
include/opencsg.h
|
||||||
|
src/opencsgConfig.h
|
||||||
|
src/area.h
|
||||||
|
src/batch.h
|
||||||
|
src/context.h
|
||||||
|
src/channelManager.h
|
||||||
|
src/frameBufferObject.h
|
||||||
|
src/frameBufferObjectExt.h
|
||||||
|
src/occlusionQuery.h
|
||||||
|
src/offscreenBuffer.h
|
||||||
|
src/opencsgRender.h
|
||||||
|
src/openglHelper.h
|
||||||
|
src/pBufferTexture.h
|
||||||
|
src/primitiveHelper.h
|
||||||
|
src/scissorMemo.h
|
||||||
|
src/settings.h
|
||||||
|
src/stencilManager.h
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(opencsg ${_srcfiles})
|
||||||
|
target_include_directories(opencsg PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>)
|
||||||
|
target_include_directories(opencsg PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>)
|
||||||
|
target_link_libraries(opencsg PRIVATE GLEW::GLEW OpenGL::GL)
|
||||||
|
|
||||||
|
include(CMakePackageConfigHelpers)
|
||||||
|
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
|
||||||
|
write_basic_package_version_file(
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
|
||||||
|
VERSION 1.4.2
|
||||||
|
COMPATIBILITY AnyNewerVersion
|
||||||
|
)
|
||||||
|
|
||||||
|
install(TARGETS opencsg
|
||||||
|
EXPORT ${PROJECT_NAME}Targets
|
||||||
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
|
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
|
||||||
|
|
||||||
|
export(EXPORT ${PROJECT_NAME}Targets
|
||||||
|
FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
|
||||||
|
NAMESPACE ${PROJECT_NAME}:: )
|
||||||
|
|
||||||
|
set(ConfigPackageLocation ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
|
||||||
|
|
||||||
|
install(EXPORT ${PROJECT_NAME}Targets
|
||||||
|
FILE
|
||||||
|
"${PROJECT_NAME}Config.cmake"
|
||||||
|
NAMESPACE
|
||||||
|
${PROJECT_NAME}::
|
||||||
|
DESTINATION
|
||||||
|
${ConfigPackageLocation}
|
||||||
|
)
|
||||||
|
install(
|
||||||
|
FILES
|
||||||
|
${PROJECT_SOURCE_DIR}/include/opencsg.h
|
||||||
|
DESTINATION
|
||||||
|
${CMAKE_INSTALL_INCLUDEDIR}/opencsg
|
||||||
|
)
|
||||||
|
install(
|
||||||
|
FILES
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
|
||||||
|
DESTINATION
|
||||||
|
${ConfigPackageLocation}
|
||||||
|
)
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
|
||||||
|
orcaslicer_add_cmake_project(OpenCSG
|
||||||
|
# GIT_REPOSITORY https://github.com/floriankirsch/OpenCSG.git
|
||||||
|
# GIT_TAG 83e274457b46c9ad11a4ee599203250b1618f3b9 #v1.4.2
|
||||||
|
URL https://github.com/floriankirsch/OpenCSG/archive/refs/tags/opencsg-1-4-2-release.zip
|
||||||
|
URL_HASH SHA256=51afe0db79af8386e2027d56d685177135581e0ee82ade9d7f2caff8deab5ec5
|
||||||
|
PATCH_COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt.in ./CMakeLists.txt
|
||||||
|
DEPENDS dep_GLEW
|
||||||
|
)
|
||||||
|
|
||||||
|
if (TARGET ${ZLIB_PKG})
|
||||||
|
add_dependencies(dep_OpenCSG ${ZLIB_PKG})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (MSVC)
|
||||||
|
add_debug_dep(dep_OpenCSG)
|
||||||
|
endif ()
|
||||||
@@ -44,18 +44,6 @@ else()
|
|||||||
if(APPLE)
|
if(APPLE)
|
||||||
set(_conf_cmd export MACOSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} && ./Configure -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET})
|
set(_conf_cmd export MACOSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} && ./Configure -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET})
|
||||||
else()
|
else()
|
||||||
# A static library that is embedded into a shared object must not export
|
|
||||||
# its symbols. On Linux the running process also loads the system OpenSSL
|
|
||||||
# 3.x (WebKitGTK/gnutls pull in libcrypto.so.3), and CPython's _ssl and
|
|
||||||
# _hashlib are dlopened (RTLD_LOCAL) DSOs that each embed this OpenSSL.
|
|
||||||
# With default visibility their unversioned OpenSSL references are
|
|
||||||
# preempted by that global 3.x copy, mixing the 1.1.1 and 3.x ABIs and
|
|
||||||
# corrupting the heap (ssl.create_default_context() aborts). Hidden
|
|
||||||
# visibility makes each embedded copy self-contained. Linux-only: macOS
|
|
||||||
# binds dylibs with a two-level namespace (no interposition) and ships no
|
|
||||||
# OpenSSL, and Windows has no equivalent flag and no system OpenSSL to
|
|
||||||
# collide with.
|
|
||||||
set(_openssl_extra_cflags -fvisibility=hidden)
|
|
||||||
set(_conf_cmd env "CC=${CMAKE_C_COMPILER}" "LDFLAGS=${CMAKE_EXE_LINKER_FLAGS}" "./config")
|
set(_conf_cmd env "CC=${CMAKE_C_COMPILER}" "LDFLAGS=${CMAKE_EXE_LINKER_FLAGS}" "./config")
|
||||||
endif()
|
endif()
|
||||||
set(_cross_comp_prefix_line "")
|
set(_cross_comp_prefix_line "")
|
||||||
@@ -114,20 +102,3 @@ ExternalProject_Add_Step(dep_OpenSSL install_cmake_files
|
|||||||
COMMAND ${CMAKE_COMMAND} -E copy_directory openssl "${DESTDIR}${CMAKE_INSTALL_LIBDIR}/cmake/openssl"
|
COMMAND ${CMAKE_COMMAND} -E copy_directory openssl "${DESTDIR}${CMAKE_INSTALL_LIBDIR}/cmake/openssl"
|
||||||
WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}"
|
WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}"
|
||||||
)
|
)
|
||||||
|
|
||||||
if (NOT WIN32 AND NOT APPLE)
|
|
||||||
# OpenSSL's object rules do not depend on CFLAGS, so reconfiguring it (for
|
|
||||||
# example to add -fvisibility=hidden) relinks the archives from stale
|
|
||||||
# objects instead of recompiling them, and the change silently has no
|
|
||||||
# effect. Drop the objects whenever this recipe changes so the next build
|
|
||||||
# actually recompiles them.
|
|
||||||
ExternalProject_Get_Property(dep_OpenSSL SOURCE_DIR)
|
|
||||||
ExternalProject_Add_Step(dep_OpenSSL clean_objects
|
|
||||||
DEPENDEES configure
|
|
||||||
DEPENDERS build
|
|
||||||
COMMAND make clean
|
|
||||||
WORKING_DIRECTORY "${SOURCE_DIR}"
|
|
||||||
DEPENDS "${CMAKE_CURRENT_LIST_FILE}"
|
|
||||||
COMMENT "OpenSSL: cleaning objects after a recipe change"
|
|
||||||
)
|
|
||||||
endif ()
|
|
||||||
|
|||||||
@@ -299,27 +299,3 @@ endif()
|
|||||||
if(TARGET dep_ZLIB)
|
if(TARGET dep_ZLIB)
|
||||||
add_dependencies(dep_python3 dep_ZLIB)
|
add_dependencies(dep_python3 dep_ZLIB)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT WIN32 AND NOT APPLE)
|
|
||||||
# CPython's Makefile rules for _ssl and _hashlib depend only on their own
|
|
||||||
# sources, not on the OpenSSL archives, so a rebuilt OpenSSL does not make
|
|
||||||
# them relink and they keep the previous symbols. On an incremental tree,
|
|
||||||
# drop the built modules and relink them against the current OpenSSL; a
|
|
||||||
# fresh build is left alone (its PGO target builds them). "make" alone is a
|
|
||||||
# no-op once PGO has run, so sharedmods is invoked explicitly.
|
|
||||||
ExternalProject_Get_Property(dep_python3 SOURCE_DIR)
|
|
||||||
file(GLOB _python_ssl_modules
|
|
||||||
"${SOURCE_DIR}/Modules/_ssl*.so"
|
|
||||||
"${SOURCE_DIR}/Modules/_hashlib*.so")
|
|
||||||
if (_python_ssl_modules)
|
|
||||||
ExternalProject_Add_Step(dep_python3 relink_ssl_extensions
|
|
||||||
DEPENDEES configure
|
|
||||||
DEPENDERS build
|
|
||||||
COMMAND sh -c "rm -f '${SOURCE_DIR}'/Modules/_ssl*.so '${SOURCE_DIR}'/Modules/_hashlib*.so && make -j${NPROC} sharedmods"
|
|
||||||
WORKING_DIRECTORY "${SOURCE_DIR}"
|
|
||||||
COMMENT "CPython: relinking _ssl/_hashlib against the current OpenSSL"
|
|
||||||
DEPENDS "${CMAKE_CURRENT_LIST_FILE}"
|
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/../OpenSSL/OpenSSL.cmake"
|
|
||||||
)
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
|
|||||||
@@ -1,38 +0,0 @@
|
|||||||
diff --git a/build/cmake/wxWidgetsConfig.cmake.in b/build/cmake/wxWidgetsConfig.cmake.in
|
|
||||||
index 2f3a735d920c..2593c045b89b 100644
|
|
||||||
--- a/build/cmake/wxWidgetsConfig.cmake.in
|
|
||||||
+++ b/build/cmake/wxWidgetsConfig.cmake.in
|
|
||||||
@@ -50,12 +50,28 @@ if(WIN32_MSVC_NAMING)
|
|
||||||
set(wxARCH_SUFFIX "_${wxPLATFORM_ARCH}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
- # use wxWidgets_USE_STATIC to force static libraries, otherwise shared is searched first
|
|
||||||
- if(NOT wxWidgets_USE_STATIC AND EXISTS "${CMAKE_CURRENT_LIST_DIR}/${wxCOMPILER_PREFIX}${wxARCH_SUFFIX}_dll/@PROJECT_NAME@Targets.cmake")
|
|
||||||
- set(wxPLATFORM_LIB_DIR "/${wxCOMPILER_PREFIX}${wxARCH_SUFFIX}_dll")
|
|
||||||
- elseif(EXISTS "${CMAKE_CURRENT_LIST_DIR}/${wxCOMPILER_PREFIX}${wxARCH_SUFFIX}_lib/@PROJECT_NAME@Targets.cmake")
|
|
||||||
- set(wxPLATFORM_LIB_DIR "/${wxCOMPILER_PREFIX}${wxARCH_SUFFIX}_lib")
|
|
||||||
+ # wxCOMPILER_PREFIX names the consuming compiler; the installed layout is named
|
|
||||||
+ # after the compiler that built wxWidgets. cl and clang-cl share an ABI, so
|
|
||||||
+ # either can consume either build.
|
|
||||||
+ set(wxCOMPILER_PREFIXES "${wxCOMPILER_PREFIX}")
|
|
||||||
+ if(wxCOMPILER_PREFIX STREQUAL "clang")
|
|
||||||
+ list(APPEND wxCOMPILER_PREFIXES "vc")
|
|
||||||
+ elseif(wxCOMPILER_PREFIX STREQUAL "vc")
|
|
||||||
+ list(APPEND wxCOMPILER_PREFIXES "clang")
|
|
||||||
endif()
|
|
||||||
+
|
|
||||||
+ # use wxWidgets_USE_STATIC to force static libraries, otherwise shared is searched first
|
|
||||||
+ foreach(wxPREFIX IN LISTS wxCOMPILER_PREFIXES)
|
|
||||||
+ if(NOT wxWidgets_USE_STATIC AND EXISTS "${CMAKE_CURRENT_LIST_DIR}/${wxPREFIX}${wxARCH_SUFFIX}_dll/@PROJECT_NAME@Targets.cmake")
|
|
||||||
+ set(wxPLATFORM_LIB_DIR "/${wxPREFIX}${wxARCH_SUFFIX}_dll")
|
|
||||||
+ break()
|
|
||||||
+ elseif(EXISTS "${CMAKE_CURRENT_LIST_DIR}/${wxPREFIX}${wxARCH_SUFFIX}_lib/@PROJECT_NAME@Targets.cmake")
|
|
||||||
+ set(wxPLATFORM_LIB_DIR "/${wxPREFIX}${wxARCH_SUFFIX}_lib")
|
|
||||||
+ break()
|
|
||||||
+ endif()
|
|
||||||
+ endforeach()
|
|
||||||
+ unset(wxPREFIX)
|
|
||||||
+ unset(wxCOMPILER_PREFIXES)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include("${CMAKE_CURRENT_LIST_DIR}${wxPLATFORM_LIB_DIR}/@PROJECT_NAME@Targets.cmake")
|
|
||||||
@@ -28,18 +28,12 @@ if (APPLE)
|
|||||||
COMMAND ${GIT_EXECUTABLE} apply --verbose
|
COMMAND ${GIT_EXECUTABLE} apply --verbose
|
||||||
${CMAKE_CURRENT_LIST_DIR}/0001-macos-use-srgb-colour-components.patch
|
${CMAKE_CURRENT_LIST_DIR}/0001-macos-use-srgb-colour-components.patch
|
||||||
)
|
)
|
||||||
elseif (WIN32)
|
|
||||||
set(_wx_patch_command
|
|
||||||
${GIT_EXECUTABLE} checkout -f -- build/cmake/wxWidgetsConfig.cmake.in
|
|
||||||
COMMAND ${GIT_EXECUTABLE} apply --verbose
|
|
||||||
${CMAKE_CURRENT_LIST_DIR}/0002-clang-cl-sibling-compiler-prefix.patch
|
|
||||||
)
|
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
orcaslicer_add_cmake_project(
|
orcaslicer_add_cmake_project(
|
||||||
wxWidgets
|
wxWidgets
|
||||||
GIT_REPOSITORY "https://github.com/wxWidgets/wxWidgets"
|
GIT_REPOSITORY "https://github.com/SoftFever/Orca-deps-wxWidgets"
|
||||||
GIT_TAG v3.3.4
|
GIT_TAG v3.3.2
|
||||||
GIT_SHALLOW ON
|
GIT_SHALLOW ON
|
||||||
GIT_SUBMODULES 3rdparty/catch 3rdparty/pcre 3rdparty/libwebp
|
GIT_SUBMODULES 3rdparty/catch 3rdparty/pcre 3rdparty/libwebp
|
||||||
PATCH_COMMAND ${_wx_patch_command}
|
PATCH_COMMAND ${_wx_patch_command}
|
||||||
|
|||||||
@@ -88,18 +88,6 @@ struct NfpPConfig {
|
|||||||
*/
|
*/
|
||||||
bool explore_holes = false;
|
bool explore_holes = false;
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Keep the final pile on the bin.
|
|
||||||
*
|
|
||||||
* The final alignment centres the pile on the alignment target. A target
|
|
||||||
* near an edge (a belt printer starts its parts at the leading end of the
|
|
||||||
* belt) would push part of a pile that is larger than the room around that
|
|
||||||
* point off the bed; with this set the pile stops at the edge instead, and a
|
|
||||||
* pile that does not fit along an axis is centred on it. Off by default, so
|
|
||||||
* the alignment of every other printer is unchanged.
|
|
||||||
*/
|
|
||||||
bool clamp_to_bin = false;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief If true, use all CPUs available. Run on a single core otherwise.
|
* @brief If true, use all CPUs available. Run on a single core otherwise.
|
||||||
*/
|
*/
|
||||||
@@ -1123,24 +1111,7 @@ private:
|
|||||||
default: ; // DONT_ALIGN
|
default: ; // DONT_ALIGN
|
||||||
}
|
}
|
||||||
|
|
||||||
auto d = cb - ci;
|
auto d = cb - ci;
|
||||||
|
|
||||||
// Keep the pile on the bin (see Config::clamp_to_bin). The items' boxes carry
|
|
||||||
// their inflation, which is the margin left at the edge.
|
|
||||||
if (config_.clamp_to_bin) {
|
|
||||||
auto on_bin = [](Coord lo, Coord hi, Coord bin_lo, Coord bin_hi, Coord shift) {
|
|
||||||
if (hi - lo >= bin_hi - bin_lo)
|
|
||||||
return (bin_lo + bin_hi) / 2 - (lo + hi) / 2;
|
|
||||||
if (lo + shift < bin_lo)
|
|
||||||
shift = bin_lo - lo;
|
|
||||||
if (hi + shift > bin_hi)
|
|
||||||
shift = bin_hi - hi;
|
|
||||||
return shift;
|
|
||||||
};
|
|
||||||
setX(d, on_bin(getX(bb.minCorner()), getX(bb.maxCorner()), getX(bbin.minCorner()), getX(bbin.maxCorner()), getX(d)));
|
|
||||||
setY(d, on_bin(getY(bb.minCorner()), getY(bb.maxCorner()), getY(bbin.minCorner()), getY(bbin.maxCorner()), getY(d)));
|
|
||||||
cb = ci + d;
|
|
||||||
}
|
|
||||||
|
|
||||||
// BBS make sure the item won't clash with excluded regions
|
// BBS make sure the item won't clash with excluded regions
|
||||||
// do we have wipe tower after arranging?
|
// do we have wipe tower after arranging?
|
||||||
|
|||||||
@@ -191,7 +191,7 @@ public:
|
|||||||
tail->next = std::move(p);
|
tail->next = std::move(p);
|
||||||
tail = new_tail;
|
tail = new_tail;
|
||||||
}
|
}
|
||||||
disrupt_wait_for_data();
|
data_cond.notify_one();
|
||||||
}
|
}
|
||||||
|
|
||||||
void wait_and_pop(T& value)
|
void wait_and_pop(T& value)
|
||||||
|
|||||||
@@ -1,221 +0,0 @@
|
|||||||
# Adaptive TPMS infill — High Level Design
|
|
||||||
|
|
||||||
## Purpose and scope
|
|
||||||
|
|
||||||
`tpms_adaptive` grades the sparse infill of the Gyroid, TPMS-D and TPMS-FK
|
|
||||||
patterns inside the object: the cells grow continuously from the surface
|
|
||||||
towards the center of the object. `distance_warp`, `smooth_blend` and
|
|
||||||
`stepped_shells` follow the distance to the nearest surface, including the top
|
|
||||||
and bottom, like concentric shells; `lobes` follows the whole 3D shape towards
|
|
||||||
the center of each lobe of the object; `normal_z`, `normal_y` and `normal_x`
|
|
||||||
follow each section of the object normal to that axis, so the grading does not
|
|
||||||
change along the axis, as suits a profile extruded along it.
|
|
||||||
`sparse_infill_density` is the density at the surface, `tpms_interior_density`
|
|
||||||
the density at the center, and `tpms_adaptive_gradient` picks how the density
|
|
||||||
goes from one to the other. Only internal sparse infill is graded; the Gyroid
|
|
||||||
Z-buckling optimization does not apply to it.
|
|
||||||
|
|
||||||
The design has two parts: a field built once per object, and a pattern made
|
|
||||||
from it, warped around the center of each lobe of a body so that its cell size
|
|
||||||
follows the field, or, in the modes following the distance to the surface,
|
|
||||||
split into shells or blended between densities.
|
|
||||||
|
|
||||||
## Radial field
|
|
||||||
|
|
||||||
`TpmsRadialField` gives every point of an object the center of its lobe and a
|
|
||||||
radial coordinate: 0 at the center, 1 at the surface along the ray from the
|
|
||||||
center. `PrintObject::prepare_tpms_radial_fields()` builds it in
|
|
||||||
`bridge_over_infill()`, next to the adaptive cubic octree, because the anchoring
|
|
||||||
infill generated there has to match the printed infill. A field is built for
|
|
||||||
every mode a region uses, and is shared by the regions using that mode: the
|
|
||||||
field depends on the geometry only, the densities are applied per region in the
|
|
||||||
fill. An object thinner than the grid cells has no body in the field; no field
|
|
||||||
is kept then, and the infill falls back to the regular pattern. In the modes
|
|
||||||
following the distance to the surface, the field also gives the depth of every
|
|
||||||
point (see below).
|
|
||||||
|
|
||||||
A regular 3D grid of cubic cells is rasterized from the `lslices` of the layers,
|
|
||||||
so the field follows what is printed: negative volumes, the union of
|
|
||||||
overlapping parts and holes are taken into account, and the mesh does not need
|
|
||||||
to be closed. A padding node around the grid is always outside. The grid is
|
|
||||||
capped at about a million nodes, with cells no smaller than 0.5 mm.
|
|
||||||
|
|
||||||
- Bodies are the connected inside nodes. Each is graded on its own, so separate
|
|
||||||
parts of one object each get their own sparse center.
|
|
||||||
- A body is split into lobes around the local maxima of the depth, by an exact
|
|
||||||
Euclidean distance transform (Felzenszwalb and Huttenlocher, one pass per
|
|
||||||
axis). Two maxima are in separate lobes when the depth along the segment
|
|
||||||
between them drops below 0.8 of the shallower one, like at the neck between
|
|
||||||
two united spheres; maxima shallower than 0.3 of the deepest one are ignored.
|
|
||||||
A maximum joins the first lobe whose first maximum it sees without a neck.
|
|
||||||
The lobes are made one at a time, the remaining maxima tested against the
|
|
||||||
first one in parallel, as a plate has a whole plane of them.
|
|
||||||
Where the depth ties along a line or a plane, as in a tall box, the lobe's
|
|
||||||
center is the node nearest to the middle of the tied nodes, so the center is
|
|
||||||
in the middle of the height and not a column.
|
|
||||||
- A point belongs to the lobe it is nearest to relative to their depths, so the
|
|
||||||
side between two lobes is nearer to the smaller one. Near that side, within a
|
|
||||||
tenth of that relative distance, the patterns of the lobes morph into each
|
|
||||||
other, so the lines stay continuous. Every lobe in that range takes part, up
|
|
||||||
to four, so the morph is also continuous where three or four lobes meet.
|
|
||||||
- The reach of a lobe is the distance from its center to the first exit along
|
|
||||||
24 x 48 latitude-longitude directions, smoothed twice over neighbouring
|
|
||||||
directions in log space. Towards a neighbouring lobe it stops at twice the
|
|
||||||
distance to the side between them, so that side is graded half way, as deep
|
|
||||||
as a neck is, rather than as sparse as the center or as dense as the surface.
|
|
||||||
Only the lobes whose centers are near enough to be nearer at the current
|
|
||||||
distance are compared along a ray, so many lobes, as in a perforated plate,
|
|
||||||
stay cheap.
|
|
||||||
The radial coordinate of a point is its distance to the center over the reach
|
|
||||||
in its direction. Behind a gap, as across the hole
|
|
||||||
of a ring, the radial coordinate is above 1 and the infill keeps the surface
|
|
||||||
density.
|
|
||||||
- Every outside node belongs to its nearest body, so points near a surface find
|
|
||||||
their body without a search. With a single body, all nodes belong to it.
|
|
||||||
|
|
||||||
In the 2D modes, every plane of nodes normal to the axis is a field of its own:
|
|
||||||
the distance transform skips the axis, bodies, lobes and the nearest body are
|
|
||||||
found within the plane, and the reach is sampled on a circle of 48 directions.
|
|
||||||
A point is looked up in the two planes around it, the weights of their lobes
|
|
||||||
interpolated along the axis, so the grading does not step between planes; a
|
|
||||||
plane without a body uses the nearest one that has one. The planes are a cell
|
|
||||||
apart, not a layer: where the sections change abruptly, as at a step, the
|
|
||||||
patterns of the two planes morph into each other over that cell.
|
|
||||||
|
|
||||||
A distance to the nearest surface would be the obvious field, but no smooth map
|
|
||||||
follows it. By the divergence theorem, the mean scale of a map over a body is
|
|
||||||
fixed by its values on the surface: a map that keeps the full density along the
|
|
||||||
whole surface, as the distance would ask under the top and bottom, has the mean
|
|
||||||
density of the uniform infill, the sparser core being paid for by lines crowding
|
|
||||||
along the walls. The layers of a plate at different depths would also need
|
|
||||||
different line spacings in the same directions, which no continuous map allows
|
|
||||||
without shearing across the plate. Following the distance needs changes of the
|
|
||||||
topology of the lattice (see below). The radial coordinate instead grades what a
|
|
||||||
single map can: towards one point.
|
|
||||||
|
|
||||||
## Warped pattern
|
|
||||||
|
|
||||||
The pattern is evaluated on warped coordinates:
|
|
||||||
|
|
||||||
TPMS(f_surface * m(t) * (p - center))
|
|
||||||
|
|
||||||
where `m` scales the pattern around the center of the lobe: its frequency is
|
|
||||||
`m + t * m'` along the ray and `m` across it. `m(t)` is the mean of the target
|
|
||||||
scale over the ball of radius `t`, `3 / t^3 * integral of s^2 * target(s) ds`, so
|
|
||||||
the mean of the three, and with it the density, follows the gradient. The cells
|
|
||||||
are round at the center; near the surface they are flattened, with the lines
|
|
||||||
running parallel to it. Beyond the surface the target is the surface scale, so
|
|
||||||
the warp extends continuously outside.
|
|
||||||
|
|
||||||
In the 2D modes only the coordinates within the plane are warped, and `m(t)` is
|
|
||||||
the mean over the disc, `2 / t^2 * integral of s * target(s) ds`. Along the axis
|
|
||||||
the pattern keeps the interior frequency: scaling it with `m` would shear the
|
|
||||||
pattern by the distance along the axis times the gradient of `m`, without bound
|
|
||||||
on a long object. The cells are round at the center and stretched along the
|
|
||||||
axis near the surface. With Normal Z the layers are graded exactly, since
|
|
||||||
the lines of a layer follow its in-plane frequencies; normal to X or Y, the
|
|
||||||
layers near the sides are as dense as the larger of the two frequencies in the
|
|
||||||
layer, which is the surface one.
|
|
||||||
|
|
||||||
Evaluating a TPMS at a frequency that varies with the position without such a
|
|
||||||
map distorts it wherever the frequency changes, because the phase also changes
|
|
||||||
with the gradient of the frequency times the distance from the origin. Fitting a
|
|
||||||
smooth map to a varying isotropic scale in the least-squares sense (a Poisson
|
|
||||||
problem per axis) cannot grade strongly: its divergence is the target scale plus
|
|
||||||
a harmonic function pinned by the surface, which keeps the scale in the core
|
|
||||||
near two thirds of the surface one. Following a distance exactly needs the
|
|
||||||
lattice to change its topology, by blending lattices of different densities or
|
|
||||||
filling shells of equal distance with them, as the modes following the distance
|
|
||||||
to the surface do.
|
|
||||||
|
|
||||||
The target scale at depth `d = 1 - t`, with `S` the surface and `I` the interior
|
|
||||||
frequency, both from each pattern's own density calibration:
|
|
||||||
|
|
||||||
| Gradient | Scale |
|
|
||||||
|-------------|------------------------|
|
|
||||||
| Linear | `1 + (I / S - 1) * d` |
|
|
||||||
| Quadratic | `1 + (I / S - 1) * d^2`|
|
|
||||||
| Exponential | `(I / S)^d` |
|
|
||||||
|
|
||||||
With a denser surface, quadratic keeps the surface density deepest and
|
|
||||||
exponential drops fastest. A denser interior works the same way.
|
|
||||||
|
|
||||||
The zero level is extracted with marching squares like the regular TPMS-FK, on
|
|
||||||
a sampling grid fixed in the fill frame like the optimized Gyroid, so that every
|
|
||||||
region of a layer connects its lines the same way at the saddles of the pattern.
|
|
||||||
Loops narrower than two lines (shorter than `2 * PI * spacing`) are dropped, as
|
|
||||||
they would print as blobs. The fill works in a frame rotated by the infill
|
|
||||||
angle, so the radial field is looked up at the point rotated back into the
|
|
||||||
object frame, and the center rotated into the fill frame. Both use the middle of
|
|
||||||
the layer.
|
|
||||||
|
|
||||||
## Modes following the distance to the surface
|
|
||||||
|
|
||||||
`distance_warp`, `smooth_blend` and `stepped_shells` grade by the distance to
|
|
||||||
the nearest surface, including the top and bottom, as concentric shells do. The
|
|
||||||
depth of a point is that distance over the distance of the deepest point of its
|
|
||||||
body, from 0 at the surface to 1; the field keeps it for every node and
|
|
||||||
interpolates it between them. A tall box so keeps its whole axis as sparse as
|
|
||||||
its center, and a plate is graded through its thickness.
|
|
||||||
|
|
||||||
No single smooth pattern follows that depth without distortion (see above), so
|
|
||||||
the three modes trade differently:
|
|
||||||
|
|
||||||
- Distance warp keeps the lobes and the warp of Lobes, but its radial profile
|
|
||||||
comes from the depth. For every direction of a lobe, the mean depth over the
|
|
||||||
ball along the ray is sampled at 33 radii up to the reach, then smoothed over
|
|
||||||
the neighbouring directions like the reach. The radial coordinate is the one
|
|
||||||
of the linear profile with the same mean depth, `t = 4/3 * (1 - mean depth)`,
|
|
||||||
so with a linear gradient the mean cell size follows the depth exactly, and
|
|
||||||
with the others approximately. In a sphere or a cube, where the depth falls
|
|
||||||
linearly along every ray, it is Lobes. Elsewhere the profile changes with the
|
|
||||||
direction, and the warp shears where neighbouring directions differ, as in
|
|
||||||
plates and long bodies; right under the top of a long body the cells are
|
|
||||||
sparser within the layer, the warp moving their density into the height.
|
|
||||||
The profiles are smoothed over the directions like the reach, as sharper
|
|
||||||
ones shear the pattern across the layer, which adds lines. A long body is so
|
|
||||||
graded partly along its length, between Lobes and the distance.
|
|
||||||
- Smooth blend evaluates the regular patterns of the two levels around the
|
|
||||||
target of every point and blends them by a smoothstep over the whole gap
|
|
||||||
between the levels, here at most 2.5 times apart. The density follows the
|
|
||||||
depth without steps, but where two lattices blend, part of their lines run
|
|
||||||
along the blend, so fewer levels print fewer extra lines. From 25% to 5%,
|
|
||||||
three levels print about 0.45 of the uniform infill in a deep core whose
|
|
||||||
levels alone would print 0.3; levels 1.5 times apart print 0.6 to 0.7, and a
|
|
||||||
single blend from the surface to the interior 0.6.
|
|
||||||
- Stepped shells split each region of a layer into shells and fill every shell
|
|
||||||
with the regular pattern at its density. The densities are levels from the
|
|
||||||
surface to the interior density at most 1.5 times apart, five from 25% to 5%,
|
|
||||||
and a point takes the level nearest to its target on that geometric scale.
|
|
||||||
The shells are traced by marching squares of the continuous level over the
|
|
||||||
layer on a 0.5 mm grid fixed in the object, so every region of a layer gets
|
|
||||||
the same shells, and clipped to the region. Each shell is shrunk by half a
|
|
||||||
line, like a filled region, and its regular filler connects its lines along
|
|
||||||
that boundary, so the connections of two neighbouring shells lie side by side
|
|
||||||
instead of on top of each other. The pattern is never
|
|
||||||
distorted, but its lines end at every shell, and thin parts get thin shells.
|
|
||||||
The connections add lines: in the core of a 60 mm cube, about a third more
|
|
||||||
than the target.
|
|
||||||
|
|
||||||
Stepped shells and Smooth blend need neither lobes nor reaches, which are not
|
|
||||||
built for them.
|
|
||||||
|
|
||||||
## Constraints
|
|
||||||
|
|
||||||
- With `tpms_adaptive` disabled, or for other patterns, the fill parameters are reset
|
|
||||||
to their defaults, so they neither change the infill nor split fill batches.
|
|
||||||
- `Layer::get_sparse_infill_max_void_area()` uses the sparser of the two
|
|
||||||
densities, as the voids at the center are that large.
|
|
||||||
- At a sparse infill density of 100% the sparse infill is turned into solid
|
|
||||||
infill, so there is nothing to grade: the options are hidden and no field is
|
|
||||||
built.
|
|
||||||
- The adaptive options invalidate `posPrepareInfill`, which rebuilds the field
|
|
||||||
and the anchoring infill.
|
|
||||||
- An elongated body without a neck has one center, so its far ends are graded
|
|
||||||
as the outer part of the body, and the warp shears where the reach changes
|
|
||||||
quickly with the direction. A concave body, like an L, may be split into lobes
|
|
||||||
where its maxima cannot see each other in a straight line.
|
|
||||||
- Across a ray, the scale is the mean of the gradient from the center, so the
|
|
||||||
layers right under the top and above the bottom are sparser than the surface
|
|
||||||
density in their middle, and a plate is graded from its middle outwards rather
|
|
||||||
than through its thickness.
|
|
||||||
@@ -1,172 +0,0 @@
|
|||||||
# Center of mass markers — High Level Design
|
|
||||||
|
|
||||||
## Purpose and scope
|
|
||||||
|
|
||||||
The "Center of mass" item of the canvas toolbar menu, in the bottom left corner of the 3D view, marks
|
|
||||||
where the mass of the plate, of each object instance and of each body of an assembly is centered,
|
|
||||||
in Prepare and in Preview. It helps judge how parts will rest on the plate, for instance whether a
|
|
||||||
tall or leaning part could tip. It is a view setting: it changes nothing in the model, the slice or
|
|
||||||
the project file, and it does not reach plate thumbnails. The choice is kept in the app config as
|
|
||||||
`show_center_of_mass`, off by default. The assembly view and the Design tab have no markers.
|
|
||||||
|
|
||||||
Three kinds of marker share one shape, a sphere whose octants alternate between two colors:
|
|
||||||
|
|
||||||
- each plate, black and white, for everything on it;
|
|
||||||
- each object instance, light blue and white;
|
|
||||||
- each body of an assembly, red and yellow;
|
|
||||||
- in Preview, the supports and raft of each object instance, green and black.
|
|
||||||
|
|
||||||
A click on a marker opens a box beside it with the weight and volume of what it stands for, where its
|
|
||||||
center lies in that thing's bounding box and the size of the box, and its moments of inertia about
|
|
||||||
axes through the center parallel to x, y and z.
|
|
||||||
|
|
||||||
An assembly is an object of several parts or with negative volumes. Its bodies are the connected
|
|
||||||
solids its parts make once united, the bodies the separated infills option centers its infill on
|
|
||||||
(see separated-infills.md): parts that overlap or touch are one body, parts apart are separate
|
|
||||||
bodies. An object of one body, and every object of a single part, has no body markers, as its object
|
|
||||||
marker says it all.
|
|
||||||
|
|
||||||
Mass is volume times density, the `filament_density` of the filament that prints it, or 1.245 g/cm³
|
|
||||||
(`DEFAULT_FILAMENT_DENSITY`) for a filament without one. Prepare has the model only, so it takes each
|
|
||||||
part as a solid of the density of its filament, the part's own or else its object's. It reads each
|
|
||||||
filament's density from the filament's selected preset, edits not yet saved included, as slicing does:
|
|
||||||
the plater's own config holds the values of the filament edited last only. Preview has
|
|
||||||
what will be printed, so its markers come from the toolpaths, whose mass depends on walls, infill
|
|
||||||
and flow as well. There the solid markers are for what is printed up to the top layer the layer
|
|
||||||
slider shows: for the plate with brim, raft and supports, where the weight rests at that point of
|
|
||||||
the print; for an object or a body, its own extrusions. Each has a faded twin for the same at the
|
|
||||||
end of the print, so the slider shows the weight moving toward where it ends, and at the top layer
|
|
||||||
the two meet. In Prepare the plate has the model alone, as brim, raft and supports exist only once
|
|
||||||
sliced.
|
|
||||||
|
|
||||||
## Prepare: from the meshes
|
|
||||||
|
|
||||||
An object of one part takes the mass properties of its mesh at unit density, times its density, from
|
|
||||||
`its_mass_properties()`, which handles a mesh in a single pass. Each triangle and a fixed vertex of
|
|
||||||
the mesh span a tetrahedron whose signed volume is `V = a · (b × c) / 6`, with `a`, `b`, `c` taken
|
|
||||||
relative to that vertex. By the divergence theorem these volumes add up to the volume of a closed
|
|
||||||
mesh, their volume-weighted centroids to its center of mass, and their second moments
|
|
||||||
`V (a aᵀ + b bᵀ + c cᵀ + s sᵀ) / 20`, with `s = a + b + c`, to its own. Shells facing inward, such as
|
|
||||||
a cavity, subtract themselves, and flipping every triangle changes nothing. The sums are kept in
|
|
||||||
double precision and relative to a vertex of the mesh rather than the origin, which keeps them exact
|
|
||||||
for meshes far from it. The result keeps the spread of the mass about its center,
|
|
||||||
`(x - c)(x - c)ᵀ` averaged over the mass, from which the moments of inertia follow.
|
|
||||||
|
|
||||||
The CGAL routines that look alike do not compute this. `CGAL::centroid` weighs tetrahedra by their
|
|
||||||
unsigned volume, so it fails on cavities and on any shell that is not star-shaped from the fan's
|
|
||||||
apex; over triangles it returns the centroid of the surface, and over points the average of the
|
|
||||||
vertices, which depends on the tessellation. `CGAL::barycenter` with the signed volumes as weights
|
|
||||||
gives the same answer, but only after copying every tetrahedron into a vector of weighted points,
|
|
||||||
and takes two and a half times as long.
|
|
||||||
|
|
||||||
A mesh's result is in its own coordinates. Each `GLVolume` maps it to the world with its world
|
|
||||||
matrix `M`, and weighs it by the volume times the absolute determinant of that matrix: a center of
|
|
||||||
mass moves with any affine map, and the spread becomes `L S Lᵀ` for the linear part `L` of `M`, so no
|
|
||||||
mesh is ever transformed. The `GLVolume`'s matrices, rather than the
|
|
||||||
model's, let the markers follow an object while it is dragged, before the model is updated. Results
|
|
||||||
are cached by `ModelVolume` id; a `ModelVolume` takes a new id whenever its mesh changes, which is
|
|
||||||
the rule `reload_scene()` relies on to rebuild a `GLVolume`'s geometry, so a cached result never
|
|
||||||
outlives its mesh.
|
|
||||||
|
|
||||||
An assembly's parts overlap or touch, which the mesh formula would count twice, so `solid_bodies()`
|
|
||||||
slices them instead, in the object's coordinates. It cuts the height into 500 slabs, 100 while a part
|
|
||||||
is dragged, slices every part and negative volume at the middle of each slab, unites the parts and
|
|
||||||
cuts the negative volumes away, and links the islands of neighboring slabs that overlap into bodies
|
|
||||||
with `connected_bodies()`. Each island adds a prism of the slab's thickness at the density: its
|
|
||||||
area, and its first and second moments of area, from the same sums over the outline as the area,
|
|
||||||
with the slab's height for z. Where parts of different densities overlap, the later volume of the object counts, as
|
|
||||||
slicing clips every part by the parts after it; each part then weighs the region it prints, which is
|
|
||||||
credited to the island holding it. Each body also keeps the convex hull of its islands and the height
|
|
||||||
they span, whose corners, once transformed, give its bounding box, tight while the instance turns
|
|
||||||
about z only. The object is the sum of its bodies, its box that of its parts, as the object's size
|
|
||||||
shows it, and each plate the sum of the object instances `PartPlateList::find_instance()` puts on it,
|
|
||||||
so that an instance on no plate counts in none. The bodies are cached by `ModelObject` id with the volumes, types, densities and
|
|
||||||
transformations they were sliced from.
|
|
||||||
|
|
||||||
## Preview: from the toolpaths
|
|
||||||
|
|
||||||
`GCodeProcessor` sums the masses while it processes the G-code, in the same pass that builds the
|
|
||||||
moves, and leaves them in `GCodeProcessorResult`; `GCodeViewer` keeps a copy of them when it loads a
|
|
||||||
result. Nothing is stored per move.
|
|
||||||
|
|
||||||
Each extrusion weighs the volume of filament its E extrudes times the density of the filament that
|
|
||||||
extrudes it, so a print of several materials weighs each as it is. Flow ratio, line widths, ironing
|
|
||||||
and purging into infill all count
|
|
||||||
as printed. Its mass spreads evenly along the segment the bead's center runs, half the layer height
|
|
||||||
below the nozzle, in the frame of the stored moves: plate offset added, Z offset removed. Such a
|
|
||||||
segment from `a` to `b` adds `m (a + b) / 2` to the moments and `m (a² + a b + b²) / 3` to the second
|
|
||||||
moments along each axis, and its box widened by half the bead's height to the bounding box; not by
|
|
||||||
half its width, which the processor only estimates, so that a box runs along the walls' center lines. Arcs are already split into segments by the processor. Walls, infill, top and bottom surfaces, ironing
|
|
||||||
and gap fill make the parts. The brim and the support roles, the raft among them, count only in what
|
|
||||||
the plate prints. The skirt, the prime tower and custom G-code count nowhere.
|
|
||||||
|
|
||||||
The plate takes every extrusion, so it needs nothing more. The objects and bodies need the sliced
|
|
||||||
objects, which the G-code does not describe, so the G-code export hands the processor a locator
|
|
||||||
built from the `Print`; G-code opened from a file, or from a project sliced earlier, has no `Print`
|
|
||||||
behind it, and so shows the plate alone. Object labels would not do: profiles turn the four kinds
|
|
||||||
Orca writes on and off in every combination, and none of them tells the bodies apart.
|
|
||||||
|
|
||||||
The locator numbers the object instances and, for each assembly, the bodies of every instance. It
|
|
||||||
takes the bodies `PrintObject::prepare_infill()` found for separated infills, or, when that option
|
|
||||||
did not need them, links the islands (`Layer::lslices`) of neighboring layers into bodies with the
|
|
||||||
same `connected_bodies()`. For each extrusion of a part, it finds the first layer printed at or above
|
|
||||||
its height, as spiral vase rises through each layer, and the island holding it with an
|
|
||||||
`IslandLocator`, the one `solid_bodies()` credits its regions with: by the island's box, widened by
|
|
||||||
1 mm for walls reaching past it, with a polygon test only where boxes overlap, and the nearest
|
|
||||||
outline where none holds the point. The boxes of one layer's islands say nothing of the other
|
|
||||||
instances, so an instance whose widened box reaches another's, as copies placed side by side do,
|
|
||||||
tests the outlines alone, and outside them the nearest outline of all such instances wins. The island
|
|
||||||
gives both the instance and the body. The island found last is tried first, as extrusions mostly follow each other on one
|
|
||||||
island. Brim, raft and supports lie outside the islands. The brim counts in the plate only; a support
|
|
||||||
or raft extrusion goes to the instance whose footprint, the box of its widened islands, holds it, the
|
|
||||||
one whose center is nearest among several, or else the nearest footprint, as supports stand below and
|
|
||||||
around their object.
|
|
||||||
|
|
||||||
Each mass holds, for each layer id, the running total of what is printed up to that layer, the last
|
|
||||||
of which is the faded marker's, so the solid marker for any slider position is a single lookup. The layer ids are those
|
|
||||||
the moves carry, which are also the layers of libvgcode and of the slider; in a print by object they
|
|
||||||
follow the order of printing, so the solid markers show the objects printed so far as they are.
|
|
||||||
|
|
||||||
## Drawing
|
|
||||||
|
|
||||||
`smooth_sphere()` with a resolution divisible by four leaves every triangle within one octant, so it
|
|
||||||
splits into two models drawn with the `gouraud_light` shader in each kind's two colors. The radius is
|
|
||||||
9 pixels for the plate, 7 for the objects, 6 for the supports and 5 for the bodies, scaled like the canvas toolbar for the
|
|
||||||
display's DPI and kept constant on screen through the camera's inverse zoom. They are drawn in that
|
|
||||||
order, so that markers at one place show as rings. The faded markers are the same spheres at 40%
|
|
||||||
opacity, drawn before all the solid ones, which show over them where both meet.
|
|
||||||
|
|
||||||
The centers usually lie inside the objects, so the markers are drawn without the depth test and show
|
|
||||||
through the objects and anything in front of them. Back face culling keeps the far half of a sphere
|
|
||||||
from covering the near one. They are drawn after the ambient occlusion pass, which would otherwise
|
|
||||||
darken them as the surface behind them, and before FXAA, which smooths their edges.
|
|
||||||
|
|
||||||
The markers are part of the cached scene, so toggling them, or changing a filament's density while
|
|
||||||
they are shown, marks the scene dirty, and moving the layer slider redraws the scene with the solid
|
|
||||||
markers where they belong. In Prepare they are hidden while any gizmo other than Move, Rotate, Scale
|
|
||||||
and Lay on face is open, since the others work on the surface a marker would cover, and a hidden
|
|
||||||
object has no markers.
|
|
||||||
|
|
||||||
## Details
|
|
||||||
|
|
||||||
The markers drawn last are kept, and a left click is tested against them before it selects: each
|
|
||||||
center and a point a radius to its right are projected to the screen, and the click hits a marker
|
|
||||||
within that distance. The solid markers are tested before the faded ones and the smaller kinds
|
|
||||||
before the larger, the order in which they cover each other. A hit opens the details of that marker
|
|
||||||
and keeps the click from changing the selection; a click anywhere else closes them. The box is an
|
|
||||||
ImGui window beside the marker, redrawn with the overlay from the markers of the last scene, so it
|
|
||||||
follows a dragged object, and in Preview the layer slider. It closes when its marker is gone, or when
|
|
||||||
the number of markers of its kind changes, as then it may stand for something else.
|
|
||||||
|
|
||||||
Its title says what the marker stands for: the plate, an object, an assembly or a part, the body of
|
|
||||||
an assembly. The G-code export lists the object instances for the processor, marking assemblies, as
|
|
||||||
it hands it the locator.
|
|
||||||
|
|
||||||
Each marker carries its sums: mass, volume, first moments and the second moments about the origin
|
|
||||||
along each axis, `Σ m x²`, `Σ m y²` and `Σ m z²`, which add up from parts to objects to plates. The
|
|
||||||
moment of inertia about the axis through the center parallel to x is then
|
|
||||||
`m (σy² + σz²)`, with `σ² = Σ m x² / m - c²` along each axis, and likewise for y and z. Masses are
|
|
||||||
kept in mg, volume times density in g/cm³, and shown in g, volumes in cm³ and moments of inertia in
|
|
||||||
g·mm². In Preview the box tells the finished print from what is printed up to the layer shown, the
|
|
||||||
two weighing differently, and both are placed in the bounding box of everything the marker holds
|
|
||||||
by the end.
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
# Separated infills — High Level Design
|
|
||||||
|
|
||||||
## Purpose and scope
|
|
||||||
|
|
||||||
An object's infill patterns are laid out from one reference point, the center
|
|
||||||
of the object. When an object groups several parts that do not touch, every
|
|
||||||
part cuts the same object-wide pattern at a different place, so equal parts get
|
|
||||||
different infill. `separated_infills` lays the infill of every connected body
|
|
||||||
out from the center of that body instead, as if the body were sliced on its own.
|
|
||||||
|
|
||||||
The option covers sparse infill, internal solid infill and bridges. Top and
|
|
||||||
bottom surfaces are left to `center_of_surface_pattern`, which centers the
|
|
||||||
Archimedean Chords and Octagram Spiral surface patterns. The option is off by
|
|
||||||
default; with it off, or for an object made of a single body, no fill changes.
|
|
||||||
Adaptive Cubic and Support Cubic do not depend on the option: they always fill
|
|
||||||
each body on its own (see Octree infill).
|
|
||||||
|
|
||||||
## Bodies
|
|
||||||
|
|
||||||
`PrintObject::prepare_infill()` groups the islands of every layer (`lslices`)
|
|
||||||
into 3D connected bodies with `connected_bodies()` before bridges are detected,
|
|
||||||
so bridge anchors and printed infill share one origin. Islands on adjacent layers belong to one body
|
|
||||||
when their slices overlap. Parts that touch or overlap form one body. Separate
|
|
||||||
parts, disconnected islands of one mesh, and interleaved parts that never touch,
|
|
||||||
such as chain links, each form their own. Every island stores the index of its
|
|
||||||
body in `Layer::lslices_separated_component_ids`, and
|
|
||||||
`PrintObject::separated_body_bboxes()` holds the bounding box of each body over
|
|
||||||
all its layers.
|
|
||||||
|
|
||||||
The pass runs when a region uses separated infills, per-model surface centering
|
|
||||||
or an octree infill pattern. It is skipped when the object has one model part
|
|
||||||
that cannot be split, since a single body already shares the object center.
|
|
||||||
|
|
||||||
## Centering a fill
|
|
||||||
|
|
||||||
`infill_body()` matches each fill region to the island it overlaps most, among
|
|
||||||
the islands whose bounding boxes overlap it, and the filler takes the bounding
|
|
||||||
box of that island's body instead of the object's. The box covers every layer
|
|
||||||
of the body, which is the box the body gets when sliced alone, so patterns that
|
|
||||||
depend on its extent as well as its center come out the same too. Bridge
|
|
||||||
anchoring (`Layer::generate_sparse_infill_polylines_for_anchoring()`) makes the
|
|
||||||
same choice, so the anchors match the printed infill.
|
|
||||||
|
|
||||||
The patterns follow the body's box in one of two ways:
|
|
||||||
|
|
||||||
- Rectilinear and its variants, Line, Grid, Triangles, Tri-hexagon, Cubic,
|
|
||||||
Quarter Cubic, Lateral Lattice, Lateral Honeycomb and the plane-path patterns
|
|
||||||
(Hilbert Curve, Archimedean Chords, Octagram Spiral) are laid out from the
|
|
||||||
box: they phase their lines through its center, and Hilbert Curve and the Zig
|
|
||||||
Zag links start from its corner. `Fill::extended_object_bounding_box()`
|
|
||||||
extends the box about its center, so it also serves a box that is not
|
|
||||||
centered on the origin.
|
|
||||||
- Honeycomb, 3D Honeycomb, Cross Hatch, Gyroid, TPMS-D and TPMS-FK are laid out
|
|
||||||
from the coordinate origin, which is the object center. They return true from
|
|
||||||
`Fill::aligned_to_origin()`, and `Fill::fill_surface()` moves each region so
|
|
||||||
that the box center lands on the origin, fills it, and moves the paths back.
|
|
||||||
With the default box the center is the origin, so nothing moves.
|
|
||||||
|
|
||||||
`is_separable_infill_pattern()` lists these patterns. The settings show the
|
|
||||||
option only when the sparse infill pattern is one of them.
|
|
||||||
|
|
||||||
## Octree infill
|
|
||||||
|
|
||||||
Adaptive Cubic and Support Cubic take their lines from an octree, laid out from
|
|
||||||
the center of the mesh it is built from and refined near its surfaces. An
|
|
||||||
octree of the whole object would lay every part out from the object's center
|
|
||||||
and refine it near the other parts, so these patterns
|
|
||||||
(`is_octree_infill_pattern()`) always fill each body on its own, and the
|
|
||||||
settings hide the option for them.
|
|
||||||
|
|
||||||
For an object of several bodies, `PrintObject::prepare_adaptive_infill_data()`
|
|
||||||
builds one octree per body (`FillAdaptive::Octrees`) from the triangles of that
|
|
||||||
body only, which is the octree the body gets when sliced alone. Each connected
|
|
||||||
component of the mesh goes to the body that most of a few sampled triangles lie
|
|
||||||
on. A sample is taken a layer height inside the solid, behind the triangle, and
|
|
||||||
looked up in the islands of the nearest layer. Each internal bridge surface goes
|
|
||||||
to the body of its island. The fill takes the octree of the region's body, from
|
|
||||||
the same `infill_body()`. The octree of the whole object is built only for an
|
|
||||||
object of a single body, or when some body received no triangles, which then
|
|
||||||
uses it.
|
|
||||||
|
|
||||||
The line spacing of an octree comes from the density, line width and multiline
|
|
||||||
count of a region, so a modifier or a part with its own density needs octrees of
|
|
||||||
its own. `adaptive_fill_line_spacing()` gives the spacing of each region, and
|
|
||||||
`FillAdaptive::RegionOctrees` holds one set of octrees per distinct spacing,
|
|
||||||
shared by the regions that have it. A set is built only for the bodies its
|
|
||||||
regions fill. The fill takes the set of its region, then the octree of its body.
|
|
||||||
|
|
||||||
## Patterns left out
|
|
||||||
|
|
||||||
Lightning grows its trees over the whole object, so moving a reference point
|
|
||||||
cannot center it on one body. Concentric and Spiral Inset follow the outline of
|
|
||||||
each region and need no centering.
|
|
||||||
|
|
||||||
Solid infill at full density spaces its lines over the extent of each region,
|
|
||||||
so it is already independent of the other bodies. Only bridges, which keep
|
|
||||||
their line spacing, and the plane-path solid patterns depend on the center.
|
|
||||||
@@ -164,7 +164,6 @@ src/slic3r/GUI/OptionsGroup.cpp
|
|||||||
src/slic3r/GUI/PrintOptionsDialog.cpp
|
src/slic3r/GUI/PrintOptionsDialog.cpp
|
||||||
src/slic3r/GUI/SafetyOptionsDialog.cpp
|
src/slic3r/GUI/SafetyOptionsDialog.cpp
|
||||||
src/slic3r/GUI/ParamsPanel.cpp
|
src/slic3r/GUI/ParamsPanel.cpp
|
||||||
src/slic3r/GUI/IMEXModesCtrl.cpp
|
|
||||||
src/slic3r/GUI/PartPlate.cpp
|
src/slic3r/GUI/PartPlate.cpp
|
||||||
src/slic3r/GUI/Plater.cpp
|
src/slic3r/GUI/Plater.cpp
|
||||||
src/slic3r/GUI/Preferences.cpp
|
src/slic3r/GUI/Preferences.cpp
|
||||||
@@ -213,7 +212,6 @@ src/libslic3r/ExtrusionEntity.cpp
|
|||||||
src/libslic3r/Flow.cpp
|
src/libslic3r/Flow.cpp
|
||||||
src/libslic3r/Format/AMF.cpp
|
src/libslic3r/Format/AMF.cpp
|
||||||
src/libslic3r/miniz_extension.cpp
|
src/libslic3r/miniz_extension.cpp
|
||||||
src/libslic3r/IMEXHelpers.cpp
|
|
||||||
src/libslic3r/Preset.cpp
|
src/libslic3r/Preset.cpp
|
||||||
src/libslic3r/Print.cpp
|
src/libslic3r/Print.cpp
|
||||||
src/libslic3r/PrintBase.cpp
|
src/libslic3r/PrintBase.cpp
|
||||||
|
|||||||
@@ -1,79 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""Belt temperature-tower asset generator (discrete-provini design).
|
|
||||||
|
|
||||||
A vertical temperature tower cannot be sliced on a belt printer, so lay a row of
|
|
||||||
DISCRETE provini (one per temperature) along the belt (designed Y) with a fixed
|
|
||||||
surface gap. Each provino is the chevron+arc unit (belt_temp_provino_unit.stl,
|
|
||||||
keel-first); its temperature is ENGRAVED upright into the 50 mm face — a raised
|
|
||||||
number would be an unsupported overhang on the belt. The C++ calib_temp belt branch
|
|
||||||
(Plater.cpp) injects one M104 per zone 70 layers INTO provino i:
|
|
||||||
print_z[i] = i * PITCH * cos(theta) + 70 * layer_height (theta = 45)
|
|
||||||
inside the body, not in the empty inter-provino gap (which has no sliced layers for
|
|
||||||
the event to attach to). PITCH below is the shared geometry contract with that code —
|
|
||||||
keep them in sync.
|
|
||||||
|
|
||||||
Generates one STL per filament temp range used by Temp_Calibration_Dlg.
|
|
||||||
"""
|
|
||||||
import numpy as np, trimesh, os
|
|
||||||
from matplotlib.textpath import TextPath
|
|
||||||
from matplotlib.font_manager import FontProperties
|
|
||||||
from shapely.geometry import Polygon as ShPoly
|
|
||||||
from shapely.ops import unary_union
|
|
||||||
|
|
||||||
HERE = os.path.dirname(os.path.abspath(__file__))
|
|
||||||
UNIT = os.path.join(HERE, 'belt_temp_provino_unit.stl') # single provino, keel-first
|
|
||||||
SURF_GAP = 25.0 # surface-to-surface gap between provini (mm) — user spec
|
|
||||||
TEXT_H = 9.0
|
|
||||||
TEXT_DEPTH = 0.8 # engraving depth (numbers are CUT into the face, not raised:
|
|
||||||
# a raised number is an unsupported Y-overhang on the belt)
|
|
||||||
TEXT_OVERSHOOT = 0.6 # extra height poking out of the face for a clean boolean cut
|
|
||||||
|
|
||||||
# Temperature ranges (start, end) per filament family, 5 C step. File name encodes them.
|
|
||||||
RANGES = [(230,190),(270,230),(250,230),(280,240),(240,210),(320,280)]
|
|
||||||
|
|
||||||
unit = trimesh.load(UNIT)
|
|
||||||
dY = unit.bounds[1,1] - unit.bounds[0,1]
|
|
||||||
PITCH = dY + SURF_GAP # designed-Y pitch == C++ contract constant
|
|
||||||
print(f"unit dY={dY:.2f} PITCH={PITCH:.3f} (C++ contract: print_z[i]=i*{PITCH:.3f}*cos45)")
|
|
||||||
|
|
||||||
# 50 mm face normal (0,-1,1)/sqrt2 ; UPRIGHT basis u=+X det(+1) (verified non-mirrored)
|
|
||||||
n = np.array([0,-1,1.])/np.sqrt(2)
|
|
||||||
u = np.array([1,0,0.]); v = np.array([0,1,1.])/np.sqrt(2)
|
|
||||||
R = np.column_stack([u,v,n])
|
|
||||||
fn = unit.face_normals; fc = unit.triangles_center; fa = unit.area_faces
|
|
||||||
sel = (fn@n) > 0.9
|
|
||||||
face_c = (fc[sel]*fa[sel,None]).sum(0)/fa[sel].sum()
|
|
||||||
|
|
||||||
def text_mesh(s):
|
|
||||||
tp = TextPath((0,0), s, size=TEXT_H, prop=FontProperties(family='DejaVu Sans'))
|
|
||||||
rings = [ShPoly(p) for p in tp.to_polygons() if len(p)>=3]
|
|
||||||
rings.sort(key=lambda r:r.area, reverse=True)
|
|
||||||
used=[False]*len(rings); parts=[]
|
|
||||||
for i,o in enumerate(rings):
|
|
||||||
if used[i]: continue
|
|
||||||
holes=[]
|
|
||||||
for j in range(i+1,len(rings)):
|
|
||||||
if not used[j] and o.contains(rings[j]): holes.append(rings[j].exterior.coords); used[j]=True
|
|
||||||
parts.append(ShPoly(o.exterior.coords,holes)); used[i]=True
|
|
||||||
poly = unary_union(parts)
|
|
||||||
geoms = list(poly.geoms) if poly.geom_type=='MultiPolygon' else [poly]
|
|
||||||
m = trimesh.util.concatenate([trimesh.creation.extrude_polygon(g,height=TEXT_DEPTH+TEXT_OVERSHOOT) for g in geoms])
|
|
||||||
c = m.bounds.mean(axis=0); m.apply_translation([-c[0],-c[1],0]); return m
|
|
||||||
|
|
||||||
for t_start, t_end in RANGES:
|
|
||||||
temps = list(range(t_start, t_end-1, -5))
|
|
||||||
parts=[]
|
|
||||||
for i,T in enumerate(temps):
|
|
||||||
c = unit.copy(); c.apply_translation([0, i*PITCH, 0])
|
|
||||||
t = text_mesh(str(T)); M=np.eye(4); M[:3,:3]=R; t.apply_transform(M)
|
|
||||||
# place the text spanning from TEXT_DEPTH inside the face to TEXT_OVERSHOOT outside,
|
|
||||||
# then CUT it out of the provino (engrave) — no raised material, no Y-overhang.
|
|
||||||
t.apply_translation(face_c - n*TEXT_DEPTH + np.array([0,i*PITCH,0]))
|
|
||||||
c = trimesh.boolean.difference([c, t], engine='manifold')
|
|
||||||
parts.append(c)
|
|
||||||
asset = trimesh.util.concatenate(parts)
|
|
||||||
out = os.path.join(HERE, f"belt_temp_tower_{t_start}_{t_end}.stl")
|
|
||||||
asset.export(out)
|
|
||||||
dims = np.round(asset.bounds[1]-asset.bounds[0],1)
|
|
||||||
wt = all(p.is_watertight for p in parts)
|
|
||||||
print(f" {t_start}->{t_end}: {len(temps)} zones bbox={dims} watertight={wt} -> {os.path.basename(out)}")
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M5.5,14.5c-1.105,0-2-3.686-2-7s.895-7,2-7" style="fill:none;stroke:#009688;stroke-linecap:round;stroke-linejoin:round"/><line x1="8.67" y1="4.67" x2="14.33" y2="10.33" style="fill:none;stroke:#949494;stroke-linecap:square;stroke-linejoin:round"/><line x1="14.33" y1="4.67" x2="8.67" y2="10.33" style="fill:none;stroke:#949494;stroke-linecap:square;stroke-linejoin:round"/><path d="M3.5,13.7c-.294.511-.636.8-1,.8-1.1,0-2-3.686-2-7s.9-7,2-7c.365,0,.707.293,1,.805" style="fill:none;stroke:#949494;stroke-linecap:round;stroke-linejoin:round"/><path d="M6.727,4.5c.334-2.208,1-4,1.773-4,.354,0,.686.378.974,1" style="fill:none;stroke:#949494;stroke-linecap:round;stroke-linejoin:round"/><path d="M9.474,13.5c-.288.622-.62,1-.974,1-.77,0-1.439-1.792-1.773-4" style="fill:none;stroke:#949494;stroke-linecap:round;stroke-linejoin:round"/></svg>
|
|
||||||
|
Before Width: | Height: | Size: 931 B |
@@ -1 +1,3 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?><svg id="a" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M3.5,11.5v1l2,2,2-2v-1" style="fill:none; stroke:#949494; stroke-linecap:square; stroke-linejoin:round;"/><circle cx="10.5" cy="4.5" r="4" style="fill:none; stroke:#009688; stroke-linecap:round; stroke-linejoin:round;"/><polyline points="11.5 2.5 12.5 3.5 8.5 3.5" style="fill:none; stroke:#009688; stroke-linecap:round; stroke-linejoin:round;"/><polyline points="12.5 5.5 8.5 5.5 9.5 6.5" style="fill:none; stroke:#009688; stroke-linecap:square; stroke-linejoin:round;"/><path d="M5.5.5H1.5C.95.5.5.95.5,1.5v9c0,.55.45,1,1,1h8c.55,0,1-.45,1-1" style="fill:none; stroke:#949494; stroke-linecap:square; stroke-linejoin:round;"/></svg>
|
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.2992 1.42627C10.7774 1.42627 8.73315 3.47056 8.73315 5.99231C8.73315 8.51406 10.7774 10.5583 13.2992 10.5583C13.3609 10.5583 13.4223 10.5571 13.4834 10.5547C15.9197 10.4581 17.8652 8.45238 17.8652 5.99231C17.8652 3.47056 15.8209 1.42627 13.2992 1.42627ZM15.6185 11.0536C17.5346 10.1741 18.8652 8.23861 18.8652 5.99231C18.8652 2.91827 16.3732 0.42627 13.2992 0.42627C11.5793 0.42627 10.0417 1.2063 9.02067 2.43188H2.31853C1.93193 2.43188 1.61853 2.74528 1.61853 3.13188V12.4712C1.61853 12.6313 1.6723 12.7789 1.76278 12.8968C1.76671 13.0046 1.79621 13.1144 1.85576 13.2185L3.48408 16.0649C3.60875 16.2829 3.8406 16.4173 4.09168 16.4173H6.75859L7.97903 19.1586C8.22556 19.7123 9.01148 19.7123 9.25801 19.1586L10.4784 16.4173H13.1454C13.3965 16.4173 13.6283 16.2829 13.753 16.0649L15.3813 13.2185C15.4409 13.1144 15.4704 13.0046 15.4743 12.8968C15.5648 12.7789 15.6185 12.6313 15.6185 12.4712V11.0536ZM13.4429 11.5565C13.8469 11.5463 14.2403 11.493 14.6185 11.4011V12.1709H2.61853V3.43188H8.35573C7.95792 4.19837 7.73315 5.06909 7.73315 5.99231C7.73315 9.06635 10.2252 11.5583 13.2992 11.5583C13.3472 11.5583 13.3951 11.5577 13.4429 11.5565ZM2.98076 13.1712H14.2563L12.9714 15.4173H9.85194L9.84578 15.4173H7.39126L7.3851 15.4173H4.26569L2.98076 13.1712ZM9.38381 16.4173L8.61852 18.1363L7.85322 16.4173H9.38381ZM12.2021 3.36422C12.3973 3.55948 12.3973 3.87606 12.2021 4.07133L11.743 4.53041H16.0625C16.3386 4.53041 16.5625 4.75426 16.5625 5.03041C16.5625 5.30655 16.3386 5.53041 16.0625 5.53041H10.7773C10.2428 5.53041 9.97507 4.88412 10.353 4.50614L11.495 3.36422C11.6902 3.16896 12.0068 3.16896 12.2021 3.36422ZM14.3963 7.91305C14.2011 8.10831 14.2011 8.42489 14.3963 8.62015C14.5916 8.81542 14.9082 8.81542 15.1034 8.62015L16.2453 7.47823C16.6233 7.10026 16.3556 6.45397 15.8211 6.45397L10.5359 6.45397C10.2597 6.45397 10.0359 6.67783 10.0359 6.95397C10.0359 7.23011 10.2597 7.45397 10.5359 7.45397L14.8554 7.45397L14.3963 7.91305Z" fill="#262E30"/>
|
||||||
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 747 B After Width: | Height: | Size: 2.1 KiB |
@@ -1 +1,10 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?><svg id="a" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path d="M3.5,3.5h8M3.5,5.5h8M3.5,1.5h8M6.5,5.5v7l1,1,1-1v-7" style="fill:none; stroke:#949494; stroke-linecap:square; stroke-linejoin:round;"/></svg>
|
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<rect x="1.73486" y="1" width="10.53" height="5.12169" fill="#C2C2C2"/>
|
||||||
|
<rect x="1.73486" y="1" width="10.53" height="0.497608" fill="#858585"/>
|
||||||
|
<rect x="1.73486" y="2.70703" width="10.53" height="0.497608" fill="#858585"/>
|
||||||
|
<rect x="1.73486" y="4.41602" width="10.53" height="0.497608" fill="#858585"/>
|
||||||
|
<rect x="1.73486" y="6.12305" width="10.53" height="0.497608" fill="#858585"/>
|
||||||
|
<path d="M6.10107 11.9961H7.77047L7.30675 12.9991H6.61117L6.10107 11.9961Z" fill="#8C8C8C"/>
|
||||||
|
<rect x="4.1748" y="6.62109" width="5.65026" height="5.3765" fill="#646464"/>
|
||||||
|
<rect x="6.61475" y="6.62109" width="0.642075" height="5.35947" fill="#1D1D1D"/>
|
||||||
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 255 B After Width: | Height: | Size: 737 B |
@@ -1,7 +0,0 @@
|
|||||||
<svg width="43" height="43" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<rect fill="#e9e9e9" rx="3.5" height="40" width="40" y="1.5" x="1.5"/>
|
|
||||||
<path stroke-width="1.0" fill="#545454" d="m38,2a3,3 0 0 1 3,3l0,33a3,3 0 0 1 -3,3l-33,0a3,3 0 0 1 -3,-3l0,-33a3,3 0 0 1 3,-3l33,0m0,-1l-33,0a4,4 0 0 0 -4,4l0,33a4,4 0 0 0 4,4l33,0a4,4 0 0 0 4,-4l0,-33a4,4 0 0 0 -4,-4z"/>
|
|
||||||
<path stroke-linecap="round" stroke-width="0.8" stroke="#545454" fill="#545454" d="m21.5275,7.14657l0,28.59908"/>
|
|
||||||
<path stroke-width="1.0" stroke="#545454" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m14.5112,25.5943l-0.632,0l0.632,-1.1115l-0.0305,-1.3114l-0.6445,-1.103l-0.7745,-0.632l-0.3502,-0.7142l-0.9981,-1.8354l1.4221,0.9295l1.6267,0.1116l0.8272,0.5112l0.9667,-0.4926l0.2509,-1.3664l-1.0317,-0.5763l-0.9945,-1.5429l0.1999,-0.7236l-1.1015,-1.0425l0.4275,-1.608l-0.7064,-0.0651l-0.9388,0.7157l-1.8125,0.1674l-1.71896,0.9102l-0.81298,1.0906l-0.77183,2.014l-0.22958,2.4972l0.25693,2.9999l0.89251,0.5883l0.21446,1.5893l-0.6172,0l-0.66057,1.2606l-0.51219,1.9929l8.95941,0l-0.5289,-1.9929l-0.8089,-1.2606l0,0z"/>
|
|
||||||
<path stroke-dasharray="1,2" stroke-linecap="round" stroke-width="1.0" stroke="#545454" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m34.77509,25.5943l-0.632,0l0.632,-1.1115l-0.0305,-1.3114l-0.6445,-1.103l-0.7745,-0.632l-0.3502,-0.7142l-0.9981,-1.8354l1.4221,0.9295l1.6267,0.1116l0.8272,0.5112l0.9667,-0.4926l0.2509,-1.3664l-1.0317,-0.5763l-0.9945,-1.5429l0.1999,-0.7236l-1.1015,-1.0425l0.4275,-1.608l-0.7064,-0.0651l-0.9388,0.7157l-1.8125,0.1674l-1.719,0.9102l-0.8129,1.0906l-0.7719,2.014l-0.2296,2.4972l0.257,2.9999l0.8925,0.5883l0.2145,1.5893l-0.6173,0l-0.6605,1.2606l-0.5122,1.9929l8.9594,0l-0.5289,-1.9929l-0.8089,-1.2606l0,0z"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,7 +0,0 @@
|
|||||||
<svg width="43" height="43" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<rect fill="#54545a" rx="3.5" height="40" width="40" y="1.5" x="1.5"/>
|
|
||||||
<path stroke-width="1.0" fill="#b3b3b3" d="m38,2a3,3 0 0 1 3,3l0,33a3,3 0 0 1 -3,3l-33,0a3,3 0 0 1 -3,-3l0,-33a3,3 0 0 1 3,-3l33,0m0,-1l-33,0a4,4 0 0 0 -4,4l0,33a4,4 0 0 0 4,4l33,0a4,4 0 0 0 4,-4l0,-33a4,4 0 0 0 -4,-4z"/>
|
|
||||||
<path stroke-linecap="round" stroke-width="0.8" stroke="#c4c4c4" fill="#c4c4c4" d="m21.5275,7.14657l0,28.59908"/>
|
|
||||||
<path stroke-width="1.0" stroke="#c4c4c4" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m14.5112,25.5943l-0.632,0l0.632,-1.1115l-0.0305,-1.3114l-0.6445,-1.103l-0.7745,-0.632l-0.3502,-0.7142l-0.9981,-1.8354l1.4221,0.9295l1.6267,0.1116l0.8272,0.5112l0.9667,-0.4926l0.2509,-1.3664l-1.0317,-0.5763l-0.9945,-1.5429l0.1999,-0.7236l-1.1015,-1.0425l0.4275,-1.608l-0.7064,-0.0651l-0.9388,0.7157l-1.8125,0.1674l-1.71896,0.9102l-0.81298,1.0906l-0.77183,2.014l-0.22958,2.4972l0.25693,2.9999l0.89251,0.5883l0.21446,1.5893l-0.6172,0l-0.66057,1.2606l-0.51219,1.9929l8.95941,0l-0.5289,-1.9929l-0.8089,-1.2606l0,0z"/>
|
|
||||||
<path stroke-dasharray="1,2" stroke-linecap="round" stroke-width="1.0" stroke="#c4c4c4" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m34.77509,25.5943l-0.632,0l0.632,-1.1115l-0.0305,-1.3114l-0.6445,-1.103l-0.7745,-0.632l-0.3502,-0.7142l-0.9981,-1.8354l1.4221,0.9295l1.6267,0.1116l0.8272,0.5112l0.9667,-0.4926l0.2509,-1.3664l-1.0317,-0.5763l-0.9945,-1.5429l0.1999,-0.7236l-1.1015,-1.0425l0.4275,-1.608l-0.7064,-0.0651l-0.9388,0.7157l-1.8125,0.1674l-1.719,0.9102l-0.8129,1.0906l-0.7719,2.014l-0.2296,2.4972l0.257,2.9999l0.8925,0.5883l0.2145,1.5893l-0.6173,0l-0.6605,1.2606l-0.5122,1.9929l8.9594,0l-0.5289,-1.9929l-0.8089,-1.2606l0,0z"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,7 +0,0 @@
|
|||||||
<svg width="43" height="43" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<rect fill="#e9e9e9" rx="3.5" height="40" width="40" x="1.5" y="1.5"/>
|
|
||||||
<path stroke-width="1.0" fill="#009688" d="m38,2a3,3 0 0 1 3,3l0,33a3,3 0 0 1 -3,3l-33,0a3,3 0 0 1 -3,-3l0,-33a3,3 0 0 1 3,-3l33,0m0,-1l-33,0a4,4 0 0 0 -4,4l0,33a4,4 0 0 0 4,4l33,0a4,4 0 0 0 4,-4l0,-33a4,4 0 0 0 -4,-4z"/>
|
|
||||||
<path stroke-linecap="round" stroke-width="0.8" stroke="#009688" fill="#009688" d="m21.5275,7.14657l0,28.59908"/>
|
|
||||||
<path stroke-width="1.0" stroke="#009688" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m14.5112,25.5943l-0.632,0l0.632,-1.1115l-0.0305,-1.3114l-0.6445,-1.103l-0.7745,-0.632l-0.3502,-0.7142l-0.9981,-1.8354l1.4221,0.9295l1.6267,0.1116l0.8272,0.5112l0.9667,-0.4926l0.2509,-1.3664l-1.0317,-0.5763l-0.9945,-1.5429l0.1999,-0.7236l-1.1015,-1.0425l0.4275,-1.608l-0.7064,-0.0651l-0.9388,0.7157l-1.8125,0.1674l-1.71896,0.9102l-0.81298,1.0906l-0.77183,2.014l-0.22958,2.4972l0.25693,2.9999l0.89251,0.5883l0.21446,1.5893l-0.6172,0l-0.66057,1.2606l-0.51219,1.9929l8.95941,0l-0.5289,-1.9929l-0.8089,-1.2606l0,0z"/>
|
|
||||||
<path stroke-dasharray="1,2" stroke-linecap="round" stroke-width="1.0" stroke="#009688" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m34.77509,25.5943l-0.632,0l0.632,-1.1115l-0.0305,-1.3114l-0.6445,-1.103l-0.7745,-0.632l-0.3502,-0.7142l-0.9981,-1.8354l1.4221,0.9295l1.6267,0.1116l0.8272,0.5112l0.9667,-0.4926l0.2509,-1.3664l-1.0317,-0.5763l-0.9945,-1.5429l0.1999,-0.7236l-1.1015,-1.0425l0.4275,-1.608l-0.7064,-0.0651l-0.9388,0.7157l-1.8125,0.1674l-1.719,0.9102l-0.8129,1.0906l-0.7719,2.014l-0.2296,2.4972l0.257,2.9999l0.8925,0.5883l0.2145,1.5893l-0.6173,0l-0.6605,1.2606l-0.5122,1.9929l8.9594,0l-0.5289,-1.9929l-0.8089,-1.2606l0,0z"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,7 +0,0 @@
|
|||||||
<svg width="43" height="43" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<rect fill="#54545a" rx="3.5" height="40" width="40" y="1.5" x="1.5"/>
|
|
||||||
<path stroke-width="1.0" fill="#009688" d="m38,2a3,3 0 0 1 3,3l0,33a3,3 0 0 1 -3,3l-33,0a3,3 0 0 1 -3,-3l0,-33a3,3 0 0 1 3,-3l33,0m0,-1l-33,0a4,4 0 0 0 -4,4l0,33a4,4 0 0 0 4,4l33,0a4,4 0 0 0 4,-4l0,-33a4,4 0 0 0 -4,-4z"/>
|
|
||||||
<path stroke-linecap="round" stroke-width="0.8" stroke="#009688" fill="#009688" d="m21.5275,7.14657l0,28.59908"/>
|
|
||||||
<path stroke-width="1.0" stroke="#009688" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m14.5112,25.5943l-0.632,0l0.632,-1.1115l-0.0305,-1.3114l-0.6445,-1.103l-0.7745,-0.632l-0.3502,-0.7142l-0.9981,-1.8354l1.4221,0.9295l1.6267,0.1116l0.8272,0.5112l0.9667,-0.4926l0.2509,-1.3664l-1.0317,-0.5763l-0.9945,-1.5429l0.1999,-0.7236l-1.1015,-1.0425l0.4275,-1.608l-0.7064,-0.0651l-0.9388,0.7157l-1.8125,0.1674l-1.71896,0.9102l-0.81298,1.0906l-0.77183,2.014l-0.22958,2.4972l0.25693,2.9999l0.89251,0.5883l0.21446,1.5893l-0.6172,0l-0.66057,1.2606l-0.51219,1.9929l8.95941,0l-0.5289,-1.9929l-0.8089,-1.2606l0,0z"/>
|
|
||||||
<path stroke-dasharray="1,2" stroke-linecap="round" stroke-width="1.0" stroke="#009688" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m34.77509,25.5943l-0.632,0l0.632,-1.1115l-0.0305,-1.3114l-0.6445,-1.103l-0.7745,-0.632l-0.3502,-0.7142l-0.9981,-1.8354l1.4221,0.9295l1.6267,0.1116l0.8272,0.5112l0.9667,-0.4926l0.2509,-1.3664l-1.0317,-0.5763l-0.9945,-1.5429l0.1999,-0.7236l-1.1015,-1.0425l0.4275,-1.608l-0.7064,-0.0651l-0.9388,0.7157l-1.8125,0.1674l-1.719,0.9102l-0.8129,1.0906l-0.7719,2.014l-0.2296,2.4972l0.257,2.9999l0.8925,0.5883l0.2145,1.5893l-0.6173,0l-0.6605,1.2606l-0.5122,1.9929l8.9594,0l-0.5289,-1.9929l-0.8089,-1.2606l0,0z"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,10 +0,0 @@
|
|||||||
<svg width="43" height="43" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<rect fill="#e9e9e9" rx="3.5" height="40" width="40" y="1.5" x="1.5"/>
|
|
||||||
<path stroke-width="1.0" fill="#545454" d="m38,2a3,3 0 0 1 3,3l0,33a3,3 0 0 1 -3,3l-33,0a3,3 0 0 1 -3,-3l0,-33a3,3 0 0 1 3,-3l33,0m0,-1l-33,0a4,4 0 0 0 -4,4l0,33a4,4 0 0 0 4,4l33,0a4,4 0 0 0 4,-4l0,-33a4,4 0 0 0 -4,-4z"/>
|
|
||||||
<path stroke-linecap="round" stroke-width="0.8" stroke="#545454" fill="#545454" d="m21.5275,5.5l0,31.9"/>
|
|
||||||
<path stroke-linecap="round" stroke-width="0.8" stroke="#545454" fill="#545454" d="m6.7,21.575891l29.2,0"/>
|
|
||||||
<path stroke-dasharray="1,2" stroke-linecap="round" stroke-width="1" stroke="#545454" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m28.4888,25.5943l0.632,0l-0.632,-1.1115l0.0305,-1.3114l0.6445,-1.103l0.7745,-0.632l0.3502,-0.7142l0.9981,-1.8354l-1.4221,0.9295l-1.6267,0.1116l-0.8272,0.5112l-0.9667,-0.4926l-0.2509,-1.3664l1.0317,-0.5763l0.9945,-1.5429l-0.1999,-0.7236l1.1015,-1.0425l-0.4275,-1.608l0.7064,-0.0651l0.9388,0.7157l1.8125,0.1674l1.719,0.9102l0.8129,1.0906l0.7719,2.014l0.2296,2.4972l-0.257,2.9999l-0.8925,0.5883l-0.2145,1.5893l0.6173,0l0.6605,1.2606l0.5122,1.9929l-8.9594,0l0.5289,-1.9929l0.8089,-1.2606l0,0z" transform="translate(11.75,11.75) scale(0.7) translate(-31.15,-20.94)"/>
|
|
||||||
<path stroke-dasharray="1,2" stroke-linecap="round" stroke-width="1" stroke="#545454" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m28.4888,25.5943l0.632,0l-0.632,-1.1115l0.0305,-1.3114l0.6445,-1.103l0.7745,-0.632l0.3502,-0.7142l0.9981,-1.8354l-1.4221,0.9295l-1.6267,0.1116l-0.8272,0.5112l-0.9667,-0.4926l-0.2509,-1.3664l1.0317,-0.5763l0.9945,-1.5429l-0.1999,-0.7236l1.1015,-1.0425l-0.4275,-1.608l0.7064,-0.0651l0.9388,0.7157l1.8125,0.1674l1.719,0.9102l0.8129,1.0906l0.7719,2.014l0.2296,2.4972l-0.257,2.9999l-0.8925,0.5883l-0.2145,1.5893l0.6173,0l0.6605,1.2606l0.5122,1.9929l-8.9594,0l0.5289,-1.9929l0.8089,-1.2606l0,0z" transform="translate(31.25,11.75) scale(-0.7,0.7) translate(-31.15,-20.94)"/>
|
|
||||||
<path stroke-width="1" stroke="#545454" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m14.5112,25.5943l-0.632,0l0.632,-1.1115l-0.0305,-1.3114l-0.6445,-1.103l-0.7745,-0.632l-0.3502,-0.7142l-0.9981,-1.8354l1.4221,0.9295l1.6267,0.1116l0.8272,0.5112l0.9667,-0.4926l0.2509,-1.3664l-1.0317,-0.5763l-0.9945,-1.5429l0.1999,-0.7236l-1.1015,-1.0425l0.4275,-1.608l-0.7064,-0.0651l-0.9388,0.7157l-1.8125,0.1674l-1.71896,0.9102l-0.81298,1.0906l-0.77183,2.014l-0.22958,2.4972l0.25693,2.9999l0.89251,0.5883l0.21446,1.5893l-0.6172,0l-0.66057,1.2606l-0.51219,1.9929l8.95941,0l-0.5289,-1.9929l-0.8089,-1.2606l0,0z" transform="translate(11.75,31.25) scale(0.7) translate(-11.85,-20.93)"/>
|
|
||||||
<path stroke-dasharray="1,2" stroke-linecap="round" stroke-width="1" stroke="#545454" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m28.4888,25.5943l0.632,0l-0.632,-1.1115l0.0305,-1.3114l0.6445,-1.103l0.7745,-0.632l0.3502,-0.7142l0.9981,-1.8354l-1.4221,0.9295l-1.6267,0.1116l-0.8272,0.5112l-0.9667,-0.4926l-0.2509,-1.3664l1.0317,-0.5763l0.9945,-1.5429l-0.1999,-0.7236l1.1015,-1.0425l-0.4275,-1.608l0.7064,-0.0651l0.9388,0.7157l1.8125,0.1674l1.719,0.9102l0.8129,1.0906l0.7719,2.014l0.2296,2.4972l-0.257,2.9999l-0.8925,0.5883l-0.2145,1.5893l0.6173,0l0.6605,1.2606l0.5122,1.9929l-8.9594,0l0.5289,-1.9929l0.8089,-1.2606l0,0z" transform="translate(31.25,31.25) scale(0.7) translate(-31.15,-20.94)"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.3 KiB |
@@ -1,10 +0,0 @@
|
|||||||
<svg width="43" height="43" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<rect fill="#54545a" rx="3.5" height="40" width="40" y="1.5" x="1.5"/>
|
|
||||||
<path stroke-width="1.0" fill="#b3b3b3" d="m38,2a3,3 0 0 1 3,3l0,33a3,3 0 0 1 -3,3l-33,0a3,3 0 0 1 -3,-3l0,-33a3,3 0 0 1 3,-3l33,0m0,-1l-33,0a4,4 0 0 0 -4,4l0,33a4,4 0 0 0 4,4l33,0a4,4 0 0 0 4,-4l0,-33a4,4 0 0 0 -4,-4z"/>
|
|
||||||
<path stroke-linecap="round" stroke-width="0.8" stroke="#c4c4c4" fill="#c4c4c4" d="m21.5275,5.5l0,31.9"/>
|
|
||||||
<path stroke-linecap="round" stroke-width="0.8" stroke="#c4c4c4" fill="#c4c4c4" d="m6.7,21.575891l29.2,0"/>
|
|
||||||
<path stroke-dasharray="1,2" stroke-linecap="round" stroke-width="1" stroke="#c4c4c4" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m28.4888,25.5943l0.632,0l-0.632,-1.1115l0.0305,-1.3114l0.6445,-1.103l0.7745,-0.632l0.3502,-0.7142l0.9981,-1.8354l-1.4221,0.9295l-1.6267,0.1116l-0.8272,0.5112l-0.9667,-0.4926l-0.2509,-1.3664l1.0317,-0.5763l0.9945,-1.5429l-0.1999,-0.7236l1.1015,-1.0425l-0.4275,-1.608l0.7064,-0.0651l0.9388,0.7157l1.8125,0.1674l1.719,0.9102l0.8129,1.0906l0.7719,2.014l0.2296,2.4972l-0.257,2.9999l-0.8925,0.5883l-0.2145,1.5893l0.6173,0l0.6605,1.2606l0.5122,1.9929l-8.9594,0l0.5289,-1.9929l0.8089,-1.2606l0,0z" transform="translate(11.75,11.75) scale(0.7) translate(-31.15,-20.94)"/>
|
|
||||||
<path stroke-dasharray="1,2" stroke-linecap="round" stroke-width="1" stroke="#c4c4c4" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m28.4888,25.5943l0.632,0l-0.632,-1.1115l0.0305,-1.3114l0.6445,-1.103l0.7745,-0.632l0.3502,-0.7142l0.9981,-1.8354l-1.4221,0.9295l-1.6267,0.1116l-0.8272,0.5112l-0.9667,-0.4926l-0.2509,-1.3664l1.0317,-0.5763l0.9945,-1.5429l-0.1999,-0.7236l1.1015,-1.0425l-0.4275,-1.608l0.7064,-0.0651l0.9388,0.7157l1.8125,0.1674l1.719,0.9102l0.8129,1.0906l0.7719,2.014l0.2296,2.4972l-0.257,2.9999l-0.8925,0.5883l-0.2145,1.5893l0.6173,0l0.6605,1.2606l0.5122,1.9929l-8.9594,0l0.5289,-1.9929l0.8089,-1.2606l0,0z" transform="translate(31.25,11.75) scale(-0.7,0.7) translate(-31.15,-20.94)"/>
|
|
||||||
<path stroke-width="1" stroke="#c4c4c4" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m14.5112,25.5943l-0.632,0l0.632,-1.1115l-0.0305,-1.3114l-0.6445,-1.103l-0.7745,-0.632l-0.3502,-0.7142l-0.9981,-1.8354l1.4221,0.9295l1.6267,0.1116l0.8272,0.5112l0.9667,-0.4926l0.2509,-1.3664l-1.0317,-0.5763l-0.9945,-1.5429l0.1999,-0.7236l-1.1015,-1.0425l0.4275,-1.608l-0.7064,-0.0651l-0.9388,0.7157l-1.8125,0.1674l-1.71896,0.9102l-0.81298,1.0906l-0.77183,2.014l-0.22958,2.4972l0.25693,2.9999l0.89251,0.5883l0.21446,1.5893l-0.6172,0l-0.66057,1.2606l-0.51219,1.9929l8.95941,0l-0.5289,-1.9929l-0.8089,-1.2606l0,0z" transform="translate(11.75,31.25) scale(0.7) translate(-11.85,-20.93)"/>
|
|
||||||
<path stroke-dasharray="1,2" stroke-linecap="round" stroke-width="1" stroke="#c4c4c4" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m28.4888,25.5943l0.632,0l-0.632,-1.1115l0.0305,-1.3114l0.6445,-1.103l0.7745,-0.632l0.3502,-0.7142l0.9981,-1.8354l-1.4221,0.9295l-1.6267,0.1116l-0.8272,0.5112l-0.9667,-0.4926l-0.2509,-1.3664l1.0317,-0.5763l0.9945,-1.5429l-0.1999,-0.7236l1.1015,-1.0425l-0.4275,-1.608l0.7064,-0.0651l0.9388,0.7157l1.8125,0.1674l1.719,0.9102l0.8129,1.0906l0.7719,2.014l0.2296,2.4972l-0.257,2.9999l-0.8925,0.5883l-0.2145,1.5893l0.6173,0l0.6605,1.2606l0.5122,1.9929l-8.9594,0l0.5289,-1.9929l0.8089,-1.2606l0,0z" transform="translate(31.25,31.25) scale(0.7) translate(-31.15,-20.94)"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.3 KiB |
@@ -1,10 +0,0 @@
|
|||||||
<svg width="43" height="43" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<rect fill="#e9e9e9" rx="3.5" height="40" width="40" y="1.5" x="1.5"/>
|
|
||||||
<path stroke-width="1.0" fill="#009688" d="m38,2a3,3 0 0 1 3,3l0,33a3,3 0 0 1 -3,3l-33,0a3,3 0 0 1 -3,-3l0,-33a3,3 0 0 1 3,-3l33,0m0,-1l-33,0a4,4 0 0 0 -4,4l0,33a4,4 0 0 0 4,4l33,0a4,4 0 0 0 4,-4l0,-33a4,4 0 0 0 -4,-4z"/>
|
|
||||||
<path stroke-linecap="round" stroke-width="0.8" stroke="#009688" fill="#009688" d="m21.5275,5.5l0,31.9"/>
|
|
||||||
<path stroke-linecap="round" stroke-width="0.8" stroke="#009688" fill="#009688" d="m6.7,21.575891l29.2,0"/>
|
|
||||||
<path stroke-dasharray="1,2" stroke-linecap="round" stroke-width="1" stroke="#009688" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m28.4888,25.5943l0.632,0l-0.632,-1.1115l0.0305,-1.3114l0.6445,-1.103l0.7745,-0.632l0.3502,-0.7142l0.9981,-1.8354l-1.4221,0.9295l-1.6267,0.1116l-0.8272,0.5112l-0.9667,-0.4926l-0.2509,-1.3664l1.0317,-0.5763l0.9945,-1.5429l-0.1999,-0.7236l1.1015,-1.0425l-0.4275,-1.608l0.7064,-0.0651l0.9388,0.7157l1.8125,0.1674l1.719,0.9102l0.8129,1.0906l0.7719,2.014l0.2296,2.4972l-0.257,2.9999l-0.8925,0.5883l-0.2145,1.5893l0.6173,0l0.6605,1.2606l0.5122,1.9929l-8.9594,0l0.5289,-1.9929l0.8089,-1.2606l0,0z" transform="translate(11.75,11.75) scale(0.7) translate(-31.15,-20.94)"/>
|
|
||||||
<path stroke-dasharray="1,2" stroke-linecap="round" stroke-width="1" stroke="#009688" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m28.4888,25.5943l0.632,0l-0.632,-1.1115l0.0305,-1.3114l0.6445,-1.103l0.7745,-0.632l0.3502,-0.7142l0.9981,-1.8354l-1.4221,0.9295l-1.6267,0.1116l-0.8272,0.5112l-0.9667,-0.4926l-0.2509,-1.3664l1.0317,-0.5763l0.9945,-1.5429l-0.1999,-0.7236l1.1015,-1.0425l-0.4275,-1.608l0.7064,-0.0651l0.9388,0.7157l1.8125,0.1674l1.719,0.9102l0.8129,1.0906l0.7719,2.014l0.2296,2.4972l-0.257,2.9999l-0.8925,0.5883l-0.2145,1.5893l0.6173,0l0.6605,1.2606l0.5122,1.9929l-8.9594,0l0.5289,-1.9929l0.8089,-1.2606l0,0z" transform="translate(31.25,11.75) scale(-0.7,0.7) translate(-31.15,-20.94)"/>
|
|
||||||
<path stroke-width="1" stroke="#009688" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m14.5112,25.5943l-0.632,0l0.632,-1.1115l-0.0305,-1.3114l-0.6445,-1.103l-0.7745,-0.632l-0.3502,-0.7142l-0.9981,-1.8354l1.4221,0.9295l1.6267,0.1116l0.8272,0.5112l0.9667,-0.4926l0.2509,-1.3664l-1.0317,-0.5763l-0.9945,-1.5429l0.1999,-0.7236l-1.1015,-1.0425l0.4275,-1.608l-0.7064,-0.0651l-0.9388,0.7157l-1.8125,0.1674l-1.71896,0.9102l-0.81298,1.0906l-0.77183,2.014l-0.22958,2.4972l0.25693,2.9999l0.89251,0.5883l0.21446,1.5893l-0.6172,0l-0.66057,1.2606l-0.51219,1.9929l8.95941,0l-0.5289,-1.9929l-0.8089,-1.2606l0,0z" transform="translate(11.75,31.25) scale(0.7) translate(-11.85,-20.93)"/>
|
|
||||||
<path stroke-dasharray="1,2" stroke-linecap="round" stroke-width="1" stroke="#009688" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m28.4888,25.5943l0.632,0l-0.632,-1.1115l0.0305,-1.3114l0.6445,-1.103l0.7745,-0.632l0.3502,-0.7142l0.9981,-1.8354l-1.4221,0.9295l-1.6267,0.1116l-0.8272,0.5112l-0.9667,-0.4926l-0.2509,-1.3664l1.0317,-0.5763l0.9945,-1.5429l-0.1999,-0.7236l1.1015,-1.0425l-0.4275,-1.608l0.7064,-0.0651l0.9388,0.7157l1.8125,0.1674l1.719,0.9102l0.8129,1.0906l0.7719,2.014l0.2296,2.4972l-0.257,2.9999l-0.8925,0.5883l-0.2145,1.5893l0.6173,0l0.6605,1.2606l0.5122,1.9929l-8.9594,0l0.5289,-1.9929l0.8089,-1.2606l0,0z" transform="translate(31.25,31.25) scale(0.7) translate(-31.15,-20.94)"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.3 KiB |
@@ -1,10 +0,0 @@
|
|||||||
<svg width="43" height="43" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<rect fill="#54545a" rx="3.5" height="40" width="40" y="1.5" x="1.5"/>
|
|
||||||
<path stroke-width="1.0" fill="#009688" d="m38,2a3,3 0 0 1 3,3l0,33a3,3 0 0 1 -3,3l-33,0a3,3 0 0 1 -3,-3l0,-33a3,3 0 0 1 3,-3l33,0m0,-1l-33,0a4,4 0 0 0 -4,4l0,33a4,4 0 0 0 4,4l33,0a4,4 0 0 0 4,-4l0,-33a4,4 0 0 0 -4,-4z"/>
|
|
||||||
<path stroke-linecap="round" stroke-width="0.8" stroke="#009688" fill="#009688" d="m21.5275,5.5l0,31.9"/>
|
|
||||||
<path stroke-linecap="round" stroke-width="0.8" stroke="#009688" fill="#009688" d="m6.7,21.575891l29.2,0"/>
|
|
||||||
<path stroke-dasharray="1,2" stroke-linecap="round" stroke-width="1" stroke="#009688" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m28.4888,25.5943l0.632,0l-0.632,-1.1115l0.0305,-1.3114l0.6445,-1.103l0.7745,-0.632l0.3502,-0.7142l0.9981,-1.8354l-1.4221,0.9295l-1.6267,0.1116l-0.8272,0.5112l-0.9667,-0.4926l-0.2509,-1.3664l1.0317,-0.5763l0.9945,-1.5429l-0.1999,-0.7236l1.1015,-1.0425l-0.4275,-1.608l0.7064,-0.0651l0.9388,0.7157l1.8125,0.1674l1.719,0.9102l0.8129,1.0906l0.7719,2.014l0.2296,2.4972l-0.257,2.9999l-0.8925,0.5883l-0.2145,1.5893l0.6173,0l0.6605,1.2606l0.5122,1.9929l-8.9594,0l0.5289,-1.9929l0.8089,-1.2606l0,0z" transform="translate(11.75,11.75) scale(0.7) translate(-31.15,-20.94)"/>
|
|
||||||
<path stroke-dasharray="1,2" stroke-linecap="round" stroke-width="1" stroke="#009688" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m28.4888,25.5943l0.632,0l-0.632,-1.1115l0.0305,-1.3114l0.6445,-1.103l0.7745,-0.632l0.3502,-0.7142l0.9981,-1.8354l-1.4221,0.9295l-1.6267,0.1116l-0.8272,0.5112l-0.9667,-0.4926l-0.2509,-1.3664l1.0317,-0.5763l0.9945,-1.5429l-0.1999,-0.7236l1.1015,-1.0425l-0.4275,-1.608l0.7064,-0.0651l0.9388,0.7157l1.8125,0.1674l1.719,0.9102l0.8129,1.0906l0.7719,2.014l0.2296,2.4972l-0.257,2.9999l-0.8925,0.5883l-0.2145,1.5893l0.6173,0l0.6605,1.2606l0.5122,1.9929l-8.9594,0l0.5289,-1.9929l0.8089,-1.2606l0,0z" transform="translate(31.25,11.75) scale(-0.7,0.7) translate(-31.15,-20.94)"/>
|
|
||||||
<path stroke-width="1" stroke="#009688" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m14.5112,25.5943l-0.632,0l0.632,-1.1115l-0.0305,-1.3114l-0.6445,-1.103l-0.7745,-0.632l-0.3502,-0.7142l-0.9981,-1.8354l1.4221,0.9295l1.6267,0.1116l0.8272,0.5112l0.9667,-0.4926l0.2509,-1.3664l-1.0317,-0.5763l-0.9945,-1.5429l0.1999,-0.7236l-1.1015,-1.0425l0.4275,-1.608l-0.7064,-0.0651l-0.9388,0.7157l-1.8125,0.1674l-1.71896,0.9102l-0.81298,1.0906l-0.77183,2.014l-0.22958,2.4972l0.25693,2.9999l0.89251,0.5883l0.21446,1.5893l-0.6172,0l-0.66057,1.2606l-0.51219,1.9929l8.95941,0l-0.5289,-1.9929l-0.8089,-1.2606l0,0z" transform="translate(11.75,31.25) scale(0.7) translate(-11.85,-20.93)"/>
|
|
||||||
<path stroke-dasharray="1,2" stroke-linecap="round" stroke-width="1" stroke="#009688" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m28.4888,25.5943l0.632,0l-0.632,-1.1115l0.0305,-1.3114l0.6445,-1.103l0.7745,-0.632l0.3502,-0.7142l0.9981,-1.8354l-1.4221,0.9295l-1.6267,0.1116l-0.8272,0.5112l-0.9667,-0.4926l-0.2509,-1.3664l1.0317,-0.5763l0.9945,-1.5429l-0.1999,-0.7236l1.1015,-1.0425l-0.4275,-1.608l0.7064,-0.0651l0.9388,0.7157l1.8125,0.1674l1.719,0.9102l0.8129,1.0906l0.7719,2.014l0.2296,2.4972l-0.257,2.9999l-0.8925,0.5883l-0.2145,1.5893l0.6173,0l0.6605,1.2606l0.5122,1.9929l-8.9594,0l0.5289,-1.9929l0.8089,-1.2606l0,0z" transform="translate(31.25,31.25) scale(0.7) translate(-31.15,-20.94)"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.3 KiB |
@@ -1,7 +0,0 @@
|
|||||||
<svg width="43" height="43" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<rect fill="#e9e9e9" rx="3.5" height="40" width="40" y="1.5" x="1.5"/>
|
|
||||||
<path stroke-width="1.0" fill="#545454" d="m38,2a3,3 0 0 1 3,3l0,33a3,3 0 0 1 -3,3l-33,0a3,3 0 0 1 -3,-3l0,-33a3,3 0 0 1 3,-3l33,0m0,-1l-33,0a4,4 0 0 0 -4,4l0,33a4,4 0 0 0 4,4l33,0a4,4 0 0 0 4,-4l0,-33a4,4 0 0 0 -4,-4z"/>
|
|
||||||
<path stroke-linecap="round" stroke-width="0.8" stroke="#545454" fill="#545454" d="m21.5275,7.14657l0,28.59908"/>
|
|
||||||
<path stroke-width="1.0" stroke="#545454" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m14.5112,25.5943l-0.632,0l0.632,-1.1115l-0.0305,-1.3114l-0.6445,-1.103l-0.7745,-0.632l-0.3502,-0.7142l-0.9981,-1.8354l1.4221,0.9295l1.6267,0.1116l0.8272,0.5112l0.9667,-0.4926l0.2509,-1.3664l-1.0317,-0.5763l-0.9945,-1.5429l0.1999,-0.7236l-1.1015,-1.0425l0.4275,-1.608l-0.7064,-0.0651l-0.9388,0.7157l-1.8125,0.1674l-1.71896,0.9102l-0.81298,1.0906l-0.77183,2.014l-0.22958,2.4972l0.25693,2.9999l0.89251,0.5883l0.21446,1.5893l-0.6172,0l-0.66057,1.2606l-0.51219,1.9929l8.95941,0l-0.5289,-1.9929l-0.8089,-1.2606l0,0z"/>
|
|
||||||
<path stroke-dasharray="1,2" stroke-linecap="round" stroke-width="1.0" stroke="#545454" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m28.4888,25.5943l0.632,0l-0.632,-1.1115l0.0305,-1.3114l0.6445,-1.103l0.7745,-0.632l0.3502,-0.7142l0.9981,-1.8354l-1.4221,0.9295l-1.6267,0.1116l-0.8272,0.5112l-0.9667,-0.4926l-0.2509,-1.3664l1.0317,-0.5763l0.9945,-1.5429l-0.1999,-0.7236l1.1015,-1.0425l-0.4275,-1.608l0.7064,-0.0651l0.9388,0.7157l1.8125,0.1674l1.719,0.9102l0.8129,1.0906l0.7719,2.014l0.2296,2.4972l-0.257,2.9999l-0.8925,0.5883l-0.2145,1.5893l0.6173,0l0.6605,1.2606l0.5122,1.9929l-8.9594,0l0.5289,-1.9929l0.8089,-1.2606l0,0z"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,7 +0,0 @@
|
|||||||
<svg width="43" height="43" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<rect fill="#54545a" rx="3.5" height="40" width="40" y="1.5" x="1.5"/>
|
|
||||||
<path stroke-width="1.0" fill="#b3b3b3" d="m38,2a3,3 0 0 1 3,3l0,33a3,3 0 0 1 -3,3l-33,0a3,3 0 0 1 -3,-3l0,-33a3,3 0 0 1 3,-3l33,0m0,-1l-33,0a4,4 0 0 0 -4,4l0,33a4,4 0 0 0 4,4l33,0a4,4 0 0 0 4,-4l0,-33a4,4 0 0 0 -4,-4z"/>
|
|
||||||
<path stroke-linecap="round" stroke-width="0.8" stroke="#c4c4c4" fill="#c4c4c4" d="m21.5275,7.14657l0,28.59908"/>
|
|
||||||
<path stroke-width="1.0" stroke="#c4c4c4" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m14.5112,25.5943l-0.632,0l0.632,-1.1115l-0.0305,-1.3114l-0.6445,-1.103l-0.7745,-0.632l-0.3502,-0.7142l-0.9981,-1.8354l1.4221,0.9295l1.6267,0.1116l0.8272,0.5112l0.9667,-0.4926l0.2509,-1.3664l-1.0317,-0.5763l-0.9945,-1.5429l0.1999,-0.7236l-1.1015,-1.0425l0.4275,-1.608l-0.7064,-0.0651l-0.9388,0.7157l-1.8125,0.1674l-1.71896,0.9102l-0.81298,1.0906l-0.77183,2.014l-0.22958,2.4972l0.25693,2.9999l0.89251,0.5883l0.21446,1.5893l-0.6172,0l-0.66057,1.2606l-0.51219,1.9929l8.95941,0l-0.5289,-1.9929l-0.8089,-1.2606l0,0z"/>
|
|
||||||
<path stroke-dasharray="1,2" stroke-linecap="round" stroke-width="1.0" stroke="#c4c4c4" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m28.4888,25.5943l0.632,0l-0.632,-1.1115l0.0305,-1.3114l0.6445,-1.103l0.7745,-0.632l0.3502,-0.7142l0.9981,-1.8354l-1.4221,0.9295l-1.6267,0.1116l-0.8272,0.5112l-0.9667,-0.4926l-0.2509,-1.3664l1.0317,-0.5763l0.9945,-1.5429l-0.1999,-0.7236l1.1015,-1.0425l-0.4275,-1.608l0.7064,-0.0651l0.9388,0.7157l1.8125,0.1674l1.719,0.9102l0.8129,1.0906l0.7719,2.014l0.2296,2.4972l-0.257,2.9999l-0.8925,0.5883l-0.2145,1.5893l0.6173,0l0.6605,1.2606l0.5122,1.9929l-8.9594,0l0.5289,-1.9929l0.8089,-1.2606l0,0z"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,7 +0,0 @@
|
|||||||
<svg width="43" height="43" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<rect fill="#e9e9e9" rx="3.5" height="40" width="40" y="1.5" x="1.5"/>
|
|
||||||
<path stroke-width="1.0" fill="#009688" d="m38,2a3,3 0 0 1 3,3l0,33a3,3 0 0 1 -3,3l-33,0a3,3 0 0 1 -3,-3l0,-33a3,3 0 0 1 3,-3l33,0m0,-1l-33,0a4,4 0 0 0 -4,4l0,33a4,4 0 0 0 4,4l33,0a4,4 0 0 0 4,-4l0,-33a4,4 0 0 0 -4,-4z"/>
|
|
||||||
<path stroke-linecap="round" stroke-width="0.8" stroke="#009688" fill="#009688" d="m21.5275,7.14657l0,28.59908"/>
|
|
||||||
<path stroke-width="1.0" stroke="#009688" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m14.5112,25.5943l-0.632,0l0.632,-1.1115l-0.0305,-1.3114l-0.6445,-1.103l-0.7745,-0.632l-0.3502,-0.7142l-0.9981,-1.8354l1.4221,0.9295l1.6267,0.1116l0.8272,0.5112l0.9667,-0.4926l0.2509,-1.3664l-1.0317,-0.5763l-0.9945,-1.5429l0.1999,-0.7236l-1.1015,-1.0425l0.4275,-1.608l-0.7064,-0.0651l-0.9388,0.7157l-1.8125,0.1674l-1.71896,0.9102l-0.81298,1.0906l-0.77183,2.014l-0.22958,2.4972l0.25693,2.9999l0.89251,0.5883l0.21446,1.5893l-0.6172,0l-0.66057,1.2606l-0.51219,1.9929l8.95941,0l-0.5289,-1.9929l-0.8089,-1.2606l0,0z"/>
|
|
||||||
<path stroke-dasharray="1,2" stroke-linecap="round" stroke-width="1.0" stroke="#009688" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m28.4888,25.5943l0.632,0l-0.632,-1.1115l0.0305,-1.3114l0.6445,-1.103l0.7745,-0.632l0.3502,-0.7142l0.9981,-1.8354l-1.4221,0.9295l-1.6267,0.1116l-0.8272,0.5112l-0.9667,-0.4926l-0.2509,-1.3664l1.0317,-0.5763l0.9945,-1.5429l-0.1999,-0.7236l1.1015,-1.0425l-0.4275,-1.608l0.7064,-0.0651l0.9388,0.7157l1.8125,0.1674l1.719,0.9102l0.8129,1.0906l0.7719,2.014l0.2296,2.4972l-0.257,2.9999l-0.8925,0.5883l-0.2145,1.5893l0.6173,0l0.6605,1.2606l0.5122,1.9929l-8.9594,0l0.5289,-1.9929l0.8089,-1.2606l0,0z"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,7 +0,0 @@
|
|||||||
<svg width="43" height="43" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<rect fill="#54545a" rx="3.5" height="40" width="40" y="1.5" x="1.5"/>
|
|
||||||
<path stroke-width="1.0" fill="#009688" d="m38,2a3,3 0 0 1 3,3l0,33a3,3 0 0 1 -3,3l-33,0a3,3 0 0 1 -3,-3l0,-33a3,3 0 0 1 3,-3l33,0m0,-1l-33,0a4,4 0 0 0 -4,4l0,33a4,4 0 0 0 4,4l33,0a4,4 0 0 0 4,-4l0,-33a4,4 0 0 0 -4,-4z"/>
|
|
||||||
<path stroke-linecap="round" stroke-width="0.8" stroke="#009688" fill="#009688" d="m21.5275,7.14657l0,28.59908"/>
|
|
||||||
<path stroke-width="1.0" stroke="#009688" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m14.5112,25.5943l-0.632,0l0.632,-1.1115l-0.0305,-1.3114l-0.6445,-1.103l-0.7745,-0.632l-0.3502,-0.7142l-0.9981,-1.8354l1.4221,0.9295l1.6267,0.1116l0.8272,0.5112l0.9667,-0.4926l0.2509,-1.3664l-1.0317,-0.5763l-0.9945,-1.5429l0.1999,-0.7236l-1.1015,-1.0425l0.4275,-1.608l-0.7064,-0.0651l-0.9388,0.7157l-1.8125,0.1674l-1.71896,0.9102l-0.81298,1.0906l-0.77183,2.014l-0.22958,2.4972l0.25693,2.9999l0.89251,0.5883l0.21446,1.5893l-0.6172,0l-0.66057,1.2606l-0.51219,1.9929l8.95941,0l-0.5289,-1.9929l-0.8089,-1.2606l0,0z"/>
|
|
||||||
<path stroke-dasharray="1,2" stroke-linecap="round" stroke-width="1.0" stroke="#009688" fill-opacity="0" fill="#ffffff" fill-rule="nonzero" d="m28.4888,25.5943l0.632,0l-0.632,-1.1115l0.0305,-1.3114l0.6445,-1.103l0.7745,-0.632l0.3502,-0.7142l0.9981,-1.8354l-1.4221,0.9295l-1.6267,0.1116l-0.8272,0.5112l-0.9667,-0.4926l-0.2509,-1.3664l1.0317,-0.5763l0.9945,-1.5429l-0.1999,-0.7236l1.1015,-1.0425l-0.4275,-1.608l0.7064,-0.0651l0.9388,0.7157l1.8125,0.1674l1.719,0.9102l0.8129,1.0906l0.7719,2.014l0.2296,2.4972l-0.257,2.9999l-0.8925,0.5883l-0.2145,1.5893l0.6173,0l0.6605,1.2606l0.5122,1.9929l-8.9594,0l0.5289,-1.9929l0.8089,-1.2606l0,0z"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,10 +0,0 @@
|
|||||||
<svg width="43" height="43" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<rect fill="#e9e9e9" rx="3.5" height="40" width="40" x="1.5" y="1.5"/>
|
|
||||||
<path fill="#545454" d="m38,2a3,3 0 0 1 3,3l0,33a3,3 0 0 1 -3,3l-33,0a3,3 0 0 1 -3,-3l0,-33a3,3 0 0 1 3,-3l33,0m0,-1l-33,0a4,4 0 0 0 -4,4l0,33a4,4 0 0 0 4,4l33,0a4,4 0 0 0 4,-4l0,-33a4,4 0 0 0 -4,-4z"/>
|
|
||||||
<path stroke="#545454" fill="#ffffff" fill-opacity="0" fill-rule="nonzero" stroke-width="1.0" d="m27.20643,29.4739l-1.21802,0l1.21802,-2.14213l-0.05879,-2.52738l-1.2421,-2.12576l-1.49265,-1.21801l-0.67492,-1.37644l-1.92358,-3.53726l2.74073,1.79137l3.13505,0.21508l1.59421,0.98521l1.86307,-0.94935l0.48354,-2.63339l-1.98833,-1.11067l-1.91665,-2.97354l0.38526,-1.39456l-2.12286,-2.00915l0.82389,-3.09901l-1.3614,-0.12546l-1.80929,1.37933l-3.49313,0.32262l-3.31285,1.75417l-1.56681,2.10186l-1.48751,3.88146l-0.44245,4.81271l0.49516,5.78154l1.72009,1.13379l0.41331,3.06297l-1.1895,0l-1.27306,2.42948l-0.98712,3.8408l17.26695,0l-1.01931,-3.8408l-1.55895,-2.42948l0,0z"/>
|
|
||||||
<path stroke="#545454" stroke-dasharray="2,2" d="m23.61156,6.63793l-1.16183,2.2557l-1.89806,0.27415l-2.4104,1.37699l-1.46486,2.1687l-1.05714,3.57465l-0.28913,4.51495l0.30214,6.3633" fill-opacity="0" stroke-width="1.0" fill="none"/>
|
|
||||||
<line stroke="#545454" stroke-dasharray="2,2" y2="32.58856" x2="28.96602" y1="32.58856" x1="13.5093" fill-opacity="0" stroke-width="1.0" fill="none"/>
|
|
||||||
<line stroke="#545454" y2="29.47069" x2="25.98988" y1="29.47069" x1="16.06028" fill-opacity="0" stroke-width="1.0" fill="none"/>
|
|
||||||
<path stroke="#545454" stroke-dasharray="2,2" d="m27.94317,10.33418l-2.21519,0.02258l-0.32541,0.65079l2.39086,0.92312" fill-opacity="0" stroke-width="1.0" fill="none"/>
|
|
||||||
<path stroke="#545454" stroke-dasharray="2,2" d="m31.36607,16.48593l-1.47286,-0.34296l0.38557,-0.77114" stroke-width="1.0" fill-opacity="0" fill="none"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.8 KiB |