diff options
author | Robert Manea <gotmor@gmail.com> | 2009-10-19 15:26:46 +0200 |
---|---|---|
committer | Robert Manea <gotmor@gmail.com> | 2009-10-19 15:26:46 +0200 |
commit | ca4d8aa5ade15615ae2cbc4560560cf735cbb2e1 (patch) | |
tree | f408ca9911b2c6ee370d4f7ccd8b770deedd327a | |
parent | 5578476f343cd4323f42ca24813ad307aae1f817 (diff) |
added menu_* commands for all contexts
-rw-r--r-- | README | 18 | ||||
-rw-r--r-- | callbacks.c | 92 | ||||
-rw-r--r-- | callbacks.h | 3 | ||||
-rw-r--r-- | examples/config/uzbl/config | 6 | ||||
-rw-r--r-- | uzbl-core.c | 180 | ||||
-rw-r--r-- | uzbl-core.h | 21 |
6 files changed, 244 insertions, 76 deletions
@@ -164,12 +164,18 @@ The following commands are recognized: - update the contents of the status and title bars * `event <event_name> [event_details]` - send custom event -* menu_add <label> = <uzbl command> - - add a new entry "label" that will execute "uzbl command" to the right click menu -* menu_add_separator <label> - - adds a separator line to the right click menu -* menu_remove <label> - - removes the entry "label" from the right click menu +* menu_add <label> = <uzbl command> +* menu_link_add <label> = <uzbl command> +* menu_image_add <label> = <uzbl command> + - add a new entry "label" that will execute "uzbl command" to one of the right click context menus +* menu_separator <label> +* menu_link_separator <label> +* menu_image_separator <label> + - adds a separator line to one of the right click context menus +* menu_remove <label> +* menu_link_remove <label> +* menu_image_remove <label> + - removes the entry "label" from one of the right click context menus ### VARIABLES AND CONSTANTS diff --git a/callbacks.c b/callbacks.c index d841fbe..4e105b1 100644 --- a/callbacks.c +++ b/callbacks.c @@ -480,6 +480,19 @@ key_release_cb (GtkWidget* window, GdkEventKey* event) { } gboolean +button_press_cb (GtkWidget* window, GdkEventButton* event) { + (void) window; + + if(event->type == GDK_BUTTON_PRESS) { + if(uzbl.state.last_button) + gdk_event_free((GdkEvent *)uzbl.state.last_button); + uzbl.state.last_button = (GdkEventButton *)gdk_event_copy((GdkEvent *)event); + } + + return FALSE; +} + +gboolean navigation_decision_cb (WebKitWebView *web_view, WebKitWebFrame *frame, WebKitNetworkRequest *request, WebKitWebNavigationAction *navigation_action, WebKitWebPolicyDecision *policy_decision, gpointer user_data) { (void) web_view; (void) frame; @@ -605,31 +618,82 @@ populate_popup_cb(WebKitWebView *v, GtkMenu *m, void *c) { GtkWidget *item; MenuItem *mi; guint i=0; + WebKitHitTestResult *ht; + guint context, hit=0; - if(!uzbl.gui.menu_items) - return; + /* check context */ + ht = webkit_web_view_get_hit_test_result(uzbl.gui.web_view, uzbl.state.last_button); + g_object_get(ht, "context", &context, NULL); /* Separate custom entries from default ones */ item = gtk_separator_menu_item_new(); gtk_menu_append(GTK_MENU(m), item); gtk_widget_show(item); - for(i=0; i < uzbl.gui.menu_items->len; i++) { - mi = g_ptr_array_index(uzbl.gui.menu_items, i); + if(uzbl.gui.menu_items_link && + (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK)) { + + for(i=0; i < uzbl.gui.menu_items_link->len; i++) { + mi = g_ptr_array_index(uzbl.gui.menu_items_link, i); - if(mi->issep) { - item = gtk_separator_menu_item_new(); - gtk_menu_append(GTK_MENU(m), item); - gtk_widget_show(item); + if(mi->issep) { + item = gtk_separator_menu_item_new(); + gtk_menu_append(GTK_MENU(m), item); + gtk_widget_show(item); + } + else { + item = gtk_menu_item_new_with_label(mi->name); + g_signal_connect(item, "activate", + G_CALLBACK(run_menu_command), mi->cmd); + gtk_menu_append(GTK_MENU(m), item); + gtk_widget_show(item); + } } - else { - item = gtk_menu_item_new_with_label(mi->name); - g_signal_connect(item, "activate", - G_CALLBACK(run_menu_command), mi->cmd); - gtk_menu_append(GTK_MENU(m), item); - gtk_widget_show(item); + hit++; + } + + if(uzbl.gui.menu_items_image && + (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE)) { + + for(i=0; i < uzbl.gui.menu_items_image->len; i++) { + mi = g_ptr_array_index(uzbl.gui.menu_items_image, i); + + if(mi->issep) { + item = gtk_separator_menu_item_new(); + gtk_menu_append(GTK_MENU(m), item); + gtk_widget_show(item); + } + else { + item = gtk_menu_item_new_with_label(mi->name); + g_signal_connect(item, "activate", + G_CALLBACK(run_menu_command), mi->cmd); + gtk_menu_append(GTK_MENU(m), item); + gtk_widget_show(item); + } } + hit++; } + if(uzbl.gui.menu_items && + !hit && + (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT)) { + + for(i=0; i < uzbl.gui.menu_items->len; i++) { + mi = g_ptr_array_index(uzbl.gui.menu_items, i); + + if(mi->issep) { + item = gtk_separator_menu_item_new(); + gtk_menu_append(GTK_MENU(m), item); + gtk_widget_show(item); + } + else { + item = gtk_menu_item_new_with_label(mi->name); + g_signal_connect(item, "activate", + G_CALLBACK(run_menu_command), mi->cmd); + gtk_menu_append(GTK_MENU(m), item); + gtk_widget_show(item); + } + } + } } diff --git a/callbacks.h b/callbacks.h index 0b8c97e..7222eaf 100644 --- a/callbacks.h +++ b/callbacks.h @@ -189,3 +189,6 @@ download_cb (WebKitWebView *web_view, GObject *download, gpointer user_data); void populate_popup_cb(WebKitWebView *v, GtkMenu *m, void *c); +gboolean +button_press_cb (GtkWidget* window, GdkEventButton* event); + diff --git a/examples/config/uzbl/config b/examples/config/uzbl/config index 5a14320..126c7e2 100644 --- a/examples/config/uzbl/config +++ b/examples/config/uzbl/config @@ -188,11 +188,15 @@ set formfiller = spawn @scripts_dir/formfiller # === Context menu items ===================================================== +# Default context menu menu_add Google = set uri = http://google.com menu_add Go Home = set uri = http://uzbl.org -menu_add_separator separator_1 +menu_separator separator_1 menu_add Quit uzbl = exit +# Link context menu +menu_link_add Print Link = print \@SELECTED_URI + # === Mode configuration ===================================================== diff --git a/uzbl-core.c b/uzbl-core.c index 2640f0e..02ba08c 100644 --- a/uzbl-core.c +++ b/uzbl-core.c @@ -586,46 +586,52 @@ VIEWFUNC(go_forward) /* -- command to callback/function map for things we cannot attach to any signals */ struct {const char *key; CommandInfo value;} cmdlist[] = -{ /* key function no_split */ - { "back", {view_go_back, 0} }, - { "forward", {view_go_forward, 0} }, - { "scroll_vert", {scroll_vert, 0} }, - { "scroll_horz", {scroll_horz, 0} }, - { "scroll_begin", {scroll_begin, 0} }, - { "scroll_end", {scroll_end, 0} }, - { "reload", {view_reload, 0}, }, - { "reload_ign_cache", {view_reload_bypass_cache, 0} }, - { "stop", {view_stop_loading, 0}, }, - { "zoom_in", {view_zoom_in, 0}, }, //Can crash (when max zoom reached?). - { "zoom_out", {view_zoom_out, 0}, }, - { "toggle_zoom_type", {toggle_zoom_type, 0}, }, - { "uri", {load_uri, TRUE} }, - { "js", {run_js, TRUE} }, - { "script", {run_external_js, 0} }, - { "toggle_status", {toggle_status_cb, 0} }, - { "spawn", {spawn, 0} }, - { "sync_spawn", {spawn_sync, 0} }, // needed for cookie handler - { "sh", {spawn_sh, 0} }, - { "sync_sh", {spawn_sh_sync, 0} }, // needed for cookie handler - { "talk_to_socket", {talk_to_socket, 0} }, - { "exit", {close_uzbl, 0} }, - { "search", {search_forward_text, TRUE} }, - { "search_reverse", {search_reverse_text, TRUE} }, - { "dehilight", {dehilight, 0} }, - { "set", {set_var, TRUE} }, - { "dump_config", {act_dump_config, 0} }, - { "dump_config_as_events", {act_dump_config_as_events, 0} }, - { "chain", {chain, 0} }, - { "print", {print, TRUE} }, - { "event", {event, TRUE} }, - /* a request is just semantic sugar to make things more obvious for - * the user, technically events and requests are the very same thing +{ /* key function no_split */ + { "back", {view_go_back, 0} }, + { "forward", {view_go_forward, 0} }, + { "scroll_vert", {scroll_vert, 0} }, + { "scroll_horz", {scroll_horz, 0} }, + { "scroll_begin", {scroll_begin, 0} }, + { "scroll_end", {scroll_end, 0} }, + { "reload", {view_reload, 0}, }, + { "reload_ign_cache", {view_reload_bypass_cache, 0} }, + { "stop", {view_stop_loading, 0}, }, + { "zoom_in", {view_zoom_in, 0}, }, //Can crash (when max zoom reached?). + { "zoom_out", {view_zoom_out, 0}, }, + { "toggle_zoom_type", {toggle_zoom_type, 0}, }, + { "uri", {load_uri, TRUE} }, + { "js", {run_js, TRUE} }, + { "script", {run_external_js, 0} }, + { "toggle_status", {toggle_status_cb, 0} }, + { "spawn", {spawn, 0} }, + { "sync_spawn", {spawn_sync, 0} }, // needed for cookie handler + { "sh", {spawn_sh, 0} }, + { "sync_sh", {spawn_sh_sync, 0} }, // needed for cookie handler + { "talk_to_socket", {talk_to_socket, 0} }, + { "exit", {close_uzbl, 0} }, + { "search", {search_forward_text, TRUE} }, + { "search_reverse", {search_reverse_text, TRUE} }, + { "dehilight", {dehilight, 0} }, + { "set", {set_var, TRUE} }, + { "dump_config", {act_dump_config, 0} }, + { "dump_config_as_events", {act_dump_config_as_events, 0} }, + { "chain", {chain, 0} }, + { "print", {print, TRUE} }, + { "event", {event, TRUE} }, + /* a request is just semantic sugar to make things more obvious for + * the user, technically events and requests are the very same thin g */ - { "request", {event, TRUE} }, - { "update_gui", {update_gui, TRUE} }, - { "menu_add", {menu_add, TRUE} }, - { "menu_add_separator", {menu_add_separator, TRUE} }, - { "menu_remove", {menu_remove, TRUE} } + { "request", {event, TRUE} }, + { "update_gui", {update_gui, TRUE} }, + { "menu_add", {menu_add, TRUE} }, + { "menu_link_add", {menu_add_link, TRUE} }, + { "menu_image_add", {menu_add_image, TRUE} }, + { "menu_separator", {menu_add_separator, TRUE} }, + { "menu_link_separator", {menu_add_separator_link, TRUE} }, + { "menu_image_separator", {menu_add_separator_image, TRUE}}, + { "menu_remove", {menu_remove, TRUE} }, + { "menu_link_remove", {menu_remove_link, TRUE} }, + { "menu_image_remove", {menu_remove_image, TRUE} } }; void @@ -687,15 +693,13 @@ update_gui(WebKitWebView *page, GArray *argv, GString *result) { } void -menu_add(WebKitWebView *page, GArray *argv, GString *result) { - (void) page; - (void) result; +add_to_menu(GArray *argv, GPtrArray **p) { MenuItem *m; gchar *item_cmd = NULL; gchar **split = g_strsplit(argv_idx(argv, 0), "=", 2); - if(!uzbl.gui.menu_items) - uzbl.gui.menu_items = g_ptr_array_new(); + if(!*p) + *p = g_ptr_array_new(); if(split[1]) item_cmd = g_strdup(split[1]); @@ -705,25 +709,46 @@ menu_add(WebKitWebView *page, GArray *argv, GString *result) { m->name = g_strdup(split[0]); m->cmd = g_strdup(item_cmd?item_cmd:""); m->issep = FALSE; - g_ptr_array_add(uzbl.gui.menu_items, m); + g_ptr_array_add(*p, m); } else g_free(item_cmd); g_strfreev(split); +} + +void +menu_add(WebKitWebView *page, GArray *argv, GString *result) { + (void) page; + (void) result; + + add_to_menu(argv, &uzbl.gui.menu_items); } void -menu_add_separator(WebKitWebView *page, GArray *argv, GString *result) { +menu_add_link(WebKitWebView *page, GArray *argv, GString *result) { + (void) page; + (void) result; + + add_to_menu(argv, &uzbl.gui.menu_items_link); +} + +void +menu_add_image(WebKitWebView *page, GArray *argv, GString *result) { (void) page; (void) result; - (void) argv; + + add_to_menu(argv, &uzbl.gui.menu_items_image); +} + +void +add_separator_to_menu(GArray *argv, GPtrArray **p) { MenuItem *m; gchar *sep_name; - if(!uzbl.gui.menu_items) - uzbl.gui.menu_items = g_ptr_array_new(); + if(!*p) + *p = g_ptr_array_new(); if(!argv_idx(argv, 0)) return; @@ -734,19 +759,39 @@ menu_add_separator(WebKitWebView *page, GArray *argv, GString *result) { m->name = g_strdup(sep_name); m->cmd = NULL; m->issep = TRUE; - g_ptr_array_add(uzbl.gui.menu_items, m); + g_ptr_array_add(*p, m); } +void +menu_add_separator(WebKitWebView *page, GArray *argv, GString *result) { + (void) page; + (void) result; + + add_separator_to_menu(argv, &uzbl.gui.menu_items); +} void -menu_remove(WebKitWebView *page, GArray *argv, GString *result) { +menu_add_separator_link(WebKitWebView *page, GArray *argv, GString *result) { (void) page; (void) result; + + add_separator_to_menu(argv, &uzbl.gui.menu_items_link); +} +void +menu_add_separator_image(WebKitWebView *page, GArray *argv, GString *result) { + (void) page; + (void) result; + + add_separator_to_menu(argv, &uzbl.gui.menu_items_image); +} + +void +remove_from_menu(GArray *argv, GPtrArray **p) { MenuItem *mi; gchar *name = NULL; guint i=0; - if(!uzbl.gui.menu_items) + if(!*p) return; if(!argv_idx(argv, 0)) @@ -754,19 +799,43 @@ menu_remove(WebKitWebView *page, GArray *argv, GString *result) { else name = argv_idx(argv, 0); - for(i=0; i < uzbl.gui.menu_items->len; i++) { - mi = g_ptr_array_index(uzbl.gui.menu_items, i); + for(i=0; i < (*p)->len; i++) { + mi = g_ptr_array_index(*p, i); if(!strcmp(name, mi->name)) { g_free(mi->name); g_free(mi->cmd); g_free(mi); - g_ptr_array_remove_index(uzbl.gui.menu_items, i); + g_ptr_array_remove_index(*p, i); } } } void +menu_remove(WebKitWebView *page, GArray *argv, GString *result) { + (void) page; + (void) result; + + remove_from_menu(argv, &uzbl.gui.menu_items); +} + +void +menu_remove_link(WebKitWebView *page, GArray *argv, GString *result) { + (void) page; + (void) result; + + remove_from_menu(argv, &uzbl.gui.menu_items_link); +} + +void +menu_remove_image(WebKitWebView *page, GArray *argv, GString *result) { + (void) page; + (void) result; + + remove_from_menu(argv, &uzbl.gui.menu_items_image); +} + +void event(WebKitWebView *page, GArray *argv, GString *result) { (void) page; (void) result; GString *event_name; @@ -1830,6 +1899,7 @@ create_browser () { g_object_connect((GObject*)g->web_view, "signal::key-press-event", (GCallback)key_press_cb, NULL, "signal::key-release-event", (GCallback)key_release_cb, NULL, + "signal::button-press-event", (GCallback)button_press_cb, NULL, "signal::title-changed", (GCallback)title_change_cb, NULL, "signal::selection-changed", (GCallback)selection_changed_cb, NULL, "signal::load-progress-changed", (GCallback)progress_change_cb, NULL, diff --git a/uzbl-core.h b/uzbl-core.h index 63df588..b12ae9d 100644 --- a/uzbl-core.h +++ b/uzbl-core.h @@ -73,6 +73,8 @@ typedef struct { /* custom context menu item */ GPtrArray *menu_items; + GPtrArray *menu_items_link; + GPtrArray *menu_items_image; } GUI; @@ -104,6 +106,7 @@ typedef struct { gboolean verbose; GPtrArray *event_buffer; gchar** connect_socket_names; + GdkEventButton *last_button; } State; @@ -435,11 +438,29 @@ void menu_add(WebKitWebView *page, GArray *argv, GString *result); void +menu_add_link(WebKitWebView *page, GArray *argv, GString *result); + +void +menu_add_image(WebKitWebView *page, GArray *argv, GString *result); + +void menu_add_separator(WebKitWebView *page, GArray *argv, GString *result); void +menu_add_separator_link(WebKitWebView *page, GArray *argv, GString *result); + +void +menu_add_separator_image(WebKitWebView *page, GArray *argv, GString *result); + +void menu_remove(WebKitWebView *page, GArray *argv, GString *result); +void +menu_remove_link(WebKitWebView *page, GArray *argv, GString *result); + +void +menu_remove_image(WebKitWebView *page, GArray *argv, GString *result); + typedef void (*Command)(WebKitWebView*, GArray *argv, GString *result); typedef struct { Command function; |