Skip to content

vendor: import Guido’s Phosh GTK4 port - #213

Draft
samcday wants to merge 6 commits into
back2staticfrom
codex/gtk4-phosh
Draft

samcday wants to merge 6 commits into
back2staticfrom
codex/gtk4-phosh

Conversation

@samcday

@samcday samcday commented Sep 21, 2026 •

Copy link
Copy Markdown
Owner

Import Guido’s in-development Phosh GTK4 port at 37d48c69b2414fb8b8f9cee19eae60a700c4c551 into the phosh/ subtree above #186. This is the native dependency layer for #209; main continues GTK3 stable releases. Remaining migration work is tracked in #215.

Preserve the git subtree --squash import and side-parent history, retain downstream static-resource registration, and pin gvc/libcall-ui to the validated revisions. Separate downstream commits fix the emergency dialog’s GtkPlain construction and lifecycle: provide the shortcut-manager interface required by mnemonic controls, unparent the modal template child during disposal, and destroy modal/power layer surfaces through their actual surface API. The generic widget-destruction helper remains unchanged because converting every shell path also requires ownership fixes.

#209 carries the regenerated bindings, application migration, custom GTK environment, and CI/release isolation. This layer alone retains GTK3 Rust bindings, so build the complete GTK4 application at #209. Both GTK4 layers remain draft; the lower GTK3 layers can land independently.

Validation: diff confined to phosh/; includes published #186 tip 15707636. The complete #209 tree passes dynamic and embedded all-target builds, strict Clippy and Phoc suites, including the restored outgoing/incoming emergency test. Rust/C size/alignment and constant checks pass, and the final native CI image builds locally. The matching image is published, and both system and bundled build/test jobs pass remotely at #209 head 9787b781. Error-dialog and broader shell disposal/cursor assumptions remain tracked in #215.

Land/restack with merge commits that preserve subtree parents and git-subtree-* trailers; do not use GitHub squash/rebase merging.

37d48c69 layersurface: Sync with our custom-surface example in GTK4
cb8e5c94 layersurface: Switch to GtkPlain
393f34d4 hack: lockscreen: Disable gesture
e3fe6fef lockscreen: Properly cleanup background
fa3fad0e lockscreen: Use child property and simplify construction
b7bcfbb6 top-panel: Use child property and simplify construction
f88bbcdc home: Use child property and simplify construction
645b26ed lockscreen-manager: Properly destroy lockscreen
372e3f90 top-panel: Use layer-surface height
4ea68a24 top-panel: Act on configured
377f6129 home: Avoid gtk_window_get_default_size
1765a8e3 home: Act on configured
89a4cd6e layersurface: Adjust to custom surface
a5f789f3 tree: Drop window properties
4ad4af3b overview: Properly remove activity
11331796 activity: Use GtkPaintable
857e3e92 activity: Queue draw for the correct widget
1d9a01ed Drop gtk4-layer-shell
e08794e1 for-arun: ticket-box: Fix version
8bc3dffd for-arun: feedback-status-page: Make row take full width
0123f441 backport: thumbnail: Fix indent
1e377fb0 backport: lockscreen: Fix typo
666e85bb widget-box-standalone: Port to GTK 4
47007eff quick-settings-box-standalone: Port to GTK 4
7cfeca84 notify-server-standalone: Port to GTK 4
7f511988 notify-blocks: Port to GTK 4
9db8b660 custom-quick-settings-standalone: Port to GTK 4
6158ad6c app-scroll: Port to GTK 4
11692cc8 app-grid-standalone: Port to GTK 4
b80eb6d2 app-buttons: Port to GTK 4
174326ca plugins: Add gio-unix as dependency
3c6ae907 media-players: Port to GTK 4
facf645c upcoming-events: Port to GTK 4
eac40ef0 ticket-box: Port to GTK 4
90471960 launcher-box: Port to GTK 4
cda77dd6 emergency-info: Port to GTK 4
3f984958 calendar: Port to GTK 4
6a69a640 wifi-hotspot-quick-setting: Port to GTK 4
5f825e1c location-quick-setting: Port to GTK 4
23f2b571 simple-custom-quick-setting: Port to GTK 4
b6aee759 scaling-quick-setting: Port to GTK 4
1ab344d9 pomodoro-quick-setting: Port to GTK 4
02b8f87d night-light-quick-setting: Port to GTK 4
94aa3c3d mobile-data-quick-setting: Port to GTK 4
62e2eed9 dark-mode-quick-setting: Port to GTK 4
3b85ba56 caffeine-quick-setting: Port to GTK 4
43d6f658 gtk-list-models: Remove
e21946a1 testlib: Port to GTK 4
5bebeca7 tests/services: Add gio-unix as dependency
496fed7d style: Port to GTK 4
8c6cf624 main: Port to GTK 4
bac7a16d home: Port to GTK 4
9eb54cb1 top-panel: Port to GTK 4
1595ee62 lockscreen: Port to GTK 4
0e9a7810 drag-surface: Port to GTK 4
d2019262 layersurface: Port to gtk4-layer-shell
2f161ffd splash: Port to GTK 4
fad8b16f shell: Port to GTK 4
98674306 head: Port to GTK 4
cd5d0f9c monitor: Port to GTK 4
27cf0e50 toplevel: Port to GTK 4
e68c4242 monitor-manager: Port to GTK 4
44ab439b toplevel-manager: Port to GTK 4
8ed2c317 lockscreen-manager: Port to GTK 4
b3743f6a gtk-mount-manager: Port to GTK 4
cc6098e3 phosh-wayland: Port to GTK 4
3b36a5b3 style-manager: Port to GTK 4
b870910e session-manager: Port to GTK 4
bb7b0878 screenshot-manager: Port to GTK 4
299c665a background-manager: Port to GTK 4
ee98ea83 idle-manager: Port to GTK 4
98e42bb5 util: Port to GTK 4
2c2d95a1 system-prompter: Port to GTK 4
642ab828 lockshield: Port to GTK 4
d9aadd57 osd-window: Port to GTK 4
545665e8 widget-box: Port to GTK 4
0df783b7 system-modal: Port to GTK 4
2b125199 location-manager: Port to GTK 4
1e4edaa6 connectivity-manager: Port to GTK 4
389a41f9 cell-broadcast-manager: Port to GTK 4
f797b619 bt-manager: Port to GTK 4
8b3138ac keypad: Port to GTK 4
51e4f5e1 fader: Port to GTK 4
92877e16 call-notification: Port to GTK 4
d2ebc4d3 call: Port to GTK 4
fdc0a22e animations: Port to GTK 4
2ab1b270 system-prompt: Port to GTK 4
cc7985a8 system-modal-dialog: Port to GTK 4
0c1f7b01 run-command-dialog: Port to GTK 4
60cc9ce1 power-menu: Port to GTK 4
9f3cc78f polkit-auth-prompt: Port to GTK 4
0a8ac368 network-auth-prompt: Port to GTK 4
dde21424 end-session-dialog: Port to GTK 4
2383cdf9 cell-broadcast-prompt: Port to GTK 4
97ecf01b gtk-mount-prompt: Port to GTK 4
e3e06a97 emergency-menu: Port to GTK 4
3bb73e88 emergency-contact-row: Port to GTK 4
aa47c6a1 app-auth-prompt: Port to GTK 4
9143b8fb revealer: Port to GTK 4
7da79470 password-entry: Port to GTK 4
48e06b18 activity: Port to GTK 4
7ed3bf1c swipe-away-bin: Port to GTK 4
3238af1a overview: Port to GTK 4
6b9d9363 app-grid: Port to GTK 4
e0a8a452 folder-info: Port to GTK 4
3a63897e app-grid-folder-button: Port to GTK 4
53942573 app-grid-button: Port to GTk 4
652a64e0 app-grid-base-button: Port to GTK 4
025578ba lockscreen-bg: Port to GTK 4
b2ba5ef7 background: Port to GTK 4
6fe37fb3 fading-label: Port to GTK 4
8d730358 clamp: Port to GTK 4
8c2793d5 arrow: Port to GTK 4
0d09808d settings: Port to GTK 4
49b56354 brightness-settings: Port to GTK 4
c5637215 notification-banner: Port to GTK 4
2b52baed notification-frame: Port to GTK 4
ab8840b8 notification-content: Port to GTK 4
9e662ce7 timestamp-label: Port to GTK 4
13054e47 media-player: Port to GTK 4
22328b91 audio-settings: Port to GTK 4
b6a3d376 audio-device-row: Port to GTK 4
3bbb8d50 channel-bar: Port to GTK 4
480085b9 quick-settings: Port to GTK 4
e84d8538 plugin-loader: Port to GTK 4
9397f190 quick-settings-box: Port to GTK 4
e1d19142 quick-setting: Port to GTK 4
57425ec1 connectivity-info: Port to GTK 4
0a208b45 status-icon: Port to GTK 4
b06bcb88 status-icon: Drop icon-size property
9093adba feedback-status-page: Port to GTK 4
f9cdc14a bt-status-page: Port to GTK 4
4507f086 bt-device-row: Port to GTK 4
83267c66 wifi-status-page: Port to GTK 4
a1c1113b wifi-network-row: Port to GTK 4
dbeef700 status-page: Port to GTK 4
433b3ea6 status-page-placeholder: Port to GTK 4
42d9ce12 tree: Use GTK 4 and Adwaita
REVERT: 62fde093 Merge branch 'rel-0.53.0' into 'main'
REVERT: 08fb5f55 treewide: Document changes and release 0.53.0
REVERT: 078b70f8 Merge branch 'gvc' into 'main'
REVERT: fca6c7b9 gvc: Update to latest upstream commit
REVERT: 8ebf5690 Update Occitan translation
REVERT: 57ee06b5 Update Brazilian Portuguese translation
REVERT: 617cd925 Merge branch 'xdgp-phrosh' into 'main'
REVERT: 0b9b65a1 portal: Use Rust based GUI variants by default
REVERT: 5dada684 Merge branch 'rel-0.53_rc1' into 'main'
REVERT: ffb544f4 treewide: Document changes and release 0.53~rc1
REVERT: 0e1ddae8 Merge branch 'fix-theme-set' into 'main'
REVERT: 4cb254d0 style-manager: Set the correct css provider
REVERT: 5d3e1a89 Merge branch 'track-missing-toplevels' into 'main'
REVERT: f61bc362 overview: Remove splash if we never get a toplevel
REVERT: 8a472695 toplevel-manager: Track launched apps
REVERT: 20fa7a51 overview: Drop unused arguments from signal handler
REVERT: b776dc5d toplevel-manager: Drop super-cautious checks
REVERT: fde14e9a toplevel-manager: Modernize
REVERT: c60a9a62 overview: Ignore missing activity
REVERT: 81847921 Update Russian translation
REVERT: aeed8ccd Merge branch 'mr-1868-fixup' into 'main'
REVERT: 0f832d9f device-row: Fix indent
REVERT: a2183867 device-row: Use 'alias' instead of 'name' for device display
REVERT: 3140901c Update Cornish translation
REVERT: d0174695 Update Turkish translation
REVERT: 11faf8e3 Merge branch 'gvc' into 'main'
REVERT: bc7371e9 gvc: Switch back to blessed repo
REVERT: 20c534c2 Update Swedish translation
REVERT: 9e20d3d6 Update Georgian translation
REVERT: 742110a3 Update Slovenian translation
REVERT: 8907c5fc Update Ukrainian translation
REVERT: 38e633df Update Bulgarian translation
REVERT: c123751b Merge branch 'doc-noti' into 'main'
REVERT: ea9d6805 docs: Mention UsesNotifications
REVERT: 07057f1c Update Romanian translation
REVERT: 76cd9bcd Update Persian translation
REVERT: c6307ac3 Merge branch 'i1280-plugin-prefs-open-new2' into 'main'
REVERT: 9a56f3c8 caffeine-quick-setting: Allow to open prefs via mobile settings
REVERT: 26fcdd72 util: Allow to open settings panel with additional parameters
REVERT: 97740b11 top-panel: Make panel launching actions take parameters
REVERT: 6de0c87e top-panel: Add a common parsing function for panel options
REVERT: 03e6b0ad Merge branch 'polkit-more-details' into 'main'
REVERT: 7c19b471 polkit-auth-prompt: Display more information about user
REVERT: 82ccb1aa polkit-auth-prompt: Uncrustify
REVERT: 3e1a3ff7 polkit-auth-agent: Uncrustify
REVERT: 630409ee polkit-auth-prompt: Follow our coding style
REVERT: 5239e552 pokit-auth-agent: Follow our coding style
REVERT: 83e53dc2 Merge branch 'packaging' into 'main'
REVERT: 68efe67a packaging: Update dependencies
REVERT: 432260ca Merge branch 'brightness-gesture' into 'main'
REVERT: 7fabf60b lockscreen: Use two finger swipe gesture for brightness
REVERT: e79613ed lockscreen: Sort callbacks alphabetically
REVERT: 9d5013a4 lockscreen: Use most concrete type for widget-box
REVERT: 2df9648b lockscreen: Uncrustify
REVERT: 44676370 brightness-manager: Skip brightenss update
REVERT: 101746b9 Merge branch 'media-length' into 'main'
REVERT: b680d91b media-player: Avoid nan when track length is empty
REVERT: 59729218 Merge branch 'simplify-session' into 'main'
REVERT: 001291d5 phosh-session: Use name variable
REVERT: 59341a0e phosh-session: Avoid the extra shell exec
REVERT: c08c0acd phosh-session: Drop disable-acceleration-check
REVERT: 6a52749e Update Cornish translation
REVERT: 6d476361 Add Cornish translation
REVERT: c84e8c94 Update Bulgarian translation
REVERT: 9625805e Merge branch 'splash-launch' into 'main'
REVERT: 218b3fc7 activity: Use slightly rounded corners
REVERT: 738ec45b activity: Render empty state only on drawing area
REVERT: b590438e overview: Use light mode based on what the splash manager does
REVERT: e3ec75e3 overview: Raise and lower launch splashs
REVERT: a644a483 overview: Add splash manager
REVERT: cd924e14 overview: Show activity for launching apps
REVERT: daeba3f4 activity: Try harder to get an app-id
REVERT: db6e4da5 activity: Disable swipe and close button while app is loading
REVERT: d0492565 activity: Show spinner when we don't have a thumbnail
REVERT: 092b3e3f overview: Use splash colors instead of fake app
REVERT: 0e766a21 splash-manager: Allow to lower all splashs and to raise base on startup-id
REVERT: c1f28f89 splash: Allow to lower/raise the splash
REVERT: 363b832d swipe-tracker: Allow to disable swipes
REVERT: f994cd89 shell: Allow to get splash manager
REVERT: bfe04e06 shell: Create splash manager earlier
REVERT: 7525900d activity: Use phosh_util_toggle_style_class consistently
REVERT: d2386a98 activity: Just use `MIN`
REVERT: f096cbf8 overview: Use most specific type for carousel
REVERT: 924adf69 overview: Use common pattern for find_activity_by_toplevel()
REVERT: f86a6215 overview: Fix indent
REVERT: 775d6527 Update Norwegian Bokmål translation
REVERT: ee3dba00 Merge branch 'volume-control' into 'main'
REVERT: d761bcfa audio-devices: Use type
REVERT: 87669cc7 channel-bar: Remove unused defines
REVERT: 19dcbe67 audio-settings: Avoid pointless cast
REVERT: 3a5db230 audio-settings: Avoid channel-bar casts
REVERT: c12e7381 channel-bar: Rename source files
REVERT: b5c4e2ab channel-bar: Use proper namespace
REVERT: edc8cf89 audio-devices: Move out of settings
REVERT: 9e555676 audio-settings: Use audio-devices and mixer control from audio-manager
REVERT: f6da870b audio-manager: Manage audio devices
REVERT: 6267962c Update German translation
REVERT: b7857b37 Merge branch 'appinfo-exec' into 'main'
REVERT: e78f73cd app-list-model: Allow app-info lookup by recently launched executable
REVERT: 55f70e37 app-list-model: Fix indent
REVERT: dd18f36d app-tracker: Fix indent
REVERT: f6efb023 util: Fix indent
REVERT: a3d0a04d Merge branch 'smooth-brightness' into 'main'
REVERT: 67c7fa51 brightness-manager: Add auto-brightness offset
REVERT: 284d2283 brightness-manager: Drop schema check
REVERT: 62f06c2c brightness-manager: Add additional factor when night light is on
REVERT: e137e9f5 monitor-manager: Add night light temperature property
REVERT: a9bee469 brightness-manager: Smoothen brightness transition
REVERT: 873d5c72 brightness-manager: Simplify ending the transition
REVERT: 352ed50c backlight: Round backlight level
REVERT: 3e1d71b3 brightness-manager: Use faster up interval
REVERT: 714d2434 brightness-manager: Use _ID for schema consistently
REVERT: 5f307c4b doc: Document missing plugin schema entries
REVERT: c2a15a5f Merge branch 'noti-activate' into 'main'
REVERT: e06a21fe notification: Activate applications when sending notifications
REVERT: 2752e8ef util: Determine object path automatically
REVERT: 7c83dded util: Make platform-data helpers public
REVERT: cee7c70f util: Allow to activate without actions
REVERT: 023f435f Merge branch 'run-schema' into 'main'
REVERT: 0f5bb23b run: Use plugin_schema_path
REVERT: 1c452318 Update Romanian translation

git-subtree-dir: phosh
git-subtree-split: 37d48c69b2414fb8b8f9cee19eae60a700c4c551
@coderabbitai

coderabbitai Bot commented Sep 21, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 317 files, which is 17 over the limit of 300.

To get a review, reduce the PR to 300 files or fewer by splitting it into smaller PRs or changing its base branch.

Usage-priced reviews support at most 300 files.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: 13b68821-d100-42b4-906d-60147154683e

📥 Commits

Reviewing files that changed from the base of the PR and between 1570763 and 2689e11.

⛔ Files ignored due to path filters (1)
  • phosh/data/icons/fake-app.svg is excluded by !**/*.svg
📒 Files selected for processing (317)
  • phosh/NEWS
  • phosh/data/mobi.phosh.shell.gschema.xml
  • phosh/data/phosh-portals.conf
  • phosh/data/phosh-session.in
  • phosh/debian/changelog
  • phosh/debian/control
  • phosh/docs/app-dev.md
  • phosh/docs/phosh.gsettings.rst
  • phosh/meson.build
  • phosh/plugins/caffeine-quick-setting/caffeine-quick-setting.c
  • phosh/plugins/caffeine-quick-setting/interval-row.c
  • phosh/plugins/caffeine-quick-setting/interval-row.h
  • phosh/plugins/caffeine-quick-setting/interval-row.ui
  • phosh/plugins/caffeine-quick-setting/qs.ui
  • phosh/plugins/calendar/calendar.c
  • phosh/plugins/calendar/calendar.ui
  • phosh/plugins/dark-mode-quick-setting/dark-mode-quick-setting.c
  • phosh/plugins/dark-mode-quick-setting/qs.ui
  • phosh/plugins/emergency-info/emergency-info-row.c
  • phosh/plugins/emergency-info/emergency-info-row.h
  • phosh/plugins/emergency-info/emergency-info-row.ui
  • phosh/plugins/emergency-info/emergency-info.c
  • phosh/plugins/emergency-info/emergency-info.h
  • phosh/plugins/emergency-info/emergency-info.ui
  • phosh/plugins/emergency-info/prefs/emergency-info-prefs-row.ui
  • phosh/plugins/launcher-box/launcher-box.c
  • phosh/plugins/launcher-box/launcher-box.ui
  • phosh/plugins/launcher-box/launcher-row.c
  • phosh/plugins/launcher-box/launcher-row.h
  • phosh/plugins/launcher-box/launcher-row.ui
  • phosh/plugins/location-quick-setting/qs.ui
  • phosh/plugins/media-players/media-players.ui
  • phosh/plugins/meson.build
  • phosh/plugins/mobile-data-quick-setting/qs.ui
  • phosh/plugins/night-light-quick-setting/qs.ui
  • phosh/plugins/pomodoro-quick-setting/pomodoro-quick-setting.c
  • phosh/plugins/pomodoro-quick-setting/qs.ui
  • phosh/plugins/scaling-quick-setting/qs.ui
  • phosh/plugins/scaling-quick-setting/scale-row.c
  • phosh/plugins/scaling-quick-setting/scale-row.h
  • phosh/plugins/scaling-quick-setting/scale-row.ui
  • phosh/plugins/scaling-quick-setting/scaling-quick-setting.c
  • phosh/plugins/simple-custom-quick-setting/qs.ui
  • phosh/plugins/ticket-box/meson.build
  • phosh/plugins/ticket-box/ticket-box.c
  • phosh/plugins/ticket-box/ticket-box.ui
  • phosh/plugins/ticket-box/ticket-row.c
  • phosh/plugins/ticket-box/ticket-row.h
  • phosh/plugins/upcoming-events/event-list.c
  • phosh/plugins/upcoming-events/event-list.ui
  • phosh/plugins/upcoming-events/upcoming-event.c
  • phosh/plugins/upcoming-events/upcoming-event.ui
  • phosh/plugins/upcoming-events/upcoming-events.c
  • phosh/plugins/upcoming-events/upcoming-events.ui
  • phosh/plugins/wifi-hotspot-quick-setting/qs.ui
  • phosh/plugins/wifi-hotspot-quick-setting/status-page.ui
  • phosh/plugins/wifi-hotspot-quick-setting/wifi-hotspot-quick-setting.c
  • phosh/plugins/wifi-hotspot-quick-setting/wifi-hotspot-status-page.c
  • phosh/po/LINGUAS
  • phosh/po/POTFILES.in
  • phosh/po/POTFILES.skip
  • phosh/po/bg.po
  • phosh/po/de.po
  • phosh/po/fa.po
  • phosh/po/ka.po
  • phosh/po/kw.po
  • phosh/po/nb.po
  • phosh/po/oc.po
  • phosh/po/pt_BR.po
  • phosh/po/ro.po
  • phosh/po/ru.po
  • phosh/po/sl.po
  • phosh/po/sv.po
  • phosh/po/tr.po
  • phosh/po/uk.po
  • phosh/run.in
  • phosh/src/activity.c
  • phosh/src/activity.h
  • phosh/src/animation.c
  • phosh/src/app-auth-prompt.c
  • phosh/src/app-grid-base-button.c
  • phosh/src/app-grid-button.c
  • phosh/src/app-grid-folder-button.c
  • phosh/src/app-grid.c
  • phosh/src/app-grid.h
  • phosh/src/app-list-model.c
  • phosh/src/app-list-model.h
  • phosh/src/app-tracker.c
  • phosh/src/arrow.c
  • phosh/src/audio-manager.c
  • phosh/src/audio-manager.h
  • phosh/src/background-manager.c
  • phosh/src/background.c
  • phosh/src/background.h
  • phosh/src/backlight.c
  • phosh/src/brightness-manager.c
  • phosh/src/brightness-settings.c
  • phosh/src/brightness-settings.h
  • phosh/src/bt-device-row.c
  • phosh/src/bt-device-row.h
  • phosh/src/bt-manager.c
  • phosh/src/bt-status-page.c
  • phosh/src/call-notification.c
  • phosh/src/call.c
  • phosh/src/cell-broadcast-manager.c
  • phosh/src/cell-broadcast-prompt.c
  • phosh/src/clamp.c
  • phosh/src/clamp.h
  • phosh/src/connectivity-manager.c
  • phosh/src/dbus/meson.build
  • phosh/src/dbus/org.freedesktop.Accounts.User.xml
  • phosh/src/dbus/org.freedesktop.Accounts.xml
  • phosh/src/drag-surface.c
  • phosh/src/emergency-contact-row.c
  • phosh/src/emergency-contact-row.h
  • phosh/src/emergency-menu.c
  • phosh/src/end-session-dialog.c
  • phosh/src/fader.c
  • phosh/src/fading-label.c
  • phosh/src/fading-label.h
  • phosh/src/folder-info.c
  • phosh/src/gtk-list-models/gtkfilterlistmodel.c
  • phosh/src/gtk-list-models/gtkfilterlistmodel.h
  • phosh/src/gtk-list-models/gtkrbtree.c
  • phosh/src/gtk-list-models/gtkrbtreeprivate.h
  • phosh/src/gtk-list-models/gtksortlistmodel.c
  • phosh/src/gtk-list-models/gtksortlistmodel.h
  • phosh/src/gtk-mount-prompt.c
  • phosh/src/home.c
  • phosh/src/idle-manager.c
  • phosh/src/keypad.c
  • phosh/src/layersurface-priv.h
  • phosh/src/layersurface.c
  • phosh/src/layersurface.h
  • phosh/src/location-manager.c
  • phosh/src/lockscreen-bg.c
  • phosh/src/lockscreen-bg.h
  • phosh/src/lockscreen-manager.c
  • phosh/src/lockscreen.c
  • phosh/src/lockscreen.h
  • phosh/src/lockshield.c
  • phosh/src/lockshield.h
  • phosh/src/main.c
  • phosh/src/media-player.c
  • phosh/src/meson.build
  • phosh/src/monitor-manager.c
  • phosh/src/monitor-manager.h
  • phosh/src/monitor/head.c
  • phosh/src/monitor/monitor.c
  • phosh/src/network-auth-prompt.c
  • phosh/src/notifications/dbus-notification.c
  • phosh/src/notifications/notification-banner.c
  • phosh/src/notifications/notification-content.c
  • phosh/src/notifications/notification-frame.c
  • phosh/src/notifications/notification-frame.h
  • phosh/src/notifications/timestamp-label.c
  • phosh/src/notifications/timestamp-label.h
  • phosh/src/osd-window.c
  • phosh/src/overview.c
  • phosh/src/overview.h
  • phosh/src/password-entry.c
  • phosh/src/phosh-wayland.c
  • phosh/src/phosh.gresources.xml
  • phosh/src/polkit-auth-agent.c
  • phosh/src/polkit-auth-agent.h
  • phosh/src/polkit-auth-prompt.c
  • phosh/src/polkit-auth-prompt.h
  • phosh/src/power-menu-manager.c
  • phosh/src/power-menu.c
  • phosh/src/quick-setting.c
  • phosh/src/quick-settings-box.c
  • phosh/src/quick-settings-box.h
  • phosh/src/quick-settings.c
  • phosh/src/quick-settings.h
  • phosh/src/revealer.c
  • phosh/src/revealer.h
  • phosh/src/run-command-dialog.c
  • phosh/src/screenshot-manager.c
  • phosh/src/session-manager.c
  • phosh/src/settings.c
  • phosh/src/settings.h
  • phosh/src/settings/audio-device-row.c
  • phosh/src/settings/audio-device-row.h
  • phosh/src/settings/audio-device.c
  • phosh/src/settings/audio-device.h
  • phosh/src/settings/audio-devices.c
  • phosh/src/settings/audio-devices.h
  • phosh/src/settings/audio-settings.c
  • phosh/src/settings/audio-settings.h
  • phosh/src/settings/channel-bar.h
  • phosh/src/settings/gvc-channel-bar.c
  • phosh/src/settings/gvc-channel-bar.h
  • phosh/src/settings/meson.build
  • phosh/src/shell-priv.h
  • phosh/src/shell.c
  • phosh/src/splash-manager.c
  • phosh/src/splash-manager.h
  • phosh/src/splash.c
  • phosh/src/splash.h
  • phosh/src/status-icon.c
  • phosh/src/status-icon.h
  • phosh/src/status-page-placeholder.c
  • phosh/src/status-page-placeholder.h
  • phosh/src/status-page.c
  • phosh/src/status-page.h
  • phosh/src/style-manager.c
  • phosh/src/stylesheet/common.css
  • phosh/src/swipe-away-bin.c
  • phosh/src/swipe-away-bin.h
  • phosh/src/system-modal-dialog.c
  • phosh/src/system-modal.c
  • phosh/src/system-prompt.c
  • phosh/src/system-prompter.h
  • phosh/src/thumbnail.c
  • phosh/src/top-panel-bg.c
  • phosh/src/top-panel-bg.h
  • phosh/src/top-panel.c
  • phosh/src/top-panel.h
  • phosh/src/toplevel-manager.c
  • phosh/src/toplevel-manager.h
  • phosh/src/toplevel.c
  • phosh/src/ui/activity.ui
  • phosh/src/ui/app-auth-prompt.ui
  • phosh/src/ui/app-grid-base-button.ui
  • phosh/src/ui/app-grid-button.ui
  • phosh/src/ui/app-grid-folder-button.ui
  • phosh/src/ui/app-grid.ui
  • phosh/src/ui/audio-device-row.ui
  • phosh/src/ui/audio-settings.ui
  • phosh/src/ui/brightness-settings.ui
  • phosh/src/ui/bt-device-row.ui
  • phosh/src/ui/bt-status-page.ui
  • phosh/src/ui/call-notification.ui
  • phosh/src/ui/cell-broadcast-prompt.ui
  • phosh/src/ui/emergency-contact-row.ui
  • phosh/src/ui/emergency-menu.ui
  • phosh/src/ui/end-session-dialog.ui
  • phosh/src/ui/feedback-status-page.ui
  • phosh/src/ui/gtk-mount-prompt.ui
  • phosh/src/ui/gvc-channel-bar.ui
  • phosh/src/ui/home.ui
  • phosh/src/ui/keypad.ui
  • phosh/src/ui/lockscreen.ui
  • phosh/src/ui/media-player.ui
  • phosh/src/ui/network-auth-prompt.ui
  • phosh/src/ui/notification-content.ui
  • phosh/src/ui/notification-frame.ui
  • phosh/src/ui/osd-window.ui
  • phosh/src/ui/overview.ui
  • phosh/src/ui/password-entry.ui
  • phosh/src/ui/polkit-auth-prompt.ui
  • phosh/src/ui/power-menu.ui
  • phosh/src/ui/quick-setting.ui
  • phosh/src/ui/quick-settings-box.ui
  • phosh/src/ui/quick-settings.ui
  • phosh/src/ui/revealer.ui
  • phosh/src/ui/run-command-dialog.ui
  • phosh/src/ui/settings.ui
  • phosh/src/ui/splash.ui
  • phosh/src/ui/status-icon.ui
  • phosh/src/ui/status-page-placeholder.ui
  • phosh/src/ui/status-page.ui
  • phosh/src/ui/system-modal-dialog.ui
  • phosh/src/ui/system-prompt.ui
  • phosh/src/ui/timestamp-label.ui
  • phosh/src/ui/top-panel.ui
  • phosh/src/ui/widget-box.ui
  • phosh/src/ui/wifi-network-row.ui
  • phosh/src/ui/wifi-status-page.ui
  • phosh/src/util.c
  • phosh/src/util.h
  • phosh/src/widget-box.c
  • phosh/src/wifi-network-row.c
  • phosh/src/wifi-network-row.h
  • phosh/src/wifi-status-page.c
  • phosh/subprojects/gvc.wrap
  • phosh/subprojects/libcall-ui.wrap
  • phosh/subprojects/packagefiles/gtk4-layer-shell/0001-tree-Add-configure-callback-and-remove-default-size.patch
  • phosh/tests/services/meson.build
  • phosh/tests/stubs/phosh.c
  • phosh/tests/stubs/toplevel-manager.c
  • phosh/tests/test-activity.c
  • phosh/tests/test-app-auth-prompt.c
  • phosh/tests/test-app-grid-button.c
  • phosh/tests/test-app-grid-folder-button.c
  • phosh/tests/test-app-list-model.c
  • phosh/tests/test-background.c
  • phosh/tests/test-connectivity-info.c
  • phosh/tests/test-css.c
  • phosh/tests/test-drag-surface.c
  • phosh/tests/test-end-session-dialog.c
  • phosh/tests/test-fading-label.c
  • phosh/tests/test-gtk-mount-manager.c
  • phosh/tests/test-layer-surface.c
  • phosh/tests/test-lockshield.c
  • phosh/tests/test-notification-content.c
  • phosh/tests/test-osd-window.c
  • phosh/tests/test-overview.c
  • phosh/tests/test-plugin-loader.c
  • phosh/tests/test-power-menu.c
  • phosh/tests/test-quick-setting.c
  • phosh/tests/test-quick-settings-box.c
  • phosh/tests/test-shell.c
  • phosh/tests/test-status-icon.c
  • phosh/tests/test-system-modal-dialog.c
  • phosh/tests/test-system-modal.c
  • phosh/tests/test-timestamp-label.c
  • phosh/tests/testlib-full-shell.c
  • phosh/tests/testlib.c
  • phosh/tools/app-buttons.c
  • phosh/tools/app-grid-standalone.c
  • phosh/tools/app-scroll.c
  • phosh/tools/custom-quick-settings-standalone.c
  • phosh/tools/notify-blocks.c
  • phosh/tools/notify-server-standalone.c
  • phosh/tools/quick-settings-box-standalone.c
  • phosh/tools/widget-box-standalone.c

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Comment @coderabbitai help to get the list of available commands.

@samcday
samcday added this pull request to stack #214 September 21, 2026 06:37
@greptile-apps

greptile-apps Bot commented Sep 21, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 0/5

This PR is not safe to merge because normal shutdown, audio-settings teardown, hotspot QR display, media progress handling, and build-tree plugin schema loading are broken.

Findings

  1. P1 QR bitmap is malformed ▶
  2. P1 Shutdown never stops loop ▶
  3. P1 Dispose calls parent finalizer ▶
  4. P1 Zero track length divides ▶
  5. P1 Schema paths are concatenated ▶

Summary

This PR imports the in-development GTK4 Phosh subtree, ports widgets and layer surfaces to GTK4/libadwaita, and pins the associated gvc and libcall-ui revisions. The imported snapshot contains several concrete runtime regressions:

  • Hotspot QR codes are generated with incorrect module coordinates.
  • The shell no longer exits on SIGTERM or SIGINT.
  • Audio settings teardown double-finalizes a widget.
  • Zero-length media tracks produce invalid progress values.
  • The build-tree runner constructs an invalid plugin schema path.
Diagram
%%{init: {'theme': 'neutral'}}%%
flowchart LR
  Session[phosh-session] --> Phoc[Phoc compositor]
  Phoc --> Main[GTK4 Phosh main loop]
  Main --> Shell[Phosh shell]
  Shell --> Layers[GTK4 layer surfaces]
  Shell --> Plugins[Quick-setting plugins]
  Plugins --> QR[Hotspot QR texture]
  Plugins --> Schemas[GSettings schema paths]
  Shell --> Audio[GTK4 audio settings]
  Audio --> GVC[GvcChannelBar]
Loading

Reviews (1) · Last reviewed commit: "phosh: retain GTK4 native dependency pin..."

Comment on lines +86 to +108
qr_matrix = g_byte_array_sized_new (total_size * total_size * pixel_size * BYTES_PER_R8G8B8);

for (column = 0; column < total_size; column++)
{
for (i = 0; i < pixel_size; i++)
{
for (row = 0; row < total_size / pixel_size; row++)
{
if (qrcodegen_getModule (qr_code, column, row))
fill_pixel (qr_matrix, 0x00, pixel_size);
else
fill_pixel (qr_matrix, 0xff, pixel_size);
}
}
}

/* If subpixel size is big and margin is pretty small,
* increase the margin */
if (pixel_size > 4 && padding < 12) {
pixel_size--;
padding = (size - qr_size * pixel_size) / 2;
}
bytes = g_byte_array_free_to_bytes (qr_matrix);

/* Now draw the black QR code pixels */
cairo_set_source_rgba (cr, 0, 0, 0, 1);
for (int row = 0; row < qr_size; row++) {
for (int column = 0; column < qr_size; column++) {
if (qrcodegen_getModule (qr_code, row, column)) {
cairo_rectangle (cr,
column * pixel_size + padding,
row * pixel_size + padding,
pixel_size, pixel_size);
cairo_fill (cr);
}
}
}
texture = gdk_memory_texture_new (total_size,
total_size,
GDK_MEMORY_R8G8B8,
bytes,
total_size * BYTES_PER_R8G8B8);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 QR bitmap is malformed

For normal hotspot payloads, pixel_size is greater than one, so total_size exceeds qr_size. This loop passes column values up to total_size directly to qrcodegen_getModule(), although valid module coordinates stop at qr_size. Most reads therefore render white, and the oversized, column-major byte stream is displayed directly as the texture. The resulting hotspot credentials QR code is malformed and cannot be scanned.

Comment thread phosh/src/main.c
Comment on lines +33 to +34
// FIXME Port to GTK 4
// gtk_main_quit ();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Shutdown never stops loop

SIGTERM and SIGINT schedule quit(), but this callback no longer stops a loop. The replacement GMainLoop is local to main() and remains blocked in g_main_loop_run(). Normal service shutdown therefore fades the shell but leaves the process running until the service manager times out or kills it.

Comment on lines 294 to +300
static void
phosh_channel_bar_finalize (GObject *object)
gvc_channel_bar_dispose (GObject *object)
{
PhoshChannelBar *self = PHOSH_CHANNEL_BAR (object);
gtk_widget_dispose_template (GTK_WIDGET (object), GVC_TYPE_CHANNEL_BAR);

G_OBJECT_CLASS (gvc_channel_bar_parent_class)->finalize (object);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Dispose calls parent finalizer

This dispose handler invokes the parent class's finalize method instead of dispose. When audio settings are torn down, the GtkBox/GtkWidget parent is finalized here and then finalized again when gvc_channel_bar_finalize() follows the normal chain, while parent disposal is skipped. This can corrupt memory or crash during ordinary widget destruction.

Suggested change
static void
phosh_channel_bar_finalize (GObject *object)
gvc_channel_bar_dispose (GObject *object)
{
PhoshChannelBar *self = PHOSH_CHANNEL_BAR (object);
gtk_widget_dispose_template (GTK_WIDGET (object), GVC_TYPE_CHANNEL_BAR);
G_OBJECT_CLASS (gvc_channel_bar_parent_class)->finalize (object);
}
static void
gvc_channel_bar_dispose (GObject *object)
{
gtk_widget_dispose_template (GTK_WIDGET (object), GVC_TYPE_CHANNEL_BAR);
G_OBJECT_CLASS (gvc_channel_bar_parent_class)->dispose (object);
}

Comment thread phosh/src/media-player.c

if (priv->track_position > 0 && priv->track_length > 0)
level = ((double) priv->track_position) / priv->track_length;
level = priv->track_position >= 0 ? ((double) priv->track_position) / priv->track_length : 0.0;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Zero track length divides

When a gapless or not-yet-populated track reports a nonnegative position but a zero length, this calculation divides by zero and passes NaN or infinity to GtkProgressBar. Such tracks should display zero progress instead of an invalid fraction.

Suggested change
level = priv->track_position >= 0 ? ((double) priv->track_position) / priv->track_length : 0.0;
level = priv->track_position >= 0 && priv->track_length > 0
? ((double) priv->track_position) / priv->track_length
: 0.0;

Comment thread phosh/run.in
SCHEMAS=(
"${ABS_BUILDDIR}/data:"
"${ABS_BUILDDIR}/plugins/launcher-box:"
"${ABS_BUILDDIR}/plugins/pomodoro-quick-setting"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Schema paths are concatenated

The pomodoro schema directory lacks the trailing colon used by the surrounding entries. After the array is joined and spaces are removed, it is concatenated with the ticket-box directory into one nonexistent path. Running from the build tree can therefore fail to load either plugin because their GSettings schemas are missing.

Suggested change
"${ABS_BUILDDIR}/plugins/pomodoro-quick-setting"
"${ABS_BUILDDIR}/plugins/pomodoro-quick-setting:"

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant