diff --git a/src/source.cpp b/src/source.cpp index 87f2e04..cc5f7f5 100644 --- a/src/source.cpp +++ b/src/source.cpp @@ -36,84 +36,6 @@ inline pid_t get_current_process_id() { std::unique_ptr Source::View::prettier_background_process = {}; -Glib::RefPtr Source::LanguageManager::get_default() { - static auto instance = Gsv::LanguageManager::create(); - return instance; -} -Glib::RefPtr 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 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(tag.size())) && tag == "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 offsets_) : source(std::move(source_)), path(std::move(path_)), offsets(std::move(offsets_)) { if(this->source.size() == 0) type = Type::erase; @@ -586,7 +508,7 @@ void Source::View::configure() { if(style && style->property_background_set()) extra_cursor_selection->property_background() = style->property_background().get_value(); 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()) { get_completion()->unblock_interactive(); diff --git a/src/source.hpp b/src/source.hpp index 06fe249..8ce5798 100644 --- a/src/source.hpp +++ b/src/source.hpp @@ -13,19 +13,6 @@ #include namespace Source { - /// Workaround for buggy Gsv::LanguageManager::get_default() - class LanguageManager { - public: - static Glib::RefPtr get_default(); - }; - /// Workaround for buggy Gsv::StyleSchemeManager::get_default() - class StyleSchemeManager { - public: - static Glib::RefPtr get_default(); - }; - - Glib::RefPtr guess_language(const boost::filesystem::path &file_path); - class Offset { public: Offset() = default; diff --git a/src/source_base.cpp b/src/source_base.cpp index 30766b1..132453f 100644 --- a/src/source_base.cpp +++ b/src/source_base.cpp @@ -16,6 +16,92 @@ GdkModifierType Source::CommonView::primary_modifier_mask = GDK_MOD2_MASK; GdkModifierType Source::CommonView::primary_modifier_mask = GDK_CONTROL_MASK; #endif +Gdk::RGBA StyleContext::get_background_color(const Glib::RefPtr &style_context, Gtk::StateFlags state) { + GdkRGBA *background_color = nullptr; + gtk_style_context_get(style_context->gobj(), static_cast(state), "background-color", &background_color, nullptr); + if(background_color != nullptr) + return Glib::wrap(background_color); + return Gdk::RGBA(); +} + +Glib::RefPtr Source::LanguageManager::get_default() { + static auto instance = Gsv::LanguageManager::create(); + return instance; +} +Glib::RefPtr 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 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(tag.size())) && tag == "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::CommonView::CommonView(const Glib::RefPtr &language) : Gsv::View() { set_tab_width(4); // Visual size of a \t hardcoded to be equal to visual size of 4 spaces diff --git a/src/source_base.hpp b/src/source_base.hpp index f6174c6..942b7a2 100644 --- a/src/source_base.hpp +++ b/src/source_base.hpp @@ -10,7 +10,25 @@ #include #include +namespace StyleContext { + /// Replacement of deprecated Gtk::StyleContext::get_background_color() + Gdk::RGBA get_background_color(const Glib::RefPtr &style_context, Gtk::StateFlags state = Gtk::STATE_FLAG_NORMAL); +} // namespace StyleContext + namespace Source { + /// Workaround for buggy Gsv::LanguageManager::get_default() + class LanguageManager { + public: + static Glib::RefPtr get_default(); + }; + /// Workaround for buggy Gsv::StyleSchemeManager::get_default() + class StyleSchemeManager { + public: + static Glib::RefPtr get_default(); + }; + + Glib::RefPtr guess_language(const boost::filesystem::path &file_path); + /// RAII-style text mark. Use instead of Gtk::TextBuffer::create_mark and Gtk::TextBuffer::delete_mark, /// since Gtk::TextBuffer::delete_mark is not called upon Glib::RefPtr deletion class Mark : public Glib::RefPtr { diff --git a/src/window.cpp b/src/window.cpp index 36580a2..62891b9 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -269,7 +269,7 @@ void Window::configure() { } } auto foreground_value = style && style->property_foreground_set() ? style->property_foreground().get_value() : get_style_context()->get_color().to_string(); - auto background_value = style && style->property_background_set() ? style->property_background().get_value() : get_style_context()->get_background_color().to_string(); + auto background_value = style && style->property_background_set() ? style->property_background().get_value() : StyleContext::get_background_color(get_style_context()).to_string(); #if GTK_VERSION_GE(3, 20) css_provider_tooltips->load_from_data(".juci_tooltip_box {background-color: " + background_value + ";}" + ".juci_tooltip_text_view text {color: " + foreground_value + ";background-color: " + background_value + ";}");