muuli_wdr: silence Gtk-CRITICAL warnings on Preferences + Networks tabs - #739
Merged
mrjimenez merged 2 commits intoMay 27, 2026
Merged
Conversation
…ject#737) Six SpinCtrls in the Preferences dialog were pinned to widths that fall below GtkSpinButton's intrinsic minimum on wxGTK 3.2 / GTK3: IDC_TOOLTIPDELAY wxSize(40, -1) General tab IDC_SERVERRETRIES wxSize(40, -1) Server tab IDC_OSUPDATE wxSize(60, -1) Online Signature tab IDC_MAXDOWN wxSize(140, -1) Connection tab (Bandwidth limits) IDC_MAXUP wxSize(140, -1) Connection tab (Bandwidth limits) IDC_SLOTALLOC wxSize(140, -1) Connection tab (Bandwidth limits) GTK3's GtkSpinButton is a composite widget (entry + stacked up/down arrows). The internal box gadget needs ~80 px just to fit the entry + arrow column at the default theme; combined with the surrounding wxFlexGridSizer / wxBoxSizer's tight allocation, forcing a smaller or even an explicit "we know what we want" wx-side hint shoves the entry's allocation below zero, which triggers Gtk-CRITICAL: gtk_box_gadget_distribute: assertion 'size >= 0' failed in GtkSpinButton every time the panel is laid out (open Preferences, switch tabs, expose). The 140 px hint on the bandwidth caps was originally widened from 100 px in amule-project#463 to fit million-kB/s values; the new width itself isn't too narrow, but combining an explicit wxSize with the column's sizer constraints still leaves GTK's internal layout pass unhappy. Same family as amule-project#569 / 82626f2 on the search dialog, just on the Preferences side. Fix: drop the explicit width to wxDefaultSize on all six and let the layout engine pick. macOS / Windows already render side-by-side spin buttons that fit comfortably in the default; GTK gets the larger geometry it needs for stacked arrows. The label / unit text on either side of each spin keeps its own sizer flags, so the row overall still flows the same. Reported in amule-project#737 (Diego Heras), verified on amule-dev-vm with the fixed AppImage — no more Gtk-CRITICAL SpinButton warnings on Preferences open or tab switch. The Gtk-CRITICAL GtkScrollbar variant @ngosang also reported is a separate widget family (likely a wxScrolledWindow / wxListBox sub-widget), tracking that independently of this PR.
…n-size (amule-project#737) The Networks notebook page constructs five scroll-bearing widgets at wxDefaultPosition, wxDefaultSize: CServerListCtrl ID_SERVERLIST (serverListDlgUp, list) wxListCtrl ID_ED2KINFO (ED2K_Info, list) wxListCtrl ID_KADINFO (Kad_Info, list) CMuleTextCtrl ID_LOGVIEW (aMuleLog, multi-line+VSCROLL) CMuleTextCtrl ID_SERVERINFO (ServerInfoLog, multi-line+VSCROLL) On wxGTK 3.2 / GTK3 each is internally backed by a GtkScrolledWindow (+ GtkTreeView for the lists, + GtkTextView for the text controls). During the parent wxNotebook page's first realisation pass the allocation is still 0x0, so the inner GtkScrollbars lay out in negative space and each trigger Gtk-CRITICAL: gtk_box_gadget_distribute: assertion 'size >= 0' failed in GtkScrollbar once when the user first selects the Networks tab and / or navigates through the log sub-tabs (aMule Log / Server Info / ED2K Info / Kad Info). Fix: give each widget a small wxSize(200, 100) min-size hint. That's enough for the inner GtkScrollbars to lay out cleanly during the initial realisation; steady-state behaviour is unchanged because each widget is added to its sizer with wxSizerFlags(1).Expand() and grows to fill the page as soon as the notebook is sized. Same pattern as the wxSize(160, 120) hint already used on the Events-tab wxListCtrl. Networks tab now produces zero Gtk-CRITICAL lines from a fresh AppImage build on Ubuntu ARM. Reported on amule-project#737 (Diego Heras).
mrjimenez
pushed a commit
to mrjimenez/amule
that referenced
this pull request
Aug 1, 2026
… (amule-project#739) * feat(gui): wxFAIL_MSG on unexpected icon-bank index (amule-project#675) got3nks (PR amule-project#725 review): every raw-bitmap bank in this file (clientImages, amuleSpecial, connButImg, amuleDlgImages) fails silently -- an index with no matching block falls through to wxNullBitmap, i.e. a blank icon, with no compiler error, no link error, and nothing for CI to catch. That's exactly how an incorrectly deleted amuleSpecial(25) almost shipped in amule-project#725: it would have compiled clean in every configuration and only shown up to a human who happened to open the right dialog in a debug build. wxFAIL_MSG matches this codebase's existing assert idiom (see GenericClientListCtrl.cpp, MuleListCtrl.cpp) and is a no-op outside debug builds, so this is a debug-only safety net with no release behaviour change. Doing it now, ahead of the riskier remaining slices, matters most for clientImages: it's consumed with index arithmetic across four call sites (Client_InvalidRating_Smiley + rating - 1), so an off-by-one there is exactly this failure mode -- one blank smiley, nothing failing anywhere. The assert turns that into an immediate stop on the first debug run instead of a maybe-someday-noticed bug. Verified via a full Debug-config build (macOS, wxDEBUG_LEVEL default, not the Win32-only wxDEBUG_LEVEL=0 override) and a visual pass through every tab/dialog that reaches one of these banks (Reti, Messaggi, File condivisi, Preferenze) -- no assertion fired, confirming every index currently in use is legitimate. * docs(gui): note amuleSpecial(25)'s __DEBUG__-only consumer PR amule-project#725 review: this index looked dead by the same criterion used for the ones actually removed, but it's reachable via PrefsUnifiedDlg.cpp's pages[] table -- one entry ("Debugging", PreferencesDebug) is guarded by #ifdef __DEBUG__ and breaks the Preferences<Something>Tab naming convention every other entry follows, which is exactly what made it easy to miss with a naming-pattern-based grep or a release-only build. Deleting it wouldn't have failed any build (falls through to wxNullBitmap), so the only symptom would have been a blank icon on a debug-only preferences page -- worth spelling out for the next pass over this file. --------- Co-authored-by: got3nks <[email protected]>
mrjimenez
pushed a commit
to mrjimenez/amule
that referenced
this pull request
Aug 1, 2026
…or tab-close (amule-project#675) (amule-project#735) * feat(gui): migrate Friends/Messages headers, reload buttons, folder tree, and tab-close icons to CamuleArtProvider Continues the icon-system cleanup scoped in amule-project#675, independent of amule-project#732/amule-project#733 (different files, no overlap). - amuleDlgImages(14)/(15): the small header icons in the Friends and Messages tabs. Friends gets a new "amule:friends" SVG; Messages reuses the existing "amule:toolbar_messages" art, requested at an explicit 16x16 so it doesn't inherit the toolbar's 32x32 natural size. - amuleDlgImages(18)/(30): the "reload list" buttons (shared files, ED2K server list, Kad node list) -- three call sites, one new "amule:reload" SVG (see below for its own history). - amuleSpecial(1)/(2): the shared-directory tree's folder icons get new "amule:folder"/"amule:folder_shared" SVGs -- same shape, tinted orange vs. red, matching how the original raw bitmaps only differed by colour. - amuleSpecial(3)/(4): the chat/search notebook tabs' close-on-hover icon, replaced with wx's own stock wxART_CLOSE for both states instead of a second bespoke asset (both were the same "X in a box" bitmap, differing only by a hover-highlight border colour). reload.svg's own history, per PR review: the first hand-drawn attempt (thin blue single arc) didn't match the original at all -- got3nks caught it, I reconstructed the original amuleDlgImages(18) raster to check (a thicker green double-arrow circle) and redrew closer to that, which still wasn't good enough. Final version is AI-vectorized via Recraft (through the Higgsfield MCP), which got3nks preferred over further hand-drawn iterations. src/icons/icon_data.c (the checked-in fallback used when Python3 is absent at configure time, per amule-project#487) regenerated via embed_icons.py to match. Rebased onto current master (picking up amule-project#732/amule-project#733/amule-project#739, which all touch the same amuleSpecial/amuleDlgImages functions) -- conflicts resolved by redoing the index deletions against the current tree rather than replaying the stale patch, since amule-project#725/amule-project#733 already moved the surrounding line numbers. Verified via a full amule build (macOS) and a visual check of every call site: Friends/Messages tab headers, the ED2K server-list and Kad node-list reload buttons, the shared-files reload button, and the Preferences > Directory shared-folder tree. * fix(gui): thicker reload stroke, dedicated message-bubble icon (amule-project#735 review) got3nks, testing amule-project#735: - reload: arrow bodies read too thin at 16px. Regenerated via Recraft with an explicit thicker/bolder-stroke prompt. - Messages panel header: reusing "amule:toolbar_messages" (the main toolbar's detailed gradient mascot bust) at 16x16 doesn't read as "messages" once shrunk that far from its 32x32 native size. Added a dedicated "amule:message" chat-bubble glyph instead, sized for legibility at 16x16 specifically, and pointed the Messages panel header at it instead of the toolbar art. Folder/folder_shared and the tab-close X were already approved as-is. Verified via a full amule build (macOS) and a visual check of both fixes: the shared-files reload button and the Messages panel header.
mrjimenez
pushed a commit
to mrjimenez/amule
that referenced
this pull request
Aug 4, 2026
…rovider (amule-project#675) (amule-project#747) * feat(gui): migrate 22 of 27 clientImages() status icons to CamuleArtProvider (amule-project#675) Continues the icon-system cleanup scoped in amule-project#675. clientImages() is the last of the raw-bitmap banks, and the riskiest: it's consumed through a wxImageList built once at startup (Apply_Clients_Skin, amuleDlg.cpp) by iterating index 0..26 in ClientSkinEnum order, and four call sites then index that list with arithmetic (Client_InvalidRating_Smiley + rating - 1) rather than calling clientImages() directly. The enum order is load-bearing; this PR does not touch it, the calling loop, or the arithmetic call sites -- only what clientImages(index) returns for each index. 22 of the 27 icons are generic pictograms (smileys, a checkmark, an X, stars, an arrow, a key, ...) with no external branding, migrated to new "amule:client_<name>" SVG/PNG art. The remaining 5 -- indices 12, 15, 16, 17, 18 (eMule/aMule/lphant/Shareaza/xMule) -- are specific client-software mascots and are deliberately left as the original raw artwork: a generated pictogram is one thing, but redrawing someone else's brand mascot risks not matching the real logo, which is worse than not touching it. amule-project#675 discussion flagged this distinction explicitly. New art, per icon: - Green/Red/Yellow/Grey/White: the 5 base transfer-state smileys. - ExtendedProtocol/SecIdent/BadGuy/Encryption: badge overlays drawn per GenericClientListCtrl.cpp's own comments ("the '-'", "the 'v'", "the 'X'", "the '\xc2\xbf' except it's a key"). - CreditsGrey/CreditsYellow: the two credit-system stars. - Upload: the upload-active arrow. - Friend: the friend-list badge. - mlDonkey/eDonkeyHybrid: kept generic/abstract (a checkmark badge, a simple ghost) rather than attempting their real logos -- same reasoning as the 5 mascots, lower bar since these were already more abstract marks than full character art in the original raster. - Unknown: the unresolved-client-type question mark. - InvalidRating/PoorRating/FairRating/GoodRating/ExcellentRating: one potion-bottle SVG re-tinted per rating (red/red/orange/green/green), with Invalid and Excellent composited as two bottles side by side in a single 16x16 square canvas -- matching the original art's single-vs-double-bottle distinction for the two rating extremes. - CommentOnly: the comment-icon badge. Implementation: a static art-id lookup table indexed by ClientSkinEnum value, checked first; a null entry falls through to the corresponding raw-bitmap `if (index == N)` block for the 5 mascot indices, which are otherwise untouched. src/icons/icon_data.c regenerated via embed_icons.py to match. Testing: full build verified (macOS), both Release and Debug config. Debug build launched with a live window (Apply_Clients_Skin runs at startup, touching all 27 indices) and produced no wxFAIL_MSG assertion (amule-project#739) -- confirms every index resolves. Each new icon reviewed individually via rasterized contact sheets at both ~96px and actual 16x16 before being wired in. NOT independently verified: seeing these icons rendered in an actual populated client list (Downloads sources, Shared Files clients, Search results, Friends) requires live eD2k/Kad network data, which a from-scratch test config doesn't have. Same limitation already flagged for fileDetails/clientDetails/CategoriesEditWindow in amule-project#744. * fix(gui): recentre double-bottle rating icons, add ClientSkinEnum static_assert (amule-project#747 review) got3nks, reviewing amule-project#747: 1. client_invalidrating.svg / client_excellentrating.svg didn't fill their 2048x2048 viewport like their poor/fair/good siblings (53%x73% fill for those vs. 83%x44% for these, with the left bottle clipped at x=-47). Recentred both bottle <g> transforms to translate(-110,452)/translate(940,452) with scale raised to 0.8 (from 0.6), matching the visual weight of the single-bottle ratings next to them in the same column. Both files are otherwise identical apart from fill colour, so the one fix applies to both. 2. Nothing tied artIds[] to ClientSkinEnum, and wxFAIL_MSG (amule-project#739) compiles out in release builds -- so a future enum member could silently push a wxNullBitmap into the 16x16 image list instead of failing loudly anywhere. Added static_assert(WXSIZEOF(artIds) == CLIENT_SKIN_SIZE, ...), which catches it at compile time in every build config. Needed "amuleDlg.h" (CLIENT_SKIN_SIZE's home) added to muuli_wdr.cpp's includes -- checked first that amuleDlg.h doesn't include muuli_wdr.h back, no circular include. Verified via a full amule build (macOS) -- the static_assert compiling clean confirms artIds[] and ClientSkinEnum agree on 27 entries, and a visual check that the two rating icons now match their siblings' size and no longer clip. * fix(gui): recompute double-bottle composition, verified numerically (amule-project#747 review) My previous fix (eedcac3) just moved the problem: applying got3nks's suggested translate values verbatim together with the also-suggested scale=0.8 pushed the right bottle past the viewBox edge (measured: x range 13%-107%, i.e. clipped on the right instead of the left). The two numbers were each individually reasonable but hadn't been re-verified together -- exactly the mistake the last commit's message claimed to have checked and hadn't. Recomputed from the natural bounding box instead of iterating on coordinates by eye: two bottles at scale 0.68 with a 40-unit gap, each positioned so both are fully inside the 0-2048 viewBox with equal margins. Verified numerically (not just visually) before committing: both groups' bboxes land at x 12.9%-49.0% and 51.0%-87.1%, y 25.2%-74.8% -- fully in bounds, no clipping on either side. Worth being upfront about the height: overall fill is 74%x50%, not poor/fair/good's 53%x73%. That's not a leftover bug -- fitting two full-height copies of the same bottle side by side in a square without overlap is not geometrically possible; matching the single bottles' 73% height would require the pair to be over twice as wide as the viewBox. 50% is the tradeoff of choosing "fits, no clipping, similar per-bottle proportions" over an unreachable exact size match. Verified via a full amule build (macOS) and the bounding-box computation above, re-run against the actual committed SVG files rather than the standalone drafts, to catch exactly the kind of last-mile mismatch that slipped through last time. * fix(gui): unify bottle height across all 5 rating icons (amule-project#747 review) got3nks: rather than treat the double-bottle pair as a special case with its own (necessarily shorter) height, make all five ratings share one consistent bottle height, maximizing what the double-bottle pair allows without clipping and bringing poor/fair/good down to match -- they sit in the same column, so consistency across the set matters more than any one icon being as large as it could be alone. Recomputed from the natural bottle bounding box: scale 0.909 is the largest that fits two bottles side by side (24-unit gap) inside the 2048x2048 viewBox with no clipping. Applied that same scale to the single-bottle ratings, centred. All five now render their bottle at the same height. Verified numerically against the actual committed files: all five land at y 16.8%-83.2% (66.3% height) and are within the 0-100% x range -- identical height across poor/fair/good/invalid/excellent, zero clipping. Verified via a full amule build (macOS). * fix(gui): brighten client_green to match the rest of the set's saturation (amule-project#747 review) got3nks measured across every opaque pixel: red and yellow gained brightness/saturation moving to the new art, but green lost both, landing dimmer (53% mean brightness) than red (64%) and yellow (72%) -- inverting the original's balance, where green and red were level at 57%/55%. Green carries the most meaning of the three (actively transferring), so it being the dimmest state undersells it. Replaced Material Green 500 (#4CAF50, 57% sat / 69% val) with #22CC1A (87% sat / 80% val), inside the ~#1BD816-#2ECC1F range got3nks suggested to restore the original's emphasis. Red and yellow untouched, per the review ("read fine as they are"). Verified via a full amule build (macOS) and a visual check of the icon at 96px. * fix(gui): corner-anchor badge overlays, add null-bitmap guard (amule-project#747 review) got3nks caught a real functional regression I'd missed (a second, earlier review comment I hadn't seen when I replied to the later one about colour): 6 of these icons aren't standalone -- GenericClientListCtrl.cpp draws them as overlays on top of the base client icon at the same point.x/realY. The original raw art kept each in a corner so the base icon stayed visible underneath; my replacements were designed as standalone centered pictograms, so they covered the icon they were meant to annotate (creditsyellow at 14x13 was larger than the 12x12 base smiley it sat on). Recomputed each as a corner badge, scaled/positioned to roughly the original's measured footprint and anchor (his measurements, converted from 16x16 pixel terms to the 2048x2048 viewBox): - extendedprotocol: top-right, ~8x4 - secident: bottom-left, ~7x6 - creditsgrey/creditsyellow: top-right, ~9x9 - encryption: top-left, ~6x8 badguy is the one exception, and deliberately so: the original struck through the *entire* icon rather than badging a corner, which reads as intentional (a bad-guy client's status is fully overridden, not just annotated) -- kept that full-cover behaviour rather than shrinking it to a corner mark. Also added the null-bitmap guard he flagged: wxArtProvider::GetBitmap() returning wxNullBitmap for an unresolvable id was returning straight through the new early-return path, never reaching the wxFAIL_MSG that amule-project#739 added for exactly this failure mode. Added a wxASSERT_MSG on the early-return path so a future icon rename can't silently regress back to the "fails into a blank icon" state amule-project#725/amule-project#739 fixed. Verified via a full amule build (macOS) and a visual check of all 6 badges at both 96px and actual 16x16, confirmed each sits in its corner without covering the centre of the base icon.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #737 — the
Gtk-CRITICAL ... gtk_box_gadget_distribute: assertion 'size >= 0' failedspam @ngosang reported on the master AppImage.Two commits, two related fixes:
1. SpinCtrl widths (
muuli_wdr: drop too-narrow wxSize on Preferences SpinCtrls)Six SpinCtrls in the Preferences dialog were pinned to widths that interact badly with
GtkSpinButton's intrinsic minimum on wxGTK 3.2 / GTK3:wxSizeIDC_TOOLTIPDELAYwxSize(40, -1)IDC_SERVERRETRIESwxSize(40, -1)IDC_OSUPDATEwxSize(60, -1)IDC_MAXDOWNwxSize(140, -1)IDC_MAXUPwxSize(140, -1)IDC_SLOTALLOCwxSize(140, -1)GtkSpinButtonis a composite (entry + stacked up/down arrows). Its internal box gadget needs ~80 px just to fit the entry + arrow column at the default theme; combined with the surroundingwxFlexGridSizer/wxBoxSizertightness, even an explicit "we know what we want" wx-side hint shoves the entry's allocation below zero, which triggers:every time the panel is laid out (open Preferences, switch tabs, expose).
Same family as #569 / 82626f2 on the search dialog, just on the Preferences side. Fix is the same: drop the explicit width to
wxDefaultSizeand let the layout engine pick. macOS / Windows render side-by-side spin buttons that fit comfortably in the default; GTK gets the larger geometry it needs for stacked arrows. Label / unit text on either side of each spin keeps its own sizer flags, so the row overall still flows the same.2. Networks-tab scroll-bearing widgets (
muuli_wdr: give Networks-tab list/text controls a positive initial min-size)The Networks notebook page constructs five scroll-bearing widgets at
wxDefaultPosition, wxDefaultSize:CServerListCtrlID_SERVERLISTwxListCtrlID_ED2KINFOwxListCtrlID_KADINFOCMuleTextCtrlID_LOGVIEWwxVSCROLL)CMuleTextCtrlID_SERVERINFOwxVSCROLL)On wxGTK 3.2 / GTK3 each is internally backed by a
GtkScrolledWindow(+GtkTreeViewfor the lists, +GtkTextViewfor the text controls). During the parentwxNotebookpage's first realisation pass the parent allocation is still 0×0 (the notebook itself hasn't been sized yet), so the innerGtkScrollbars lay out in negative space and each triggers:once when the user first selects the Networks tab and / or navigates through its log sub-tabs.
Fix: give each widget a small
wxSize(200, 100)min-size hint — enough for the innerGtkScrollbars to lay out cleanly during initial realisation. Steady-state behaviour is unchanged because each widget is added to its sizer withwxSizerFlags(1).Expand()and grows to fill the page as soon as the notebook is sized. Same pattern as thewxSize(160, 120)hint already used on the Events-tabwxListCtrl.Verification
Built AppImage off the branch on Ubuntu ARM (amule-dev-vm via
packaging/linux/build.sh appimage). Reproduced the warning spam on the unfixed23113ff50AppImage, then ran the fixed6ac974287AppImage:Gtk-CRITICALlines.Gtk-CRITICALlines.Out-of-scope leftovers
Two unrelated warnings survive in any GTK3 AppImage on modern Ubuntu and aren't fixable from aMule's source — leaving them alone:
Fontconfig warning: using without calling FcInit()— fires from one of Pango / Cairo / GTK'sgdk-pixbufSVG loader at AppImage startup. aMule never touches Fontconfig directly (grep returns zero matches). Patching it would mean adding aMule code that explicitly callsFcInit()to paper over a library-level init-order quirk we don't cause.WARNING: atk-bridge: get_device_events_reply: unknown signature— at-spi2 ↔ atk-bridge D-Bus probe; the bundled GTK and host's at-spi2 disagree on a method-reply signature. Filed upstream against at-spi2/atk-bridge many times over the years. Fires on any GTK3 AppImage launch + every focus-leave-toplevel event. Not aMule code.These appear identically on, e.g., Inkscape's AppImage on the same machine; they're GTK3-AppImage-infrastructure noise, not specific to us.
Test plan
23113ff50) — all warning families confirmed present.GtkSpinButtonwarnings gone;GtkScrollbarstill firing 2× on Networks.GtkScrollbarwarnings gone too. Two infrastructure warnings remain, see above.