mirror of
https://github.com/subhobhai943/SUB-OS.git
synced 2026-10-25 16:52:29 +00:00
fix(gui): make the Settings app actually apply changes
The Settings window rendered fine but its controls only mutated the app's local
settings_data_t -- nothing was ever wired to the running system, so toggling
options did nothing ("not working").
- Appearance: "Show wallpaper grid overlay" now calls gui_desktop_set_grid()
live; the desktop grid shows/hides immediately.
- Input: "Show seconds in taskbar clock" now calls gui_desktop_set_clock_seconds();
the taskbar clock switches between HH:MM and HH:MM:SS.
- Power: the CPUFreq governor radios now call cpufreq_set_governor() (mapping the
UI order to the enum), and Apply/Defaults push all preferences to the system.
- The app seeds its controls from live state on open (grid/clock/governor), so it
reflects reality instead of hard-coded defaults.
Also add public gui_desktop_set_grid/get_grid and set/get_clock_seconds, and
give Settings a dedicated event handler that frees its state on close (the
shared app_forward_event leaked it).
Verified: Settings renders and its controls are wired to real effects; clean
build on x86_64/aarch64/armv8i; boots to the login gate with 0 panics / 0 OOM.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Fh5z6V7nGPbHvqVG5p4CXX
This commit is contained in:
1 parent
0377726615
commit
ef6714a004
3 files changed
+75
-14
No files matched your search
+56
-13
@@ -10,6 +10,7 @@
|
||||
#include <gui/gui_dialog.h>
|
||||
#include <gui/gui_gfx.h>
|
||||
#include <gui/gui_theme.h>
|
||||
#include <gui/gui_desktop.h>
|
||||
#include <kernel/ktest.h>
|
||||
#include <kernel/printk.h>
|
||||
#include <kernel/task.h>
|
||||
@@ -54,6 +55,23 @@ typedef struct {
|
||||
|
||||
static const char* const settings_tabs[] = { "Appearance", "Input", "Power" };
|
||||
|
||||
// Map the Settings governor radio (0 powersave / 1 ondemand / 2 performance)
|
||||
// to and from the cpufreq_gov_type_t enum, whose order differs.
|
||||
static cpufreq_gov_type_t settings_gov_from_choice(int choice) {
|
||||
switch (choice) {
|
||||
case 0: return CPUFREQ_GOV_POWERSAVE;
|
||||
case 2: return CPUFREQ_GOV_PERFORMANCE;
|
||||
default: return CPUFREQ_GOV_ONDEMAND;
|
||||
}
|
||||
}
|
||||
static int settings_choice_from_gov(cpufreq_gov_type_t gov) {
|
||||
switch (gov) {
|
||||
case CPUFREQ_GOV_POWERSAVE: return 0;
|
||||
case CPUFREQ_GOV_PERFORMANCE: return 2;
|
||||
default: return 1;
|
||||
}
|
||||
}
|
||||
|
||||
static void settings_paint(gui_window_t* win) {
|
||||
settings_data_t* sd = (settings_data_t*)win->user_data;
|
||||
if (!sd) return;
|
||||
@@ -69,7 +87,9 @@ static void settings_paint(gui_window_t* win) {
|
||||
if (sd->active_tab == 0) {
|
||||
gui_label_bold(10, y, "Desktop Appearance", GUI_THEME_PRIMARY);
|
||||
y += 24;
|
||||
gui_checkbox(10, 10, y, "Show wallpaper grid overlay", &sd->show_grid);
|
||||
if (gui_checkbox(10, 10, y, "Show wallpaper grid overlay", &sd->show_grid)) {
|
||||
gui_desktop_set_grid(sd->show_grid); // apply immediately
|
||||
}
|
||||
y += 22;
|
||||
gui_checkbox(11, 10, y, "Drop shadows under windows", &sd->window_shadows);
|
||||
y += 26;
|
||||
@@ -95,7 +115,9 @@ static void settings_paint(gui_window_t* win) {
|
||||
|
||||
gui_checkbox(21, 10, y, "Enable UI sound effects", &sd->sound_enabled);
|
||||
y += 22;
|
||||
gui_checkbox(22, 10, y, "Show seconds in taskbar clock", &sd->show_clock_seconds);
|
||||
if (gui_checkbox(22, 10, y, "Show seconds in taskbar clock", &sd->show_clock_seconds)) {
|
||||
gui_desktop_set_clock_seconds(sd->show_clock_seconds); // apply immediately
|
||||
}
|
||||
y += 30;
|
||||
|
||||
const mouse_state_t* ms = mouse_get_state();
|
||||
@@ -111,9 +133,13 @@ static void settings_paint(gui_window_t* win) {
|
||||
|
||||
gui_label(10, y, "CPUFreq governor", GUI_THEME_TEXT_MUTED);
|
||||
y += 16;
|
||||
gui_radio(30, 14, y, "powersave", &sd->governor_choice, 0); y += 18;
|
||||
gui_radio(31, 14, y, "ondemand", &sd->governor_choice, 1); y += 18;
|
||||
gui_radio(32, 14, y, "performance", &sd->governor_choice, 2); y += 26;
|
||||
bool gov_changed = false;
|
||||
gov_changed |= gui_radio(30, 14, y, "powersave", &sd->governor_choice, 0); y += 18;
|
||||
gov_changed |= gui_radio(31, 14, y, "ondemand", &sd->governor_choice, 1); y += 18;
|
||||
gov_changed |= gui_radio(32, 14, y, "performance", &sd->governor_choice, 2); y += 26;
|
||||
if (gov_changed) {
|
||||
cpufreq_set_governor(settings_gov_from_choice(sd->governor_choice));
|
||||
}
|
||||
|
||||
cpufreq_stats_t cf = cpufreq_get_stats();
|
||||
snprintf(buf, sizeof(buf), "Current clock: %u.%03u GHz",
|
||||
@@ -128,6 +154,10 @@ static void settings_paint(gui_window_t* win) {
|
||||
|
||||
int btn_y = gui_widget_client_height() - 32;
|
||||
if (gui_button(90, 10, btn_y, 96, 24, "Apply")) {
|
||||
// Push every preference to the live system, then confirm.
|
||||
gui_desktop_set_grid(sd->show_grid);
|
||||
gui_desktop_set_clock_seconds(sd->show_clock_seconds);
|
||||
cpufreq_set_governor(settings_gov_from_choice(sd->governor_choice));
|
||||
gui_dialog_show(GUI_DIALOG_INFO, "Settings",
|
||||
"Preferences applied to the current desktop session.");
|
||||
}
|
||||
@@ -140,11 +170,23 @@ static void settings_paint(gui_window_t* win) {
|
||||
sd->cursor_speed = 5;
|
||||
sd->brightness = 100;
|
||||
sd->governor_choice = 1;
|
||||
// Apply the restored defaults live as well.
|
||||
gui_desktop_set_grid(true);
|
||||
gui_desktop_set_clock_seconds(true);
|
||||
cpufreq_set_governor(CPUFREQ_GOV_ONDEMAND);
|
||||
}
|
||||
|
||||
gui_widget_end();
|
||||
}
|
||||
|
||||
static void settings_event(gui_window_t* win, const gui_event_t* ev) {
|
||||
if (ev->type == GUI_EVENT_CLOSE) {
|
||||
if (win->user_data) { kfree(win->user_data); win->user_data = NULL; }
|
||||
return;
|
||||
}
|
||||
gui_widget_feed_event(win, ev);
|
||||
}
|
||||
|
||||
void gui_app_settings_launch(int x, int y, int w, int h) {
|
||||
gui_window_t* win = gui_wm_create_window("Settings", x, y,
|
||||
(w > 0) ? w : 380, (h > 0) ? h : 300);
|
||||
@@ -153,17 +195,18 @@ void gui_app_settings_launch(int x, int y, int w, int h) {
|
||||
settings_data_t* sd = (settings_data_t*)kzalloc(sizeof(settings_data_t));
|
||||
if (!sd) return;
|
||||
|
||||
sd->show_grid = true;
|
||||
sd->window_shadows = true;
|
||||
sd->sound_enabled = true;
|
||||
sd->show_clock_seconds = true;
|
||||
sd->cursor_speed = 5;
|
||||
sd->brightness = 100;
|
||||
sd->governor_choice = 1;
|
||||
// Seed the controls from the live system so the app reflects real state.
|
||||
sd->show_grid = gui_desktop_get_grid();
|
||||
sd->window_shadows = true;
|
||||
sd->sound_enabled = true;
|
||||
sd->show_clock_seconds = gui_desktop_get_clock_seconds();
|
||||
sd->cursor_speed = 5;
|
||||
sd->brightness = 100;
|
||||
sd->governor_choice = settings_choice_from_gov(cpufreq_get_stats().governor);
|
||||
|
||||
win->user_data = sd;
|
||||
win->paint = settings_paint;
|
||||
win->handle_event = app_forward_event;
|
||||
win->handle_event = settings_event;
|
||||
}
|
||||
|
||||
// ===========================================================================
|
||||
|
||||
+11
-1
@@ -78,6 +78,7 @@ static int g_context_x = 0, g_context_y = 0;
|
||||
static bool g_desktop_running = false;
|
||||
static bool g_prev_left = false, g_prev_right = false;
|
||||
static bool g_show_grid = true;
|
||||
static bool g_clock_seconds = true;
|
||||
static int g_selected_icon = -1;
|
||||
static int g_hover_menu_item = -1;
|
||||
static uint64_t g_frames = 0;
|
||||
@@ -359,10 +360,19 @@ void gui_desktop_render_taskbar(void) {
|
||||
|
||||
rtc_time_t now;
|
||||
rtc_get_time(&now);
|
||||
snprintf(buf, sizeof(buf), "%02u:%02u:%02u", now.hour, now.minute, now.second);
|
||||
if (g_clock_seconds) {
|
||||
snprintf(buf, sizeof(buf), "%02u:%02u:%02u", now.hour, now.minute, now.second);
|
||||
} else {
|
||||
snprintf(buf, sizeof(buf), "%02u:%02u", now.hour, now.minute);
|
||||
}
|
||||
gui_gfx_draw_string_16_shadow(sw - 84, ty + 8, buf, GUI_THEME_PRIMARY, GUI_COLOR_BLACK);
|
||||
}
|
||||
|
||||
void gui_desktop_set_grid(bool on) { g_show_grid = on; }
|
||||
bool gui_desktop_get_grid(void) { return g_show_grid; }
|
||||
void gui_desktop_set_clock_seconds(bool on) { g_clock_seconds = on; }
|
||||
bool gui_desktop_get_clock_seconds(void) { return g_clock_seconds; }
|
||||
|
||||
// ===========================================================================
|
||||
// Start menu
|
||||
// ===========================================================================
|
||||
|
||||
Reference in new issue
Block a user