#include "../include/Window.hpp" #include #include #include #ifndef NDEBUG #include #endif // TODO: When creating a room, immediately switch to it. // TODO: When changing nickname or avatar, do not merge next message with previous one even if next message is sent right after the previous one. // We want to see user changes immediately. static int setWindowCss(dchat::Window &window, Glib::RefPtr css) { auto ctx = window.get_style_context(); auto screen = Gdk::Screen::get_default(); ctx->remove_provider_for_screen(screen, css); try { if(!css->load_from_path("css/style.css")) { fprintf(stderr, "Failed to load css/style.css"); return 1; } } catch(Gtk::CssProviderError &e) { fprintf(stderr, "Failed to load css/style.css, error: %s\n", e.what().c_str()); return 1; } ctx->add_provider_for_screen(screen, css, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); return 0; } int main (int argc, char *argv[]) { char *nativeStyle = std::getenv("NATIVE_STYLE"); bool useNativeStyle = nativeStyle && strcmp(nativeStyle, "1") == 0; auto app = Gtk::Application::create(argc, argv, "dec05eba.dchat", Gio::APPLICATION_NON_UNIQUE); auto css = Gtk::CssProvider::create(); dchat::Window window; if(!useNativeStyle) { if(setWindowCss(window, css) != 0) return 1; #ifndef NDEBUG auto cssFile = Gio::File::create_for_path("css/style.css"); auto cssFileMonitor = cssFile->monitor_file(); cssFileMonitor->signal_changed().connect([&window, css](const Glib::RefPtr &file, const Glib::RefPtr &otherFile, Gio::FileMonitorEvent event) { fprintf(stderr, "Css file modified, reloading\n"); setWindowCss(window, css); }); #endif } return app->run(window); }