GTK4: savepoint
This commit is contained in:
parent
d7781d308d
commit
3294947ad4
110
rosenrot4_beta.c
110
rosenrot4_beta.c
|
@ -9,12 +9,13 @@
|
||||||
#define NULLCHECK(x) \
|
#define NULLCHECK(x) \
|
||||||
do { \
|
do { \
|
||||||
if (x == NULL) { \
|
if (x == NULL) { \
|
||||||
printf("\nNull found"); \
|
printf("\nNULL check not passed"); \
|
||||||
printf("@ %s (%d): ", __FILE__, __LINE__); \
|
printf("@ %s (%d): ", __FILE__, __LINE__); \
|
||||||
exit(0); \
|
exit(0); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
/* Global variables */
|
||||||
static GtkNotebook* notebook;
|
static GtkNotebook* notebook;
|
||||||
static GtkWindow* window;
|
static GtkWindow* window;
|
||||||
typedef enum { _SEARCH,
|
typedef enum { _SEARCH,
|
||||||
|
@ -36,7 +37,7 @@ static int handle_signal_keypress(void* self, int keyval, int keycode,
|
||||||
GdkModifierType state, void* controller);
|
GdkModifierType state, void* controller);
|
||||||
|
|
||||||
/* Utils */
|
/* Utils */
|
||||||
WebKitWebView* notebook_get_webview(GtkNotebook* notebook)
|
WebKitWebView* notebook_get_webview(GtkNotebook* notebook) /* TODO: Think through whether to pass global variables or not */
|
||||||
{
|
{
|
||||||
WebKitWebView* view = WEBKIT_WEB_VIEW(gtk_notebook_get_nth_page(notebook, gtk_notebook_get_current_page(notebook)));
|
WebKitWebView* view = WEBKIT_WEB_VIEW(gtk_notebook_get_nth_page(notebook, gtk_notebook_get_current_page(notebook)));
|
||||||
NULLCHECK(view);
|
NULLCHECK(view);
|
||||||
|
@ -44,34 +45,36 @@ WebKitWebView* notebook_get_webview(GtkNotebook* notebook)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load content */
|
/* Load content */
|
||||||
|
|
||||||
void load_uri(WebKitWebView* view, const char* uri)
|
void load_uri(WebKitWebView* view, const char* uri)
|
||||||
{
|
{
|
||||||
|
|
||||||
NULLCHECK(view);
|
NULLCHECK(view);
|
||||||
if (strlen(uri) == 0) {
|
|
||||||
|
bool is_empty_uri = (strlen(uri) == 0);
|
||||||
|
bool has_direct_uri_prefix = (g_str_has_prefix(uri, "http://") || g_str_has_prefix(uri, "https://") || g_str_has_prefix(uri, "file://") || g_str_has_prefix(uri, "about:"));
|
||||||
|
bool has_common_domain_extension = (strstr(uri, ".com") || strstr(uri, ".org"));
|
||||||
|
bool has_shorcut;
|
||||||
|
|
||||||
|
int l = SHORTCUT_N + strlen(uri) + 1;
|
||||||
|
char uri_expanded[l];
|
||||||
|
str_init(uri_expanded, l);
|
||||||
|
int check = shortcut_expand(uri, uri_expanded);
|
||||||
|
has_shortcut = (check == 2);
|
||||||
|
|
||||||
|
if (is_empty_uri) {
|
||||||
webkit_web_view_load_uri(view, "");
|
webkit_web_view_load_uri(view, "");
|
||||||
toggle_bar(notebook, _SEARCH);
|
toggle_bar(notebook, _SEARCH);
|
||||||
} else if (g_str_has_prefix(uri, "http://") || g_str_has_prefix(uri, "https://") || g_str_has_prefix(uri, "file://") || g_str_has_prefix(uri, "about:")) {
|
} else if (has_direct_uri_prefix){
|
||||||
webkit_web_view_load_uri(view, uri);
|
webkit_web_view_load_uri(view, uri);
|
||||||
} else if (strstr(uri, ".com") || strstr(uri, ".org")) {
|
} else if (has_common_domain_extension){
|
||||||
char tmp[strlen("https://") + strlen(uri) + 1];
|
char tmp[strlen("https://") + strlen(uri) + 1];
|
||||||
snprintf(tmp, sizeof(tmp) + 1, "https://%s", uri);
|
snprintf(tmp, sizeof(tmp) + 1, "https://%s", uri);
|
||||||
webkit_web_view_load_uri(view, tmp);
|
webkit_web_view_load_uri(view, tmp);
|
||||||
|
} else if (has_shorcut){
|
||||||
|
webkit_web_view_load_uri(view, uri_expanded);
|
||||||
} else {
|
} else {
|
||||||
// Check for shortcuts
|
char tmp[strlen(uri) + strlen(SEARCH)];
|
||||||
int l = SHORTCUT_N + strlen(uri) + 1;
|
snprintf(tmp, sizeof(tmp), SEARCH, uri);
|
||||||
char uri_expanded[l];
|
webkit_web_view_load_uri(view, tmp);
|
||||||
str_init(uri_expanded, l);
|
|
||||||
int check = shortcut_expand(uri, uri_expanded);
|
|
||||||
if (check == 2) { /* Should use an enum here */
|
|
||||||
webkit_web_view_load_uri(view, uri_expanded);
|
|
||||||
} else {
|
|
||||||
// Feed into search engine.
|
|
||||||
char tmp[strlen(uri) + strlen(SEARCH)];
|
|
||||||
snprintf(tmp, sizeof(tmp), SEARCH, uri);
|
|
||||||
webkit_web_view_load_uri(view, tmp);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,14 +136,13 @@ void handle_signal_load_changed(WebKitWebView* self, WebKitLoadEvent load_event,
|
||||||
/* New tabs */
|
/* New tabs */
|
||||||
WebKitWebView* create_new_webview()
|
WebKitWebView* create_new_webview()
|
||||||
{
|
{
|
||||||
|
|
||||||
WebKitSettings* settings = webkit_settings_new_with_settings(WEBKIT_DEFAULT_SETTINGS, NULL);
|
WebKitSettings* settings = webkit_settings_new_with_settings(WEBKIT_DEFAULT_SETTINGS, NULL);
|
||||||
if (CUSTOM_USER_AGENT) {
|
if (CUSTOM_USER_AGENT) {
|
||||||
webkit_settings_set_user_agent(
|
webkit_settings_set_user_agent(
|
||||||
settings,
|
settings,
|
||||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, "
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, "
|
||||||
"like Gecko) Chrome/120.0.0.0 Safari/537.3");
|
"like Gecko) Chrome/120.0.0.0 Safari/537.3");
|
||||||
// https://www.useragents.me
|
// https://www.useragents.me
|
||||||
}
|
}
|
||||||
WebKitNetworkSession* network_session = webkit_network_session_new(DATA_DIR, DATA_DIR);
|
WebKitNetworkSession* network_session = webkit_network_session_new(DATA_DIR, DATA_DIR);
|
||||||
WebKitUserContentManager* contentmanager = webkit_user_content_manager_new();
|
WebKitUserContentManager* contentmanager = webkit_user_content_manager_new();
|
||||||
|
@ -176,20 +178,6 @@ GtkWidget* handle_signal_create_new_tab(WebKitWebView* self,
|
||||||
return GTK_WIDGET(self); // NULL;
|
return GTK_WIDGET(self); // NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void notebook_create_new_tab_mini(GtkNotebook* notebook, const char* uri)
|
|
||||||
{
|
|
||||||
WebKitWebView* view = create_new_webview();
|
|
||||||
|
|
||||||
int n = gtk_notebook_append_page(notebook, GTK_WIDGET(view), NULL);
|
|
||||||
gtk_notebook_set_tab_reorderable(notebook, GTK_WIDGET(view), true);
|
|
||||||
gtk_widget_set_visible(GTK_WIDGET(window), 1);
|
|
||||||
gtk_widget_hide(GTK_WIDGET(bar.widget));
|
|
||||||
webkit_web_view_load_uri(view, (uri) ? uri : HOME);
|
|
||||||
|
|
||||||
gtk_notebook_set_current_page(notebook, n);
|
|
||||||
gtk_notebook_set_tab_label_text(notebook, GTK_WIDGET(view), "-");
|
|
||||||
}
|
|
||||||
|
|
||||||
void notebook_create_new_tab(GtkNotebook* notebook, const char* uri)
|
void notebook_create_new_tab(GtkNotebook* notebook, const char* uri)
|
||||||
{
|
{
|
||||||
NULLCHECK(notebook);
|
NULLCHECK(notebook);
|
||||||
|
@ -198,23 +186,7 @@ void notebook_create_new_tab(GtkNotebook* notebook, const char* uri)
|
||||||
NULLCHECK(view);
|
NULLCHECK(view);
|
||||||
|
|
||||||
g_signal_connect(view, "load_changed", G_CALLBACK(handle_signal_load_changed), notebook);
|
g_signal_connect(view, "load_changed", G_CALLBACK(handle_signal_load_changed), notebook);
|
||||||
// I suspect there is something wonky going on here
|
|
||||||
// YEP, there is a problem here
|
|
||||||
// todo: fix
|
|
||||||
/* GtkEventController* event_controller_load_changed;
|
|
||||||
event_controller_load_changed = gtk_event_controller_key_new();
|
|
||||||
g_signal_connect_object(event_controller_load_changed, "load_changed", G_CALLBACK(handle_signal_load_changed), notebook, G_CONNECT_DEFAULT);
|
|
||||||
gtk_widget_add_controller(GTK_WIDGET(view), event_controller_load_changed);
|
|
||||||
*/
|
|
||||||
|
|
||||||
g_signal_connect(view, "create", G_CALLBACK(handle_signal_create_new_tab), notebook);
|
g_signal_connect(view, "create", G_CALLBACK(handle_signal_create_new_tab), notebook);
|
||||||
// I suspect there is something wonky going on here
|
|
||||||
/*
|
|
||||||
GtkEventController* event_controller_create_new_tab;
|
|
||||||
event_controller_create_new_tab = gtk_event_controller_key_new();
|
|
||||||
g_signal_connect_object(event_controller_create_new_tab, "create", G_CALLBACK(handle_signal_create_new_tab), notebook, G_CONNECT_DEFAULT);
|
|
||||||
gtk_widget_add_controller(GTK_WIDGET(view), event_controller_create_new_tab);
|
|
||||||
*/
|
|
||||||
|
|
||||||
int n = gtk_notebook_append_page(notebook, GTK_WIDGET(view), NULL);
|
int n = gtk_notebook_append_page(notebook, GTK_WIDGET(view), NULL);
|
||||||
gtk_notebook_set_tab_reorderable(notebook, GTK_WIDGET(view), true);
|
gtk_notebook_set_tab_reorderable(notebook, GTK_WIDGET(view), true);
|
||||||
|
@ -231,7 +203,8 @@ void notebook_create_new_tab(GtkNotebook* notebook, const char* uri)
|
||||||
webkit_web_view_set_zoom_level(view, ZOOM_START_LEVEL);
|
webkit_web_view_set_zoom_level(view, ZOOM_START_LEVEL);
|
||||||
num_tabs += 1;
|
num_tabs += 1;
|
||||||
} else {
|
} else {
|
||||||
// To do: show js message
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -268,10 +241,10 @@ void toggle_bar(GtkNotebook* notebook, Bar_entry_mode mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle what happens when the user is on the bar and presses enter
|
// Handle what happens when the user is on the bar and presses enter
|
||||||
void handle_signal_bar_press_enter(void* data)
|
void handle_signal_bar_press_enter(void* data) /* consider passing notebook as the data here? */
|
||||||
{
|
{
|
||||||
WebKitWebView* view = notebook_get_webview(notebook);
|
|
||||||
NULLCHECK(notebook);
|
NULLCHECK(notebook);
|
||||||
|
WebKitWebView* view = notebook_get_webview(notebook);
|
||||||
NULLCHECK(view);
|
NULLCHECK(view);
|
||||||
if (bar.entry_mode == _SEARCH)
|
if (bar.entry_mode == _SEARCH)
|
||||||
load_uri(view, gtk_entry_buffer_get_text(bar.line_text));
|
load_uri(view, gtk_entry_buffer_get_text(bar.line_text));
|
||||||
|
@ -286,24 +259,6 @@ void handle_signal_bar_press_enter(void* data)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handle shortcuts */
|
/* Handle shortcuts */
|
||||||
int handle_shortcut_mini(func id)
|
|
||||||
{
|
|
||||||
|
|
||||||
WebKitWebView* view = notebook_get_webview(notebook);
|
|
||||||
NULLCHECK(notebook);
|
|
||||||
NULLCHECK(view);
|
|
||||||
|
|
||||||
switch (id) {
|
|
||||||
case show_searchbar:
|
|
||||||
toggle_bar(notebook, _SEARCH);
|
|
||||||
break;
|
|
||||||
case hide_bar:
|
|
||||||
toggle_bar(notebook, _HIDDEN);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int handle_shortcut(func id)
|
int handle_shortcut(func id)
|
||||||
{
|
{
|
||||||
|
@ -430,12 +385,9 @@ int handle_shortcut(func id)
|
||||||
static int handle_signal_keypress(void* self, int keyval, int keycode,
|
static int handle_signal_keypress(void* self, int keyval, int keycode,
|
||||||
GdkModifierType state, void* controller)
|
GdkModifierType state, void* controller)
|
||||||
{
|
{
|
||||||
// (void) self, (void) keycode, (void) controller;
|
|
||||||
|
|
||||||
// fprintf(stdout, "New keypress!\n");
|
if (0) {
|
||||||
printf("New keypress\n");
|
printf("New keypress\n");
|
||||||
|
|
||||||
if (1) {
|
|
||||||
printf("Keypress state: %d\n", state);
|
printf("Keypress state: %d\n", state);
|
||||||
printf("Keypress value: %d\n", keyval);
|
printf("Keypress value: %d\n", keyval);
|
||||||
}
|
}
|
||||||
|
@ -483,7 +435,7 @@ int main(int argc, char** argv)
|
||||||
g_signal_connect(event_controller, "key-pressed", G_CALLBACK(handle_signal_keypress), NULL);
|
g_signal_connect(event_controller, "key-pressed", G_CALLBACK(handle_signal_keypress), NULL);
|
||||||
gtk_widget_add_controller(GTK_WIDGET(window), event_controller);
|
gtk_widget_add_controller(GTK_WIDGET(window), event_controller);
|
||||||
|
|
||||||
g_signal_connect(bar.line, "activate", G_CALLBACK(handle_signal_bar_press_enter), NULL);
|
g_signal_connect(bar.line, "activate", G_CALLBACK(handle_signal_bar_press_enter), NULL); // consider passing the notebook here? Unclear what to do with global variables.
|
||||||
g_signal_connect(GTK_WIDGET(window), "destroy", G_CALLBACK(exit), notebook);
|
g_signal_connect(GTK_WIDGET(window), "destroy", G_CALLBACK(exit), notebook);
|
||||||
|
|
||||||
// Show the application window
|
// Show the application window
|
||||||
|
|
Loading…
Reference in New Issue
Block a user