svnno****@sourc*****
svnno****@sourc*****
Fri Oct 5 14:47:06 JST 2007
Revision: 3272 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=kazehakase&view=rev&rev=3272 Author: ikezoe Date: 2007-10-05 14:47:06 +0900 (Fri, 05 Oct 2007) Log Message: ----------- * src/kz-window.c, src/kz-notebook.[ch]: tab_tree is moved into KzNotebook. Modified Paths: -------------- kazehakase/trunk/ChangeLog kazehakase/trunk/src/kz-notebook.c kazehakase/trunk/src/kz-notebook.h kazehakase/trunk/src/kz-window.c Modified: kazehakase/trunk/ChangeLog =================================================================== --- kazehakase/trunk/ChangeLog 2007-10-05 05:19:49 UTC (rev 3271) +++ kazehakase/trunk/ChangeLog 2007-10-05 05:47:06 UTC (rev 3272) @@ -2,6 +2,8 @@ * src/kz-window.c: Fix "Gtk-CRITICAL **: gtk_selection_data_set: assertion `length <= 0' failed" + * src/kz-window.c, src/kz-notebook.[ch]: tab_tree is moved into + KzNotebook. 2007-10-04 Hiroyuki Ikezoe <poinc****@ikezo*****> Modified: kazehakase/trunk/src/kz-notebook.c =================================================================== --- kazehakase/trunk/src/kz-notebook.c 2007-10-05 05:19:49 UTC (rev 3271) +++ kazehakase/trunk/src/kz-notebook.c 2007-10-05 05:47:06 UTC (rev 3272) @@ -42,6 +42,7 @@ /* tabs */ GList *open_hist; GList *view_hist; + GNode *tab_tree; GtkWidget *dragged_page; }; @@ -132,6 +133,8 @@ priv->kz = NULL; priv->open_hist = NULL; priv->view_hist = NULL; + priv->tab_tree = NULL; + priv->dragged_page = NULL; g_signal_connect(notebook, "page-reordered", @@ -462,12 +465,49 @@ kz_notebook_open_new_tab (KzNotebook *notebook, KzEmbed *embed, KzTabLabel *label) { gint pos; + GNode *node; + KzNotebookPrivate *priv = KZ_NOTEBOOK_GET_PRIVATE(notebook); pos = get_insert_tab_position(notebook); - return kz_notebook_open_new_tab_at_pos(notebook, embed, label, pos); + pos = kz_notebook_open_new_tab_at_pos(notebook, embed, label, pos); + + /* root node */ + if (!priv->tab_tree) + priv->tab_tree = g_node_new(NULL); + /* insret node */ + node = g_node_new(embed); + g_node_append(priv->tab_tree, node); + + return pos; } +gint +kz_notebook_open_new_tab_with_parent (KzNotebook *notebook, KzEmbed *embed, KzTabLabel *label, KzEmbed *parent) +{ + gint pos; + GNode *node, *parent_node; + KzNotebookPrivate *priv = KZ_NOTEBOOK_GET_PRIVATE(notebook); + + pos = get_insert_tab_position(notebook); + + pos = kz_notebook_open_new_tab_at_pos(notebook, embed, label, pos); + + /* root node */ + if (!priv->tab_tree) + priv->tab_tree = g_node_new(NULL); + /* insret node */ + node = g_node_new(embed); + parent_node = g_node_find(priv->tab_tree, + G_IN_ORDER, G_TRAVERSE_ALL, parent); + if (parent_node) + g_node_append(parent_node, node); + else + g_node_append(priv->tab_tree, node); + + return pos; +} + gboolean kz_notebook_close_tab (KzNotebook *notebook, GtkWidget *widget) { @@ -476,6 +516,7 @@ GtkWidget *next = NULL; KzNotebookPrivate *priv = KZ_NOTEBOOK_GET_PRIVATE(notebook); KzWindow *kz = priv->kz; + GNode *node, *child; GtkWidget *current = gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook))); kztab = KZ_TAB_LABEL(gtk_notebook_get_tab_label(GTK_NOTEBOOK(notebook), @@ -538,6 +579,22 @@ CLOSE_TAB: priv->view_hist = g_list_remove(priv->view_hist, widget); + node = g_node_find(priv->tab_tree, + G_IN_ORDER, G_TRAVERSE_ALL, widget); + if (node) + { + /* move children */ + child = g_node_first_child(node); + while (child) + { + GNode *next = g_node_next_sibling(child); + g_node_unlink(child); + g_node_append(priv->tab_tree, child); + child = next; + } + + g_node_destroy(node); + } gtk_widget_destroy(widget); if (kz && gtk_notebook_get_n_pages(GTK_NOTEBOOK(notebook)) == 0) @@ -591,6 +648,7 @@ { KzTabLabel *new_kztab; KzNotebookPrivate *dest_priv, *src_priv; + GNode *node, *child; /* create new tab label */ dest_priv = KZ_NOTEBOOK_GET_PRIVATE(dest_notebook); @@ -613,6 +671,32 @@ widget); dest_priv->open_hist = g_list_prepend(dest_priv->open_hist, widget); + /* move tab tree */ + node = g_node_find(src_priv->tab_tree, + G_IN_ORDER, G_TRAVERSE_ALL, widget); + if (node) + { + /* move children */ + child = g_node_first_child(node); + while (child) + { + GNode *next = g_node_next_sibling(child); + g_node_unlink(child); + g_node_append(src_priv->tab_tree, + child); + child = next; + } + + /* move node */ + g_node_unlink(node); + if (!dest_priv->tab_tree) + dest_priv->tab_tree = g_node_new(NULL); + g_node_append(dest_priv->tab_tree, node); + } + else + { + g_warning("KzWindow: cannot find tab node!"); + } return TRUE; } @@ -777,3 +861,9 @@ return KZ_NOTEBOOK_GET_PRIVATE(notebook)->dragged_page; } +GNode * +kz_notebook_get_tree (KzNotebook *notebook) +{ + return KZ_NOTEBOOK_GET_PRIVATE(notebook)->tab_tree; +} + Modified: kazehakase/trunk/src/kz-notebook.h =================================================================== --- kazehakase/trunk/src/kz-notebook.h 2007-10-05 05:19:49 UTC (rev 3271) +++ kazehakase/trunk/src/kz-notebook.h 2007-10-05 05:47:06 UTC (rev 3272) @@ -39,6 +39,11 @@ gint kz_notebook_open_new_tab (KzNotebook *notebook, KzEmbed *embed, KzTabLabel *label); +gint kz_notebook_open_new_tab_with_parent + (KzNotebook *notebook, + KzEmbed *embed, + KzTabLabel *label, + KzEmbed *parent); gint kz_notebook_open_new_tab_at_pos (KzNotebook *notebook, KzEmbed *embed, KzTabLabel *label, @@ -69,6 +74,7 @@ KzTabLabel *kz_notebook_get_sibling_tab_label (KzNotebook *notebook, KzTabLabel *label); GtkWidget *kz_notebook_get_dragged_page (KzNotebook *notebook); +GNode *kz_notebook_get_tree (KzNotebook *notebook); G_END_DECLS Modified: kazehakase/trunk/src/kz-window.c =================================================================== --- kazehakase/trunk/src/kz-window.c 2007-10-05 05:19:49 UTC (rev 3271) +++ kazehakase/trunk/src/kz-window.c 2007-10-05 05:47:06 UTC (rev 3272) @@ -84,7 +84,6 @@ /* sidebar */ gboolean sidebar_was_shown; - GNode *tab_tree; }; #define KZ_WINDOW_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), KZ_TYPE_WINDOW, KzWindowPrivate)) @@ -108,12 +107,23 @@ {KZ_SHIFT_KEY,"shift"}, }; +enum { + TARGET_TEXT_URI_LIST=999 +}; + static gboolean key_theme_is_emacs = FALSE; static gboolean delete_event (GtkWidget *widget, GdkEventAny *event); static gboolean key_press_event(GtkWidget *widget, GdkEventKey *event); +static void drag_data_received + (GtkWidget *widget, + GdkDragContext *context, + gint x, gint y, + GtkSelectionData *data, + guint info, + guint time); static void destroy (GtkObject *object); static void kz_window_append_tab (KzWindow *kz, @@ -306,8 +316,9 @@ object_class->destroy = destroy; /* GtkWidget signals */ - widget_class->delete_event = delete_event; - widget_class->key_press_event = key_press_event; + widget_class->delete_event = delete_event; + widget_class->key_press_event = key_press_event; + widget_class->drag_data_received = drag_data_received; /* KzWindow signals */ klass->append_tab = kz_window_append_tab; @@ -412,8 +423,6 @@ priv->sidebar_was_shown = FALSE; - priv->tab_tree = NULL; - kz->tabs = kz_bookmark_pure_folder_new(); kz->closed_tabs = kz_bookmark_pure_folder_new(); kz->history_search = kz_bookmark_pure_folder_new(); @@ -565,6 +574,8 @@ gtk_widget_show(kz->statusbar); } + gtk_drag_dest_add_uri_targets(GTK_WIDGET(kz)); + /* from Galeon-1.3.18 */ /* initialize the listener for the key theme */ settings = gtk_settings_get_default(); @@ -827,13 +838,10 @@ { KzEmbed *kzembed; KzTabLabel *kztab, *sibtab; - GNode *node, *parent_node; - KzWindowPrivate *priv; g_return_val_if_fail(KZ_IS_WINDOW(kz), NULL); if (url) g_return_val_if_fail(g_utf8_validate(url, strlen(url), NULL), NULL); - priv = KZ_WINDOW_GET_PRIVATE(kz); kzembed = kz_window_create_embed(kz); kztab = KZ_TAB_LABEL(kz_tab_label_new(kz, kzembed)); @@ -849,19 +857,6 @@ kz_window_set_embed_callbacks(kz, kzembed); - /* root node */ - if (!priv->tab_tree) - priv->tab_tree = g_node_new(NULL); - - /* insret node */ - node = g_node_new(kzembed); - parent_node = g_node_find(priv->tab_tree, - G_IN_ORDER, G_TRAVERSE_ALL, parent); - if (parent_node) - g_node_append(parent_node, node); - else - g_node_append(priv->tab_tree, node); - g_signal_emit(kz, kz_window_signals[APPEND_TAB_SIGNAL], 0, kzembed, parent); @@ -892,7 +887,6 @@ { KzEmbed *kzembed; KzTabLabel *kztab; - GNode *node; KzBookmark *child; kzembed = kz_window_create_embed(kz); kztab = KZ_TAB_LABEL(kz_tab_label_new(kz, kzembed)); @@ -903,15 +897,6 @@ kz_notebook_open_new_tab_at_pos(KZ_NOTEBOOK(kz->notebook), kzembed, kztab, -1); kz_window_set_embed_callbacks(kz, kzembed); kz_tab_label_set_history(kztab, child); - - /* root node */ - if (!priv->tab_tree) - priv->tab_tree = g_node_new(NULL); - - /* insret node */ - node = g_node_new(kzembed); - g_node_append(priv->tab_tree, node); - } g_list_free(childtabs); @@ -954,16 +939,11 @@ GtkWidget *label; KzEmbed *kzembed; KzTabLabel *new_kztab; - GNode *node, *child; - KzWindowPrivate *dest_priv, *src_priv; g_return_if_fail(KZ_IS_WINDOW(src_kz)); g_return_if_fail(KZ_IS_WINDOW(dest_kz)); g_return_if_fail(KZ_IS_EMBED(widget)); - dest_priv = KZ_WINDOW_GET_PRIVATE(dest_kz); - src_priv = KZ_WINDOW_GET_PRIVATE(src_kz); - src_notebook = GTK_NOTEBOOK(src_kz->notebook); dest_notebook = GTK_NOTEBOOK(dest_kz->notebook); @@ -989,39 +969,35 @@ kz_bookmark_prepend(dest_kz->tabs, new_kztab->history); kz_window_set_embed_callbacks(dest_kz, kzembed); - /* move tab tree */ - node = g_node_find(src_priv->tab_tree, - G_IN_ORDER, G_TRAVERSE_ALL, widget); - if (node) + g_signal_emit(src_kz, + kz_window_signals[REMOVE_TAB_SIGNAL], + 0, kzembed); + g_signal_emit(dest_kz, + kz_window_signals[APPEND_TAB_SIGNAL], + 0, kzembed, NULL); +} + + +static void +drag_data_received (GtkWidget *widget, + GdkDragContext *context, + gint x, gint y, + GtkSelectionData *seldata, + guint info, + guint time) +{ + if (seldata->target == gdk_atom_intern_static_string("text/uri-list")) { - /* move children */ - child = g_node_first_child(node); - while (child) - { - GNode *next = g_node_next_sibling(child); - g_node_unlink(child); - g_node_append(src_priv->tab_tree, - child); - child = next; - } + KzWindow *kz = KZ_WINDOW(widget); + gchar **strings; - /* move node */ - g_node_unlink(node); - if (!dest_priv->tab_tree) - dest_priv->tab_tree = g_node_new(NULL); - g_node_append(dest_priv->tab_tree, node); - - g_signal_emit(src_kz, - kz_window_signals[REMOVE_TAB_SIGNAL], - 0, kzembed); - g_signal_emit(dest_kz, - kz_window_signals[APPEND_TAB_SIGNAL], - 0, kzembed, NULL); + if (seldata->length < 0) return; + + strings = g_strsplit((const gchar*)seldata->data, "\n", 2); + kz_window_open_new_tab(kz, strings[0]); + g_strfreev(strings); + gtk_drag_finish(context, TRUE, FALSE, time); } - else - { - g_warning("KzWindow: cannot find tab node!"); - } } @@ -1664,7 +1640,7 @@ kz_window_get_tree (KzWindow *kz) { g_return_val_if_fail(KZ_IS_WINDOW(kz), NULL); - return KZ_WINDOW_GET_PRIVATE(kz)->tab_tree; + return kz_notebook_get_tree(KZ_NOTEBOOK(kz->notebook)); } void @@ -2151,12 +2127,8 @@ cb_embed_close_tab (GtkObject *obj, KzWindow *kz) { KzEmbed *kzembed; - GNode *node, *child; - KzWindowPrivate *priv; g_return_if_fail(KZ_IS_WINDOW(kz)); - priv = KZ_WINDOW_GET_PRIVATE(kz); - g_return_if_fail(priv->tab_tree); kzembed = KZ_EMBED(obj); @@ -2166,22 +2138,6 @@ kz_notebook_close_tab(KZ_NOTEBOOK(kz->notebook), GTK_WIDGET(obj)); kz_statusbar_set_link_text(KZ_STATUSBAR(kz->statusbar), NULL); - node = g_node_find(priv->tab_tree, - G_IN_ORDER, G_TRAVERSE_ALL, kzembed); - /* probably destroy handler is already called */ - if (!node) return; - - /* move children */ - child = g_node_first_child(node); - while (child) - { - GNode *next = g_node_next_sibling(child); - g_node_unlink(child); - g_node_append(priv->tab_tree, child); - child = next; - } - - g_node_destroy(node); g_signal_emit(kz, kz_window_signals[REMOVE_TAB_SIGNAL], 0, kzembed); }