Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,16 @@ install:
install -Dm00755 tyde_runner $(DESTDIR)$(PREFIX)/bin/tyde_runner
install -Dm00755 tyde_ctl $(DESTDIR)$(PREFIX)/bin/tyde_ctl
install -Dm00755 tyde $(DESTDIR)$(PREFIX)/bin/tyde
install -Dm00644 theme/assets/icon.png $(DESTDIR)$(PREFIX)/share/pixmaps/com.fyshos.tyde.png
install -Dm00644 tyde.desktop $(DESTDIR)$(PREFIX)/share/xsessions/tyde.desktop
install -Dm00644 tyde-welcome.desktop $(DESTDIR)$(PREFIX)/share/applications/tyde-welcome.desktop

uninstall:
-rm $(DESTDIR)$(PREFIX)/bin/tyde_runner
-rm $(DESTDIR)$(PREFIX)/bin/tyde_ctl
-rm $(DESTDIR)$(PREFIX)/bin/tyde
-rm $(DESTDIR)$(PREFIX)/share/xsessions/tyde.desktop
-rm $(DESTDIR)$(PREFIX)/share/applications/tyde-welcome.desktop

embed:
Xephyr :5 -screen 1280x720 &
Expand Down
5 changes: 4 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ require (
github.com/disintegration/imaging v1.6.2
github.com/fyne-io/image v0.1.1
github.com/fyne-io/oksvg v0.2.0 // indirect
github.com/godbus/dbus/v5 v5.1.0
github.com/godbus/dbus/v5 v5.2.2
github.com/hack-pad/go-indexeddb v0.3.2 // indirect
github.com/hack-pad/safejs v0.1.0 // indirect
github.com/jackmordaunt/icns v1.0.1-0.20200413110149-9e181b441ab2 // indirect
Expand All @@ -35,6 +35,7 @@ require github.com/creack/pty v1.1.21 // indirect
require (
github.com/FyshOS/dryvers v0.0.0-20260222162433-1ffb8226c1cf
github.com/FyshOS/fyqr v0.0.0-20260624213738-536424772cba
github.com/FyshOS/networks v0.0.0-20260626180915-31c6f68dcf53
github.com/FyshOS/screens v0.0.0-20260616082735-2b927ac5e820
github.com/fyne-io/terminal v0.0.0-20251011215138-c2ed69d5a2d6
golang.org/x/image v0.24.0
Expand All @@ -48,6 +49,7 @@ require (
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 // indirect
github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298 // indirect
github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966 // indirect
github.com/amenzhinsky/go-polkit v0.0.0-20210519083301-ee6a51849123 // indirect
github.com/anthonynsimon/bild v0.13.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/fredbi/uri v1.1.1 // indirect
Expand All @@ -58,6 +60,7 @@ require (
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a // indirect
github.com/go-text/render v0.2.1 // indirect
github.com/go-text/typesetting v0.3.4 // indirect
github.com/joeflateau/go-iwd v0.0.0-20240409133838-1f3ac7d42dc5 // indirect
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 // indirect
github.com/mattn/go-runewidth v0.0.17 // indirect
github.com/pkg/errors v0.8.1 // indirect
Expand Down
11 changes: 9 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,16 @@ github.com/FyshOS/fyles v0.1.0 h1:ezJIxIEcQtoyN8c52vadLZRr1m8ZUIusz8yBfjed/pk=
github.com/FyshOS/fyles v0.1.0/go.mod h1:YgozzG7CgidZTeohsrb6ayuLP803tRfmPNZ7cUXwdHI=
github.com/FyshOS/fyqr v0.0.0-20260624213738-536424772cba h1:en4DPSeMviqsBmoT2nbPmPV9l5FsXFuz9JU4S0y/SE0=
github.com/FyshOS/fyqr v0.0.0-20260624213738-536424772cba/go.mod h1:hFyul2zT1VOgINBEBeRVkXeoCBWo5dWU4poPihDniVU=
github.com/FyshOS/networks v0.0.0-20260626180915-31c6f68dcf53 h1:Dh1Un0qbuz1KBqn52rkL5j1M5CbntyrGbdtqXyOPdoo=
github.com/FyshOS/networks v0.0.0-20260626180915-31c6f68dcf53/go.mod h1:2Xjq+UcVtuEJrVPfQm6DVYo1DQgilPiO8aznbmR8Veg=
github.com/FyshOS/saver v0.1.1-0.20260407200543-762135717028 h1:gnZOxK+y64+zaAreh9PyispXXCSz9vV5WgM+qO5h7ok=
github.com/FyshOS/saver v0.1.1-0.20260407200543-762135717028/go.mod h1:WvBivsR68hbiahFFjEf5Yzv1chBd/Slo8TRziPgzEOY=
github.com/FyshOS/screens v0.0.0-20260616082735-2b927ac5e820 h1:1brj9ygNCRJUM5uMjPC2s5q/du9FnK4Y40YdLpURaGQ=
github.com/FyshOS/screens v0.0.0-20260616082735-2b927ac5e820/go.mod h1:WUjD+Oi5pGOusfSqrFrk/woIrqr+bMOZUGK0lc5mbRQ=
github.com/Knetic/govaluate v3.0.0+incompatible h1:7o6+MAPhYTCF0+fdvoz1xDedhRb4f6s9Tn1Tt7/WTEg=
github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
github.com/amenzhinsky/go-polkit v0.0.0-20210519083301-ee6a51849123 h1:VdNhe94PF9yn6KudYnpcBb6bH7l+wsEy9yn6Ulm1/j8=
github.com/amenzhinsky/go-polkit v0.0.0-20210519083301-ee6a51849123/go.mod h1:CdMR3dsiNi5M2BbtFlMo85mRbNt6LiMw04UBzJmoVEU=
github.com/anthonynsimon/bild v0.13.0 h1:mN3tMaNds1wBWi1BrJq0ipDBhpkooYfu7ZFSMhXt1C8=
github.com/anthonynsimon/bild v0.13.0/go.mod h1:tpzzp0aYkAsMi1zmfhimaDyX1xjn2OUc1AJZK/TF0AE=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
Expand Down Expand Up @@ -76,8 +80,9 @@ github.com/go-text/render v0.2.1/go.mod h1:HCCAq8MUlm/WRcXshBb4K/n+IkjeXQ1c2Ba+y
github.com/go-text/typesetting v0.3.4 h1:YYurUOtEb9kGSOz4uE3k4OpBGsp1dDL8+fjCeaFamAU=
github.com/go-text/typesetting v0.3.4/go.mod h1:4qZCQphq4KSgGTAeI0uMEkVbROgfah8BuyF5LRYr7XY=
github.com/go-text/typesetting-utils v0.0.0-20260223113751-2d88ac90dae3 h1:drBZzMgdYPbmyXqOto4YhhJGrFIQCX94FpR4MzTCsos=
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/godbus/dbus/v5 v5.2.2 h1:TUR3TgtSVDmjiXOgAAyaZbYmIeP3DPkld3jgKGV8mXQ=
github.com/godbus/dbus/v5 v5.2.2/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c=
github.com/google/pprof v0.0.0-20211214055906-6f57359322fd h1:1FjCyPC+syAzJ5/2S8fqdZK1R22vvA0J7JZKcuOIQ7Y=
github.com/hack-pad/go-indexeddb v0.3.2 h1:DTqeJJYc1usa45Q5r52t01KhvlSN02+Oq+tQbSBI91A=
github.com/hack-pad/go-indexeddb v0.3.2/go.mod h1:QvfTevpDVlkfomY498LhstjwbPW6QC4VC/lxYb0Kom0=
Expand All @@ -90,6 +95,8 @@ github.com/jackmordaunt/icns v1.0.1-0.20200413110149-9e181b441ab2/go.mod h1:Hj3T
github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade h1:FmusiCI1wHw+XQbvL9M+1r/C3SPqKrmBaIOYwVfQoDE=
github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade/go.mod h1:ZDXo8KHryOWSIqnsb/CiDq7hQUYryCgdVnxbj8tDG7o=
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/joeflateau/go-iwd v0.0.0-20240409133838-1f3ac7d42dc5 h1:EIdfNVFubG8t/of/KrJnQLj5GMzZ+/+1V+/SmP/dtJU=
github.com/joeflateau/go-iwd v0.0.0-20240409133838-1f3ac7d42dc5/go.mod h1:4I0mfrVvxj7labUhhbS4EYZb5c1nQV3YM092CcIfyFI=
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 h1:YLvr1eE6cdCqjOe972w/cYF+FjW34v27+9Vo5106B4M=
github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25/go.mod h1:kLgvv7o6UM+0QSf0QjAse3wReFDsb9qbZJdfexWlrQw=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
Expand Down
26 changes: 24 additions & 2 deletions internal/ui/desk.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,14 @@ type desktop struct {
// overlayShapes maps each shown overlay to the screen-pixel rectangle it occupies,
// so frame input shapes can be made transparent only under the overlay content.
overlayShapes map[fyne.CanvasObject]image.Rectangle

// welcomeDone guards the first-run welcome splash so it is only ever triggered
// once per session, from the first primary-window layout with a real size.
welcomeDone bool

// activityLayer, in embedded mode only, watches for mouse movement to defer the
// screen saver.
activityLayer fyne.CanvasObject
}

func (l *desktop) Desktop() int {
Expand Down Expand Up @@ -439,6 +447,14 @@ func (l *desktop) Layout(objects []fyne.CanvasObject, size fyne.Size) {
l.widgets.Resize(fyne.NewSize(widgetsWidth, pH))
l.widgets.Move(fyne.NewPos(pW-widgetsWidth, 0))
l.widgets.Refresh()

// On the very first boot, once the primary window has a real (full-screen)
// size, present the welcome splash.
if !l.welcomeDone && shouldShowWelcome() && l.primaryWin != nil &&
size.Width >= welcomeWidth && size.Height >= welcomeHeight {
l.welcomeDone = true
fyne.Do(l.ShowWelcome)
}
}

func (l *desktop) MinSize(_ []fyne.CanvasObject) fyne.Size {
Expand Down Expand Up @@ -668,6 +684,11 @@ func (l *desktop) createPrimaryContent(sw *screenWindow) fyne.CanvasObject {
// Order: background -> compositor -> overlay modules -> bar -> widgets -> compositor overlay -> UI overlay -> mouse
objects := []fyne.CanvasObject{sw.bg}

// Embedded mode's screen-saver activity monitor sits just above the background.
if l.activityLayer != nil {
objects = append(objects, l.activityLayer)
}

// Normal compositor for regular windows below desktop chrome
if sw.compositor != nil {
objects = append(objects, sw.compositor)
Expand Down Expand Up @@ -1167,8 +1188,9 @@ func NewEmbeddedDesktop(app fyne.App, icons appie.Provider) tyde.Desktop {
desk.accessoryLayer = container.NewWithoutLayout()
AccessoryRefresher = func() { rebuildEmbeddedAccessories(desk.accessoryLayer) }

over := wm.setWindow(win)
win.SetContent(container.NewStack(desk.createPrimaryContent(sw), over))
// The saver monitor watches mouse movement to defer the screen saver.
desk.activityLayer = wm.setWindow(win)
win.SetContent(desk.createPrimaryContent(sw))
return desk
}

Expand Down
27 changes: 26 additions & 1 deletion internal/ui/settings_ui.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import (
"fyshos.com/tyde"
wmtheme "fyshos.com/tyde/theme"
"fyshos.com/tyde/wm"
"github.com/godbus/dbus/v5"
)

//go:embed "themes/*"
Expand All @@ -44,6 +45,8 @@ type settingsUI struct {

fyneSettings *settings.Settings
launcherIcons []string

netConn *dbus.Conn // system bus backing the Network tab, closed with the window
}

func (d *settingsUI) populateThemeIcons(box *fyne.Container, theme string) {
Expand Down Expand Up @@ -346,6 +349,18 @@ func (d *settingsUI) loadBarScreen() fyne.CanvasObject {
widget.NewCard("App Bar", "", container.NewVBox(bar, details)))
}

// loadNetworkScreen builds the Wi-Fi management tab from our networks app package.
func (d *settingsUI) loadNetworkScreen() fyne.CanvasObject {
nm, conn, err := newWifiNetworks(d.win)
if err != nil {
msg := widget.NewLabel("Wi-Fi management is unavailable.\n\n" + err.Error())
msg.Wrapping = fyne.TextWrapWord
return widget.NewCard("Network", "", container.NewCenter(msg))
}
d.netConn = conn
return widget.NewCard("Network", "", nm)
}

func (d *settingsUI) loadModulesScreen() fyne.CanvasObject {
var modules, launchers []fyne.CanvasObject

Expand Down Expand Up @@ -564,7 +579,13 @@ func (w *widgetPanel) showSettings() {
screens := screenmanager.New(win)
screens.OnConfigurationChanged = w.desk.Screens().RefreshScreens
screenui := widget.NewCard("Screens", "", screens)
win.SetOnClosed(screens.Close)
win.SetOnClosed(func() {
screens.Close()
if ui.netConn != nil {
_ = ui.netConn.Close()
ui.netConn = nil
}
})

tabs := container.NewAppTabs(
&container.TabItem{
Expand All @@ -580,6 +601,10 @@ func (w *widgetPanel) showSettings() {
Text: "Display", Icon: wmtheme.ScreensIcon,
Content: container.NewBorder(scale, nil, nil, nil, screenui),
},
&container.TabItem{
Text: "Network", Icon: wmtheme.WifiIcon,
Content: ui.loadNetworkScreen(),
},
&container.TabItem{Text: "Time/Date", Icon: wmtheme.ClockIcon, Content: ui.loadTimeScreen()},
&container.TabItem{Text: "Theme", Icon: theme.ColorPaletteIcon(), Content: ui.loadThemeScreen()},
&container.TabItem{Text: "Keyboard", Icon: wmtheme.KeyboardIcon, Content: ui.loadKeyboardScreen()},
Expand Down
Loading
Loading