diff --git a/Applications/Clock/main.cpp b/Applications/Clock/main.cpp index 98593d190550fc..49f25a892cb681 100644 --- a/Applications/Clock/main.cpp +++ b/Applications/Clock/main.cpp @@ -1,10 +1,10 @@ -#include +#include #include #include "ClockWidget.h" -int main(int, char**) +int main(int argc, char** argv) { - GEventLoop loop; + GApplication app(argc, argv); auto* window = new GWindow; window->set_title("Clock"); @@ -16,7 +16,7 @@ int main(int, char**) window->set_main_widget(clock_widget); window->show(); - return loop.exec(); + return app.exec(); } diff --git a/Applications/FileManager/main.cpp b/Applications/FileManager/main.cpp index 2bf781fccbb9f7..a648712d5d1f6d 100644 --- a/Applications/FileManager/main.cpp +++ b/Applications/FileManager/main.cpp @@ -1,7 +1,7 @@ #include #include #include -#include +#include #include #include #include @@ -9,15 +9,15 @@ static GWindow* make_window(); -int main(int, char**) +int main(int argc, char** argv) { - GEventLoop loop; + GApplication app(argc, argv); auto* window = make_window(); window->set_should_exit_app_on_close(true); window->show(); - return loop.exec(); + return app.exec(); } GWindow* make_window() diff --git a/Applications/FontEditor/main.cpp b/Applications/FontEditor/main.cpp index 99d71aa1323193..d9bb835ccabc26 100644 --- a/Applications/FontEditor/main.cpp +++ b/Applications/FontEditor/main.cpp @@ -1,10 +1,12 @@ #include "FontEditor.h" -#include +#include #include #include int main(int argc, char** argv) { + GApplication app(argc, argv); + RetainPtr edited_font; String path; @@ -22,7 +24,6 @@ int main(int argc, char** argv) else edited_font = Font::default_font().clone(); - GEventLoop loop; auto* window = new GWindow; window->set_title("FontEditor"); window->set_rect({ 50, 50, 420, 200 }); @@ -31,5 +32,5 @@ int main(int argc, char** argv) window->set_main_widget(font_editor); window->set_should_exit_app_on_close(true); window->show(); - return loop.exec(); + return app.exec(); } diff --git a/Applications/Launcher/main.cpp b/Applications/Launcher/main.cpp index bde330305529d2..9236ba28a2ee98 100644 --- a/Applications/Launcher/main.cpp +++ b/Applications/Launcher/main.cpp @@ -2,7 +2,7 @@ #include #include #include -#include +#include #include #include #include @@ -19,17 +19,17 @@ void handle_sigchld(int) ASSERT(pid > 0); } -int main(int, char**) +int main(int argc, char** argv) { - signal(SIGCHLD, handle_sigchld); + GApplication app(argc, argv); - GEventLoop loop; + signal(SIGCHLD, handle_sigchld); auto* launcher_window = make_launcher_window(); launcher_window->set_should_exit_app_on_close(true); launcher_window->show(); - return loop.exec(); + return app.exec(); } class LauncherButton final : public GButton { diff --git a/Applications/Terminal/main.cpp b/Applications/Terminal/main.cpp index 9de32b14c5da96..215295efae6683 100644 --- a/Applications/Terminal/main.cpp +++ b/Applications/Terminal/main.cpp @@ -10,7 +10,7 @@ #include #include "Terminal.h" #include -#include +#include #include #include #include @@ -53,8 +53,10 @@ static void make_shell(int ptm_fd) } } -int main(int, char**) +int main(int argc, char** argv) { + GApplication app(argc, argv); + int ptm_fd = open("/dev/ptmx", O_RDWR); if (ptm_fd < 0) { perror("open(ptmx)"); @@ -63,8 +65,6 @@ int main(int, char**) make_shell(ptm_fd); - GEventLoop loop; - auto* window = new GWindow; window->set_should_exit_app_on_close(true); @@ -80,12 +80,12 @@ int main(int, char**) if (nread < 0) { dbgprintf("Terminal read error: %s\n", strerror(errno)); perror("read(ptm)"); - GEventLoop::main().exit(1); + GApplication::the().exit(1); return; } if (nread == 0) { dbgprintf("Terminal: EOF on master pty, closing.\n"); - GEventLoop::main().exit(0); + GApplication::the().exit(0); return; } for (ssize_t i = 0; i < nread; ++i) @@ -95,84 +95,5 @@ int main(int, char**) window->show(); - return loop.exec(); - -#if 0 - for (;;) { - fd_set rfds; - FD_ZERO(&rfds); - FD_SET(ptm_fd, &rfds); - FD_SET(event_fd, &rfds); - int nfds = select(max(ptm_fd, event_fd) + 1, &rfds, nullptr, nullptr, nullptr); - if (nfds < 0) { - dbgprintf("Terminal(%u) select() failed :( errno=%d\n", getpid(), errno); - return 1; - } - - if (FD_ISSET(ptm_fd, &rfds)) { - byte buffer[4096]; - ssize_t nread = read(ptm_fd, buffer, sizeof(buffer)); - if (nread < 0) { - dbgprintf("Terminal read error: %s\n", strerror(errno)); - perror("read(ptm)"); - continue; - } - if (nread == 0) { - dbgprintf("Terminal: EOF on master pty, closing.\n"); - break; - } - for (ssize_t i = 0; i < nread; ++i) - terminal.on_char(buffer[i]); - terminal.update(); - } - - if (FD_ISSET(event_fd, &rfds)) { - GUI_Event event; - ssize_t nread = read(event_fd, &event, sizeof(event)); - if (nread < 0) { - perror("read(event)"); - return 1; - } - - assert(nread != 0); - assert(nread == sizeof(event)); - - if (event.type == GUI_Event::Type::Paint) { - terminal.update(); - } else if (event.type == GUI_Event::Type::KeyDown) { - char ch = event.key.character; - if (event.key.ctrl) { - if (ch >= 'a' && ch <= 'z') { - ch = ch - 'a' + 1; - } else if (ch == '\\') { - ch = 0x1c; - } - } - switch (event.key.key) { - case KeyCode::Key_Up: - write(ptm_fd, "\033[A", 3); - break; - case KeyCode::Key_Down: - write(ptm_fd, "\033[B", 3); - break; - case KeyCode::Key_Right: - write(ptm_fd, "\033[C", 3); - break; - case KeyCode::Key_Left: - write(ptm_fd, "\033[D", 3); - break; - default: - write(ptm_fd, &ch, 1); - } - } else if (event.type == GUI_Event::Type::WindowActivated) { - terminal.set_in_active_window(true); - } else if (event.type == GUI_Event::Type::WindowDeactivated) { - terminal.set_in_active_window(false); - } else if (event.type == GUI_Event::Type::WindowCloseRequest) { - return 0; - } - } - } -#endif - return 0; + return app.exec(); } diff --git a/LibGUI/GApplication.cpp b/LibGUI/GApplication.cpp index 5e5e786d8d6d0b..7054cd050aaa7c 100644 --- a/LibGUI/GApplication.cpp +++ b/LibGUI/GApplication.cpp @@ -2,8 +2,18 @@ #include #include +static GApplication* s_the; + +GApplication& GApplication::the() +{ + ASSERT(s_the); + return *s_the; +} + GApplication::GApplication(int argc, char** argv) { + ASSERT(!s_the); + s_the = this; m_event_loop = make(); } @@ -16,6 +26,11 @@ int GApplication::exec() return m_event_loop->exec(); } +void GApplication::exit(int exit_code) +{ + m_event_loop->exit(exit_code); +} + void GApplication::set_menubar(OwnPtr&& menubar) { m_menubar = move(menubar); diff --git a/LibGUI/GApplication.h b/LibGUI/GApplication.h index eff2c11e222796..0a139b2cd26971 100644 --- a/LibGUI/GApplication.h +++ b/LibGUI/GApplication.h @@ -7,9 +7,12 @@ class GMenuBar; class GApplication { public: + static GApplication& the(); GApplication(int argc, char** argv); + ~GApplication(); int exec(); + void exit(int); void set_menubar(OwnPtr&&); diff --git a/LibGUI/GStyle.cpp b/LibGUI/GStyle.cpp index ea20e708c70bb4..a0ab4e94725c18 100644 --- a/LibGUI/GStyle.cpp +++ b/LibGUI/GStyle.cpp @@ -1,7 +1,7 @@ #include #include -GStyle* s_the; +static GStyle* s_the; GStyle& GStyle::the() { diff --git a/LibGUI/Makefile b/LibGUI/Makefile index e9e2f3283e9d71..928a91dc5a2434 100644 --- a/LibGUI/Makefile +++ b/LibGUI/Makefile @@ -24,6 +24,7 @@ LIBGUI_OBJS = \ GMenuBar.o \ GMenu.o \ GMenuItem.o \ + GApplication.o \ GWindow.o OBJS = $(SHAREDGRAPHICS_OBJS) $(LIBGUI_OBJS) diff --git a/Userland/guitest2.cpp b/Userland/guitest2.cpp index 45e7759df31c5a..7c9154708f2fb9 100644 --- a/Userland/guitest2.cpp +++ b/Userland/guitest2.cpp @@ -13,9 +13,9 @@ #include #include #include -#include #include #include +#include #include static GWindow* make_font_test_window(); @@ -31,9 +31,10 @@ void handle_sigchld(int) int main(int argc, char** argv) { + GApplication app(argc, argv); + signal(SIGCHLD, handle_sigchld); - GEventLoop loop; #if 0 auto* font_test_window = make_font_test_window(); font_test_window->show(); @@ -43,7 +44,7 @@ int main(int argc, char** argv) launcher_window->set_should_exit_app_on_close(true); launcher_window->show(); - return loop.exec(); + return app.exec(); } GWindow* make_font_test_window()