|
|
|
@ -36,84 +36,6 @@ inline pid_t get_current_process_id() { |
|
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<TinyProcessLib::Process> Source::View::prettier_background_process = {}; |
|
|
|
std::unique_ptr<TinyProcessLib::Process> Source::View::prettier_background_process = {}; |
|
|
|
|
|
|
|
|
|
|
|
Glib::RefPtr<Gsv::LanguageManager> Source::LanguageManager::get_default() { |
|
|
|
|
|
|
|
static auto instance = Gsv::LanguageManager::create(); |
|
|
|
|
|
|
|
return instance; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
Glib::RefPtr<Gsv::StyleSchemeManager> Source::StyleSchemeManager::get_default() { |
|
|
|
|
|
|
|
static auto instance = Gsv::StyleSchemeManager::create(); |
|
|
|
|
|
|
|
static bool first = true; |
|
|
|
|
|
|
|
if(first) { |
|
|
|
|
|
|
|
instance->prepend_search_path((Config::get().home_juci_path / "styles").string()); |
|
|
|
|
|
|
|
first = false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return instance; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Glib::RefPtr<Gsv::Language> Source::guess_language(const boost::filesystem::path &file_path) { |
|
|
|
|
|
|
|
auto language_manager = LanguageManager::get_default(); |
|
|
|
|
|
|
|
bool result_uncertain = false; |
|
|
|
|
|
|
|
auto filename = file_path.filename().string(); |
|
|
|
|
|
|
|
auto content_type = Gio::content_type_guess(filename, nullptr, 0, result_uncertain); |
|
|
|
|
|
|
|
if(result_uncertain) |
|
|
|
|
|
|
|
content_type.clear(); |
|
|
|
|
|
|
|
auto language = language_manager->guess_language(filename, content_type); |
|
|
|
|
|
|
|
auto extension = file_path.extension().string(); |
|
|
|
|
|
|
|
if(!language) { |
|
|
|
|
|
|
|
if(filename == "CMakeLists.txt") |
|
|
|
|
|
|
|
language = language_manager->get_language("cmake"); |
|
|
|
|
|
|
|
else if(filename == "meson.build") |
|
|
|
|
|
|
|
language = language_manager->get_language("meson"); |
|
|
|
|
|
|
|
else if(filename == "Makefile") |
|
|
|
|
|
|
|
language = language_manager->get_language("makefile"); |
|
|
|
|
|
|
|
else if(filename == "Jenkinsfile") |
|
|
|
|
|
|
|
language = language_manager->get_language("groovy"); |
|
|
|
|
|
|
|
else if(extension == ".tcc") |
|
|
|
|
|
|
|
language = language_manager->get_language("cpphdr"); |
|
|
|
|
|
|
|
else if(extension == ".ts" || extension == ".tsx" || extension == ".jsx" || extension == ".flow") |
|
|
|
|
|
|
|
language = language_manager->get_language("js"); |
|
|
|
|
|
|
|
else if(extension == ".svelte") |
|
|
|
|
|
|
|
language = language_manager->get_language("html"); |
|
|
|
|
|
|
|
else if(extension == ".vert" || // listed on https://github.com/KhronosGroup/glslang
|
|
|
|
|
|
|
|
extension == ".frag" || |
|
|
|
|
|
|
|
extension == ".tesc" || |
|
|
|
|
|
|
|
extension == ".tese" || |
|
|
|
|
|
|
|
extension == ".geom" || |
|
|
|
|
|
|
|
extension == ".comp") |
|
|
|
|
|
|
|
language = language_manager->get_language("glsl"); |
|
|
|
|
|
|
|
else if(extension == ".in" || extension == ".bak") |
|
|
|
|
|
|
|
return guess_language(boost::filesystem::path(file_path).replace_extension()); |
|
|
|
|
|
|
|
else if(extension == ".mm") |
|
|
|
|
|
|
|
language = language_manager->get_language("objc"); |
|
|
|
|
|
|
|
else if(!file_path.has_extension() && std::any_of(file_path.begin(), file_path.end(), |
|
|
|
|
|
|
|
[](const boost::filesystem::path &path) { return path == "include"; })) |
|
|
|
|
|
|
|
language = language_manager->get_language("cpphdr"); |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
std::ifstream input(file_path.string(), std::ios::binary); |
|
|
|
|
|
|
|
std::string tag(5, '\0'); |
|
|
|
|
|
|
|
if(input && input.read(&tag[0], static_cast<std::streamsize>(tag.size())) && tag == "<?xml") |
|
|
|
|
|
|
|
language = language_manager->get_language("xml"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if(language->get_id() == "cuda") { |
|
|
|
|
|
|
|
if(extension == ".cuh") |
|
|
|
|
|
|
|
language = language_manager->get_language("cpphdr"); |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
language = language_manager->get_language("cpp"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if(language->get_id() == "opencl") |
|
|
|
|
|
|
|
language = language_manager->get_language("cpp"); |
|
|
|
|
|
|
|
else if(language->get_id() == "octave" && extension == ".m") { |
|
|
|
|
|
|
|
// .m is used for both Octave and Objective-C, so try to differentiate
|
|
|
|
|
|
|
|
std::ifstream input(file_path.string(), std::ios::binary); |
|
|
|
|
|
|
|
std::string line; |
|
|
|
|
|
|
|
if(input && std::getline(input, line) && |
|
|
|
|
|
|
|
(starts_with(line, "#import ") || starts_with(line, "@interface ") || starts_with(line, "/*") || starts_with(line, "//"))) |
|
|
|
|
|
|
|
language = language_manager->get_language("objc"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return language; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Source::FixIt::FixIt(std::string source_, std::string path_, std::pair<Offset, Offset> offsets_) : source(std::move(source_)), path(std::move(path_)), offsets(std::move(offsets_)) { |
|
|
|
Source::FixIt::FixIt(std::string source_, std::string path_, std::pair<Offset, Offset> offsets_) : source(std::move(source_)), path(std::move(path_)), offsets(std::move(offsets_)) { |
|
|
|
if(this->source.size() == 0) |
|
|
|
if(this->source.size() == 0) |
|
|
|
type = Type::erase; |
|
|
|
type = Type::erase; |
|
|
|
@ -586,7 +508,7 @@ void Source::View::configure() { |
|
|
|
if(style && style->property_background_set()) |
|
|
|
if(style && style->property_background_set()) |
|
|
|
extra_cursor_selection->property_background() = style->property_background().get_value(); |
|
|
|
extra_cursor_selection->property_background() = style->property_background().get_value(); |
|
|
|
else |
|
|
|
else |
|
|
|
extra_cursor_selection->property_background_rgba() = get_style_context()->get_background_color(Gtk::StateFlags::STATE_FLAG_SELECTED); |
|
|
|
extra_cursor_selection->property_background_rgba() = StyleContext::get_background_color(get_style_context(), Gtk::StateFlags::STATE_FLAG_SELECTED); |
|
|
|
|
|
|
|
|
|
|
|
if(Config::get().menu.keys["source_show_completion"].empty()) { |
|
|
|
if(Config::get().menu.keys["source_show_completion"].empty()) { |
|
|
|
get_completion()->unblock_interactive(); |
|
|
|
get_completion()->unblock_interactive(); |
|
|
|
|