Skip to content

Commit 9603125

Browse files
committed
start/stop/restart actions for service
1 parent 53e622e commit 9603125

File tree

8 files changed

+141
-53
lines changed

8 files changed

+141
-53
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "streamrs"
3-
version = "0.6.0"
3+
version = "0.6.1"
44
edition = "2024"
55
license = "MIT"
66

po/en.po

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
msgid ""
22
msgstr ""
33
"Project-Id-Version: streamrs\n"
4-
"POT-Creation-Date: 2026-03-13 17:53+0000\n"
4+
"POT-Creation-Date: 2026-03-13 18:49+0000\n"
55
"PO-Revision-Date: 2026-03-13 17:11+0000\n"
66
"Last-Translator: Ēriks Remess <eriks@remess.lv>\n"
77
"Language-Team: English\n"
@@ -139,19 +139,16 @@ msgid "Failed to signal streamrs daemon ({systemctl_err}; {pkill_err})"
139139
msgstr "Failed to signal streamrs daemon ({systemctl_err}; {pkill_err})"
140140

141141
#: src/gui/core/config_io.rs
142-
#, fuzzy
143142
msgid "Failed to start streamrs daemon (systemctl exit status {status})"
144-
msgstr "Failed to signal streamrs daemon ({systemctl_err}; {pkill_err})"
143+
msgstr "Failed to start streamrs daemon (systemctl exit status {status})"
145144

146145
#: src/gui/core/config_io.rs
147-
#, fuzzy
148146
msgid "Failed to start streamrs daemon (systemctl failed: {err})"
149-
msgstr "Failed to signal streamrs daemon ({systemctl_err}; {pkill_err})"
147+
msgstr "Failed to start streamrs daemon (systemctl failed: {err})"
150148

151149
#: src/gui/core/config_io.rs
152-
#, fuzzy
153150
msgid "Failed to stop streamrs daemon ({systemctl_err}; {pkill_err})"
154-
msgstr "Failed to signal streamrs daemon ({systemctl_err}; {pkill_err})"
151+
msgstr "Failed to stop streamrs daemon ({systemctl_err}; {pkill_err})"
155152

156153
#: src/gui/main.rs
157154
msgid "Failed to write GUI lock '{path}': {err}"
@@ -309,6 +306,14 @@ msgstr "Reserved for page navigation in streamrs"
309306
msgid "Reserved slot"
310307
msgstr "Reserved slot"
311308

309+
#: src/gui/ui.rs
310+
msgid "Restart"
311+
msgstr "Restart"
312+
313+
#: src/gui/ui.rs
314+
msgid "Restarted streamrs daemon"
315+
msgstr "Restarted streamrs daemon"
316+
312317
#: src/gui/ui.rs
313318
msgid "Save"
314319
msgstr "Save"
@@ -330,12 +335,12 @@ msgid "Select icon..."
330335
msgstr "Select icon..."
331336

332337
#: src/gui/ui.rs
333-
msgid "Start streamrs daemon"
334-
msgstr ""
338+
msgid "Start"
339+
msgstr "Start"
335340

336341
#: src/gui/ui.rs
337342
msgid "Started streamrs daemon"
338-
msgstr ""
343+
msgstr "Started streamrs daemon"
339344

340345
#: src/gui/ui.rs
341346
msgid "Status"
@@ -358,12 +363,12 @@ msgid "Status-on icon updated"
358363
msgstr "Status-on icon updated"
359364

360365
#: src/gui/ui.rs
361-
msgid "Stop streamrs daemon"
362-
msgstr ""
366+
msgid "Stop"
367+
msgstr "Stop"
363368

364369
#: src/gui/ui.rs
365370
msgid "Stopped streamrs daemon"
366-
msgstr ""
371+
msgstr "Stopped streamrs daemon"
367372

368373
#: src/gui/ui.rs
369374
msgid "Stream Deck preview"
@@ -385,6 +390,10 @@ msgstr "pkill exit status {status}"
385390
msgid "pkill failed: {err}"
386391
msgstr "pkill failed: {err}"
387392

393+
#: src/gui/ui.rs
394+
msgid "streamrs service"
395+
msgstr "streamrs service"
396+
388397
#: src/gui/core/config_io.rs
389398
msgid "systemctl exit status {status}"
390399
msgstr "systemctl exit status {status}"

po/lv.po

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
msgid ""
22
msgstr ""
33
"Project-Id-Version: streamrs\n"
4-
"POT-Creation-Date: 2026-03-13 17:53+0000\n"
4+
"POT-Creation-Date: 2026-03-13 18:49+0000\n"
55
"PO-Revision-Date: 2026-03-13 18:05+0000\n"
66
"Last-Translator: Ēriks Remess <eriks@remess.lv>\n"
77
"Language-Team: Latvian\n"
@@ -309,6 +309,14 @@ msgstr "Rezervēts lapu navigācijai streamrs"
309309
msgid "Reserved slot"
310310
msgstr "Rezervēta vieta"
311311

312+
#: src/gui/ui.rs
313+
msgid "Restart"
314+
msgstr "Pārstartēt"
315+
316+
#: src/gui/ui.rs
317+
msgid "Restarted streamrs daemon"
318+
msgstr "Streamrs dēmons pārstartēts"
319+
312320
#: src/gui/ui.rs
313321
msgid "Save"
314322
msgstr "Saglabāt"
@@ -330,8 +338,8 @@ msgid "Select icon..."
330338
msgstr "Izvēlieties ikonu..."
331339

332340
#: src/gui/ui.rs
333-
msgid "Start streamrs daemon"
334-
msgstr "Palaist streamrs dēmonu"
341+
msgid "Start"
342+
msgstr "Palaist"
335343

336344
#: src/gui/ui.rs
337345
msgid "Started streamrs daemon"
@@ -358,8 +366,8 @@ msgid "Status-on icon updated"
358366
msgstr "Ieslēgta statusa ikona atjaunināta"
359367

360368
#: src/gui/ui.rs
361-
msgid "Stop streamrs daemon"
362-
msgstr "Apturēt streamrs dēmonu"
369+
msgid "Stop"
370+
msgstr "Apturēt"
363371

364372
#: src/gui/ui.rs
365373
msgid "Stopped streamrs daemon"
@@ -385,6 +393,10 @@ msgstr "pkill izejas statuss {status}"
385393
msgid "pkill failed: {err}"
386394
msgstr "pkill neizdevās: {err}"
387395

396+
#: src/gui/ui.rs
397+
msgid "streamrs service"
398+
msgstr "streamrs serviss"
399+
388400
#: src/gui/core/config_io.rs
389401
msgid "systemctl exit status {status}"
390402
msgstr "systemctl izejas statuss {status}"

po/streamrs.pot

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
msgid ""
22
msgstr ""
33
"Project-Id-Version: streamrs\n"
4-
"POT-Creation-Date: 2026-03-13 17:53+0000\n"
4+
"POT-Creation-Date: 2026-03-13 18:50+0000\n"
55
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
66
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
77
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -312,6 +312,14 @@ msgstr ""
312312
msgid "Reserved slot"
313313
msgstr ""
314314

315+
#: src/gui/ui.rs
316+
msgid "Restart"
317+
msgstr ""
318+
319+
#: src/gui/ui.rs
320+
msgid "Restarted streamrs daemon"
321+
msgstr ""
322+
315323
#: src/gui/ui.rs
316324
msgid "Save"
317325
msgstr ""
@@ -333,7 +341,7 @@ msgid "Select icon..."
333341
msgstr ""
334342

335343
#: src/gui/ui.rs
336-
msgid "Start streamrs daemon"
344+
msgid "Start"
337345
msgstr ""
338346

339347
#: src/gui/ui.rs
@@ -361,7 +369,7 @@ msgid "Status-on icon updated"
361369
msgstr ""
362370

363371
#: src/gui/ui.rs
364-
msgid "Stop streamrs daemon"
372+
msgid "Stop"
365373
msgstr ""
366374

367375
#: src/gui/ui.rs
@@ -388,6 +396,10 @@ msgstr ""
388396
msgid "pkill failed: {err}"
389397
msgstr ""
390398

399+
#: src/gui/ui.rs
400+
msgid "streamrs service"
401+
msgstr ""
402+
391403
#: src/gui/core/config_io.rs
392404
msgid "systemctl exit status {status}"
393405
msgstr ""

src/gui/core/config_io.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,13 @@ pub(crate) fn set_daemon_running(should_run: bool) -> Result<(), String> {
133133
))
134134
}
135135

136+
pub(crate) fn restart_daemon() -> Result<(), String> {
137+
if daemon_running() {
138+
set_daemon_running(false)?;
139+
}
140+
set_daemon_running(true)
141+
}
142+
136143
pub(crate) fn profile_slug_from_input(raw: &str) -> Option<String> {
137144
profile_slug_from_input_generic(raw)
138145
}

src/gui/ui.rs

Lines changed: 75 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,25 @@ fn present_about_dialog(parent: &ApplicationWindow) {
6969

7070
fn rebuild_window_menu(menu: &gtk::gio::Menu) {
7171
menu.remove_all();
72-
let daemon_label = if daemon_running() {
73-
tr("Stop streamrs daemon")
74-
} else {
75-
tr("Start streamrs daemon")
76-
};
77-
menu.append(Some(&daemon_label), Some("win.toggle-daemon"));
78-
menu.append(Some(&tr("About streamrs")), Some("win.show-about"));
72+
73+
let daemon_section = gtk::gio::Menu::new();
74+
daemon_section.append(Some(&tr("Start")), Some("win.start-daemon"));
75+
daemon_section.append(Some(&tr("Stop")), Some("win.stop-daemon"));
76+
daemon_section.append(Some(&tr("Restart")), Some("win.restart-daemon"));
77+
menu.append_section(Some(&tr("streamrs service")), &daemon_section);
78+
79+
let app_section = gtk::gio::Menu::new();
80+
app_section.append(Some(&tr("About streamrs")), Some("win.show-about"));
81+
menu.append_section(None, &app_section);
82+
}
83+
84+
fn sync_daemon_actions(
85+
start_action: &gtk::gio::SimpleAction,
86+
stop_action: &gtk::gio::SimpleAction,
87+
) {
88+
let running = daemon_running();
89+
start_action.set_enabled(!running);
90+
stop_action.set_enabled(running);
7991
}
8092

8193
pub(crate) fn build_ui(app: &Application) {
@@ -499,12 +511,6 @@ pub(crate) fn build_ui(app: &Application) {
499511
menu_button.set_tooltip_text(Some(&tr("Menu")));
500512
menu_button.set_menu_model(Some(&window_menu));
501513
menu_button.add_css_class("flat");
502-
{
503-
let window_menu_for_open = window_menu.clone();
504-
menu_button.set_create_popup_func(move |_| {
505-
rebuild_window_menu(&window_menu_for_open);
506-
});
507-
}
508514

509515
let about_action = gtk::gio::SimpleAction::new("show-about", None);
510516
{
@@ -515,27 +521,67 @@ pub(crate) fn build_ui(app: &Application) {
515521
}
516522
window.add_action(&about_action);
517523

518-
let daemon_action = gtk::gio::SimpleAction::new("toggle-daemon", None);
524+
let start_daemon_action = gtk::gio::SimpleAction::new("start-daemon", None);
525+
let stop_daemon_action = gtk::gio::SimpleAction::new("stop-daemon", None);
526+
let restart_daemon_action = gtk::gio::SimpleAction::new("restart-daemon", None);
527+
sync_daemon_actions(&start_daemon_action, &stop_daemon_action);
528+
{
529+
let start_daemon_action_for_open = start_daemon_action.clone();
530+
let stop_daemon_action_for_open = stop_daemon_action.clone();
531+
menu_button.connect_notify_local(Some("active"), move |button, _| {
532+
if button.property::<bool>("active") {
533+
sync_daemon_actions(&start_daemon_action_for_open, &stop_daemon_action_for_open);
534+
}
535+
});
536+
}
537+
{
538+
let status_line_for_start = status_line.clone();
539+
let start_daemon_action_for_start = start_daemon_action.clone();
540+
let stop_daemon_action_for_start = stop_daemon_action.clone();
541+
start_daemon_action.connect_activate(move |_, _| {
542+
let message = match set_daemon_running(true) {
543+
Ok(()) => tr("Started streamrs daemon"),
544+
Err(err) => err,
545+
};
546+
status_line_for_start.set_text(&message);
547+
sync_daemon_actions(
548+
&start_daemon_action_for_start,
549+
&stop_daemon_action_for_start,
550+
);
551+
});
552+
}
553+
{
554+
let status_line_for_stop = status_line.clone();
555+
let start_daemon_action_for_stop = start_daemon_action.clone();
556+
let stop_daemon_action_for_stop = stop_daemon_action.clone();
557+
stop_daemon_action.connect_activate(move |_, _| {
558+
let message = match set_daemon_running(false) {
559+
Ok(()) => tr("Stopped streamrs daemon"),
560+
Err(err) => err,
561+
};
562+
status_line_for_stop.set_text(&message);
563+
sync_daemon_actions(&start_daemon_action_for_stop, &stop_daemon_action_for_stop);
564+
});
565+
}
519566
{
520-
let status_line_for_daemon = status_line.clone();
521-
let window_menu_for_daemon = window_menu.clone();
522-
daemon_action.connect_activate(move |_, _| {
523-
let should_run = !daemon_running();
524-
let message = match set_daemon_running(should_run) {
525-
Ok(()) => {
526-
if should_run {
527-
tr("Started streamrs daemon")
528-
} else {
529-
tr("Stopped streamrs daemon")
530-
}
531-
}
567+
let status_line_for_restart = status_line.clone();
568+
let start_daemon_action_for_restart = start_daemon_action.clone();
569+
let stop_daemon_action_for_restart = stop_daemon_action.clone();
570+
restart_daemon_action.connect_activate(move |_, _| {
571+
let message = match restart_daemon() {
572+
Ok(()) => tr("Restarted streamrs daemon"),
532573
Err(err) => err,
533574
};
534-
status_line_for_daemon.set_text(&message);
535-
rebuild_window_menu(&window_menu_for_daemon);
575+
status_line_for_restart.set_text(&message);
576+
sync_daemon_actions(
577+
&start_daemon_action_for_restart,
578+
&stop_daemon_action_for_restart,
579+
);
536580
});
537581
}
538-
window.add_action(&daemon_action);
582+
window.add_action(&start_daemon_action);
583+
window.add_action(&stop_daemon_action);
584+
window.add_action(&restart_daemon_action);
539585

540586
let title_row = GtkBox::new(Orientation::Horizontal, UI_SPACING_HORIZONTAL);
541587
title_row.set_halign(Align::Start);

src/gui/ui/signals/primary_actions.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,9 @@ pub(crate) fn wire_primary_action_signals(
9999
eprintln!("{err}");
100100
}
101101
key_index
102-
.map(|index| trf("Saved {ordinal} button", &[("ordinal", tr_ordinal(index))]))
102+
.map(|index| {
103+
trf("Saved {ordinal} button", &[("ordinal", tr_ordinal(index))])
104+
})
103105
.unwrap_or_else(|| tr("Saved changes"))
104106
}
105107
Err(err) => trf("Save failed: {err}", &[("err", err)]),

0 commit comments

Comments
 (0)