Selaa lähdekoodia

Userland: Invoke tzset in applications that care about time zones

In most applications, we invoke tzset once at startup for now. Most of
these are short lived and don't need to know about time zone changes.

The exception is the ClockWidget in the taskbar. Here, we invoke tzset
each time we update the system time. This way, any time zone changes can
take effect immediately.
Timothy Flynn 3 vuotta sitten
vanhempi
commit
ede5c9548e

+ 3 - 0
Userland/Applications/AnalogClock/main.cpp

@@ -14,6 +14,7 @@
 #include <LibGUI/Menubar.h>
 #include <LibGUI/Window.h>
 #include <LibMain/Main.h>
+#include <time.h>
 
 ErrorOr<int> serenity_main(Main::Arguments arguments)
 {
@@ -24,6 +25,8 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
     TRY(Core::System::unveil("/res", "r"));
     TRY(Core::System::unveil(nullptr, nullptr));
 
+    tzset();
+
     auto app_icon = TRY(GUI::Icon::try_create_default_icon("app-analog-clock"));
     auto window = TRY(GUI::Window::try_create());
     window->set_title(Core::DateTime::now().to_string("%Y-%m-%d"));

+ 3 - 0
Userland/Applications/Browser/main.cpp

@@ -21,6 +21,7 @@
 #include <LibGUI/Icon.h>
 #include <LibGUI/TabWidget.h>
 #include <LibMain/Main.h>
+#include <time.h>
 #include <unistd.h>
 
 namespace Browser {
@@ -82,6 +83,8 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
     TRY(Core::System::unveil("/tmp/portal/request", "rw"));
     TRY(Core::System::unveil(nullptr, nullptr));
 
+    tzset();
+
     auto app_icon = GUI::Icon::default_icon("app-browser");
 
     Browser::g_home_url = Config::read_string("Browser", "Preferences", "Home", "file:///res/html/misc/welcome.html");

+ 3 - 0
Userland/Applications/Calendar/main.cpp

@@ -19,6 +19,7 @@
 #include <LibGUI/Toolbar.h>
 #include <LibGUI/Window.h>
 #include <LibMain/Main.h>
+#include <time.h>
 
 ErrorOr<int> serenity_main(Main::Arguments arguments)
 {
@@ -31,6 +32,8 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
     TRY(Core::System::unveil("/res", "r"));
     TRY(Core::System::unveil(nullptr, nullptr));
 
+    tzset();
+
     auto app_icon = TRY(GUI::Icon::try_create_default_icon("app-calendar"));
     auto window = TRY(GUI::Window::try_create());
     window->set_title("Calendar");

+ 3 - 0
Userland/Services/RequestServer/main.cpp

@@ -16,6 +16,7 @@
 #include <RequestServer/HttpProtocol.h>
 #include <RequestServer/HttpsProtocol.h>
 #include <signal.h>
+#include <time.h>
 
 ErrorOr<int> serenity_main(Main::Arguments)
 {
@@ -32,6 +33,8 @@ ErrorOr<int> serenity_main(Main::Arguments)
     TRY(Core::System::unveil("/etc/timezone", "r"));
     TRY(Core::System::unveil(nullptr, nullptr));
 
+    tzset();
+
     [[maybe_unused]] auto gemini = make<RequestServer::GeminiProtocol>();
     [[maybe_unused]] auto http = make<RequestServer::HttpProtocol>();
     [[maybe_unused]] auto https = make<RequestServer::HttpsProtocol>();

+ 5 - 1
Userland/Services/Taskbar/ClockWidget.h

@@ -30,7 +30,11 @@ private:
     virtual void paint_event(GUI::PaintEvent&) override;
     virtual void mousedown_event(GUI::MouseEvent&) override;
 
-    void tick_clock() { update(); }
+    void tick_clock()
+    {
+        tzset();
+        update();
+    }
 
     void open();
     void close();

+ 3 - 0
Userland/Services/WebContent/main.cpp

@@ -10,6 +10,7 @@
 #include <LibIPC/SingleServer.h>
 #include <LibMain/Main.h>
 #include <WebContent/ClientConnection.h>
+#include <time.h>
 
 ErrorOr<int> serenity_main(Main::Arguments)
 {
@@ -22,6 +23,8 @@ ErrorOr<int> serenity_main(Main::Arguments)
     TRY(Core::System::unveil("/tmp/portal/websocket", "rw"));
     TRY(Core::System::unveil(nullptr, nullptr));
 
+    tzset();
+
     auto client = TRY(IPC::take_over_accepted_client_from_system_server<WebContent::ClientConnection>());
     return event_loop.exec();
 }

+ 2 - 0
Userland/Utilities/date.cpp

@@ -29,6 +29,8 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
     args_parser.add_option(print_rfc_5322, "Print date in RFC 5322 format", "rfc-5322", 'R');
     args_parser.parse(arguments);
 
+    tzset();
+
     if (set_date != nullptr) {
         auto number = String(set_date).to_uint();
 

+ 3 - 0
Userland/Utilities/ddate.cpp

@@ -8,6 +8,7 @@
 #include <LibCore/DateTime.h>
 #include <LibCore/System.h>
 #include <LibMain/Main.h>
+#include <time.h>
 #include <unistd.h>
 
 class DiscordianDate {
@@ -104,6 +105,8 @@ ErrorOr<int> serenity_main(Main::Arguments)
 {
     TRY(Core::System::pledge("stdio rpath"));
 
+    tzset();
+
     auto date = Core::DateTime::now();
     outln("Today is {}", DiscordianDate(date).to_string());
 

+ 3 - 0
Userland/Utilities/fortune.cpp

@@ -17,6 +17,7 @@
 #include <LibMain/Main.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <time.h>
 #include <unistd.h>
 
 class Quote {
@@ -87,6 +88,8 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
     TRY(Core::System::unveil("/etc/timezone", "r"));
     TRY(Core::System::unveil(nullptr, nullptr));
 
+    tzset();
+
     auto file_contents = file->read_all();
     auto json = TRY(JsonValue::from_string(file_contents));
     if (!json.is_array()) {

+ 3 - 0
Userland/Utilities/js.cpp

@@ -68,6 +68,7 @@
 #include <fcntl.h>
 #include <signal.h>
 #include <stdio.h>
+#include <time.h>
 #include <unistd.h>
 
 RefPtr<JS::VM> vm;
@@ -1287,6 +1288,8 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
     args_parser.add_positional_argument(script_paths, "Path to script files", "scripts", Core::ArgsParser::Required::No);
     args_parser.parse(arguments);
 
+    tzset();
+
     bool syntax_highlight = !disable_syntax_highlight;
 
     vm = JS::VM::create();

+ 2 - 0
Userland/Utilities/w.cpp

@@ -25,6 +25,8 @@ ErrorOr<int> serenity_main(Main::Arguments)
     TRY(Core::System::unveil("/proc", "r"));
     TRY(Core::System::unveil(nullptr, nullptr));
 
+    tzset();
+
     auto file = TRY(Core::File::open("/var/run/utmp", Core::OpenMode::ReadOnly));
     auto json = TRY(JsonValue::from_string(file->read_all()));
     if (!json.is_object()) {