@ -41,7 +41,6 @@ void load_uri(WebKitWebView* view, const char* uri)
char tmp [ strlen ( " https:// " ) + strlen ( uri ) ] ;
snprintf ( tmp , sizeof ( tmp ) , " https://%s " , uri ) ;
webkit_web_view_load_uri ( view , tmp ) ;
} else {
// Check for shortcuts
int l = SHORTCUT_N + strlen ( uri ) + 1 ;
@ -68,10 +67,7 @@ void redirect_if_annoying(WebKitWebView* view, const char* uri)
str_init ( uri_filtered , l ) ;
int check = libre_redirect ( uri , uri_filtered ) ;
if ( check = = 2 ) {
webkit_web_view_load_uri ( view , uri_filtered ) ;
}
if ( check = = 2 ) webkit_web_view_load_uri ( view , uri_filtered ) ;
}
}
void set_custom_style ( WebKitWebView * view )
@ -87,38 +83,33 @@ void handle_signal_load_changed(WebKitWebView* self, WebKitLoadEvent load_event,
GtkNotebook * notebook )
{
switch ( load_event ) {
/* see <https://webkitgtk.org/reference/webkit2gtk/2.5.1/WebKitWebView.html>
*/
case WEBKIT_LOAD_STARTED :
set_custom_style ( self ) ;
redirect_if_annoying ( self , webkit_web_view_get_uri ( self ) ) ;
break ;
case WEBKIT_LOAD_REDIRECTED :
redirect_if_annoying ( self , webkit_web_view_get_uri ( self ) ) ;
break ;
case WEBKIT_LOAD_COMMITTED :
redirect_if_annoying ( self , webkit_web_view_get_uri ( self ) ) ;
set_custom_style ( self ) ;
break ;
case WEBKIT_LOAD_FINISHED : {
/* Add gtk tab title */
const char * webpage_title = webkit_web_view_get_title ( self ) ;
const int max_length = 25 ;
char tab_title [ max_length + 1 ] ;
if ( webpage_title ! = NULL ) {
for ( int i = 0 ; i < ( max_length ) ; i + + ) {
tab_title [ i ] = webpage_title [ i ] ;
if ( webpage_title [ i ] = = ' \0 ' ) {
break ;
/* see <https://webkitgtk.org/reference/webkit2gtk/2.5.1/WebKitWebView.html>
*/
case WEBKIT_LOAD_STARTED :
case WEBKIT_LOAD_COMMITTED :
set_custom_style ( self ) ;
case WEBKIT_LOAD_REDIRECTED :
redirect_if_annoying ( self , webkit_web_view_get_uri ( self ) ) ;
break ;
case WEBKIT_LOAD_FINISHED : {
/* Add gtk tab title */
const char * webpage_title = webkit_web_view_get_title ( self ) ;
const int max_length = 25 ;
char tab_title [ max_length + 1 ] ;
if ( webpage_title ! = NULL ) {
for ( int i = 0 ; i < ( max_length ) ; i + + ) {
tab_title [ i ] = webpage_title [ i ] ;
if ( webpage_title [ i ] = = ' \0 ' ) {
break ;
}
}
tab_title [ max_length ] = ' \0 ' ;
}
tab_title [ max_length ] = ' \0 ' ;
}
gtk_notebook_set_tab_label_text ( notebook , GTK_WIDGET ( self ) ,
webpage_title = = NULL ? " — " : tab_title ) ;
// gtk_widget_hide(GTK_WIDGET(bar));
}
gtk_notebook_set_tab_label_text ( notebook , GTK_WIDGET ( self ) ,
webpage_title = = NULL ? " — " : tab_title ) ;
// gtk_widget_hide(GTK_WIDGET(bar));
}
}
}
@ -137,11 +128,10 @@ GtkWidget* handle_signal_create_new_tab(WebKitWebView* self,
printf ( " Creating new window: %s \n " , uri ) ;
notebook_create_new_tab ( notebook , uri ) ;
gtk_notebook_set_show_tabs ( notebook , true ) ;
return NULL ;
} else {
webkit_web_view_evaluate_javascript ( self , " alert('Too many tabs, not opening a new one') " , - 1 , NULL , " rosenrot-alert-numtabs " , NULL , NULL , NULL ) ;
return NULL ;
}
return NULL ;
/*
WebKitGTK documentation recommends returning the new webview .
I imagine that this might allow e . g . , to go back in a new tab
@ -171,25 +161,20 @@ WebKitWebView* create_new_webview()
contentmanager = webkit_user_content_manager_new ( ) ;
cookiemanager = webkit_web_context_get_cookie_manager ( web_context ) ;
webkit_cookie_manager_set_persistent_storage (
cookiemanager , DATA_DIR " /cookies.sqlite " ,
WEBKIT_COOKIE_PERSISTENT_STORAGE_SQLITE ) ;
webkit_cookie_manager_set_persistent_storage ( cookiemanager , DATA_DIR " /cookies.sqlite " , WEBKIT_COOKIE_PERSISTENT_STORAGE_SQLITE ) ;
webkit_cookie_manager_set_accept_policy ( cookiemanager ,
WEBKIT_COOKIE_POLICY_ACCEPT_ALWAYS ) ;
webkit_cookie_manager_set_accept_policy ( cookiemanager , WEBKIT_COOKIE_POLICY_ACCEPT_ALWAYS ) ;
if ( g_file_get_contents ( " ~/.config/rose/style.css " , & style , NULL , NULL ) )
if ( g_file_get_contents ( " ~/.config/rose/style.css " , & style , NULL , NULL ) ) {
webkit_user_content_manager_add_style_sheet (
contentmanager , webkit_user_style_sheet_new ( style , WEBKIT_USER_CONTENT_INJECT_ALL_FRAMES , WEBKIT_USER_STYLE_LEVEL_USER , NULL , NULL ) ) ;
}
return g_object_new ( WEBKIT_TYPE_WEB_VIEW , " settings " , settings , " web-context " ,
web_context , " user-content-manager " , contentmanager ,
NULL ) ;
return g_object_new ( WEBKIT_TYPE_WEB_VIEW , " settings " , settings , " web-context " , web_context , " user-content-manager " , contentmanager , NULL ) ;
}
void notebook_create_new_tab ( GtkNotebook * notebook , const char * uri )
{
if ( num_tabs < MAX_NUM_TABS | | MAX_NUM_TABS = = 0 ) {
WebKitWebView * view = create_new_webview ( ) ;
g_signal_connect ( view , " load_changed " , G_CALLBACK ( handle_signal_load_changed ) , notebook ) ;
@ -208,7 +193,6 @@ void notebook_create_new_tab(GtkNotebook* notebook, const char* uri)
webkit_web_view_set_zoom_level ( view , ZOOM ) ;
num_tabs + = 1 ;
} else {
webkit_web_view_evaluate_javascript ( notebook_get_webview ( notebook ) , " alert('Too many tabs, not opening a new one') " , - 1 , NULL , " rosenrot-alert-numtabs " , NULL , NULL , NULL ) ;
}
}
@ -217,31 +201,30 @@ void notebook_create_new_tab(GtkNotebook* notebook, const char* uri)
void toggle_bar ( GtkNotebook * notebook )
{
switch ( bar . entry_mode ) {
case _SEARCH : {
const char * url = webkit_web_view_get_uri ( notebook_get_webview ( notebook ) ) ;
gtk_entry_set_placeholder_text ( bar . line , " Search " ) ;
gtk_entry_buffer_set_text ( bar . line_text , url , strlen ( url ) ) ;
gtk_widget_show ( GTK_WIDGET ( bar . widget ) ) ;
gtk_window_set_focus ( window , GTK_WIDGET ( bar . line ) ) ;
break ;
}
case _FIND : {
const char * search_text = webkit_find_controller_get_search_text (
webkit_web_view_get_find_controller ( notebook_get_webview ( notebook ) ) ) ;
case _SEARCH : {
const char * url = webkit_web_view_get_uri ( notebook_get_webview ( notebook ) ) ;
gtk_entry_set_placeholder_text ( bar . line , " Search " ) ;
gtk_entry_buffer_set_text ( bar . line_text , url , strlen ( url ) ) ;
gtk_widget_show ( GTK_WIDGET ( bar . widget ) ) ;
gtk_window_set_focus ( window , GTK_WIDGET ( bar . line ) ) ;
break ;
}
case _FIND : {
const char * search_text = webkit_find_controller_get_search_text (
webkit_web_view_get_find_controller ( notebook_get_webview ( notebook ) ) ) ;
if ( search_text ! = NULL )
gtk_entry_buffer_set_text ( bar . line_text , search_text , strlen ( search_text ) ) ;
if ( search_text ! = NULL )
gtk_entry_buffer_set_text ( bar . line_text , search_text , strlen ( search_text ) ) ;
gtk_entry_set_placeholder_text ( bar . line , " Find " ) ;
gtk_widget_show ( GTK_WIDGET ( bar . widget ) ) ;
gtk_window_set_focus ( window , GTK_WIDGET ( bar . line ) ) ;
break ;
}
default :
// fallthrough
case _HIDDEN :
gtk_widget_hide ( GTK_WIDGET ( bar . widget ) ) ;
break ; // not needed now, but might reorder
gtk_entry_set_placeholder_text ( bar . line , " Find " ) ;
gtk_widget_show ( GTK_WIDGET ( bar . widget ) ) ;
gtk_window_set_focus ( window , GTK_WIDGET ( bar . line ) ) ;
break ;
}
default :
// fallthrough
case _HIDDEN :
gtk_widget_hide ( GTK_WIDGET ( bar . widget ) ) ;
}
}
// Handle what happens when the user is on the bar and presses enter
@ -270,119 +253,113 @@ int handle_shortcut(func id, GtkNotebook* notebook)
WebKitWebView * view = notebook_get_webview ( notebook ) ;
switch ( id ) {
case goback :
webkit_web_view_go_back ( view ) ;
break ;
case goforward :
webkit_web_view_go_forward ( view ) ;
break ;
case refresh :
webkit_web_view_reload ( view ) ;
break ;
case refresh_force :
webkit_web_view_reload_bypass_cache ( view ) ;
break ;
case back_to_home :
load_uri ( view , HOME ) ;
break ;
case zoomin :
webkit_web_view_set_zoom_level ( view ,
( zoom + = ZOOM_VAL ) ) ;
break ;
case zoomout :
webkit_web_view_set_zoom_level ( view ,
( zoom - = ZOOM_VAL ) ) ;
break ;
case zoom_reset :
webkit_web_view_set_zoom_level ( view ,
( zoom = ZOOM ) ) ;
break ;
case prev_tab : ; // declarations aren't statements
// <https://stackoverflow.com/questions/92396/why-cant-variables-be-declared-in-a-switch-statement>
int n = gtk_notebook_get_n_pages ( notebook ) ;
int k = gtk_notebook_get_current_page ( notebook ) ;
int l = ( n + k - 1 ) % n ;
gtk_notebook_set_current_page ( notebook , l ) ;
break ;
case next_tab : ;
int m = gtk_notebook_get_n_pages ( notebook ) ;
int i = gtk_notebook_get_current_page ( notebook ) ;
int j = ( i + 1 ) % m ;
gtk_notebook_set_current_page ( notebook , j ) ;
break ;
case close_tab :
gtk_notebook_remove_page ( notebook , gtk_notebook_get_current_page ( notebook ) ) ;
num_tabs - = 1 ;
switch ( gtk_notebook_get_n_pages ( notebook ) ) {
case 0 :
exit ( 0 ) ;
case goback :
webkit_web_view_go_back ( view ) ;
break ;
case 1 :
gtk_notebook_set_show_tabs( notebook , false ) ;
case goforward :
webkit_web_view_go_forward ( view ) ;
break ;
}
break ;
case refresh :
webkit_web_view_reload ( view ) ;
break ;
case refresh_force :
webkit_web_view_reload_bypass_cache ( view ) ;
break ;
case toggle_fullscreen :
if ( is_fullscreen )
gtk_window_unfullscreen ( window ) ;
else
gtk_window_fullscreen ( window ) ;
case back_to_home :
load_uri ( view , HOME ) ;
break ;
is_fullscreen = ! is_fullscreen ;
break ;
case zoomin :
webkit_web_view_set_zoom_level ( view ,
( zoom + = ZOOM_VAL ) ) ;
break ;
case zoomout :
webkit_web_view_set_zoom_level ( view ,
( zoom - = ZOOM_VAL ) ) ;
break ;
case zoom_reset :
webkit_web_view_set_zoom_level ( view ,
( zoom = ZOOM ) ) ;
break ;
case show_searchbar :
bar . entry_mode = _SEARCH ;
toggle_bar ( notebook ) ;
break ;
case prev_tab : ; // declarations aren't statements
// <https://stackoverflow.com/questions/92396/why-cant-variables-be-declared-in-a-switch-statement>
int n = gtk_notebook_get_n_pages ( notebook ) ;
int k = gtk_notebook_get_current_page ( notebook ) ;
int l = ( n + k - 1 ) % n ;
gtk_notebook_set_current_page ( notebook , l ) ;
break ;
case next_tab : ;
int m = gtk_notebook_get_n_pages ( notebook ) ;
int i = gtk_notebook_get_current_page ( notebook ) ;
int j = ( i + 1 ) % m ;
gtk_notebook_set_current_page ( notebook , j ) ;
break ;
case close_tab :
gtk_notebook_remove_page ( notebook , gtk_notebook_get_current_page ( notebook ) ) ;
num_tabs - = 1 ;
case show_finder :
bar . entry_mode = _FIND ;
toggle_bar ( notebook ) ;
break ;
switch ( gtk_notebook_get_n_pages ( notebook ) ) {
case 0 :
exit ( 0 ) ;
break ;
case 1 :
gtk_notebook_set_show_tabs ( notebook , false ) ;
break ;
}
case finder_next :
webkit_find_controller_search_next (
webkit_web_view_get_find_controller ( view ) ) ;
break ;
break ;
case finder_prev :
webkit_find_controller_search_previous (
webkit_web_view_get_find_controller ( view ) ) ;
break ;
case toggle_fullscreen :
if ( is_fullscreen )
gtk_window_unfullscreen ( window ) ;
else
gtk_window_fullscreen ( window ) ;
case new_tab :
notebook_create_new_tab ( notebook , NULL ) ;
gtk_notebook_set_show_tabs ( notebook , true ) ;
bar . entry_mode = _SEARCH ;
toggle_bar ( notebook ) ;
break ;
is_fullscreen = ! is_fullscreen ;
break ;
case hide_bar :
bar . entry_mode = _HIDDEN ;
toggle_bar ( notebook ) ;
break ;
case prettify : {
if ( READABILITY_ENABLED ) {
char * readability_js = malloc ( READABILITY_N + 1 ) ;
read_readability_js ( readability_js ) ;
webkit_web_view_evaluate_javascript ( view , readability_js , - 1 , NULL , " rosenrot-readability-plugin " , NULL , NULL , NULL ) ;
free ( readability_js ) ;
case show_searchbar :
bar . entry_mode = _SEARCH ;
toggle_bar ( notebook ) ;
break ;
case show_finder :
bar . entry_mode = _FIND ;
toggle_bar ( notebook ) ;
break ;
case finder_next :
webkit_find_controller_search_next (
webkit_web_view_get_find_controller ( view ) ) ;
break ;
case finder_prev :
webkit_find_controller_search_previous (
webkit_web_view_get_find_controller ( view ) ) ;
break ;
case new_tab :
notebook_create_new_tab ( notebook , NULL ) ;
gtk_notebook_set_show_tabs ( notebook , true ) ;
bar . entry_mode = _SEARCH ;
toggle_bar ( notebook ) ;
break ;
case hide_bar :
bar . entry_mode = _HIDDEN ;
toggle_bar ( notebook ) ;
break ;
case prettify : {
if ( READABILITY_ENABLED ) {
char * readability_js = malloc ( READABILITY_N + 1 ) ;
read_readability_js ( readability_js ) ;
webkit_web_view_evaluate_javascript ( view , readability_js , - 1 , NULL , " rosenrot-readability-plugin " , NULL , NULL , NULL ) ;
free ( readability_js ) ;
}
break ;
}
break ;
}
}
return 1 ;
@ -462,9 +439,7 @@ int main(int argc, char** argv)
/* Show to user */
gtk_widget_show_all ( GTK_WIDGET ( window ) ) ;
if ( argc ! = 0 ) {
gtk_widget_hide ( GTK_WIDGET ( bar . widget ) ) ;
}
if ( argc ! = 0 ) gtk_widget_hide ( GTK_WIDGET ( bar . widget ) ) ;
/* Deal with more tabs */
if ( argc > 2 ) {