Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
bc71048
feat: Improve Wayland shell surface robustness and add conditional `W…
patrickjquinn Jan 15, 2026
79e4dd2
refactor: group shell sources by domain
patrickjquinn Jan 16, 2026
ac007a8
refactor(shell): align QML with C++ services
patrickjquinn Jan 16, 2026
2657d3a
chore(ui): refine MarathonUI components and lint setup
patrickjquinn Jan 16, 2026
8ad2f79
refactor(services): sync telephony, contacts, and media helpers
patrickjquinn Jan 16, 2026
1a0c19b
refactor(keyboard): tighten layouts and input handling
patrickjquinn Jan 16, 2026
0b3b521
refactor(apps): align app UIs with updated services
patrickjquinn Jan 16, 2026
d42b5ca
refactor(core): adjust app registry and scanning metadata
patrickjquinn Jan 16, 2026
4764ed4
feat(app-runner): add calendar manager and IPC updates
patrickjquinn Jan 16, 2026
ed8d4b9
chore(build): update lint plumbing and run script
patrickjquinn Jan 16, 2026
ff05e41
chore(scripts): add QML build helpers
patrickjquinn Jan 16, 2026
5cb6311
feat(shell): move SessionStore to C++ singleton
patrickjquinn Jan 16, 2026
4d7898a
fix(shell): restore SessionStore singleton wiring
patrickjquinn Jan 16, 2026
412ebbd
fix(messages): handle conversation taps and ids
patrickjquinn Jan 16, 2026
93561ec
feat(shell): move core stores to C++
patrickjquinn Jan 16, 2026
516e746
fix(shell): wire QML to C++ stores
patrickjquinn Jan 16, 2026
0e4b8d4
fix(app-runner): expose shell store proxies
patrickjquinn Jan 16, 2026
ee93d36
feat(shell): move keyboard and core singletons to C++
patrickjquinn Jan 17, 2026
fe6d69b
feat(settings): move keyboard settings store to C++
patrickjquinn Jan 17, 2026
969e897
fix(shell): focus search input reliably
patrickjquinn Jan 17, 2026
d2ee1b0
feat(shell): move InputContext to C++
patrickjquinn Jan 17, 2026
d12c2d8
feat(calendar): move calendar storage to C++
patrickjquinn Jan 17, 2026
ea17db4
chore(marathon-keyboard): remove unused QML data files
patrickjquinn Jan 17, 2026
f16e839
fix(shell): register InputContext and track hints
patrickjquinn Jan 17, 2026
91e4c79
refactor(shell): remove CalendarWorker QML service
patrickjquinn Jan 17, 2026
a25dece
feat(shell): enhance MarathonOOBE with mouse interaction and icon upd…
patrickjquinn Jan 17, 2026
8d5e723
feat(shell): add display scaling options to MarathonOOBE
patrickjquinn Jan 18, 2026
556dae8
refactor(terminal): clean up imports and improve focus handling
patrickjquinn Jan 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 6 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,12 @@ endif()
# Enable QML Language Server support for IDE/VS Code
set(QT_QML_GENERATE_QMLLS_INI ON)

set(QML_IMPORT_PATH
"${CMAKE_BINARY_DIR}"
"${CMAKE_BINARY_DIR}/shell/qml"
CACHE STRING "" FORCE
)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
Expand Down
17 changes: 17 additions & 0 deletions apps/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,19 @@ if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/QMLLint.cmake")
include(${CMAKE_CURRENT_SOURCE_DIR}/../cmake/QMLLint.cmake)
endif()

get_filename_component(REPO_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/.." ABSOLUTE)
set(QML_IMPORT_PATH
"${REPO_ROOT}/build/qmllint"
"${REPO_ROOT}/build"
"${REPO_ROOT}/build/shell/qml"
CACHE STRING "" FORCE
)
set(MARATHON_QML_IMPORT_PATH
"${REPO_ROOT}/build/qmllint"
"${REPO_ROOT}/build"
"${REPO_ROOT}/build/shell/qml"
)


function(add_marathon_app APP_NAME)
set(options "")
Expand Down Expand Up @@ -119,6 +132,10 @@ function(add_marathon_app APP_NAME)
"${MODULE_OUTPUT_DIR}"
NO_PLUGIN_OPTIONAL)

set_property(TARGET ${APP_NAME} APPEND PROPERTY QT_QML_IMPORT_PATH
"${MARATHON_QML_IMPORT_PATH}"
)

if(APPLE)
install(
CODE "
Expand Down
98 changes: 6 additions & 92 deletions apps/browser/BrowserApp.qml

Large diffs are not rendered by default.

49 changes: 28 additions & 21 deletions apps/browser/components/BrowserDrawer.qml
Original file line number Diff line number Diff line change
@@ -1,21 +1,13 @@
import QtQuick
import MarathonApp.Browser
import QtQuick.Layouts
import MarathonOS.Shell
import MarathonUI.Theme
import MarathonUI.Core
import MarathonUI.Navigation
import MarathonUI.Theme
import QtQuick
import QtQuick.Layouts

Rectangle {
id: drawer
anchors.fill: parent
color: MColors.background

signal closed
signal tabSelected(int tabId)
signal newTabRequested
signal bookmarkSelected(string url)
signal historySelected(string url)

property int selectedTabIndex: 0
property alias contentStack: contentStack
Expand All @@ -24,33 +16,42 @@ Rectangle {
property alias historyPage: historyPage
property alias settingsPage: settingsPage

signal closed
signal tabSelected(int tabId)
signal newTabRequested
signal bookmarkSelected(string url)
signal historySelected(string url)

anchors.fill: parent
color: MColors.background

Column {
anchors.fill: parent
spacing: 0

MTabBar {
id: drawerTabs

width: parent.width
activeTab: drawer.selectedTabIndex
tabs: [
{
label: "Tabs",
icon: "layers"
"label": "Tabs",
"icon": "layers"
},
{
label: "Bookmarks",
icon: "star"
"label": "Bookmarks",
"icon": "star"
},
{
label: "History",
icon: "clock"
"label": "History",
"icon": "clock"
},
{
label: "Settings",
icon: "settings"
"label": "Settings",
"icon": "settings"
}
]

onTabSelected: index => {
drawer.selectedTabIndex = index;
Logger.info("BrowserDrawer", "Switched to tab: " + index);
Expand All @@ -59,18 +60,23 @@ Rectangle {

StackLayout {
id: contentStack

width: parent.width
height: parent.height - drawerTabs.height
currentIndex: drawer.selectedTabIndex

TabsPage {
id: tabsPage
onTabSelected: tabId => drawer.tabSelected(tabId)

onTabSelected: tabId => {
return drawer.tabSelected(tabId);
}
onNewTabRequested: drawer.newTabRequested()
}

BookmarksPage {
id: bookmarksPage

onBookmarkSelected: url => {
drawer.bookmarkSelected(url);
drawer.closed();
Expand All @@ -79,6 +85,7 @@ Rectangle {

HistoryPage {
id: historyPage

onHistorySelected: url => {
drawer.historySelected(url);
drawer.closed();
Expand Down
36 changes: 16 additions & 20 deletions apps/browser/components/TabCard.qml
Original file line number Diff line number Diff line change
@@ -1,32 +1,30 @@
import QtQuick
import MarathonApp.Browser
import MarathonOS.Shell
import MarathonUI.Theme
import MarathonUI.Core
import MarathonUI.Containers
import MarathonUI.Core
import MarathonUI.Theme
import QtQuick

MCard {
id: tabCard
height: Constants.cardHeight
elevation: isCurrentTab ? 2 : 1
interactive: false // Disable built-in MouseArea to allow custom z-ordering

signal tabClicked
signal closeRequested

property var tabData: null
property bool isCurrentTab: false

border.color: isCurrentTab ? MColors.accentBright : MColors.border
signal tabClicked
signal closeRequested

height: Constants.cardHeight
elevation: isCurrentTab ? 2 : 1
interactive: false
border.color: isCurrentTab ? MColors.accentBright : MColors.border
onClicked: {
tabCard.tabClicked();
}

// Manual MouseArea for tab clicking, placed behind content but filling card
MouseArea {
anchors.fill: parent
z: 0 // Bottom layer
z: 0
onClicked: {
tabCard.tabClicked();
}
Expand All @@ -35,7 +33,7 @@ MCard {
Column {
anchors.fill: parent
anchors.margins: MSpacing.md
anchors.rightMargin: MSpacing.md + Constants.touchTargetSmall // Make room for close button
anchors.rightMargin: MSpacing.md + Constants.touchTargetSmall
spacing: MSpacing.sm

Item {
Expand All @@ -44,6 +42,7 @@ MCard {

Icon {
id: globeIcon

anchors.left: parent.left
anchors.top: parent.top
name: "globe"
Expand Down Expand Up @@ -100,29 +99,27 @@ MCard {

Item {
id: closeButtonContainer

anchors.right: parent.right
anchors.top: parent.top
width: Constants.touchTargetSmall
height: Constants.touchTargetSmall
z: 1000 // High z-index to sit above card content
z: 1000

MIconButton {
anchors.centerIn: parent
iconName: "x"
// Disable internal mouse handling to prevent conflicts, we handle it manually
enabled: false
opacity: closeMouseArea.pressed ? 0.7 : 1.0 // Visual feedback
// color property removed as it caused a crash
opacity: closeMouseArea.pressed ? 0.7 : 1
}

MouseArea {
id: closeMouseArea

anchors.fill: parent
hoverEnabled: true
preventStealing: true
propagateComposedEvents: false

// Explicitly accept all events to prevent propagation to MCard
onPressed: mouse => {
mouse.accepted = true;
}
Expand All @@ -135,7 +132,6 @@ MCard {
onPressAndHold: mouse => {
mouse.accepted = true;
}

onClicked: mouse => {
mouse.accepted = true;
tabCard.closeRequested();
Expand Down
12 changes: 3 additions & 9 deletions apps/browser/components/WebView.qml
Original file line number Diff line number Diff line change
@@ -1,25 +1,19 @@
import QtQuick
import MarathonApp.Browser
import QtWebEngine
import MarathonOS.Shell
import MarathonUI.Core
import QtQuick
import QtWebEngine

// Separate file for WebEngineView to enable true lazy loading
// This file is only loaded when needed, avoiding QtWebEngine initialization on app launch
WebEngineView {
id: webView

property bool updatingTabUrl: false
property bool active: true
property bool crashed: false
// Allows BrowserApp to discard WebEngine state while minimized without breaking bindings.
property bool forceDiscarded: false

zoomFactor: 1.0

// Keep per-tab state, but freeze background tabs (no reload) on low-end devices.
zoomFactor: 1
lifecycleState: forceDiscarded ? WebEngineView.LifecycleState.Discarded : (active ? WebEngineView.LifecycleState.Active : WebEngineView.LifecycleState.Frozen)

settings.accelerated2dCanvasEnabled: false
settings.webGLEnabled: false
settings.pluginsEnabled: false
Expand Down
Loading