[Conkeror] [PATCH] Provide buttons on the mode-line for basic browser control.
David Kettler
kettler at internode.on.net
Fri May 8 05:42:05 PDT 2009
Simple GUI buttons are provided for controlling conkeror. They are
intended to be unobtrusive and to steal as little screen space as
possible. Clicking on them executes a conkeror command. Hovering
over them tells you the command and the corresponding keystroke.
Hopefully they are useful for novices and casual users.
They can be enabled with:
add_mode_line_buttons(standard_mode_line_buttons, true);
Problems:
- The icons used do not clearly indicate their function.
- The names of the commands are also probably unclear for novices.
- There are probably too many buttons. It might be better to have
just a few, together with a popup menu.
---
There is no change in functionality compared with the previous version
of this patch, but the code makes better use of prototypes.
When I turn this on now, I don't use it. But when I first started
using conkeror I would have found it helpful.
---
modules/mode-line.js | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 83 insertions(+), 0 deletions(-)
diff --git a/modules/mode-line.js b/modules/mode-line.js
index 72315f7..cbe45b6 100644
--- a/modules/mode-line.js
+++ b/modules/mode-line.js
@@ -33,6 +33,9 @@ generic_element_widget_container.prototype = {
element.setAttribute("class", class_name);
if (crop)
element.setAttribute("crop", crop);
+ return this.add_widget(widget, element);
+ },
+ add_widget : function (widget, element) {
element.conkeror_widget = new generic_widget_element(element, widget);
this.container.appendChild(element);
return element.conkeror_widget;
@@ -224,6 +227,66 @@ loading_count_widget.prototype.update = function () {
this.view.text = "";
};
+
+function button_widget(window) {
+ this.class_name = "button-widget";
+ text_widget.call(this, window);
+}
+button_widget.prototype = {
+ __proto__ : text_widget.prototype,
+
+ make_element : function (window) {
+ var command = this.command;
+ var element = create_XUL(window, "image");
+
+ element.addEventListener("click", function (event) {
+ var ctx = { window: window, key_sequence: [], sticky_modifiers: 0 };
+ call_interactively(ctx, command);
+ }, false);
+
+ element.addEventListener("mouseover", function (event) {
+ var msg = "Button: " + command;
+ var list = find_command_in_keymap(window.buffers.current, command);
+ if (list.length)
+ msg += " (which is on key " + list.join(", ") + ")";
+ window.minibuffer.show(msg);
+ }, false);
+
+ element.addEventListener("mouseout", function (event) {
+ window.minibuffer.show("");
+ }, false);
+
+ element.setAttribute("id", "button-widget-" + command);
+ element.setAttribute("class", this.class_name);
+ for (var a in this.attributes) {
+ element.setAttribute(a, this.attributes[a]);
+ }
+
+ return element;
+ }
+};
+
+function make_button_widget(command, attributes) {
+ if (typeof(attributes) == "string")
+ // Simple case
+ attributes = {src: "moz-icon://stock/gtk-" + attributes};
+
+ function new_widget(window) {
+ button_widget.call(this, window);
+ }
+ new_widget.prototype = {
+ __proto__ : button_widget.prototype,
+ command : command,
+ attributes : attributes
+ }
+ new_widget.mode_line_adder = function (window) {
+ var widget = new new_widget(window);
+ window.mode_line.add_widget(widget, widget.make_element(window));
+ }
+
+ return new_widget;
+}
+
function mode_line_adder(widget_constructor) {
if (!('mode_line_adder' in widget_constructor))
widget_constructor.mode_line_adder = function (window) {
@@ -232,6 +295,26 @@ function mode_line_adder(widget_constructor) {
return widget_constructor.mode_line_adder;
}
+function mode_line_add_buttons(buttons, prepend) {
+ for (var i = 0; i < buttons.length; i++) {
+ var j = prepend ? buttons.length - i - 1 : i;
+ var w = make_button_widget(buttons[j][0], buttons[j][1]);
+ add_hook("mode_line_hook", mode_line_adder(w), prepend);
+ }
+}
+
+standard_mode_line_buttons = [
+ ["find-url", "open"],
+ ["find-url-new-buffer", "new"],
+ ["go-back", "go-back"],
+ ["go-forward", "go-forward"],
+ ["reload", "refresh"],
+ ["kill-current-buffer", "close"],
+ ["buffer-previous", "go-up"],
+ ["buffer-next", "go-down"],
+ ["help-page", "help"],
+];
+
add_hook("mode_line_hook", mode_line_adder(current_buffer_name_widget));
add_hook("mode_line_hook", mode_line_adder(clock_widget));
add_hook("mode_line_hook", mode_line_adder(current_buffer_scroll_position_widget));
--
1.6.2.4
More information about the Conkeror
mailing list