/****************************************************************************** Copyright (C) 2013 by Hugh Bailey This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ******************************************************************************/ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include "window-main.hpp" std::string CurrentTimeString(); std::string CurrentDateTimeString(); std::string GenerateTimeDateFilename(const char *extension, bool noSpace=false); std::string GenerateSpecifiedFilename(const char *extension, bool noSpace, const char *format); QObject *CreateShortcutFilter(); struct BaseLexer { lexer lex; public: inline BaseLexer() {lexer_init(&lex);} inline ~BaseLexer() {lexer_free(&lex);} operator lexer*() {return &lex;} }; class OBSTranslator : public QTranslator { Q_OBJECT public: virtual bool isEmpty() const override {return false;} virtual QString translate(const char *context, const char *sourceText, const char *disambiguation, int n) const override; }; class OBSApp : public QApplication { Q_OBJECT private: std::string locale; std::string theme; ConfigFile globalConfig; TextLookup textLookup; OBSContext obsContext; QPointer mainWindow; profiler_name_store_t *profilerNameStore = nullptr; os_inhibit_t *sleepInhibitor = nullptr; int sleepInhibitRefs = 0; bool enableHotkeysInFocus = true; std::deque translatorHooks; bool UpdatePre22MultiviewLayout(const char *layout); bool InitGlobalConfig(); bool InitGlobalConfigDefaults(); bool InitLocale(); bool InitTheme(); inline void ResetHotkeyState(bool inFocus); QPalette defaultPalette; void ParseExtraThemeData(const char *path); void AddExtraThemeColor(QPalette &pal, int group, const char *name, uint32_t color); public: OBSApp(int &argc, char **argv, profiler_name_store_t *store); ~OBSApp(); void AppInit(); bool OBSInit(); void EnableInFocusHotkeys(bool enable); inline QMainWindow *GetMainWindow() const {return mainWindow.data();} inline config_t *GlobalConfig() const {return globalConfig;} inline const char *GetLocale() const { return locale.c_str(); } inline const char *GetTheme() const {return theme.c_str();} bool SetTheme(std::string name, std::string path = ""); inline lookup_t *GetTextLookup() const {return textLookup;} inline const char *GetString(const char *lookupVal) const { return textLookup.GetString(lookupVal); } bool TranslateString(const char *lookupVal, const char **out) const; profiler_name_store_t *GetProfilerNameStore() const { return profilerNameStore; } const char *GetLastLog() const; const char *GetCurrentLog() const; const char *GetLastCrashLog() const; std::string GetVersionString() const; bool IsPortableMode(); const char *InputAudioSource() const; const char *OutputAudioSource() const; const char *GetRenderModule() const; inline void IncrementSleepInhibition() { if (!sleepInhibitor) return; if (sleepInhibitRefs++ == 0) os_inhibit_sleep_set_active(sleepInhibitor, true); } inline void DecrementSleepInhibition() { if (!sleepInhibitor) return; if (sleepInhibitRefs == 0) return; if (--sleepInhibitRefs == 0) os_inhibit_sleep_set_active(sleepInhibitor, false); } inline void PushUITranslation(obs_frontend_translate_ui_cb cb) { translatorHooks.emplace_front(cb); } inline void PopUITranslation() { translatorHooks.pop_front(); } signals: void StyleChanged(); }; int GetConfigPath(char *path, size_t size, const char *name); char *GetConfigPathPtr(const char *name); int GetProgramDataPath(char *path, size_t size, const char *name); char *GetProgramDataPathPtr(const char *name); inline OBSApp *App() {return static_cast(qApp);} inline config_t *GetGlobalConfig() {return App()->GlobalConfig();} std::vector> GetLocaleNames(); inline const char *Str(const char *lookup) {return App()->GetString(lookup);} #define QTStr(lookupVal) QString::fromUtf8(Str(lookupVal)) bool GetFileSafeName(const char *name, std::string &file); bool GetClosestUnusedFileName(std::string &path, const char *extension); bool WindowPositionValid(QRect rect); static inline int GetProfilePath(char *path, size_t size, const char *file) { OBSMainWindow *window = reinterpret_cast( App()->GetMainWindow()); return window->GetProfilePath(path, size, file); } extern bool portable_mode; extern bool remuxAfterRecord; extern std::string remuxFilename; extern bool opt_start_streaming; extern bool opt_start_recording; extern bool opt_start_replaybuffer; extern bool opt_minimize_tray; extern bool opt_studio_mode; extern bool opt_allow_opengl; extern bool opt_always_on_top; extern std::string opt_starting_scene;