aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Robert Manea <gotmor@gmail.com>2009-10-19 15:26:46 +0200
committerGravatar Robert Manea <gotmor@gmail.com>2009-10-19 15:26:46 +0200
commitca4d8aa5ade15615ae2cbc4560560cf735cbb2e1 (patch)
treef408ca9911b2c6ee370d4f7ccd8b770deedd327a
parent5578476f343cd4323f42ca24813ad307aae1f817 (diff)
added menu_* commands for all contexts
-rw-r--r--README18
-rw-r--r--callbacks.c92
-rw-r--r--callbacks.h3
-rw-r--r--examples/config/uzbl/config6
-rw-r--r--uzbl-core.c180
-rw-r--r--uzbl-core.h21
6 files changed, 244 insertions, 76 deletions
diff --git a/README b/README
index 4672326..8ae76a7 100644
--- a/README
+++ b/README
@@ -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;