diff --git a/cmake/FindGspell.cmake b/cmake/FindGspell.cmake new file mode 100644 index 00000000..51c33c7e --- /dev/null +++ b/cmake/FindGspell.cmake @@ -0,0 +1,14 @@ +include(PkgConfigWithFallback) +find_pkg_config_with_fallback(Gspell + PKG_CONFIG_NAME gspell-1 + LIB_NAMES gspell-1 + INCLUDE_NAMES gspell.h + INCLUDE_DIR_SUFFIXES gspell-1 gspell-1/gspell + DEPENDS Gtk +) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Gspell + REQUIRED_VARS Gspell_LIBRARY + VERSION_VAR Gspell_VERSION) + diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 5975da8b..5169e8ae 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -10,6 +10,7 @@ find_packages(MAIN_PACKAGES REQUIRED GObject GTK3 ICU + Gspell ) set(RESOURCE_LIST @@ -129,6 +130,7 @@ SOURCES src/ui/chat_input/encryption_button.vala src/ui/chat_input/occupants_tab_completer.vala src/ui/chat_input/smiley_converter.vala + src/ui/chat_input/spell_checker.vala src/ui/chat_input/view.vala src/ui/contact_details/blocking_provider.vala diff --git a/main/src/ui/chat_input/chat_text_view.vala b/main/src/ui/chat_input/chat_text_view.vala index 8d5cb7a1..2f8393d2 100644 --- a/main/src/ui/chat_input/chat_text_view.vala +++ b/main/src/ui/chat_input/chat_text_view.vala @@ -39,6 +39,7 @@ public class ChatTextView : ScrolledWindow { private int vscrollbar_min_height; private SmileyConverter smiley_converter; public EditHistory edit_history; + private SpellChecker spell_checker; construct { max_content_height = 300; @@ -47,6 +48,7 @@ public class ChatTextView : ScrolledWindow { smiley_converter = new SmileyConverter(text_view); edit_history = new EditHistory(text_view); + spell_checker = new SpellChecker(text_view); this.get_vscrollbar().get_preferred_height(out vscrollbar_min_height, null); this.vadjustment.notify["upper"].connect_after(on_upper_notify); @@ -57,6 +59,7 @@ public class ChatTextView : ScrolledWindow { public void initialize_for_conversation(Conversation conversation) { edit_history.initialize_for_conversation(conversation); + spell_checker.initialize_for_conversation(conversation); } public override void get_preferred_height(out int min_height, out int nat_height) { diff --git a/main/src/ui/chat_input/spell_checker.vala b/main/src/ui/chat_input/spell_checker.vala new file mode 100644 index 00000000..a05d9251 --- /dev/null +++ b/main/src/ui/chat_input/spell_checker.vala @@ -0,0 +1,35 @@ +using Gdk; +using Gee; +using Gspell; + +using Dino.Entities; + +namespace Dino.Ui { + +public class SpellChecker { + + private Conversation? conversation; + private TextView gspell_view; + private HashMap language_cache = new HashMap(Conversation.hash_func, Conversation.equals_func); + + public SpellChecker(Gtk.TextView text_input) { + this.gspell_view = TextView.get_from_gtk_text_view(text_input); + gspell_view.basic_setup(); + } + + public void initialize_for_conversation(Conversation conversation) { + Checker spell_checker = TextBuffer.get_from_gtk_text_buffer(gspell_view.view.buffer).spell_checker; + + if (this.conversation != null) language_cache[this.conversation] = spell_checker.language; + + this.conversation = conversation; + + if (language_cache.has_key(this.conversation)) { + spell_checker.language = language_cache[conversation]; + } else { + spell_checker.language = null; + } + } +} + +}