--- a/src/backgrounds.cpp +++ b/src/backgrounds.cpp @@ -43,7 +43,7 @@ workspace.set_border_width(10); backdrop.set_border_width(10); tabs.append_page(workspace, "Workspace images"); tabs.append_page(backdrop, "Fixed backdrop"); help.set_text("Each workspace has its own image. Transparent areas reveal the other cube faces, including while the cube is at rest. The fixed backdrop stays behind the cube. Selecting a workspace here does not switch your desktop."); - label_style(help); label_style(status); label_style(backdrop_help); label_style(backdrop_status); + label_style(help); label_style(status); label_style(memory); label_style(backdrop_help); label_style(backdrop_status); workspace.pack_start(help, false, false); outputs.get_accessible()->set_name("Background desktop output"); selection.get_accessible()->set_name("Background workspace"); mode.get_accessible()->set_name("Workspace background layout"); @@ -53,6 +53,7 @@ workspace.pack_start(mode, false, false); workspace.pack_start(editor, false, false); buttons.pack_start(reload, false, false); buttons.pack_start(all, false, false); buttons.pack_end(apply, false, false); workspace.pack_start(buttons, false, false); workspace.pack_start(status, false, false); + workspace.pack_start(memory, false, false); all.set_tooltip_text("Replace every workspace override on this output with the selected layout."); backdrop_help.set_text("This image remains behind the cube. Use rotation keeps the existing Wallhaven wallpaper service in control. Workspace backgrounds have a separate Apply button."); backdrop.pack_start(backdrop_help, false, false); @@ -108,6 +109,7 @@ try { auto next = request("workspace-backgrounds/status"); + show_memory(next); if (next["completed_job"].get() == pending_job) { pending_job = 0; @@ -130,6 +132,14 @@ }, 200); } BackgroundsPage::~BackgroundsPage() { timer.disconnect(); if (fixed_worker.valid()) fixed_worker.wait(); } +void BackgroundsPage::show_memory(const json& renderer) +{ + const auto mib = 1024 * 1024; + auto used = renderer.value("texture_bytes", uint64_t(0)); + auto limit = renderer.value("texture_budget", uint64_t(0)); + memory.set_text("Image memory: " + std::to_string((used + mib - 1) / mib) + " / " + + std::to_string(limit / mib) + " MiB. Adjustable in Workspace backgrounds → Texture budget."); +} void BackgroundsPage::refresh() { try @@ -139,6 +149,7 @@ if (std::filesystem::weakly_canonical(next["config_file"].get()) != std::filesystem::weakly_canonical(config_file)) throw std::runtime_error("Open WCM with the running session's configuration to edit workspace backgrounds"); state = next; draft = original = state["settings"]; available = true; + show_memory(state); loading = true; outputs.remove_all(); for (auto& output : state["outputs"]) outputs.append(output["name"].get(), output["name"].get()); if (!outputs.set_active_id(selected_output) && !state["outputs"].empty()) outputs.set_active(0); --- a/src/backgrounds.hpp +++ b/src/backgrounds.hpp @@ -10,7 +10,7 @@ Gtk::Box workspace{Gtk::ORIENTATION_VERTICAL, 10}, backdrop{Gtk::ORIENTATION_VERTICAL, 10}; Gtk::Box editor{Gtk::ORIENTATION_VERTICAL, 8}, backdrop_editor{Gtk::ORIENTATION_VERTICAL, 8}; Gtk::Box buttons{Gtk::ORIENTATION_HORIZONTAL, 8}, backdrop_buttons{Gtk::ORIENTATION_HORIZONTAL, 8}; - Gtk::Label help, status, backdrop_help, backdrop_status; + Gtk::Label help, status, memory, backdrop_help, backdrop_status; Gtk::ComboBoxText outputs, selection, mode, backdrop_mode, backdrop_sizing; Gtk::Button apply{"Apply workspace backgrounds"}, reload{"Revert workspace changes"}, all{"Copy to all workspaces"}; Gtk::Button backdrop_apply{"Apply fixed backdrop"}, backdrop_reload{"Revert backdrop changes"}; @@ -22,6 +22,7 @@ sigc::connection timer; static json request(const std::string& method, const json& data = json::object()); void refresh(); + void show_memory(const json& renderer); void select_output(); void show_layout(); json current_layout() const;