Browse Source

Added replacement of deprecated Gtk::StyleContext::get_background_color(), and some cleanup

master
eidheim 1 month ago
parent
commit
b65fd1f910
  1. 80
      src/source.cpp
  2. 13
      src/source.hpp
  3. 86
      src/source_base.cpp
  4. 18
      src/source_base.hpp
  5. 2
      src/window.cpp

80
src/source.cpp

@ -36,84 +36,6 @@ inline pid_t get_current_process_id() {
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_)) {
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();

13
src/source.hpp

@ -13,19 +13,6 @@
#include <vector>
namespace Source {
/// Workaround for buggy Gsv::LanguageManager::get_default()
class LanguageManager {
public:
static Glib::RefPtr<Gsv::LanguageManager> get_default();
};
/// Workaround for buggy Gsv::StyleSchemeManager::get_default()
class StyleSchemeManager {
public:
static Glib::RefPtr<Gsv::StyleSchemeManager> get_default();
};
Glib::RefPtr<Gsv::Language> guess_language(const boost::filesystem::path &file_path);
class Offset {
public:
Offset() = default;

86
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<Gtk::StyleContext> &style_context, Gtk::StateFlags state) {
GdkRGBA *background_color = nullptr;
gtk_style_context_get(style_context->gobj(), static_cast<GtkStateFlags>(state), "background-color", &background_color, nullptr);
if(background_color != nullptr)
return Glib::wrap(background_color);
return Gdk::RGBA();
}
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::CommonView::CommonView(const Glib::RefPtr<Gsv::Language> &language) : Gsv::View() {
set_tab_width(4); // Visual size of a \t hardcoded to be equal to visual size of 4 spaces

18
src/source_base.hpp

@ -10,7 +10,25 @@
#include <set>
#include <vector>
namespace StyleContext {
/// Replacement of deprecated Gtk::StyleContext::get_background_color()
Gdk::RGBA get_background_color(const Glib::RefPtr<Gtk::StyleContext> &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<Gsv::LanguageManager> get_default();
};
/// Workaround for buggy Gsv::StyleSchemeManager::get_default()
class StyleSchemeManager {
public:
static Glib::RefPtr<Gsv::StyleSchemeManager> get_default();
};
Glib::RefPtr<Gsv::Language> 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<Gtk::TextMark> deletion
class Mark : public Glib::RefPtr<Gtk::TextMark> {

2
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 + ";}");

Loading…
Cancel
Save