From 2daa6faf26b113854ef58290a30169967341f8c6 Mon Sep 17 00:00:00 2001 From: Alexander Adolf Date: Mon, 9 Aug 2021 18:52:21 +0200 Subject: [PATCH 01/13] Remove WebKit From ThreadView Header --- src/modes/thread_view/thread_view.cc | 193 ++++++++++++++------------- src/modes/thread_view/thread_view.hh | 37 ++--- 2 files changed, 114 insertions(+), 116 deletions(-) diff --git a/src/modes/thread_view/thread_view.cc b/src/modes/thread_view/thread_view.cc index 8196f9827..338ad414f 100644 --- a/src/modes/thread_view/thread_view.cc +++ b/src/modes/thread_view/thread_view.cc @@ -50,6 +50,102 @@ using boost::property_tree::ptree; namespace Astroid { + extern "C" bool ThreadView_on_load_changed ( + WebKitWebView * w, + WebKitLoadEvent load_event, + gpointer user_data); + + extern "C" gboolean ThreadView_decide_policy ( + WebKitWebView * w, + WebKitPolicyDecision * decision, + WebKitPolicyDecisionType decision_type, + gpointer user_data); + + struct ThreadView::Private { + WebKitWebView * webview; + WebKitSettings * websettings; + WebKitWebContext * context; + + /* event wrappers */ + bool on_load_changed (ThreadView & self, + WebKitWebView * /* w */, + WebKitLoadEvent load_event) { + LOG (debug) << "tv: on_load_changed: " << load_event; + switch (load_event) { + case WEBKIT_LOAD_FINISHED: + LOG (debug) << "tv: load finished."; + { + /* render */ + self.wk_loaded = true; + + // also called in page_client + if (self.page_client->ready) on_ready_to_render (); + } + default: + break; + } + + return true; + } + + gboolean decide_policy (ThreadView & self, + WebKitWebView * /* w */, + WebKitPolicyDecision * decision, + WebKitPolicyDecisionType decision_type) { + LOG (debug) << "tv: decide policy"; + + switch (decision_type) { + case WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION: // navigate to {{{ + { + WebKitNavigationPolicyDecision * navigation_decision = WEBKIT_NAVIGATION_POLICY_DECISION (decision); + WebKitNavigationAction * nav_action = webkit_navigation_policy_decision_get_navigation_action (navigation_decision); + + if (webkit_navigation_action_get_navigation_type (nav_action) + == WEBKIT_NAVIGATION_TYPE_LINK_CLICKED) { + + webkit_policy_decision_ignore (decision); + + const gchar * uri_c = + webkit_uri_request_get_uri (webkit_navigation_action_get_request (nav_action)); + + ustring uri (uri_c); + LOG (info) << "tv: navigating to: " << uri; + + ustring scheme = Glib::uri_parse_scheme (uri); + + if (scheme == "mailto") { + + uri = uri.substr (scheme.length ()+1, uri.length () - scheme.length()-1); + UstringUtils::trim(uri); + + self.main_window->add_mode (new EditMessage (self.main_window, uri)); + + } else if (scheme == "id" || scheme == "mid" ) { + self.main_window->add_mode (new ThreadIndex (self.main_window, uri)); + + } else if (scheme == "http" || scheme == "https" || scheme == "ftp") { + self.open_link (uri); + + } else { + LOG (error) << "tv: unknown uri scheme. not opening."; + } + } + } // }}} + break; + + case WEBKIT_POLICY_DECISION_TYPE_NEW_WINDOW_ACTION: + webkit_policy_decision_ignore (decision); + break; + + default: + webkit_policy_decision_ignore (decision); + return true; // stop event + } + + return true; // stop event + } + }; // struct ThreadView::Private + ThreadView::ThreadView (MainWindow * mw, bool _edit_mode) : Mode (mw) { // edit_mode = _edit_mode; wk_loaded = false; @@ -64,7 +160,7 @@ namespace Astroid { /* WebKit: set up webkit web view */ /* create web context */ - context = webkit_web_context_new_ephemeral (); + Private->context = webkit_web_context_new_ephemeral (); /* set up this extension interface */ page_client = new PageClient (this); @@ -165,68 +261,7 @@ namespace Astroid { WebKitPolicyDecisionType decision_type, gpointer user_data) { - return ((ThreadView *) user_data)->decide_policy (w, decision, decision_type); - } - - gboolean ThreadView::decide_policy ( - WebKitWebView * /* w */, - WebKitPolicyDecision * decision, - WebKitPolicyDecisionType decision_type) - { - - LOG (debug) << "tv: decide policy"; - - switch (decision_type) { - case WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION: // navigate to {{{ - { - WebKitNavigationPolicyDecision * navigation_decision = WEBKIT_NAVIGATION_POLICY_DECISION (decision); - WebKitNavigationAction * nav_action = webkit_navigation_policy_decision_get_navigation_action (navigation_decision); - - if (webkit_navigation_action_get_navigation_type (nav_action) - == WEBKIT_NAVIGATION_TYPE_LINK_CLICKED) { - - webkit_policy_decision_ignore (decision); - - const gchar * uri_c = webkit_uri_request_get_uri ( - webkit_navigation_action_get_request (nav_action)); - - - ustring uri (uri_c); - LOG (info) << "tv: navigating to: " << uri; - - ustring scheme = Glib::uri_parse_scheme (uri); - - if (scheme == "mailto") { - - uri = uri.substr (scheme.length ()+1, uri.length () - scheme.length()-1); - UstringUtils::trim(uri); - - main_window->add_mode (new EditMessage (main_window, uri)); - - } else if (scheme == "id" || scheme == "mid" ) { - main_window->add_mode (new ThreadIndex (main_window, uri)); - - } else if (scheme == "http" || scheme == "https" || scheme == "ftp") { - open_link (uri); - - } else { - - LOG (error) << "tv: unknown uri scheme. not opening."; - } - } - } // }}} - break; - - case WEBKIT_POLICY_DECISION_TYPE_NEW_WINDOW_ACTION: - webkit_policy_decision_ignore (decision); - break; - - default: - webkit_policy_decision_ignore (decision); - return true; // stop event - } - - return true; // stop event + return ((ThreadView *) user_data)->Private::decide_policy (*user_data, w, decision, decision_type); } void ThreadView::open_link (ustring uri) { @@ -296,29 +331,7 @@ namespace Astroid { WebKitLoadEvent load_event, gpointer user_data) { - return ((ThreadView *) user_data)->on_load_changed (w, load_event); - } - - bool ThreadView::on_load_changed ( - WebKitWebView * /* w */, - WebKitLoadEvent load_event) - { - LOG (debug) << "tv: on_load_changed: " << load_event; - switch (load_event) { - case WEBKIT_LOAD_FINISHED: - LOG (debug) << "tv: load finished."; - { - /* render */ - wk_loaded = true; - - // also called in page_client - if (page_client->ready) on_ready_to_render (); - } - default: - break; - } - - return true; + return ((ThreadView *) user_data)->Private::on_load_changed (*user_data, w, load_event); } void ThreadView::load_thread (refptr _thread) { @@ -929,9 +942,9 @@ namespace Astroid { } } } - main_window->add_mode (new EditMessage (main_window, to.str (), - from.full_address (), - cc.str(), bcc.str())); + main_window->add_mode (new EditMessage (main_window, to.str (), + from.full_address (), + cc.str(), bcc.str())); } return true; }); @@ -1077,7 +1090,7 @@ namespace Astroid { }); keys.register_run ("thread_view.run", - [&] (Key, ustring cmd, ustring undo_cmd) { + [&] (Key, ustring cmd, ustring undo_cmd) { if (focused_message) { cmd = ustring::compose (cmd, focused_message->tid, focused_message->mid); undo_cmd = ustring::compose (undo_cmd, focused_message->tid, focused_message->mid); diff --git a/src/modes/thread_view/thread_view.hh b/src/modes/thread_view/thread_view.hh index b45a7f176..73eecb09e 100644 --- a/src/modes/thread_view/thread_view.hh +++ b/src/modes/thread_view/thread_view.hh @@ -9,11 +9,18 @@ # include # include +// avoid conflicting YES/NO in stock.h +# ifndef GTKMM_DISABLE_DEPRECATED +# define GTKMM_DISABLE_DEPRECATED 1 +# define UNDEF_GTKMM_DISABLE_DEPRECATED 1 +# endif # include -# include -# include +# ifdef UNDEF_GTKMM_DISABLE_DEPRECATED +# undef GTKMM_DISABLE_DEPRECATED +# endif # include +# include "db.hh" // NotmuchThread # include "proto.hh" # include "modes/mode.hh" # include "message_thread.hh" @@ -25,16 +32,6 @@ using boost::property_tree::ptree; namespace Astroid { - extern "C" bool ThreadView_on_load_changed ( - WebKitWebView * w, - WebKitLoadEvent load_event, - gpointer user_data); - - extern "C" gboolean ThreadView_decide_policy ( - WebKitWebView * w, - WebKitPolicyDecision * decision, - WebKitPolicyDecisionType decision_type, - gpointer user_data); class ThreadView : public Mode { friend PageClient; @@ -164,9 +161,7 @@ namespace Astroid { bool element_action (ElementAction); /* webkit */ - WebKitWebView * webview; - WebKitSettings * websettings; - WebKitWebContext * context; + struct Private; protected: std::atomic wk_loaded; @@ -184,18 +179,8 @@ namespace Astroid { void update_all_indent_states (); void save_all_attachments (); + public: - - /* event wrappers */ - bool on_load_changed ( - WebKitWebView * w, - WebKitLoadEvent load_event); - - gboolean decide_policy ( - WebKitWebView * w, - WebKitPolicyDecision * decision, - WebKitPolicyDecisionType decision_type); - void grab_focus (); /* mode */ From f547c6f19ea9ddbf67a190d43b7c98b58617d1f7 Mon Sep 17 00:00:00 2001 From: Alexander Adolf Date: Tue, 10 Aug 2021 17:40:09 +0200 Subject: [PATCH 02/13] [ThreadView] Use Private Struct Everywhere --- src/modes/thread_view/thread_view.cc | 68 ++++++++++++++-------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/src/modes/thread_view/thread_view.cc b/src/modes/thread_view/thread_view.cc index 338ad414f..5108e950d 100644 --- a/src/modes/thread_view/thread_view.cc +++ b/src/modes/thread_view/thread_view.cc @@ -79,7 +79,7 @@ namespace Astroid { self.wk_loaded = true; // also called in page_client - if (self.page_client->ready) on_ready_to_render (); + if (self.page_client->ready) self.on_ready_to_render (); } default: break; @@ -160,7 +160,7 @@ namespace Astroid { /* WebKit: set up webkit web view */ /* create web context */ - Private->context = webkit_web_context_new_ephemeral (); + ThreadView::Private.context = webkit_web_context_new_ephemeral (); /* set up this extension interface */ page_client = new PageClient (this); @@ -178,9 +178,9 @@ namespace Astroid { /* one process for each webview so that a new and unique * instance of the webextension is created for each webview * and page */ - webkit_web_context_set_process_model (context, WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES); + webkit_web_context_set_process_model (ThreadView::Private.context, WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES); - websettings = WEBKIT_SETTINGS (webkit_settings_new_with_settings ( + ThreadView::Private.websettings = WEBKIT_SETTINGS (webkit_settings_new_with_settings ( "enable-javascript", FALSE, "enable-java", FALSE, "enable-plugins", FALSE, @@ -201,26 +201,26 @@ namespace Astroid { # endif NULL)); - webview = + ThreadView::Private.webview = WEBKIT_WEB_VIEW ( g_object_new (WEBKIT_TYPE_WEB_VIEW, - "web-context", context, - "settings", websettings, + "web-context", ThreadView::Private.context, + "settings", ThreadView::Private.websettings, NULL)); - if (g_object_is_floating (webview)) g_object_ref_sink (webview); + if (g_object_is_floating (ThreadView::Private.webview)) g_object_ref_sink (ThreadView::Private.webview); - gtk_box_pack_start (GTK_BOX (this->gobj ()), GTK_WIDGET (webview), true, true, 0); + gtk_box_pack_start (GTK_BOX (this->gobj ()), GTK_WIDGET (ThreadView::Private.webview), true, true, 0); - g_signal_connect (webview, "load-changed", + g_signal_connect (ThreadView::Private.webview, "load-changed", G_CALLBACK(ThreadView_on_load_changed), (gpointer) this ); add_events (Gdk::KEY_PRESS_MASK); - g_signal_connect (webview, "decide-policy", + g_signal_connect (ThreadView::Private.webview, "decide-policy", G_CALLBACK(ThreadView_decide_policy), (gpointer) this); @@ -240,9 +240,9 @@ namespace Astroid { ThreadView::~ThreadView () { // LOG (debug) << "tv: deconstruct."; - g_object_unref (context); - g_object_unref (websettings); - g_object_unref (webview); + g_object_unref (ThreadView::Private.context); + g_object_unref (ThreadView::Private.websettings); + g_object_unref (ThreadView::Private.webview); } void ThreadView::pre_close () { @@ -261,7 +261,7 @@ namespace Astroid { WebKitPolicyDecisionType decision_type, gpointer user_data) { - return ((ThreadView *) user_data)->Private::decide_policy (*user_data, w, decision, decision_type); + return ((ThreadView *) user_data)->ThreadView::Private.decide_policy (*user_data, w, decision, decision_type); } void ThreadView::open_link (ustring uri) { @@ -331,7 +331,7 @@ namespace Astroid { WebKitLoadEvent load_event, gpointer user_data) { - return ((ThreadView *) user_data)->Private::on_load_changed (*user_data, w, load_event); + return ((ThreadView *) user_data)->ThreadView::Private.on_load_changed (*user_data, w, load_event); } void ThreadView::load_thread (refptr _thread) { @@ -421,7 +421,7 @@ namespace Astroid { wk_loaded = false; ready = false; - webkit_web_view_load_html (webview, theme.thread_view_html.c_str (), home_uri.c_str ()); + webkit_web_view_load_html (ThreadView::Private.webview, theme.thread_view_html.c_str (), home_uri.c_str ()); } void ThreadView::on_ready_to_render () { @@ -595,7 +595,7 @@ namespace Astroid { [&] (Key) { LOG (debug) << "tv show web inspector"; /* Show the inspector */ - WebKitWebInspector *inspector = webkit_web_view_get_inspector (WEBKIT_WEB_VIEW(webview)); + WebKitWebInspector *inspector = webkit_web_view_get_inspector (WEBKIT_WEB_VIEW(ThreadView::Private.webview)); webkit_web_inspector_show (WEBKIT_WEB_INSPECTOR(inspector)); return true; }); @@ -809,8 +809,8 @@ namespace Astroid { keys.register_key ("C-+", "thread_view.zoom_in", "Zoom in", [&] (Key) { - webkit_web_view_set_zoom_level (webview, - webkit_web_view_get_zoom_level (webview) + .1); + webkit_web_view_set_zoom_level (ThreadView::Private.webview, + webkit_web_view_get_zoom_level (ThreadView::Private.webview) + .1); return true; }); @@ -818,8 +818,8 @@ namespace Astroid { keys.register_key ("C-minus", "thread_view.zoom_out", "Zoom out", [&] (Key) { - webkit_web_view_set_zoom_level (webview, - std::max ((webkit_web_view_get_zoom_level (webview) - .1), 0.0)); + webkit_web_view_set_zoom_level (ThreadView::Private.webview, + std::max ((webkit_web_view_get_zoom_level (ThreadView::Private.webview) - .1), 0.0)); return true; }); @@ -1287,7 +1287,7 @@ namespace Astroid { # if 0 GError * err = NULL; - WebKitDOMDocument * d = webkit_web_view_get_dom_document (webview); + WebKitDOMDocument * d = webkit_web_view_get_dom_document (ThreadView::Private.webview); # endif for (auto &m : toprint) { @@ -1316,7 +1316,7 @@ namespace Astroid { /* open print window */ // TODO: [W2] Fix print # if 0 - WebKitWebFrame * frame = webkit_web_view_get_main_frame (webview); + WebKitWebFrame * frame = webkit_web_view_get_main_frame (ThreadView::Private.webview); webkit_web_frame_print (frame); # endif @@ -1417,7 +1417,7 @@ namespace Astroid { // TODO: [W2] # if 0 GError * err = NULL; - WebKitDOMDocument * d = webkit_web_view_get_dom_document (webview); + WebKitDOMDocument * d = webkit_web_view_get_dom_document (ThreadView::Private.webview); ustring mid = "message_" + focused_message->mid; WebKitDOMElement * e = webkit_dom_document_get_element_by_id (d, mid.c_str()); @@ -1437,7 +1437,7 @@ namespace Astroid { } /* open print window */ - WebKitWebFrame * frame = webkit_web_view_get_main_frame (webview); + WebKitWebFrame * frame = webkit_web_view_get_main_frame (ThreadView::Private.webview); webkit_web_frame_print (frame); if (indented) { @@ -2034,20 +2034,20 @@ namespace Astroid { /* general mode stuff */ void ThreadView::grab_focus () { //LOG (debug) << "tv: grab focus"; - gtk_widget_grab_focus (GTK_WIDGET (webview)); + gtk_widget_grab_focus (GTK_WIDGET (ThreadView::Private.webview)); } void ThreadView::grab_modal () { add_modal_grab (); grab_focus (); - //gtk_grab_add (GTK_WIDGET (webview)); - //gtk_widget_grab_focus (GTK_WIDGET (webview)); + //gtk_grab_add (GTK_WIDGET (ThreadView::Private.webview)); + //gtk_widget_grab_focus (GTK_WIDGET (ThreadView::Private.webview)); } void ThreadView::release_modal () { remove_modal_grab (); - //gtk_grab_remove (GTK_WIDGET (webview)); + //gtk_grab_remove (GTK_WIDGET (ThreadView::Private.webview)); } /* end general mode stuff */ @@ -2161,7 +2161,7 @@ namespace Astroid { in_search = false; search_q = ""; - WebKitFindController * f = webkit_web_view_get_find_controller (webview); + WebKitFindController * f = webkit_web_view_get_find_controller (ThreadView::Private.webview); webkit_find_controller_search_finish (f); } @@ -2175,7 +2175,7 @@ namespace Astroid { } LOG (debug) << "tv: searching for: " << k; - WebKitFindController * f = webkit_web_view_get_find_controller (webview); + WebKitFindController * f = webkit_web_view_get_find_controller (ThreadView::Private.webview); webkit_find_controller_search (f, k.c_str (), WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE | @@ -2193,7 +2193,7 @@ namespace Astroid { * the match is centered. */ - WebKitFindController * f = webkit_web_view_get_find_controller (webview); + WebKitFindController * f = webkit_web_view_get_find_controller (ThreadView::Private.webview); webkit_find_controller_search_next (f); page_client->update_focus_to_view (); } @@ -2201,7 +2201,7 @@ namespace Astroid { void ThreadView::prev_search_match () { if (!in_search) return; - WebKitFindController * f = webkit_web_view_get_find_controller (webview); + WebKitFindController * f = webkit_web_view_get_find_controller (ThreadView::Private.webview); webkit_find_controller_search_previous (f); page_client->update_focus_to_view (); } From dc427f4c0cca34193f9bf0878d6284681a1fa7ce Mon Sep 17 00:00:00 2001 From: Alexander Adolf Date: Tue, 10 Aug 2021 19:19:32 +0200 Subject: [PATCH 03/13] [ThreadView] Use Class Instead of Struct --- src/modes/thread_view/thread_view.cc | 72 ++++++++++++++-------------- src/modes/thread_view/thread_view.hh | 4 +- 2 files changed, 40 insertions(+), 36 deletions(-) diff --git a/src/modes/thread_view/thread_view.cc b/src/modes/thread_view/thread_view.cc index 5108e950d..338fc6b01 100644 --- a/src/modes/thread_view/thread_view.cc +++ b/src/modes/thread_view/thread_view.cc @@ -61,7 +61,7 @@ namespace Astroid { WebKitPolicyDecisionType decision_type, gpointer user_data); - struct ThreadView::Private { + class ThreadView::impl { WebKitWebView * webview; WebKitSettings * websettings; WebKitWebContext * context; @@ -144,7 +144,7 @@ namespace Astroid { return true; // stop event } - }; // struct ThreadView::Private + }; // class ThreadView::impl ThreadView::ThreadView (MainWindow * mw, bool _edit_mode) : Mode (mw) { // edit_mode = _edit_mode; @@ -160,7 +160,9 @@ namespace Astroid { /* WebKit: set up webkit web view */ /* create web context */ - ThreadView::Private.context = webkit_web_context_new_ephemeral (); + Private + + .context = webkit_web_context_new_ephemeral (); /* set up this extension interface */ page_client = new PageClient (this); @@ -178,9 +180,9 @@ namespace Astroid { /* one process for each webview so that a new and unique * instance of the webextension is created for each webview * and page */ - webkit_web_context_set_process_model (ThreadView::Private.context, WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES); + webkit_web_context_set_process_model (pImpl->context, WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES); - ThreadView::Private.websettings = WEBKIT_SETTINGS (webkit_settings_new_with_settings ( + pImpl->websettings = WEBKIT_SETTINGS (webkit_settings_new_with_settings ( "enable-javascript", FALSE, "enable-java", FALSE, "enable-plugins", FALSE, @@ -201,26 +203,26 @@ namespace Astroid { # endif NULL)); - ThreadView::Private.webview = + pImpl->webview = WEBKIT_WEB_VIEW ( g_object_new (WEBKIT_TYPE_WEB_VIEW, - "web-context", ThreadView::Private.context, - "settings", ThreadView::Private.websettings, + "web-context", pImpl->context, + "settings", pImpl->websettings, NULL)); - if (g_object_is_floating (ThreadView::Private.webview)) g_object_ref_sink (ThreadView::Private.webview); + if (g_object_is_floating (pImpl->webview)) g_object_ref_sink (pImpl->webview); - gtk_box_pack_start (GTK_BOX (this->gobj ()), GTK_WIDGET (ThreadView::Private.webview), true, true, 0); + gtk_box_pack_start (GTK_BOX (this->gobj ()), GTK_WIDGET (pImpl->webview), true, true, 0); - g_signal_connect (ThreadView::Private.webview, "load-changed", + g_signal_connect (pImpl->webview, "load-changed", G_CALLBACK(ThreadView_on_load_changed), (gpointer) this ); add_events (Gdk::KEY_PRESS_MASK); - g_signal_connect (ThreadView::Private.webview, "decide-policy", + g_signal_connect (pImpl->webview, "decide-policy", G_CALLBACK(ThreadView_decide_policy), (gpointer) this); @@ -240,9 +242,9 @@ namespace Astroid { ThreadView::~ThreadView () { // LOG (debug) << "tv: deconstruct."; - g_object_unref (ThreadView::Private.context); - g_object_unref (ThreadView::Private.websettings); - g_object_unref (ThreadView::Private.webview); + g_object_unref (pImpl->context); + g_object_unref (pImpl->websettings); + g_object_unref (pImpl->webview); } void ThreadView::pre_close () { @@ -261,7 +263,7 @@ namespace Astroid { WebKitPolicyDecisionType decision_type, gpointer user_data) { - return ((ThreadView *) user_data)->ThreadView::Private.decide_policy (*user_data, w, decision, decision_type); + return ((ThreadView *) user_data)->pImpl->decide_policy (*user_data, w, decision, decision_type); } void ThreadView::open_link (ustring uri) { @@ -331,7 +333,7 @@ namespace Astroid { WebKitLoadEvent load_event, gpointer user_data) { - return ((ThreadView *) user_data)->ThreadView::Private.on_load_changed (*user_data, w, load_event); + return ((ThreadView *) user_data)->pImpl->on_load_changed (*user_data, w, load_event); } void ThreadView::load_thread (refptr _thread) { @@ -421,7 +423,7 @@ namespace Astroid { wk_loaded = false; ready = false; - webkit_web_view_load_html (ThreadView::Private.webview, theme.thread_view_html.c_str (), home_uri.c_str ()); + webkit_web_view_load_html (pImpl->webview, theme.thread_view_html.c_str (), home_uri.c_str ()); } void ThreadView::on_ready_to_render () { @@ -595,7 +597,7 @@ namespace Astroid { [&] (Key) { LOG (debug) << "tv show web inspector"; /* Show the inspector */ - WebKitWebInspector *inspector = webkit_web_view_get_inspector (WEBKIT_WEB_VIEW(ThreadView::Private.webview)); + WebKitWebInspector *inspector = webkit_web_view_get_inspector (WEBKIT_WEB_VIEW(pImpl->webview)); webkit_web_inspector_show (WEBKIT_WEB_INSPECTOR(inspector)); return true; }); @@ -809,8 +811,8 @@ namespace Astroid { keys.register_key ("C-+", "thread_view.zoom_in", "Zoom in", [&] (Key) { - webkit_web_view_set_zoom_level (ThreadView::Private.webview, - webkit_web_view_get_zoom_level (ThreadView::Private.webview) + .1); + webkit_web_view_set_zoom_level (pImpl->webview, + webkit_web_view_get_zoom_level (pImpl->webview) + .1); return true; }); @@ -818,8 +820,8 @@ namespace Astroid { keys.register_key ("C-minus", "thread_view.zoom_out", "Zoom out", [&] (Key) { - webkit_web_view_set_zoom_level (ThreadView::Private.webview, - std::max ((webkit_web_view_get_zoom_level (ThreadView::Private.webview) - .1), 0.0)); + webkit_web_view_set_zoom_level (pImpl->webview, + std::max ((webkit_web_view_get_zoom_level (pImpl->webview) - .1), 0.0)); return true; }); @@ -1287,7 +1289,7 @@ namespace Astroid { # if 0 GError * err = NULL; - WebKitDOMDocument * d = webkit_web_view_get_dom_document (ThreadView::Private.webview); + WebKitDOMDocument * d = webkit_web_view_get_dom_document (pImpl->webview); # endif for (auto &m : toprint) { @@ -1316,7 +1318,7 @@ namespace Astroid { /* open print window */ // TODO: [W2] Fix print # if 0 - WebKitWebFrame * frame = webkit_web_view_get_main_frame (ThreadView::Private.webview); + WebKitWebFrame * frame = webkit_web_view_get_main_frame (pImpl->webview); webkit_web_frame_print (frame); # endif @@ -1417,7 +1419,7 @@ namespace Astroid { // TODO: [W2] # if 0 GError * err = NULL; - WebKitDOMDocument * d = webkit_web_view_get_dom_document (ThreadView::Private.webview); + WebKitDOMDocument * d = webkit_web_view_get_dom_document (pImpl->webview); ustring mid = "message_" + focused_message->mid; WebKitDOMElement * e = webkit_dom_document_get_element_by_id (d, mid.c_str()); @@ -1437,7 +1439,7 @@ namespace Astroid { } /* open print window */ - WebKitWebFrame * frame = webkit_web_view_get_main_frame (ThreadView::Private.webview); + WebKitWebFrame * frame = webkit_web_view_get_main_frame (pImpl->webview); webkit_web_frame_print (frame); if (indented) { @@ -2034,20 +2036,20 @@ namespace Astroid { /* general mode stuff */ void ThreadView::grab_focus () { //LOG (debug) << "tv: grab focus"; - gtk_widget_grab_focus (GTK_WIDGET (ThreadView::Private.webview)); + gtk_widget_grab_focus (GTK_WIDGET (pImpl->webview)); } void ThreadView::grab_modal () { add_modal_grab (); grab_focus (); - //gtk_grab_add (GTK_WIDGET (ThreadView::Private.webview)); - //gtk_widget_grab_focus (GTK_WIDGET (ThreadView::Private.webview)); + //gtk_grab_add (GTK_WIDGET (pImpl->webview)); + //gtk_widget_grab_focus (GTK_WIDGET (pImpl->webview)); } void ThreadView::release_modal () { remove_modal_grab (); - //gtk_grab_remove (GTK_WIDGET (ThreadView::Private.webview)); + //gtk_grab_remove (GTK_WIDGET (pImpl->webview)); } /* end general mode stuff */ @@ -2161,7 +2163,7 @@ namespace Astroid { in_search = false; search_q = ""; - WebKitFindController * f = webkit_web_view_get_find_controller (ThreadView::Private.webview); + WebKitFindController * f = webkit_web_view_get_find_controller (pImpl->webview); webkit_find_controller_search_finish (f); } @@ -2175,7 +2177,7 @@ namespace Astroid { } LOG (debug) << "tv: searching for: " << k; - WebKitFindController * f = webkit_web_view_get_find_controller (ThreadView::Private.webview); + WebKitFindController * f = webkit_web_view_get_find_controller (pImpl->webview); webkit_find_controller_search (f, k.c_str (), WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE | @@ -2193,7 +2195,7 @@ namespace Astroid { * the match is centered. */ - WebKitFindController * f = webkit_web_view_get_find_controller (ThreadView::Private.webview); + WebKitFindController * f = webkit_web_view_get_find_controller (pImpl->webview); webkit_find_controller_search_next (f); page_client->update_focus_to_view (); } @@ -2201,7 +2203,7 @@ namespace Astroid { void ThreadView::prev_search_match () { if (!in_search) return; - WebKitFindController * f = webkit_web_view_get_find_controller (ThreadView::Private.webview); + WebKitFindController * f = webkit_web_view_get_find_controller (pImpl->webview); webkit_find_controller_search_previous (f); page_client->update_focus_to_view (); } diff --git a/src/modes/thread_view/thread_view.hh b/src/modes/thread_view/thread_view.hh index 73eecb09e..ababc8280 100644 --- a/src/modes/thread_view/thread_view.hh +++ b/src/modes/thread_view/thread_view.hh @@ -8,6 +8,7 @@ # include # include # include +# include // avoid conflicting YES/NO in stock.h # ifndef GTKMM_DISABLE_DEPRECATED @@ -161,7 +162,8 @@ namespace Astroid { bool element_action (ElementAction); /* webkit */ - struct Private; + class impl; + std::experimental::propagate_const> pImpl; protected: std::atomic wk_loaded; From 354c743e38d19e501ba938a594fe1993df8d18ca Mon Sep 17 00:00:00 2001 From: Alexander Adolf Date: Tue, 10 Aug 2021 19:28:17 +0200 Subject: [PATCH 04/13] [ThreadView] Impl Class Stuff Must Be Public --- src/modes/thread_view/thread_view.cc | 128 +++++++++++++-------------- 1 file changed, 64 insertions(+), 64 deletions(-) diff --git a/src/modes/thread_view/thread_view.cc b/src/modes/thread_view/thread_view.cc index 338fc6b01..03c8b270d 100644 --- a/src/modes/thread_view/thread_view.cc +++ b/src/modes/thread_view/thread_view.cc @@ -62,88 +62,90 @@ namespace Astroid { gpointer user_data); class ThreadView::impl { - WebKitWebView * webview; - WebKitSettings * websettings; - WebKitWebContext * context; - - /* event wrappers */ - bool on_load_changed (ThreadView & self, - WebKitWebView * /* w */, - WebKitLoadEvent load_event) { - LOG (debug) << "tv: on_load_changed: " << load_event; - switch (load_event) { - case WEBKIT_LOAD_FINISHED: - LOG (debug) << "tv: load finished."; - { - /* render */ - self.wk_loaded = true; - // also called in page_client - if (self.page_client->ready) self.on_ready_to_render (); + public: + WebKitWebView * webview; + WebKitSettings * websettings; + WebKitWebContext * context; + + /* event wrappers */ + bool on_load_changed (ThreadView & self, + WebKitWebView * /* w */, + WebKitLoadEvent load_event) { + LOG (debug) << "tv: on_load_changed: " << load_event; + switch (load_event) { + case WEBKIT_LOAD_FINISHED: + LOG (debug) << "tv: load finished."; + { + /* render */ + self.wk_loaded = true; + + // also called in page_client + if (self.page_client->ready) self.on_ready_to_render (); + } + default: + break; } - default: - break; - } - return true; - } + return true; + } - gboolean decide_policy (ThreadView & self, - WebKitWebView * /* w */, - WebKitPolicyDecision * decision, - WebKitPolicyDecisionType decision_type) { - LOG (debug) << "tv: decide policy"; + gboolean decide_policy (ThreadView & self, + WebKitWebView * /* w */, + WebKitPolicyDecision * decision, + WebKitPolicyDecisionType decision_type) { + LOG (debug) << "tv: decide policy"; - switch (decision_type) { - case WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION: // navigate to {{{ - { - WebKitNavigationPolicyDecision * navigation_decision = WEBKIT_NAVIGATION_POLICY_DECISION (decision); - WebKitNavigationAction * nav_action = webkit_navigation_policy_decision_get_navigation_action (navigation_decision); + switch (decision_type) { + case WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION: // navigate to {{{ + { + WebKitNavigationPolicyDecision * navigation_decision = WEBKIT_NAVIGATION_POLICY_DECISION (decision); + WebKitNavigationAction * nav_action = webkit_navigation_policy_decision_get_navigation_action (navigation_decision); - if (webkit_navigation_action_get_navigation_type (nav_action) - == WEBKIT_NAVIGATION_TYPE_LINK_CLICKED) { + if (webkit_navigation_action_get_navigation_type (nav_action) + == WEBKIT_NAVIGATION_TYPE_LINK_CLICKED) { - webkit_policy_decision_ignore (decision); + webkit_policy_decision_ignore (decision); - const gchar * uri_c = - webkit_uri_request_get_uri (webkit_navigation_action_get_request (nav_action)); + const gchar * uri_c = + webkit_uri_request_get_uri (webkit_navigation_action_get_request (nav_action)); - ustring uri (uri_c); - LOG (info) << "tv: navigating to: " << uri; + ustring uri (uri_c); + LOG (info) << "tv: navigating to: " << uri; - ustring scheme = Glib::uri_parse_scheme (uri); + ustring scheme = Glib::uri_parse_scheme (uri); - if (scheme == "mailto") { + if (scheme == "mailto") { - uri = uri.substr (scheme.length ()+1, uri.length () - scheme.length()-1); - UstringUtils::trim(uri); + uri = uri.substr (scheme.length ()+1, uri.length () - scheme.length()-1); + UstringUtils::trim(uri); - self.main_window->add_mode (new EditMessage (self.main_window, uri)); + self.main_window->add_mode (new EditMessage (self.main_window, uri)); - } else if (scheme == "id" || scheme == "mid" ) { - self.main_window->add_mode (new ThreadIndex (self.main_window, uri)); + } else if (scheme == "id" || scheme == "mid" ) { + self.main_window->add_mode (new ThreadIndex (self.main_window, uri)); - } else if (scheme == "http" || scheme == "https" || scheme == "ftp") { - self.open_link (uri); + } else if (scheme == "http" || scheme == "https" || scheme == "ftp") { + self.open_link (uri); - } else { - LOG (error) << "tv: unknown uri scheme. not opening."; + } else { + LOG (error) << "tv: unknown uri scheme. not opening."; + } } - } - } // }}} - break; + } // }}} + break; + + case WEBKIT_POLICY_DECISION_TYPE_NEW_WINDOW_ACTION: + webkit_policy_decision_ignore (decision); + break; - case WEBKIT_POLICY_DECISION_TYPE_NEW_WINDOW_ACTION: - webkit_policy_decision_ignore (decision); - break; + default: + webkit_policy_decision_ignore (decision); + return true; // stop event + } - default: - webkit_policy_decision_ignore (decision); return true; // stop event } - - return true; // stop event - } }; // class ThreadView::impl ThreadView::ThreadView (MainWindow * mw, bool _edit_mode) : Mode (mw) { // @@ -160,9 +162,7 @@ namespace Astroid { /* WebKit: set up webkit web view */ /* create web context */ - Private - - .context = webkit_web_context_new_ephemeral (); + pImpl->context = webkit_web_context_new_ephemeral (); /* set up this extension interface */ page_client = new PageClient (this); From 53dc3c2b2ed2778e043c608f9f762577e09008b1 Mon Sep 17 00:00:00 2001 From: Alexander Adolf Date: Tue, 10 Aug 2021 19:48:16 +0200 Subject: [PATCH 05/13] [ThreadView] Missing Typecast in GObject Signal Callbacks --- src/modes/thread_view/thread_view.cc | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/modes/thread_view/thread_view.cc b/src/modes/thread_view/thread_view.cc index 03c8b270d..b1f8ede72 100644 --- a/src/modes/thread_view/thread_view.cc +++ b/src/modes/thread_view/thread_view.cc @@ -215,16 +215,18 @@ namespace Astroid { gtk_box_pack_start (GTK_BOX (this->gobj ()), GTK_WIDGET (pImpl->webview), true, true, 0); - g_signal_connect (pImpl->webview, "load-changed", - G_CALLBACK(ThreadView_on_load_changed), - (gpointer) this ); + g_signal_connect (pImpl->webview, + "load-changed", + G_CALLBACK(ThreadView_on_load_changed), + (gpointer) this ); // user_data add_events (Gdk::KEY_PRESS_MASK); - g_signal_connect (pImpl->webview, "decide-policy", - G_CALLBACK(ThreadView_decide_policy), - (gpointer) this); + g_signal_connect (pImpl->webview, + "decide-policy", + G_CALLBACK(ThreadView_decide_policy), + (gpointer) this); // user_data load_html (); @@ -263,7 +265,7 @@ namespace Astroid { WebKitPolicyDecisionType decision_type, gpointer user_data) { - return ((ThreadView *) user_data)->pImpl->decide_policy (*user_data, w, decision, decision_type); + return ((ThreadView *) user_data)->pImpl->decide_policy ((ThreadView *) user_data, w, decision, decision_type); } void ThreadView::open_link (ustring uri) { @@ -333,7 +335,7 @@ namespace Astroid { WebKitLoadEvent load_event, gpointer user_data) { - return ((ThreadView *) user_data)->pImpl->on_load_changed (*user_data, w, load_event); + return ((ThreadView *) user_data)->pImpl->on_load_changed ((ThreadView *) user_data, w, load_event); } void ThreadView::load_thread (refptr _thread) { From ac4ab4647ae5c1cb84cd4de59a26840e48b1d9d6 Mon Sep 17 00:00:00 2001 From: Alexander Adolf Date: Tue, 10 Aug 2021 20:01:40 +0200 Subject: [PATCH 06/13] [ThreadView] Fix Typecasts --- src/modes/thread_view/thread_view.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modes/thread_view/thread_view.cc b/src/modes/thread_view/thread_view.cc index b1f8ede72..86a8046de 100644 --- a/src/modes/thread_view/thread_view.cc +++ b/src/modes/thread_view/thread_view.cc @@ -265,7 +265,7 @@ namespace Astroid { WebKitPolicyDecisionType decision_type, gpointer user_data) { - return ((ThreadView *) user_data)->pImpl->decide_policy ((ThreadView *) user_data, w, decision, decision_type); + return ((ThreadView *) user_data)->pImpl->decide_policy ( * ((ThreadView *) user_data), w, decision, decision_type); } void ThreadView::open_link (ustring uri) { @@ -335,7 +335,7 @@ namespace Astroid { WebKitLoadEvent load_event, gpointer user_data) { - return ((ThreadView *) user_data)->pImpl->on_load_changed ((ThreadView *) user_data, w, load_event); + return ((ThreadView *) user_data)->pImpl->on_load_changed ( * ((ThreadView *) user_data), w, load_event); } void ThreadView::load_thread (refptr _thread) { From 9a8f78189a6e2dec1e87a3ee578ac2e45dfbf947 Mon Sep 17 00:00:00 2001 From: Alexander Adolf Date: Tue, 10 Aug 2021 22:20:39 +0200 Subject: [PATCH 07/13] [ThreadView] Ctor/Dtor Adjustments for PIMPL Pattern --- src/modes/thread_view/thread_view.cc | 18 +++++++++++------- src/modes/thread_view/thread_view.hh | 7 ++++++- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/modes/thread_view/thread_view.cc b/src/modes/thread_view/thread_view.cc index 86a8046de..af1f20ea2 100644 --- a/src/modes/thread_view/thread_view.cc +++ b/src/modes/thread_view/thread_view.cc @@ -67,7 +67,14 @@ namespace Astroid { WebKitWebView * webview; WebKitSettings * websettings; WebKitWebContext * context; - + + ThreadView::impl::~ThreadView::impl () { // + LOG (debug) << "tv: deconstruct."; + g_object_unref (context); + g_object_unref (websettings); + g_object_unref (webview); + } + /* event wrappers */ bool on_load_changed (ThreadView & self, WebKitWebView * /* w */, @@ -242,12 +249,9 @@ namespace Astroid { } - ThreadView::~ThreadView () { // - LOG (debug) << "tv: deconstruct."; - g_object_unref (pImpl->context); - g_object_unref (pImpl->websettings); - g_object_unref (pImpl->webview); - } + ThreadView::~ThreadView () = default; + ThreadView::ThreadView (ThreadView&&) = default; + ThreadView& ThreadView::operator= (ThreadView&&) = default; void ThreadView::pre_close () { # ifndef DISABLE_PLUGINS diff --git a/src/modes/thread_view/thread_view.hh b/src/modes/thread_view/thread_view.hh index ababc8280..4bd4c377f 100644 --- a/src/modes/thread_view/thread_view.hh +++ b/src/modes/thread_view/thread_view.hh @@ -39,7 +39,12 @@ namespace Astroid { public: ThreadView (MainWindow *, bool _edit_mode = false); - ~ThreadView (); + ~ThreadView (); // defined in the implementation file, where impl is a complete type + ThreadView (ThreadView&&); // defined in the implementation file + ThreadView (const ThreadView&) = delete; + ThreadView& operator= (ThreadView&&); // defined in the implementation file + ThreadView& operator= (const ThreadView&) = delete; + void load_thread (refptr); void load_message_thread (refptr); From b872617195429b5ddbc4ab3ef7661e39751d7389 Mon Sep 17 00:00:00 2001 From: Alexander Adolf Date: Wed, 11 Aug 2021 01:03:21 +0200 Subject: [PATCH 08/13] [ThreadView] Private Implementation Pointer Bot Easy to Spot Moving the pImpl declaration near the top of the class declaration so it's easier to spot. --- src/modes/thread_view/thread_view.hh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/modes/thread_view/thread_view.hh b/src/modes/thread_view/thread_view.hh index 4bd4c377f..f107cae59 100644 --- a/src/modes/thread_view/thread_view.hh +++ b/src/modes/thread_view/thread_view.hh @@ -37,6 +37,9 @@ namespace Astroid { class ThreadView : public Mode { friend PageClient; + class impl; + std::experimental::propagate_const> pImpl; + public: ThreadView (MainWindow *, bool _edit_mode = false); ~ThreadView (); // defined in the implementation file, where impl is a complete type @@ -166,10 +169,6 @@ namespace Astroid { bool element_action (ElementAction); - /* webkit */ - class impl; - std::experimental::propagate_const> pImpl; - protected: std::atomic wk_loaded; From f8b3f8fcb762fcc5da0c8b9c71a58a5573f4ee91 Mon Sep 17 00:00:00 2001 From: Alexander Adolf Date: Wed, 11 Aug 2021 01:17:04 +0200 Subject: [PATCH 09/13] [ThreadView] Refactoring Fixup Making the pImpl pointer public again, because we need to use it from the "extern C" pure functions. Fix misspelled pImpl destructor declaration. Re-remove default implementation assignments for the copy ctor and the assignment operator as the compiler complains bout them. --- src/modes/thread_view/thread_view.cc | 4 +--- src/modes/thread_view/thread_view.hh | 6 +++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/modes/thread_view/thread_view.cc b/src/modes/thread_view/thread_view.cc index af1f20ea2..496de409b 100644 --- a/src/modes/thread_view/thread_view.cc +++ b/src/modes/thread_view/thread_view.cc @@ -68,7 +68,7 @@ namespace Astroid { WebKitSettings * websettings; WebKitWebContext * context; - ThreadView::impl::~ThreadView::impl () { // + ~impl () { // LOG (debug) << "tv: deconstruct."; g_object_unref (context); g_object_unref (websettings); @@ -250,8 +250,6 @@ namespace Astroid { } ThreadView::~ThreadView () = default; - ThreadView::ThreadView (ThreadView&&) = default; - ThreadView& ThreadView::operator= (ThreadView&&) = default; void ThreadView::pre_close () { # ifndef DISABLE_PLUGINS diff --git a/src/modes/thread_view/thread_view.hh b/src/modes/thread_view/thread_view.hh index f107cae59..c7f2c740c 100644 --- a/src/modes/thread_view/thread_view.hh +++ b/src/modes/thread_view/thread_view.hh @@ -37,10 +37,10 @@ namespace Astroid { class ThreadView : public Mode { friend PageClient; - class impl; - std::experimental::propagate_const> pImpl; - public: + class impl; + std::experimental::propagate_const> pImpl; + ThreadView (MainWindow *, bool _edit_mode = false); ~ThreadView (); // defined in the implementation file, where impl is a complete type ThreadView (ThreadView&&); // defined in the implementation file From 792b313a13e4042106bb58713902d20fc20cfb12 Mon Sep 17 00:00:00 2001 From: Alexander Adolf Date: Mon, 23 Aug 2021 16:26:47 +0200 Subject: [PATCH 10/13] [PageClient] Start Refactoring PageClient --- src/modes/thread_view/page_client.cc | 156 ++++++++++++++------------- src/modes/thread_view/page_client.hh | 10 +- 2 files changed, 87 insertions(+), 79 deletions(-) diff --git a/src/modes/thread_view/page_client.cc b/src/modes/thread_view/page_client.cc index 993d32c39..f3cea96ca 100644 --- a/src/modes/thread_view/page_client.cc +++ b/src/modes/thread_view/page_client.cc @@ -37,6 +37,88 @@ using namespace boost::filesystem; namespace Astroid { + + extern "C" void PageClient_init_web_extensions (WebKitWebContext *, + gpointer); + + class PageClient::impl { + + void init_web_extensions (WebKitWebContext * context) { + + /* add path to Astroid web extension */ +# ifdef DEBUG + if (exists (path (Resource::get_exe_dir ()) / path("libtvextension.so"))) { + + LOG (warn) << "pc: DEBUG build - found local extension. adding: " << Resource::get_exe_dir().c_str () << " to web extensions search path."; + webkit_web_context_set_web_extensions_directory ( + context, + Resource::get_exe_dir ().c_str()); + + } else { + + LOG (warn) << "pc: DEBUG build. no local extension found. adding installed path."; + + path wke = path (PREFIX) / path ("lib/astroid/web-extensions"); + LOG (info) << "pc: adding " << wke.c_str () << " to web extension search path."; + + webkit_web_context_set_web_extensions_directory ( + context, + wke.c_str()); + + } + +# else + path wke = path (PREFIX) / path ("lib/astroid/web-extensions"); + LOG (info) << "pc: adding " << wke.c_str () << " to web extension search path."; + + webkit_web_context_set_web_extensions_directory ( + context, + wke.c_str()); + +# endif + + /* set up unix socket */ + LOG (warn) << "pc: id: " << id; + + socket_addr = ustring::compose ("%1/astroid.%2.%3.%4", + astroid->standard_paths ().socket_dir.c_str(), + getpid(), + id, + UstringUtils::random_alphanumeric (30)); + refptr addr; + if(Gio::UnixSocketAddress::abstract_names_supported ()) { + addr = Gio::UnixSocketAddress::create (socket_addr, + Gio::UNIX_SOCKET_ADDRESS_ABSTRACT); + } else { + addr = Gio::UnixSocketAddress::create (socket_addr, + Gio::UNIX_SOCKET_ADDRESS_PATH); + } + + refptr eaddr; + + LOG (debug) << "pc: socket: " << addr->get_path (); + + mode_t p = umask (0077); + srv = Gio::SocketListener::create (); + srv->add_address (addr, Gio::SocketType::SOCKET_TYPE_STREAM, + Gio::SocketProtocol::SOCKET_PROTOCOL_DEFAULT, + eaddr); + + /* listen */ + srv->accept_async (sigc::mem_fun (this, &PageClient::extension_connect)); + umask (p); + + /* send socket address (TODO: include key) */ + GVariant * gaddr = g_variant_new_string (addr->get_path ().c_str ()); + + webkit_web_context_set_web_extensions_initialization_user_data ( + context, + gaddr); + } + + + }; // class PageClient::impl + int PageClient::id = 0; PageClient::PageClient (ThreadView * t) { @@ -62,7 +144,7 @@ namespace Astroid { WebKitWebContext * context, gpointer user_data) { - ((PageClient *) user_data)->init_web_extensions (context); + ((PageClient *) user_data)->pImpl->init_web_extensions (context); } PageClient::~PageClient () { @@ -79,78 +161,6 @@ namespace Astroid { srv->close (); } - void PageClient::init_web_extensions (WebKitWebContext * context) { - - /* add path to Astroid web extension */ -# ifdef DEBUG - if (exists (path (Resource::get_exe_dir ()) / path("libtvextension.so"))) { - - LOG (warn) << "pc: DEBUG build - found local extension. adding: " << Resource::get_exe_dir().c_str () << " to web extensions search path."; - webkit_web_context_set_web_extensions_directory ( - context, - Resource::get_exe_dir ().c_str()); - - } else { - - LOG (warn) << "pc: DEBUG build. no local extension found. adding installed path."; - - path wke = path (PREFIX) / path ("lib/astroid/web-extensions"); - LOG (info) << "pc: adding " << wke.c_str () << " to web extension search path."; - - webkit_web_context_set_web_extensions_directory ( - context, - wke.c_str()); - - } - -# else - path wke = path (PREFIX) / path ("lib/astroid/web-extensions"); - LOG (info) << "pc: adding " << wke.c_str () << " to web extension search path."; - - webkit_web_context_set_web_extensions_directory ( - context, - wke.c_str()); - -# endif - - /* set up unix socket */ - LOG (warn) << "pc: id: " << id; - - socket_addr = ustring::compose ("%1/astroid.%2.%3.%4", - astroid->standard_paths ().socket_dir.c_str(), - getpid(), - id, - UstringUtils::random_alphanumeric (30)); - refptr addr; - if(Gio::UnixSocketAddress::abstract_names_supported ()) { - addr = Gio::UnixSocketAddress::create (socket_addr, - Gio::UNIX_SOCKET_ADDRESS_ABSTRACT); - } else { - addr = Gio::UnixSocketAddress::create (socket_addr, - Gio::UNIX_SOCKET_ADDRESS_PATH); - } - - refptr eaddr; - - LOG (debug) << "pc: socket: " << addr->get_path (); - - mode_t p = umask (0077); - srv = Gio::SocketListener::create (); - srv->add_address (addr, Gio::SocketType::SOCKET_TYPE_STREAM, - Gio::SocketProtocol::SOCKET_PROTOCOL_DEFAULT, - eaddr); - - /* listen */ - srv->accept_async (sigc::mem_fun (this, &PageClient::extension_connect)); - umask (p); - - /* send socket address (TODO: include key) */ - GVariant * gaddr = g_variant_new_string (addr->get_path ().c_str ()); - - webkit_web_context_set_web_extensions_initialization_user_data ( - context, - gaddr); - } void PageClient::extension_connect (refptr &res) { LOG (warn) << "pc: got extension connect"; diff --git a/src/modes/thread_view/page_client.hh b/src/modes/thread_view/page_client.hh index ec28f060e..bbdcd3f30 100644 --- a/src/modes/thread_view/page_client.hh +++ b/src/modes/thread_view/page_client.hh @@ -1,12 +1,12 @@ # pragma once -# include # include # include # include # include # include # include +# include # include "astroid.hh" # include "thread_view.hh" @@ -14,19 +14,17 @@ # include "messages.pb.h" namespace Astroid { - extern "C" void PageClient_init_web_extensions ( - WebKitWebContext *, - gpointer); class PageClient : public sigc::trackable { + class impl; + std::experimental::propagate_const> pImpl; + public: PageClient (ThreadView *); ~PageClient (); ThreadView * thread_view; - void init_web_extensions (WebKitWebContext * context); - /* ThreadView interface */ void load (); void add_message (refptr m); From 4ed239cb61a853de63c7f8e891b992cde3513a57 Mon Sep 17 00:00:00 2001 From: Alexander Adolf Date: Mon, 23 Aug 2021 17:12:45 +0200 Subject: [PATCH 11/13] [PageClient] clean up internal pImpl references (fingers crossed) --- src/modes/thread_view/page_client.cc | 34 ++++++++++++++-------------- src/modes/thread_view/page_client.hh | 7 +++--- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/modes/thread_view/page_client.cc b/src/modes/thread_view/page_client.cc index f3cea96ca..f130ccc34 100644 --- a/src/modes/thread_view/page_client.cc +++ b/src/modes/thread_view/page_client.cc @@ -42,8 +42,8 @@ namespace Astroid { gpointer); class PageClient::impl { - - void init_web_extensions (WebKitWebContext * context) { + public: + void init_web_extensions (PageClient & self, WebKitWebContext * context) { /* add path to Astroid web extension */ # ifdef DEBUG @@ -80,17 +80,17 @@ namespace Astroid { /* set up unix socket */ LOG (warn) << "pc: id: " << id; - socket_addr = ustring::compose ("%1/astroid.%2.%3.%4", - astroid->standard_paths ().socket_dir.c_str(), - getpid(), - id, - UstringUtils::random_alphanumeric (30)); + self.socket_addr = ustring::compose ("%1/astroid.%2.%3.%4", + astroid->standard_paths ().socket_dir.c_str(), + getpid(), + id, + UstringUtils::random_alphanumeric (30)); refptr addr; if(Gio::UnixSocketAddress::abstract_names_supported ()) { - addr = Gio::UnixSocketAddress::create (socket_addr, + addr = Gio::UnixSocketAddress::create (self.socket_addr, Gio::UNIX_SOCKET_ADDRESS_ABSTRACT); } else { - addr = Gio::UnixSocketAddress::create (socket_addr, + addr = Gio::UnixSocketAddress::create (self.socket_addr, Gio::UNIX_SOCKET_ADDRESS_PATH); } @@ -99,13 +99,13 @@ namespace Astroid { LOG (debug) << "pc: socket: " << addr->get_path (); mode_t p = umask (0077); - srv = Gio::SocketListener::create (); - srv->add_address (addr, Gio::SocketType::SOCKET_TYPE_STREAM, - Gio::SocketProtocol::SOCKET_PROTOCOL_DEFAULT, - eaddr); + self.srv = Gio::SocketListener::create (); + self.srv->add_address (addr, Gio::SocketType::SOCKET_TYPE_STREAM, + Gio::SocketProtocol::SOCKET_PROTOCOL_DEFAULT, + eaddr); /* listen */ - srv->accept_async (sigc::mem_fun (this, &PageClient::extension_connect)); + self.srv->accept_async (sigc::mem_fun (this, &PageClient::extension_connect)); umask (p); /* send socket address (TODO: include key) */ @@ -134,7 +134,7 @@ namespace Astroid { ATTACHMENT_ICON_WIDTH, Gtk::ICON_LOOKUP_USE_BUILTIN ); - extension_connect_id = g_signal_connect (thread_view->context, + extension_connect_id = g_signal_connect (thread_view->pImpl->context, "initialize-web-extensions", G_CALLBACK (PageClient_init_web_extensions), (gpointer) this); @@ -144,12 +144,12 @@ namespace Astroid { WebKitWebContext * context, gpointer user_data) { - ((PageClient *) user_data)->pImpl->init_web_extensions (context); + ((PageClient *) user_data)->pImpl->init_web_extensions (((PageClient *) user_data), context); } PageClient::~PageClient () { LOG (debug) << "pc: destruct"; - g_signal_handler_disconnect (thread_view->context, + g_signal_handler_disconnect (thread_view->pImpl->context, extension_connect_id); LOG (debug) << "pc: closing"; diff --git a/src/modes/thread_view/page_client.hh b/src/modes/thread_view/page_client.hh index bbdcd3f30..0d83113e5 100644 --- a/src/modes/thread_view/page_client.hh +++ b/src/modes/thread_view/page_client.hh @@ -16,10 +16,11 @@ namespace Astroid { class PageClient : public sigc::trackable { - class impl; - std::experimental::propagate_const> pImpl; - + public: + class impl; + std::experimental::propagate_const> pImpl; + PageClient (ThreadView *); ~PageClient (); From 93e458e9758fc9d07dfb59949cac0da7b985aa30 Mon Sep 17 00:00:00 2001 From: Alexander Adolf Date: Mon, 23 Aug 2021 18:01:54 +0200 Subject: [PATCH 12/13] [PageClient] move g_signal_(dis)connect to ThreadView Those g_signal calls need to be made in the WebView's context, but that is now hidden in ThreadView's pImpl. --- src/modes/thread_view/page_client.cc | 17 +++++++---------- src/modes/thread_view/thread_view.cc | 14 ++++++++++++++ src/modes/thread_view/thread_view.hh | 4 ++++ 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/modes/thread_view/page_client.cc b/src/modes/thread_view/page_client.cc index f130ccc34..fbce499f1 100644 --- a/src/modes/thread_view/page_client.cc +++ b/src/modes/thread_view/page_client.cc @@ -42,8 +42,8 @@ namespace Astroid { gpointer); class PageClient::impl { - public: - void init_web_extensions (PageClient & self, WebKitWebContext * context) { + public: + void init_web_extensions (PageClient & self, WebKitWebContext * context) { /* add path to Astroid web extension */ # ifdef DEBUG @@ -115,7 +115,6 @@ namespace Astroid { context, gaddr); } - }; // class PageClient::impl @@ -134,10 +133,9 @@ namespace Astroid { ATTACHMENT_ICON_WIDTH, Gtk::ICON_LOOKUP_USE_BUILTIN ); - extension_connect_id = g_signal_connect (thread_view->pImpl->context, - "initialize-web-extensions", - G_CALLBACK (PageClient_init_web_extensions), - (gpointer) this); + extension_connect_id = thread_view->connect_page_client("initialize-web-extensions", + G_CALLBACK (PageClient_init_web_extensions), + (gpointer) this); } extern "C" void PageClient_init_web_extensions ( @@ -149,9 +147,8 @@ namespace Astroid { PageClient::~PageClient () { LOG (debug) << "pc: destruct"; - g_signal_handler_disconnect (thread_view->pImpl->context, - extension_connect_id); - + thread_view->disconnect_page_client(extension_connect_id); + LOG (debug) << "pc: closing"; istream.clear (); diff --git a/src/modes/thread_view/thread_view.cc b/src/modes/thread_view/thread_view.cc index 496de409b..78fee8913 100644 --- a/src/modes/thread_view/thread_view.cc +++ b/src/modes/thread_view/thread_view.cc @@ -155,6 +155,20 @@ namespace Astroid { } }; // class ThreadView::impl + gulong ThreadView::connect_page_client (const gchar* detailed_signal, + GCallback c_handler, + gpointer user_data) { + return (g_signal_connect (pImpl->context, + detailed_signal, + c_handler, + user_data)); + } + + void ThreadView::disconnect_page_client (gulong connection_id) { + g_signal_handler_disconnect (pImpl->context, + connection_id); + } + ThreadView::ThreadView (MainWindow * mw, bool _edit_mode) : Mode (mw) { // edit_mode = _edit_mode; wk_loaded = false; diff --git a/src/modes/thread_view/thread_view.hh b/src/modes/thread_view/thread_view.hh index c7f2c740c..bc0174b15 100644 --- a/src/modes/thread_view/thread_view.hh +++ b/src/modes/thread_view/thread_view.hh @@ -84,6 +84,10 @@ namespace Astroid { /* Web extension */ PageClient * page_client; + gulong connect_page_client(const gchar* detailed_signal, + GCallback c_handler, + gpointer user_data); + void disconnect_page_client(gulong connection_id); private: /* focus and message state */ From 305263d07d06181c90031b737dd603c1a3a3c19f Mon Sep 17 00:00:00 2001 From: Alexander Adolf Date: Mon, 23 Aug 2021 18:21:17 +0200 Subject: [PATCH 13/13] [PageClient] broken self references --- src/modes/thread_view/page_client.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modes/thread_view/page_client.cc b/src/modes/thread_view/page_client.cc index fbce499f1..607040421 100644 --- a/src/modes/thread_view/page_client.cc +++ b/src/modes/thread_view/page_client.cc @@ -105,7 +105,7 @@ namespace Astroid { eaddr); /* listen */ - self.srv->accept_async (sigc::mem_fun (this, &PageClient::extension_connect)); + self.srv->accept_async (sigc::mem_fun (self, &PageClient::extension_connect)); umask (p); /* send socket address (TODO: include key) */ @@ -142,7 +142,7 @@ namespace Astroid { WebKitWebContext * context, gpointer user_data) { - ((PageClient *) user_data)->pImpl->init_web_extensions (((PageClient *) user_data), context); + ((PageClient *) user_data)->pImpl->init_web_extensions ( * ((PageClient *) user_data), context); } PageClient::~PageClient () {