obs-studio/obs/platform-osx.mm

151 lines
3.6 KiB
Plaintext
Raw Normal View History

/******************************************************************************
Copyright (C) 2013 by Hugh Bailey <obs.jim@gmail.com>
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 <http://www.gnu.org/licenses/>.
******************************************************************************/
#include <sstream>
#include <util/base.h>
#include <obs-config.h>
#include "platform.hpp"
#include "obs-app.hpp"
#include <unistd.h>
2013-12-16 07:04:51 -08:00
#import <AppKit/AppKit.h>
using namespace std;
bool GetDataFilePath(const char *data, string &output)
{
stringstream str;
str << OBS_DATA_PATH "/obs-studio/" << data;
output = str.str();
return !access(output.c_str(), R_OK);
}
void GetMonitors(vector<MonitorInfo> &monitors)
{
monitors.clear();
2013-12-16 07:04:51 -08:00
for(NSScreen *screen : [NSScreen screens])
{
NSRect frame = [screen convertRectToBacking:[screen frame]];
monitors.emplace_back(frame.origin.x, frame.origin.y,
frame.size.width, frame.size.height);
}
}
bool InitApplicationBundle()
{
#ifdef OBS_OSX_BUNDLE
static bool initialized = false;
if (initialized)
return true;
try {
NSBundle *bundle = [NSBundle mainBundle];
if (!bundle)
throw "Could not find main bundle";
NSString *exe_path = [bundle executablePath];
if (!exe_path)
throw "Could not find executable path";
NSString *path = [exe_path stringByDeletingLastPathComponent];
if (chdir([path fileSystemRepresentation]))
throw "Could not change working directory to "
"bundle path";
} catch (const char* error) {
blog(LOG_ERROR, "InitBundle: %s", error);
return false;
}
return initialized = true;
#else
return true;
#endif
}
string GetDefaultVideoSavePath()
{
2014-07-10 13:00:18 -07:00
NSFileManager *fm = [NSFileManager defaultManager];
NSURL *url = [fm URLForDirectory:NSMoviesDirectory
inDomain:NSUserDomainMask
appropriateForURL:nil
create:true
error:nil];
if (!url)
return getenv("HOME");
2014-07-11 14:27:37 -07:00
return url.path.fileSystemRepresentation;
}
vector<string> GetPreferredLocales()
{
NSArray *preferred = [NSLocale preferredLanguages];
auto locales = GetLocaleNames();
auto lang_to_locale = [&locales](string lang) -> string {
string lang_match = "";
for (const auto &locale : locales) {
if (locale.first == lang.substr(0, locale.first.size()))
return locale.first;
if (!lang_match.size() &&
locale.first.substr(0, 2) == lang.substr(0, 2))
lang_match = locale.first;
}
return lang_match;
};
vector<string> result;
result.reserve(preferred.count);
for (NSString *lang in preferred) {
string locale = lang_to_locale(lang.UTF8String);
if (!locale.size())
continue;
if (find(begin(result), end(result), locale) != end(result))
continue;
result.emplace_back(locale);
}
return result;
}
bool IsAlwaysOnTop(QMainWindow *window)
{
return (window->windowFlags() & Qt::WindowStaysOnTopHint) != 0;
}
void SetAlwaysOnTop(QMainWindow *window, bool enable)
{
Qt::WindowFlags flags = window->windowFlags();
if (enable)
flags |= Qt::WindowStaysOnTopHint;
else
flags &= ~Qt::WindowStaysOnTopHint;
window->setWindowFlags(flags);
window->show();
}