aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog33
-rw-r--r--lib/widgets/ephy-autocompletion-window.c29
-rw-r--r--lib/widgets/ephy-autocompletion-window.h4
-rwxr-xr-xlib/widgets/ephy-editable-toolbar.c92
-rw-r--r--lib/widgets/ephy-location-entry.c70
-rw-r--r--lib/widgets/ephy-location-entry.h1
-rw-r--r--src/ephy-shell.c13
-rw-r--r--src/ephy-window.c5
-rwxr-xr-xsrc/toolbar.c16
-rw-r--r--src/toolbar.h2
10 files changed, 245 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog
index 7b45df13f..be33ad480 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,36 @@
+2003-02-23 Marco Pesenti Gritti <marco@it.gnome.org>
+
+ * lib/widgets/ephy-autocompletion-window.c:
+ (ephy_autocompletion_window_class_init),
+ (ephy_autocompletion_window_key_press_hack):
+ * lib/widgets/ephy-autocompletion-window.h:
+ * lib/widgets/ephy-editable-toolbar.c: (drag_data_delete_cb),
+ (drag_data_get_cb), (connect_toolbar_drag_source),
+ (disconnect_toolbar_drag_source), (do_merge), (editor_close_cb),
+ (button_press_cb), (ephy_editable_toolbar_edit):
+ * lib/widgets/ephy-location-entry.c: (location_focus_out_cb),
+ (ephy_location_entry_init), (real_entry_set_location),
+ (ephy_location_entry_key_press_event_cb),
+ (ephy_location_entry_activate_cb),
+ (ephy_location_entry_set_location),
+ (ephy_location_entry_autocompletion_window_url_selected_cb),
+ (ephy_location_entry_set_autocompletion),
+ (ephy_location_entry_autocompletion_window_url_activated_cb),
+ (ephy_location_entry_autocompletion_window_hidden_cb),
+ (ephy_location_entry_edit):
+ * lib/widgets/ephy-location-entry.h:
+ * src/ephy-shell.c: (ephy_shell_new_tab):
+ * src/ephy-window.c: (add_widget):
+ * src/toolbar.c: (toolbar_edit_location):
+ * src/toolbar.h:
+
+ Update location entry with the urls selected on the drop down.
+ Implement editing mode in location entry == when the user is typing
+ an url try to do not disturb (mozilla still grab the focus damnit).
+ Dont put the homepage url in the location. I'm not sure if this is
+ a good behavior for normal urls (I dont see problems, but please
+ prove me wrong), but for about:blank it's needed.
+
2003-02-22 James Willcox <jwillcox@gnome.org>
* embed/mozilla/GlobalHistory.cpp:
diff --git a/lib/widgets/ephy-autocompletion-window.c b/lib/widgets/ephy-autocompletion-window.c
index 2eba9da66..8921c93f1 100644
--- a/lib/widgets/ephy-autocompletion-window.c
+++ b/lib/widgets/ephy-autocompletion-window.c
@@ -95,6 +95,7 @@ static gpointer g_object_class;
enum EphyAutocompletionWindowSignalsEnum {
ACTIVATED,
+ SELECTED,
EPHY_AUTOCOMPLETION_WINDOW_HIDDEN,
EPHY_AUTOCOMPLETION_WINDOW_LAST_SIGNAL
};
@@ -125,6 +126,17 @@ ephy_autocompletion_window_class_init (EphyAutocompletionWindowClass *klass)
G_TYPE_STRING,
G_TYPE_INT);
+ EphyAutocompletionWindowSignals[SELECTED] = g_signal_new (
+ "selected", G_OBJECT_CLASS_TYPE (klass),
+ G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST | G_SIGNAL_RUN_CLEANUP,
+ G_STRUCT_OFFSET (EphyAutocompletionWindowClass, selected),
+ NULL, NULL,
+ ephy_marshal_VOID__STRING_INT,
+ G_TYPE_NONE,
+ 2,
+ G_TYPE_STRING,
+ G_TYPE_INT);
+
EphyAutocompletionWindowSignals[EPHY_AUTOCOMPLETION_WINDOW_HIDDEN] = g_signal_new (
"hidden", G_OBJECT_CLASS_TYPE (klass),
G_SIGNAL_RUN_FIRST | G_SIGNAL_RUN_LAST | G_SIGNAL_RUN_CLEANUP,
@@ -718,6 +730,23 @@ ephy_autocompletion_window_key_press_hack (EphyAutocompletionWindow *aw,
g_warning ("Unexpected keyval");
break;
}
+
+ switch (keyval)
+ {
+ case GDK_Up:
+ case GDK_Down:
+ case GDK_Page_Down:
+ case GDK_Page_Up:
+ if (aw->priv->selected)
+ {
+ g_signal_emit (aw, EphyAutocompletionWindowSignals
+ [SELECTED], 0, aw->priv->selected, action);
+ }
+ break;
+ default:
+ break;
+ }
+
return TRUE;
}
diff --git a/lib/widgets/ephy-autocompletion-window.h b/lib/widgets/ephy-autocompletion-window.h
index b390fc35c..63b4a4ed3 100644
--- a/lib/widgets/ephy-autocompletion-window.h
+++ b/lib/widgets/ephy-autocompletion-window.h
@@ -60,7 +60,9 @@ struct _EphyAutocompletionWindowClass
void (*activated) (EphyAutocompletionWindow *aw,
const char *target,
int action);
-
+ void (*selected) (EphyAutocompletionWindow *aw,
+ const char *target,
+ int action);
};
/* Remember: fields are public read-only */
diff --git a/lib/widgets/ephy-editable-toolbar.c b/lib/widgets/ephy-editable-toolbar.c
index eddb39bd9..9861f4bf4 100755
--- a/lib/widgets/ephy-editable-toolbar.c
+++ b/lib/widgets/ephy-editable-toolbar.c
@@ -258,8 +258,22 @@ drag_data_delete_cb (GtkWidget *widget,
g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar));
node = (EphyToolbarsItem *)g_object_get_data (G_OBJECT (widget), "item_data");
- g_return_if_fail (node != NULL);
- ephy_toolbars_group_remove_item (etoolbar->priv->group, node);
+ if (node)
+ {
+ ephy_toolbars_group_remove_item (etoolbar->priv->group, node);
+ }
+ else
+ {
+ EphyToolbarsToolbar *toolbar;
+ GtkWidget *child = GTK_BIN (widget)->child;
+
+ g_return_if_fail (child != NULL);
+ toolbar = (EphyToolbarsToolbar *)g_object_get_data
+ (G_OBJECT (child), "toolbar_data");
+ g_return_if_fail (toolbar != NULL);
+
+ ephy_toolbars_group_remove_toolbar (etoolbar->priv->group, toolbar);
+ }
etoolbar->priv->toolbars_dirty = TRUE;
queue_ui_update (etoolbar);
@@ -279,7 +293,7 @@ drag_data_get_cb (GtkWidget *widget,
g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar));
action = EGG_ACTION (g_object_get_data (G_OBJECT (widget), "egg-action"));
- target = action->name;
+ target = action ? action->name : "Toolbar";
LOG ("Drag data get %s", action->name);
@@ -352,6 +366,49 @@ disconnect_item_drag_source (EphyToolbarsItem *item, EphyEditableToolbar *etoolb
}
static void
+connect_toolbar_drag_source (EphyToolbarsToolbar *toolbar, EphyEditableToolbar *etoolbar)
+{
+ GtkWidget *widget;
+
+ g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar));
+ g_return_if_fail (toolbar != NULL);
+
+ widget = get_item_widget (etoolbar, toolbar);
+
+ if (!g_object_get_data (G_OBJECT (widget), "drag_source_set"))
+ {
+ g_object_set_data (G_OBJECT (widget), "drag_source_set",
+ GINT_TO_POINTER (TRUE));
+ g_signal_connect (widget->parent, "drag_data_get",
+ G_CALLBACK (drag_data_get_cb),
+ etoolbar);
+ g_signal_connect (widget->parent, "drag_data_delete",
+ G_CALLBACK (drag_data_delete_cb),
+ etoolbar);
+ }
+}
+
+static void
+disconnect_toolbar_drag_source (EphyToolbarsToolbar *toolbar, EphyEditableToolbar *etoolbar)
+{
+ GtkWidget *widget;
+
+ g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar));
+ g_return_if_fail (toolbar != NULL);
+
+ widget = get_item_widget (etoolbar, toolbar);
+
+ if (g_object_get_data (G_OBJECT (widget), "drag_source_set"))
+ {
+ g_object_set_data (G_OBJECT (widget), "drag_source_set",
+ GINT_TO_POINTER (FALSE));
+ g_signal_handlers_disconnect_by_func (widget->parent,
+ G_CALLBACK (drag_data_delete_cb),
+ etoolbar);
+ }
+}
+
+static void
setup_toolbar (EphyToolbarsToolbar *toolbar, EphyEditableToolbar *etoolbar)
{
GtkWidget *widget;
@@ -470,6 +527,9 @@ do_merge (EphyEditableToolbar *t)
ephy_toolbars_group_foreach_item (t->priv->group,
(EphyToolbarsGroupForeachItemFunc)
connect_item_drag_source, t);
+ ephy_toolbars_group_foreach_toolbar (t->priv->group,
+ (EphyToolbarsGroupForeachToolbarFunc)
+ connect_toolbar_drag_source, t);
}
ephy_toolbars_group_foreach_toolbar (t->priv->group,
@@ -733,6 +793,10 @@ editor_close_cb (GtkWidget *button, EphyEditableToolbar *etoolbar)
(EphyToolbarsGroupForeachItemFunc)
disconnect_item_drag_source,
etoolbar);
+ ephy_toolbars_group_foreach_toolbar (etoolbar->priv->group,
+ (EphyToolbarsGroupForeachToolbarFunc)
+ disconnect_toolbar_drag_source,
+ etoolbar);
hide_editor (etoolbar);
}
@@ -975,19 +1039,29 @@ button_press_cb (GtkWidget *w,
EphyEditableToolbar *etoolbar)
{
GtkWidget *widget;
- GtkWidget *toolitem;
+ GtkWidget *drag_widget;
+ GtkWidget *child;
g_return_val_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar), FALSE);
widget = gtk_get_event_widget (event);
- toolitem = gtk_widget_get_ancestor (widget, EGG_TYPE_TOOL_ITEM);
+ child = GTK_BIN (widget)->child;
+
+ if (EGG_IS_TOOLBAR (child))
+ {
+ drag_widget = widget;
+ }
+ else
+ {
+ drag_widget = gtk_widget_get_ancestor (widget, EGG_TYPE_TOOL_ITEM);
+ }
- if (toolitem == NULL) return FALSE;
+ if (drag_widget == NULL) return FALSE;
switch (event->type)
{
case GDK_BUTTON_PRESS:
- gtk_drag_begin (toolitem,
+ gtk_drag_begin (drag_widget,
gtk_target_list_new (source_drag_types, 1),
GDK_ACTION_MOVE, 1, event);
return TRUE;
@@ -1038,6 +1112,10 @@ ephy_editable_toolbar_edit (EphyEditableToolbar *etoolbar)
ephy_toolbars_group_foreach_item (etoolbar->priv->group,
(EphyToolbarsGroupForeachItemFunc)
connect_item_drag_source, etoolbar);
+ ephy_toolbars_group_foreach_toolbar (etoolbar->priv->group,
+ (EphyToolbarsGroupForeachToolbarFunc)
+ connect_toolbar_drag_source,
+ etoolbar);
ephy_toolbars_group_foreach_item (etoolbar->priv->group,
(EphyToolbarsGroupForeachItemFunc)
set_action_sensitive, etoolbar);
diff --git a/lib/widgets/ephy-location-entry.c b/lib/widgets/ephy-location-entry.c
index fbd8a8216..a2e86e345 100644
--- a/lib/widgets/ephy-location-entry.c
+++ b/lib/widgets/ephy-location-entry.c
@@ -45,6 +45,7 @@ struct _EphyLocationEntryPrivate {
gint show_alternatives_timeout;
gboolean block_set_autocompletion_key;
gboolean going_to_site;
+ gboolean editing;
gchar *autocompletion_key;
gchar *last_completion;
@@ -125,14 +126,28 @@ ephy_location_entry_class_init (EphyLocationEntryClass *klass)
G_TYPE_STRING);
}
+static gboolean
+location_focus_out_cb (GtkWidget *widget, GdkEventFocus *event, EphyLocationEntry *w)
+{
+ w->priv->editing = FALSE;
+
+ return FALSE;
+}
+
static void
ephy_location_entry_init (EphyLocationEntry *w)
{
EphyLocationEntryPrivate *p = g_new0 (EphyLocationEntryPrivate, 1);
w->priv = p;
p->last_action_target = NULL;
+ p->editing = FALSE;
ephy_location_entry_build (w);
+
+ g_signal_connect (w->priv->entry,
+ "focus_out_event",
+ G_CALLBACK (location_focus_out_cb),
+ w);
}
static void
@@ -360,6 +375,18 @@ position_is_at_end (GtkEditable *editable)
return gtk_editable_get_position (editable) == end;
}
+static void
+real_entry_set_location (EphyLocationEntry *w,
+ const gchar *new_location)
+{
+ EphyLocationEntryPrivate *p = w->priv;
+ int pos;
+
+ gtk_editable_delete_text (GTK_EDITABLE (p->entry), 0, -1);
+ gtk_editable_insert_text (GTK_EDITABLE (p->entry), new_location, g_utf8_strlen (new_location, -1),
+ &pos);
+}
+
/* this is from the old location entry, need to do the autocompletion before implementing this */
static gboolean
ephy_location_entry_key_press_event_cb (GtkWidget *entry, GdkEventKey *event, EphyLocationEntry *w)
@@ -428,7 +455,6 @@ ephy_location_entry_key_press_event_cb (GtkWidget *entry, GdkEventKey *event, Ep
case GDK_Page_Up:
case GDK_Page_Down:
ephy_location_entry_autocompletion_hide_alternatives (w);
- //ephy_embed_grab_focus (window->active_embed);
return FALSE;
case GDK_Tab:
{
@@ -479,7 +505,7 @@ ephy_location_entry_key_press_event_cb (GtkWidget *entry, GdkEventKey *event, Ep
ephy_location_entry_autocompletion_hide_alternatives (w);
if (p->before_completion)
{
- ephy_location_entry_set_location (w, p->before_completion);
+ real_entry_set_location (w, p->before_completion);
g_free (p->before_completion);
p->before_completion = NULL;
gtk_editable_set_position (GTK_EDITABLE (p->entry), -1);
@@ -487,6 +513,7 @@ ephy_location_entry_key_press_event_cb (GtkWidget *entry, GdkEventKey *event, Ep
}
break;
default:
+ w->priv->editing = TRUE;
ephy_location_entry_autocompletion_unselect_alternatives (w);
if ((event->string[0] > 32) && (event->string[0] < 126) &&
position_is_at_end (GTK_EDITABLE (entry)))
@@ -524,6 +551,8 @@ ephy_location_entry_activate_cb (GtkEntry *entry, EphyLocationEntry *w)
LOG ("In ephy_location_entry_activate_cb, activating %s", content)
+ w->priv->editing = FALSE;
+
g_signal_emit (w, EphyLocationEntrySignals[ACTIVATED], 0, target, content);
g_free (content);
}
@@ -558,11 +587,10 @@ void
ephy_location_entry_set_location (EphyLocationEntry *w,
const gchar *new_location)
{
- EphyLocationEntryPrivate *p = w->priv;
- int pos;
- gtk_editable_delete_text (GTK_EDITABLE (p->entry), 0, -1);
- gtk_editable_insert_text (GTK_EDITABLE (p->entry), new_location, g_utf8_strlen (new_location, -1),
- &pos);
+ if (!w->priv->editing)
+ {
+ real_entry_set_location (w, new_location);
+ }
}
gchar *
@@ -572,6 +600,15 @@ ephy_location_entry_get_location (EphyLocationEntry *w)
return location;
}
+static void
+ephy_location_entry_autocompletion_window_url_selected_cb (EphyAutocompletionWindow *aw,
+ const char *target,
+ int action,
+ EphyLocationEntry *w)
+{
+ real_entry_set_location (w, target);
+}
+
void
ephy_location_entry_set_autocompletion (EphyLocationEntry *w,
EphyAutocompletion *ac)
@@ -598,6 +635,10 @@ ephy_location_entry_set_autocompletion (EphyLocationEntry *w,
G_CALLBACK (ephy_location_entry_autocompletion_window_url_activated_cb),
w);
+ g_signal_connect (p->autocompletion_window, "selected",
+ G_CALLBACK (ephy_location_entry_autocompletion_window_url_selected_cb),
+ w);
+
g_signal_connect (p->autocompletion_window, "hidden",
G_CALLBACK (ephy_location_entry_autocompletion_window_hidden_cb),
w);
@@ -627,7 +668,7 @@ ephy_location_entry_autocompletion_window_url_activated_cb (EphyAutocompletionWi
}
else
{
- ephy_location_entry_set_location (w, target);
+ real_entry_set_location (w, target);
}
content = gtk_editable_get_chars (GTK_EDITABLE(w->priv->entry), 0, -1);
@@ -666,6 +707,19 @@ ephy_location_entry_autocompletion_window_hidden_cb (EphyAutocompletionWindow *a
}
void
+ephy_location_entry_edit (EphyLocationEntry *w)
+{
+ GtkWidget *toplevel;
+
+ w->priv->editing = TRUE;
+
+ toplevel = gtk_widget_get_toplevel (w->priv->entry);
+
+ gtk_window_set_focus (GTK_WINDOW(toplevel),
+ w->priv->entry);
+}
+
+void
ephy_location_entry_activate (EphyLocationEntry *w)
{
GtkWidget *toplevel;
diff --git a/lib/widgets/ephy-location-entry.h b/lib/widgets/ephy-location-entry.h
index c56a25cc7..5a7014bae 100644
--- a/lib/widgets/ephy-location-entry.h
+++ b/lib/widgets/ephy-location-entry.h
@@ -70,6 +70,7 @@ gchar *ephy_location_entry_get_location (EphyLocationEntry *w);
void ephy_location_entry_set_autocompletion (EphyLocationEntry *w,
EphyAutocompletion *ac);
void ephy_location_entry_activate (EphyLocationEntry *w);
+void ephy_location_entry_edit (EphyLocationEntry *w);
void ephy_location_entry_clear_history (EphyLocationEntry *w);
#endif
diff --git a/src/ephy-shell.c b/src/ephy-shell.c
index eae78784b..9dfccb49f 100644
--- a/src/ephy-shell.c
+++ b/src/ephy-shell.c
@@ -31,6 +31,7 @@
#include "ephy-thread-helpers.h"
#include "ephy-bookmarks-import.h"
#include "ephy-debug.h"
+#include "toolbar.h"
#include <string.h>
#include <libgnomeui/gnome-client.h>
@@ -448,10 +449,10 @@ ephy_shell_get_active_window (EphyShell *gs)
**/
EphyTab *
ephy_shell_new_tab (EphyShell *shell,
- EphyWindow *parent_window,
- EphyTab *previous_tab,
- const char *url,
- EphyNewTabFlags flags)
+ EphyWindow *parent_window,
+ EphyTab *previous_tab,
+ const char *url,
+ EphyNewTabFlags flags)
{
EphyWindow *window;
EphyTab *tab;
@@ -493,11 +494,15 @@ ephy_shell_new_tab (EphyShell *shell,
if (flags & EPHY_NEW_TAB_HOMEPAGE)
{
+ Toolbar *toolbar;
char *homepage;
homepage = build_homepage_url (shell, previous_embed);
g_assert (homepage != NULL);
+ toolbar = ephy_window_get_toolbar (window);
+ toolbar_edit_location (toolbar);
+
ephy_embed_load_url (embed, homepage);
g_free (homepage);
diff --git a/src/ephy-window.c b/src/ephy-window.c
index a1d29a28b..11ebc7d15 100644
--- a/src/ephy-window.c
+++ b/src/ephy-window.c
@@ -421,6 +421,11 @@ add_widget (EggMenuMerge *merge, GtkWidget *widget, EphyWindow *window)
}
else
{
+ GtkWidget *event_box;
+
+ event_box = gtk_event_box_new ();
+ gtk_container_add (GTK_CONTAINER (event_box), widget);
+ widget = event_box;
window->priv->toolbars = g_list_append
(window->priv->toolbars, widget);
}
diff --git a/src/toolbar.c b/src/toolbar.c
index 7eb0ee1ad..690edc1b7 100755
--- a/src/toolbar.c
+++ b/src/toolbar.c
@@ -405,6 +405,22 @@ toolbar_new (EphyWindow *window)
}
void
+toolbar_edit_location (Toolbar *t)
+{
+ EggAction *action;
+ GtkWidget *location;
+
+ action = egg_action_group_get_action
+ (t->priv->action_group, "Location");
+ location = ephy_location_action_get_widget
+ (EPHY_LOCATION_ACTION (action));
+ g_return_if_fail (location != NULL);
+
+ ephy_location_entry_edit
+ (EPHY_LOCATION_ENTRY(location));
+}
+
+void
toolbar_activate_location (Toolbar *t)
{
EggAction *action;
diff --git a/src/toolbar.h b/src/toolbar.h
index ac98f94c4..0aa096e41 100644
--- a/src/toolbar.h
+++ b/src/toolbar.h
@@ -61,6 +61,8 @@ char *toolbar_get_location (Toolbar *t);
void toolbar_set_location (Toolbar *t,
const char *location);
+void toolbar_edit_location (Toolbar *t);
+
void toolbar_activate_location (Toolbar *t);
void toolbar_clear_location_history (Toolbar *t);