View Issue Details

IDProjectCategoryView StatusLast Update
0001759gnunet-gtkgnunet-fs-gtkpublic2011-12-26 22:28
ReporterChristian Grothoff Assigned ToLRN  
PrioritylowSeverityminorReproducibilityN/A
Status closedResolutionfixed 
Product Version0.9.0 
Target Version0.9.1Fixed in Version0.9.1 
Summary0001759: gtk_dialog_run is bad as it stops the GNUnet scheduler loop as well
DescriptionWe should replace all calls to it by non-modal dialogs.

As a first step, the globals (builder in particular!) in the respective source files must be de-globalized, since we can then get two windows of the same type open at the same time (!).

Additional advantage: ability to have multiple search/publish dialogs open at the same time!
TagsNo tags attached.

Relationships

child of 0001966 closedLRN GUI master-issue 

Activities

LRN

2011-12-07 15:08

developer  

0001-Starting-to-get-rid-of-gtk_dialog_run-and-more.patch (28,072 bytes)   
From 03c7cc02504e2d4db2272ca664d773186e2fdb31 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?=
 =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Wed, 7 Dec 2011 18:03:30 +0400
Subject: [PATCH] Starting to get rid of gtk_dialog_run(), and more

* Call AC_INIT() with different package name and tarball name
* Get version from VCS instead of hard-coding it in configure.ac
* Don't supply version to AM_INIT_AUTOMAKE
* Use silent rules
* Make a few GNUNET_FS_GTK_* AM variables to be used in .glade files
* Add contrib/gnunet_fs_gtk_about_window.glade.in
* GNUNET_GTK_display_about () doesn't take dialog name anymore
  (it should always be 'about_window' now)
* GNUNET_GTK_get_new_builder () now passes the builder as a callback
  argument
* about.c now implements most of the things that were previously done
  by GtkAboutDialog.
---
 configure.ac                                |   10 +-
 contrib/Makefile.am                         |    3 +-
 contrib/get_version.sh                      |   34 +++
 contrib/gnunet_fs_gtk_about_window.glade.in |  364 +++++++++++++++++++++++++++
 src/fs/gnunet-fs-gtk-about.c                |    3 +-
 src/include/gnunet_gtk.h                    |    3 +-
 src/lib/about.c                             |  117 +++++++++-
 src/lib/glade.c                             |    2 +-
 src/peerinfo/gnunet-peerinfo-gtk-about.c    |    3 +-
 9 files changed, 527 insertions(+), 12 deletions(-)
 create mode 100644 contrib/get_version.sh
 create mode 100644 contrib/gnunet_fs_gtk_about_window.glade.in

diff --git a/configure.ac b/configure.ac
index 4e3e11a..cd64cf4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -20,8 +20,8 @@
 # Process this file with autoconf to produce a configure script.
 #
 AC_PREREQ(2.61)
-AC_INIT([gnunet-gtk],[0.9.0],[bug-gnunet@gnu.org])
-AM_INIT_AUTOMAKE([gnunet-gtk], [0.9.0])
+AC_INIT([GNUnet GTK],m4_esyscmd([contrib/get_version.sh .version | tr -d '\n']),[bug-gnunet@gnu.org],[gnunet-gtk])
+AM_INIT_AUTOMAKE([silent-rules])
 AM_CONFIG_HEADER(gnunet_gtk_config.h)
 
 AH_TOP([#define _GNU_SOURCE  1])
@@ -357,6 +357,11 @@ AC_DEFINE_DIR([PACKAGE_DATA], [datarootdir], [The directory for installing read-
 packagesrcdir=`cd $srcdir && pwd`
 AC_DEFINE_UNQUOTED(PACKAGE_SOURCE_DIR, "${packagesrcdir}", [source dir])
 
+AC_SUBST(GNUNET_FS_GTK_NAME, $PACKAGE_NAME, [name of the program])
+AC_SUBST(GNUNET_FS_GTK_VERSION3, $PACKAGE_VERSION, [version of the program])
+AC_SUBST(GNUNET_FS_GTK_YEARFROM, [2010], [year of the first release])
+AC_SUBST(GNUNET_FS_GTK_YEARTO, [$(date | sed -e 's/.* \([[[:digit:]]]\+\)$/\1/')], [year of the most current release])
+
 AC_OUTPUT([
 Makefile
 contrib/Makefile
@@ -373,4 +378,5 @@ po/Makefile.in
 po/Makefile
 gnunet-fs-gtk.desktop
 gnunet-setup.desktop
+contrib/gnunet_fs_gtk_about_window.glade
 ])
diff --git a/contrib/Makefile.am b/contrib/Makefile.am
index c79d3fd..606eeba 100644
--- a/contrib/Makefile.am
+++ b/contrib/Makefile.am
@@ -34,7 +34,8 @@ pkgdata_DATA = \
   gnunet_peerinfo_gtk_main_window.glade \
   gnunet_statistics_gtk_about_dialog.glade \
   gnunet_statistics_gtk_main_window.glade \
-  gnunet_setup_gtk_main_window.glade 
+  gnunet_setup_gtk_main_window.glade \
+  gnunet_fs_gtk_about_window.glade
 
 install-data-local:
 	$(mkinstalldirs) $(DESTDIR)$(pkgpixdir)
diff --git a/contrib/get_version.sh b/contrib/get_version.sh
new file mode 100644
index 0000000..7c64dee
--- /dev/null
+++ b/contrib/get_version.sh
@@ -0,0 +1,34 @@
+#!/bin/sh
+# Gets the version number from VCS, or from the contents of the file $1
+version=
+if test -f "$1"
+then
+  version=$(cat $1)
+fi
+if test "x$version" = "x" -a -d "./.git"
+then
+  version=$(git svn info | grep "Revision: [[:digit:]]\+" | sed -e 's/Revision: //')
+  if test "x$version" = "x"
+  then
+    version=$(git log -1 | grep 'commit [a-f0-9]\+' | sed -e 's/commit //')
+    if test ! "x$version" = "x"
+    then
+      version="git-$version"
+    fi
+  else
+    version="r$version"
+  fi
+fi
+if test "x$version" = "x" -a -d "./.svn"
+then
+  version=$(svn info | grep "Revision: [[:digit:]]\+" | sed -e 's/Revision: //')
+  if test ! "x$version" = "x"
+  then
+    version="r$version"
+  fi
+fi
+if test "x$version" = "x"
+then
+  version="unknown"
+fi
+echo $version
diff --git a/contrib/gnunet_fs_gtk_about_window.glade.in b/contrib/gnunet_fs_gtk_about_window.glade.in
new file mode 100644
index 0000000..f214ca9
--- /dev/null
+++ b/contrib/gnunet_fs_gtk_about_window.glade.in
@@ -0,0 +1,364 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <requires lib="gtk+" version="2.24"/>
+  <!-- interface-naming-policy project-wide -->
+  <object class="GtkWindow" id="about_window">
+    <property name="can_focus">False</property>
+    <property name="modal">True</property>
+    <property name="destroy_with_parent">True</property>
+    <signal name="destroy-event" handler="GNUNET_GTK_about_window_got_destroy_event" swapped="no"/>
+    <signal name="frame-event" handler="GNUNET_GTK_about_window_got_frame_event" swapped="no"/>
+    <signal name="realize" handler="GNUNET_GTK_about_window_realized" swapped="no"/>
+    <signal name="delete-event" handler="GNUNET_GTK_about_window_got_delete_event" swapped="no"/>
+    <child>
+      <object class="GtkVBox" id="about_main_vbox">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="border_width">10</property>
+        <child>
+          <object class="GtkImage" id="about_logo_image">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="pixbuf">gnunet_logo.png</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="about_name_version_label">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label">@GNUNET_FS_GTK_NAME@ @GNUNET_FS_GTK_VERSION3@</property>
+            <attributes>
+              <attribute name="weight" value="bold"/>
+              <attribute name="size" value="200"/>
+            </attributes>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="about_copyright_label">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label">(C) @GNUNET_FS_GTK_YEARFROM@-@GNUNET_FS_GTK_YEARTO@ The GNUnet Project</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="about_link_label">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label">&lt;a href="https://gnunet.org/"&gt;GNUnet: GNU's Framework for Secure P2P Networking&lt;/a&gt;</property>
+            <property name="use_markup">True</property>
+            <property name="wrap">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkNotebook" id="about_credits_notebook">
+            <property name="can_focus">True</property>
+            <child>
+              <object class="GtkScrolledWindow" id="about_credits_authors_scroller">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hscrollbar_policy">automatic</property>
+                <property name="vscrollbar_policy">automatic</property>
+                <child>
+                  <object class="GtkTextView" id="about_credits_authors_textview">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="editable">False</property>
+                    <property name="wrap_mode">word</property>
+                    <property name="cursor_visible">False</property>
+                    <property name="buffer">credits_authors_contents</property>
+                    <property name="accepts_tab">False</property>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="about_credits_authors_tab">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Developed by</property>
+              </object>
+              <packing>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkScrolledWindow" id="about_credits_docs_scroller">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hscrollbar_policy">automatic</property>
+                <property name="vscrollbar_policy">automatic</property>
+                <child>
+                  <object class="GtkTextView" id="about_credits_docs_textview">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="editable">False</property>
+                    <property name="wrap_mode">word</property>
+                    <property name="cursor_visible">False</property>
+                    <property name="buffer">credits_docs_contents</property>
+                    <property name="accepts_tab">False</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="about_credits_docs_tab">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Documented by</property>
+              </object>
+              <packing>
+                <property name="position">1</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkScrolledWindow" id="about_credits_trans_scroller">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hscrollbar_policy">automatic</property>
+                <property name="vscrollbar_policy">automatic</property>
+                <child>
+                  <object class="GtkTextView" id="about_credits_trans_textview">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="editable">False</property>
+                    <property name="wrap_mode">word</property>
+                    <property name="cursor_visible">False</property>
+                    <property name="buffer">credits_trans_contents</property>
+                    <property name="accepts_tab">False</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="about_credits_trans_tab">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Translated by</property>
+              </object>
+              <packing>
+                <property name="position">2</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkScrolledWindow" id="about_credits_art_scroller">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hscrollbar_policy">automatic</property>
+                <property name="vscrollbar_policy">automatic</property>
+                <child>
+                  <object class="GtkTextView" id="about_credits_art_textview">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="editable">False</property>
+                    <property name="wrap_mode">word</property>
+                    <property name="cursor_visible">False</property>
+                    <property name="buffer">credits_art_contents</property>
+                    <property name="accepts_tab">False</property>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">3</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="about_credits_art_tab">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Artwork by</property>
+              </object>
+              <packing>
+                <property name="position">3</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">4</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkScrolledWindow" id="about_license_scroller">
+            <property name="can_focus">True</property>
+            <property name="hscrollbar_policy">automatic</property>
+            <property name="vscrollbar_policy">automatic</property>
+            <child>
+              <object class="GtkTextView" id="about_license_textview">
+                <property name="can_focus">True</property>
+                <property name="editable">False</property>
+                <property name="wrap_mode">word</property>
+                <property name="cursor_visible">False</property>
+                <property name="buffer">license_contents</property>
+                <property name="accepts_tab">False</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">5</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkHBox" id="about_buttons_hbox">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="border_width">5</property>
+            <property name="homogeneous">True</property>
+            <child>
+              <object class="GtkButton" id="about_credits_button">
+                <property name="label" translatable="yes">Credits</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_action_appearance">False</property>
+                <signal name="clicked" handler="GNUNET_GTK_about_credits_button_clicked" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="about_license_button">
+                <property name="label" translatable="yes">License</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_action_appearance">False</property>
+                <signal name="clicked" handler="GNUNET_GTK_about_license_button_clicked" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="about_close_button">
+                <property name="label">gtk-close</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_action_appearance">False</property>
+                <property name="use_stock">True</property>
+                <signal name="clicked" handler="GNUNET_GTK_about_close_button_clicked" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">False</property>
+                <property name="pack_type">end</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="pack_type">end</property>
+            <property name="position">6</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+  <object class="GtkTextBuffer" id="credits_art_contents">
+    <property name="text">Jakub 'jimmac' Steiner &lt;jimmac@ximian.org&gt;
+Christian Muellner &lt;chris@flop.de&gt;
+Alex Jones &lt;alexrjones@ntlworld.com&gt;
+Nicklas Larsson &lt;whybill@gmail.com&gt;
+</property>
+  </object>
+  <object class="GtkTextBuffer" id="credits_authors_contents">
+    <property name="text">Juergen Appel &lt;jappel@linux01.gwdg.de&gt;
+Krista Grothoff &lt;krista@grothoff.org&gt;
+James Blackwell &lt;jblack@linuxguru.net&gt;
+Ludovic Courtes &lt;ludo@chbouib.org&gt;
+Nils Durner &lt;durner@gnunet.org&gt;
+Renaldo Ferreira &lt;rf@cs.purdue.edu&gt;
+Christian Grothoff &lt;christian@grothoff.org&gt;
+Eric Haumant
+Tzvetan Horozov &lt;horozov@motorola.com&gt;
+Gerd Knorr &lt;kraxel@bytesex.org&gt;
+Werner Koch &lt;libgcrypt@g10code.com&gt;
+Uli Luckas &lt;luckas@musoft.de&gt;
+Blake Matheny
+Glenn McGrath
+Hendrik Pagenhardt &lt;Hendrik.Pagenhardt@gmx.net&gt;
+Ioana Patrascu &lt;ioanapatrascu@yahoo.com&gt;
+Marko Raeihae
+Paul Ruth &lt;ruth@cs.purdue.edu&gt;
+Risto Saarelma
+Antti Salonen
+Tiberius Stef &lt;tstef@cs.purdue.edu&gt;
+Tuomas Toivonen
+Tomi Tukiainen
+Kevin Vandersloot &lt;kfv101@psu.edu&gt;
+Simo Viitanen
+Larry Waldo
+Igor Wronsky &lt;iwronsky@users.sourceforge.net&gt;
+&lt;january@hushmail.com&gt;</property>
+  </object>
+  <object class="GtkTextBuffer" id="credits_docs_contents">
+    <property name="text">Christian Grothoff &lt;christian@grothoff.org&gt;
+Anders Carlsson &lt;andersca@gnu.org&gt;
+Nils Durner &lt;durner@gnunet.org&gt;
+Nicklas Larsson &lt;whybill@gmail.com&gt;
+Milan Bouchet-Valat &lt;nalimilan@club.fr&gt;
+Igor Wronsky &lt;iwronsky@users.sourceforge.net&gt;
+</property>
+  </object>
+  <object class="GtkTextBuffer" id="credits_trans_contents">
+    <property name="text">Di Ma
+Jens Palsberg &lt;palsberg@cs.ucla.edu&gt;
+Christian Grothoff &lt;christian@grothoff.org&gt;
+Nils Durner &lt;durner@gnunet.org&gt;
+Mathieu &lt;mollo@bghflt.org&gt;
+Eric Haumant
+milan@skoid.org
+Hiroshi Yamauchi &lt;yamauchi@cs.purdue.edu&gt;
+Adam Welc &lt;welc@cs.purdue.edu&gt;
+Bogdan Carbunar &lt;carbunar@cs.purdue.edu&gt;
+Steven Michael Murphy &lt;murf@e-tools.com&gt;
+Phan Vinh Thinh &lt;teppi82@gmail.com&gt;
+Daniel Nylander &lt;po@danielnylander.se&gt;
+</property>
+  </object>
+  <object class="GtkTextBuffer" id="license_contents">
+    <property name="text" translatable="yes">License should be loaded here at runtime from the license file (no need to copy the whole GPL in here...).</property>
+  </object>
+</interface>
diff --git a/src/fs/gnunet-fs-gtk-about.c b/src/fs/gnunet-fs-gtk-about.c
index 1ffdcca..4c7701b 100644
--- a/src/fs/gnunet-fs-gtk-about.c
+++ b/src/fs/gnunet-fs-gtk-about.c
@@ -34,8 +34,7 @@
 void
 GNUNET_GTK_main_menu_help_about_activate_cb (GtkWidget * dummy, gpointer data)
 {
-  GNUNET_GTK_display_about ("gnunet_fs_gtk_about_dialog.glade",
-                            "GNUNET_FS_GTK_about_dialog");
+  GNUNET_GTK_display_about ("gnunet_fs_gtk_about_window.glade");
 }
 
 
diff --git a/src/include/gnunet_gtk.h b/src/include/gnunet_gtk.h
index c567efb..a38e5d9 100644
--- a/src/include/gnunet_gtk.h
+++ b/src/include/gnunet_gtk.h
@@ -93,10 +93,9 @@ GNUNET_GTK_get_new_builder (const char *filename);
  * This displays an about dialog.
  *
  * @param dialogfile name of the glade file containing the dialog
- * @param dialogname name of the about dialog in the file
  */
 void
-GNUNET_GTK_display_about (const char *dialogfile, const char *dialogname);
+GNUNET_GTK_display_about (const char *dialogfile);
 
 
 
diff --git a/src/lib/about.c b/src/lib/about.c
index 095ce21..a41f6d0 100644
--- a/src/lib/about.c
+++ b/src/lib/about.c
@@ -26,6 +26,115 @@
  */
 #include "gnunet_gtk.h"
 
+static void
+destroy_about_dialog (GtkBuilder *builder)
+{
+  GtkWidget *ad;
+  ad = GTK_WIDGET (gtk_builder_get_object (builder, "about_window"));
+  gtk_widget_destroy (ad);
+  g_object_unref (G_OBJECT (builder));
+}
+
+static void
+about_window_show_exclusively (GtkBuilder *builder, gchar *name)
+{
+  GtkWidget *about_credits_notebook;
+  GtkWidget *about_license_textview;
+  GtkWidget *about_license_scroller;
+  about_credits_notebook = GTK_WIDGET (gtk_builder_get_object (builder, "about_credits_notebook"));
+  about_license_textview = GTK_WIDGET (gtk_builder_get_object (builder, "about_license_textview"));
+  about_license_scroller = GTK_WIDGET (gtk_builder_get_object (builder, "about_license_scroller"));
+  if (name == NULL)
+  {
+    gtk_widget_hide (about_credits_notebook);
+    gtk_widget_hide (about_license_textview);
+    gtk_widget_hide (about_license_scroller);
+  }
+  else if (strcmp ("about_credits_notebook", name) == 0)
+  {
+    gtk_widget_show (about_credits_notebook);
+    gtk_widget_hide (about_license_textview);
+    gtk_widget_hide (about_license_scroller);
+  }
+  else if (strcmp ("about_license_textview", name) == 0)
+  {
+    gtk_widget_show (about_license_textview);
+    gtk_widget_show (about_license_scroller);
+    gtk_widget_hide (about_credits_notebook);
+  }
+}
+
+G_MODULE_EXPORT gboolean
+GNUNET_GTK_about_window_got_frame_event (GtkWindow *window, GdkEvent *event,
+    gpointer user_data)
+{
+  GtkBuilder *builder = GTK_BUILDER (user_data);
+
+  switch (event->type)
+  {
+  case GDK_DELETE:
+    destroy_about_dialog (builder);
+    return TRUE;
+    break;
+  default:
+    return FALSE;
+  }
+}
+
+G_MODULE_EXPORT void
+GNUNET_GTK_about_window_realized (GtkWidget *widget, gpointer user_data)
+{
+  GtkBuilder *builder = GTK_BUILDER (user_data);
+  GtkTextBuffer *license_contents;
+  gchar *license = NULL;
+  license_contents = GTK_TEXT_BUFFER (gtk_builder_get_object (builder, "license_contents"));
+  if (g_file_get_contents ("COPYING", &license, NULL, NULL) && license != NULL)
+  {
+    gtk_text_buffer_set_text (license_contents, license, -1);
+    g_free (license);
+  }
+  about_window_show_exclusively (builder, NULL);
+}
+
+G_MODULE_EXPORT void
+GNUNET_GTK_about_close_button_clicked (GtkButton *widget, gpointer user_data)
+{
+  GtkBuilder *builder = GTK_BUILDER (user_data);
+  destroy_about_dialog (builder);
+}
+
+G_MODULE_EXPORT gboolean
+GNUNET_GTK_about_window_got_delete_event (GtkWidget *widget, GdkEvent *event,
+                                          gpointer user_data)
+{
+  GtkBuilder *builder = GTK_BUILDER (user_data);
+  destroy_about_dialog (builder);
+  return FALSE;
+}
+
+G_MODULE_EXPORT gboolean
+GNUNET_GTK_about_window_got_destroy_event (GtkWidget *widget, GdkEvent *event,
+                                          gpointer user_data)
+{
+  GtkBuilder *builder = GTK_BUILDER (user_data);
+  destroy_about_dialog (builder);
+  return FALSE;
+}
+
+G_MODULE_EXPORT void
+GNUNET_GTK_about_credits_button_clicked (GtkButton *widget, gpointer user_data)
+{
+  GtkBuilder *builder = GTK_BUILDER (user_data);
+  about_window_show_exclusively (builder, "about_credits_notebook");
+}
+
+G_MODULE_EXPORT void
+GNUNET_GTK_about_license_button_clicked (GtkButton *widget, gpointer user_data)
+{
+  GtkBuilder *builder = GTK_BUILDER (user_data);
+  about_window_show_exclusively (builder, "about_license_textview");
+}
+
 /**
  * This displays an about dialog.
  *
@@ -33,7 +142,7 @@
  * @param dialogname name of the about dialog in the file
  */
 void
-GNUNET_GTK_display_about (const char *dialogfile, const char *dialogname)
+GNUNET_GTK_display_about (const char *dialogfile)
 {
   GtkBuilder *builder;
   GtkWidget *ad;
@@ -41,10 +150,14 @@ GNUNET_GTK_display_about (const char *dialogfile, const char *dialogname)
   builder = GNUNET_GTK_get_new_builder (dialogfile);
   if (builder == NULL)
     return;
-  ad = GTK_WIDGET (gtk_builder_get_object (builder, dialogname));
+  ad = GTK_WIDGET (gtk_builder_get_object (builder, "about_window"));
+  g_object_set_data (G_OBJECT (ad), "gnunet-gtk-builder", builder);
+  gtk_widget_show (ad);
+  /*
   gtk_dialog_run (GTK_DIALOG (ad));
   gtk_widget_destroy (ad);
   g_object_unref (G_OBJECT (builder));
+  */
 }
 
 
diff --git a/src/lib/glade.c b/src/lib/glade.c
index 90c4649..4e5957c 100644
--- a/src/lib/glade.c
+++ b/src/lib/glade.c
@@ -84,7 +84,7 @@ GNUNET_GTK_get_new_builder (const char *filename)
     GNUNET_free (glade_path);
     return NULL;
   }
-  gtk_builder_connect_signals (ret, NULL);
+  gtk_builder_connect_signals (ret, ret);
   GNUNET_free (glade_path);
   return ret;
 }
diff --git a/src/peerinfo/gnunet-peerinfo-gtk-about.c b/src/peerinfo/gnunet-peerinfo-gtk-about.c
index 6899442..5eb9b40 100644
--- a/src/peerinfo/gnunet-peerinfo-gtk-about.c
+++ b/src/peerinfo/gnunet-peerinfo-gtk-about.c
@@ -35,8 +35,7 @@ void
 GNUNET_PEERINFO_GTK_main_menu_help_about_activate_cb (GtkWidget * dummy,
                                                       gpointer data)
 {
-  GNUNET_GTK_display_about ("gnunet_peerinfo_gtk_about_dialog.glade",
-                            "GNUNET_PEERINFO_GTK_about_dialog");
+  GNUNET_GTK_display_about ("gnunet_peerinfo_gtk_about_window.glade");
 }
 
 
-- 
1.7.4

LRN

2011-12-07 15:11

developer   ~0005018

Attached 0001-Starting-to-get-rid-of-gtk_dialog_run-and-more.patch
It re-implements GtkAboutDialog (or something that looks very much like it) without using gtk_dialog_run()
I also took the opportunity to make some changes in the buildsystem, such as pre-processing .glade files to put versions/dates/names into them, enabling silent rules and using non-deprecated automake macros.
Also, license text should now loaded at runtime (TODO: use absolute path to COPYING; it works for me only because i have COPYING in `bin' subdirectory) instead of being hard-coded into .glade file.

Christian Grothoff

2011-12-07 15:47

manager   ~0005019

I'm not sure your get_version.sh script is a good idea. What was wrong with having the version in configure.ac? Also, why do we need this G_MODULE_EXPORT stuff? Worked fine without before (at least on GNU/Linux...)

LRN

2011-12-07 16:02

developer   ~0005020

G_MODULE_EXPORT is recommended by gtk - http://developer.gnome.org/gtk/2.24/GtkBuilder.html#gtk-builder-connect-signals (actually, it's not required, even on W32, unless we're doing some special .def-related magic, which we don't)

get_version.sh - well, i thought it would be cool to make nightly or beta builds and have them have precise svn revision instead of 0.9.x . Several pieces of software i knew do that.

Obviously, since this is a patch attached to a Mantis issue, i'm ready to listen to any suggestions you or anyone else have (my patches that require little attention usually land into your inbox directly these days).

LRN

2011-12-07 19:58

developer   ~0005021

You can force version number by creating a ".version" file in top_srcdir and placing 0.9.0 (or whatever) in there. The file is not (and should not) be in VCS.

Christian Grothoff

2011-12-08 17:15

manager   ~0005025

0001-patch applied as SVN 18516.

LRN

2011-12-11 03:12

developer  

0004-New-search-bar-in-the-main-window.patch (66,445 bytes)   
From d044af68ba86eb0df8b8279242cc80a02d5f5e25 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?=
 =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Sun, 11 Dec 2011 05:52:19 +0400
Subject: [PATCH 4/6] New search bar in the main window

---
 contrib/gnunet_fs_gtk_main_window.glade         |  496 ++++++++++++++++++++---
 contrib/gnunet_fs_gtk_search_tab.glade          |  202 +++++----
 src/fs/gnunet-fs-gtk-main_window_view_toggles.c |    9 +
 src/fs/gnunet-fs-gtk.c                          |  323 +++++++++++++++
 4 files changed, 883 insertions(+), 147 deletions(-)

diff --git a/contrib/gnunet_fs_gtk_main_window.glade b/contrib/gnunet_fs_gtk_main_window.glade
index cb0b276..799c1b1 100644
--- a/contrib/gnunet_fs_gtk_main_window.glade
+++ b/contrib/gnunet_fs_gtk_main_window.glade
@@ -1,55 +1,119 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
-  <requires lib="gtk+" version="2.20"/>
+  <requires lib="gtk+" version="2.24"/>
   <!-- interface-naming-policy project-wide -->
-  <object class="GtkImage" id="image5">
+  <object class="GtkListStore" id="GNUNET_GTK_meta_data_list_store">
+    <columns>
+      <!-- column-name extractor_meta_type -->
+      <column type="guint"/>
+      <!-- column-name extractor_meta_format -->
+      <column type="guint"/>
+      <!-- column-name extractor_meta_type_string -->
+      <column type="gchararray"/>
+      <!-- column-name extracotr_meta_value -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkImage" id="image2">
     <property name="visible">True</property>
-    <property name="stock">gtk-go-down</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-go-up</property>
+  </object>
+  <object class="GtkImage" id="image3">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-new</property>
   </object>
   <object class="GtkImage" id="image4">
     <property name="visible">True</property>
+    <property name="can_focus">False</property>
     <property name="stock">gtk-find</property>
   </object>
-  <object class="GtkImage" id="image1">
+  <object class="GtkImage" id="image5">
     <property name="visible">True</property>
-    <property name="stock">gtk-open</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-go-down</property>
   </object>
-  <object class="GtkImage" id="image3">
+  <object class="GtkImage" id="image6">
     <property name="visible">True</property>
-    <property name="stock">gtk-new</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-index</property>
   </object>
-  <object class="GtkImage" id="image2">
-    <property name="visible">True</property>
-    <property name="stock">gtk-go-up</property>
+  <object class="GtkListStore" id="main_window_search_anonymity_liststore">
+    <columns>
+      <!-- column-name Name -->
+      <column type="gchararray"/>
+      <!-- column-name Level -->
+      <column type="guint"/>
+      <!-- column-name Color -->
+      <column type="gchararray"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0" translatable="yes">None</col>
+        <col id="1">0</col>
+        <col id="2" translatable="yes">#AAAA00000000</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">Normal</col>
+        <col id="1">1</col>
+        <col id="2" translatable="yes">#000000000000</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">Paranoid</col>
+        <col id="1">10</col>
+        <col id="2" translatable="yes">#0000AAAA0000</col>
+      </row>
+    </data>
   </object>
   <object class="GtkWindow" id="GNUNET_GTK_main_window">
+    <property name="can_focus">False</property>
     <property name="title" translatable="yes">gnunet-fs-gtk</property>
     <property name="window_position">center</property>
     <property name="default_width">700</property>
     <property name="default_height">500</property>
     <property name="icon_name">gnunet-gtk</property>
     <signal name="delete-event" handler="GNUNET_GTK_quit_cb" after="yes" swapped="no"/>
+    <signal name="realize" handler="GNUNET_GTK_main_window_realize_cb" swapped="no"/>
     <child>
       <object class="GtkVBox" id="GNUNET_GTK_main_window_vbox">
         <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <child>
+          <object class="GtkStatusbar" id="GNUNET_GTK_status_bar">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="spacing">2</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
         <child>
           <object class="GtkMenuBar" id="GNUNET_GTK_main_menu">
             <property name="visible">True</property>
+            <property name="can_focus">False</property>
             <child>
               <object class="GtkMenuItem" id="GNUNET_GTK_main_menu_file_sharing">
-                <property name="visible">True</property>
                 <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <property name="label" translatable="yes">_File sharing</property>
                 <property name="use_underline">True</property>
                 <child type="submenu">
                   <object class="GtkMenu" id="GNUNET_GTK_main_menu_file_sharing_box">
                     <property name="visible">True</property>
+                    <property name="can_focus">False</property>
                     <child>
                       <object class="GtkImageMenuItem" id="GNUNET_GTK_main_menu_file_create_pseudonym">
                         <property name="label" translatable="yes">_Create pseudonym</property>
+                        <property name="use_action_appearance">False</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Create a pseudonym for publishing content.  Note that you can also publish content anonymously (without using a pseudonym).</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="accel_path">&lt;gnunet-fs-gtk&gt;/File sharing/Create pseudonym</property>
                         <property name="use_underline">True</property>
                         <property name="image">image3</property>
@@ -61,8 +125,9 @@
                     <child>
                       <object class="GtkImageMenuItem" id="GNUNET_GTK_main_menu_file_advertise_pseudonym">
                         <property name="label" translatable="yes">_Advertise Pseudonym</property>
-                        <property name="visible">True</property>
                         <property name="use_action_appearance">False</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
                         <property name="image">image6</property>
                         <property name="use_stock">False</property>
@@ -72,9 +137,10 @@
                     <child>
                       <object class="GtkImageMenuItem" id="GNUNET_GTK_main_menu_file_publish">
                         <property name="label" translatable="yes">_Publish</property>
+                        <property name="use_action_appearance">False</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Publish files or directories on GNUnet</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="accel_path">&lt;gnunet-fs-gtk&gt;/File sharing/Publish</property>
                         <property name="use_underline">True</property>
                         <property name="image">image2</property>
@@ -85,16 +151,18 @@
                     </child>
                     <child>
                       <object class="GtkSeparatorMenuItem" id="GNUNET_GTK_main_menu_file_sep1">
-                        <property name="visible">True</property>
                         <property name="use_action_appearance">False</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                       </object>
                     </child>
                     <child>
                       <object class="GtkImageMenuItem" id="GNUNET_GTK_main_menu_file_search">
                         <property name="label" translatable="yes">_Search</property>
+                        <property name="use_action_appearance">False</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Search GNUnet for files</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="accel_path">&lt;gnunet-fs-gtk&gt;/File sharing/Search</property>
                         <property name="use_underline">True</property>
                         <property name="image">image4</property>
@@ -105,16 +173,18 @@
                     </child>
                     <child>
                       <object class="GtkSeparatorMenuItem" id="GNUNET_GTK_main_menu_file_sep2">
-                        <property name="visible">True</property>
                         <property name="use_action_appearance">False</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                       </object>
                     </child>
                     <child>
                       <object class="GtkImageMenuItem" id="GNUNET_GTK_main_menu_file_download_uri">
                         <property name="label" translatable="yes">_Download</property>
+                        <property name="use_action_appearance">False</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Download a file or directory with a known URI.</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="accel_path">&lt;gnunet-fs-gtk&gt;/File sharing/Download</property>
                         <property name="use_underline">True</property>
                         <property name="image">image5</property>
@@ -126,9 +196,10 @@
                     <child>
                       <object class="GtkImageMenuItem" id="GNUNET_GTK_main_menu_file_open_gnunet_directory">
                         <property name="label" translatable="yes">_Open GNUnet directory</property>
+                        <property name="use_action_appearance">False</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Use this option to browse a GNUnet directory file that has been previously downloaded.</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="accel_path">&lt;gnunet-fs-gtk&gt;/File sharing/Open directory</property>
                         <property name="use_underline">True</property>
                         <property name="image">image1</property>
@@ -139,16 +210,18 @@
                     </child>
                     <child>
                       <object class="GtkSeparatorMenuItem" id="GNUNET_GTK_main_menu_file_sep3">
-                        <property name="visible">True</property>
                         <property name="use_action_appearance">False</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                       </object>
                     </child>
                     <child>
                       <object class="GtkImageMenuItem" id="GNUNET_GTK_main_menu_file_quit">
                         <property name="label">gtk-quit</property>
+                        <property name="use_action_appearance">False</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Exit gnunet-fs-gtk.  Active file-sharing operations will resume upon restart.</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="accel_path">&lt;gnunet-fs-gtk&gt;/Quit</property>
                         <property name="use_underline">True</property>
                         <property name="use_stock">True</property>
@@ -163,17 +236,20 @@
             <child>
               <object class="GtkMenuItem" id="GNUNET_GTK_main_menu_edit">
                 <property name="use_action_appearance">False</property>
+                <property name="can_focus">False</property>
                 <property name="label" translatable="yes">_Edit</property>
                 <property name="use_underline">True</property>
                 <child type="submenu">
                   <object class="GtkMenu" id="GNUNET_GTK_main_menu_edit_box">
                     <property name="visible">True</property>
+                    <property name="can_focus">False</property>
                     <child>
                       <object class="GtkImageMenuItem" id="GNUNET_GTK_main_menu_edit_preferences">
                         <property name="label">gtk-preferences</property>
+                        <property name="use_action_appearance">False</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Edit the system configuration.</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="accel_path">&lt;gnunet-fs-gtk&gt;/Edit/Preferences</property>
                         <property name="use_underline">True</property>
                         <property name="use_stock">True</property>
@@ -185,18 +261,21 @@
             </child>
             <child>
               <object class="GtkMenuItem" id="GNUNET_GTK_main_menu_view">
-                <property name="visible">True</property>
                 <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <property name="label" translatable="yes">_View</property>
                 <property name="use_underline">True</property>
                 <child type="submenu">
                   <object class="GtkMenu" id="GNUNET_GTK_main_menu_view_box">
                     <property name="visible">True</property>
+                    <property name="can_focus">False</property>
                     <child>
                       <object class="GtkCheckMenuItem" id="GNUNET_GTK_main_menu_view_metadata">
+                        <property name="use_action_appearance">False</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Show meta data in main window</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="label" translatable="yes">Metadata</property>
                         <property name="use_underline">True</property>
                         <property name="active">True</property>
@@ -205,34 +284,50 @@
                     </child>
                     <child>
                       <object class="GtkCheckMenuItem" id="GNUNET_GTK_main_menu_view_preview">
+                        <property name="use_action_appearance">False</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Show preview (when available)</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="label" translatable="yes">Preview</property>
                         <property name="use_underline">True</property>
                         <property name="active">True</property>
                         <signal name="toggled" handler="GNUNET_GTK_main_menu_view_preview_toggled_cb" swapped="no"/>
                       </object>
                     </child>
+                    <child>
+                      <object class="GtkCheckMenuItem" id="GNUNET_GTK_main_menu_search_preview">
+                        <property name="use_action_appearance">False</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="tooltip_text" translatable="yes">Show search box in main window</property>
+                        <property name="label" translatable="yes">Search</property>
+                        <property name="use_underline">True</property>
+                        <property name="active">True</property>
+                        <signal name="toggled" handler="GNUNET_GTK_main_menu_view_search_toggled_cb" swapped="no"/>
+                      </object>
+                    </child>
                   </object>
                 </child>
               </object>
             </child>
             <child>
               <object class="GtkMenuItem" id="GNUNET_GTK_main_menu_help">
-                <property name="visible">True</property>
                 <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <property name="label" translatable="yes">_Help</property>
                 <property name="use_underline">True</property>
                 <child type="submenu">
                   <object class="GtkMenu" id="GNUNET_GTK_main_menu_help_abou">
                     <property name="visible">True</property>
+                    <property name="can_focus">False</property>
                     <child>
                       <object class="GtkImageMenuItem" id="GNUNET_GTK_main_menu_help_about">
                         <property name="label">gtk-about</property>
+                        <property name="use_action_appearance">False</property>
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Display information about this version of gnunet-fs-gtk</property>
-                        <property name="use_action_appearance">False</property>
                         <property name="accel_path">&lt;gnunet-fs-gtk&gt;/Help/About</property>
                         <property name="use_underline">True</property>
                         <property name="use_stock">True</property>
@@ -252,11 +347,13 @@
         </child>
         <child>
           <object class="GtkToolbar" id="GNUNET_GTK_main_window_toolbar">
+            <property name="can_focus">False</property>
             <property name="toolbar_style">icons</property>
             <child>
               <object class="GtkToolButton" id="GNUNET_GTK_toolbar_search">
-                <property name="visible">True</property>
                 <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <property name="label" translatable="yes">_Search</property>
                 <property name="use_underline">True</property>
                 <property name="stock_id">gtk-find</property>
@@ -274,8 +371,203 @@
           </packing>
         </child>
         <child>
+          <object class="GtkHBox" id="main_window_search_hbox">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="border_width">3</property>
+            <property name="spacing">4</property>
+            <child>
+              <object class="GtkLabel" id="main_window_search_namespace_label">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Namespace:</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="main_window_search_namespace_combobox_alignment">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="yscale">0</property>
+                <child>
+                  <object class="GtkToggleButton" id="main_window_search_namespace_dropdown_button">
+                    <property name="label" translatable="yes">&lt;none&gt;</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="events">GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_STRUCTURE_MASK</property>
+                    <property name="image">image10</property>
+                    <property name="image_position">right</property>
+                    <signal name="toggled" handler="main_window_search_namespace_dropdown_button_toggled_cb" swapped="no"/>
+                    <signal name="enter-notify-event" handler="main_window_search_namespace_dropdown_button_enter_notify_event_cb" swapped="no"/>
+                    <signal name="leave-notify-event" handler="namespace_selector_window_leave_notify_event_cb" swapped="no"/>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="main_window_search_label">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Query:</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkEntry" id="main_window_search_entry">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="invisible_char">●</property>
+                <property name="invisible_char_set">True</property>
+                <property name="primary_icon_stock">gtk-find</property>
+                <property name="primary_icon_activatable">True</property>
+                <property name="secondary_icon_activatable">False</property>
+                <property name="primary_icon_sensitive">True</property>
+                <property name="secondary_icon_sensitive">True</property>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">3</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="main_window_search_anonymity_label">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Anonymity:</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">4</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="main_window_search_anonymity_combobox_alignment">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="yscale">0</property>
+                <child>
+                  <object class="GtkComboBox" id="main_window_search_anonymity_combobox">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="model">main_window_search_anonymity_liststore</property>
+                    <property name="active">1</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="main_window_search_anonymity_combobox_renderer"/>
+                      <attributes>
+                        <attribute name="foreground">2</attribute>
+                        <attribute name="text">0</attribute>
+                      </attributes>
+                    </child>
+                    <child>
+                      <object class="GtkCellRendererText" id="main_window_search_anonymity_combobox_renerer_level"/>
+                      <attributes>
+                        <attribute name="text">1</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">5</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="main_window_search_mime_label">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Type:</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">6</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="main_window_search_mime_combobox_alignment">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="xscale">0</property>
+                <property name="yscale">0</property>
+                <child>
+                  <object class="GtkComboBox" id="main_window_search_mime_combobox">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="model">main_window_search_mime_liststore</property>
+                    <property name="active">0</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="main_window_search_mime_renderer_description"/>
+                      <attributes>
+                        <attribute name="text">0</attribute>
+                      </attributes>
+                    </child>
+                    <child>
+                      <object class="GtkCellRendererText" id="main_window_search_mime_renderer_type"/>
+                      <attributes>
+                        <attribute name="text">1</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">7</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="main_window_search_button_alignment">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="yscale">0</property>
+                <child>
+                  <object class="GtkButton" id="main_window_search_button">
+                    <property name="label" translatable="yes">Find!</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <signal name="clicked" handler="main_window_search_button_clicked_cb" swapped="no"/>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">8</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
+        <child>
           <object class="GtkHBox" id="GNUNET_GTK_main_window_hbox">
             <property name="visible">True</property>
+            <property name="can_focus">False</property>
             <child>
               <object class="GtkNotebook" id="GNUNET_GTK_main_window_notebook">
                 <property name="visible">True</property>
@@ -292,6 +584,7 @@
             <child>
               <object class="GtkVSeparator" id="GNUNET_GTK_main_window_separator">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
               </object>
               <packing>
                 <property name="expand">False</property>
@@ -302,12 +595,14 @@
             <child>
               <object class="GtkVBox" id="GNUNET_GTK_main_window_extras_vbox">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <child>
                   <object class="GtkImage" id="GNUNET_GTK_main_window_preview_image">
                     <property name="width_request">128</property>
                     <property name="height_request">128</property>
                     <property name="visible">True</property>
                     <property name="sensitive">False</property>
+                    <property name="can_focus">False</property>
                     <property name="has_tooltip">True</property>
                     <property name="tooltip_text" translatable="yes">Thumbnail associated with the currently selected content</property>
                     <property name="pixel_size">256</property>
@@ -389,36 +684,12 @@
           <packing>
             <property name="expand">True</property>
             <property name="fill">True</property>
-            <property name="position">3</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkStatusbar" id="GNUNET_GTK_status_bar">
-            <property name="visible">True</property>
-            <property name="spacing">2</property>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="pack_type">end</property>
-            <property name="position">0</property>
+            <property name="position">4</property>
           </packing>
         </child>
       </object>
     </child>
   </object>
-  <object class="GtkListStore" id="GNUNET_GTK_meta_data_list_store">
-    <columns>
-      <!-- column-name extractor_meta_type -->
-      <column type="guint"/>
-      <!-- column-name extractor_meta_format -->
-      <column type="guint"/>
-      <!-- column-name extractor_meta_type_string -->
-      <column type="gchararray"/>
-      <!-- column-name extracotr_meta_value -->
-      <column type="gchararray"/>
-    </columns>
-  </object>
   <object class="GtkListStore" id="GNUNET_GTK_peer_info_list_store">
     <columns>
       <!-- column-name peer_identity -->
@@ -433,10 +704,6 @@
       <column type="guint64"/>
     </columns>
   </object>
-  <object class="GtkImage" id="image6">
-    <property name="visible">True</property>
-    <property name="stock">gtk-index</property>
-  </object>
   <object class="GtkAdjustment" id="adjustment1">
     <property name="upper">100</property>
     <property name="step_increment">1</property>
@@ -461,4 +728,119 @@
     <property name="page_increment">10</property>
     <property name="page_size">10</property>
   </object>
+  <object class="GtkImage" id="image1">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-open</property>
+  </object>
+  <object class="GtkImage" id="image10">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-index</property>
+  </object>
+  <object class="GtkImage" id="image7">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-index</property>
+  </object>
+  <object class="GtkImage" id="image8">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-index</property>
+  </object>
+  <object class="GtkImage" id="image9">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-index</property>
+  </object>
+  <object class="GtkListStore" id="main_window_search_mime_liststore">
+    <columns>
+      <!-- column-name MIME -->
+      <column type="gchararray"/>
+      <!-- column-name Type -->
+      <column type="gchararray"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0"> </col>
+        <col id="1" translatable="yes">Any</col>
+      </row>
+      <row>
+        <col id="0">plain/text</col>
+        <col id="1" translatable="yes">Text</col>
+      </row>
+      <row>
+        <col id="0">application/zip</col>
+        <col id="1" translatable="yes">Zip</col>
+      </row>
+      <row>
+        <col id="0">audio/mpeg</col>
+        <col id="1" translatable="yes">MPEG audio</col>
+      </row>
+    </data>
+  </object>
+  <object class="GtkTreeStore" id="main_window_search_namespace_treestore">
+    <columns>
+      <!-- column-name Name -->
+      <column type="gchararray"/>
+      <!-- column-name Key -->
+      <column type="gpointer"/>
+      <!-- column-name KeyTextual -->
+      <column type="gchararray"/>
+      <!-- column-name Tooltip -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkWindow" id="namespace_selector_window">
+    <property name="can_focus">False</property>
+    <property name="events">GDK_LEAVE_NOTIFY_MASK | GDK_STRUCTURE_MASK</property>
+    <property name="type">popup</property>
+    <property name="resizable">False</property>
+    <property name="type_hint">dropdown-menu</property>
+    <property name="skip_taskbar_hint">True</property>
+    <property name="skip_pager_hint">True</property>
+    <property name="urgency_hint">True</property>
+    <property name="decorated">False</property>
+    <property name="deletable">False</property>
+    <property name="transient_for">GNUNET_GTK_main_window</property>
+    <property name="mnemonics_visible">False</property>
+    <signal name="leave-notify-event" handler="namespace_selector_window_leave_notify_event_cb" swapped="no"/>
+    <signal name="enter-notify-event" handler="main_window_search_namespace_dropdown_button_enter_notify_event_cb" swapped="no"/>
+    <child>
+      <object class="GtkTreeView" id="namespace_selector_treeview">
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="model">main_window_search_namespace_treestore</property>
+        <property name="headers_clickable">False</property>
+        <property name="search_column">0</property>
+        <property name="hover_expand">True</property>
+        <property name="tooltip_column">3</property>
+        <signal name="cursor-changed" handler="namespace_selector_treeview_cursor_changed_cb" swapped="no"/>
+        <child>
+          <object class="GtkTreeViewColumn" id="name_column">
+            <property name="sizing">autosize</property>
+            <property name="title" translatable="yes">Name</property>
+            <child>
+              <object class="GtkCellRendererText" id="namespace_selector_name_column_text_cell"/>
+              <attributes>
+                <attribute name="text">0</attribute>
+              </attributes>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkTreeViewColumn" id="key_column">
+            <property name="sizing">autosize</property>
+            <property name="title" translatable="yes">Key</property>
+            <child>
+              <object class="GtkCellRendererText" id="namespace_selector_key_column_text_cell"/>
+              <attributes>
+                <attribute name="text">2</attribute>
+              </attributes>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+  </object>
 </interface>
diff --git a/contrib/gnunet_fs_gtk_search_tab.glade b/contrib/gnunet_fs_gtk_search_tab.glade
index 38c0c38..9a8fa61 100644
--- a/contrib/gnunet_fs_gtk_search_tab.glade
+++ b/contrib/gnunet_fs_gtk_search_tab.glade
@@ -35,125 +35,143 @@
     </columns>
   </object>
   <object class="GtkWindow" id="_search_result_frame_window">
+    <property name="can_focus">False</property>
+    <property name="type">popup</property>
     <property name="title">You should never see this</property>
-                   <child>
-                      <object class="GtkScrolledWindow" id="_search_frame_scrolled_window">
-                        <property name="height_request">100</property>
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="hscrollbar_policy">automatic</property>
-                        <property name="vscrollbar_policy">automatic</property>
-
+    <property name="skip_taskbar_hint">True</property>
+    <property name="skip_pager_hint">True</property>
+    <property name="focus_on_map">False</property>
+    <property name="decorated">False</property>
+    <property name="deletable">False</property>
     <child>
-      <object class="GtkTreeView" id="_search_result_frame">
+      <object class="GtkScrolledWindow" id="_search_frame_scrolled_window">
+        <property name="height_request">100</property>
         <property name="visible">True</property>
         <property name="can_focus">True</property>
-        <property name="model">GNUNET_GTK_file_sharing_result_tree_store</property>
-        <property name="reorderable">True</property>
-        <property name="enable_grid_lines">horizontal</property>
-        <property name="enable_tree_lines">True</property>
+        <property name="hscrollbar_policy">automatic</property>
+        <property name="vscrollbar_policy">automatic</property>
         <child>
-          <object class="GtkTreeViewColumn" id="search_result_description_column">
-            <property name="resizable">True</property>
-            <property name="sizing">autosize</property>
-            <property name="title" translatable="yes">Description</property>
-            <property name="expand">True</property>
-            <property name="clickable">True</property>
+          <object class="GtkTreeView" id="_search_result_frame">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="model">GNUNET_GTK_file_sharing_result_tree_store</property>
             <property name="reorderable">True</property>
-            <property name="sort_indicator">True</property>
-            <property name="sort_column_id">6</property>
+            <property name="enable_grid_lines">horizontal</property>
+            <property name="enable_tree_lines">True</property>
             <child>
-              <object class="GtkCellRendererProgress" id="search_result_description_renderer"/>
-              <attributes>
-                <attribute name="cell-background">8</attribute>
-                <attribute name="text">6</attribute>
-                <attribute name="value">5</attribute>
-              </attributes>
+              <object class="GtkTreeViewColumn" id="search_result_description_column">
+                <property name="resizable">True</property>
+                <property name="sizing">autosize</property>
+                <property name="title" translatable="yes">Description</property>
+                <property name="expand">True</property>
+                <property name="clickable">True</property>
+                <property name="reorderable">True</property>
+                <property name="sort_indicator">True</property>
+                <property name="sort_column_id">6</property>
+                <child>
+                  <object class="GtkCellRendererProgress" id="search_result_description_renderer"/>
+                  <attributes>
+                    <attribute name="cell-background">8</attribute>
+                    <attribute name="text">6</attribute>
+                    <attribute name="value">5</attribute>
+                  </attributes>
+                </child>
+              </object>
             </child>
-          </object>
-        </child>
-        <child>
-          <object class="GtkTreeViewColumn" id="search_result_mime_column">
-            <property name="sizing">autosize</property>
-            <property name="title" translatable="yes">Format</property>
-            <property name="clickable">True</property>
-            <property name="reorderable">True</property>
-            <property name="sort_indicator">True</property>
-            <property name="sort_column_id">10</property>
             <child>
-              <object class="GtkCellRendererText" id="search_result_mime_renderer"/>
-              <attributes>
-                <attribute name="background">8</attribute>
-                <attribute name="text">10</attribute>
-              </attributes>
+              <object class="GtkTreeViewColumn" id="search_result_mime_column">
+                <property name="sizing">autosize</property>
+                <property name="title" translatable="yes">Format</property>
+                <property name="clickable">True</property>
+                <property name="reorderable">True</property>
+                <property name="sort_indicator">True</property>
+                <property name="sort_column_id">10</property>
+                <child>
+                  <object class="GtkCellRendererText" id="search_result_mime_renderer"/>
+                  <attributes>
+                    <attribute name="background">8</attribute>
+                    <attribute name="text">10</attribute>
+                  </attributes>
+                </child>
+              </object>
             </child>
-          </object>
-        </child>
-        <child>
-          <object class="GtkTreeViewColumn" id="search_result_size_column">
-            <property name="sizing">autosize</property>
-            <property name="title" translatable="yes">Size</property>
-            <property name="reorderable">True</property>
-            <property name="sort_indicator">True</property>
-            <property name="sort_column_id">2</property>
             <child>
-              <object class="GtkCellRendererProgress" id="search_result_size_renderer"/>
-              <attributes>
-                <attribute name="cell-background">8</attribute>
-                <attribute name="text">2</attribute>
-                <attribute name="value">4</attribute>
-              </attributes>
+              <object class="GtkTreeViewColumn" id="search_result_size_column">
+                <property name="sizing">autosize</property>
+                <property name="title" translatable="yes">Size</property>
+                <property name="reorderable">True</property>
+                <property name="sort_indicator">True</property>
+                <property name="sort_column_id">2</property>
+                <child>
+                  <object class="GtkCellRendererProgress" id="search_result_size_renderer"/>
+                  <attributes>
+                    <attribute name="cell-background">8</attribute>
+                    <attribute name="text">2</attribute>
+                    <attribute name="value">4</attribute>
+                  </attributes>
+                </child>
+              </object>
             </child>
-          </object>
-        </child>
-        <child>
-          <object class="GtkTreeViewColumn" id="search_result_applicability_column">
-            <property name="sizing">autosize</property>
-            <property name="title">#</property>
-            <property name="reorderable">True</property>
-            <property name="sort_indicator">True</property>
-            <property name="sort_order">descending</property>
-            <property name="sort_column_id">11</property>
             <child>
-              <object class="GtkCellRendererText" id="search_result_applicability_renderer"/>
-              <attributes>
-                <attribute name="background">8</attribute>
-                <attribute name="text">11</attribute>
-              </attributes>
+              <object class="GtkTreeViewColumn" id="search_result_applicability_column">
+                <property name="sizing">autosize</property>
+                <property name="title">#</property>
+                <property name="reorderable">True</property>
+                <property name="sort_indicator">True</property>
+                <property name="sort_order">descending</property>
+                <property name="sort_column_id">11</property>
+                <child>
+                  <object class="GtkCellRendererText" id="search_result_applicability_renderer"/>
+                  <attributes>
+                    <attribute name="background">8</attribute>
+                    <attribute name="text">11</attribute>
+                  </attributes>
+                </child>
+              </object>
             </child>
-          </object>
-        </child>
-        <child>
-          <object class="GtkTreeViewColumn" id="search_result_preview_column">
-            <property name="min_width">128</property>
-            <property name="max_width">128</property>
-            <property name="title" translatable="yes">Preview</property>
-            <property name="reorderable">True</property>
             <child>
-              <object class="GtkCellRendererPixbuf" id="search_result_preview_renderer"/>
-              <attributes>
-                <attribute name="pixbuf">3</attribute>
-              </attributes>
+              <object class="GtkTreeViewColumn" id="search_result_preview_column">
+                <property name="min_width">128</property>
+                <property name="max_width">128</property>
+                <property name="title" translatable="yes">Preview</property>
+                <property name="reorderable">True</property>
+                <child>
+                  <object class="GtkCellRendererPixbuf" id="search_result_preview_renderer"/>
+                  <attributes>
+                    <attribute name="pixbuf">3</attribute>
+                  </attributes>
+                </child>
+              </object>
             </child>
           </object>
         </child>
       </object>
     </child>
   </object>
-    </child>
-  </object>
   <object class="GtkWindow" id="_search_result_label_window">
+    <property name="can_focus">False</property>
+    <property name="type">popup</property>
+    <property name="title" translatable="yes">You shouldn't see this also</property>
+    <property name="type_hint">dock</property>
+    <property name="skip_taskbar_hint">True</property>
+    <property name="skip_pager_hint">True</property>
+    <property name="focus_on_map">False</property>
+    <property name="decorated">False</property>
+    <property name="deletable">False</property>
     <child>
       <object class="GtkHBox" id="_search_result_label_hbox">
         <property name="visible">True</property>
+        <property name="can_focus">False</property>
         <property name="border_width">5</property>
         <child>
           <object class="GtkLabel" id="_search_result_label_window_label">
             <property name="height_request">30</property>
             <property name="visible">True</property>
+            <property name="can_focus">False</property>
             <property name="label" translatable="yes">query</property>
           </object>
           <packing>
+            <property name="expand">True</property>
             <property name="fill">False</property>
             <property name="padding">5</property>
             <property name="position">0</property>
@@ -161,12 +179,13 @@
         </child>
         <child>
           <object class="GtkButton" id="_search_result_label_play_button">
+            <property name="use_action_appearance">False</property>
             <property name="can_focus">True</property>
             <property name="receives_default">True</property>
-            <property name="use_action_appearance">False</property>
             <child>
               <object class="GtkImage" id="play_icon_stock_image">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <property name="stock">gtk-media-play</property>
                 <property name="icon-size">2</property>
               </object>
@@ -180,13 +199,14 @@
         </child>
         <child>
           <object class="GtkButton" id="_search_result_label_pause_button">
+            <property name="use_action_appearance">False</property>
             <property name="visible">True</property>
             <property name="can_focus">True</property>
             <property name="receives_default">True</property>
-            <property name="use_action_appearance">False</property>
             <child>
               <object class="GtkImage" id="pause_icon_stock_image">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <property name="stock">gtk-media-pause</property>
                 <property name="icon-size">2</property>
               </object>
@@ -200,13 +220,14 @@
         </child>
         <child>
           <object class="GtkButton" id="_search_result_label_clear_button">
+            <property name="use_action_appearance">False</property>
             <property name="visible">True</property>
             <property name="can_focus">True</property>
             <property name="receives_default">True</property>
-            <property name="use_action_appearance">False</property>
             <child>
               <object class="GtkImage" id="clear_icon_stock_image">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <property name="stock">gtk-clear</property>
               </object>
             </child>
@@ -220,14 +241,15 @@
         </child>
         <child>
           <object class="GtkButton" id="_search_result_label_close_button">
+            <property name="use_action_appearance">False</property>
             <property name="visible">True</property>
             <property name="can_focus">True</property>
             <property name="receives_default">True</property>
-            <property name="use_action_appearance">False</property>
             <property name="relief">half</property>
             <child>
               <object class="GtkImage" id="close_icon_stock_image">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <property name="stock">gtk-close</property>
                 <property name="icon-size">2</property>
               </object>
diff --git a/src/fs/gnunet-fs-gtk-main_window_view_toggles.c b/src/fs/gnunet-fs-gtk-main_window_view_toggles.c
index 975a1be..9b73cac 100644
--- a/src/fs/gnunet-fs-gtk-main_window_view_toggles.c
+++ b/src/fs/gnunet-fs-gtk-main_window_view_toggles.c
@@ -71,5 +71,14 @@ GNUNET_GTK_main_menu_view_metadata_toggled_cb (GtkWidget * dummy, gpointer data)
                "GNUNET_GTK_main_menu_view_metadata");
 }
 
+/**
+ * Preview view is toggled.
+ */
+void
+GNUNET_GTK_main_menu_view_search_toggled_cb (GtkWidget * dummy, gpointer data)
+{
+  toggle_view ("main_window_search_hbox",
+               "GNUNET_GTK_main_menu_search_preview");
+}
 
 /* end of gnunet-fs-gtk-main_window_view_toggles.c */
diff --git a/src/fs/gnunet-fs-gtk.c b/src/fs/gnunet-fs-gtk.c
index 67a7059..68c6be6 100644
--- a/src/fs/gnunet-fs-gtk.c
+++ b/src/fs/gnunet-fs-gtk.c
@@ -46,6 +46,7 @@ static struct GNUNET_FS_Handle *fs;
  */
 static struct EXTRACTOR_PluginList *plugins;
 
+guint namespace_selector_window_leave_timeout_source = 0;
 
 /**
  * Return handle for file-sharing operations.
@@ -167,6 +168,328 @@ add_new_tab ()
   gtk_widget_show (GTK_WIDGET (notebook));
 }
 
+void
+main_window_search_namespace_dropdown_button_toggled_cb (GtkToggleButton *togglebutton,
+                                                        gpointer user_data)
+{
+  gboolean active;
+  GtkBuilder *builder = GTK_BUILDER (user_data);
+  GtkWidget *namespace_selector_window;
+  namespace_selector_window = GTK_WIDGET (gtk_builder_get_object (builder, "namespace_selector_window"));
+  g_object_get (G_OBJECT (togglebutton), "active", &active, NULL);
+  if (active)
+  {
+    GtkAllocation togglebutton_allocation;
+    GdkWindow *main_window_gdk;
+    gint mwg_x, mwg_y, tgb_x, tgb_y, popup_x, popup_y;
+
+    gtk_widget_get_allocation (GTK_WIDGET (togglebutton), &togglebutton_allocation);
+
+    main_window_gdk = gtk_widget_get_window (GTK_WIDGET (togglebutton));
+
+    gdk_window_get_origin (main_window_gdk, &mwg_x, &mwg_y);
+
+    /* FIXME: this might become a problem in other window managers,
+     * where reference point is not in the top-left corner.
+     * We want to show the window below the button.
+     */
+    tgb_x = mwg_x + togglebutton_allocation.x;
+    tgb_y = mwg_y + togglebutton_allocation.y;
+    popup_x = tgb_x;
+    popup_y = tgb_y + togglebutton_allocation.height;
+
+    gtk_window_move (GTK_WINDOW (namespace_selector_window), popup_x, popup_y);
+
+    gtk_widget_show (namespace_selector_window);
+  }
+  else
+    gtk_widget_hide (namespace_selector_window);
+}
+
+gboolean
+namespace_selector_window_leave_timeout_cb (gpointer user_data)
+{
+  GtkToggleButton *toggle_button = GTK_TOGGLE_BUTTON (user_data);
+  /* This will eventually hide the namespace selector */
+  gtk_toggle_button_set_active (toggle_button, FALSE);
+  return FALSE;
+}
+
+gboolean
+main_window_search_namespace_dropdown_button_enter_notify_event_cb (
+    GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+  if (namespace_selector_window_leave_timeout_source > 0)
+    g_source_remove (namespace_selector_window_leave_timeout_source);
+  return FALSE;
+}
+
+
+gboolean
+namespace_selector_window_leave_notify_event_cb (GtkWidget *widget,
+    GdkEvent  *event, gpointer user_data)
+{
+  GtkBuilder *builder;
+  GtkToggleButton *toggle_button;
+  guint timeout_id;
+
+  builder = GTK_BUILDER (user_data);
+
+  toggle_button = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "main_window_search_namespace_dropdown_button"));
+
+  /* Place a timeout to hide the window. It will be cancelled if the cursor
+   * enters the namespace selector window or the toggle button within 100ms.
+   */
+  timeout_id = g_timeout_add (100, &namespace_selector_window_leave_timeout_cb, toggle_button);
+  if (namespace_selector_window_leave_timeout_source > 0)
+    g_source_remove (namespace_selector_window_leave_timeout_source);
+  namespace_selector_window_leave_timeout_source = timeout_id;
+
+  return FALSE;
+}
+
+gboolean
+GNUNET_GTK_get_tree_string (GtkTreeView *treeview, GtkTreePath *treepath,
+    guint column, gchar **value)
+{
+  gboolean ok;
+  GtkTreeModel *model;
+
+  model = gtk_tree_view_get_model (treeview);
+  if (!model)
+    return FALSE;
+
+  GtkTreeIter iter;
+  ok = gtk_tree_model_get_iter (model, &iter, treepath);
+  if (!ok)
+    return FALSE;
+
+  *value = NULL;
+  gtk_tree_model_get (model, &iter, column, value, -1);
+  if (*value == NULL)
+    return FALSE;
+  return TRUE;
+}
+
+gboolean
+get_selected_anonymity_level (GtkBuilder *builder, guint *p_level)
+{
+  GtkComboBox *combo;
+  GtkTreeIter iter;
+  GtkTreeModel *model;
+  guint level;
+
+  combo = GTK_COMBO_BOX(gtk_builder_get_object (builder,
+      "main_window_search_anonymity_combobox"));
+  if (!combo)
+    return FALSE;
+
+  if (!gtk_combo_box_get_active_iter (combo, &iter))
+    return FALSE;
+
+  model = gtk_combo_box_get_model (combo);
+  if (!model)
+    return FALSE;
+
+  gtk_tree_model_get (model, &iter, 1, &level, -1);
+  if (p_level)
+    *p_level = level;
+  return TRUE;
+}
+
+gboolean
+get_selected_namespace_treepath_iter_model_widget (GtkBuilder *builder,
+    GtkTreePath **p_treepath, GtkTreeIter *p_iter, GtkTreeModel **p_model,
+    GtkWidget **p_widget)
+{
+  GtkTreeSelection *selection;
+  GtkTreeModel *model;
+  GList *selected;
+  GtkTreePath *treepath;
+  GtkWidget *widget;
+
+  widget = GTK_WIDGET (gtk_builder_get_object (builder, "namespace_selector_treeview"));
+  if (!widget)
+    return FALSE;
+
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
+  model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+  if (!selection || !model)
+    return FALSE;
+
+  selected = gtk_tree_selection_get_selected_rows (selection, NULL);
+  if (!selected)
+    return FALSE;
+  if (selected->data == NULL)
+  {
+    g_list_foreach (selected, (GFunc) gtk_tree_path_free, NULL);
+    g_list_free (selected);
+    return FALSE;
+  }
+  /* Free everything except the first path, keep it */
+  treepath = (GtkTreePath *) selected->data;
+  selected = g_list_remove (selected, selected->data);
+  g_list_foreach (selected, (GFunc) gtk_tree_path_free, NULL);
+  g_list_free (selected);
+
+  if (p_iter && !gtk_tree_model_get_iter (model, p_iter, treepath))
+  {
+    gtk_tree_path_free (treepath);
+    return FALSE;
+  }
+  *p_treepath = treepath;
+  if (p_model)
+    *p_model = model;
+  if (p_widget)
+    *p_widget = widget;
+  return TRUE;
+}
+
+void
+namespace_selector_treeview_cursor_changed_cb (GtkWidget *widget,
+    gpointer user_data)
+{
+  GtkBuilder *builder;
+  GtkToggleButton *toggle_button;
+  gchar *value;
+  GtkTreePath *treepath;
+
+  builder = GTK_BUILDER (user_data);
+
+  if (!get_selected_namespace_treepath_iter_model_widget (builder, &treepath, NULL, NULL, NULL))
+    return;
+
+  toggle_button = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "main_window_search_namespace_dropdown_button"));
+  if (!toggle_button)
+    return;
+
+  if (GNUNET_GTK_get_tree_string (GTK_TREE_VIEW (widget), treepath, 0,
+      &value))
+    gtk_button_set_label (GTK_BUTTON (toggle_button), value);
+
+  gtk_tree_path_free (treepath);
+
+  /* This will eventually hide the namespace selector */
+  gtk_toggle_button_set_active (toggle_button, FALSE);
+}
+
+void
+main_window_search_button_clicked_cb (GtkButton *button, gpointer user_data)
+{
+  GtkBuilder *builder;
+  GtkTreePath *namespace_treepath = NULL;
+  GtkTreeModel *namespace_model = NULL;
+  GtkComboBox *mime_combo;
+  GtkTreeModel *mime_model;
+  GtkEntry *query_entry;
+  guint anonymity_level;
+  GtkTreeIter iter;
+  const char *entry_keywords;
+  gchar *keywords;
+  gchar *mime_keyword;
+
+  GNUNET_HashCode *nsid = NULL;
+  struct GNUNET_FS_Uri *uri;
+  char *emsg;
+
+  builder = GTK_BUILDER (user_data);
+
+  if (!get_selected_anonymity_level (builder, &anonymity_level))
+    return;
+
+  mime_combo = GTK_COMBO_BOX (GNUNET_FS_GTK_get_main_window_object
+      ("main_window_search_mime_combobox"));
+  mime_model = gtk_combo_box_get_model (mime_combo);
+  if (mime_model && gtk_combo_box_get_active_iter (mime_combo, &iter))
+  {
+    mime_keyword = NULL;
+    gtk_tree_model_get (mime_model, &iter, 0, &mime_keyword, -1);
+  }
+
+  get_selected_namespace_treepath_iter_model_widget (builder,
+      &namespace_treepath, &iter, &namespace_model, NULL);
+
+  query_entry = GTK_ENTRY (gtk_builder_get_object (builder,
+      "main_window_search_entry"));
+
+  entry_keywords = gtk_entry_get_text (query_entry);
+  if (mime_keyword != NULL)
+  {
+    keywords = g_strdup_printf ("%s %s", entry_keywords, mime_keyword);
+    g_free (mime_keyword);
+  }
+  else
+    keywords = g_strdup (entry_keywords);
+  if (namespace_treepath != NULL)
+    gtk_tree_model_get (namespace_model, &iter, 1, &nsid, -1);
+  if (nsid != NULL)
+  {
+    uri = GNUNET_FS_uri_sks_create_from_nsid (nsid, keywords);
+    GNUNET_assert (uri != NULL);
+  }
+  else
+  {
+    emsg = NULL;
+    uri = GNUNET_FS_uri_ksk_create (keywords, &emsg);
+    if (uri == NULL)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+          _("Invalid keyword string `%s': %s"), keywords, emsg);
+      GNUNET_free_non_null (emsg);
+      return;
+    }
+  }
+  GNUNET_FS_search_start (GNUNET_FS_GTK_get_fs_handle (), uri,
+      anonymity_level, GNUNET_FS_SEARCH_OPTION_NONE, NULL);
+
+  g_free (keywords);
+  GNUNET_FS_uri_destroy (uri);
+}
+
+void
+GNUNET_GTK_main_window_realize_cb (GtkWidget *widget, gpointer user_data)
+{
+  GtkTreeIter iter;
+  GtkTreeView *namespace_tree;
+  GtkTreeStore *namespace_treestore;
+  GtkBuilder *builder;
+  GtkToggleButton *toggle_button;
+  GtkWidget *namespace_selector_window;
+
+  builder = GTK_BUILDER (user_data);
+
+  namespace_treestore = GTK_TREE_STORE (GNUNET_FS_GTK_get_main_window_object
+      ("main_window_search_namespace_treestore"));
+  namespace_tree = GTK_TREE_VIEW (GNUNET_FS_GTK_get_main_window_object
+      ("namespace_selector_treeview"));
+
+  /* TODO: fetch real values from somewhere instead of filling the store with dummies */
+  gtk_tree_store_insert_with_values (namespace_treestore, &iter, NULL, 0, 0, "Any", 1, NULL, 2, "", 3, "Do not search in any particular namespace", -1);
+  gtk_tree_store_insert_with_values (namespace_treestore, &iter, NULL, 1, 0, "foo", 1, NULL, 2, "IAMTHEBESTOBEYMENOCARRIER", 3, "Tooltip1", -1);
+  gtk_tree_store_insert_with_values (namespace_treestore, &iter, NULL, 2, 0, "bar", 1, NULL, 2, "NOONEWILLKNOWTHISIDBECAUSEITSSECRET", 3, "Tooltip2", -1);
+  gtk_tree_store_insert_with_values (namespace_treestore, &iter, NULL, 3, 0, "baz", 1, NULL, 2, "SSLOPENSSHGNUGTKGNUNETFTWYAYA", 3, "Tooltip3", -1);
+
+  /* FIXME: read currently selected namespace from somewhere instead of selecting 0th item */
+  if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (namespace_treestore), &iter))
+  {
+    gchar *value;
+    GtkTreePath *treepath = gtk_tree_path_new_first ();
+    gtk_tree_selection_select_iter (gtk_tree_view_get_selection (
+        namespace_tree), &iter);
+    toggle_button = GTK_TOGGLE_BUTTON (GNUNET_FS_GTK_get_main_window_object
+        ("main_window_search_namespace_dropdown_button"));
+    if (GNUNET_GTK_get_tree_string (namespace_tree,
+        treepath, 0, &value))
+      gtk_button_set_label (GTK_BUTTON (toggle_button), value);
+    gtk_tree_path_free (treepath);
+  }
+
+  /* How the window (to trigger certain events) and immediately hide it */
+  namespace_selector_window = GTK_WIDGET (gtk_builder_get_object (builder, "namespace_selector_window"));
+  gtk_widget_show (namespace_selector_window);
+  gtk_widget_hide (namespace_selector_window);
+
+}
 
 /**
  * Actual main function run right after GNUnet's scheduler
-- 
1.7.4

LRN

2011-12-11 03:16

developer   ~0005029

Last edited: 2011-12-12 00:30

0004-New-search-bar-in-the-main-window.patch - creates a search bar at the top of the main window. Search bar allows one to select a namespace to search in (TODO: namespace list is a dummy, fix this to use real namespaces), a query, an anonymity level (ATM there are 3 levels - None=0, Normal=1 and Paranoid=10; easily adjustable by editing .glade file), and an optional restriction by mime type (TODO: mime type list is a dummy, fill it with real mime types and descriptions; list will be adjustable via .glade file editing), which also fixes 0001944 .

<s>TODO: get rid of the "New search" tab, since searches can now be started from the search bar.</s> DONE.

TODO: get rid of the "Search" dialog, since search toolbar should now replace it.

LRN

2011-12-12 00:07

developer  

0001-A-lump-of-GUI-changes-and-tweaks.patch (23,765 bytes)   
From 37ddf86b521f1655724bd895849905fd023c7915 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?=
 =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Mon, 12 Dec 2011 00:43:48 +0400
Subject: [PATCH 1/2] A lump of GUI changes and tweaks

* Real namespaces are now fetched from FS instead of dummies
* Used Size Group to make entries and combobox in search bar have the same height
* Reworked namespace selection toggle button - now it consists of separate label and
  button. Could have made it to look more comboboxy, but there seems to be no pressing
  need for that.
* Removed some unneded widgets.
* MIME type selector now has more columns, and got an entry to input arbitrary MIME type.
---
 contrib/gnunet_fs_gtk_main_window.glade |  237 +++++++++++++++++++-----------
 src/fs/gnunet-fs-gtk.c                  |   85 ++++++++++--
 2 files changed, 223 insertions(+), 99 deletions(-)

diff --git a/contrib/gnunet_fs_gtk_main_window.glade b/contrib/gnunet_fs_gtk_main_window.glade
index 799c1b1..4fdc888 100644
--- a/contrib/gnunet_fs_gtk_main_window.glade
+++ b/contrib/gnunet_fs_gtk_main_window.glade
@@ -2,70 +2,6 @@
 <interface>
   <requires lib="gtk+" version="2.24"/>
   <!-- interface-naming-policy project-wide -->
-  <object class="GtkListStore" id="GNUNET_GTK_meta_data_list_store">
-    <columns>
-      <!-- column-name extractor_meta_type -->
-      <column type="guint"/>
-      <!-- column-name extractor_meta_format -->
-      <column type="guint"/>
-      <!-- column-name extractor_meta_type_string -->
-      <column type="gchararray"/>
-      <!-- column-name extracotr_meta_value -->
-      <column type="gchararray"/>
-    </columns>
-  </object>
-  <object class="GtkImage" id="image2">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="stock">gtk-go-up</property>
-  </object>
-  <object class="GtkImage" id="image3">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="stock">gtk-new</property>
-  </object>
-  <object class="GtkImage" id="image4">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="stock">gtk-find</property>
-  </object>
-  <object class="GtkImage" id="image5">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="stock">gtk-go-down</property>
-  </object>
-  <object class="GtkImage" id="image6">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="stock">gtk-index</property>
-  </object>
-  <object class="GtkListStore" id="main_window_search_anonymity_liststore">
-    <columns>
-      <!-- column-name Name -->
-      <column type="gchararray"/>
-      <!-- column-name Level -->
-      <column type="guint"/>
-      <!-- column-name Color -->
-      <column type="gchararray"/>
-    </columns>
-    <data>
-      <row>
-        <col id="0" translatable="yes">None</col>
-        <col id="1">0</col>
-        <col id="2" translatable="yes">#AAAA00000000</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes">Normal</col>
-        <col id="1">1</col>
-        <col id="2" translatable="yes">#000000000000</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes">Paranoid</col>
-        <col id="1">10</col>
-        <col id="2" translatable="yes">#0000AAAA0000</col>
-      </row>
-    </data>
-  </object>
   <object class="GtkWindow" id="GNUNET_GTK_main_window">
     <property name="can_focus">False</property>
     <property name="title" translatable="yes">gnunet-fs-gtk</property>
@@ -389,30 +325,51 @@
               </packing>
             </child>
             <child>
+              <object class="GtkLabel" id="main_window_search_selected_namespace_label">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label">&lt;none&gt;</property>
+                <property name="single_line_mode">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
               <object class="GtkAlignment" id="main_window_search_namespace_combobox_alignment">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
+                <property name="xscale">0</property>
                 <property name="yscale">0</property>
                 <child>
                   <object class="GtkToggleButton" id="main_window_search_namespace_dropdown_button">
-                    <property name="label" translatable="yes">&lt;none&gt;</property>
                     <property name="use_action_appearance">False</property>
+                    <property name="width_request">21</property>
+                    <property name="height_request">21</property>
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
                     <property name="receives_default">True</property>
                     <property name="events">GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_STRUCTURE_MASK</property>
-                    <property name="image">image10</property>
                     <property name="image_position">right</property>
                     <signal name="toggled" handler="main_window_search_namespace_dropdown_button_toggled_cb" swapped="no"/>
                     <signal name="enter-notify-event" handler="main_window_search_namespace_dropdown_button_enter_notify_event_cb" swapped="no"/>
                     <signal name="leave-notify-event" handler="namespace_selector_window_leave_notify_event_cb" swapped="no"/>
+                    <child>
+                      <object class="GtkArrow" id="arrow1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="arrow_type">down</property>
+                      </object>
+                    </child>
                   </object>
                 </child>
               </object>
               <packing>
                 <property name="expand">False</property>
                 <property name="fill">False</property>
-                <property name="position">1</property>
+                <property name="position">2</property>
               </packing>
             </child>
             <child>
@@ -424,7 +381,7 @@
               <packing>
                 <property name="expand">False</property>
                 <property name="fill">False</property>
-                <property name="position">2</property>
+                <property name="position">3</property>
               </packing>
             </child>
             <child>
@@ -442,7 +399,7 @@
               <packing>
                 <property name="expand">True</property>
                 <property name="fill">True</property>
-                <property name="position">3</property>
+                <property name="position">4</property>
               </packing>
             </child>
             <child>
@@ -454,7 +411,7 @@
               <packing>
                 <property name="expand">False</property>
                 <property name="fill">False</property>
-                <property name="position">4</property>
+                <property name="position">5</property>
               </packing>
             </child>
             <child>
@@ -487,7 +444,7 @@
               <packing>
                 <property name="expand">False</property>
                 <property name="fill">False</property>
-                <property name="position">5</property>
+                <property name="position">6</property>
               </packing>
             </child>
             <child>
@@ -499,14 +456,13 @@
               <packing>
                 <property name="expand">False</property>
                 <property name="fill">False</property>
-                <property name="position">6</property>
+                <property name="position">7</property>
               </packing>
             </child>
             <child>
               <object class="GtkAlignment" id="main_window_search_mime_combobox_alignment">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="xscale">0</property>
                 <property name="yscale">0</property>
                 <child>
                   <object class="GtkComboBox" id="main_window_search_mime_combobox">
@@ -514,16 +470,38 @@
                     <property name="can_focus">False</property>
                     <property name="model">main_window_search_mime_liststore</property>
                     <property name="active">0</property>
+                    <property name="has_entry">True</property>
+                    <property name="entry_text_column">0</property>
+                    <signal name="popdown" handler="main_window_search_mime_combobox_popdown_cb" swapped="no"/>
+                    <signal name="popup" handler="main_window_search_mime_combobox_popup_cb" swapped="no"/>
                     <child>
                       <object class="GtkCellRendererText" id="main_window_search_mime_renderer_description"/>
                       <attributes>
-                        <attribute name="text">0</attribute>
+                        <attribute name="text">1</attribute>
                       </attributes>
                     </child>
                     <child>
                       <object class="GtkCellRendererText" id="main_window_search_mime_renderer_type"/>
                       <attributes>
-                        <attribute name="text">1</attribute>
+                        <attribute name="text">0</attribute>
+                      </attributes>
+                    </child>
+                    <child>
+                      <object class="GtkCellRendererText" id="main_window_search_mime_renderer_extension"/>
+                      <attributes>
+                        <attribute name="text">2</attribute>
+                      </attributes>
+                    </child>
+                    <child>
+                      <object class="GtkCellRendererText" id="main_window_search_mime_renderer_lossyness"/>
+                      <attributes>
+                        <attribute name="text">3</attribute>
+                      </attributes>
+                    </child>
+                    <child>
+                      <object class="GtkCellRendererText" id="main_window_search_mime_renderer_freedom"/>
+                      <attributes>
+                        <attribute name="text">4</attribute>
                       </attributes>
                     </child>
                   </object>
@@ -532,7 +510,7 @@
               <packing>
                 <property name="expand">False</property>
                 <property name="fill">False</property>
-                <property name="position">7</property>
+                <property name="position">8</property>
               </packing>
             </child>
             <child>
@@ -554,7 +532,7 @@
               <packing>
                 <property name="expand">False</property>
                 <property name="fill">False</property>
-                <property name="position">8</property>
+                <property name="position">9</property>
               </packing>
             </child>
           </object>
@@ -690,18 +668,16 @@
       </object>
     </child>
   </object>
-  <object class="GtkListStore" id="GNUNET_GTK_peer_info_list_store">
+  <object class="GtkListStore" id="GNUNET_GTK_meta_data_list_store">
     <columns>
-      <!-- column-name peer_identity -->
-      <column type="gchararray"/>
-      <!-- column-name number_of_known_addresses -->
+      <!-- column-name extractor_meta_type -->
       <column type="guint"/>
-      <!-- column-name country_name -->
+      <!-- column-name extractor_meta_format -->
+      <column type="guint"/>
+      <!-- column-name extractor_meta_type_string -->
+      <column type="gchararray"/>
+      <!-- column-name extracotr_meta_value -->
       <column type="gchararray"/>
-      <!-- column-name country_flag -->
-      <column type="GdkPixbuf"/>
-      <!-- column-name bandwidth -->
-      <column type="guint64"/>
     </columns>
   </object>
   <object class="GtkAdjustment" id="adjustment1">
@@ -716,6 +692,20 @@
     <property name="page_increment">10</property>
     <property name="page_size">10</property>
   </object>
+  <object class="GtkListStore" id="GNUNET_GTK_peer_info_list_store">
+    <columns>
+      <!-- column-name peer_identity -->
+      <column type="gchararray"/>
+      <!-- column-name number_of_known_addresses -->
+      <column type="guint"/>
+      <!-- column-name country_name -->
+      <column type="gchararray"/>
+      <!-- column-name country_flag -->
+      <column type="GdkPixbuf"/>
+      <!-- column-name bandwidth -->
+      <column type="guint64"/>
+    </columns>
+  </object>
   <object class="GtkAdjustment" id="adjustment3">
     <property name="upper">100</property>
     <property name="step_increment">1</property>
@@ -733,7 +723,27 @@
     <property name="can_focus">False</property>
     <property name="stock">gtk-open</property>
   </object>
-  <object class="GtkImage" id="image10">
+  <object class="GtkImage" id="image2">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-go-up</property>
+  </object>
+  <object class="GtkImage" id="image3">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-new</property>
+  </object>
+  <object class="GtkImage" id="image4">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-find</property>
+  </object>
+  <object class="GtkImage" id="image5">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-go-down</property>
+  </object>
+  <object class="GtkImage" id="image6">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
     <property name="stock">gtk-index</property>
@@ -753,29 +763,74 @@
     <property name="can_focus">False</property>
     <property name="stock">gtk-index</property>
   </object>
+  <object class="GtkListStore" id="main_window_search_anonymity_liststore">
+    <columns>
+      <!-- column-name Name -->
+      <column type="gchararray"/>
+      <!-- column-name Level -->
+      <column type="guint"/>
+      <!-- column-name Color -->
+      <column type="gchararray"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0" translatable="yes">None</col>
+        <col id="1">0</col>
+        <col id="2" translatable="yes">#AAAA00000000</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">Normal</col>
+        <col id="1">1</col>
+        <col id="2" translatable="yes">#000000000000</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">Paranoid</col>
+        <col id="1">10</col>
+        <col id="2" translatable="yes">#0000AAAA0000</col>
+      </row>
+    </data>
+  </object>
   <object class="GtkListStore" id="main_window_search_mime_liststore">
     <columns>
       <!-- column-name MIME -->
       <column type="gchararray"/>
       <!-- column-name Type -->
       <column type="gchararray"/>
+      <!-- column-name Extension -->
+      <column type="gchararray"/>
+      <!-- column-name Lossyness -->
+      <column type="gchararray"/>
+      <!-- column-name Freedom -->
+      <column type="gchararray"/>
     </columns>
     <data>
       <row>
         <col id="0"> </col>
         <col id="1" translatable="yes">Any</col>
+        <col id="2" translatable="yes"> </col>
+        <col id="3" translatable="yes"> </col>
+        <col id="4" translatable="yes"> </col>
       </row>
       <row>
         <col id="0">plain/text</col>
         <col id="1" translatable="yes">Text</col>
+        <col id="2">txt</col>
+        <col id="3" translatable="yes">N/A</col>
+        <col id="4" translatable="yes">N/A</col>
       </row>
       <row>
         <col id="0">application/zip</col>
         <col id="1" translatable="yes">Zip</col>
+        <col id="2">zip</col>
+        <col id="3" translatable="yes">lossless</col>
+        <col id="4" translatable="yes">free</col>
       </row>
       <row>
         <col id="0">audio/mpeg</col>
         <col id="1" translatable="yes">MPEG audio</col>
+        <col id="2">mp3, mp2, mpeg</col>
+        <col id="3" translatable="yes">lossy</col>
+        <col id="4" translatable="yes">non-free</col>
       </row>
     </data>
   </object>
@@ -791,6 +846,14 @@
       <column type="gchararray"/>
     </columns>
   </object>
+  <object class="GtkSizeGroup" id="enties_and_comboboxes_sizegroup">
+    <property name="mode">vertical</property>
+    <widgets>
+      <widget name="main_window_search_entry"/>
+      <widget name="main_window_search_anonymity_combobox"/>
+      <widget name="main_window_search_mime_combobox"/>
+    </widgets>
+  </object>
   <object class="GtkWindow" id="namespace_selector_window">
     <property name="can_focus">False</property>
     <property name="events">GDK_LEAVE_NOTIFY_MASK | GDK_STRUCTURE_MASK</property>
diff --git a/src/fs/gnunet-fs-gtk.c b/src/fs/gnunet-fs-gtk.c
index 68c6be6..6833783 100644
--- a/src/fs/gnunet-fs-gtk.c
+++ b/src/fs/gnunet-fs-gtk.c
@@ -351,6 +351,7 @@ namespace_selector_treeview_cursor_changed_cb (GtkWidget *widget,
 {
   GtkBuilder *builder;
   GtkToggleButton *toggle_button;
+  GtkLabel *sel_namespace_label;
   gchar *value;
   GtkTreePath *treepath;
 
@@ -363,9 +364,13 @@ namespace_selector_treeview_cursor_changed_cb (GtkWidget *widget,
   if (!toggle_button)
     return;
 
+  sel_namespace_label = GTK_LABEL (gtk_builder_get_object (builder, "main_window_search_selected_namespace_label"));
+  if (sel_namespace_label)
+    return;
+
   if (GNUNET_GTK_get_tree_string (GTK_TREE_VIEW (widget), treepath, 0,
       &value))
-    gtk_button_set_label (GTK_BUTTON (toggle_button), value);
+    gtk_label_set_text (sel_namespace_label, value);
 
   gtk_tree_path_free (treepath);
 
@@ -446,6 +451,64 @@ main_window_search_button_clicked_cb (GtkButton *button, gpointer user_data)
   GNUNET_FS_uri_destroy (uri);
 }
 
+/**
+ * Add pseudonym data to tree store
+ *
+ * @param cls closure (the 'GtkListStore')
+ * @param pseudonym hash code of public key of pseudonym
+ * @param md meta data known about the pseudonym
+ * @param rating the local rating of the pseudonym
+ * @return GNUNET_OK to continue iteration, GNUNET_SYSERR to abort
+ */
+static int
+add_namespace_to_ts (void *cls, const GNUNET_HashCode * pseudonym,
+    const struct GNUNET_CONTAINER_MetaData *md, int rating)
+{
+  GtkTreeStore *ts = cls;
+  char *root;
+  char *ns_name;
+  GNUNET_HashCode *nsid;
+  char *description;
+  char *uris;
+  char *emsg;
+  struct GNUNET_FS_Uri *uri;
+  GtkTreeIter iter;
+
+  ns_name =
+      GNUNET_PSEUDONYM_id_to_name (GNUNET_FS_GTK_get_configuration (),
+                                   pseudonym);
+  nsid = GNUNET_malloc (sizeof (GNUNET_HashCode));
+  *nsid = *pseudonym;
+  root = NULL;
+  uris = GNUNET_CONTAINER_meta_data_get_by_type (md, EXTRACTOR_METATYPE_URI);
+  if (uris != NULL)
+  {
+    emsg = NULL;
+    uri = GNUNET_FS_uri_parse (uris, &emsg);
+    if (uri == NULL)
+      GNUNET_free (emsg);
+    root = GNUNET_FS_uri_sks_get_content_id (uri);
+    GNUNET_FS_uri_destroy (uri);
+  }
+  description =
+      GNUNET_CONTAINER_meta_data_get_first_by_types (md,
+                                                     EXTRACTOR_METATYPE_TITLE,
+                                                     EXTRACTOR_METATYPE_BOOK_TITLE,
+                                                     EXTRACTOR_METATYPE_DESCRIPTION,
+                                                     EXTRACTOR_METATYPE_SUMMARY,
+                                                     EXTRACTOR_METATYPE_ALBUM,
+                                                     EXTRACTOR_METATYPE_COMMENT,
+                                                     EXTRACTOR_METATYPE_SUBJECT,
+                                                     EXTRACTOR_METATYPE_KEYWORDS,
+                                                     -1);
+  gtk_tree_store_insert_with_values (ts, &iter, NULL, G_MAXINT, 0, ns_name, 1,
+      nsid, 2, root, 3, description, -1);
+  GNUNET_free (ns_name);
+  GNUNET_free_non_null (root);
+  GNUNET_free_non_null (description);
+  return GNUNET_OK;
+}
+
 void
 GNUNET_GTK_main_window_realize_cb (GtkWidget *widget, gpointer user_data)
 {
@@ -453,7 +516,6 @@ GNUNET_GTK_main_window_realize_cb (GtkWidget *widget, gpointer user_data)
   GtkTreeView *namespace_tree;
   GtkTreeStore *namespace_treestore;
   GtkBuilder *builder;
-  GtkToggleButton *toggle_button;
   GtkWidget *namespace_selector_window;
 
   builder = GTK_BUILDER (user_data);
@@ -463,24 +525,23 @@ GNUNET_GTK_main_window_realize_cb (GtkWidget *widget, gpointer user_data)
   namespace_tree = GTK_TREE_VIEW (GNUNET_FS_GTK_get_main_window_object
       ("namespace_selector_treeview"));
 
-  /* TODO: fetch real values from somewhere instead of filling the store with dummies */
-  gtk_tree_store_insert_with_values (namespace_treestore, &iter, NULL, 0, 0, "Any", 1, NULL, 2, "", 3, "Do not search in any particular namespace", -1);
-  gtk_tree_store_insert_with_values (namespace_treestore, &iter, NULL, 1, 0, "foo", 1, NULL, 2, "IAMTHEBESTOBEYMENOCARRIER", 3, "Tooltip1", -1);
-  gtk_tree_store_insert_with_values (namespace_treestore, &iter, NULL, 2, 0, "bar", 1, NULL, 2, "NOONEWILLKNOWTHISIDBECAUSEITSSECRET", 3, "Tooltip2", -1);
-  gtk_tree_store_insert_with_values (namespace_treestore, &iter, NULL, 3, 0, "baz", 1, NULL, 2, "SSLOPENSSHGNUGTKGNUNETFTWYAYA", 3, "Tooltip3", -1);
+  gtk_tree_store_insert_with_values (namespace_treestore, &iter, NULL,
+      G_MAXINT, 0, "Any", 1, NULL, 2, "", 3,
+      "Do not search in any particular namespace", -1);
+  GNUNET_PSEUDONYM_list_all (GNUNET_FS_GTK_get_configuration (),
+                             &add_namespace_to_ts, namespace_treestore);
 
   /* FIXME: read currently selected namespace from somewhere instead of selecting 0th item */
   if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (namespace_treestore), &iter))
   {
     gchar *value;
+    GtkLabel *sel_namespace_label;
     GtkTreePath *treepath = gtk_tree_path_new_first ();
     gtk_tree_selection_select_iter (gtk_tree_view_get_selection (
         namespace_tree), &iter);
-    toggle_button = GTK_TOGGLE_BUTTON (GNUNET_FS_GTK_get_main_window_object
-        ("main_window_search_namespace_dropdown_button"));
-    if (GNUNET_GTK_get_tree_string (namespace_tree,
-        treepath, 0, &value))
-      gtk_button_set_label (GTK_BUTTON (toggle_button), value);
+    sel_namespace_label = GTK_LABEL (gtk_builder_get_object (builder, "main_window_search_selected_namespace_label"));
+    if (GNUNET_GTK_get_tree_string (namespace_tree, treepath, 0, &value))
+      gtk_label_set_text (sel_namespace_label, value);
     gtk_tree_path_free (treepath);
   }
 
-- 
1.7.4

LRN

2011-12-12 00:08

developer  

0002-Get-text-from-the-combobox-entry.patch (2,054 bytes)   
From 05631c692809b68c3bdba2939818bbe52b1b5b09 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?=
 =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Mon, 12 Dec 2011 00:47:28 +0400
Subject: [PATCH 2/2] Get text from the combobox entry

---
 src/fs/gnunet-fs-gtk.c |   12 ++++--------
 1 files changed, 4 insertions(+), 8 deletions(-)

diff --git a/src/fs/gnunet-fs-gtk.c b/src/fs/gnunet-fs-gtk.c
index 6833783..766241e 100644
--- a/src/fs/gnunet-fs-gtk.c
+++ b/src/fs/gnunet-fs-gtk.c
@@ -385,13 +385,14 @@ main_window_search_button_clicked_cb (GtkButton *button, gpointer user_data)
   GtkTreePath *namespace_treepath = NULL;
   GtkTreeModel *namespace_model = NULL;
   GtkComboBox *mime_combo;
+  GtkEntry *mime_entry;
   GtkTreeModel *mime_model;
   GtkEntry *query_entry;
   guint anonymity_level;
   GtkTreeIter iter;
   const char *entry_keywords;
   gchar *keywords;
-  gchar *mime_keyword;
+  const gchar *mime_keyword;
 
   GNUNET_HashCode *nsid = NULL;
   struct GNUNET_FS_Uri *uri;
@@ -404,12 +405,8 @@ main_window_search_button_clicked_cb (GtkButton *button, gpointer user_data)
 
   mime_combo = GTK_COMBO_BOX (GNUNET_FS_GTK_get_main_window_object
       ("main_window_search_mime_combobox"));
-  mime_model = gtk_combo_box_get_model (mime_combo);
-  if (mime_model && gtk_combo_box_get_active_iter (mime_combo, &iter))
-  {
-    mime_keyword = NULL;
-    gtk_tree_model_get (mime_model, &iter, 0, &mime_keyword, -1);
-  }
+  mime_entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (mime_combo)));
+  mime_keyword = gtk_entry_get_text (mime_entry);
 
   get_selected_namespace_treepath_iter_model_widget (builder,
       &namespace_treepath, &iter, &namespace_model, NULL);
@@ -421,7 +418,6 @@ main_window_search_button_clicked_cb (GtkButton *button, gpointer user_data)
   if (mime_keyword != NULL)
   {
     keywords = g_strdup_printf ("%s %s", entry_keywords, mime_keyword);
-    g_free (mime_keyword);
   }
   else
     keywords = g_strdup (entry_keywords);
-- 
1.7.4

LRN

2011-12-12 00:09

developer   ~0005041

Attached 0001-A-lump-of-GUI-changes-and-tweaks.patch and 0002-Get-text-from-the-combobox-entry.patch
These continue along the lines of 0004-New-search-bar-in-the-main-window.patch and towards fixing 0001944

LRN

2011-12-12 00:28

developer  

0003-Do-not-use-the-new-search-tab-keep-the-code-for-now.patch (861 bytes)   
From 8bee62674ccc6797ae4a23562183477051142690 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?=
 =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Mon, 12 Dec 2011 03:11:25 +0400
Subject: [PATCH 3/4] Do not use the 'new search' tab (keep the code for now)

---
 src/fs/gnunet-fs-gtk.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/src/fs/gnunet-fs-gtk.c b/src/fs/gnunet-fs-gtk.c
index 766241e..f292a33 100644
--- a/src/fs/gnunet-fs-gtk.c
+++ b/src/fs/gnunet-fs-gtk.c
@@ -581,7 +581,8 @@ run (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
                         GNUNET_FS_OPTIONS_END);
   if (fs != NULL)
   {
-    add_new_tab ();
+    /* Searches are now started from the search bar */
+    /* add_new_tab (); */
   }
   else
   {
-- 
1.7.4

LRN

2011-12-12 00:28

developer  

0004-Fix-search-tab-label.patch (8,639 bytes)   
From 03c29618313af80978396693ffcddbab4ace5285 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?=
 =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Mon, 12 Dec 2011 03:24:47 +0400
Subject: [PATCH 4/4] Fix search tab label

* Put all buttons into alignments with 0 scale, to prevent them from
  scaling vertically every time tab gets bigger due to being focused
* Put all buttons into a size group to force them to have the same size

I'm still not happy with the way labels are resized (or rather NOT
resized)
---
 contrib/gnunet_fs_gtk_search_tab.glade |  109 ++++++++++++++++++++++----------
 1 files changed, 75 insertions(+), 34 deletions(-)

diff --git a/contrib/gnunet_fs_gtk_search_tab.glade b/contrib/gnunet_fs_gtk_search_tab.glade
index 9a8fa61..196a60d 100644
--- a/contrib/gnunet_fs_gtk_search_tab.glade
+++ b/contrib/gnunet_fs_gtk_search_tab.glade
@@ -172,22 +172,30 @@
           </object>
           <packing>
             <property name="expand">True</property>
-            <property name="fill">False</property>
+            <property name="fill">True</property>
             <property name="padding">5</property>
             <property name="position">0</property>
           </packing>
         </child>
         <child>
-          <object class="GtkButton" id="_search_result_label_play_button">
-            <property name="use_action_appearance">False</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
+          <object class="GtkAlignment" id="_search_result_label_play_button_alignment">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="xscale">0</property>
+            <property name="yscale">0</property>
             <child>
-              <object class="GtkImage" id="play_icon_stock_image">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="stock">gtk-media-play</property>
-                <property name="icon-size">2</property>
+              <object class="GtkButton" id="_search_result_label_play_button">
+                <property name="use_action_appearance">False</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <child>
+                  <object class="GtkImage" id="play_icon_stock_image">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="stock">gtk-media-play</property>
+                    <property name="icon-size">2</property>
+                  </object>
+                </child>
               </object>
             </child>
           </object>
@@ -198,17 +206,25 @@
           </packing>
         </child>
         <child>
-          <object class="GtkButton" id="_search_result_label_pause_button">
-            <property name="use_action_appearance">False</property>
+          <object class="GtkAlignment" id="_search_result_label_pause_button_alignment">
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
+            <property name="can_focus">False</property>
+            <property name="xscale">0</property>
+            <property name="yscale">0</property>
             <child>
-              <object class="GtkImage" id="pause_icon_stock_image">
+              <object class="GtkButton" id="_search_result_label_pause_button">
+                <property name="use_action_appearance">False</property>
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="stock">gtk-media-pause</property>
-                <property name="icon-size">2</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <child>
+                  <object class="GtkImage" id="pause_icon_stock_image">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="stock">gtk-media-pause</property>
+                    <property name="icon-size">2</property>
+                  </object>
+                </child>
               </object>
             </child>
           </object>
@@ -219,16 +235,24 @@
           </packing>
         </child>
         <child>
-          <object class="GtkButton" id="_search_result_label_clear_button">
-            <property name="use_action_appearance">False</property>
+          <object class="GtkAlignment" id="_search_result_label_clear_button_alignment">
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
+            <property name="can_focus">False</property>
+            <property name="xscale">0</property>
+            <property name="yscale">0</property>
             <child>
-              <object class="GtkImage" id="clear_icon_stock_image">
+              <object class="GtkButton" id="_search_result_label_clear_button">
+                <property name="use_action_appearance">False</property>
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="stock">gtk-clear</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <child>
+                  <object class="GtkImage" id="clear_icon_stock_image">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="stock">gtk-clear</property>
+                  </object>
+                </child>
               </object>
             </child>
           </object>
@@ -240,18 +264,26 @@
           </packing>
         </child>
         <child>
-          <object class="GtkButton" id="_search_result_label_close_button">
-            <property name="use_action_appearance">False</property>
+          <object class="GtkAlignment" id="_search_result_label_close_button_alignment">
             <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="receives_default">True</property>
-            <property name="relief">half</property>
+            <property name="can_focus">False</property>
+            <property name="xscale">0</property>
+            <property name="yscale">0</property>
             <child>
-              <object class="GtkImage" id="close_icon_stock_image">
+              <object class="GtkButton" id="_search_result_label_close_button">
+                <property name="use_action_appearance">False</property>
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="stock">gtk-close</property>
-                <property name="icon-size">2</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="relief">half</property>
+                <child>
+                  <object class="GtkImage" id="close_icon_stock_image">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="stock">gtk-close</property>
+                    <property name="icon-size">2</property>
+                  </object>
+                </child>
               </object>
             </child>
           </object>
@@ -264,4 +296,13 @@
       </object>
     </child>
   </object>
+  <object class="GtkSizeGroup" id="_search_result_label_buttons_size_group">
+    <property name="mode">both</property>
+    <widgets>
+      <widget name="_search_result_label_play_button"/>
+      <widget name="_search_result_label_pause_button"/>
+      <widget name="_search_result_label_clear_button"/>
+      <widget name="_search_result_label_close_button"/>
+    </widgets>
+  </object>
 </interface>
-- 
1.7.4

LRN

2011-12-12 00:29

developer   ~0005042

Uploaded 0003-Do-not-use-the-new-search-tab-keep-the-code-for-now.patch and 0004-Fix-search-tab-label.patch
First one is one-liner to disable 'new search' tab, the second one is purely cosmetic.

Christian Grothoff

2011-12-12 14:23

manager   ~0005047

I just noticed that you bumped the gtk required version to 2.24, with gtk 2.20, I now get:

(<unknown>:7476): Gtk-WARNING **: Unknown property: GtkComboBox.has-entry

(<unknown>:7476): Gtk-WARNING **: Unknown property: GtkComboBox.entry-text-column

(<unknown>:7476): Gtk-WARNING **: Could not find signal handler 'main_window_search_mime_combobox_popdown_cb'

(<unknown>:7476): Gtk-WARNING **: Could not find signal handler 'main_window_search_mime_combobox_popup_cb'


I think requiring 2.24 is a bit aggressive right now...

Christian Grothoff

2011-12-12 14:28

manager   ~0005048

Playing around with the UI, I also get

(<unknown>:7476): GLib-GObject-WARNING **: invalid cast from `GtkCellView' to `GtkEntry'

(<unknown>:7476): Gtk-CRITICAL **: gtk_entry_get_text: assertion `GTK_IS_ENTRY
(entry)' failed

whenever I start a search with the 'Find' button.

Christian Grothoff

2011-12-12 14:29

manager   ~0005049

Also, I should mention that selecting the namespace doesn't actually work (at least with gtk 2.20).

LRN

2011-12-12 14:34

developer   ~0005050

has-entry is necessary to keep combobox small (otherwise it contains the whole row, not just first column). H-m-m-m...although i think there's a way to fix this, i'll try it today.

main_window_search_mime_combobox_pop*_cb - forgot to remove these from .glade file

warnings and criticals - i'll need to see backtraces (i will try to reproduce these, most likely i have them too)

Namespace selector is slightly untested due to the fact that my node knows no namespaces (and thus i only have "Any" namespace, and the treeview is not configured to allow you to re-select a namespace that is already selected).

LRN

2011-12-12 15:08

developer  

gtk-2.24.8-custom-combo-01.png (1,446 bytes)   
gtk-2.24.8-custom-combo-01.png (1,446 bytes)   

LRN

2011-12-12 15:08

developer  

gtk-2.24.8-custom-combo-02.png (1,702 bytes)   
gtk-2.24.8-custom-combo-02.png (1,702 bytes)   

LRN

2011-12-12 15:10

developer  

custom_combo.glade (6,565 bytes)

LRN

2011-12-12 15:10

developer   ~0005051

Can't fix the need for has-entry. Either has-entry stays, or mime type selection combobox will be as long as its longest row is. OR i could scrap it completely and do the same thing i did with the namespace selector (by the way, i've made a "custom" combobox lookalike out of existing elements - see the two gtk-2.24.8-custom-combo images, the source is in custom_combo.glade; we could use it instead).

LRN

2011-12-12 15:15

developer   ~0005052

I'm not getting GTK_ENTRY-related errors when i search - are you sure you've applied 0002-Get-text-from-the-combobox-entry.patch ?

LRN

2011-12-12 15:15

developer   ~0005053

(to clarify: patches are applied in the same order they are uploaded, not in the order that numbers in file names might suggest).

LRN

2011-12-12 15:41

developer  

0001-Make-tabs-smaller.patch (4,467 bytes)   
From b1130434bb178966522adfd2f69695153312c475 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?=
 =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Mon, 12 Dec 2011 18:18:10 +0400
Subject: [PATCH 1/3] Make tabs smaller

---
 contrib/gnunet_fs_gtk_main_window.glade |   71 ++++++++++++++++---------------
 1 files changed, 37 insertions(+), 34 deletions(-)

diff --git a/contrib/gnunet_fs_gtk_main_window.glade b/contrib/gnunet_fs_gtk_main_window.glade
index 4fdc888..209cc51 100644
--- a/contrib/gnunet_fs_gtk_main_window.glade
+++ b/contrib/gnunet_fs_gtk_main_window.glade
@@ -551,6 +551,9 @@
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="scrollable">True</property>
+                <property name="tab_border">0</property>
+                <property name="tab_hborder">0</property>
+                <property name="tab_vborder">0</property>
                 <signal name="switch-page" handler="GNUNET_GTK_main_window_notebook_switch_page_cb" after="yes" swapped="no"/>
               </object>
               <packing>
@@ -668,6 +671,20 @@
       </object>
     </child>
   </object>
+  <object class="GtkListStore" id="GNUNET_GTK_peer_info_list_store">
+    <columns>
+      <!-- column-name peer_identity -->
+      <column type="gchararray"/>
+      <!-- column-name number_of_known_addresses -->
+      <column type="guint"/>
+      <!-- column-name country_name -->
+      <column type="gchararray"/>
+      <!-- column-name country_flag -->
+      <column type="GdkPixbuf"/>
+      <!-- column-name bandwidth -->
+      <column type="guint64"/>
+    </columns>
+  </object>
   <object class="GtkListStore" id="GNUNET_GTK_meta_data_list_store">
     <columns>
       <!-- column-name extractor_meta_type -->
@@ -692,20 +709,6 @@
     <property name="page_increment">10</property>
     <property name="page_size">10</property>
   </object>
-  <object class="GtkListStore" id="GNUNET_GTK_peer_info_list_store">
-    <columns>
-      <!-- column-name peer_identity -->
-      <column type="gchararray"/>
-      <!-- column-name number_of_known_addresses -->
-      <column type="guint"/>
-      <!-- column-name country_name -->
-      <column type="gchararray"/>
-      <!-- column-name country_flag -->
-      <column type="GdkPixbuf"/>
-      <!-- column-name bandwidth -->
-      <column type="guint64"/>
-    </columns>
-  </object>
   <object class="GtkAdjustment" id="adjustment3">
     <property name="upper">100</property>
     <property name="step_increment">1</property>
@@ -834,26 +837,6 @@
       </row>
     </data>
   </object>
-  <object class="GtkTreeStore" id="main_window_search_namespace_treestore">
-    <columns>
-      <!-- column-name Name -->
-      <column type="gchararray"/>
-      <!-- column-name Key -->
-      <column type="gpointer"/>
-      <!-- column-name KeyTextual -->
-      <column type="gchararray"/>
-      <!-- column-name Tooltip -->
-      <column type="gchararray"/>
-    </columns>
-  </object>
-  <object class="GtkSizeGroup" id="enties_and_comboboxes_sizegroup">
-    <property name="mode">vertical</property>
-    <widgets>
-      <widget name="main_window_search_entry"/>
-      <widget name="main_window_search_anonymity_combobox"/>
-      <widget name="main_window_search_mime_combobox"/>
-    </widgets>
-  </object>
   <object class="GtkWindow" id="namespace_selector_window">
     <property name="can_focus">False</property>
     <property name="events">GDK_LEAVE_NOTIFY_MASK | GDK_STRUCTURE_MASK</property>
@@ -906,4 +889,24 @@
       </object>
     </child>
   </object>
+  <object class="GtkSizeGroup" id="enties_and_comboboxes_sizegroup">
+    <property name="mode">vertical</property>
+    <widgets>
+      <widget name="main_window_search_entry"/>
+      <widget name="main_window_search_anonymity_combobox"/>
+      <widget name="main_window_search_mime_combobox"/>
+    </widgets>
+  </object>
+  <object class="GtkTreeStore" id="main_window_search_namespace_treestore">
+    <columns>
+      <!-- column-name Name -->
+      <column type="gchararray"/>
+      <!-- column-name Key -->
+      <column type="gpointer"/>
+      <!-- column-name KeyTextual -->
+      <column type="gchararray"/>
+      <!-- column-name Tooltip -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
 </interface>
-- 
1.7.4

0001-Make-tabs-smaller.patch (4,467 bytes)   

LRN

2011-12-12 15:41

developer  

0002-Remove-has-entry-hide-columns-del-signals.patch (9,157 bytes)   
From 92e1436f0e2592cb6c80a87eb7f758d5cb6d90c4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?=
 =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Mon, 12 Dec 2011 18:37:24 +0400
Subject: [PATCH 2/3] Remove has-entry, hide columns, del signals

---
 contrib/gnunet_fs_gtk_main_window.glade |  144 ++++++++++++++++---------------
 1 files changed, 73 insertions(+), 71 deletions(-)

diff --git a/contrib/gnunet_fs_gtk_main_window.glade b/contrib/gnunet_fs_gtk_main_window.glade
index 209cc51..dadb2e1 100644
--- a/contrib/gnunet_fs_gtk_main_window.glade
+++ b/contrib/gnunet_fs_gtk_main_window.glade
@@ -2,6 +2,50 @@
 <interface>
   <requires lib="gtk+" version="2.24"/>
   <!-- interface-naming-policy project-wide -->
+  <object class="GtkListStore" id="GNUNET_GTK_meta_data_list_store">
+    <columns>
+      <!-- column-name extractor_meta_type -->
+      <column type="guint"/>
+      <!-- column-name extractor_meta_format -->
+      <column type="guint"/>
+      <!-- column-name extractor_meta_type_string -->
+      <column type="gchararray"/>
+      <!-- column-name extracotr_meta_value -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkAdjustment" id="adjustment1">
+    <property name="upper">100</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+    <property name="page_size">10</property>
+  </object>
+  <object class="GtkAdjustment" id="adjustment2">
+    <property name="upper">100</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+    <property name="page_size">10</property>
+  </object>
+  <object class="GtkImage" id="image3">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-new</property>
+  </object>
+  <object class="GtkImage" id="image4">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-find</property>
+  </object>
+  <object class="GtkImage" id="image5">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-go-down</property>
+  </object>
+  <object class="GtkImage" id="image6">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-index</property>
+  </object>
   <object class="GtkWindow" id="GNUNET_GTK_main_window">
     <property name="can_focus">False</property>
     <property name="title" translatable="yes">gnunet-fs-gtk</property>
@@ -470,10 +514,6 @@
                     <property name="can_focus">False</property>
                     <property name="model">main_window_search_mime_liststore</property>
                     <property name="active">0</property>
-                    <property name="has_entry">True</property>
-                    <property name="entry_text_column">0</property>
-                    <signal name="popdown" handler="main_window_search_mime_combobox_popdown_cb" swapped="no"/>
-                    <signal name="popup" handler="main_window_search_mime_combobox_popup_cb" swapped="no"/>
                     <child>
                       <object class="GtkCellRendererText" id="main_window_search_mime_renderer_description"/>
                       <attributes>
@@ -481,7 +521,9 @@
                       </attributes>
                     </child>
                     <child>
-                      <object class="GtkCellRendererText" id="main_window_search_mime_renderer_type"/>
+                      <object class="GtkCellRendererText" id="main_window_search_mime_renderer_type">
+                        <property name="visible">False</property>
+                      </object>
                       <attributes>
                         <attribute name="text">0</attribute>
                       </attributes>
@@ -493,13 +535,17 @@
                       </attributes>
                     </child>
                     <child>
-                      <object class="GtkCellRendererText" id="main_window_search_mime_renderer_lossyness"/>
+                      <object class="GtkCellRendererText" id="main_window_search_mime_renderer_lossyness">
+                        <property name="visible">False</property>
+                      </object>
                       <attributes>
                         <attribute name="text">3</attribute>
                       </attributes>
                     </child>
                     <child>
-                      <object class="GtkCellRendererText" id="main_window_search_mime_renderer_freedom"/>
+                      <object class="GtkCellRendererText" id="main_window_search_mime_renderer_freedom">
+                        <property name="visible">False</property>
+                      </object>
                       <attributes>
                         <attribute name="text">4</attribute>
                       </attributes>
@@ -685,30 +731,6 @@
       <column type="guint64"/>
     </columns>
   </object>
-  <object class="GtkListStore" id="GNUNET_GTK_meta_data_list_store">
-    <columns>
-      <!-- column-name extractor_meta_type -->
-      <column type="guint"/>
-      <!-- column-name extractor_meta_format -->
-      <column type="guint"/>
-      <!-- column-name extractor_meta_type_string -->
-      <column type="gchararray"/>
-      <!-- column-name extracotr_meta_value -->
-      <column type="gchararray"/>
-    </columns>
-  </object>
-  <object class="GtkAdjustment" id="adjustment1">
-    <property name="upper">100</property>
-    <property name="step_increment">1</property>
-    <property name="page_increment">10</property>
-    <property name="page_size">10</property>
-  </object>
-  <object class="GtkAdjustment" id="adjustment2">
-    <property name="upper">100</property>
-    <property name="step_increment">1</property>
-    <property name="page_increment">10</property>
-    <property name="page_size">10</property>
-  </object>
   <object class="GtkAdjustment" id="adjustment3">
     <property name="upper">100</property>
     <property name="step_increment">1</property>
@@ -731,26 +753,6 @@
     <property name="can_focus">False</property>
     <property name="stock">gtk-go-up</property>
   </object>
-  <object class="GtkImage" id="image3">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="stock">gtk-new</property>
-  </object>
-  <object class="GtkImage" id="image4">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="stock">gtk-find</property>
-  </object>
-  <object class="GtkImage" id="image5">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="stock">gtk-go-down</property>
-  </object>
-  <object class="GtkImage" id="image6">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="stock">gtk-index</property>
-  </object>
   <object class="GtkImage" id="image7">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
@@ -837,6 +839,26 @@
       </row>
     </data>
   </object>
+  <object class="GtkSizeGroup" id="enties_and_comboboxes_sizegroup">
+    <property name="mode">vertical</property>
+    <widgets>
+      <widget name="main_window_search_entry"/>
+      <widget name="main_window_search_anonymity_combobox"/>
+      <widget name="main_window_search_mime_combobox"/>
+    </widgets>
+  </object>
+  <object class="GtkTreeStore" id="main_window_search_namespace_treestore">
+    <columns>
+      <!-- column-name Name -->
+      <column type="gchararray"/>
+      <!-- column-name Key -->
+      <column type="gpointer"/>
+      <!-- column-name KeyTextual -->
+      <column type="gchararray"/>
+      <!-- column-name Tooltip -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
   <object class="GtkWindow" id="namespace_selector_window">
     <property name="can_focus">False</property>
     <property name="events">GDK_LEAVE_NOTIFY_MASK | GDK_STRUCTURE_MASK</property>
@@ -889,24 +911,4 @@
       </object>
     </child>
   </object>
-  <object class="GtkSizeGroup" id="enties_and_comboboxes_sizegroup">
-    <property name="mode">vertical</property>
-    <widgets>
-      <widget name="main_window_search_entry"/>
-      <widget name="main_window_search_anonymity_combobox"/>
-      <widget name="main_window_search_mime_combobox"/>
-    </widgets>
-  </object>
-  <object class="GtkTreeStore" id="main_window_search_namespace_treestore">
-    <columns>
-      <!-- column-name Name -->
-      <column type="gchararray"/>
-      <!-- column-name Key -->
-      <column type="gpointer"/>
-      <!-- column-name KeyTextual -->
-      <column type="gchararray"/>
-      <!-- column-name Tooltip -->
-      <column type="gchararray"/>
-    </columns>
-  </object>
 </interface>
-- 
1.7.4

LRN

2011-12-12 15:41

developer  

0003-Revert-Get-text-from-the-combobox-entry.patch (2,125 bytes)   
From f072e6e8fe72da876d3ea9b53c2f8718742ba1b4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?=
 =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Mon, 12 Dec 2011 18:38:38 +0400
Subject: [PATCH 3/3] Revert "Get text from the combobox entry"

This reverts commit 05631c692809b68c3bdba2939818bbe52b1b5b09.
---
 src/fs/gnunet-fs-gtk.c |   12 ++++++++----
 1 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/src/fs/gnunet-fs-gtk.c b/src/fs/gnunet-fs-gtk.c
index f292a33..971775c 100644
--- a/src/fs/gnunet-fs-gtk.c
+++ b/src/fs/gnunet-fs-gtk.c
@@ -385,14 +385,13 @@ main_window_search_button_clicked_cb (GtkButton *button, gpointer user_data)
   GtkTreePath *namespace_treepath = NULL;
   GtkTreeModel *namespace_model = NULL;
   GtkComboBox *mime_combo;
-  GtkEntry *mime_entry;
   GtkTreeModel *mime_model;
   GtkEntry *query_entry;
   guint anonymity_level;
   GtkTreeIter iter;
   const char *entry_keywords;
   gchar *keywords;
-  const gchar *mime_keyword;
+  gchar *mime_keyword;
 
   GNUNET_HashCode *nsid = NULL;
   struct GNUNET_FS_Uri *uri;
@@ -405,8 +404,12 @@ main_window_search_button_clicked_cb (GtkButton *button, gpointer user_data)
 
   mime_combo = GTK_COMBO_BOX (GNUNET_FS_GTK_get_main_window_object
       ("main_window_search_mime_combobox"));
-  mime_entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (mime_combo)));
-  mime_keyword = gtk_entry_get_text (mime_entry);
+  mime_model = gtk_combo_box_get_model (mime_combo);
+  if (mime_model && gtk_combo_box_get_active_iter (mime_combo, &iter))
+  {
+    mime_keyword = NULL;
+    gtk_tree_model_get (mime_model, &iter, 0, &mime_keyword, -1);
+  }
 
   get_selected_namespace_treepath_iter_model_widget (builder,
       &namespace_treepath, &iter, &namespace_model, NULL);
@@ -418,6 +421,7 @@ main_window_search_button_clicked_cb (GtkButton *button, gpointer user_data)
   if (mime_keyword != NULL)
   {
     keywords = g_strdup_printf ("%s %s", entry_keywords, mime_keyword);
+    g_free (mime_keyword);
   }
   else
     keywords = g_strdup (entry_keywords);
-- 
1.7.4

LRN

2011-12-12 15:42

developer   ~0005054

Uploaded:

0001-Make-tabs-smaller.patch - cosmetic fix

0002-Remove-has-entry-hide-columns-del-signals.patch and 0003-Revert-Get-text-from-the-combobox-entry.patch revert some of the changes in previous patches

Christian Grothoff

2011-12-12 16:33

manager   ~0005059

I also think the tab label for namespace-searches should then not show the raw URI but the namespace-name + keyword.
(the full URI doesn't fit anyway and thus we currently just show garbage)

Christian Grothoff

2011-12-12 16:36

manager   ~0005060

Applied (hopefully) all patches up to the 3-revert patch in SVN 18561.

LRN

2011-12-12 20:55

developer  

0001-Multiple-GUI-changes.patch (18,187 bytes)   
From 4633e223d98298d0cf1ac88e2747542e72db8c06 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?=
 =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Mon, 12 Dec 2011 22:36:28 +0400
Subject: [PATCH 1/2] Multiple GUI changes

* Rename "Key" column to "Root"
* Make namespace selector focusable
* Namespace selector now tracks mouse pointer
* Namespace is chosen by a single click
* Namespace list is populated by namespace descovery callback
  instead of namespace list callback
  (adds found namespaces on the fly)

* Normalized cell background for search results
  Now rows look like they have uniform background
* Add tooltips with full query text to search tab

* Root is added to the query when a search in namespace is made
---
 contrib/gnunet_fs_gtk_main_window.glade |   90 ++++++++++----------
 contrib/gnunet_fs_gtk_search_tab.glade  |    5 +-
 src/fs/gnunet-fs-gtk-event_handler.c    |    1 +
 src/fs/gnunet-fs-gtk.c                  |  138 +++++++++++++++++++++++++++----
 4 files changed, 172 insertions(+), 62 deletions(-)

diff --git a/contrib/gnunet_fs_gtk_main_window.glade b/contrib/gnunet_fs_gtk_main_window.glade
index ac572bb..5183ba9 100644
--- a/contrib/gnunet_fs_gtk_main_window.glade
+++ b/contrib/gnunet_fs_gtk_main_window.glade
@@ -676,38 +676,6 @@
       <column type="gchararray"/>
     </columns>
   </object>
-  <object class="GtkAdjustment" id="adjustment1">
-    <property name="upper">100</property>
-    <property name="step_increment">1</property>
-    <property name="page_increment">10</property>
-    <property name="page_size">10</property>
-  </object>
-  <object class="GtkAdjustment" id="adjustment2">
-    <property name="upper">100</property>
-    <property name="step_increment">1</property>
-    <property name="page_increment">10</property>
-    <property name="page_size">10</property>
-  </object>
-  <object class="GtkImage" id="image3">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="stock">gtk-new</property>
-  </object>
-  <object class="GtkImage" id="image4">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="stock">gtk-find</property>
-  </object>
-  <object class="GtkImage" id="image5">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="stock">gtk-go-down</property>
-  </object>
-  <object class="GtkImage" id="image6">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="stock">gtk-index</property>
-  </object>
   <object class="GtkListStore" id="GNUNET_GTK_peer_info_list_store">
     <columns>
       <!-- column-name peer_identity -->
@@ -722,6 +690,18 @@
       <column type="guint64"/>
     </columns>
   </object>
+  <object class="GtkAdjustment" id="adjustment1">
+    <property name="upper">100</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+    <property name="page_size">10</property>
+  </object>
+  <object class="GtkAdjustment" id="adjustment2">
+    <property name="upper">100</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+    <property name="page_size">10</property>
+  </object>
   <object class="GtkAdjustment" id="adjustment3">
     <property name="upper">100</property>
     <property name="step_increment">1</property>
@@ -744,6 +724,26 @@
     <property name="can_focus">False</property>
     <property name="stock">gtk-go-up</property>
   </object>
+  <object class="GtkImage" id="image3">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-new</property>
+  </object>
+  <object class="GtkImage" id="image4">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-find</property>
+  </object>
+  <object class="GtkImage" id="image5">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-go-down</property>
+  </object>
+  <object class="GtkImage" id="image6">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-index</property>
+  </object>
   <object class="GtkImage" id="image7">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
@@ -786,6 +786,14 @@
       </row>
     </data>
   </object>
+  <object class="GtkSizeGroup" id="enties_and_comboboxes_sizegroup">
+    <property name="mode">vertical</property>
+    <widgets>
+      <widget name="main_window_search_entry"/>
+      <widget name="main_window_search_anonymity_combobox"/>
+      <widget name="main_window_search_mime_combobox"/>
+    </widgets>
+  </object>
   <object class="GtkListStore" id="main_window_search_mime_liststore">
     <columns>
       <!-- column-name MIME -->
@@ -830,21 +838,13 @@
       </row>
     </data>
   </object>
-  <object class="GtkSizeGroup" id="enties_and_comboboxes_sizegroup">
-    <property name="mode">vertical</property>
-    <widgets>
-      <widget name="main_window_search_entry"/>
-      <widget name="main_window_search_anonymity_combobox"/>
-      <widget name="main_window_search_mime_combobox"/>
-    </widgets>
-  </object>
   <object class="GtkTreeStore" id="main_window_search_namespace_treestore">
     <columns>
       <!-- column-name Name -->
       <column type="gchararray"/>
       <!-- column-name Key -->
       <column type="gpointer"/>
-      <!-- column-name KeyTextual -->
+      <!-- column-name Root -->
       <column type="gchararray"/>
       <!-- column-name Tooltip -->
       <column type="gchararray"/>
@@ -853,7 +853,6 @@
   <object class="GtkWindow" id="namespace_selector_window">
     <property name="can_focus">False</property>
     <property name="events">GDK_LEAVE_NOTIFY_MASK | GDK_STRUCTURE_MASK</property>
-    <property name="type">popup</property>
     <property name="resizable">False</property>
     <property name="type_hint">dropdown-menu</property>
     <property name="skip_taskbar_hint">True</property>
@@ -869,12 +868,15 @@
       <object class="GtkTreeView" id="namespace_selector_treeview">
         <property name="visible">True</property>
         <property name="can_focus">True</property>
+        <property name="is_focus">True</property>
         <property name="model">main_window_search_namespace_treestore</property>
         <property name="headers_clickable">False</property>
         <property name="search_column">0</property>
+        <property name="hover_selection">True</property>
         <property name="hover_expand">True</property>
         <property name="tooltip_column">3</property>
-        <signal name="cursor-changed" handler="namespace_selector_treeview_cursor_changed_cb" swapped="no"/>
+        <signal name="button-press-event" handler="namespace_selector_treeview_button_press_event_cb" swapped="no"/>
+        <signal name="button-release-event" handler="namespace_selector_treeview_button_release_event_cb" swapped="no"/>
         <child>
           <object class="GtkTreeViewColumn" id="name_column">
             <property name="sizing">autosize</property>
@@ -890,7 +892,7 @@
         <child>
           <object class="GtkTreeViewColumn" id="key_column">
             <property name="sizing">autosize</property>
-            <property name="title" translatable="yes">Key</property>
+            <property name="title" translatable="yes">Root</property>
             <child>
               <object class="GtkCellRendererText" id="namespace_selector_key_column_text_cell"/>
               <attributes>
diff --git a/contrib/gnunet_fs_gtk_search_tab.glade b/contrib/gnunet_fs_gtk_search_tab.glade
index 196a60d..93e5deb 100644
--- a/contrib/gnunet_fs_gtk_search_tab.glade
+++ b/contrib/gnunet_fs_gtk_search_tab.glade
@@ -89,7 +89,7 @@
                 <child>
                   <object class="GtkCellRendererText" id="search_result_mime_renderer"/>
                   <attributes>
-                    <attribute name="background">8</attribute>
+                    <attribute name="cell-background">8</attribute>
                     <attribute name="text">10</attribute>
                   </attributes>
                 </child>
@@ -123,7 +123,7 @@
                 <child>
                   <object class="GtkCellRendererText" id="search_result_applicability_renderer"/>
                   <attributes>
-                    <attribute name="background">8</attribute>
+                    <attribute name="cell-background">8</attribute>
                     <attribute name="text">11</attribute>
                   </attributes>
                 </child>
@@ -138,6 +138,7 @@
                 <child>
                   <object class="GtkCellRendererPixbuf" id="search_result_preview_renderer"/>
                   <attributes>
+                    <attribute name="cell-background">8</attribute>
                     <attribute name="pixbuf">3</attribute>
                   </attributes>
                 </child>
diff --git a/src/fs/gnunet-fs-gtk-event_handler.c b/src/fs/gnunet-fs-gtk-event_handler.c
index 7520c48..2a3d754 100644
--- a/src/fs/gnunet-fs-gtk-event_handler.c
+++ b/src/fs/gnunet-fs-gtk-event_handler.c
@@ -882,6 +882,7 @@ update_search_label (struct SearchTab *tab)
     GNUNET_asprintf (&name, "%.*s%s", 20, tab->query_txt,
                      strlen (tab->query_txt) > 20 ? "..." : "");
   gtk_label_set_text (tab->label, name);
+  gtk_widget_set_tooltip_text (GTK_WIDGET (tab->label), tab->query_txt);
   GNUNET_free (name);
 }
 
diff --git a/src/fs/gnunet-fs-gtk.c b/src/fs/gnunet-fs-gtk.c
index 3223ec7..d5a6cb5 100644
--- a/src/fs/gnunet-fs-gtk.c
+++ b/src/fs/gnunet-fs-gtk.c
@@ -137,7 +137,9 @@ main_window_search_namespace_dropdown_button_toggled_cb (GtkToggleButton *toggle
   gboolean active;
   GtkBuilder *builder = GTK_BUILDER (user_data);
   GtkWidget *namespace_selector_window;
+  GtkWidget *namespace_selector_treeview;
   namespace_selector_window = GTK_WIDGET (gtk_builder_get_object (builder, "namespace_selector_window"));
+  namespace_selector_treeview = GTK_WIDGET (gtk_builder_get_object (builder, "namespace_selector_treeview"));
   g_object_get (G_OBJECT (togglebutton), "active", &active, NULL);
   if (active)
   {
@@ -162,10 +164,14 @@ main_window_search_namespace_dropdown_button_toggled_cb (GtkToggleButton *toggle
 
     gtk_window_move (GTK_WINDOW (namespace_selector_window), popup_x, popup_y);
 
-    gtk_widget_show (namespace_selector_window);
+    gtk_widget_show_all (namespace_selector_window);
+    gtk_widget_grab_focus (namespace_selector_treeview);
   }
   else
+  {
     gtk_widget_hide (namespace_selector_window);
+    gtk_widget_grab_focus (GTK_WIDGET (togglebutton));
+  }
 }
 
 gboolean
@@ -314,18 +320,26 @@ namespace_selector_treeview_cursor_changed_cb (GtkWidget *widget,
   GtkBuilder *builder;
   GtkToggleButton *toggle_button;
   GtkLabel *sel_namespace_label;
+  GtkTreeModel *model;
   gchar *value;
   GtkTreePath *treepath;
+  GtkTreeRowReference *ref, *old;
 
   builder = GTK_BUILDER (user_data);
 
-  if (!get_selected_namespace_treepath_iter_model_widget (builder, &treepath, NULL, NULL, NULL))
-    return;
-
   toggle_button = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "main_window_search_namespace_dropdown_button"));
   if (!toggle_button)
     return;
 
+  if (!get_selected_namespace_treepath_iter_model_widget (builder, &treepath, NULL, &model, NULL))
+    return;
+  ref = gtk_tree_row_reference_new (model, treepath);
+  old = g_object_get_data (G_OBJECT (toggle_button), "selected-row-reference");
+  if (old)
+    gtk_tree_row_reference_free (old);
+  g_object_set_data (G_OBJECT (toggle_button), "selected-row-reference", ref);
+
+
   sel_namespace_label = GTK_LABEL (gtk_builder_get_object (builder, "main_window_search_selected_namespace_label"));
   if (!sel_namespace_label)
     return;
@@ -340,6 +354,72 @@ namespace_selector_treeview_cursor_changed_cb (GtkWidget *widget,
   gtk_toggle_button_set_active (toggle_button, FALSE);
 }
 
+GtkTreeRowReference *
+get_ns_selected_row (GtkTreeView *tree)
+{
+  GtkTreeSelection *sel;
+  GList *rows, *row;
+  GtkTreeModel *model;
+  GtkTreeRowReference *ref = NULL;
+
+  sel = gtk_tree_view_get_selection (tree);
+  rows = gtk_tree_selection_get_selected_rows (sel, &model);
+  for (row = rows; row; row = row->next)
+  {
+    ref = gtk_tree_row_reference_new (model, row->data);
+    if (ref != NULL)
+      break;
+  }
+  g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL);
+  g_list_free (rows);
+  return ref;
+}
+
+gboolean
+namespace_selector_treeview_button_press_event_cb (GtkWidget *widget,
+    GdkEvent *event, gpointer user_data)
+{
+  GtkTreeRowReference *ref = NULL;
+
+  ref = get_ns_selected_row (GTK_TREE_VIEW (widget));
+  if (ref != NULL)
+  {
+    gpointer old = g_object_get_data (G_OBJECT (widget), "pushed-rowreference");
+    if (old)
+      gtk_tree_row_reference_free (old);
+    g_object_set_data (G_OBJECT (widget), "pushed-rowreference", ref);
+  }
+  return FALSE;
+}
+
+gboolean
+namespace_selector_treeview_button_release_event_cb (GtkWidget *widget,
+    GdkEvent *event, gpointer user_data)
+{
+  GtkTreeRowReference *ref = NULL;
+  gpointer old = g_object_get_data (G_OBJECT (widget), "pushed-rowreference");
+
+  ref = get_ns_selected_row (GTK_TREE_VIEW (widget));
+  if (ref && old)
+  {
+    GtkTreePath *path_ref, *path_old;
+    path_ref = gtk_tree_row_reference_get_path (ref);
+    path_old = gtk_tree_row_reference_get_path (old);
+    if (gtk_tree_path_compare (path_ref, path_old) == 0)
+      namespace_selector_treeview_cursor_changed_cb (widget, user_data);
+    if (path_ref)
+      gtk_tree_path_free (path_ref);
+    if (path_old)
+      gtk_tree_path_free (path_old);
+  }
+  if (ref)
+    gtk_tree_row_reference_free (ref);
+  if (old)
+    gtk_tree_row_reference_free (old);
+  g_object_set_data (G_OBJECT (widget), "pushed-rowreference", NULL);
+  return FALSE;
+}
+
 void
 main_window_search_button_clicked_cb (GtkButton *button, gpointer user_data)
 {
@@ -350,17 +430,23 @@ main_window_search_button_clicked_cb (GtkButton *button, gpointer user_data)
   GtkTreeModel *mime_model;
   GtkEntry *query_entry;
   guint anonymity_level;
+  GtkTreeRowReference *ref = NULL;
   GtkTreeIter iter;
+  GtkToggleButton *toggle_button;
   const char *entry_keywords;
   gchar *keywords;
   gchar *mime_keyword;
 
   GNUNET_HashCode *nsid = NULL;
   struct GNUNET_FS_Uri *uri;
+  gchar *root = NULL;
   char *emsg;
 
   builder = GTK_BUILDER (user_data);
 
+  toggle_button = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder,
+      "main_window_search_namespace_dropdown_button"));
+
   if (!get_selected_anonymity_level (builder, &anonymity_level))
     return;
 
@@ -372,23 +458,30 @@ main_window_search_button_clicked_cb (GtkButton *button, gpointer user_data)
     mime_keyword = NULL;
     gtk_tree_model_get (mime_model, &iter, 0, &mime_keyword, -1);
   }
+  if (mime_keyword == NULL)
+    mime_keyword = g_strdup ("");
 
-  get_selected_namespace_treepath_iter_model_widget (builder,
-      &namespace_treepath, &iter, &namespace_model, NULL);
+  ref = g_object_get_data (G_OBJECT (toggle_button), "selected-row-reference");
+  if (ref)
+  {
+    namespace_model = gtk_tree_row_reference_get_model (ref);
+    namespace_treepath = gtk_tree_row_reference_get_path (ref);
+    gtk_tree_model_get_iter (namespace_model, &iter, namespace_treepath);
+  }
 
   query_entry = GTK_ENTRY (gtk_builder_get_object (builder,
       "main_window_search_entry"));
 
-  entry_keywords = gtk_entry_get_text (query_entry);
-  if (mime_keyword != NULL)
-  {
-    keywords = g_strdup_printf ("%s %s", entry_keywords, mime_keyword);
-    g_free (mime_keyword);
-  }
-  else
-    keywords = g_strdup (entry_keywords);
   if (namespace_treepath != NULL)
-    gtk_tree_model_get (namespace_model, &iter, 1, &nsid, -1);
+    gtk_tree_model_get (namespace_model, &iter, 1, &nsid, 2, &root, -1);
+  if (root == NULL)
+    root = g_strdup ("");
+
+  entry_keywords = gtk_entry_get_text (query_entry);
+
+  keywords = g_strdup_printf ("%s %s %s", entry_keywords, mime_keyword, root);
+  g_free (mime_keyword);
+  g_free (root);
   if (nsid != NULL)
   {
     uri = GNUNET_FS_uri_sks_create_from_nsid (nsid, keywords);
@@ -487,11 +580,25 @@ GNUNET_GTK_main_window_realize_cb (GtkWidget *widget, gpointer user_data)
   namespace_tree = GTK_TREE_VIEW (GNUNET_FS_GTK_get_main_window_object
       ("namespace_selector_treeview"));
 
+  /* FIXME: find a way to manage pseudonyms.
+   * Right now the list will be filled with ALL and ANY pseudonyms that we
+   * find, these are held as files in a special directory.
+   * I don't see an easy way to ignore certain pseudonyms in that directory,
+   * and that require for pseudonym management. Also, pseudonyms are presented
+   * in arbitrary order. We must either sort them (by name?) or let the user
+   * drag them around to change the order in which they appear in the list.
+   * All that is not possible with a simple "files in a directory" concept.
+   */
   gtk_tree_store_insert_with_values (namespace_treestore, &iter, NULL,
       G_MAXINT, 0, "Any", 1, NULL, 2, "", 3,
       "Do not search in any particular namespace", -1);
+  /*
   GNUNET_PSEUDONYM_list_all (GNUNET_FS_GTK_get_configuration (),
                              &add_namespace_to_ts, namespace_treestore);
+  */
+  GNUNET_PSEUDONYM_discovery_callback_register (
+      GNUNET_FS_GTK_get_configuration (),
+      &add_namespace_to_ts, namespace_treestore);
 
   /* FIXME: read currently selected namespace from somewhere instead of selecting 0th item */
   if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (namespace_treestore), &iter))
@@ -581,7 +688,6 @@ run (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 
 }
 
-
 int
 main (int argc, char *const *argv)
 {
-- 
1.7.4

0001-Multiple-GUI-changes.patch (18,187 bytes)   

LRN

2011-12-12 20:55

developer  

0002-Change-required-GTK-to-2.20.patch (956 bytes)   
From 9cb80da26c0f253f87d0cd14ba7dd21d7357d31d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?=
 =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Mon, 12 Dec 2011 23:06:36 +0400
Subject: [PATCH 2/2] Change required GTK to 2.20

---
 contrib/gnunet_fs_gtk_about_window.glade.in |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/contrib/gnunet_fs_gtk_about_window.glade.in b/contrib/gnunet_fs_gtk_about_window.glade.in
index ad94075..eab81bd 100644
--- a/contrib/gnunet_fs_gtk_about_window.glade.in
+++ b/contrib/gnunet_fs_gtk_about_window.glade.in
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
-  <requires lib="gtk+" version="2.24"/>
+  <requires lib="gtk+" version="2.20"/>
   <!-- interface-naming-policy project-wide -->
   <object class="GtkWindow" id="about_window">
     <property name="can_focus">False</property>
-- 
1.7.4

LRN

2011-12-12 20:56

developer   ~0005061

Uploaded:
0001-Multiple-GUI-changes.patch - see the patch description
0002-Change-required-GTK-to-2.20.patch - small fix

LRN

2011-12-13 19:22

developer  

0002-Various-changes.patch (18,269 bytes)   
From b9995d7f7363fcf22ec3f1240105d99bef581e95 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?=
 =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Tue, 13 Dec 2011 16:02:39 +0400
Subject: [PATCH 2/3] Various changes

* Make preview sensitive (prevent graying-out)
* Enable fs persistence and probes (crashes, but who said it was going
  to be easy?
* Make Save File dialog non-blocking
---
 contrib/gnunet_fs_gtk_download_as_dialog.glade |  106 +++++++++-------
 contrib/gnunet_fs_gtk_main_window.glade        |   17 ++--
 src/fs/gnunet-fs-gtk-download.c                |  154 +++++++++++++++++------
 src/fs/gnunet-fs-gtk.c                         |    5 +-
 4 files changed, 184 insertions(+), 98 deletions(-)

diff --git a/contrib/gnunet_fs_gtk_download_as_dialog.glade b/contrib/gnunet_fs_gtk_download_as_dialog.glade
index 74aa83f..d15ca72 100644
--- a/contrib/gnunet_fs_gtk_download_as_dialog.glade
+++ b/contrib/gnunet_fs_gtk_download_as_dialog.glade
@@ -9,6 +9,7 @@
     <property name="page_increment">10</property>
   </object>
   <object class="GtkFileChooserDialog" id="GNUNET_GTK_save_as_dialog">
+    <property name="can_focus">False</property>
     <property name="can_default">True</property>
     <property name="has_default">True</property>
     <property name="border_width">5</property>
@@ -17,26 +18,78 @@
     <property name="destroy_with_parent">True</property>
     <property name="icon_name">document-save-as</property>
     <property name="type_hint">dialog</property>
-    <property name="has_separator">False</property>
-    <property name="use_preview_label">False</property>
     <property name="action">save</property>
     <property name="preview_widget_active">False</property>
+    <property name="use_preview_label">False</property>
+    <signal name="response" handler="GNUNET_GTK_save_as_dialog_response_cb" swapped="no"/>
     <child internal-child="vbox">
       <object class="GtkVBox" id="dialog-vbox4">
         <property name="visible">True</property>
+        <property name="can_focus">False</property>
         <property name="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="dialog-action_area5">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="GNUNET_GTK_save_as_dialog_cancel_button">
+                <property name="label">gtk-cancel</property>
+                <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="use_stock">True</property>
+                <signal name="clicked" handler="GNUNET_GTK_save_as_dialog_cancel_button_clicked_cb" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="GNUNET_GTK_save_as_dialog_ok_button">
+                <property name="label">gtk-save</property>
+                <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+                <signal name="clicked" handler="GNUNET_GTK_save_as_dialog_ok_button_clicked_cb" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
         <child>
           <object class="GtkHBox" id="hbox2">
             <property name="visible">True</property>
+            <property name="can_focus">False</property>
             <child>
               <object class="GtkLabel" id="GNUNET_GTK_save_as_dialog_anonymity_label">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <property name="label" translatable="yes">_Anonymity:</property>
                 <property name="use_underline">True</property>
                 <property name="selectable">True</property>
                 <property name="mnemonic_widget">GNUNET_GTK_save_as_dialog_anonymity_spin_button</property>
               </object>
               <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
                 <property name="position">0</property>
               </packing>
             </child>
@@ -46,6 +99,10 @@
                 <property name="can_focus">True</property>
                 <property name="invisible_char">●</property>
                 <property name="caps_lock_warning">False</property>
+                <property name="primary_icon_activatable">False</property>
+                <property name="secondary_icon_activatable">False</property>
+                <property name="primary_icon_sensitive">True</property>
+                <property name="secondary_icon_sensitive">True</property>
                 <property name="adjustment">GNUNET_GTK_anonymity_adjustment</property>
                 <property name="numeric">True</property>
                 <signal name="value-changed" handler="GNUNET_GTK_anonymity_spin_button_value_changed_cb" after="yes" swapped="no"/>
@@ -59,11 +116,11 @@
             <child>
               <object class="GtkCheckButton" id="GNUNET_GTK_save_as_recursive_check_button">
                 <property name="label" translatable="yes">_recursive</property>
+                <property name="use_action_appearance">False</property>
                 <property name="visible">True</property>
                 <property name="sensitive">False</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">False</property>
-                <property name="use_action_appearance">False</property>
                 <property name="use_underline">True</property>
                 <property name="draw_indicator">True</property>
               </object>
@@ -81,49 +138,6 @@
             <property name="position">2</property>
           </packing>
         </child>
-        <child internal-child="action_area">
-          <object class="GtkHButtonBox" id="dialog-action_area5">
-            <property name="visible">True</property>
-            <property name="layout_style">end</property>
-            <child>
-              <object class="GtkButton" id="GNUNET_GTK_save_as_dialog_cancel_button">
-                <property name="label">gtk-cancel</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">False</property>
-                <property name="use_action_appearance">False</property>
-                <property name="use_stock">True</property>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="GNUNET_GTK_save_as_dialog_ok_button">
-                <property name="label">gtk-save</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="can_default">True</property>
-                <property name="has_default">True</property>
-                <property name="receives_default">True</property>
-                <property name="use_action_appearance">False</property>
-                <property name="use_stock">True</property>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">1</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="pack_type">end</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
       </object>
     </child>
     <action-widgets>
diff --git a/contrib/gnunet_fs_gtk_main_window.glade b/contrib/gnunet_fs_gtk_main_window.glade
index 5183ba9..37dab80 100644
--- a/contrib/gnunet_fs_gtk_main_window.glade
+++ b/contrib/gnunet_fs_gtk_main_window.glade
@@ -575,7 +575,6 @@
                     <property name="width_request">128</property>
                     <property name="height_request">128</property>
                     <property name="visible">True</property>
-                    <property name="sensitive">False</property>
                     <property name="can_focus">False</property>
                     <property name="has_tooltip">True</property>
                     <property name="tooltip_text" translatable="yes">Thumbnail associated with the currently selected content</property>
@@ -759,6 +758,14 @@
     <property name="can_focus">False</property>
     <property name="stock">gtk-index</property>
   </object>
+  <object class="GtkSizeGroup" id="enties_and_comboboxes_sizegroup">
+    <property name="mode">vertical</property>
+    <widgets>
+      <widget name="main_window_search_entry"/>
+      <widget name="main_window_search_anonymity_combobox"/>
+      <widget name="main_window_search_mime_combobox"/>
+    </widgets>
+  </object>
   <object class="GtkListStore" id="main_window_search_anonymity_liststore">
     <columns>
       <!-- column-name Name -->
@@ -786,14 +793,6 @@
       </row>
     </data>
   </object>
-  <object class="GtkSizeGroup" id="enties_and_comboboxes_sizegroup">
-    <property name="mode">vertical</property>
-    <widgets>
-      <widget name="main_window_search_entry"/>
-      <widget name="main_window_search_anonymity_combobox"/>
-      <widget name="main_window_search_mime_combobox"/>
-    </widgets>
-  </object>
   <object class="GtkListStore" id="main_window_search_mime_liststore">
     <columns>
       <!-- column-name MIME -->
diff --git a/src/fs/gnunet-fs-gtk-download.c b/src/fs/gnunet-fs-gtk-download.c
index fe239e5..d9451e1 100644
--- a/src/fs/gnunet-fs-gtk-download.c
+++ b/src/fs/gnunet-fs-gtk-download.c
@@ -27,65 +27,74 @@
 #include "gnunet-fs-gtk.h"
 #include "gnunet-fs-gtk-event_handler.h"
 
+struct dialog_context
+{
+  GtkBuilder *builder;
+  GtkWidget *dialog;
+  gint response;
+  struct DownloadContext *dc;
+};
 
 void
-GNUNET_FS_GTK_open_download_as_dialog (struct DownloadContext *dc)
+GNUNET_GTK_save_as_dialog_ok_button_clicked_cb (GtkButton *button,
+    gpointer user_data)
 {
-  GtkWidget *ad;
-  GtkBuilder *builder;
-  struct GNUNET_FS_Handle *fs;
-  uint64_t len;
+  return;
+  struct dialog_context *dlc = NULL;
+  dlc = g_object_get_data (G_OBJECT (button), "dialog-context");
+  if (dlc != NULL)
+    dlc->response = 1;
+}
+
+void
+GNUNET_GTK_save_as_dialog_cancel_button_clicked_cb (GtkButton *button,
+    gpointer user_data)
+{
+  return;
+  struct dialog_context *dlc = NULL;
+  dlc = g_object_get_data (G_OBJECT (button), "dialog-context");
+  if (dlc != NULL)
+    dlc->response = 2;
+}
+
+gboolean
+GNUNET_GTK_save_as_dialog_delete_event_cb (GtkWidget *widget, GdkEvent  *event,
+    gpointer user_data)
+{
+  GtkBuilder *builder = NULL;
+  struct dialog_context *dlc = NULL;
+  struct DownloadContext *dc = NULL;
   enum GNUNET_FS_DownloadOptions opt;
-  uint32_t anonymity;
+  struct GNUNET_FS_Handle *fs;
   struct DownloadEntry *de;
   GtkWidget *cb;
+  uint32_t anonymity;
+  uint64_t len;
 
-  builder =
-      GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_download_as_dialog.glade");
-  if (builder == NULL)
+  builder = GTK_BUILDER (user_data);
+  dlc = g_object_get_data (G_OBJECT (widget), "dialog-context");
+  if (dlc == NULL)
   {
-    if (dc->rr != NULL)
-      gtk_tree_row_reference_free (dc->rr);
-    GNUNET_free_non_null (dc->mime);
-    GNUNET_free_non_null (dc->filename);
-    GNUNET_FS_uri_destroy (dc->uri);
-    GNUNET_free (dc);
-    return;
+    g_object_unref (G_OBJECT (builder));
+    return FALSE;
   }
+  dc = dlc->dc;
   cb = GTK_WIDGET (gtk_builder_get_object
                    (builder, "GNUNET_GTK_save_as_recursive_check_button"));
-  if (GNUNET_FS_meta_data_test_for_directory (dc->meta))
-    gtk_widget_set_sensitive (cb, TRUE);
-  ad = GTK_WIDGET (gtk_builder_get_object
-                   (builder, "GNUNET_GTK_save_as_dialog"));
-  if (dc->filename != NULL)
-  {
-    char buf[1024];
-
-    if (NULL != getcwd (buf, sizeof (buf)))
-    {
-      if (strlen (buf) + strlen (dc->filename) + 2 < sizeof (buf))
-      {
-        strcat (buf, DIR_SEPARATOR_STR);
-        strcat (buf, dc->filename);
-      }
-      gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (ad), buf);
-    }
-  }
-  if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad)))
+  if (GTK_RESPONSE_OK != dlc->response)
   {
-    gtk_widget_destroy (ad);
-    g_object_unref (G_OBJECT (builder));
+    g_object_unref (G_OBJECT (dlc->builder));
     if (dc->rr != NULL)
       gtk_tree_row_reference_free (dc->rr);
     GNUNET_free_non_null (dc->mime);
     GNUNET_free_non_null (dc->filename);
     GNUNET_FS_uri_destroy (dc->uri);
     GNUNET_free (dc);
-    return;
+    g_free (dlc);
+    return FALSE;
   }
   GNUNET_free_non_null (dc->filename);
-  dc->filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ad));
+  dc->filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dlc->dialog));
   dc->is_recursive =
       (TRUE ==
        gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cb))) ? GNUNET_YES :
@@ -100,7 +109,6 @@ GNUNET_FS_GTK_open_download_as_dialog (struct DownloadContext *dc)
                                   (builder,
                                    "GNUNET_GTK_save_as_dialog_anonymity_spin_button")));
   len = GNUNET_FS_uri_chk_get_file_size (dc->uri);
-  gtk_widget_destroy (ad);
   g_object_unref (G_OBJECT (builder));
   de = GNUNET_malloc (sizeof (struct DownloadEntry));
   de->uri = dc->uri;
@@ -130,6 +138,72 @@ GNUNET_FS_GTK_open_download_as_dialog (struct DownloadContext *dc)
                                             NULL /* parent download ctx */ ));
   }
   GNUNET_free (dc);
+  GNUNET_free (dlc);
+  return FALSE;
+}
+
+void
+GNUNET_GTK_save_as_dialog_response_cb (GtkDialog *dialog,
+    gint response_id, gpointer user_data)
+{
+  struct dialog_context *dlc = NULL;
+  dlc = g_object_get_data (G_OBJECT (dialog), "dialog-context");
+  if (dlc != NULL)
+    dlc->response = response_id;
+  /* dialogs don't get delete-event the way normal windows do,
+   * call the handler manually
+   */
+  GNUNET_GTK_save_as_dialog_delete_event_cb (GTK_WIDGET (dialog), NULL, user_data);
+  gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+
+void
+GNUNET_FS_GTK_open_download_as_dialog (struct DownloadContext *dc)
+{
+  GtkWidget *ad;
+  GtkBuilder *builder;
+  GtkWidget *cb;
+  struct dialog_context *dlc;
+
+  builder =
+      GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_download_as_dialog.glade");
+  if (builder == NULL)
+  {
+    if (dc->rr != NULL)
+      gtk_tree_row_reference_free (dc->rr);
+    GNUNET_free_non_null (dc->mime);
+    GNUNET_free_non_null (dc->filename);
+    GNUNET_FS_uri_destroy (dc->uri);
+    GNUNET_free (dc);
+    return;
+  }
+  cb = GTK_WIDGET (gtk_builder_get_object
+                   (builder, "GNUNET_GTK_save_as_recursive_check_button"));
+  if (GNUNET_FS_meta_data_test_for_directory (dc->meta))
+    gtk_widget_set_sensitive (cb, TRUE);
+  ad = GTK_WIDGET (gtk_builder_get_object
+                   (builder, "GNUNET_GTK_save_as_dialog"));
+  if (dc->filename != NULL)
+  {
+    char buf[1024];
+
+    if (NULL != getcwd (buf, sizeof (buf)))
+    {
+      if (strlen (buf) + strlen (dc->filename) + 2 < sizeof (buf))
+      {
+        strcat (buf, DIR_SEPARATOR_STR);
+        strcat (buf, dc->filename);
+      }
+      gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (ad), buf);
+    }
+  }
+  dlc = g_new0 (struct dialog_context, 1);
+  dlc->builder = builder;
+  dlc->dialog = ad;
+  dlc->response = 0;
+  dlc->dc = dc;
+  g_object_set_data (G_OBJECT (ad), "dialog-context", dlc);
+  gtk_widget_show_all (ad);
 }
 
 /* end of gnunet-fs-gtk-download.c */
diff --git a/src/fs/gnunet-fs-gtk.c b/src/fs/gnunet-fs-gtk.c
index d5a6cb5..aa8d97b 100644
--- a/src/fs/gnunet-fs-gtk.c
+++ b/src/fs/gnunet-fs-gtk.c
@@ -648,9 +648,8 @@ run (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
   plugins = EXTRACTOR_plugin_add_defaults (EXTRACTOR_OPTION_DEFAULT_POLICY);
   fs = GNUNET_FS_start (GNUNET_GTK_main_loop_get_configuration (ml),
                         "gnunet-gtk", &GNUNET_GTK_fs_event_handler, NULL,
-                        GNUNET_FS_FLAGS_NONE
-                        /* fixme later for persistence/probes */ ,
-                        /* set other options here later! */
+                        GNUNET_FS_FLAGS_PERSISTENCE |
+                        GNUNET_FS_FLAGS_DO_PROBES,
                         GNUNET_FS_OPTIONS_END);
   if (fs != NULL)
   {
-- 
1.7.4

0002-Various-changes.patch (18,269 bytes)   

LRN

2011-12-13 19:22

developer  

0003-Disable-propes-and-persistence-they-are-broken.patch (1,198 bytes)   
From 9aa3ad8c10e5f188ce3db4fe11afe171c741f3bc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?=
 =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Tue, 13 Dec 2011 22:19:37 +0400
Subject: [PATCH 3/3] Disable propes and persistence - they are broken

---
 src/fs/gnunet-fs-gtk.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/fs/gnunet-fs-gtk.c b/src/fs/gnunet-fs-gtk.c
index aa8d97b..e115395 100644
--- a/src/fs/gnunet-fs-gtk.c
+++ b/src/fs/gnunet-fs-gtk.c
@@ -648,8 +648,8 @@ run (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
   plugins = EXTRACTOR_plugin_add_defaults (EXTRACTOR_OPTION_DEFAULT_POLICY);
   fs = GNUNET_FS_start (GNUNET_GTK_main_loop_get_configuration (ml),
                         "gnunet-gtk", &GNUNET_GTK_fs_event_handler, NULL,
-                        GNUNET_FS_FLAGS_PERSISTENCE |
-                        GNUNET_FS_FLAGS_DO_PROBES,
+                        GNUNET_FS_FLAGS_NONE /* | GNUNET_FS_FLAGS_PERSISTENCE |
+                        GNUNET_FS_FLAGS_DO_PROBES*/,
                         GNUNET_FS_OPTIONS_END);
   if (fs != NULL)
   {
-- 
1.7.4

LRN

2011-12-13 19:24

developer   ~0005092

0002-Various-changes.patch - mostly removes gtk_dialog_run() for file save dialog. Also makes preview widget sensitive. Enables FS persistence and probes.
0003-Disable-propes-and-persistence-they-are-broken.patch - Disables FS persistence and probes.

LRN

2011-12-16 10:43

developer  

0001-Make-metadata-list-items-selectable.patch (1,675 bytes)   
From 3bc7326564618dee481770f9afe489063c03e858 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?=
 =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Fri, 16 Dec 2011 11:24:30 +0400
Subject: [PATCH 1/3] Make metadata list items selectable

---
 contrib/gnunet_fs_gtk_main_window.glade |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/contrib/gnunet_fs_gtk_main_window.glade b/contrib/gnunet_fs_gtk_main_window.glade
index 37dab80..c741281 100644
--- a/contrib/gnunet_fs_gtk_main_window.glade
+++ b/contrib/gnunet_fs_gtk_main_window.glade
@@ -602,6 +602,7 @@
                         <property name="hadjustment">adjustment1</property>
                         <property name="vadjustment">adjustment2</property>
                         <property name="search_column">0</property>
+                        <property name="rubber_banding">True</property>
                         <property name="enable_grid_lines">both</property>
                         <child>
                           <object class="GtkTreeViewColumn" id="GNUNET_GTK_main_window_metadata_type_column">
@@ -628,7 +629,6 @@
                             <property name="sort_indicator">True</property>
                             <child>
                               <object class="GtkCellRendererText" id="GNUNET_GTK_main_window_metadata_value_renderer">
-                                <property name="sensitive">False</property>
                                 <property name="wrap_mode">word</property>
                               </object>
                               <attributes>
-- 
1.7.4

LRN

2011-12-16 10:44

developer  

0002-Make-metadata-copyable.patch (8,281 bytes)   
From cb10c6d3c4ee7c568575870d627f3b707d79b3f5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?=
 =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Fri, 16 Dec 2011 13:13:59 +0400
Subject: [PATCH 2/3] Make metadata copyable

---
 contrib/gnunet_fs_gtk_main_window.glade |   16 +++
 src/fs/gnunet-fs-gtk-event_handler.c    |  176 +++++++++++++++++++++++++++++++
 src/fs/gnunet-fs-gtk.c                  |    6 +
 3 files changed, 198 insertions(+), 0 deletions(-)

diff --git a/contrib/gnunet_fs_gtk_main_window.glade b/contrib/gnunet_fs_gtk_main_window.glade
index c741281..a47a445 100644
--- a/contrib/gnunet_fs_gtk_main_window.glade
+++ b/contrib/gnunet_fs_gtk_main_window.glade
@@ -604,6 +604,8 @@
                         <property name="search_column">0</property>
                         <property name="rubber_banding">True</property>
                         <property name="enable_grid_lines">both</property>
+                        <signal name="button-press-event" handler="GNUNET_GTK_main_window_metadata_treeview_button_press_event_cb" swapped="no"/>
+                        <signal name="popup-menu" handler="GNUNET_GTK_main_window_metadata_treeview_popup_menu_cb" swapped="no"/>
                         <child>
                           <object class="GtkTreeViewColumn" id="GNUNET_GTK_main_window_metadata_type_column">
                             <property name="sizing">autosize</property>
@@ -849,6 +851,20 @@
       <column type="gchararray"/>
     </columns>
   </object>
+  <object class="GtkMenu" id="metadata_popup_menu">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <child>
+      <object class="GtkMenuItem" id="Copy selection">
+        <property name="use_action_appearance">False</property>
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">Copy selection</property>
+        <property name="use_underline">True</property>
+        <signal name="activate" handler="metadata_copy_selection_activated" swapped="no"/>
+      </object>
+    </child>
+  </object>
   <object class="GtkWindow" id="namespace_selector_window">
     <property name="can_focus">False</property>
     <property name="events">GDK_LEAVE_NOTIFY_MASK | GDK_STRUCTURE_MASK</property>
diff --git a/src/fs/gnunet-fs-gtk-event_handler.c b/src/fs/gnunet-fs-gtk-event_handler.c
index 74c3ab5..8565bd0 100644
--- a/src/fs/gnunet-fs-gtk-event_handler.c
+++ b/src/fs/gnunet-fs-gtk-event_handler.c
@@ -1934,6 +1934,182 @@ GNUNET_GTK_main_window_notebook_switch_page_cb (GtkWidget * dummy,
   gtk_list_store_clear (ms);
 }
 
+static void
+copy_metadata_to_clipboard (GtkTreeModel *model, GtkTreePath *path,
+    GtkTreeIter *iter, gpointer user_data)
+{
+  gchar *type, *value;
+  GList **l = (GList **) user_data;
+
+  gtk_tree_model_get (model, iter, 2, &type, 3, &value, -1);
+
+  *l = g_list_prepend (*l, type);
+  *l = g_list_prepend (*l, value);
+}
+
+void
+metadata_copy_selection_activated (GtkMenuItem *menuitem, gpointer user_data)
+{
+  GtkBuilder *builder;
+  GtkTreeView *tree;
+  GtkClipboard *cb;
+  GList *pairs = NULL, *l, *next, *value, *type;
+  guint total_len;
+  gchar *s, *p;
+
+  builder = GTK_BUILDER (user_data);
+  tree = GTK_TREE_VIEW (gtk_builder_get_object (builder,
+      "GNUNET_GTK_main_window_metadata_treeview"));
+
+  gtk_tree_selection_selected_foreach (gtk_tree_view_get_selection (tree),
+      copy_metadata_to_clipboard, &pairs);
+
+  total_len = 0;
+  pairs = g_list_reverse (pairs);
+  for (l = pairs; l; l = next)
+  {
+    type = l;
+    value = l->next;
+    if (!value)
+      break;
+    next = value->next;
+    total_len += strlen ((gchar *) type->data)
+        + strlen ((gchar *) value->data) + 2 /* ": " */ + (next ? 1 : 0) /* "\n" */;
+  }
+  if (total_len > 0)
+  {
+    total_len += 1; /* "\0" */
+    s = g_new0 (gchar, total_len);
+    p = s;
+    for (l = pairs; l; l = next)
+    {
+      type = l;
+      value = l->next;
+      if (value)
+      {
+        next = value->next;
+        p = g_stpcpy (p, (gchar *) type->data);
+        p = g_stpcpy (p, ": ");
+        p = g_stpcpy (p, (gchar *) value->data);
+        if (next)
+          p = g_stpcpy (p, "\n");
+      }
+      else
+        next = NULL;
+    }
+  }
+  g_list_foreach (pairs, (GFunc) g_free, NULL);
+  g_list_free (pairs);
+  pairs = NULL;
+
+  if (total_len > 0)
+  {
+    cb = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
+    gtk_clipboard_set_text (cb, s, -1);
+    gtk_clipboard_store (cb);
+    g_free (s);
+  }
+}
+
+void
+metadata_menu_popup_position (GtkMenu *menu, gint *x, gint *y, gboolean *push_in,
+    gpointer user_data)
+{
+  GtkBuilder *builder;
+  GtkTreeView *tree;
+  GtkTreeSelection *sel;
+  GList *rows;
+  GtkTreePath *p;
+  GtkAllocation tree_allocation;
+  GdkWindow *main_window_gdk;
+  gint mwg_x, mwg_y, t_x, t_y, popup_x, popup_y;
+
+  builder = GTK_BUILDER (user_data);
+
+  tree = GTK_TREE_VIEW (gtk_builder_get_object (builder,
+      "GNUNET_GTK_main_window_metadata_treeview"));
+
+  gtk_widget_get_allocation (GTK_WIDGET (tree), &tree_allocation);
+
+  main_window_gdk = gtk_widget_get_window (GTK_WIDGET (tree));
+
+  gdk_window_get_origin (main_window_gdk, &mwg_x, &mwg_y);
+
+  t_x = mwg_x + tree_allocation.x;
+  t_y = mwg_y + tree_allocation.y;
+  popup_x = t_x;
+  popup_y = t_y;
+
+  sel = gtk_tree_view_get_selection (tree);
+
+  rows = gtk_tree_selection_get_selected_rows (sel, NULL);
+
+  if (rows->data)
+  {
+    GdkRectangle r;
+    p = (GtkTreePath *) rows->data;
+    gtk_tree_view_get_cell_area (tree, p, NULL, &r);
+    popup_x += r.x;
+    popup_y += r.y;
+  }
+
+  g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL);
+  g_list_free (rows);
+  *x = popup_x;
+  *y = popup_y;
+  *push_in = FALSE;
+}
+
+static void
+do_metadata_popup_menu (GtkWidget *widget, GdkEventButton *event,
+    gpointer user_data)
+{
+  GtkMenu *menu;
+  GtkBuilder *builder;
+  int button, event_time;
+  GtkMenuPositionFunc mpf = NULL;
+
+  builder = GTK_BUILDER (user_data);
+
+  menu = GTK_MENU (gtk_builder_get_object (builder, "metadata_popup_menu"));
+
+  if (event)
+    {
+      button = event->button;
+      event_time = event->time;
+    }
+  else
+    {
+      button = 0;
+      event_time = gtk_get_current_event_time ();
+    }
+
+  gtk_menu_attach_to_widget (menu, widget, NULL);
+  gtk_menu_popup (menu, NULL, NULL, mpf, user_data, 
+                  button, event_time);
+}
+
+gboolean
+GNUNET_GTK_main_window_metadata_treeview_button_press_event_cb (GtkWidget *widget,
+    GdkEventButton *event, gpointer user_data)
+{
+ /* Ignore double-clicks and triple-clicks */
+  if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
+  {
+    do_metadata_popup_menu (widget, event, user_data);
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+gboolean
+GNUNET_GTK_main_window_metadata_treeview_popup_menu_cb (GtkWidget *widget,
+    gpointer user_data)
+{
+  do_metadata_popup_menu (widget, NULL, user_data);
+  return TRUE;
+}
 
 
 /* end of gnunet-fs-gtk-event_handler.c */
diff --git a/src/fs/gnunet-fs-gtk.c b/src/fs/gnunet-fs-gtk.c
index e115395..dd4c951 100644
--- a/src/fs/gnunet-fs-gtk.c
+++ b/src/fs/gnunet-fs-gtk.c
@@ -572,6 +572,7 @@ GNUNET_GTK_main_window_realize_cb (GtkWidget *widget, gpointer user_data)
   GtkTreeStore *namespace_treestore;
   GtkBuilder *builder;
   GtkWidget *namespace_selector_window;
+  GtkTreeView *metadata_tree;
 
   builder = GTK_BUILDER (user_data);
 
@@ -579,6 +580,11 @@ GNUNET_GTK_main_window_realize_cb (GtkWidget *widget, gpointer user_data)
       ("main_window_search_namespace_treestore"));
   namespace_tree = GTK_TREE_VIEW (GNUNET_FS_GTK_get_main_window_object
       ("namespace_selector_treeview"));
+  metadata_tree = GTK_TREE_VIEW (GNUNET_FS_GTK_get_main_window_object
+      ("GNUNET_GTK_main_window_metadata_treeview"));
+
+  /* Allow multiple selection in metadata view */
+  gtk_tree_selection_set_mode (gtk_tree_view_get_selection (metadata_tree), GTK_SELECTION_MULTIPLE);
 
   /* FIXME: find a way to manage pseudonyms.
    * Right now the list will be filled with ALL and ANY pseudonyms that we
-- 
1.7.4

LRN

2011-12-16 10:44

developer  

0003-Be-more-careful-with-strings.patch (1,893 bytes)   
From 2b26c349c9146543e8813eba3c06f2d1a763e210 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?=
 =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Fri, 16 Dec 2011 13:42:49 +0400
Subject: [PATCH 3/3] Be more careful with strings

TODO: validate EVERY UTF-8 string we get from the net! And convert C ones.
---
 src/fs/gnunet-fs-gtk-common.c |   25 ++++++++++++++++++++++---
 1 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/src/fs/gnunet-fs-gtk-common.c b/src/fs/gnunet-fs-gtk-common.c
index e7cb07f..1a250c6 100644
--- a/src/fs/gnunet-fs-gtk-common.c
+++ b/src/fs/gnunet-fs-gtk-common.c
@@ -48,13 +48,32 @@ GNUNET_FS_GTK_add_meta_data_to_list_store (void *cls, const char *plugin_name,
                                            const char *data_mime_type,
                                            const char *data, size_t data_len)
 {
+  gchar *data_to_insert = NULL;
+  gboolean freedata = FALSE;
   GtkListStore *ls = GTK_LIST_STORE (cls);
 
-  if ((format == EXTRACTOR_METAFORMAT_UTF8) ||
-      (format == EXTRACTOR_METAFORMAT_C_STRING))
+  if (format == EXTRACTOR_METAFORMAT_UTF8)
+  {
+    if (g_utf8_validate (data, data_len, NULL))
+      data_to_insert = data;
+    else
+      format = EXTRACTOR_METAFORMAT_C_STRING;
+  }
+  if (format == EXTRACTOR_METAFORMAT_C_STRING)
+  {
+    gsize rd, wr;
+    data_to_insert = g_locale_to_utf8 (data, data_len, &rd, &wr, NULL);
+    freedata = TRUE;
+  }
+
+  if (data_to_insert)
+  {
     gtk_list_store_insert_with_values (ls, NULL, G_MAXINT, 0, type, 1, format,
                                        2, EXTRACTOR_metatype_to_string (type),
-                                       3, data, -1);
+                                       3, data_to_insert, -1);
+    if (freedata)
+      g_free (data_to_insert);
+  }
   return 0;
 }
 
-- 
1.7.4

LRN

2011-12-16 10:46

developer   ~0005105

Uploaded three more patches:
0001-Make-metadata-list-items-selectable.patch
0002-Make-metadata-copyable.patch
0003-Be-more-careful-with-strings.patch

They probably won't apply without previous ones, which is why they are here, despite the fact that they have NOTHING to do with gtk_dialog_run().

LRN

2011-12-16 10:57

developer  

0001-Don-t-re-attach-the-menu.patch (912 bytes)   
From 0a4ec6d7862710ab3aeaa07228917ae50dd0efc5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?=
 =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Fri, 16 Dec 2011 13:57:40 +0400
Subject: [PATCH] Don't re-attach the menu

---
 src/fs/gnunet-fs-gtk-event_handler.c |    1 -
 1 files changed, 0 insertions(+), 1 deletions(-)

diff --git a/src/fs/gnunet-fs-gtk-event_handler.c b/src/fs/gnunet-fs-gtk-event_handler.c
index 8565bd0..f9d1779 100644
--- a/src/fs/gnunet-fs-gtk-event_handler.c
+++ b/src/fs/gnunet-fs-gtk-event_handler.c
@@ -2084,7 +2084,6 @@ do_metadata_popup_menu (GtkWidget *widget, GdkEventButton *event,
       event_time = gtk_get_current_event_time ();
     }
 
-  gtk_menu_attach_to_widget (menu, widget, NULL);
   gtk_menu_popup (menu, NULL, NULL, mpf, user_data, 
                   button, event_time);
 }
-- 
1.7.4

Christian Grothoff

2011-12-16 20:08

manager   ~0005111

Patches up to 0003-Be more careful have now been applied.

LRN

2011-12-18 03:57

developer  

0001-Remove-old-commented-out-code.patch (884 bytes)   
From 85991274d203551e1eee5c462a29d621ef968199 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?=
 =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Sat, 17 Dec 2011 11:50:43 +0400
Subject: [PATCH 1/2] Remove old commented-out code

---
 src/lib/about.c |    5 -----
 1 files changed, 0 insertions(+), 5 deletions(-)

diff --git a/src/lib/about.c b/src/lib/about.c
index 52a0145..6e2b80f 100644
--- a/src/lib/about.c
+++ b/src/lib/about.c
@@ -121,11 +121,6 @@ GNUNET_GTK_display_about (const char *dialogfile)
   ad = GTK_WIDGET (gtk_builder_get_object (builder, "about_window"));
   g_object_set_data (G_OBJECT (ad), "gnunet-gtk-builder", builder);
   gtk_widget_show (ad);
-  /*
-  gtk_dialog_run (GTK_DIALOG (ad));
-  gtk_widget_destroy (ad);
-  g_object_unref (G_OBJECT (builder));
-  */
 }
 
 
-- 
1.7.4

LRN

2011-12-18 03:57

developer  

0002-Make-download-by-uri-dialogue-less.patch (20,833 bytes)   
From 95be8f054616beb31d8ae77e947c18e15bc91ed8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?=
 =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Sun, 18 Dec 2011 06:56:58 +0400
Subject: [PATCH 2/2] Make download-by-uri dialogue-less

---
 contrib/gnunet_fs_gtk_main_window.glade          |  198 ++++++++++++++++++++++
 src/fs/gnunet-fs-gtk-main_window_file_download.c |  182 +++++++++++++-------
 src/fs/gnunet-fs-gtk.c                           |    8 +-
 src/fs/gnunet-fs-gtk.h                           |   12 ++
 4 files changed, 330 insertions(+), 70 deletions(-)

diff --git a/contrib/gnunet_fs_gtk_main_window.glade b/contrib/gnunet_fs_gtk_main_window.glade
index a47a445..d8b4d10 100644
--- a/contrib/gnunet_fs_gtk_main_window.glade
+++ b/contrib/gnunet_fs_gtk_main_window.glade
@@ -677,6 +677,189 @@
       <column type="gchararray"/>
     </columns>
   </object>
+  <object class="GtkTextBuffer" id="GNUNET_GTK_open_url_dialog_url_textview_buffer">
+    <signal name="changed" handler="GNUNET_GTK_open_url_dialog_url_textview_buffer_changed_cb" swapped="no"/>
+  </object>
+  <object class="GtkWindow" id="GNUNET_GTK_open_url_window">
+    <property name="can_focus">False</property>
+    <property name="title" translatable="yes">Enter the URI to be downloaded</property>
+    <property name="modal">True</property>
+    <property name="default_width">640</property>
+    <property name="default_height">240</property>
+    <property name="destroy_with_parent">True</property>
+    <property name="skip_taskbar_hint">True</property>
+    <property name="skip_pager_hint">True</property>
+    <property name="deletable">False</property>
+    <property name="transient_for">GNUNET_GTK_main_window</property>
+    <child>
+      <object class="GtkVBox" id="GNUNET_GTK_open_url_dialog_main_vbox">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="spacing">2</property>
+        <child>
+          <object class="GtkHBox" id="GNUNET_GTK_open_url_dialog_query_hbox">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkLabel" id="GNUNET_GTK_open_url_dialog_url_label">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">_URI:</property>
+                <property name="use_underline">True</property>
+                <property name="selectable">True</property>
+                <property name="mnemonic_widget">GNUNET_GTK_open_url_dialog_url_textview</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="padding">4</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkFrame" id="frame1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label_xalign">0</property>
+                <property name="shadow_type">in</property>
+                <child>
+                  <object class="GtkAlignment" id="alignment1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <child>
+                      <object class="GtkTextView" id="GNUNET_GTK_open_url_dialog_url_textview">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="events">GDK_KEY_PRESS_MASK | GDK_STRUCTURE_MASK</property>
+                        <property name="wrap_mode">char</property>
+                        <property name="indent">20</property>
+                        <property name="buffer">GNUNET_GTK_open_url_dialog_url_textview_buffer</property>
+                        <property name="accepts_tab">False</property>
+                        <signal name="key-press-event" handler="GNUNET_GTK_open_url_dialog_url_textview_key_press_event_cb" swapped="no"/>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+                <child type="label_item">
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="GNUNET_GTK_open_url_dialog_anonymity_label">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">_Anonymity:</property>
+                <property name="use_underline">True</property>
+                <property name="selectable">True</property>
+                <property name="mnemonic_widget">GNUNET_GTK_open_url_dialog_anonymity_combobox</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="padding">4</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkAlignment" id="GNUNET_GTK_open_url_dialog_anonymity_combobox_alignment">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="yscale">0</property>
+                <child>
+                  <object class="GtkComboBox" id="GNUNET_GTK_open_url_dialog_anonymity_combobox">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="model">main_window_search_anonymity_liststore</property>
+                    <property name="active">1</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="GNUNET_GTK_open_url_dialog_anonymity_combobox_renderer"/>
+                      <attributes>
+                        <attribute name="foreground">2</attribute>
+                        <attribute name="text">0</attribute>
+                      </attributes>
+                    </child>
+                    <child>
+                      <object class="GtkCellRendererText" id="GNUNET_GTK_open_url_dialog_anonymity_combobox_renerer_level"/>
+                      <attributes>
+                        <attribute name="text">1</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">3</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="padding">5</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkHBox" id="hbox1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkButton" id="GNUNET_GTK_open_url_dialog_execute_button">
+                <property name="label">_Execute</property>
+                <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="sensitive">False</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="image">execute_stock_image2</property>
+                <property name="use_underline">True</property>
+                <signal name="clicked" handler="GNUNET_GTK_open_url_dialog_execute_button_clicked_cb" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="padding">4</property>
+                <property name="pack_type">end</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="GNUNET_GTK_open_url_dialog_cancel_button">
+                <property name="label">gtk-cancel</property>
+                <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+                <signal name="clicked" handler="GNUNET_GTK_open_url_dialog_cancel_button_clicked_cb" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="padding">4</property>
+                <property name="pack_type">end</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="padding">4</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
   <object class="GtkListStore" id="GNUNET_GTK_peer_info_list_store">
     <columns>
       <!-- column-name peer_identity -->
@@ -715,6 +898,21 @@
     <property name="page_increment">10</property>
     <property name="page_size">10</property>
   </object>
+  <object class="GtkImage" id="execute_stock_image">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-execute</property>
+  </object>
+  <object class="GtkImage" id="execute_stock_image1">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-execute</property>
+  </object>
+  <object class="GtkImage" id="execute_stock_image2">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-execute</property>
+  </object>
   <object class="GtkImage" id="image1">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
diff --git a/src/fs/gnunet-fs-gtk-main_window_file_download.c b/src/fs/gnunet-fs-gtk-main_window_file_download.c
index 19f7817..0d1114a 100644
--- a/src/fs/gnunet-fs-gtk-main_window_file_download.c
+++ b/src/fs/gnunet-fs-gtk-main_window_file_download.c
@@ -25,82 +25,66 @@
 #include "gnunet-fs-gtk-common.h"
 #include "gnunet-fs-gtk-download.h"
 #include "gnunet-fs-gtk.h"
+#include <gdk/gdkkeysyms.h>
 
-static GtkBuilder *builder;
-
+/**
+ * User selected "Open URI" in main window.
+ */
 void
-GNUNET_GTK_open_url_dialog_url_entry_changed_cb (GtkEditable * editable,
-                                                 gpointer user_data)
+GNUNET_GTK_main_menu_file_download_uri_activate_cb (GtkWidget * dummy,
+                                                    gpointer user_data)
 {
-  struct GNUNET_FS_Uri *uri;
-  char *perr;
-  const char *uris;
+  GtkBuilder *builder;
+  GtkWidget *dialog;
+  GtkTextBuffer *tb;
+  GtkTextIter ti_start, ti_end;
 
-  perr = NULL;
-  uris =
-      gtk_entry_get_text (GTK_ENTRY
-                          (gtk_builder_get_object
-                           (builder, "GNUNET_GTK_open_url_dialog_url_entry")));
-  if (uris != NULL)
-    uri = GNUNET_FS_uri_parse (uris, &perr);
-  else
-    uri = NULL;
-  gtk_widget_set_sensitive (GTK_WIDGET
-                            (gtk_builder_get_object
-                             (builder,
-                              "GNUNET_GTK_open_url_dialog_execute_button")),
-                            (uri == NULL) ? FALSE : TRUE);
-  if (uri != NULL)
-    GNUNET_FS_uri_destroy (uri);
-  else
-    GNUNET_free_non_null (perr);
-}
+  builder = GTK_BUILDER (user_data);
 
+  dialog = GTK_WIDGET (gtk_builder_get_object (builder, "GNUNET_GTK_open_url_window"));
+
+  tb = GTK_TEXT_BUFFER (gtk_builder_get_object (builder, "GNUNET_GTK_open_url_dialog_url_textview_buffer"));
+  gtk_text_buffer_get_iter_at_offset  (tb, &ti_start, 0);
+  gtk_text_buffer_get_iter_at_offset  (tb, &ti_end, -1);
+  gtk_text_buffer_delete (tb, &ti_start, &ti_end);
+
+  /* TODO: queue the clipboard, maybe there's valid URI in there?
+   * If so, get it. */
+
+  gtk_widget_show (dialog);
+}
 
-/**
- * User selected "Open URI" in main window.
- */
 void
-GNUNET_GTK_main_menu_file_download_uri_activate_cb (GtkWidget * dummy,
-                                                    gpointer data)
+GNUNET_GTK_open_url_dialog_execute_button_clicked_cb (GtkButton *button,
+    gpointer user_data)
 {
-  GtkWidget *ad;
-  const char *uris;
-  uint32_t anonymity;
-  struct GNUNET_FS_Uri *uri;
+  GtkBuilder *builder;
+  GtkWidget *dialog;
+  GtkTextBuffer *tb;
+  GtkTextIter ti_start, ti_end;
+  guint anonymity_level;
   char *perr;
-  struct DownloadContext *dc;
+  char *uris;
+  struct GNUNET_FS_Uri *uri;
 
-  GNUNET_assert (builder == NULL);
-  builder = GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_open_url_dialog.glade");
-  if (builder == NULL)
-  {
-    GNUNET_break (0);
-    return;
-  }
-  ad = GTK_WIDGET (gtk_builder_get_object
-                   (builder, "GNUNET_GTK_open_url_dialog"));
-  if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad)))
-  {
-    gtk_widget_destroy (ad);
-    g_object_unref (G_OBJECT (builder));
-    builder = NULL;
-    fprintf (stderr, "Dialog closed!\n");
+  builder = GTK_BUILDER (user_data);
+
+  dialog = GTK_WIDGET (gtk_builder_get_object (builder, "GNUNET_GTK_open_url_window"));
+
+  gtk_widget_hide (dialog);
+
+  tb = GTK_TEXT_BUFFER (gtk_builder_get_object (builder, "GNUNET_GTK_open_url_dialog_url_textview_buffer"));
+  gtk_text_buffer_get_iter_at_offset  (tb, &ti_start, 0);
+  gtk_text_buffer_get_iter_at_offset  (tb, &ti_end, -1);
+
+  uris = gtk_text_buffer_get_text (tb, &ti_start, &ti_end, FALSE);
+
+  if (!GNUNET_GTK_get_selected_anonymity_level (builder,
+      "main_window_search_anonymity_combobox", &anonymity_level))
     return;
-  }
-  uris =
-      gtk_entry_get_text (GTK_ENTRY
-                          (gtk_builder_get_object
-                           (builder, "GNUNET_GTK_open_url_dialog_url_entry")));
-  anonymity =
-      gtk_spin_button_get_value (GTK_SPIN_BUTTON
-                                 (gtk_builder_get_object
-                                  (builder,
-                                   "GNUNET_GTK_open_url_dialog_anonymity_spin_button")));
+
   uri = GNUNET_FS_uri_parse (uris, &perr);
-  gtk_widget_destroy (ad);
-  g_object_unref (G_OBJECT (builder));
-  builder = NULL;
+  g_free (uris);
   if (uri == NULL)
   {
     GNUNET_free (perr);
@@ -113,16 +97,17 @@ GNUNET_GTK_main_menu_file_download_uri_activate_cb (GtkWidget * dummy,
     fprintf (stderr, "Starting search!\n");
     GNUNET_break (NULL !=
                   GNUNET_FS_search_start (GNUNET_FS_GTK_get_fs_handle (), uri,
-                                          anonymity,
+                                          anonymity_level,
                                           GNUNET_FS_SEARCH_OPTION_NONE, NULL));
     GNUNET_FS_uri_destroy (uri);
     return;
   }
   if (GNUNET_FS_uri_test_chk (uri) || GNUNET_FS_uri_test_loc (uri))
   {
+    struct DownloadContext *dc;
     dc = GNUNET_malloc (sizeof (struct DownloadContext));
     dc->uri = uri;
-    dc->anonymity = anonymity;
+    dc->anonymity = anonymity_level;
     GNUNET_FS_GTK_open_download_as_dialog (dc);
     return;
   }
@@ -130,4 +115,69 @@ GNUNET_GTK_main_menu_file_download_uri_activate_cb (GtkWidget * dummy,
   GNUNET_FS_uri_destroy (uri);
 }
 
+void
+GNUNET_GTK_open_url_dialog_cancel_button_clicked_cb (GtkButton *button,
+    gpointer user_data)
+{
+  GtkBuilder *builder;
+  builder = GTK_BUILDER (user_data);
+
+  gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "GNUNET_GTK_open_url_window")));
+  return;
+}
+
+gboolean
+GNUNET_GTK_open_url_dialog_url_textview_key_press_event_cb (GtkWidget *widget,
+    GdkEventKey *event, gpointer user_data)
+{
+  GtkBuilder *builder;
+  builder = GTK_BUILDER (user_data);
+
+  if (event->keyval == GDK_KEY_Return)
+  {
+    GtkWidget *execute = GTK_WIDGET (gtk_builder_get_object (builder,
+        "GNUNET_GTK_open_url_dialog_execute_button"));
+    if (gtk_widget_get_sensitive (execute))
+      GNUNET_GTK_open_url_dialog_execute_button_clicked_cb (
+          GTK_BUTTON (execute), user_data);
+    return TRUE;
+  }
+  return FALSE;
+}
+
+void
+GNUNET_GTK_open_url_dialog_url_textview_buffer_changed_cb (
+    GtkTextBuffer *textbuffer, gpointer user_data)
+{
+  struct GNUNET_FS_Uri *uri;
+  GtkTextBuffer *tb;
+  GtkTextIter ti_start, ti_end;
+  GtkBuilder *builder;
+  char *perr;
+  char *uris;
+
+  builder = GTK_BUILDER (user_data);
+
+  perr = NULL;
+  tb = GTK_TEXT_BUFFER (gtk_builder_get_object (builder, "GNUNET_GTK_open_url_dialog_url_textview_buffer"));
+  gtk_text_buffer_get_iter_at_offset  (tb, &ti_start, 0);
+  gtk_text_buffer_get_iter_at_offset  (tb, &ti_end, -1);
+
+  uris = gtk_text_buffer_get_text (tb, &ti_start, &ti_end, FALSE);
+  if (uris != NULL)
+    uri = GNUNET_FS_uri_parse (uris, &perr);
+  else
+    uri = NULL;
+  g_free (uris);
+  gtk_widget_set_sensitive (GTK_WIDGET
+                            (gtk_builder_get_object
+                             (builder,
+                              "GNUNET_GTK_open_url_dialog_execute_button")),
+                            (uri == NULL) ? FALSE : TRUE);
+  if (uri != NULL)
+    GNUNET_FS_uri_destroy (uri);
+  else
+    GNUNET_free_non_null (perr);
+}
+
 /* end of gnunet-fs-gtk-main_window_file_download.c */
diff --git a/src/fs/gnunet-fs-gtk.c b/src/fs/gnunet-fs-gtk.c
index dd4c951..2e0f299 100644
--- a/src/fs/gnunet-fs-gtk.c
+++ b/src/fs/gnunet-fs-gtk.c
@@ -240,15 +240,14 @@ GNUNET_GTK_get_tree_string (GtkTreeView *treeview, GtkTreePath *treepath,
 }
 
 gboolean
-get_selected_anonymity_level (GtkBuilder *builder, guint *p_level)
+GNUNET_GTK_get_selected_anonymity_level (GtkBuilder *builder, gchar *combo_name, guint *p_level)
 {
   GtkComboBox *combo;
   GtkTreeIter iter;
   GtkTreeModel *model;
   guint level;
 
-  combo = GTK_COMBO_BOX(gtk_builder_get_object (builder,
-      "main_window_search_anonymity_combobox"));
+  combo = GTK_COMBO_BOX(gtk_builder_get_object (builder, combo_name));
   if (!combo)
     return FALSE;
 
@@ -447,7 +446,8 @@ main_window_search_button_clicked_cb (GtkButton *button, gpointer user_data)
   toggle_button = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder,
       "main_window_search_namespace_dropdown_button"));
 
-  if (!get_selected_anonymity_level (builder, &anonymity_level))
+  if (!GNUNET_GTK_get_selected_anonymity_level (builder,
+      "main_window_search_anonymity_combobox", &anonymity_level))
     return;
 
   mime_combo = GTK_COMBO_BOX (GNUNET_FS_GTK_get_main_window_object
diff --git a/src/fs/gnunet-fs-gtk.h b/src/fs/gnunet-fs-gtk.h
index 3b3228f..4cd76de 100644
--- a/src/fs/gnunet-fs-gtk.h
+++ b/src/fs/gnunet-fs-gtk.h
@@ -63,6 +63,18 @@ GObject *
 GNUNET_FS_GTK_get_main_window_object (const char *name);
 
 
+/**
+ * Get the selected anonymity level.
+ *
+ * @param builder builder object for the window
+ * @param combo_name name of the combobox widget to get anonymity from
+ * @param p_level pointer to a guint to receive the level value
+ * @return TRUE on success, FALSE on error
+ */
+gboolean
+GNUNET_GTK_get_selected_anonymity_level (GtkBuilder *builder,
+    gchar *combo_name, guint *p_level);
+
 
 #endif
 /* end of gnunet-fs-gtk.h */
-- 
1.7.4

LRN

2011-12-18 04:00

developer   ~0005124

Uploaded two patches:
0001-Remove-old-commented-out-code.patch - commented code cleanup
0002-Make-download-by-uri-dialogue-less.patch - turns download-by-uril dialog into non-dialog window. Also, uri is now entered into a textview (multiline), not an entry. Anonymity is chosen the same way it is in the searchbar (the same datastore is used, and a related utility function is now more universal).

LRN

2011-12-23 06:59

developer  

0001-Finally-got-rid-of-gtk_dialog_run-.-Completely.patch (261,567 bytes)   
From 6f8f555a1b6eefd0d67cbf2d251cb6ec036fa049 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?=
 =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= <lrn1986@gmail.com>
Date: Fri, 23 Dec 2011 01:22:26 +0400
Subject: [PATCH] Finally got rid of gtk_dialog_run(). Completely.

---
 .../gnunet_fs_gtk_create_namespace_dialog.glade    |   19 +-
 contrib/gnunet_fs_gtk_main_window.glade            | 2202 ++++++++++++++++++--
 contrib/gnunet_fs_gtk_open_directory_dialog.glade  |   18 +-
 .../gnunet_fs_gtk_select_pseudonym_dialog.glade    |  111 +-
 src/fs/gnunet-fs-gtk-download.c                    |    2 +-
 src/fs/gnunet-fs-gtk-edit_publish_dialog.c         | 1074 ++++++----
 src/fs/gnunet-fs-gtk-edit_publish_dialog.h         |   16 +-
 src/fs/gnunet-fs-gtk-main_window_adv_pseudonym.c   |  631 ++-----
 .../gnunet-fs-gtk-main_window_create_pseudonym.c   |   49 +-
 src/fs/gnunet-fs-gtk-main_window_file_publish.c    |  516 +++--
 src/fs/gnunet-fs-gtk-main_window_open_directory.c  |   50 +-
 src/fs/gnunet-fs-gtk.c                             |   34 +-
 src/fs/gnunet-fs-gtk.h                             |   13 +
 13 files changed, 3441 insertions(+), 1294 deletions(-)

diff --git a/contrib/gnunet_fs_gtk_create_namespace_dialog.glade b/contrib/gnunet_fs_gtk_create_namespace_dialog.glade
index 025d41c..3557705 100644
--- a/contrib/gnunet_fs_gtk_create_namespace_dialog.glade
+++ b/contrib/gnunet_fs_gtk_create_namespace_dialog.glade
@@ -4,6 +4,7 @@
   <!-- interface-naming-policy project-wide -->
   <object class="GtkDialog" id="GNUNET_GTK_create_namespace_dialog">
     <property name="visible">True</property>
+    <property name="can_focus">False</property>
     <property name="can_default">True</property>
     <property name="border_width">5</property>
     <property name="title" translatable="yes">Create namespace</property>
@@ -13,17 +14,20 @@
     <property name="icon_name">folder-new</property>
     <property name="type_hint">dialog</property>
     <property name="skip_taskbar_hint">True</property>
-    <property name="has_separator">False</property>
+    <signal name="response" handler="GNUNET_GTK_create_namespace_dialog_response_cb" swapped="no"/>
     <child internal-child="vbox">
       <object class="GtkVBox" id="GNUNET_GTK_create_namespace_vbox">
         <property name="visible">True</property>
+        <property name="can_focus">False</property>
         <property name="spacing">2</property>
         <child>
           <object class="GtkHBox" id="GNUNET_GTK_create_namespace_value_hbox">
             <property name="visible">True</property>
+            <property name="can_focus">False</property>
             <child>
               <object class="GtkLabel" id="GNUNET_GTK_create_namespace_name_label">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <property name="label" translatable="yes">_Name:</property>
                 <property name="use_underline">True</property>
               </object>
@@ -40,8 +44,14 @@
                 <property name="can_focus">True</property>
                 <property name="invisible_char">●</property>
                 <property name="activates_default">True</property>
+                <property name="primary_icon_activatable">False</property>
+                <property name="secondary_icon_activatable">False</property>
+                <property name="primary_icon_sensitive">True</property>
+                <property name="secondary_icon_sensitive">True</property>
               </object>
               <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
                 <property name="position">1</property>
               </packing>
             </child>
@@ -56,14 +66,15 @@
         <child internal-child="action_area">
           <object class="GtkHButtonBox" id="GNUNET_GTK_create_namespace_dialog-action_area">
             <property name="visible">True</property>
+            <property name="can_focus">False</property>
             <property name="layout_style">end</property>
             <child>
               <object class="GtkButton" id="GNUNET_GTK_create_namespace_cancel_button">
                 <property name="label">gtk-cancel</property>
+                <property name="use_action_appearance">False</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
-                <property name="use_action_appearance">False</property>
                 <property name="use_stock">True</property>
               </object>
               <packing>
@@ -75,12 +86,12 @@
             <child>
               <object class="GtkButton" id="GNUNET_GTK_create_namespace_ok_button">
                 <property name="label">gtk-ok</property>
+                <property name="use_action_appearance">False</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
                 <property name="has_default">True</property>
                 <property name="receives_default">True</property>
-                <property name="use_action_appearance">False</property>
                 <property name="use_stock">True</property>
               </object>
               <packing>
@@ -92,6 +103,8 @@
           </object>
           <packing>
             <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
             <property name="position">1</property>
           </packing>
         </child>
diff --git a/contrib/gnunet_fs_gtk_main_window.glade b/contrib/gnunet_fs_gtk_main_window.glade
index d8b4d10..2a5c4f5 100644
--- a/contrib/gnunet_fs_gtk_main_window.glade
+++ b/contrib/gnunet_fs_gtk_main_window.glade
@@ -2,6 +2,823 @@
 <interface>
   <requires lib="gtk+" version="2.20"/>
   <!-- interface-naming-policy project-wide -->
+  <object class="GtkAdjustment" id="GNUNET_GTK_edit_publication_metadata_preview_image_horizontal_adjustment">
+    <property name="upper">100</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
+  <object class="GtkAdjustment" id="GNUNET_GTK_edit_publication_metadata_preview_image_verticall_adjustment">
+    <property name="upper">100</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
+  <object class="GtkWindow" id="GNUNET_GTK_edit_publication_window">
+    <property name="can_focus">False</property>
+    <property name="border_width">4</property>
+    <property name="modal">True</property>
+    <property name="window_position">center-on-parent</property>
+    <property name="destroy_with_parent">True</property>
+    <property name="skip_taskbar_hint">True</property>
+    <property name="skip_pager_hint">True</property>
+    <property name="deletable">False</property>
+    <property name="transient_for">GNUNET_GTK_main_window</property>
+    <signal name="realize" handler="GNUNET_GTK_edit_publication_window_realize_cb" swapped="no"/>
+    <child>
+      <object class="GtkVBox" id="GNUNET_GTK_edit_publication_master_vbox">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="spacing">2</property>
+        <child>
+          <object class="GtkVPaned" id="GNUNET_GTK_edit_publication_main_vpaned">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <child>
+              <object class="GtkHPaned" id="GNUNET_GTK_edit_publication_top_hpaned">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="position_set">True</property>
+                <child>
+                  <object class="GtkVBox" id="GNUNET_GTK_edit_publication_metadata_vbox">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="spacing">5</property>
+                    <child>
+                      <object class="GtkHBox" id="GNUNET_GTK_edit_publication_hbox">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <child>
+                          <object class="GtkLabel" id="GNUNET_GTK_edit_publication_type_label">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="label" translatable="yes">_Publication type:</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkComboBox" id="_GNUNET_GTK_edit_publication_type_combo">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="model">GNUNET_GTK_publication_types_liststore</property>
+                            <property name="active">0</property>
+                            <child>
+                              <object class="GtkCellRendererText" id="cellrenderertext2"/>
+                              <attributes>
+                                <attribute name="text">1</attribute>
+                              </attributes>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkButton" id="GNUNET_GTK_edit_publication_add_button">
+                            <property name="label">gtk-add</property>
+                            <property name="use_action_appearance">False</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="use_stock">True</property>
+                            <signal name="clicked" handler="GNUNET_GTK_edit_publication_add_button_clicked_cb" swapped="no"/>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">2</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkButton" id="GNUNET_GTK_edit_publication_delete_button">
+                            <property name="label">gtk-delete</property>
+                            <property name="use_action_appearance">False</property>
+                            <property name="visible">True</property>
+                            <property name="sensitive">False</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="use_stock">True</property>
+                            <signal name="clicked" handler="GNUNET_GTK_edit_publication_delete_button_clicked_cb" swapped="no"/>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="padding">5</property>
+                            <property name="position">3</property>
+                          </packing>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkScrolledWindow" id="GNUNET_GTK_edit_publication_metadata_scrolled_window">
+                        <property name="width_request">400</property>
+                        <property name="height_request">120</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="hscrollbar_policy">automatic</property>
+                        <property name="vscrollbar_policy">automatic</property>
+                        <property name="shadow_type">in</property>
+                        <child>
+                          <object class="GtkTreeView" id="GNUNET_GTK_edit_publication_metadata_tree_view">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="model">GNUNET_GTK_publication_metadata_liststore</property>
+                            <property name="enable_search">False</property>
+                            <property name="search_column">0</property>
+                            <property name="tooltip_column">4</property>
+                            <child>
+                              <object class="GtkTreeViewColumn" id="GNUNET_GTK_edit_publication_metadata_tree_view_type_column">
+                                <property name="resizable">True</property>
+                                <property name="title" translatable="yes">Type</property>
+                                <property name="clickable">True</property>
+                                <property name="sort_column_id">1</property>
+                                <child>
+                                  <object class="GtkCellRendererCombo" id="GNUNET_GTK_edit_publication_metadata_tree_view_type_renderer">
+                                    <property name="editable">True</property>
+                                    <property name="has_entry">False</property>
+                                    <property name="model">GNUNET_GTK_publication_metadata_types_liststore</property>
+                                    <property name="text_column">2</property>
+                                    <signal name="changed" handler="GNUNET_GTK_edit_publication_metadata_tree_view_type_renderer_changed_cb" swapped="no"/>
+                                    <signal name="edited" handler="GNUNET_GTK_edit_publication_metadata_tree_view_type_renderer_edited_cb" swapped="no"/>
+                                  </object>
+                                  <attributes>
+                                    <attribute name="text">2</attribute>
+                                  </attributes>
+                                </child>
+                              </object>
+                            </child>
+                            <child>
+                              <object class="GtkTreeViewColumn" id="GNUNET_GTK_edit_publication_metadata_tree_view_description_column">
+                                <property name="sizing">autosize</property>
+                                <property name="title" translatable="yes">Value</property>
+                                <property name="expand">True</property>
+                                <property name="clickable">True</property>
+                                <property name="sort_column_id">2</property>
+                                <child>
+                                  <object class="GtkCellRendererText" id="GNUNET_GTK_edit_publication_metadata_tree_view_value_renderer">
+                                    <property name="editable">True</property>
+                                    <signal name="edited" handler="GNUNET_GTK_edit_publication_metadata_tree_view_value_renderer_edited_cb" swapped="no"/>
+                                  </object>
+                                  <attributes>
+                                    <attribute name="text">3</attribute>
+                                  </attributes>
+                                </child>
+                              </object>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="resize">True</property>
+                    <property name="shrink">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkFrame" id="GNUNET_GTK_edit_publication_metadata_preview_frame">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label_xalign">0</property>
+                    <child>
+                      <object class="GtkAlignment" id="GNUNET_GTK_edit_publication_metadata_preview_alignment">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="left_padding">12</property>
+                        <child>
+                          <object class="GtkVBox" id="GNUNET_GTK_edit_publication_metadata_preview_vbox">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <child>
+                              <object class="GtkFileChooserButton" id="GNUNET_GTK_edit_publication_metadata_preview_file_chooser_button">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="create_folders">False</property>
+                                <property name="title" translatable="yes">Select file</property>
+                                <signal name="file-set" handler="GNUNET_GTK_edit_publication_metadata_preview_file_chooser_button_file_set_cb" swapped="no"/>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkScrolledWindow" id="GNUNET_GTK_edit_publication_metadata_preview_image_scrolled_window">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="hadjustment">GNUNET_GTK_edit_publication_metadata_preview_image_horizontal_adjustment</property>
+                                <property name="vadjustment">GNUNET_GTK_edit_publication_metadata_preview_image_verticall_adjustment</property>
+                                <property name="hscrollbar_policy">automatic</property>
+                                <property name="vscrollbar_policy">automatic</property>
+                                <child>
+                                  <object class="GtkViewport" id="GNUNET_GTK_edit_publication_metadata_preview_image_viewport">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="hadjustment">GNUNET_GTK_edit_publication_metadata_preview_image_horizontal_adjustment</property>
+                                    <property name="vadjustment">GNUNET_GTK_edit_publication_metadata_preview_image_verticall_adjustment</property>
+                                    <property name="shadow_type">none</property>
+                                    <child>
+                                      <object class="GtkImage" id="GNUNET_GTK_edit_publication_metadata_preview_image">
+                                        <property name="can_focus">False</property>
+                                        <property name="stock">gtk-missing-image</property>
+                                      </object>
+                                    </child>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                    <child type="label">
+                      <object class="GtkLabel" id="label1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Preview:</property>
+                        <property name="use_markup">True</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="resize">True</property>
+                    <property name="shrink">False</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="resize">True</property>
+                <property name="shrink">False</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="GNUNET_GTK_edit_publication_secondary_hbox">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <object class="GtkHBox" id="GNUNET_GTK_edit_publication_keyword_list_hbox">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <child>
+                      <object class="GtkVBox" id="vbox2">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <child>
+                          <object class="GtkHBox" id="hbox3">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <child>
+                              <object class="GtkLabel" id="GNUNET_GTK_edit_publication_keyword_label">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="label" translatable="yes">_Keyword:</property>
+                                <property name="use_underline">True</property>
+                                <property name="mnemonic_widget">GNUNET_GTK_edit_publication_keyword_entry</property>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkEntry" id="GNUNET_GTK_edit_publication_keyword_entry">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="invisible_char">●</property>
+                                <property name="invisible_char_set">True</property>
+                                <property name="caps_lock_warning">False</property>
+                                <property name="primary_icon_activatable">False</property>
+                                <property name="secondary_icon_activatable">False</property>
+                                <property name="primary_icon_sensitive">True</property>
+                                <property name="secondary_icon_sensitive">True</property>
+                                <signal name="key-press-event" handler="GNUNET_GTK_edit_publication_keyword_entry_key_press_event_cb" swapped="no"/>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkScrolledWindow" id="GNUNET_GTK_edit_publication_keyword_scrolled_window">
+                            <property name="width_request">400</property>
+                            <property name="height_request">120</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="hscrollbar_policy">never</property>
+                            <property name="vscrollbar_policy">automatic</property>
+                            <property name="shadow_type">in</property>
+                            <child>
+                              <object class="GtkTreeView" id="GNUNET_GTK_edit_publication_keyword_list_tree_view">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="model">GNUNET_GTK_publication_keywords_liststore</property>
+                                <property name="search_column">0</property>
+                                <child>
+                                  <object class="GtkTreeViewColumn" id="GNUNET_GTK_edit_publication_keyword_list_tree_view_column">
+                                    <property name="title" translatable="yes">Keywords</property>
+                                    <property name="clickable">True</property>
+                                    <property name="reorderable">True</property>
+                                    <property name="sort_column_id">0</property>
+                                    <child>
+                                      <object class="GtkCellRendererText" id="GNUNET_GTK_edit_publication_keyword_list_tree_view_renderer"/>
+                                      <attributes>
+                                        <attribute name="text">0</attribute>
+                                      </attributes>
+                                    </child>
+                                  </object>
+                                </child>
+                              </object>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">True</property>
+                            <property name="fill">True</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkCheckButton" id="GNUNET_GTK_edit_publication_normalization_checkbox">
+                            <property name="label" translatable="yes">Normalize all keywords a_utomatically after "OK" is pressed</property>
+                            <property name="use_action_appearance">False</property>
+                            <property name="sensitive">False</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">False</property>
+                            <property name="use_underline">True</property>
+                            <property name="draw_indicator">True</property>
+                            <signal name="toggled" handler="GNUNET_GTK_edit_publication_normalization_checkbox_toggled_cb" swapped="no"/>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">2</property>
+                          </packing>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkVBox" id="GNUNET_GTK_edit_publication_keyword_list_button_vbox">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <child>
+                          <object class="GtkButton" id="GNUNET_GTK_edit_publication_keyword_list_add_button">
+                            <property name="label">Add key_word</property>
+                            <property name="use_action_appearance">False</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="image">add_stock_image</property>
+                            <property name="use_underline">True</property>
+                            <signal name="clicked" handler="GNUNET_GTK_edit_publication_keyword_list_add_button_clicked_cb" swapped="no"/>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkButton" id="GNUNET_GTK_edit_publication_keyword_list_normalize_button">
+                            <property name="label" translatable="yes">_Normalize selected</property>
+                            <property name="use_action_appearance">False</property>
+                            <property name="sensitive">False</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="use_underline">True</property>
+                            <signal name="clicked" handler="GNUNET_GTK_edit_publication_keyword_list_normalize_button_clicked_cb" swapped="no"/>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="pack_type">end</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkButton" id="GNUNET_GTK_edit_publication_keyword_list_del_button">
+                            <property name="label">Delete _selected</property>
+                            <property name="use_action_appearance">False</property>
+                            <property name="visible">True</property>
+                            <property name="sensitive">False</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="use_underline">True</property>
+                            <signal name="clicked" handler="GNUNET_GTK_edit_publication_keyword_list_del_button_clicked_cb" swapped="no"/>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">False</property>
+                            <property name="padding">5</property>
+                            <property name="pack_type">end</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="padding">5</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="padding">4</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkFrame" id="frame3">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label_xalign">0</property>
+                    <child>
+                      <object class="GtkAlignment" id="alignment3">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="yalign">0</property>
+                        <property name="yscale">0</property>
+                        <property name="left_padding">4</property>
+                        <property name="right_padding">4</property>
+                        <child>
+                          <object class="GtkVBox" id="GNUNET_GTK_edit_publication_misc_vbox">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <child>
+                              <object class="GtkHBox" id="GNUNET_GTK_edit_publication_anonymity_hbox">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkLabel" id="GNUNET_GTK_edit_publication_anonymity_label">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="xalign">1</property>
+                                    <property name="label" translatable="yes">A_nonymity:</property>
+                                    <property name="use_underline">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="padding">5</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkAlignment" id="GNUNET_GTK_edit_publication_anonymity_combobox_alignment">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="yscale">0</property>
+                                    <child>
+                                      <object class="GtkComboBox" id="GNUNET_GTK_edit_publication_anonymity_combobox">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="model">main_window_search_anonymity_liststore</property>
+                                        <property name="active">1</property>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="GNUNET_GTK_edit_publication_anonymity_combobox_renderer"/>
+                                          <attributes>
+                                            <attribute name="foreground">2</attribute>
+                                            <attribute name="text">0</attribute>
+                                          </attributes>
+                                        </child>
+                                        <child>
+                                          <object class="GtkCellRendererText" id="GNUNET_GTK_edit_publication_anonymity_combobox_renerer_level"/>
+                                          <attributes>
+                                            <attribute name="text">1</attribute>
+                                          </attributes>
+                                        </child>
+                                      </object>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">0</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkHBox" id="GNUNET_GTK_edit_publication_priority_hbox">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkLabel" id="GNUNET_GTK_edit_publication_priority_label">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="xalign">1</property>
+                                    <property name="label" translatable="yes">_Priority:</property>
+                                    <property name="use_underline">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="padding">5</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkSpinButton" id="GNUNET_GTK_edit_publication_priority_spin_button">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="invisible_char">●</property>
+                                    <property name="invisible_char_set">True</property>
+                                    <property name="primary_icon_activatable">False</property>
+                                    <property name="secondary_icon_activatable">False</property>
+                                    <property name="primary_icon_sensitive">True</property>
+                                    <property name="secondary_icon_sensitive">True</property>
+                                    <property name="adjustment">priority_adjustment</property>
+                                    <property name="numeric">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkHBox" id="GNUNET_GTK_edit_publication_root_hbox">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkLabel" id="GNUNET_GTK_edit_publication_root_label">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="xalign">1</property>
+                                    <property name="label" translatable="yes">_Root keyword:</property>
+                                    <property name="use_underline">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="padding">5</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkEntry" id="GNUNET_GTK_edit_publication_root_entry">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="invisible_char">•</property>
+                                    <property name="text">root</property>
+                                    <property name="invisible_char_set">True</property>
+                                    <property name="primary_icon_activatable">False</property>
+                                    <property name="secondary_icon_activatable">False</property>
+                                    <property name="primary_icon_sensitive">True</property>
+                                    <property name="secondary_icon_sensitive">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">2</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkHBox" id="hbox4">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkLabel" id="GNUNET_GTK_edit_publication_expiration_label">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="xalign">1</property>
+                                    <property name="label" translatable="yes">_Expriation year:</property>
+                                    <property name="use_underline">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="padding">5</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkSpinButton" id="GNUNET_GTK_edit_publication_expiration_year_spin_button">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="max_length">4</property>
+                                    <property name="invisible_char">•</property>
+                                    <property name="invisible_char_set">True</property>
+                                    <property name="primary_icon_activatable">False</property>
+                                    <property name="secondary_icon_activatable">False</property>
+                                    <property name="primary_icon_sensitive">True</property>
+                                    <property name="secondary_icon_sensitive">True</property>
+                                    <property name="adjustment">expiration_year_adjustment</property>
+                                    <property name="climb_rate">1</property>
+                                    <property name="numeric">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">3</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <object class="GtkHBox" id="GNUNET_GTK_edit_publication_index_hbox">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <child>
+                                  <object class="GtkLabel" id="GNUNET_GTK_edit_publication_index_label">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="xalign">1</property>
+                                    <property name="label" translatable="yes">_Index file:</property>
+                                    <property name="use_underline">True</property>
+                                    <property name="mnemonic_widget">GNUNET_GTK_edit_publication_index_checkbutton</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="padding">5</property>
+                                    <property name="position">0</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <object class="GtkCheckButton" id="GNUNET_GTK_edit_publication_index_checkbutton">
+                                    <property name="use_action_appearance">False</property>
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="receives_default">False</property>
+                                    <property name="draw_indicator">True</property>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">True</property>
+                                <property name="fill">True</property>
+                                <property name="position">4</property>
+                              </packing>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                    <child type="label">
+                      <object class="GtkLabel" id="label2">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Publication options:</property>
+                        <property name="use_markup">True</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="resize">True</property>
+                <property name="shrink">False</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkHBox" id="GNUNET_GTK_edit_publication_buttons_hbox">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkButton" id="GNUNET_GTK_edit_publication_confirm_button">
+                <property name="label">gtk-ok</property>
+                <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="sensitive">False</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+                <signal name="clicked" handler="GNUNET_GTK_edit_publication_confirm_button_clicked_cb" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="padding">4</property>
+                <property name="pack_type">end</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="GNUNET_GTK_edit_publication_cancel_button">
+                <property name="label">gtk-cancel</property>
+                <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+                <signal name="clicked" handler="GNUNET_GTK_edit_publication_cancel_button_clicked_cb" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="padding">4</property>
+                <property name="pack_type">end</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="padding">1</property>
+            <property name="pack_type">end</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+  <object class="GtkTreeStore" id="GNUNET_GTK_file_sharing_publishing_tree_store">
+    <columns>
+      <!-- column-name filesize -->
+      <column type="gchararray"/>
+      <!-- column-name do_index -->
+      <column type="gboolean"/>
+      <!-- column-name filename -->
+      <column type="gchararray"/>
+      <!-- column-name anonymity_level -->
+      <column type="guint"/>
+      <!-- column-name priority -->
+      <column type="guint"/>
+      <!-- column-name file_information_struct -->
+      <column type="gpointer"/>
+    </columns>
+  </object>
   <object class="GtkWindow" id="GNUNET_GTK_main_window">
     <property name="can_focus">False</property>
     <property name="title" translatable="yes">gnunet-fs-gtk</property>
@@ -41,7 +858,6 @@
                 <property name="use_underline">True</property>
                 <child type="submenu">
                   <object class="GtkMenu" id="GNUNET_GTK_main_menu_file_sharing_box">
-                    <property name="visible">True</property>
                     <property name="can_focus">False</property>
                     <child>
                       <object class="GtkImageMenuItem" id="GNUNET_GTK_main_menu_file_create_pseudonym">
@@ -52,7 +868,7 @@
                         <property name="tooltip_text" translatable="yes">Create a pseudonym for publishing content.  Note that you can also publish content anonymously (without using a pseudonym).</property>
                         <property name="accel_path">&lt;gnunet-fs-gtk&gt;/File sharing/Create pseudonym</property>
                         <property name="use_underline">True</property>
-                        <property name="image">image3</property>
+                        <property name="image">new_stock_imag</property>
                         <property name="use_stock">False</property>
                         <accelerator key="n" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                         <signal name="activate" handler="GNUNET_GTK_main_menu_create_pseudonym_activate_cb" swapped="no"/>
@@ -65,7 +881,7 @@
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="use_underline">True</property>
-                        <property name="image">image6</property>
+                        <property name="image">index_stock_image</property>
                         <property name="use_stock">False</property>
                         <signal name="activate" handler="GNUNET_GTK_main_menu_file_advertise_pseudonym_activate_cb" swapped="no"/>
                       </object>
@@ -79,7 +895,7 @@
                         <property name="tooltip_text" translatable="yes">Publish files or directories on GNUnet</property>
                         <property name="accel_path">&lt;gnunet-fs-gtk&gt;/File sharing/Publish</property>
                         <property name="use_underline">True</property>
-                        <property name="image">image2</property>
+                        <property name="image">up_stock_image</property>
                         <property name="use_stock">False</property>
                         <accelerator key="a" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                         <signal name="activate" handler="GNUNET_GTK_main_menu_file_publish_activate_cb" swapped="no"/>
@@ -88,7 +904,6 @@
                     <child>
                       <object class="GtkSeparatorMenuItem" id="GNUNET_GTK_main_menu_file_sep1">
                         <property name="use_action_appearance">False</property>
-                        <property name="visible">True</property>
                         <property name="can_focus">False</property>
                       </object>
                     </child>
@@ -96,12 +911,10 @@
                       <object class="GtkImageMenuItem" id="GNUNET_GTK_main_menu_file_search">
                         <property name="label" translatable="yes">_Search</property>
                         <property name="use_action_appearance">False</property>
-                        <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="tooltip_text" translatable="yes">Search GNUnet for files</property>
                         <property name="accel_path">&lt;gnunet-fs-gtk&gt;/File sharing/Search</property>
                         <property name="use_underline">True</property>
-                        <property name="image">image4</property>
                         <property name="use_stock">False</property>
                         <accelerator key="s" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                         <signal name="activate" handler="GNUNET_GTK_main_menu_file_search_activate_cb" swapped="no"/>
@@ -123,7 +936,7 @@
                         <property name="tooltip_text" translatable="yes">Download a file or directory with a known URI.</property>
                         <property name="accel_path">&lt;gnunet-fs-gtk&gt;/File sharing/Download</property>
                         <property name="use_underline">True</property>
-                        <property name="image">image5</property>
+                        <property name="image">down_stock_image</property>
                         <property name="use_stock">False</property>
                         <accelerator key="d" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                         <signal name="activate" handler="GNUNET_GTK_main_menu_file_download_uri_activate_cb" swapped="no"/>
@@ -138,7 +951,7 @@
                         <property name="tooltip_text" translatable="yes">Use this option to browse a GNUnet directory file that has been previously downloaded.</property>
                         <property name="accel_path">&lt;gnunet-fs-gtk&gt;/File sharing/Open directory</property>
                         <property name="use_underline">True</property>
-                        <property name="image">image1</property>
+                        <property name="image">open_stock_image</property>
                         <property name="use_stock">False</property>
                         <accelerator key="F3" signal="activate"/>
                         <signal name="activate" handler="GNUNET_GTK_main_menu_file_open_gnunet_directory_activate_cb" swapped="no"/>
@@ -387,6 +1200,7 @@
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
                     <property name="receives_default">True</property>
+                    <property name="image">find_stock_image</property>
                     <signal name="clicked" handler="main_window_search_button_clicked_cb" swapped="no"/>
                   </object>
                 </child>
@@ -403,8 +1217,7 @@
                 <property name="can_focus">True</property>
                 <property name="invisible_char">●</property>
                 <property name="invisible_char_set">True</property>
-                <property name="primary_icon_stock">gtk-find</property>
-                <property name="primary_icon_activatable">True</property>
+                <property name="primary_icon_activatable">False</property>
                 <property name="secondary_icon_activatable">False</property>
                 <property name="primary_icon_sensitive">True</property>
                 <property name="secondary_icon_sensitive">True</property>
@@ -665,11 +1478,412 @@
       </object>
     </child>
   </object>
-  <object class="GtkListStore" id="GNUNET_GTK_meta_data_list_store">
-    <columns>
-      <!-- column-name extractor_meta_type -->
-      <column type="guint"/>
-      <!-- column-name extractor_meta_format -->
+  <object class="GtkWindow" id="GNUNET_GTK_master_publish_dialog">
+    <property name="height_request">500</property>
+    <property name="can_focus">False</property>
+    <property name="title" translatable="yes">Publish content on GNUnet</property>
+    <property name="window_position">center-on-parent</property>
+    <property name="destroy_with_parent">True</property>
+    <property name="deletable">False</property>
+    <property name="transient_for">GNUNET_GTK_main_window</property>
+    <signal name="realize" handler="GNUNET_GTK_master_publish_dialog_realize_cb" swapped="no"/>
+    <signal name="delete-event" handler="GNUNET_GTK_master_publish_dialog_delete_event_cb" swapped="no"/>
+    <child>
+      <object class="GtkVBox" id="GNUNET_GTK_master_publish_dialog_vbox">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="border_width">4</property>
+        <property name="spacing">7</property>
+        <child>
+          <object class="GtkScrolledWindow" id="GNUNET_GTK_master_publish_dialog_file_information_scrolled_window">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="hadjustment">adjustment5</property>
+            <property name="vadjustment">adjustment6</property>
+            <property name="hscrollbar_policy">automatic</property>
+            <property name="vscrollbar_policy">automatic</property>
+            <property name="shadow_type">in</property>
+            <child>
+              <object class="GtkTreeView" id="GNUNET_GTK_master_publish_dialog_file_information_tree_view">
+                <property name="height_request">100</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="model">GNUNET_GTK_file_sharing_publishing_tree_store</property>
+                <property name="hadjustment">adjustment5</property>
+                <property name="vadjustment">adjustment6</property>
+                <property name="enable_tree_lines">True</property>
+                <child>
+                  <object class="GtkTreeViewColumn" id="GNUNET_GTK_master_publish_dialog_file_information_filesize_column">
+                    <property name="sizing">autosize</property>
+                    <property name="title" translatable="yes">Size</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="GNUNET_GTK_master_publish_dialog_file_information_filesize_renderer"/>
+                      <attributes>
+                        <attribute name="text">0</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkTreeViewColumn" id="GNUNET_GTK_master_publish_dialog_file_information_filename_column">
+                    <property name="resizable">True</property>
+                    <property name="sizing">autosize</property>
+                    <property name="title" translatable="yes">Filename</property>
+                    <property name="expand">True</property>
+                    <property name="clickable">True</property>
+                    <property name="reorderable">True</property>
+                    <property name="sort_indicator">True</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="GNUNET_GTK_master_publish_dialog_file_information_filename_renderer"/>
+                      <attributes>
+                        <attribute name="text">2</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkHBox" id="GNUNET_GTK_master_dialog_modification_button_hbox">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkTable" id="GNUNET_GTK_master_publish_dialog_action_table">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="n_rows">2</property>
+                <property name="n_columns">3</property>
+                <child>
+                  <object class="GtkButton" id="GNUNET_GTK_master_publish_dialog_add_button">
+                    <property name="label" translatable="yes">Add _File</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_underline">True</property>
+                    <signal name="clicked" handler="GNUNET_GTK_master_publish_dialog_add_button_clicked_cb" swapped="no"/>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkButton" id="GNUNET_GTK_master_publish_dialog_new_button">
+                    <property name="label" translatable="yes">_Create empty directory</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="image">new_stock_image</property>
+                    <property name="use_underline">True</property>
+                    <signal name="clicked" handler="GNUNET_GTK_master_publish_dialog_new_button_clicked_cb" swapped="no"/>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">3</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="GNUNET_GTK_master_publish_dialog_open_button">
+                    <property name="label" translatable="yes">Add _Directory</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_underline">True</property>
+                    <signal name="clicked" handler="GNUNET_GTK_master_publish_dialog_open_button_clicked_cb" swapped="no"/>
+                  </object>
+                  <packing>
+                    <property name="top_attach">1</property>
+                    <property name="bottom_attach">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="GNUNET_GTK_master_publish_dialog_edit_button">
+                    <property name="label">gtk-edit</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="visible">True</property>
+                    <property name="sensitive">False</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                    <signal name="clicked" handler="GNUNET_GTK_master_publish_dialog_edit_button_clicked_cb" swapped="no"/>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">1</property>
+                    <property name="bottom_attach">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="GNUNET_GTK_master_publish_dialog_delete_button">
+                    <property name="label">gtk-delete</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="visible">True</property>
+                    <property name="sensitive">False</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                    <signal name="clicked" handler="GNUNET_GTK_master_publish_dialog_delete_button_clicked_cb" swapped="no"/>
+                  </object>
+                  <packing>
+                    <property name="left_attach">2</property>
+                    <property name="right_attach">3</property>
+                    <property name="top_attach">1</property>
+                    <property name="bottom_attach">2</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="padding">25</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkTable" id="GNUNET_GTK_master_publish_dialog_arrow_table">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="n_rows">2</property>
+                <property name="n_columns">3</property>
+                <property name="homogeneous">True</property>
+                <child>
+                  <object class="GtkButton" id="GNUNET_GTK_master_publish_dialog_up_button">
+                    <property name="label">gtk-go-up</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="visible">True</property>
+                    <property name="sensitive">False</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                    <signal name="clicked" handler="GNUNET_GTK_master_publish_dialog_up_button_clicked_cb" swapped="no"/>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="GNUNET_GTK_master_publish_dialog_left_button">
+                    <property name="label" translatable="yes">_Left</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="visible">True</property>
+                    <property name="sensitive">False</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="image">left_stock_image</property>
+                    <property name="use_underline">True</property>
+                    <signal name="clicked" handler="GNUNET_GTK_master_publish_dialog_left_button_clicked_cb" swapped="no"/>
+                  </object>
+                  <packing>
+                    <property name="top_attach">1</property>
+                    <property name="bottom_attach">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="GNUNET_GTK_master_publish_dialog_down_button">
+                    <property name="label">gtk-go-down</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="visible">True</property>
+                    <property name="sensitive">False</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_stock">True</property>
+                    <signal name="clicked" handler="GNUNET_GTK_master_publish_dialog_down_button_clicked_cb" swapped="no"/>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">1</property>
+                    <property name="bottom_attach">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="GNUNET_GTK_master_publish_dialog_right_button">
+                    <property name="label" translatable="yes">_Right</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="visible">True</property>
+                    <property name="sensitive">False</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="image">right_stock_image</property>
+                    <property name="use_underline">True</property>
+                    <signal name="clicked" handler="GNUNET_GTK_master_publish_dialog_right_button_clicked_cb" swapped="no"/>
+                  </object>
+                  <packing>
+                    <property name="left_attach">2</property>
+                    <property name="right_attach">3</property>
+                    <property name="top_attach">1</property>
+                    <property name="bottom_attach">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="padding">25</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkScrolledWindow" id="GNUNET_GTK_master_publish_dialog_pseudonym_scrolled_window">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="hadjustment">adjustment7</property>
+            <property name="vadjustment">adjustment8</property>
+            <property name="hscrollbar_policy">automatic</property>
+            <property name="vscrollbar_policy">automatic</property>
+            <property name="shadow_type">in</property>
+            <child>
+              <object class="GtkTreeView" id="GNUNET_GTK_master_publish_dialog_pseudonym_tree_view">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="model">GNUNET_GTK_pseudonym_tree_store</property>
+                <property name="hadjustment">adjustment7</property>
+                <property name="vadjustment">adjustment8</property>
+                <property name="reorderable">True</property>
+                <property name="rubber_banding">True</property>
+                <property name="enable_grid_lines">both</property>
+                <child>
+                  <object class="GtkTreeViewColumn" id="GNUNET_GTK_master_publish_dialog_pseudonym_name_column">
+                    <property name="resizable">True</property>
+                    <property name="title" translatable="yes">Pseudonym</property>
+                    <property name="clickable">True</property>
+                    <property name="reorderable">True</property>
+                    <property name="sort_indicator">True</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="GNUNET_GTK_master_publish_dialog_pseudonym_name_renderer"/>
+                      <attributes>
+                        <attribute name="text">0</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkTreeViewColumn" id="GNUNET_GTK_master_publish_dialog_pseudonym_identifier_column">
+                    <property name="resizable">True</property>
+                    <property name="sizing">autosize</property>
+                    <property name="title" translatable="yes">Current identifier</property>
+                    <property name="clickable">True</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="GNUNET_GTK_master_publish_dialog_pseudonym_identifier_renderer"/>
+                      <attributes>
+                        <attribute name="editable">8</attribute>
+                        <attribute name="text">2</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkTreeViewColumn" id="GNUNET_GTK_master_publish_dialog_pseudonym_updates_column">
+                    <property name="resizable">True</property>
+                    <property name="sizing">autosize</property>
+                    <property name="fixed_width">5</property>
+                    <property name="title" translatable="yes">Update identifier</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="GNUNET_GTK_master_publish_dialog_pseudonym_updates_renderer"/>
+                      <attributes>
+                        <attribute name="editable">7</attribute>
+                        <attribute name="text">5</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkTreeViewColumn" id="GNUNET_GTK_master_publish_dialog_pseudonym_description_column">
+                    <property name="title" translatable="yes">Description (of existing content)</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="GNUNET_GTK_master_publish_dialog_pseudonym_description_renderer">
+                        <property name="wrap_mode">word</property>
+                      </object>
+                      <attributes>
+                        <attribute name="text">6</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkHBox" id="GNUNET_GTK_master_publish_dialog_master_buttons_hbox">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="spacing">2</property>
+            <child>
+              <object class="GtkButton" id="GNUNET_GTK_master_publish_dialog_execute_button">
+                <property name="label" translatable="yes">_Execute</property>
+                <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_underline">True</property>
+                <signal name="clicked" handler="GNUNET_GTK_master_publish_dialog_execute_button_clicked_cb" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="pack_type">end</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="GNUNET_GTK_master_publish_dialog_cancel_button">
+                <property name="label" translatable="yes">_Cancel</property>
+                <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_underline">True</property>
+                <signal name="clicked" handler="GNUNET_GTK_master_publish_dialog_cancel_button_clicked_cb" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="pack_type">end</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+  <object class="GtkListStore" id="GNUNET_GTK_meta_data_list_store">
+    <columns>
+      <!-- column-name extractor_meta_type -->
+      <column type="guint"/>
+      <!-- column-name extractor_meta_format -->
       <column type="guint"/>
       <!-- column-name extractor_meta_type_string -->
       <column type="gchararray"/>
@@ -706,7 +1920,6 @@
                 <property name="can_focus">False</property>
                 <property name="label" translatable="yes">_URI:</property>
                 <property name="use_underline">True</property>
-                <property name="selectable">True</property>
                 <property name="mnemonic_widget">GNUNET_GTK_open_url_dialog_url_textview</property>
               </object>
               <packing>
@@ -756,7 +1969,6 @@
                 <property name="can_focus">False</property>
                 <property name="label" translatable="yes">_Anonymity:</property>
                 <property name="use_underline">True</property>
-                <property name="selectable">True</property>
                 <property name="mnemonic_widget">GNUNET_GTK_open_url_dialog_anonymity_combobox</property>
               </object>
               <packing>
@@ -767,112 +1979,816 @@
               </packing>
             </child>
             <child>
-              <object class="GtkAlignment" id="GNUNET_GTK_open_url_dialog_anonymity_combobox_alignment">
+              <object class="GtkAlignment" id="GNUNET_GTK_open_url_dialog_anonymity_combobox_alignment">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="yscale">0</property>
+                <child>
+                  <object class="GtkComboBox" id="GNUNET_GTK_open_url_dialog_anonymity_combobox">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="model">main_window_search_anonymity_liststore</property>
+                    <property name="active">1</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="GNUNET_GTK_open_url_dialog_anonymity_combobox_renderer"/>
+                      <attributes>
+                        <attribute name="foreground">2</attribute>
+                        <attribute name="text">0</attribute>
+                      </attributes>
+                    </child>
+                    <child>
+                      <object class="GtkCellRendererText" id="GNUNET_GTK_open_url_dialog_anonymity_combobox_renerer_level"/>
+                      <attributes>
+                        <attribute name="text">1</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">3</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="padding">5</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkHBox" id="hbox1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkButton" id="GNUNET_GTK_open_url_dialog_execute_button">
+                <property name="label">_Execute</property>
+                <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="sensitive">False</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="image">execute_stock_image</property>
+                <property name="use_underline">True</property>
+                <signal name="clicked" handler="GNUNET_GTK_open_url_dialog_execute_button_clicked_cb" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="padding">4</property>
+                <property name="pack_type">end</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="GNUNET_GTK_open_url_dialog_cancel_button">
+                <property name="label">gtk-cancel</property>
+                <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+                <signal name="clicked" handler="GNUNET_GTK_open_url_dialog_cancel_button_clicked_cb" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="padding">4</property>
+                <property name="pack_type">end</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="padding">4</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+  <object class="GtkListStore" id="GNUNET_GTK_peer_info_list_store">
+    <columns>
+      <!-- column-name peer_identity -->
+      <column type="gchararray"/>
+      <!-- column-name number_of_known_addresses -->
+      <column type="guint"/>
+      <!-- column-name country_name -->
+      <column type="gchararray"/>
+      <!-- column-name country_flag -->
+      <column type="GdkPixbuf"/>
+      <!-- column-name bandwidth -->
+      <column type="guint64"/>
+    </columns>
+  </object>
+  <object class="GtkTreeStore" id="GNUNET_GTK_pseudonym_tree_store">
+    <columns>
+      <!-- column-name local_name -->
+      <column type="gchararray"/>
+      <!-- column-name namespace_handle -->
+      <column type="gpointer"/>
+      <!-- column-name last_id -->
+      <column type="gchararray"/>
+      <!-- column-name last_uri -->
+      <column type="gchararray"/>
+      <!-- column-name last_meta -->
+      <column type="gpointer"/>
+      <!-- column-name next_id -->
+      <column type="gchararray"/>
+      <!-- column-name last_description_from_meta -->
+      <column type="gchararray"/>
+      <!-- column-name next_id_editable -->
+      <column type="gboolean"/>
+      <!-- column-name current_id_editable -->
+      <column type="gboolean"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="GNUNET_GTK_publication_keywords_liststore">
+    <columns>
+      <!-- column-name Keyword -->
+      <column type="gchararray"/>
+      <!-- column-name Added -->
+      <column type="gboolean"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="GNUNET_GTK_publication_metadata_liststore">
+    <columns>
+      <!-- column-name Type -->
+      <column type="gint"/>
+      <!-- column-name Format -->
+      <column type="gint"/>
+      <!-- column-name Type1 -->
+      <column type="gchararray"/>
+      <!-- column-name Value -->
+      <column type="gchararray"/>
+      <!-- column-name Description -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="GNUNET_GTK_publication_metadata_types_liststore">
+    <columns>
+      <!-- column-name Type -->
+      <column type="gint"/>
+      <!-- column-name Format -->
+      <column type="gint"/>
+      <!-- column-name Type1 -->
+      <column type="gchararray"/>
+      <!-- column-name Description -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="GNUNET_GTK_publication_types_liststore">
+    <columns>
+      <!-- column-name Type -->
+      <column type="gint"/>
+      <!-- column-name Type1 -->
+      <column type="gchararray"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0">-1</col>
+        <col id="1" translatable="yes">Generic</col>
+      </row>
+      <row>
+        <col id="0">1</col>
+        <col id="1" translatable="yes">Text</col>
+      </row>
+      <row>
+        <col id="0">2</col>
+        <col id="1" translatable="yes">Music</col>
+      </row>
+      <row>
+        <col id="0">3</col>
+        <col id="1" translatable="yes">Video</col>
+      </row>
+      <row>
+        <col id="0">4</col>
+        <col id="1" translatable="yes">Image</col>
+      </row>
+      <row>
+        <col id="0">5</col>
+        <col id="1" translatable="yes">Namespace</col>
+      </row>
+    </data>
+  </object>
+  <object class="GtkFileChooserDialog" id="GNUNET_GTK_publish_directory_dialog">
+    <property name="can_focus">False</property>
+    <property name="can_default">True</property>
+    <property name="events">GDK_FOCUS_CHANGE_MASK | GDK_STRUCTURE_MASK</property>
+    <property name="border_width">5</property>
+    <property name="modal">True</property>
+    <property name="destroy_with_parent">True</property>
+    <property name="type_hint">dialog</property>
+    <property name="skip_taskbar_hint">True</property>
+    <property name="skip_pager_hint">True</property>
+    <property name="transient_for">GNUNET_GTK_main_window</property>
+    <property name="action">select-folder</property>
+    <property name="create_folders">False</property>
+    <property name="select_multiple">True</property>
+    <signal name="response" handler="GNUNET_GTK_publish_directory_dialog_response_cb" swapped="no"/>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="dialog-vbox1">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="dialog-action_area6">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="GNUNET_GTK_publish_dialog_cancel_button">
+                <property name="label">gtk-cancel</property>
+                <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="GNUNET_GTK_publish_directory_dialog_ok_button">
+                <property name="label">gtk-ok</property>
+                <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox3">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkHBox" id="hbox6">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <object class="GtkCheckButton" id="GNUNET_GTK_publish_directory_dialog_do_index_checkbutton">
+                    <property name="label" translatable="yes">Index files</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="use_underline">True</property>
+                    <property name="active">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="padding">20</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="GNUNET_GTK_publish_directory_dialog_priority_label">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Priority:</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="padding">13</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkSpinButton" id="GNUNET_GTK_publish_directory_dialog_priority_spin_button">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="invisible_char">•</property>
+                    <property name="invisible_char_set">True</property>
+                    <property name="primary_icon_activatable">False</property>
+                    <property name="secondary_icon_activatable">False</property>
+                    <property name="primary_icon_sensitive">True</property>
+                    <property name="secondary_icon_sensitive">True</property>
+                    <property name="adjustment">priority_adjustment</property>
+                    <property name="numeric">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="padding">20</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox7">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <object class="GtkLabel" id="GNUNET_GTK_publish_directory_dialog_expiration_label">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Expiration year:</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="padding">20</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkSpinButton" id="GNUNET_GTK_publish_directory_dialog_expiration_year_spin_button">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="invisible_char">•</property>
+                    <property name="invisible_char_set">True</property>
+                    <property name="primary_icon_activatable">False</property>
+                    <property name="secondary_icon_activatable">False</property>
+                    <property name="primary_icon_sensitive">True</property>
+                    <property name="secondary_icon_sensitive">True</property>
+                    <property name="adjustment">expiration_year_adjustment</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="GNUNET_GTK_publish_directory_dialog_anonymity_label">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Anonymity:</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="padding">5</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkAlignment" id="GNUNET_GTK_publish_directory_dialog_anonymity_combobox_alignment">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="yscale">0</property>
+                    <child>
+                      <object class="GtkComboBox" id="GNUNET_GTK_publish_directory_dialog_anonymity_combobox">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="model">main_window_search_anonymity_liststore</property>
+                        <property name="active">1</property>
+                        <child>
+                          <object class="GtkCellRendererText" id="GNUNET_GTK_publish_directory_dialog_anonymity_combobox_renderer"/>
+                          <attributes>
+                            <attribute name="foreground">2</attribute>
+                            <attribute name="text">0</attribute>
+                          </attributes>
+                        </child>
+                        <child>
+                          <object class="GtkCellRendererText" id="GNUNET_GTK_publish_directory_dialog_anonymity_combobox_renerer_level"/>
+                          <attributes>
+                            <attribute name="text">1</attribute>
+                          </attributes>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="-6">GNUNET_GTK_publish_dialog_cancel_button</action-widget>
+      <action-widget response="-5">GNUNET_GTK_publish_directory_dialog_ok_button</action-widget>
+    </action-widgets>
+  </object>
+  <object class="GtkFileChooserDialog" id="GNUNET_GTK_publish_file_dialog">
+    <property name="can_focus">False</property>
+    <property name="can_default">True</property>
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">Publish file...</property>
+    <property name="modal">True</property>
+    <property name="destroy_with_parent">True</property>
+    <property name="type_hint">normal</property>
+    <property name="skip_taskbar_hint">True</property>
+    <property name="skip_pager_hint">True</property>
+    <property name="transient_for">GNUNET_GTK_main_window</property>
+    <property name="create_folders">False</property>
+    <property name="select_multiple">True</property>
+    <signal name="delete-event" handler="gtk_widget_hide_on_delete" swapped="no"/>
+    <signal name="response" handler="GNUNET_GTK_publish_file_dialog_response_cb" swapped="no"/>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="dialog-vbox5">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="dialog-action_area5">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="GNUNET_GTK_publish_file_dialog_cancel_button">
+                <property name="label">gtk-cancel</property>
+                <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="GNUNET_GTK_publish_file_dialog_ok_button">
+                <property name="label">gtk-ok</property>
+                <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkVBox" id="vbox1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <child>
+              <object class="GtkHBox" id="hbox2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child>
+                  <object class="GtkCheckButton" id="GNUNET_GTK_publish_file_dialog_do_index_checkbutton">
+                    <property name="label" translatable="yes">Index file</property>
+                    <property name="use_action_appearance">False</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="use_underline">True</property>
+                    <property name="active">True</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="padding">20</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="GNUNET_GTK_publish_file_dialog_priority_label">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Priority:</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="padding">13</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkSpinButton" id="GNUNET_GTK_publish_file_dialog_priority_spin_button">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="invisible_char">•</property>
+                    <property name="invisible_char_set">True</property>
+                    <property name="primary_icon_activatable">False</property>
+                    <property name="secondary_icon_activatable">False</property>
+                    <property name="primary_icon_sensitive">True</property>
+                    <property name="secondary_icon_sensitive">True</property>
+                    <property name="adjustment">priority_adjustment</property>
+                    <property name="numeric">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="padding">20</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="hbox5">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="yscale">0</property>
                 <child>
-                  <object class="GtkComboBox" id="GNUNET_GTK_open_url_dialog_anonymity_combobox">
+                  <object class="GtkLabel" id="GNUNET_GTK_publish_file_dialog_expiration_label">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="model">main_window_search_anonymity_liststore</property>
-                    <property name="active">1</property>
-                    <child>
-                      <object class="GtkCellRendererText" id="GNUNET_GTK_open_url_dialog_anonymity_combobox_renderer"/>
-                      <attributes>
-                        <attribute name="foreground">2</attribute>
-                        <attribute name="text">0</attribute>
-                      </attributes>
-                    </child>
+                    <property name="label" translatable="yes">Expiration year:</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="padding">20</property>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkSpinButton" id="GNUNET_GTK_publish_file_dialog_expiration_year_spin_button">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="invisible_char">•</property>
+                    <property name="invisible_char_set">True</property>
+                    <property name="primary_icon_activatable">False</property>
+                    <property name="secondary_icon_activatable">False</property>
+                    <property name="primary_icon_sensitive">True</property>
+                    <property name="secondary_icon_sensitive">True</property>
+                    <property name="adjustment">expiration_year_adjustment</property>
+                    <property name="numeric">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="GNUNET_GTK_publish_file_dialog_anonymity_label">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="label" translatable="yes">Anonymity:</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">True</property>
+                    <property name="padding">5</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkAlignment" id="GNUNET_GTK_publish_file_dialog_anonymity_combobox_alignment">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="yscale">0</property>
                     <child>
-                      <object class="GtkCellRendererText" id="GNUNET_GTK_open_url_dialog_anonymity_combobox_renerer_level"/>
-                      <attributes>
-                        <attribute name="text">1</attribute>
-                      </attributes>
+                      <object class="GtkComboBox" id="GNUNET_GTK_publish_file_dialog_anonymity_combobox">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="model">main_window_search_anonymity_liststore</property>
+                        <property name="active">1</property>
+                        <child>
+                          <object class="GtkCellRendererText" id="GNUNET_GTK_publish_file_dialog_anonymity_combobox_renderer"/>
+                          <attributes>
+                            <attribute name="foreground">2</attribute>
+                            <attribute name="text">0</attribute>
+                          </attributes>
+                        </child>
+                        <child>
+                          <object class="GtkCellRendererText" id="GNUNET_GTK_publish_file_dialog_anonymity_combobox_renerer_level"/>
+                          <attributes>
+                            <attribute name="text">1</attribute>
+                          </attributes>
+                        </child>
+                      </object>
                     </child>
                   </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">3</property>
+                  </packing>
                 </child>
               </object>
               <packing>
                 <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">3</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
               </packing>
             </child>
           </object>
           <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="padding">5</property>
-            <property name="position">0</property>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">2</property>
           </packing>
         </child>
-        <child>
-          <object class="GtkHBox" id="hbox1">
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="-6">GNUNET_GTK_publish_file_dialog_cancel_button</action-widget>
+      <action-widget response="-5">GNUNET_GTK_publish_file_dialog_ok_button</action-widget>
+    </action-widgets>
+  </object>
+  <object class="GtkListStore" id="GNUNET_GTK_publish_file_dialog_expiration_list_store">
+    <columns>
+      <!-- column-name human_readable_time -->
+      <column type="gchararray"/>
+      <!-- column-name time_in_ms -->
+      <column type="guint64"/>
+    </columns>
+  </object>
+  <object class="GtkListStore" id="GNUNET_GTK_select_pseudonym_liststore">
+    <columns>
+      <!-- column-name namespace_name -->
+      <column type="gchararray"/>
+      <!-- column-name namespace_handle -->
+      <column type="gpointer"/>
+    </columns>
+  </object>
+  <object class="GtkAdjustment" id="adjustment3">
+    <property name="upper">100</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
+  <object class="GtkAdjustment" id="adjustment4">
+    <property name="upper">100</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
+  <object class="GtkDialog" id="GNUNET_GTK_select_pseudonym_dialog">
+    <property name="can_focus">False</property>
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">Select pseudonym...</property>
+    <property name="modal">True</property>
+    <property name="default_width">400</property>
+    <property name="default_height">300</property>
+    <property name="destroy_with_parent">True</property>
+    <property name="type_hint">normal</property>
+    <signal name="realize" handler="GNUNET_GTK_select_pseudonym_dialog_realize_cb" swapped="no"/>
+    <signal name="response" handler="GNUNET_GTK_select_pseudonym_dialog_response_cb" swapped="no"/>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="dialog-vbox3">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="dialog-action_area3">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
             <child>
-              <object class="GtkButton" id="GNUNET_GTK_open_url_dialog_execute_button">
-                <property name="label">_Execute</property>
+              <object class="GtkButton" id="GNUNET_GTK_select_pseudonym_cancel_button">
+                <property name="label">gtk-cancel</property>
                 <property name="use_action_appearance">False</property>
                 <property name="visible">True</property>
-                <property name="sensitive">False</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
-                <property name="image">execute_stock_image2</property>
-                <property name="use_underline">True</property>
-                <signal name="clicked" handler="GNUNET_GTK_open_url_dialog_execute_button_clicked_cb" swapped="no"/>
+                <property name="use_stock">True</property>
               </object>
               <packing>
                 <property name="expand">False</property>
                 <property name="fill">False</property>
-                <property name="padding">4</property>
-                <property name="pack_type">end</property>
                 <property name="position">0</property>
               </packing>
             </child>
             <child>
-              <object class="GtkButton" id="GNUNET_GTK_open_url_dialog_cancel_button">
-                <property name="label">gtk-cancel</property>
+              <object class="GtkButton" id="GNUNET_GTK_select_pseudonym_ok_button">
+                <property name="label">gtk-ok</property>
                 <property name="use_action_appearance">False</property>
                 <property name="visible">True</property>
+                <property name="sensitive">False</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
                 <property name="use_stock">True</property>
-                <signal name="clicked" handler="GNUNET_GTK_open_url_dialog_cancel_button_clicked_cb" swapped="no"/>
               </object>
               <packing>
                 <property name="expand">False</property>
                 <property name="fill">False</property>
-                <property name="padding">4</property>
-                <property name="pack_type">end</property>
                 <property name="position">1</property>
               </packing>
             </child>
           </object>
           <packing>
             <property name="expand">False</property>
-            <property name="fill">False</property>
-            <property name="padding">4</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkScrolledWindow" id="GNUNET_GTK_select_pseudonym_scrolledwindow">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="hadjustment">adjustment3</property>
+            <property name="vadjustment">adjustment4</property>
+            <property name="hscrollbar_policy">automatic</property>
+            <property name="vscrollbar_policy">automatic</property>
+            <property name="shadow_type">in</property>
+            <child>
+              <object class="GtkTreeView" id="GNUNET_GTK_select_pseudonym_tree_view">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="model">GNUNET_GTK_select_pseudonym_liststore</property>
+                <property name="hadjustment">adjustment3</property>
+                <property name="vadjustment">adjustment4</property>
+                <property name="search_column">0</property>
+                <child>
+                  <object class="GtkTreeViewColumn" id="GNUNET_GTK_select_pseudonym_tree_view_column">
+                    <property name="title" translatable="yes">Name</property>
+                    <property name="expand">True</property>
+                    <property name="clickable">True</property>
+                    <property name="reorderable">True</property>
+                    <property name="sort_indicator">True</property>
+                    <property name="sort_column_id">0</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="GNUNET_GTK_select_pseudonym_name_renderer"/>
+                      <attributes>
+                        <attribute name="text">0</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
             <property name="position">1</property>
           </packing>
         </child>
+        <child>
+          <placeholder/>
+        </child>
       </object>
     </child>
+    <action-widgets>
+      <action-widget response="-6">GNUNET_GTK_select_pseudonym_cancel_button</action-widget>
+      <action-widget response="-5">GNUNET_GTK_select_pseudonym_ok_button</action-widget>
+    </action-widgets>
   </object>
-  <object class="GtkListStore" id="GNUNET_GTK_peer_info_list_store">
-    <columns>
-      <!-- column-name peer_identity -->
-      <column type="gchararray"/>
-      <!-- column-name number_of_known_addresses -->
-      <column type="guint"/>
-      <!-- column-name country_name -->
-      <column type="gchararray"/>
-      <!-- column-name country_flag -->
-      <column type="GdkPixbuf"/>
-      <!-- column-name bandwidth -->
-      <column type="guint64"/>
-    </columns>
+  <object class="GtkImage" id="add_stock_image">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-add</property>
   </object>
   <object class="GtkAdjustment" id="adjustment1">
     <property name="upper">100</property>
@@ -886,85 +2802,50 @@
     <property name="page_increment">10</property>
     <property name="page_size">10</property>
   </object>
-  <object class="GtkAdjustment" id="adjustment3">
+  <object class="GtkAdjustment" id="adjustment5">
     <property name="upper">100</property>
     <property name="step_increment">1</property>
     <property name="page_increment">10</property>
-    <property name="page_size">10</property>
   </object>
-  <object class="GtkAdjustment" id="adjustment4">
+  <object class="GtkAdjustment" id="adjustment6">
     <property name="upper">100</property>
     <property name="step_increment">1</property>
     <property name="page_increment">10</property>
-    <property name="page_size">10</property>
-  </object>
-  <object class="GtkImage" id="execute_stock_image">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="stock">gtk-execute</property>
-  </object>
-  <object class="GtkImage" id="execute_stock_image1">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="stock">gtk-execute</property>
-  </object>
-  <object class="GtkImage" id="execute_stock_image2">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="stock">gtk-execute</property>
   </object>
-  <object class="GtkImage" id="image1">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="stock">gtk-open</property>
-  </object>
-  <object class="GtkImage" id="image2">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="stock">gtk-go-up</property>
-  </object>
-  <object class="GtkImage" id="image3">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="stock">gtk-new</property>
+  <object class="GtkAdjustment" id="adjustment7">
+    <property name="upper">100</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
   </object>
-  <object class="GtkImage" id="image4">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="stock">gtk-find</property>
+  <object class="GtkAdjustment" id="adjustment8">
+    <property name="upper">100</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
   </object>
-  <object class="GtkImage" id="image5">
+  <object class="GtkImage" id="down_stock_image">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
     <property name="stock">gtk-go-down</property>
   </object>
-  <object class="GtkImage" id="image6">
+  <object class="GtkImage" id="execute_stock_image">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="stock">gtk-index</property>
+    <property name="stock">gtk-execute</property>
   </object>
-  <object class="GtkImage" id="image7">
+  <object class="GtkImage" id="find_stock_image">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="stock">gtk-index</property>
+    <property name="stock">gtk-find</property>
   </object>
-  <object class="GtkImage" id="image8">
+  <object class="GtkImage" id="index_stock_image">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
     <property name="stock">gtk-index</property>
   </object>
-  <object class="GtkImage" id="image9">
+  <object class="GtkImage" id="left_stock_image">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="stock">gtk-index</property>
-  </object>
-  <object class="GtkSizeGroup" id="enties_and_comboboxes_sizegroup">
-    <property name="mode">vertical</property>
-    <widgets>
-      <widget name="main_window_search_entry"/>
-      <widget name="main_window_search_anonymity_combobox"/>
-      <widget name="main_window_search_mime_combobox"/>
-    </widgets>
+    <property name="stock">gtk-go-back</property>
   </object>
   <object class="GtkListStore" id="main_window_search_anonymity_liststore">
     <columns>
@@ -1067,6 +2948,7 @@
     <property name="can_focus">False</property>
     <property name="events">GDK_LEAVE_NOTIFY_MASK | GDK_STRUCTURE_MASK</property>
     <property name="resizable">False</property>
+    <property name="destroy_with_parent">True</property>
     <property name="type_hint">dropdown-menu</property>
     <property name="skip_taskbar_hint">True</property>
     <property name="skip_pager_hint">True</property>
@@ -1117,4 +2999,78 @@
       </object>
     </child>
   </object>
+  <object class="GtkImage" id="new_stock_imag">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-new</property>
+  </object>
+  <object class="GtkImage" id="new_stock_image">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-new</property>
+  </object>
+  <object class="GtkImage" id="open_stock_image">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-open</property>
+  </object>
+  <object class="GtkAdjustment" id="priority_adjustment">
+    <property name="upper">10000000</property>
+    <property name="value">1000</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
+  <object class="GtkImage" id="right_stock_image">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-go-forward</property>
+  </object>
+  <object class="GtkImage" id="up_stock_image">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="stock">gtk-go-up</property>
+  </object>
+  <object class="GtkSizeGroup" id="edit_publication_options_input_widgets_sizegroup">
+    <widgets>
+      <widget name="GNUNET_GTK_edit_publication_anonymity_combobox_alignment"/>
+      <widget name="GNUNET_GTK_edit_publication_priority_spin_button"/>
+      <widget name="GNUNET_GTK_edit_publication_root_entry"/>
+      <widget name="GNUNET_GTK_edit_publication_expiration_year_spin_button"/>
+      <widget name="GNUNET_GTK_edit_publication_index_checkbutton"/>
+    </widgets>
+  </object>
+  <object class="GtkSizeGroup" id="edit_publication_options_labels_sizegroup">
+    <widgets>
+      <widget name="GNUNET_GTK_edit_publication_anonymity_label"/>
+      <widget name="GNUNET_GTK_edit_publication_priority_label"/>
+      <widget name="GNUNET_GTK_edit_publication_root_label"/>
+      <widget name="GNUNET_GTK_edit_publication_expiration_label"/>
+      <widget name="GNUNET_GTK_edit_publication_index_label"/>
+    </widgets>
+  </object>
+  <object class="GtkSizeGroup" id="enties_and_comboboxes_sizegroup">
+    <property name="mode">vertical</property>
+    <widgets>
+      <widget name="main_window_search_entry"/>
+      <widget name="main_window_search_anonymity_combobox"/>
+      <widget name="main_window_search_mime_combobox"/>
+    </widgets>
+  </object>
+  <object class="GtkAdjustment" id="expiration_year_adjustment">
+    <property name="upper">9999</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
+  <object class="GtkSizeGroup" id="sizegroup4">
+    <widgets>
+      <widget name="GNUNET_GTK_master_publish_dialog_cancel_button"/>
+      <widget name="GNUNET_GTK_master_publish_dialog_execute_button"/>
+    </widgets>
+  </object>
+  <object class="GtkSizeGroup" id="sizegroup5">
+    <widgets>
+      <widget name="GNUNET_GTK_edit_publication_confirm_button"/>
+      <widget name="GNUNET_GTK_edit_publication_cancel_button"/>
+    </widgets>
+  </object>
 </interface>
diff --git a/contrib/gnunet_fs_gtk_open_directory_dialog.glade b/contrib/gnunet_fs_gtk_open_directory_dialog.glade
index d55c0b0..a807742 100644
--- a/contrib/gnunet_fs_gtk_open_directory_dialog.glade
+++ b/contrib/gnunet_fs_gtk_open_directory_dialog.glade
@@ -4,30 +4,30 @@
   <!-- interface-naming-policy project-wide -->
   <object class="GtkFileFilter" id="gnunet_directory_filter"/>
   <object class="GtkFileChooserDialog" id="GNUNET_GTK_open_directory_dialog">
+    <property name="can_focus">False</property>
     <property name="can_default">True</property>
     <property name="border_width">5</property>
     <property name="type_hint">normal</property>
-    <property name="has_separator">False</property>
-    <property name="filter">gnunet_directory_filter</property>
     <property name="create_folders">False</property>
+    <property name="filter">gnunet_directory_filter</property>
+    <signal name="response" handler="GNUNET_GTK_open_directory_dialog_response_cb" swapped="no"/>
     <child internal-child="vbox">
       <object class="GtkVBox" id="dialog-vbox3">
         <property name="visible">True</property>
+        <property name="can_focus">False</property>
         <property name="spacing">2</property>
-        <child>
-          <placeholder/>
-        </child>
         <child internal-child="action_area">
           <object class="GtkHButtonBox" id="dialog-action_area4">
             <property name="visible">True</property>
+            <property name="can_focus">False</property>
             <property name="layout_style">end</property>
             <child>
               <object class="GtkButton" id="GNUNET_GTK_open_directory_dialog_cancel_button">
                 <property name="label">gtk-cancel</property>
+                <property name="use_action_appearance">False</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
-                <property name="use_action_appearance">False</property>
                 <property name="use_stock">True</property>
               </object>
               <packing>
@@ -39,11 +39,11 @@
             <child>
               <object class="GtkButton" id="GNUNET_GTK_open_directory_dialog_ok_button">
                 <property name="label">gtk-ok</property>
+                <property name="use_action_appearance">False</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
                 <property name="receives_default">True</property>
-                <property name="use_action_appearance">False</property>
                 <property name="use_stock">True</property>
               </object>
               <packing>
@@ -55,10 +55,14 @@
           </object>
           <packing>
             <property name="expand">False</property>
+            <property name="fill">True</property>
             <property name="pack_type">end</property>
             <property name="position">0</property>
           </packing>
         </child>
+        <child>
+          <placeholder/>
+        </child>
       </object>
     </child>
     <action-widgets>
diff --git a/contrib/gnunet_fs_gtk_select_pseudonym_dialog.glade b/contrib/gnunet_fs_gtk_select_pseudonym_dialog.glade
index ea50fa4..418231d 100644
--- a/contrib/gnunet_fs_gtk_select_pseudonym_dialog.glade
+++ b/contrib/gnunet_fs_gtk_select_pseudonym_dialog.glade
@@ -2,28 +2,81 @@
 <interface>
   <requires lib="gtk+" version="2.20"/>
   <!-- interface-naming-policy project-wide -->
-  <object class="GtkAdjustment" id="adjustment2">
+  <object class="GtkListStore" id="GNUNET_GTK_select_pseudonym_liststore">
+    <columns>
+      <!-- column-name namespace_name -->
+      <column type="gchararray"/>
+      <!-- column-name namespace_handle -->
+      <column type="gpointer"/>
+    </columns>
+  </object>
+  <object class="GtkAdjustment" id="adjustment1">
     <property name="upper">100</property>
     <property name="step_increment">1</property>
     <property name="page_increment">10</property>
     <property name="page_size">10</property>
   </object>
-  <object class="GtkAdjustment" id="adjustment1">
+  <object class="GtkAdjustment" id="adjustment2">
     <property name="upper">100</property>
     <property name="step_increment">1</property>
     <property name="page_increment">10</property>
     <property name="page_size">10</property>
   </object>
   <object class="GtkDialog" id="GNUNET_GTK_select_pseudonym_dialog">
+    <property name="can_focus">False</property>
     <property name="border_width">5</property>
     <property name="title" translatable="yes">Select pseudonym...</property>
     <property name="modal">True</property>
     <property name="type_hint">normal</property>
-    <property name="has_separator">False</property>
     <child internal-child="vbox">
       <object class="GtkVBox" id="GNUNET_GTK_select_pseudonym_dialog_vbox">
         <property name="visible">True</property>
+        <property name="can_focus">False</property>
         <property name="spacing">2</property>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="GNUNET_GTK_select_pseudonym_dialog_action_area">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="GNUNET_GTK_select_pseudonym_cancel_button">
+                <property name="label">gtk-cancel</property>
+                <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="GNUNET_GTK_select_pseudonym_ok_button">
+                <property name="label">gtk-ok</property>
+                <property name="use_action_appearance">False</property>
+                <property name="visible">True</property>
+                <property name="sensitive">False</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
         <child>
           <object class="GtkScrolledWindow" id="GNUNET_GTK_select_pseudonym_scrolledwindow">
             <property name="visible">True</property>
@@ -59,54 +112,14 @@
             </child>
           </object>
           <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
             <property name="position">1</property>
           </packing>
         </child>
         <child>
           <placeholder/>
         </child>
-        <child internal-child="action_area">
-          <object class="GtkHButtonBox" id="GNUNET_GTK_select_pseudonym_dialog_action_area">
-            <property name="visible">True</property>
-            <property name="layout_style">end</property>
-            <child>
-              <object class="GtkButton" id="GNUNET_GTK_select_pseudonym_cancel_button">
-                <property name="label">gtk-cancel</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="use_action_appearance">False</property>
-                <property name="use_stock">True</property>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="GNUNET_GTK_select_pseudonym_ok_button">
-                <property name="label">gtk-ok</property>
-                <property name="visible">True</property>
-                <property name="sensitive">False</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="use_action_appearance">False</property>
-                <property name="use_stock">True</property>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">1</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="pack_type">end</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
       </object>
     </child>
     <action-widgets>
@@ -114,12 +127,4 @@
       <action-widget response="-5">GNUNET_GTK_select_pseudonym_ok_button</action-widget>
     </action-widgets>
   </object>
-  <object class="GtkListStore" id="GNUNET_GTK_select_pseudonym_liststore">
-    <columns>
-      <!-- column-name namespace_name -->
-      <column type="gchararray"/>
-      <!-- column-name namespace_handle -->
-      <column type="gpointer"/>
-    </columns>
-  </object>
 </interface>
diff --git a/src/fs/gnunet-fs-gtk-download.c b/src/fs/gnunet-fs-gtk-download.c
index d9451e1..1a7ff30 100644
--- a/src/fs/gnunet-fs-gtk-download.c
+++ b/src/fs/gnunet-fs-gtk-download.c
@@ -203,7 +203,7 @@ GNUNET_FS_GTK_open_download_as_dialog (struct DownloadContext *dc)
   dlc->response = 0;
   dlc->dc = dc;
   g_object_set_data (G_OBJECT (ad), "dialog-context", dlc);
-  gtk_widget_show_all (ad);
+  gtk_window_present (GTK_WINDOW (ad));
 }
 
 /* end of gnunet-fs-gtk-download.c */
diff --git a/src/fs/gnunet-fs-gtk-edit_publish_dialog.c b/src/fs/gnunet-fs-gtk-edit_publish_dialog.c
index 2465e6a..37fe1a2 100644
--- a/src/fs/gnunet-fs-gtk-edit_publish_dialog.c
+++ b/src/fs/gnunet-fs-gtk-edit_publish_dialog.c
@@ -24,87 +24,26 @@
  */
 #include "gnunet-fs-gtk-common.h"
 #include "gnunet-fs-gtk-edit_publish_dialog.h"
+#include "gnunet-fs-gtk.h"
 #include <gnunet/gnunet_util_lib.h>
+#include <gdk/gdkkeysyms.h>
 
-/**
- * Builder for the current dialog.
- */
-static GtkBuilder *builder;
-
-/**
- * Are we editing metadata for a directory?
- */
-static int is_directory;
-
-/**
- * Set to YES if the preview was changed.
- */
-static int preview_changed;
-
-void
-GNUNET_GTK_edit_file_information_keyword_list_normalize_button_clicked_cb ()
-{
-  GNUNET_break (0);
-}
-
-void
-GNUNET_GTK_edit_file_information_keyword_list_del_button_clicked_cb ()
-{
-  GtkTreeView *tv;
-  GtkTreeSelection *sel;
-  GtkTreeModel *tm;
-  GtkTreeIter iter;
-
-  tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (builder,
-                       "GNUNET_GTK_edit_file_information_keyword_list_tree_view"));
-  sel = gtk_tree_view_get_selection (tv);
-  if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
-  {
-    GNUNET_break (0);
-    return;
-  }
-  gtk_list_store_remove (GTK_LIST_STORE (tm), &iter);
-}
-
-void
-GNUNET_GTK_edit_file_information_keyword_list_add_button_clicked_cb ()
-{
-  const char *keyword;
-  GtkEntry *entry;
-  GtkListStore *ls;
-  GtkTreeIter iter;
-
-  ls = GTK_LIST_STORE (gtk_builder_get_object
-                       (builder, "GNUNET_GTK_keyword_list_store"));
-  entry =
-      GTK_ENTRY (gtk_builder_get_object
-                 (builder, "GNUNET_GTK_edit_file_information_keyword_entry"));
-  keyword = gtk_entry_get_text (entry);
-  if (strlen (keyword) > 0)
-    gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, keyword, -1);
-  gtk_entry_set_text (entry, "");
-}
+#define PUBSTATE "edit-publication-state"
 
-
-void
-GNUNET_GTK_edit_file_information_keyword_entry_changed_cb ()
+struct edit_publication_state
 {
-  const char *keyword;
-  GtkEntry *entry;
-  GtkWidget *button;
-
-  button =
-      GTK_WIDGET (gtk_builder_get_object
-                  (builder,
-                   "GNUNET_GTK_edit_file_information_keyword_list_add_button"));
-  entry =
-      GTK_ENTRY (gtk_builder_get_object
-                 (builder, "GNUNET_GTK_edit_file_information_keyword_entry"));
-  keyword = gtk_entry_get_text (entry);
-  gtk_widget_set_sensitive (button, (strlen (keyword) > 0) ? TRUE : FALSE);
-}
-
+  int *do_index;
+  char **short_fn;
+  guint *anonymity_level;
+  guint *priority;
+  struct GNUNET_FS_FileInformation *fip;
+  gint preview_changed;
+  gboolean allow_no_keywords;
+  gboolean is_directory;
+  GNUNET_FS_GTK_edit_publish_dialog_cb cb;
+  gchar *root;
+  gpointer cls;
+};
 
 static void
 metadata_selection_changed_cb (GtkTreeSelection * ts, gpointer user_data)
@@ -112,165 +51,222 @@ metadata_selection_changed_cb (GtkTreeSelection * ts, gpointer user_data)
   GtkTreeView *tv;
   GtkTreeSelection *sel;
   GtkWidget *button;
+  GtkBuilder *builder;
+
+  builder = GTK_BUILDER (user_data);
 
   tv = GTK_TREE_VIEW (gtk_builder_get_object
                       (builder,
-                       "GNUNET_GTK_edit_file_information_metadata_tree_view"));
+                       "GNUNET_GTK_edit_publication_metadata_tree_view"));
   sel = gtk_tree_view_get_selection (tv);
   button =
       GTK_WIDGET (gtk_builder_get_object
                   (builder,
-                   "GNUNET_GTK_edit_file_information_metadata_delete_button"));
+                   "GNUNET_GTK_edit_publication_delete_button"));
   gtk_widget_set_sensitive (button,
                             gtk_tree_selection_get_selected (sel, NULL, NULL));
 }
 
-
 static void
-keyword_selection_changed_cb (GtkTreeSelection * ts, gpointer user_data)
+keywords_selection_changed_cb (GtkTreeSelection * ts, gpointer user_data)
 {
   GtkTreeView *tv;
   GtkTreeSelection *sel;
   GtkWidget *button;
+  GtkBuilder *builder;
+
+  builder = GTK_BUILDER (user_data);
+
 
   tv = GTK_TREE_VIEW (gtk_builder_get_object
                       (builder,
-                       "GNUNET_GTK_edit_file_information_keyword_list_tree_view"));
+                       "GNUNET_GTK_edit_publication_keyword_list_tree_view"));
   sel = gtk_tree_view_get_selection (tv);
   button =
       GTK_WIDGET (gtk_builder_get_object
                   (builder,
-                   "GNUNET_GTK_edit_file_information_keyword_list_del_button"));
+                   "GNUNET_GTK_edit_publication_keyword_list_del_button"));
 
   gtk_widget_set_sensitive (button,
                             gtk_tree_selection_get_selected (sel, NULL, NULL));
   button =
       GTK_WIDGET (gtk_builder_get_object
                   (builder,
-                   "GNUNET_GTK_edit_file_information_keyword_list_normalize_button"));
+                   "GNUNET_GTK_edit_publication_keyword_list_normalize_button"));
   gtk_widget_set_sensitive (button,
                             gtk_tree_selection_get_selected (sel, NULL, NULL));
 }
 
 
 void
-GNUNET_GTK_edit_file_information_metadata_value_entry_changed_cb ()
+GNUNET_GTK_edit_publication_window_realize_cb (GtkWidget *widget,
+    gpointer user_data)
 {
+  GtkBuilder *builder;
+  GtkListStore *metatypes_list;
+  GtkTreeIter iter;
   GtkTreeView *tv;
   GtkTreeSelection *sel;
-  const char *value;
-  GtkEntry *entry;
-  GtkWidget *button;
+  guint type;
+  guint max_type;
 
-  entry =
-      GTK_ENTRY (gtk_builder_get_object
-                 (builder,
-                  "GNUNET_GTK_edit_file_information_metadata_value_entry"));
-  value = gtk_entry_get_text (entry);
-  tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (builder,
-                       "GNUNET_GTK_edit_file_information_metadata_type_tree_view"));
+  builder = GTK_BUILDER (user_data);
+  metatypes_list = GTK_LIST_STORE (gtk_builder_get_object (builder,
+      "GNUNET_GTK_publication_metadata_types_liststore"));
+
+  tv = GTK_TREE_VIEW (gtk_builder_get_object (builder,
+      "GNUNET_GTK_edit_publication_metadata_tree_view"));
   sel = gtk_tree_view_get_selection (tv);
-  button =
-      GTK_WIDGET (gtk_builder_get_object
-                  (builder,
-                   "GNUNET_GTK_edit_file_information_metadata_add_button"));
-  gtk_widget_set_sensitive (button,
-                            (strlen (value) >
-                             0) ? gtk_tree_selection_get_selected (sel, NULL,
-                                                                   NULL) :
-                            FALSE);
-}
+  g_signal_connect (G_OBJECT (sel), "changed",
+                    G_CALLBACK (metadata_selection_changed_cb), builder);
 
+  tv = GTK_TREE_VIEW (gtk_builder_get_object (builder,
+      "GNUNET_GTK_edit_publication_keyword_list_tree_view"));
+  sel = gtk_tree_view_get_selection (tv);
+  g_signal_connect (G_OBJECT (sel), "changed",
+                    G_CALLBACK (keywords_selection_changed_cb), builder);
 
-void
-GNUNET_GTK_edit_file_information_keyword_entry_activate_cb ()
-{
-  GNUNET_GTK_edit_file_information_keyword_list_add_button_clicked_cb ();
+  max_type = EXTRACTOR_metatype_get_max ();
+  for (type = 1; type < max_type - 1; type++)
+    gtk_list_store_insert_with_values (metatypes_list, &iter, G_MAXINT,
+        0, type,
+        1, EXTRACTOR_METAFORMAT_UTF8,
+        2, EXTRACTOR_metatype_to_string (type),
+        3, EXTRACTOR_metatype_to_description (type), -1);
 }
 
-
 void
-GNUNET_GTK_edit_file_information_metadata_preview_file_chooser_button_file_set_cb
-    (GtkFileChooserButton * widget, gpointer user_data)
+GNUNET_GTK_edit_publication_add_button_clicked_cb (GtkButton *button,
+    gpointer user_data)
 {
-  gchar *fn;
-  GtkImage *image;
+  GtkBuilder *builder;
+  GtkTreeView *meta_tree;
+  GtkListStore *meta_list;
+  GtkTreeIter iter;
 
-  fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
-  image =
-      GTK_IMAGE (gtk_builder_get_object
-                 (builder,
-                  "GNUNET_GTK_edit_file_information_metadata_preview_image"));
-  gtk_image_set_from_file (image, fn);
-  preview_changed = GNUNET_YES;
+  builder = GTK_BUILDER (user_data);
+  meta_tree = GTK_TREE_VIEW (gtk_builder_get_object (builder,
+      "GNUNET_GTK_edit_publication_metadata_tree_view"));
+  meta_list = GTK_LIST_STORE (gtk_tree_view_get_model (meta_tree));
+  
+  gtk_list_store_insert (meta_list, &iter, 0);  
+  /* type == -1 means "not set" */
+  gtk_list_store_set (meta_list, &iter, 0, -1, 1, EXTRACTOR_METAFORMAT_UTF8,
+      2, _("Select a type"), 3, _("Specify a value"), 4, NULL, -1);
 }
 
+gboolean
+GNUNET_GTK_edit_publication_keyword_entry_key_press_event_cb (GtkWidget *widget,
+    GdkEventKey *event, gpointer user_data)
+{
+  GtkBuilder *builder;
+  GtkButton *add_button;
+  builder = GTK_BUILDER (user_data);
+
+  if (event->keyval == GDK_KEY_Return)
+  {
+    add_button = GTK_BUTTON (gtk_builder_get_object (builder,
+        "GNUNET_GTK_edit_publication_add_button"));
+    GNUNET_GTK_edit_publication_add_button_clicked_cb (add_button, user_data);
+    return TRUE;
+  }
+  return FALSE;
+}
 
 void
-GNUNET_GTK_edit_file_information_metadata_delete_button_clicked_cb ()
+GNUNET_GTK_edit_publication_metadata_tree_view_type_renderer_edited_cb (
+    GtkCellRendererText *renderer, gchar *path, gchar *new_text,
+    gpointer user_data)
 {
-  GtkTreeView *tv;
-  GtkTreeSelection *sel;
-  GtkTreeModel *tm;
+  GtkBuilder *builder;
+  GtkTreeView *meta_tree;
+  GtkListStore *meta_list;
+  GtkCellRendererCombo *combo;
+  GtkTreeModel *combo_model;
   GtkTreeIter iter;
+  gint type_id;
+  gchar *description = NULL;
+  GtkTreeIter *pass_data = NULL;
+
+  builder = GTK_BUILDER (user_data);
+  meta_tree = GTK_TREE_VIEW (gtk_builder_get_object (builder,
+      "GNUNET_GTK_edit_publication_metadata_tree_view"));
+  meta_list = GTK_LIST_STORE (gtk_tree_view_get_model (meta_tree));
+  if (!gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (meta_list), &iter, path))
+    return;
 
-  tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (builder,
-                       "GNUNET_GTK_edit_file_information_metadata_tree_view"));
-  sel = gtk_tree_view_get_selection (tv);
-  if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
-  {
-    GNUNET_break (0);
+  combo = GTK_CELL_RENDERER_COMBO (gtk_builder_get_object (builder,
+      "GNUNET_GTK_edit_publication_metadata_tree_view_type_renderer"));
+
+  pass_data = g_object_get_data (G_OBJECT (combo), "selected-type");
+  if (!pass_data)
     return;
-  }
-  gtk_list_store_remove (GTK_LIST_STORE (tm), &iter);
+  g_object_get (combo, "model", &combo_model, NULL);
+  gtk_tree_model_get (combo_model, pass_data, 0, &type_id, 2, &description, -1);
+  g_free (combo_model);
+  g_free (pass_data);
+  g_object_set_data (G_OBJECT (combo), "selected-type", NULL);
+
+  gtk_list_store_set (meta_list, &iter, 0, type_id, 1,
+      EXTRACTOR_METAFORMAT_UTF8, 2, new_text, 4, description, -1);
+  g_free (description);
 }
 
+void
+GNUNET_GTK_edit_publication_metadata_tree_view_type_renderer_changed_cb (
+    GtkCellRendererCombo *combo, gchar *path_string, GtkTreeIter *new_iter,
+    gpointer user_data)
+{
+  GtkTreeIter *pass_data;
+
+  pass_data = g_object_get_data (G_OBJECT (combo), "selected-type");
+  if (pass_data)
+    g_free (pass_data);
+  pass_data = g_new0 (GtkTreeIter, 1);
+  *pass_data = *new_iter;
+  g_object_set_data (G_OBJECT (combo), "selected-type", pass_data);
+}
 
 void
-GNUNET_GTK_edit_file_information_metadata_add_button_clicked_cb ()
+GNUNET_GTK_edit_publication_metadata_tree_view_value_renderer_edited_cb (
+    GtkCellRendererText *renderer, gchar *path, gchar *new_text,
+    gpointer user_data)
 {
-  const char *value;
+  GtkBuilder *builder;
+  GtkTreeView *meta_tree;
+  GtkListStore *meta_list;
+  GtkTreeIter iter;
+  gint metatype;
   char *avalue;
   const char *ivalue;
-  GtkEntry *entry;
-  GtkListStore *ls;
-  GtkTreeModel *tm;
-  GtkTreeView *tv;
-  GtkTreeSelection *sel;
-  GtkTreeIter iter;
-  guint type;
   size_t slen;
   char *pos;
 
-  entry =
-      GTK_ENTRY (gtk_builder_get_object
-                 (builder,
-                  "GNUNET_GTK_edit_file_information_metadata_value_entry"));
-  value = gtk_entry_get_text (entry);
-  if ((value == NULL) || (strlen (value) == 0))
-  {
-    GNUNET_break (0);
+  GObject *pubwindow;
+  struct edit_publication_state *state = NULL;
+
+  builder = GTK_BUILDER (user_data);
+  meta_tree = GTK_TREE_VIEW (gtk_builder_get_object (builder,
+      "GNUNET_GTK_edit_publication_metadata_tree_view"));
+  meta_list = GTK_LIST_STORE (gtk_tree_view_get_model (meta_tree));
+  if (!gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (meta_list), &iter, path))
     return;
-  }
-  tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (builder,
-                       "GNUNET_GTK_edit_file_information_metadata_type_tree_view"));
-  tm = gtk_tree_view_get_model (tv);
-  sel = gtk_tree_view_get_selection (tv);
-  if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
+
+  pubwindow = gtk_builder_get_object (builder,
+      "GNUNET_GTK_edit_publication_window");
+  state = g_object_get_data (pubwindow, PUBSTATE);
+  if (!state)
   {
     GNUNET_break (0);
     return;
   }
-  gtk_tree_model_get (tm, &iter, 1, &type, -1);
-  ls = GTK_LIST_STORE (gtk_builder_get_object
-                       (builder, "GNUNET_GTK_meta_data_list_store"));
-  if ((type == EXTRACTOR_METATYPE_FILENAME) &&
-      (value[strlen (value) - 1] != '/') && (is_directory))
+
+  gtk_tree_model_get (GTK_TREE_MODEL (meta_list), &iter, 0, &metatype, -1);
+  if (metatype == EXTRACTOR_METATYPE_FILENAME
+      && new_text[strlen (new_text) - 1] != '/'
+      && state->is_directory)
   {
-    GNUNET_asprintf (&avalue, "%s/", value);
+    GNUNET_asprintf (&avalue, "%s/", new_text);
     /* if user typed '\' instead of '/', change it! */
     slen = strlen (avalue);
     while ((slen > 1) && (avalue[slen - 2] == '\\'))
@@ -281,7 +277,7 @@ GNUNET_GTK_edit_file_information_metadata_add_button_clicked_cb ()
     }
     while (NULL != (pos = strstr (avalue, "\\")))
       *pos = '/';
-    /* remove '../' everywhere */
+    // remove '../' everywhere 
     while (NULL != (pos = strstr (avalue, "../")))
     {
       pos[0] = '_';
@@ -292,158 +288,260 @@ GNUNET_GTK_edit_file_information_metadata_add_button_clicked_cb ()
   }
   else
   {
-    ivalue = value;
+    ivalue = new_text;
     avalue = NULL;
   }
 
-  gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, type, 1,
-                                     (guint) EXTRACTOR_METAFORMAT_UTF8, 2,
-                                     EXTRACTOR_metatype_to_string (type), 3,
-                                     ivalue, -1);
+  gtk_list_store_set (meta_list, &iter, 3, ivalue, -1);
   GNUNET_free_non_null (avalue);
-  gtk_entry_set_text (GTK_ENTRY (entry), "");
 }
 
+void
+GNUNET_GTK_edit_publication_delete_button_clicked_cb (GtkButton *button,
+    gpointer user_data)
+{
+  GtkTreeView *tv;
+  GtkTreeSelection *sel;
+  GtkTreeModel *tm;
+  GtkTreeIter iter;
+  GtkBuilder *builder = GTK_BUILDER (user_data);
 
-/**
- * Add each of the keywords to the keyword list store.
- *
- * @param cls closure
- * @param keyword the keyword
- * @param is_mandatory is the keyword mandatory (in a search)
- * @return GNUNET_OK to continue to iterate
- */
-static int
-add_keyword (void *cls, const char *keyword, int is_mandatory)
+  tv = GTK_TREE_VIEW (gtk_builder_get_object
+                      (builder,
+                       "GNUNET_GTK_edit_publication_metadata_tree_view"));
+  sel = gtk_tree_view_get_selection (tv);
+  if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
+  {
+    GNUNET_break (0);
+    return;
+  }
+  if (gtk_list_store_remove (GTK_LIST_STORE (tm), &iter))
+    gtk_tree_selection_select_iter (sel, &iter);
+}
+
+void
+GNUNET_GTK_edit_publication_keyword_list_add_button_clicked_cb (
+    GtkButton *button, gpointer user_data)
 {
+  const char *keyword;
+  GtkEntry *entry;
   GtkListStore *ls;
   GtkTreeIter iter;
+  GtkBuilder *builder;
+  GtkWidget *ok;
+
+  builder = GTK_BUILDER (user_data);
 
   ls = GTK_LIST_STORE (gtk_builder_get_object
-                       (builder, "GNUNET_GTK_keyword_list_store"));
-  gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, keyword, -1);
-  return GNUNET_OK;
+                       (builder, "GNUNET_GTK_publication_keywords_liststore"));
+  entry =
+      GTK_ENTRY (gtk_builder_get_object
+                 (builder, "GNUNET_GTK_edit_publication_keyword_entry"));
+  keyword = gtk_entry_get_text (entry);
+  if (strlen (keyword) > 0)
+  {
+    gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, keyword, 1, TRUE, -1);
+    ok = GTK_WIDGET (gtk_builder_get_object (builder,
+        "GNUNET_GTK_edit_publication_confirm_button"));
+    gtk_widget_set_sensitive (ok, TRUE);
+  }
+  gtk_entry_set_text (entry, "");
 }
 
+gboolean
+gtk_tree_model_get_item_count_cb (GtkTreeModel *model, GtkTreePath *path,
+    GtkTreeIter *iter, gpointer data)
+{
+  gint *counter = (gint *) data;
+  *counter += 1;
+  return FALSE;
+}
 
-/**
- * Add the given meta data to the model (or make it the preview
- * image if it is an image).
- *
- * @param cls closure, NULL
- * @param plugin_name name of the plugin that produced this value;
- *        special values can be used (i.e. '<zlib>' for zlib being
- *        used in the main libextractor library and yielding
- *        meta data).
- * @param type libextractor-type describing the meta data
- * @param format basic format information about data
- * @param data_mime_type mime-type of data (not of the original file);
- *        can be NULL (if mime-type is not known)
- * @param data actual meta-data found
- * @param data_len number of bytes in data
- * @return 0 to continue extracting
- */
-static int
-add_meta_item (void *cls, const char *plugin_name, enum EXTRACTOR_MetaType type,
-               enum EXTRACTOR_MetaFormat format, const char *data_mime_type,
-               const char *data, size_t data_len)
+void
+GNUNET_GTK_edit_publication_keyword_entry_changed_cb (GtkEditable *editable,
+    gpointer user_data)
 {
-  GtkListStore *ls;
+  const char *keyword;
+  GtkEntry *entry;
+  GtkWidget *button;
+  GtkBuilder *builder;
+
+  builder = GTK_BUILDER (user_data);
+
+  button =
+      GTK_WIDGET (gtk_builder_get_object
+                  (builder,
+                   "GNUNET_GTK_edit_publication_keyword_list_add_button"));
+  entry =
+      GTK_ENTRY (gtk_builder_get_object
+                 (builder, "GNUNET_GTK_edit_publication_keyword_entry"));
+  keyword = gtk_entry_get_text (entry);
+  gtk_widget_set_sensitive (button, (strlen (keyword) > 0) ? TRUE : FALSE);
+}
+
+
+gint
+gtk_tree_model_get_item_count (GtkTreeModel *model)
+{
+  gint c = 0;
+  gtk_tree_model_foreach (model, &gtk_tree_model_get_item_count_cb, &c);
+  return c;
+}
+
+gboolean
+gtk_tree_model_has_items_cb (GtkTreeModel *model, GtkTreePath *path,
+    GtkTreeIter *iter, gpointer data)
+{
+  gboolean *val = (gboolean *) data;
+  *val = TRUE;
+  return TRUE;
+}
+
+gboolean
+gtk_tree_model_has_items (GtkTreeModel *model)
+{
+  gboolean b = FALSE;
+  gtk_tree_model_foreach (model, &gtk_tree_model_has_items_cb, &b);
+  return b;
+}
+
+void
+GNUNET_GTK_edit_publication_keyword_list_del_button_clicked_cb (
+    GtkButton *button, gpointer user_data)
+{
+  GtkTreeView *tv;
+  GtkTreeSelection *sel;
+  GtkTreeModel *tm;
   GtkTreeIter iter;
+  GtkBuilder *builder;
+  GtkWidget *ok;
+  GObject *pubwindow;
+  struct edit_publication_state *state = NULL;
+  builder = GTK_BUILDER (user_data);
 
-  switch (format)
+  tv = GTK_TREE_VIEW (gtk_builder_get_object
+                      (builder,
+                       "GNUNET_GTK_edit_publication_keyword_list_tree_view"));
+
+  sel = gtk_tree_view_get_selection (tv);
+  if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
   {
-  case EXTRACTOR_METAFORMAT_UTF8:
-  case EXTRACTOR_METAFORMAT_C_STRING:
-    ls = GTK_LIST_STORE (gtk_builder_get_object
-                         (builder, "GNUNET_GTK_meta_data_list_store"));
-    gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, (guint) type, 1,
-                                       (guint) format, 2,
-                                       EXTRACTOR_metatype_to_string (type), 3,
-                                       data, -1);
-    break;
-  case EXTRACTOR_METAFORMAT_UNKNOWN:
-    break;
-  case EXTRACTOR_METAFORMAT_BINARY:
-    break;
-  default:
     GNUNET_break (0);
+    return;
   }
-  return 0;
+  if (gtk_list_store_remove (GTK_LIST_STORE (tm), &iter))
+    gtk_tree_selection_select_iter (sel, &iter);
+
+  ok = GTK_WIDGET (gtk_builder_get_object (builder,
+      "GNUNET_GTK_edit_publication_confirm_button"));
+
+  pubwindow = gtk_builder_get_object (builder,
+      "GNUNET_GTK_edit_publication_window");
+  state = g_object_get_data (pubwindow, PUBSTATE);
+  if (!state)
+  {
+    GNUNET_break (0);
+    return;
+  }
+
+  if (!state->allow_no_keywords && !gtk_tree_model_has_items (tm))
+    gtk_widget_set_sensitive (ok, FALSE);
 }
 
+void
+GNUNET_GTK_edit_publication_keyword_list_normalize_button_clicked_cb (
+    GtkButton *button, gpointer user_data)
+{
+  GtkTreeView *tv;
+  GtkTreeSelection *sel;
+  GtkTreeModel *tm;
+  GtkTreeIter iter, inserted;
+  gchar *value;
+  struct GNUNET_FS_Uri *uri;
+  struct GNUNET_FS_Uri *nuri;
+  char *nvalue;
+  char *emsg;
+  GtkBuilder *builder;
+  builder = GTK_BUILDER (user_data);
 
-/**
- * Function called to extract the information from FI.
- *
- * @param cls closure
- * @param fi the entry in the publish-structure
- * @param length length of the file or directory
- * @param meta metadata for the file or directory (can be modified)
- * @param uri pointer to the keywords that will be used for this entry (can be modified)
- * @param bo block options
- * @param do_index should we index (can be modified)
- * @param client_info pointer to client context set upon creation (can be modified)
- * @return GNUNET_SYSERR (aborts after first call)
- */
-static int
-file_information_extract (void *cls, struct GNUNET_FS_FileInformation *fi,
-                          uint64_t length,
-                          struct GNUNET_CONTAINER_MetaData *meta,
-                          struct GNUNET_FS_Uri **uri,
-                          struct GNUNET_FS_BlockOptions *bo, int *do_index,
-                          void **client_info)
+  tv = GTK_TREE_VIEW (gtk_builder_get_object
+                      (builder,
+                       "GNUNET_GTK_edit_publication_keyword_list_tree_view"));
+  sel = gtk_tree_view_get_selection (tv);
+  if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
+    return;
+  gtk_tree_model_get (tm, &iter, 0, &value, -1);
+  emsg = NULL;
+  uri = GNUNET_FS_uri_ksk_create (value, &emsg);
+  if (uri == NULL)
+  {
+    GNUNET_break (0);
+    GNUNET_free (emsg);
+    g_free (value);
+    return;
+  }
+  nuri = GNUNET_FS_uri_ksk_canonicalize (uri);
+  nvalue = GNUNET_FS_uri_ksk_to_string_fancy (nuri);
+
+  if (strcmp (value, nvalue) != 0)
+  {
+    gtk_list_store_insert_after (GTK_LIST_STORE (tm), &inserted, &iter);
+    gtk_list_store_set (GTK_LIST_STORE (tm), &inserted, 0, nvalue, -1);
+  }
+  GNUNET_FS_uri_destroy (nuri);
+  GNUNET_FS_uri_destroy (uri);
+  GNUNET_free (nvalue);
+  g_free (value);
+}
+
+void
+GNUNET_GTK_edit_publication_normalization_checkbox_toggled_cb (
+    GtkToggleButton *button, gpointer user_data)
 {
-  GtkImage *img;
-  GdkPixbuf *pixbuf;
-  struct tm *t;
-  int year;
-  time_t tp;
+  GtkBuilder *builder;
+  GtkToggleButton *norm_button;
+  builder = GTK_BUILDER (user_data);
+  norm_button = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder,
+      "GNUNET_GTK_edit_publication_keyword_list_normalize_button"));
+  gtk_widget_set_sensitive (GTK_WIDGET (norm_button),
+      !gtk_toggle_button_get_active (norm_button));
+}
 
-  if (NULL != *uri)
-    GNUNET_FS_uri_ksk_get_keywords (*uri, &add_keyword, NULL);
-  if (NULL != meta)
+void
+GNUNET_GTK_edit_publication_metadata_preview_file_chooser_button_file_set_cb (
+    GtkFileChooserButton *widget, gpointer user_data)
+{
+  gchar *fn;
+  GtkImage *image;
+  GObject *pubwindow;
+  GtkBuilder *builder = GTK_BUILDER (user_data);
+  struct edit_publication_state *state = NULL;
+
+  pubwindow = gtk_builder_get_object (builder,
+      "GNUNET_GTK_edit_publication_window");
+  state = g_object_get_data (pubwindow, PUBSTATE);
+  if (!state)
   {
-    GNUNET_CONTAINER_meta_data_iterate (meta, &add_meta_item, NULL);
-    pixbuf = GNUNET_FS_GTK_get_thumbnail_from_meta_data (meta);
-    if (pixbuf != NULL)
-    {
-      img =
-          GTK_IMAGE (gtk_builder_get_object
-                     (builder,
-                      "GNUNET_GTK_edit_file_information_metadata_preview_image"));
-      gtk_image_set_from_pixbuf (img, pixbuf);
-    }
+    GNUNET_break (0);
+    return;
   }
-  tp = bo->expiration_time.abs_value / 1000;    /* ms to seconds */
-  t = gmtime (&tp);
-  if (t == NULL)
-    year = 0;
-  else
-    year = t->tm_year + 1900;
-  gtk_spin_button_set_value (GTK_SPIN_BUTTON
-                             (gtk_builder_get_object
-                              (builder,
-                               "GNUNET_GTK_edit_file_information_expiration_year_spin_button")),
-                             year);
-  gtk_spin_button_set_value (GTK_SPIN_BUTTON
-                             (gtk_builder_get_object
-                              (builder,
-                               "GNUNET_GTK_edit_file_information_anonymity_spin_button")),
-                             bo->anonymity_level);
-  gtk_spin_button_set_value (GTK_SPIN_BUTTON
-                             (gtk_builder_get_object
-                              (builder,
-                               "GNUNET_GTK_edit_file_information_priority_spin_button")),
-                             bo->content_priority);
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
-                                (gtk_builder_get_object
-                                 (builder,
-                                  "GNUNET_GTK_edit_file_information_index_check_button")),
-                                *do_index);
-  return GNUNET_SYSERR;         /* only visit top-level item */
+
+  fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
+  image =
+      GTK_IMAGE (gtk_builder_get_object
+                 (builder,
+                  "GNUNET_GTK_edit_publication_metadata_preview_image"));
+  gtk_image_set_from_file (image, fn);
+  state->preview_changed = GNUNET_YES;
 }
 
+struct fiu_context
+{
+  GtkBuilder *builder;
+  char **short_fn;
+  gchar *root;
+  struct GNUNET_CONTAINER_MetaData *md;
+};
 
 /**
  * Copy binary meta data from to the new container and also
@@ -469,7 +567,9 @@ preserve_meta_items (void *cls, const char *plugin_name,
                      const char *data_mime_type, const char *data,
                      size_t data_len)
 {
-  struct GNUNET_CONTAINER_MetaData *md = cls;
+  struct fiu_context *context = (struct fiu_context *) cls;
+  GtkBuilder *builder = context->builder;
+  struct GNUNET_CONTAINER_MetaData *md = context->md;
   GtkTreeModel *tm;
   GtkTreeIter iter;
   gchar *value;
@@ -477,13 +577,25 @@ preserve_meta_items (void *cls, const char *plugin_name,
   guint nformat;
   int keep;
 
+  GObject *pubwindow;
+  struct edit_publication_state *state = NULL;
+
+  pubwindow = gtk_builder_get_object (builder,
+      "GNUNET_GTK_edit_publication_window");
+  state = g_object_get_data (pubwindow, PUBSTATE);
+  if (!state)
+  {
+    GNUNET_break (0);
+    return 0;
+  }
+
   keep = GNUNET_NO;
   switch (format)
   {
   case EXTRACTOR_METAFORMAT_UTF8:
   case EXTRACTOR_METAFORMAT_C_STRING:
     tm = GTK_TREE_MODEL (gtk_builder_get_object
-                         (builder, "GNUNET_GTK_meta_data_list_store"));
+                         (builder, "GNUNET_GTK_publication_metadata_liststore"));
     if (TRUE == gtk_tree_model_get_iter_first (tm, &iter))
     {
       do
@@ -505,7 +617,7 @@ preserve_meta_items (void *cls, const char *plugin_name,
   case EXTRACTOR_METAFORMAT_UNKNOWN:
     break;
   case EXTRACTOR_METAFORMAT_BINARY:
-    if (preview_changed == GNUNET_NO)
+    if (state->preview_changed == GNUNET_NO)
       keep = GNUNET_YES;
     break;
   default:
@@ -542,7 +654,9 @@ file_information_update (void *cls, struct GNUNET_FS_FileInformation *fi,
                          struct GNUNET_FS_BlockOptions *bo, int *do_index,
                          void **client_info)
 {
-  char **short_fn = cls;
+  struct fiu_context *context = (struct fiu_context *) cls;
+  char **short_fn = context->short_fn;
+  GtkBuilder *builder = context->builder;
   struct GNUNET_CONTAINER_MetaData *nm;
   GtkTreeModel *tm;
   GtkTreeIter iter;
@@ -558,26 +672,49 @@ file_information_update (void *cls, struct GNUNET_FS_FileInformation *fi,
   const char *mime;
   GFile *f;
   GFileInfo *finfo;
+  gboolean auto_normalize = FALSE;
 
-  bo->anonymity_level =
-      gtk_spin_button_get_value (GTK_SPIN_BUTTON
-                                 (gtk_builder_get_object
-                                  (builder,
-                                   "GNUNET_GTK_edit_file_information_anonymity_spin_button")));
+  GObject *pubwindow;
+  struct edit_publication_state *state = NULL;
+
+  pubwindow = gtk_builder_get_object (builder,
+      "GNUNET_GTK_edit_publication_window");
+  state = g_object_get_data (pubwindow, PUBSTATE);
+  if (!state)
+  {
+    GNUNET_break (0);
+    return GNUNET_SYSERR;
+  }
+
+  if (!GNUNET_GTK_get_selected_anonymity_level (builder,
+      "GNUNET_GTK_edit_publication_anonymity_combobox", &bo->anonymity_level))
+    return GNUNET_SYSERR;
   bo->content_priority =
       gtk_spin_button_get_value (GTK_SPIN_BUTTON
                                  (gtk_builder_get_object
                                   (builder,
-                                   "GNUNET_GTK_edit_file_information_priority_spin_button")));
+                                   "GNUNET_GTK_edit_publication_priority_spin_button")));
   *do_index =
       gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
                                     (gtk_builder_get_object
                                      (builder,
-                                      "GNUNET_GTK_edit_file_information_index_check_button")));
+                                      "GNUNET_GTK_edit_publication_index_checkbutton")));
+  auto_normalize = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
+                                    (gtk_builder_get_object
+                                     (builder,
+                                      "GNUNET_GTK_edit_publication_normalization_checkbox")));
   sb = GTK_SPIN_BUTTON (gtk_builder_get_object
                         (builder,
-                         "GNUNET_GTK_edit_file_information_expiration_year_spin_button"));
+                         "GNUNET_GTK_edit_publication_expiration_year_spin_button"));
   bo->expiration_time = GNUNET_FS_GTK_get_expiration_time (sb);
+
+  g_free (context->root);
+  context->root =
+      g_strdup (gtk_entry_get_text (GTK_ENTRY
+                          (gtk_builder_get_object
+                           (builder,
+                            "GNUNET_GTK_edit_publication_root_entry"))));
+
   /* update URI */
   if (NULL != (*uri))
     GNUNET_FS_uri_destroy (*uri);
@@ -586,7 +723,7 @@ file_information_update (void *cls, struct GNUNET_FS_FileInformation *fi,
   mrg = NULL;
 
   tm = GTK_TREE_MODEL (gtk_builder_get_object
-                       (builder, "GNUNET_GTK_keyword_list_store"));
+                       (builder, "GNUNET_GTK_publication_keywords_liststore"));
   if (TRUE == gtk_tree_model_get_iter_first (tm, &iter))
   {
     do
@@ -598,6 +735,24 @@ file_information_update (void *cls, struct GNUNET_FS_FileInformation *fi,
       if (NULL != *uri)
         GNUNET_FS_uri_destroy (*uri);
       *uri = mrg;
+      if (auto_normalize)
+      {
+        char *emsg = NULL;
+        struct GNUNET_FS_Uri *nuri;
+
+        nuri = GNUNET_FS_uri_ksk_create (value, &emsg);
+        if (nuri == NULL)
+          GNUNET_free_non_null (emsg);
+        else
+        {
+          nxt = GNUNET_FS_uri_ksk_canonicalize (nuri);
+          mrg = GNUNET_FS_uri_ksk_merge (nxt, *uri);
+          GNUNET_FS_uri_destroy (nxt);
+          if (NULL != *uri)
+            GNUNET_FS_uri_destroy (*uri);
+          *uri = mrg;
+        }
+      }
       g_free (value);
     }
     while (TRUE == gtk_tree_model_iter_next (tm, &iter));
@@ -605,30 +760,31 @@ file_information_update (void *cls, struct GNUNET_FS_FileInformation *fi,
 
   /* update meta */
   nm = GNUNET_CONTAINER_meta_data_create ();
-  GNUNET_CONTAINER_meta_data_iterate (meta, &preserve_meta_items, nm);
+  context->md = nm;
+  GNUNET_CONTAINER_meta_data_iterate (meta, &preserve_meta_items, context);
 
   GNUNET_CONTAINER_meta_data_clear (meta);
   tm = GTK_TREE_MODEL (gtk_builder_get_object
-                       (builder, "GNUNET_GTK_meta_data_list_store"));
+                       (builder, "GNUNET_GTK_publication_metadata_liststore"));
   if (TRUE == gtk_tree_model_get_iter_first (tm, &iter))
   {
     do
     {
       gtk_tree_model_get (tm, &iter, 0, &ntype, 1, &nformat, 3, &value, -1);
-      GNUNET_CONTAINER_meta_data_insert (nm, "<user>", ntype, nformat,
-                                         "text/plain", value,
-                                         strlen (value) + 1);
+      if (ntype >= 0)
+        GNUNET_CONTAINER_meta_data_insert (nm, "<user>", ntype, nformat,
+            "text/plain", value, strlen (value) + 1);
       g_free (value);
     }
     while (TRUE == gtk_tree_model_iter_next (tm, &iter));
   }
   GNUNET_CONTAINER_meta_data_merge (meta, nm);
-  if (preview_changed == GNUNET_YES)
+  if (state->preview_changed == GNUNET_YES)
   {
     fn = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER
                                         (gtk_builder_get_object
                                          (builder,
-                                          "GNUNET_GTK_edit_file_information_metadata_preview_file_chooser_button")));
+                                          "GNUNET_GTK_edit_publication_metadata_preview_file_chooser_button")));
     f = g_file_new_for_path (fn);
     finfo =
         g_file_query_info (f, G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE, 0, NULL,
@@ -663,32 +819,190 @@ file_information_update (void *cls, struct GNUNET_FS_FileInformation *fi,
   return GNUNET_SYSERR;         /* only visit top-level item */
 }
 
+void
+GNUNET_GTK_edit_publication_cancel_button_clicked_cb (
+    GtkButton *button, gpointer user_data)
+{
+  GtkBuilder *builder;
+  GObject *pubwindow;
+  struct edit_publication_state *state = NULL;
+
+  builder = GTK_BUILDER (user_data);
+
+  pubwindow = gtk_builder_get_object (builder,
+      "GNUNET_GTK_edit_publication_window");
+  state = g_object_get_data (pubwindow, PUBSTATE);
+  if (!state)
+  {
+    GNUNET_break (0);
+    return;
+  }
+
+  state->cb (state->cls, state->do_index, state->short_fn,
+      state->anonymity_level, state->priority, NULL, state->fip, GTK_RESPONSE_CANCEL);
+  g_free (state);
+  g_object_set_data (pubwindow, PUBSTATE, NULL);
+  gtk_widget_hide (GTK_WIDGET (pubwindow));
+}
+
+void
+GNUNET_GTK_edit_publication_confirm_button_clicked_cb (
+    GtkButton *button, gpointer user_data)
+{
+  GtkBuilder *builder;
+  GObject *pubwindow;
+  struct edit_publication_state *state = NULL;
+  struct fiu_context ctx;
+
+  builder = GTK_BUILDER (user_data);
+
+  pubwindow = gtk_builder_get_object (builder,
+      "GNUNET_GTK_edit_publication_window");
+  state = g_object_get_data (pubwindow, PUBSTATE);
+  if (!state)
+  {
+    GNUNET_break (0);
+    return;
+  }
+
+  ctx.builder = builder;
+  ctx.short_fn = state->short_fn;
+  ctx.root = NULL;
+  ctx.md = NULL;
+
+  GNUNET_FS_file_information_inspect (state->fip, &file_information_update, &ctx);
+  if (!GNUNET_GTK_get_selected_anonymity_level (builder,
+      "GNUNET_GTK_edit_publication_anonymity_combobox", state->anonymity_level))
+  *state->priority =
+      gtk_spin_button_get_value (GTK_SPIN_BUTTON
+                                 (gtk_builder_get_object
+                                  (builder,
+                                   "GNUNET_GTK_edit_publication_priority_spin_button")));
+  *state->do_index =
+      gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
+                                    (gtk_builder_get_object
+                                     (builder,
+                                      "GNUNET_GTK_edit_publication_index_checkbutton")));
+
+
+  state->cb (state->cls, state->do_index, state->short_fn,
+      state->anonymity_level, state->priority, ctx.root, state->fip,
+      GTK_RESPONSE_OK);
+  g_free (state);
+  g_object_set_data (pubwindow, PUBSTATE, NULL);
+  gtk_widget_hide (GTK_WIDGET (pubwindow));
+}
 
 /**
- * Open the dialog to edit file information data.
+ * Add each of the keywords to the keyword list store.
+ *
+ * @param cls closure
+ * @param keyword the keyword
+ * @param is_mandatory is the keyword mandatory (in a search)
+ * @return GNUNET_OK to continue to iterate
  */
-void
-GNUNET_FS_GTK_edit_publish_dialog (int *do_index, char **short_fn,
-                                   guint * anonymity_level, guint * priority,
-                                   struct GNUNET_FS_FileInformation *fip)
+static int
+add_keyword (void *cls, const char *keyword, int is_mandatory)
 {
-  GtkWidget *ad;
   GtkListStore *ls;
   GtkTreeIter iter;
-  guint type;
-  guint max_type;
-  GtkTreeView *tv;
-  GtkTreeSelection *sel;
 
-  GNUNET_assert (builder == NULL);
-  builder =
-      GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_publish_edit_dialog.glade");
-  if (builder == NULL)
+  ls = GTK_LIST_STORE (cls);
+  gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, keyword, 1, FALSE, -1);
+  return GNUNET_OK;
+}
+
+/**
+ * Function called to extract the information from FI.
+ *
+ * @param cls closure
+ * @param fi the entry in the publish-structure
+ * @param length length of the file or directory
+ * @param meta metadata for the file or directory (can be modified)
+ * @param uri pointer to the keywords that will be used for this entry (can be modified)
+ * @param bo block options
+ * @param do_index should we index (can be modified)
+ * @param client_info pointer to client context set upon creation (can be modified)
+ * @return GNUNET_SYSERR (aborts after first call)
+ */
+static int
+file_information_extract (void *cls, struct GNUNET_FS_FileInformation *fi,
+                          uint64_t length,
+                          struct GNUNET_CONTAINER_MetaData *meta,
+                          struct GNUNET_FS_Uri **uri,
+                          struct GNUNET_FS_BlockOptions *bo, int *do_index,
+                          void **client_info)
+{
+  GtkBuilder *builder = GTK_BUILDER (cls);
+  GtkImage *img;
+  GdkPixbuf *pixbuf;
+  struct tm *t;
+  int year;
+  time_t tp;
+  GtkListStore *ls;
+
+  ls = GTK_LIST_STORE (gtk_builder_get_object
+                       (builder, "GNUNET_GTK_publication_keywords_liststore"));
+
+  if (NULL != *uri)
+    GNUNET_FS_uri_ksk_get_keywords (*uri, &add_keyword, ls);
+  if (NULL != meta)
   {
-    GNUNET_break (0);
-    return;
+    ls = GTK_LIST_STORE (gtk_builder_get_object (builder,
+        "GNUNET_GTK_publication_metadata_liststore"));
+    GNUNET_CONTAINER_meta_data_iterate (meta, &GNUNET_FS_GTK_add_meta_data_to_list_store, ls);
+    pixbuf = GNUNET_FS_GTK_get_thumbnail_from_meta_data (meta);
+    if (pixbuf != NULL)
+    {
+      img =
+          GTK_IMAGE (gtk_builder_get_object
+                     (builder,
+                      "GNUNET_GTK_publication_metadata_preview_image"));
+      gtk_image_set_from_pixbuf (img, pixbuf);
+    }
   }
-  preview_changed = GNUNET_NO;
+  tp = bo->expiration_time.abs_value / 1000;    /* ms to seconds */
+  t = gmtime (&tp);
+  if (t == NULL)
+    year = 0;
+  else
+    year = t->tm_year + 1900;
+  gtk_spin_button_set_value (GTK_SPIN_BUTTON
+                             (gtk_builder_get_object
+                              (builder,
+                               "GNUNET_GTK_edit_publication_expiration_year_spin_button")),
+                             year);
+  GNUNET_GTK_select_anonymity_level (builder,
+      "GNUNET_GTK_edit_publication_anonymity_combobox", bo->anonymity_level);
+  gtk_spin_button_set_value (GTK_SPIN_BUTTON
+                             (gtk_builder_get_object
+                              (builder,
+                               "GNUNET_GTK_edit_publication_priority_spin_button")),
+                             bo->content_priority);
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
+                                (gtk_builder_get_object
+                                 (builder,
+                                  "GNUNET_GTK_edit_publication_index_checkbutton")),
+                                *do_index);
+  return GNUNET_SYSERR;         /* only visit top-level item */
+}
+
+
+/**
+ * Open the dialog to edit file information data.
+ */
+void
+GNUNET_FS_GTK_edit_publish_dialog (GtkBuilder *builder, GtkWindow *parent, int *do_index,
+    char **short_fn, guint *anonymity_level, guint *priority,
+    struct GNUNET_FS_FileInformation *fip, gboolean allow_no_keywords,
+    GNUNET_FS_GTK_edit_publish_dialog_cb cb, gpointer cls)
+{
+  GtkWidget *dialog;
+  GObject *pubwindow;
+  GtkEntry *entry;
+  GtkWidget *ok;
+  struct edit_publication_state *state;
+
   GNUNET_FS_GTK_setup_expiration_year_adjustment (builder);
   if (GNUNET_FS_file_information_is_directory (fip))
   {
@@ -696,80 +1010,60 @@ GNUNET_FS_GTK_edit_publish_dialog (int *do_index, char **short_fn,
     gtk_widget_hide (GTK_WIDGET
                      (gtk_builder_get_object
                       (builder,
-                       "GNUNET_GTK_edit_file_information_index_check_button")));
+                       "GNUNET_GTK_edit_publication_index_checkbutton")));
     gtk_widget_hide (GTK_WIDGET
                      (gtk_builder_get_object
                       (builder,
-                       "GNUNET_GTK_edit_file_information_index_label")));
-
+                       "GNUNET_GTK_edit_publication_index_label")));
   }
-
-  ad = GTK_WIDGET (gtk_builder_get_object
-                   (builder, "GNUNET_GTK_edit_file_information_dialog"));
-  ls = GTK_LIST_STORE (gtk_builder_get_object
-                       (builder, "GNUNET_GTK_metatype_list_store"));
-  max_type = EXTRACTOR_metatype_get_max ();
-  type = 1;
-  while (type < max_type - 1)
+  if (allow_no_keywords)
   {
-    gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0,
-                                       EXTRACTOR_metatype_to_string (type), 1,
-                                       type, 2,
-                                       EXTRACTOR_metatype_to_description (type),
-                                       -1);
-    type++;
+    gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder,
+        "GNUNET_GTK_edit_publication_root_entry")));
+    gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder,
+        "GNUNET_GTK_edit_publication_root_label")));
   }
+  gtk_list_store_clear (GTK_LIST_STORE (gtk_builder_get_object (
+      builder, "GNUNET_GTK_publication_keywords_liststore")));
+  gtk_list_store_clear (GTK_LIST_STORE (gtk_builder_get_object (
+      builder, "GNUNET_GTK_publication_metadata_liststore")));
+
+  GNUNET_FS_file_information_inspect (fip, &file_information_extract, builder);
+
+  dialog = GTK_WIDGET (gtk_builder_get_object (builder,
+      "GNUNET_GTK_edit_publication_window"));
+
+  gtk_window_set_title (GTK_WINDOW (dialog), *short_fn);
+
+  state = g_new0 (struct edit_publication_state, 1);
+  state->do_index = do_index;
+  state->short_fn = short_fn;
+  state->root = NULL;
+  state->anonymity_level = anonymity_level;
+  state->priority = priority;
+  state->fip = fip;
+  state->preview_changed = GNUNET_NO;
+  state->allow_no_keywords = allow_no_keywords;
+  state->is_directory = GNUNET_FS_file_information_is_directory (fip);
+  state->cb = cb;
+  state->cls = cls;
 
-  GNUNET_FS_file_information_inspect (fip, &file_information_extract, NULL);
-  tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (builder,
-                       "GNUNET_GTK_edit_file_information_metadata_type_tree_view"));
-  sel = gtk_tree_view_get_selection (tv);
-  g_signal_connect (G_OBJECT (sel), "changed",
-                    G_CALLBACK
-                    (GNUNET_GTK_edit_file_information_metadata_value_entry_changed_cb),
-                    NULL);
+  entry =
+      GTK_ENTRY (gtk_builder_get_object
+                 (builder, "GNUNET_GTK_edit_publication_keyword_entry"));
+  gtk_entry_set_text (entry, "");
 
-  tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (builder,
-                       "GNUNET_GTK_edit_file_information_metadata_tree_view"));
-  sel = gtk_tree_view_get_selection (tv);
-  g_signal_connect (G_OBJECT (sel), "changed",
-                    G_CALLBACK (metadata_selection_changed_cb), NULL);
+  pubwindow = gtk_builder_get_object (builder,
+      "GNUNET_GTK_edit_publication_window");
+  g_object_set_data (pubwindow, PUBSTATE, state);
 
-  tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (builder,
-                       "GNUNET_GTK_edit_file_information_keyword_list_tree_view"));
-  sel = gtk_tree_view_get_selection (tv);
-  g_signal_connect (G_OBJECT (sel), "changed",
-                    G_CALLBACK (keyword_selection_changed_cb), NULL);
-  gtk_window_set_title (GTK_WINDOW (ad), *short_fn);
-  if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad)))
-  {
-    gtk_widget_destroy (ad);
-    g_object_unref (G_OBJECT (builder));
-    builder = NULL;
-    return;
-  }
-  GNUNET_FS_file_information_inspect (fip, &file_information_update, short_fn);
-  *anonymity_level =
-      gtk_spin_button_get_value (GTK_SPIN_BUTTON
-                                 (gtk_builder_get_object
-                                  (builder,
-                                   "GNUNET_GTK_edit_file_information_anonymity_spin_button")));
-  *priority =
-      gtk_spin_button_get_value (GTK_SPIN_BUTTON
-                                 (gtk_builder_get_object
-                                  (builder,
-                                   "GNUNET_GTK_edit_file_information_priority_spin_button")));
-  *do_index =
-      gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
-                                    (gtk_builder_get_object
-                                     (builder,
-                                      "GNUNET_GTK_edit_file_information_index_check_button")));
-  gtk_widget_destroy (ad);
-  g_object_unref (G_OBJECT (builder));
-  builder = NULL;
+  ok = GTK_WIDGET (gtk_builder_get_object (builder,
+      "GNUNET_GTK_edit_publication_confirm_button"));
+  gtk_widget_set_sensitive (ok, allow_no_keywords ? TRUE : FALSE);
+
+  gtk_window_set_transient_for (GTK_WINDOW (pubwindow), parent);
+
+  gtk_window_present (GTK_WINDOW (dialog));
 }
 
 /* end of gnunet-fs-gtk-edit_publish_dialog.c */
diff --git a/src/fs/gnunet-fs-gtk-edit_publish_dialog.h b/src/fs/gnunet-fs-gtk-edit_publish_dialog.h
index 6363521..5473cb4 100644
--- a/src/fs/gnunet-fs-gtk-edit_publish_dialog.h
+++ b/src/fs/gnunet-fs-gtk-edit_publish_dialog.h
@@ -30,10 +30,20 @@
 #include <gnunet/gnunet_fs_service.h>
 
 
+typedef void
+(*GNUNET_FS_GTK_edit_publish_dialog_cb) (gpointer cls, int *do_index, char **short_fn,
+                                   guint * anonymity_level, guint * priority, gchar *root,
+                                   struct GNUNET_FS_FileInformation *fip, gint ret);
+
+
+/**
+ * Open the dialog to edit file information data.
+ */
 void
-GNUNET_FS_GTK_edit_publish_dialog (int *do_index, char **short_fn,
-                                   guint * anonymity_level, guint * priority,
-                                   struct GNUNET_FS_FileInformation *fip);
+GNUNET_FS_GTK_edit_publish_dialog (GtkBuilder *builder, GtkWindow *parent, int *do_index,
+    char **short_fn, guint * anonymity_level, guint * priority,
+    struct GNUNET_FS_FileInformation *fip, gboolean allow_no_keywords,
+    GNUNET_FS_GTK_edit_publish_dialog_cb cb, gpointer cls);
 
 #endif
 /* end of gnunet-fs-gtk-edit_publish_dialog.h */
diff --git a/src/fs/gnunet-fs-gtk-main_window_adv_pseudonym.c b/src/fs/gnunet-fs-gtk-main_window_adv_pseudonym.c
index bb3265e..9b76f2a 100644
--- a/src/fs/gnunet-fs-gtk-main_window_adv_pseudonym.c
+++ b/src/fs/gnunet-fs-gtk-main_window_adv_pseudonym.c
@@ -24,343 +24,7 @@
  */
 #include "gnunet-fs-gtk-common.h"
 #include "gnunet-fs-gtk.h"
-
-static GtkBuilder *builder;
-
-
-/**
- * Canonicalize spelling of currently selected keyword.
- */
-void
-GNUNET_GTK_advertise_pseudonym_keyword_list_normalize_button_clicked_cb ()
-{
-  GtkTreeView *tv;
-  GtkTreeSelection *sel;
-  GtkTreeModel *tm;
-  GtkTreeIter iter;
-  gchar *value;
-  struct GNUNET_FS_Uri *uri;
-  struct GNUNET_FS_Uri *nuri;
-  char *nvalue;
-  char *emsg;
-
-  tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (builder,
-                       "GNUNET_GTK_advertise_pseudonym_keyword_list_tree_view"));
-  sel = gtk_tree_view_get_selection (tv);
-  if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
-  {
-    GNUNET_break (0);
-    return;
-  }
-  gtk_tree_model_get (tm, &iter, 0, &value, -1);
-  emsg = NULL;
-  uri = GNUNET_FS_uri_ksk_create (value, &emsg);
-  if (uri == NULL)
-  {
-    GNUNET_break (0);
-    GNUNET_free (emsg);
-    g_free (value);
-    return;
-  }
-  nuri = GNUNET_FS_uri_ksk_canonicalize (uri);
-  nvalue = GNUNET_FS_uri_ksk_to_string_fancy (nuri);
-  gtk_list_store_set (GTK_LIST_STORE (tm), &iter, 0, nvalue, -1);
-  GNUNET_FS_uri_destroy (nuri);
-  GNUNET_FS_uri_destroy (uri);
-  GNUNET_free (nvalue);
-  g_free (value);
-}
-
-
-/**
- * Remove the currently selected keyword from the list.
- */
-void
-GNUNET_GTK_advertise_pseudonym_keyword_list_del_button_clicked_cb ()
-{
-  GtkTreeView *tv;
-  GtkTreeSelection *sel;
-  GtkTreeModel *tm;
-  GtkTreeIter iter;
-  GtkWidget *w;
-
-  tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (builder,
-                       "GNUNET_GTK_advertise_pseudonym_keyword_list_tree_view"));
-  sel = gtk_tree_view_get_selection (tv);
-  if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
-  {
-    GNUNET_break (0);
-    return;
-  }
-  gtk_list_store_remove (GTK_LIST_STORE (tm), &iter);
-  if (TRUE != gtk_tree_model_get_iter_first (tm, &iter))
-  {
-    /* keyword list now empty, disable 'Ok' button! */
-    w = GTK_WIDGET (gtk_builder_get_object (builder, 
-					    "GNUNET_GTK_advertise_pseudonym_confirm_button"));
-    gtk_widget_set_sensitive (w, FALSE);
-  }
-}
-
-
-/**
- * Add keyword from entry line to keyword list.
- */
-void
-GNUNET_GTK_advertise_pseudonym_keyword_list_add_button_clicked_cb ()
-{
-  const char *keyword;
-  GtkEntry *entry;
-  GtkListStore *ls;
-  GtkTreeIter iter;
-  GtkWidget *w;
-
-  ls = GTK_LIST_STORE (gtk_builder_get_object
-                       (builder, "GNUNET_GTK_keyword_list_store"));
-  entry =
-      GTK_ENTRY (gtk_builder_get_object
-                 (builder, "GNUNET_GTK_advertise_pseudonym_keyword_entry"));
-  keyword = gtk_entry_get_text (entry);
-  if (strlen (keyword) > 0)
-  {
-    gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, keyword, -1); 
-    /* enable OK button */
-    w = GTK_WIDGET (gtk_builder_get_object (builder, "GNUNET_GTK_advertise_pseudonym_confirm_button"));
-    gtk_widget_set_sensitive (w, TRUE);
-  }
-  gtk_entry_set_text (entry, "");
-}
-
-
-/**
- * Update sensitivity of keyword add button.
- */
-void
-GNUNET_GTK_advertise_pseudonym_keyword_entry_changed_cb ()
-{
-  const char *keyword;
-  GtkEntry *entry;
-  GtkWidget *button;
-
-  button =
-      GTK_WIDGET (gtk_builder_get_object
-                  (builder,
-                   "GNUNET_GTK_advertise_pseudonym_keyword_list_add_button"));
-  entry =
-      GTK_ENTRY (gtk_builder_get_object
-                 (builder, "GNUNET_GTK_advertise_pseudonym_keyword_entry"));
-  keyword = gtk_entry_get_text (entry);
-  gtk_widget_set_sensitive (button, (strlen (keyword) > 0) ? TRUE : FALSE);
-}
-
-/**
- * Update sensitivity of metadata delete button.
- */
-static void
-metadata_selection_changed_cb (GtkTreeSelection * ts, gpointer user_data)
-{
-  GtkTreeView *tv;
-  GtkTreeSelection *sel;
-  GtkWidget *button;
-
-  tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (builder,
-                       "GNUNET_GTK_advertise_pseudonym_metadata_tree_view"));
-  sel = gtk_tree_view_get_selection (tv);
-  button =
-      GTK_WIDGET (gtk_builder_get_object
-                  (builder,
-                   "GNUNET_GTK_advertise_pseudonym_metadata_delete_button"));
-  gtk_widget_set_sensitive (button,
-                            gtk_tree_selection_get_selected (sel, NULL, NULL));
-}
-
-
-/**
- * Update sensitivity of keyword delete and normalize button.
- */
-static void
-keyword_selection_changed_cb (GtkTreeSelection * ts, gpointer user_data)
-{
-  GtkTreeView *tv;
-  GtkTreeSelection *sel;
-  GtkWidget *button;
-
-  tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (builder,
-                       "GNUNET_GTK_advertise_pseudonym_keyword_list_tree_view"));
-  sel = gtk_tree_view_get_selection (tv);
-  button =
-      GTK_WIDGET (gtk_builder_get_object
-                  (builder,
-                   "GNUNET_GTK_advertise_pseudonym_keyword_list_del_button"));
-
-  gtk_widget_set_sensitive (button,
-                            gtk_tree_selection_get_selected (sel, NULL, NULL));
-  button =
-      GTK_WIDGET (gtk_builder_get_object
-                  (builder,
-                   "GNUNET_GTK_advertise_pseudonym_keyword_list_normalize_button"));
-  gtk_widget_set_sensitive (button,
-                            gtk_tree_selection_get_selected (sel, NULL, NULL));
-}
-
-
-/**
- * Update sensitivity of metadata add button.
- */
-void
-GNUNET_GTK_advertise_pseudonym_metadata_value_entry_changed_cb ()
-{
-  GtkTreeView *tv;
-  GtkTreeSelection *sel;
-  const char *value;
-  GtkEntry *entry;
-  GtkWidget *button;
-
-  entry =
-      GTK_ENTRY (gtk_builder_get_object
-                 (builder,
-                  "GNUNET_GTK_advertise_pseudonym_metadata_value_entry"));
-  value = gtk_entry_get_text (entry);
-  tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (builder,
-                       "GNUNET_GTK_advertise_pseudonym_metadata_type_tree_view"));
-  sel = gtk_tree_view_get_selection (tv);
-  button =
-      GTK_WIDGET (gtk_builder_get_object
-                  (builder,
-                   "GNUNET_GTK_advertise_pseudonym_metadata_add_button"));
-  gtk_widget_set_sensitive (button,
-                            (strlen (value) >
-                             0) ? gtk_tree_selection_get_selected (sel, NULL,
-                                                                   NULL) :
-                            FALSE);
-}
-
-
-/**
- * Add keyword to keyword list.
- */
-void
-GNUNET_GTK_advertise_pseudonym_keyword_entry_activate_cb ()
-{
-  GNUNET_GTK_advertise_pseudonym_keyword_list_add_button_clicked_cb ();
-}
-
-
-void
-GNUNET_GTK_advertise_pseudonym_metadata_preview_file_chooser_button_file_set_cb
-    ()
-{
-  GNUNET_break (0);
-}
-
-/**
- * Delete currently selected item from meta data list.
- */
-void
-GNUNET_GTK_advertise_pseudonym_metadata_delete_button_clicked_cb ()
-{
-  GtkTreeView *tv;
-  GtkTreeSelection *sel;
-  GtkTreeModel *tm;
-  GtkTreeIter iter;
-
-  tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (builder,
-                       "GNUNET_GTK_advertise_pseudonym_metadata_tree_view"));
-  sel = gtk_tree_view_get_selection (tv);
-  if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
-  {
-    GNUNET_break (0);
-    return;
-  }
-  gtk_list_store_remove (GTK_LIST_STORE (tm), &iter);
-}
-
-
-/**
- * Add metadata to metadata list.
- */
-void
-GNUNET_GTK_advertise_pseudonym_metadata_add_button_clicked_cb ()
-{
-  const char *value;
-  char *avalue;
-  const char *ivalue;
-  GtkEntry *entry;
-  GtkListStore *ls;
-  GtkTreeModel *tm;
-  GtkTreeView *tv;
-  GtkTreeSelection *sel;
-  GtkTreeIter iter;
-  guint type;
-  size_t slen;
-  char *pos;
-
-  entry =
-      GTK_ENTRY (gtk_builder_get_object
-                 (builder,
-                  "GNUNET_GTK_advertise_pseudonym_metadata_value_entry"));
-  value = gtk_entry_get_text (entry);
-  if ((value == NULL) || (strlen (value) == 0))
-  {
-    GNUNET_break (0);
-    return;
-  }
-  tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (builder,
-                       "GNUNET_GTK_advertise_pseudonym_metadata_type_tree_view"));
-  tm = gtk_tree_view_get_model (tv);
-  sel = gtk_tree_view_get_selection (tv);
-  if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
-  {
-    GNUNET_break (0);
-    return;
-  }
-  gtk_tree_model_get (tm, &iter, 1, &type, -1);
-  ls = GTK_LIST_STORE (gtk_builder_get_object
-                       (builder, "GNUNET_GTK_meta_data_list_store"));
-  if ((type == EXTRACTOR_METATYPE_FILENAME) &&
-      (value[strlen (value) - 1] != '/'))
-  {
-    GNUNET_asprintf (&avalue, "%s/", value);
-    /* if user typed '\' instead of '/', change it! */
-    slen = strlen (avalue);
-    while ((slen > 1) && (avalue[slen - 2] == '\\'))
-    {
-      avalue[slen - 2] = '/';
-      avalue[slen - 1] = '\0';
-      slen--;
-    }
-    while (NULL != (pos = strstr (avalue, "\\")))
-      *pos = '/';
-    /* remove '../' everywhere */
-    while (NULL != (pos = strstr (avalue, "../")))
-    {
-      pos[0] = '_';
-      pos[1] = '_';
-      pos[2] = '_';
-    }
-    ivalue = avalue;
-  }
-  else
-  {
-    ivalue = value;
-    avalue = NULL;
-  }
-
-  gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0, type, 1,
-                                     (guint) EXTRACTOR_METAFORMAT_UTF8, 2,
-                                     EXTRACTOR_metatype_to_string (type), 3,
-                                     ivalue, -1);
-  GNUNET_free_non_null (avalue);
-  gtk_entry_set_text (GTK_ENTRY (entry), "");
-}
-
+#include "gnunet-fs-gtk-edit_publish_dialog.h"
 
 /**
  * Callback with information about local (!) namespaces.
@@ -390,6 +54,8 @@ selection_changed_cb (GtkTreeSelection * ts, gpointer user_data)
 {
   GtkTreeIter iter;
   GtkWidget *ok_button;
+  GtkBuilder *builder;
+  builder = GTK_BUILDER (user_data);
 
   ok_button =
       GTK_WIDGET (gtk_builder_get_object
@@ -400,60 +66,100 @@ selection_changed_cb (GtkTreeSelection * ts, gpointer user_data)
     gtk_widget_set_sensitive (ok_button, FALSE);
 }
 
+struct namespace_data_struct
+{
+  struct GNUNET_FS_Namespace *ns;
+  int do_index;
+  char *short_fn;
+  guint anonymity_level;
+  guint priority;
+  gchar *root;
+};
 
 /**
- * Advertise pseudonym selected.
+ * Function called on entries in a GNUNET_FS_FileInformation publish-structure.
+ *
+ * @param cls closure
+ * @param fi the entry in the publish-structure
+ * @param length length of the file or directory
+ * @param meta metadata for the file or directory (can be modified)
+ * @param uri pointer to the keywords that will be used for this entry (can be modified)
+ * @param bo block options (can be modified)
+ * @param do_index should we index (can be modified)
+ * @param client_info pointer to client context set upon creation (can be modified)
+ * @return GNUNET_OK to continue, GNUNET_NO to remove
+ *         this entry from the directory, GNUNET_SYSERR
+ *         to abort the iteration
  */
+int
+advertise_namespace (void *cls, struct GNUNET_FS_FileInformation *fi,
+    uint64_t length, struct GNUNET_CONTAINER_MetaData *meta,
+    struct GNUNET_FS_Uri **uri, struct GNUNET_FS_BlockOptions *bo,
+    int *do_index, void **client_info)
+{
+  struct namespace_data_struct *nds;
+  nds = (struct namespace_data_struct *) cls;
+  GNUNET_FS_namespace_advertise (GNUNET_FS_GTK_get_fs_handle (), *uri,
+      nds->ns, meta, bo, nds->root, NULL, NULL);
+  return GNUNET_SYSERR;
+}
+
 void
-GNUNET_GTK_main_menu_file_advertise_pseudonym_activate_cb (GtkWidget * dummy,
-                                                           gpointer data)
+adv_pseudonym_edit_publish_dialog_cb (gpointer cls, int *do_index, char **short_fn,
+    guint * anonymity_level, guint * priority, gchar *root,
+    struct GNUNET_FS_FileInformation *fip, gint ret)
+{
+  struct namespace_data_struct *nds;
+  nds = (struct namespace_data_struct *) cls;
+
+  if (ret == GTK_RESPONSE_OK)
+  {
+    nds->do_index = *do_index;
+    nds->short_fn = *short_fn;
+    nds->anonymity_level = *anonymity_level;
+    nds->priority = *priority;
+    nds->root = root;
+    GNUNET_FS_file_information_inspect (fip,
+        advertise_namespace, nds);
+  }
+  g_free (nds->root);
+  GNUNET_FS_namespace_delete (nds->ns, GNUNET_NO);
+  g_free (nds);
+  GNUNET_FS_file_information_destroy (fip, NULL, NULL);
+}
+
+void
+GNUNET_GTK_select_pseudonym_dialog_response_cb (GtkDialog *dialog,
+   gint response_id, gpointer user_data)
 {
+  GtkBuilder *builder;
   GtkWidget *ad;
-  struct GNUNET_FS_Namespace *ns;
-  struct GNUNET_FS_Namespace *nso;
-  GtkListStore *ls;
   GtkTreeView *tv;
-  GtkTreeIter iter;
   GtkTreeSelection *sel;
   GtkTreeModel *tm;
-  GtkSpinButton *sb;
+  GtkTreeIter iter;
+  struct GNUNET_FS_Namespace *ns;
+  struct GNUNET_FS_Namespace *nso;
+  GtkWindow *transient;
+  struct namespace_data_struct *nds;
+  struct GNUNET_FS_FileInformation *fip;
+  struct GNUNET_CONTAINER_MetaData *meta;
+  builder = GTK_BUILDER (user_data);
   struct GNUNET_FS_BlockOptions bo;
-  struct GNUNET_FS_Uri *nxt;
-  struct GNUNET_FS_Uri *mrg;
-  struct GNUNET_FS_Uri *uri;
-  struct GNUNET_CONTAINER_MetaData *nm;
-  const char *root;
-  char *value;
-  guint ntype;
-  guint nformat;
-  guint type;
-  guint max_type;
 
-  builder =
-      GNUNET_GTK_get_new_builder
-      ("gnunet_fs_gtk_select_pseudonym_dialog.glade");
-  if (builder == NULL)
-  {
-    GNUNET_break (0);
-    return;
-  }
   ad = GTK_WIDGET (gtk_builder_get_object
                    (builder, "GNUNET_GTK_select_pseudonym_dialog"));
-  ls = GTK_LIST_STORE (gtk_builder_get_object
-                       (builder, "GNUNET_GTK_select_pseudonym_liststore"));
-  GNUNET_FS_namespace_list (GNUNET_FS_GTK_get_fs_handle (), &add_to_list, ls);
-  tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (builder, "GNUNET_GTK_select_pseudonym_tree_view"));
-  sel = gtk_tree_view_get_selection (tv);
-  g_signal_connect (G_OBJECT (sel), "changed",
-                    G_CALLBACK (selection_changed_cb), NULL);
-  if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad)))
+
+  if (response_id != -5)
   {
-    gtk_widget_destroy (ad);
-    g_object_unref (G_OBJECT (builder));
-    builder = NULL;
+    gtk_widget_hide (ad);
     return;
   }
+  tv = GTK_TREE_VIEW (gtk_builder_get_object
+                      (builder,
+                       "GNUNET_GTK_select_pseudonym_tree_view"));
+  sel = gtk_tree_view_get_selection (tv);
+
   GNUNET_assert (TRUE == gtk_tree_selection_get_selected (sel, &tm, &iter));
   gtk_tree_model_get (tm, &iter, 1, &ns, -1);
   /* free all namespaces from list store except "ns" */
@@ -467,129 +173,72 @@ GNUNET_GTK_main_menu_file_advertise_pseudonym_activate_cb (GtkWidget * dummy,
     }
     while (TRUE == gtk_tree_model_iter_next (tm, &iter));
   }
-  gtk_widget_destroy (ad);
-  g_object_unref (G_OBJECT (builder));
-  builder = NULL;
+  transient = gtk_window_get_transient_for (GTK_WINDOW (ad));
+  gtk_widget_hide (ad);
+
+  meta = GNUNET_CONTAINER_meta_data_create ();
+
+  nds = g_new0 (struct namespace_data_struct, 1);
+  nds->ns = ns;
+  nds->do_index = FALSE;
+  nds->short_fn = NULL;
+  nds->anonymity_level = 1;
+  nds->priority = 1000;
+  nds->root = NULL;
+  /* This is a bogus fileinfo. It's needed because edit_publish_dialog
+   * was written to work with fileinfo, and return a fileinfo.
+   */
+  memset (&bo, 0, sizeof (bo));
+  fip = GNUNET_FS_file_information_create_empty_directory (NULL, NULL,
+      NULL, meta, &bo);
+  GNUNET_CONTAINER_meta_data_destroy (meta);
+
+  GNUNET_FS_GTK_edit_publish_dialog (builder, transient, &nds->do_index,
+      &nds->short_fn, &nds->anonymity_level, &nds->priority,
+      fip, FALSE, &adv_pseudonym_edit_publish_dialog_cb, nds);
+}
 
+void
+GNUNET_GTK_select_pseudonym_dialog_realize_cb (GtkWidget *widget,
+    gpointer user_data)
+{
+  GtkTreeView *tv;
+  GtkTreeSelection *sel;
+  GtkBuilder *builder;
 
-  builder =
-      GNUNET_GTK_get_new_builder
-      ("gnunet_fs_gtk_advertise_pseudonym_dialog.glade");
-  if (builder == NULL)
-  {
-    GNUNET_break (0);
-    return;
-  }
-  GNUNET_FS_GTK_setup_expiration_year_adjustment (builder);
-  ad = GTK_WIDGET (gtk_builder_get_object
-                   (builder, "GNUNET_GTK_advertise_pseudonym_dialog"));
-  ls = GTK_LIST_STORE (gtk_builder_get_object
-                       (builder, "GNUNET_GTK_metatype_list_store"));
-  max_type = EXTRACTOR_metatype_get_max ();
-  type = 1;
-  while (type < max_type - 1)
-  {
-    gtk_list_store_insert_with_values (ls, &iter, G_MAXINT, 0,
-                                       EXTRACTOR_metatype_to_string (type), 1,
-                                       type, 2,
-                                       EXTRACTOR_metatype_to_description (type),
-                                       -1);
-    type++;
-  }
-  tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (builder,
-                       "GNUNET_GTK_advertise_pseudonym_metadata_type_tree_view"));
-  sel = gtk_tree_view_get_selection (tv);
-  g_signal_connect (G_OBJECT (sel), "changed",
-                    G_CALLBACK
-                    (GNUNET_GTK_advertise_pseudonym_metadata_value_entry_changed_cb),
-                    NULL);
+  builder = GTK_BUILDER (user_data);
 
   tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (builder,
-                       "GNUNET_GTK_advertise_pseudonym_metadata_tree_view"));
+                      (builder, "GNUNET_GTK_select_pseudonym_tree_view"));
   sel = gtk_tree_view_get_selection (tv);
   g_signal_connect (G_OBJECT (sel), "changed",
-                    G_CALLBACK (metadata_selection_changed_cb), NULL);
+                    G_CALLBACK (selection_changed_cb), user_data);
+}
 
-  tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (builder,
-                       "GNUNET_GTK_advertise_pseudonym_keyword_list_tree_view"));
-  sel = gtk_tree_view_get_selection (tv);
-  g_signal_connect (G_OBJECT (sel), "changed",
-                    G_CALLBACK (keyword_selection_changed_cb), NULL);
-  if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad)))
-  {
-    gtk_widget_destroy (ad);
-    g_object_unref (G_OBJECT (builder));
-    builder = NULL;
-    return;
-  }
-  /* get keywords from list store */
-  nxt = NULL;
-  mrg = NULL;
-  uri = NULL;
-  tm = GTK_TREE_MODEL (gtk_builder_get_object
-                       (builder, "GNUNET_GTK_keyword_list_store"));
-  if (TRUE == gtk_tree_model_get_iter_first (tm, &iter))
-  {
-    do
-    {
-      gtk_tree_model_get (tm, &iter, 0, &value, -1);
-      nxt = GNUNET_FS_uri_ksk_create_from_args (1, (const char **) &value);
-      mrg = GNUNET_FS_uri_ksk_merge (nxt, uri);
-      GNUNET_FS_uri_destroy (nxt);
-      if (NULL != uri)
-        GNUNET_FS_uri_destroy (uri);
-      uri = mrg;
-      g_free (value);
-    }
-    while (TRUE == gtk_tree_model_iter_next (tm, &iter));
-  }
-  /* get meta */
-  nm = GNUNET_CONTAINER_meta_data_create ();
-  tm = GTK_TREE_MODEL (gtk_builder_get_object
-                       (builder, "GNUNET_GTK_meta_data_list_store"));
-  if (TRUE == gtk_tree_model_get_iter_first (tm, &iter))
-  {
-    do
-    {
-      gtk_tree_model_get (tm, &iter, 0, &ntype, 1, &nformat, 3, &value, -1);
-      GNUNET_CONTAINER_meta_data_insert (nm, "<user>", ntype, nformat,
-                                         "text/plain", value,
-                                         strlen (value) + 1);
-      g_free (value);
-    }
-    while (TRUE == gtk_tree_model_iter_next (tm, &iter));
-  }
-  bo.anonymity_level =
-      gtk_spin_button_get_value (GTK_SPIN_BUTTON
-                                 (gtk_builder_get_object
-                                  (builder,
-                                   "GNUNET_GTK_advertise_pseudonym_anonymity_spin_button")));
-  bo.content_priority =
-      gtk_spin_button_get_value (GTK_SPIN_BUTTON
-                                 (gtk_builder_get_object
-                                  (builder,
-                                   "GNUNET_GTK_advertise_pseudonym_priority_spin_button")));
-  sb = GTK_SPIN_BUTTON (gtk_builder_get_object
-                        (builder,
-                         "GNUNET_GTK_advertise_pseudonym_expiration_year_spin_button"));
-  bo.expiration_time = GNUNET_FS_GTK_get_expiration_time (sb);
-  root =
-      gtk_entry_get_text (GTK_ENTRY
-                          (gtk_builder_get_object
-                           (builder,
-                            "GNUNET_GTK_advertise_pseudonym_root_entry")));
-  GNUNET_FS_namespace_advertise (GNUNET_FS_GTK_get_fs_handle (), uri, ns, nm,
-                                 &bo, root, NULL, NULL);
-  GNUNET_FS_namespace_delete (ns, GNUNET_NO);
-  GNUNET_CONTAINER_meta_data_destroy (nm);
-  if (NULL != uri)
-    GNUNET_FS_uri_destroy (uri);
-  gtk_widget_destroy (ad);
-  g_object_unref (G_OBJECT (builder));
-  builder = NULL;
+/**
+ * Advertise pseudonym selected.
+ */
+void
+GNUNET_GTK_main_menu_file_advertise_pseudonym_activate_cb (GtkWidget * dummy,
+                                                           gpointer data)
+{
+  GtkWidget *ad;
+  GtkListStore *ls;
+  GtkWidget *toplevel;
+  GtkBuilder *builder;
+
+  builder = GTK_BUILDER (data);
+
+  ad = GTK_WIDGET (gtk_builder_get_object
+                   (builder, "GNUNET_GTK_select_pseudonym_dialog"));
+  ls = GTK_LIST_STORE (gtk_builder_get_object
+                       (builder, "GNUNET_GTK_select_pseudonym_liststore"));
+  gtk_list_store_clear (ls);
+  GNUNET_FS_namespace_list (GNUNET_FS_GTK_get_fs_handle (), &add_to_list, ls);
+  toplevel = gtk_widget_get_toplevel (dummy);
+  if (GTK_IS_WINDOW (toplevel))
+    gtk_window_set_transient_for (GTK_WINDOW (ad), GTK_WINDOW (toplevel));
+  gtk_window_present (GTK_WINDOW (ad));
 }
 
 
diff --git a/src/fs/gnunet-fs-gtk-main_window_create_pseudonym.c b/src/fs/gnunet-fs-gtk-main_window_create_pseudonym.c
index 05094a1..e0a8b0e 100644
--- a/src/fs/gnunet-fs-gtk-main_window_create_pseudonym.c
+++ b/src/fs/gnunet-fs-gtk-main_window_create_pseudonym.c
@@ -26,28 +26,20 @@
 #include "gnunet-fs-gtk-common.h"
 #include "gnunet-fs-gtk.h"
 
-/**
- */
 void
-GNUNET_GTK_main_menu_create_pseudonym_activate_cb (GtkWidget * dummy,
-                                                   gpointer data)
+GNUNET_GTK_create_namespace_dialog_response_cb (GtkDialog *dialog,
+  gint response_id, gpointer user_data)
 {
-  GtkWidget *ad;
-  GtkBuilder *builder;
   const char *name;
   struct GNUNET_FS_Namespace *ns;
+  GtkWidget *ad;
+  GtkBuilder *builder;
 
-  builder =
-      GNUNET_GTK_get_new_builder
-      ("gnunet_fs_gtk_create_namespace_dialog.glade");
-  if (builder == NULL)
-  {
-    GNUNET_break (0);
-    return;
-  }
+  builder = GTK_BUILDER (user_data);
   ad = GTK_WIDGET (gtk_builder_get_object
                    (builder, "GNUNET_GTK_create_namespace_dialog"));
-  if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad)))
+
+  if (response_id != -5)
   {
     gtk_widget_destroy (ad);
     g_object_unref (G_OBJECT (builder));
@@ -65,5 +57,32 @@ GNUNET_GTK_main_menu_create_pseudonym_activate_cb (GtkWidget * dummy,
   g_object_unref (G_OBJECT (builder));
 }
 
+/**
+ */
+void
+GNUNET_GTK_main_menu_create_pseudonym_activate_cb (GtkWidget * dummy,
+                                                   gpointer data)
+{
+  GtkWidget *ad;
+  GtkWidget *toplevel;
+  GtkBuilder *builder;
+
+  builder =
+      GNUNET_GTK_get_new_builder
+      ("gnunet_fs_gtk_create_namespace_dialog.glade");
+  if (builder == NULL)
+  {
+    GNUNET_break (0);
+    return;
+  }
+  ad = GTK_WIDGET (gtk_builder_get_object
+                   (builder, "GNUNET_GTK_create_namespace_dialog"));
+
+  toplevel = gtk_widget_get_toplevel (dummy);
+  if (GTK_IS_WINDOW (toplevel))
+    gtk_window_set_transient_for (GTK_WINDOW (ad), GTK_WINDOW (toplevel));
+  gtk_window_present (GTK_WINDOW (ad));
+}
+
 
 /* end of gnunet-fs-gtk-main_window_create_pseudonym.c */
diff --git a/src/fs/gnunet-fs-gtk-main_window_file_publish.c b/src/fs/gnunet-fs-gtk-main_window_file_publish.c
index c4ad511..7291504 100644
--- a/src/fs/gnunet-fs-gtk-main_window_file_publish.c
+++ b/src/fs/gnunet-fs-gtk-main_window_file_publish.c
@@ -26,16 +26,11 @@
 #include "gnunet-fs-gtk.h"
 #include "gnunet-fs-gtk-edit_publish_dialog.h"
 #include <gnunet/gnunet_util_lib.h>
+#include <gnunet/gnunet_fs_service.h>
 
 #define MARKER_DIR_FILE_SIZE "-"
 
 /**
- * Builder used for the master publish dialog.
- */
-static GtkBuilder *master_builder;
-
-
-/**
  * Check if two GtkTreeIters refer to the same element.
  *
  * @param tm tree model of the iterators
@@ -63,7 +58,7 @@ gtk_tree_iter_equals (GtkTreeModel * tm, GtkTreeIter * i1, GtkTreeIter * i2)
  * Update selectivity in the master dialog.
  */
 static void
-update_selectivity ()
+update_selectivity (gpointer data)
 {
   GtkTreeView *tv;
   GtkTreeModel *tm;
@@ -83,12 +78,15 @@ update_selectivity ()
   struct GNUNET_FS_FileInformation *fip;
   int ns_ok;
   gchar *namespace_id;
+  GtkBuilder *builder;
+  
+  builder = GTK_BUILDER (data);
 
   tm = GTK_TREE_MODEL (gtk_builder_get_object
-                       (master_builder,
+                       (builder,
                         "GNUNET_GTK_file_sharing_publishing_tree_store"));
   tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (master_builder,
+                      (builder,
                        "GNUNET_GTK_master_publish_dialog_pseudonym_tree_view"));
   sel = gtk_tree_view_get_selection (tv);
   ns_ok = GNUNET_YES;
@@ -102,34 +100,34 @@ update_selectivity ()
   }
   up_button =
       GTK_WIDGET (gtk_builder_get_object
-                  (master_builder,
+                  (builder,
                    "GNUNET_GTK_master_publish_dialog_up_button"));
   down_button =
       GTK_WIDGET (gtk_builder_get_object
-                  (master_builder,
+                  (builder,
                    "GNUNET_GTK_master_publish_dialog_down_button"));
   left_button =
       GTK_WIDGET (gtk_builder_get_object
-                  (master_builder,
+                  (builder,
                    "GNUNET_GTK_master_publish_dialog_left_button"));
   right_button =
       GTK_WIDGET (gtk_builder_get_object
-                  (master_builder,
+                  (builder,
                    "GNUNET_GTK_master_publish_dialog_right_button"));
   delete_button =
       GTK_WIDGET (gtk_builder_get_object
-                  (master_builder,
+                  (builder,
                    "GNUNET_GTK_master_publish_dialog_delete_button"));
   edit_button =
       GTK_WIDGET (gtk_builder_get_object
-                  (master_builder,
+                  (builder,
                    "GNUNET_GTK_master_publish_dialog_edit_button"));
   execute_button =
       GTK_WIDGET (gtk_builder_get_object
-                  (master_builder,
+                  (builder,
                    "GNUNET_GTK_master_publish_dialog_execute_button"));
   tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (master_builder,
+                      (builder,
                        "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
   sel = gtk_tree_view_get_selection (tv);
   tm = gtk_tree_view_get_model (tv);
@@ -208,7 +206,7 @@ update_selectivity ()
  * @param iter parent entry, or NULL for top-level addition
  */
 static void
-add_file_at_iter (const char *filename, const struct GNUNET_FS_BlockOptions *bo,
+add_file_at_iter (gpointer data, const char *filename, const struct GNUNET_FS_BlockOptions *bo,
                   int do_index, GtkTreeIter * iter)
 {
   struct GNUNET_FS_FileInformation *fi;
@@ -223,6 +221,9 @@ add_file_at_iter (const char *filename, const struct GNUNET_FS_BlockOptions *bo,
   char *file_size_fancy;
   const char *ss;
   struct stat sbuf;
+  GtkBuilder *builder;
+  
+  builder = GTK_BUILDER (data);
 
   if (0 != STAT (filename, &sbuf))
     return;
@@ -239,7 +240,7 @@ add_file_at_iter (const char *filename, const struct GNUNET_FS_BlockOptions *bo,
     }
   }
   ts = GTK_TREE_STORE (gtk_builder_get_object
-                       (master_builder,
+                       (builder,
                         "GNUNET_GTK_file_sharing_publishing_tree_store"));
 
   meta = GNUNET_CONTAINER_meta_data_create ();
@@ -273,7 +274,7 @@ add_file_at_iter (const char *filename, const struct GNUNET_FS_BlockOptions *bo,
                       short_fn, 3, (guint) bo->anonymity_level, 4,
                       (guint) bo->content_priority, 5, fi, -1);
   GNUNET_free (file_size_fancy);
-  update_selectivity ();
+  update_selectivity (data);
 }
 
 
@@ -287,7 +288,7 @@ add_file_at_iter (const char *filename, const struct GNUNET_FS_BlockOptions *bo,
  * @param pos iterator to set to the location of the new element
  */
 static void
-create_dir_at_iter (const char *name, const struct GNUNET_FS_BlockOptions *bo,
+create_dir_at_iter (gpointer data, const char *name, const struct GNUNET_FS_BlockOptions *bo,
                     GtkTreeIter * iter, GtkTreeIter * pos)
 {
   struct GNUNET_FS_FileInformation *fi;
@@ -295,9 +296,12 @@ create_dir_at_iter (const char *name, const struct GNUNET_FS_BlockOptions *bo,
   GtkTreePath *path;
   struct GNUNET_CONTAINER_MetaData *meta;
   GtkTreeStore *ts;
+  GtkBuilder *builder;
+  
+  builder = GTK_BUILDER (data);
 
   ts = GTK_TREE_STORE (gtk_builder_get_object
-                       (master_builder,
+                       (builder,
                         "GNUNET_GTK_file_sharing_publishing_tree_store"));
   meta = GNUNET_CONTAINER_meta_data_create ();
   GNUNET_FS_meta_data_make_directory (meta);
@@ -315,7 +319,7 @@ create_dir_at_iter (const char *name, const struct GNUNET_FS_BlockOptions *bo,
   gtk_tree_store_set (ts, pos, 0, MARKER_DIR_FILE_SIZE, 1, (gboolean) GNUNET_NO,
                       2, name, 3, (guint) bo->anonymity_level, 4,
                       (guint) bo->content_priority, 5, fi, -1);
-  update_selectivity ();
+  update_selectivity (data);
 }
 
 
@@ -797,11 +801,14 @@ scan_directory (void *cls, const char *filename)
  * @param do_index should we index?
  */
 static void
-add_dir (const char *filename, const struct GNUNET_FS_BlockOptions *bo,
+add_dir (gpointer data, const char *filename, const struct GNUNET_FS_BlockOptions *bo,
          int do_index)
 {
   struct stat sbuf;
   struct AddDirContext scan_ctx;
+  GtkBuilder *builder;
+  
+  builder = GTK_BUILDER (data);
 
   if (0 != STAT (filename, &sbuf))
     return;
@@ -815,7 +822,7 @@ add_dir (const char *filename, const struct GNUNET_FS_BlockOptions *bo,
   scan_ctx.do_index = do_index;
   scan_ctx.ts =
       GTK_TREE_STORE (gtk_builder_get_object
-                      (master_builder,
+                      (builder,
                        "GNUNET_GTK_file_sharing_publishing_tree_store"));
   scan_directory (&scan_ctx, filename);
 }
@@ -827,7 +834,7 @@ add_dir (const char *filename, const struct GNUNET_FS_BlockOptions *bo,
 static void
 selection_changed_cb (GtkTreeSelection * ts, gpointer user_data)
 {
-  update_selectivity ();
+  update_selectivity (user_data);
 }
 
 
@@ -847,7 +854,7 @@ remove_old_entry (GtkTreeStore * ts, GtkTreeIter * root)
  * Move an entry in the tree.
  */
 static void
-move_entry (GtkTreeModel * tm, GtkTreeIter * old, GtkTreeIter * newpos,
+move_entry (gpointer data, GtkTreeModel * tm, GtkTreeIter * old, GtkTreeIter * newpos,
             int dsel)
 {
   struct GNUNET_FS_FileInformation *fip;
@@ -863,6 +870,9 @@ move_entry (GtkTreeModel * tm, GtkTreeIter * old, GtkTreeIter * newpos,
   GtkTreeIter cnewpos;
   GtkTreeRowReference *rr;
   GtkTreeRowReference *rr2;
+  GtkBuilder *builder;
+  
+  builder = GTK_BUILDER (data);
 
   gtk_tree_model_get (tm, old, 0, &fsf, 1, &do_index, 2, &short_fn, 3,
                       &anonymity_level, 4, &priority, 5, &fip, -1);
@@ -874,7 +884,7 @@ move_entry (GtkTreeModel * tm, GtkTreeIter * old, GtkTreeIter * newpos,
   if (dsel == GNUNET_YES)
   {
     tv = GTK_TREE_VIEW (gtk_builder_get_object
-                        (master_builder,
+                        (builder,
                          "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
     sel = gtk_tree_view_get_selection (tv);
     path = gtk_tree_model_get_path (tm, newpos);
@@ -894,7 +904,7 @@ move_entry (GtkTreeModel * tm, GtkTreeIter * old, GtkTreeIter * newpos,
       gtk_tree_path_free (path);
       gtk_tree_store_insert_before (GTK_TREE_STORE (tm), &cnewpos, newpos,
                                     NULL);
-      move_entry (tm, &child, &cnewpos, GNUNET_NO);
+      move_entry (data, tm, &child, &cnewpos, GNUNET_NO);
       path = gtk_tree_row_reference_get_path (rr2);
       gtk_tree_row_reference_free (rr2);
       GNUNET_assert (TRUE == gtk_tree_model_get_iter (tm, &child, path));
@@ -913,7 +923,7 @@ move_entry (GtkTreeModel * tm, GtkTreeIter * old, GtkTreeIter * newpos,
     gtk_tree_path_free (path);
     gtk_tree_selection_select_iter (sel, newpos);
   }
-  update_selectivity ();
+  update_selectivity (data);
 }
 
 /**
@@ -926,9 +936,12 @@ void GNUNET_GTK_master_publish_dialog_pseudonym_updates_renderer_edited_cb
 {
   GtkTreeIter iter;
   GtkTreeStore *ts;
+  GtkBuilder *builder;
+  
+  builder = GTK_BUILDER (user_data);
 
   ts = GTK_TREE_STORE (gtk_builder_get_object
-                       (master_builder, "GNUNET_GTK_pseudonym_tree_store"));
+                       (builder, "GNUNET_GTK_pseudonym_tree_store"));
 
   if (TRUE !=
       gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (ts), &iter, cpath))
@@ -937,7 +950,7 @@ void GNUNET_GTK_master_publish_dialog_pseudonym_updates_renderer_edited_cb
     return;
   }
   gtk_tree_store_set (ts, &iter, 5, new_text, -1);
-  update_selectivity ();
+  update_selectivity (user_data);
 }
 
 
@@ -951,9 +964,12 @@ void GNUNET_GTK_master_publish_dialog_pseudonym_identifier_renderer_edited_cb
 {
   GtkTreeIter iter;
   GtkTreeStore *ts;
+  GtkBuilder *builder;
+  
+  builder = GTK_BUILDER (user_data);
 
   ts = GTK_TREE_STORE (gtk_builder_get_object
-                       (master_builder, "GNUNET_GTK_pseudonym_tree_store"));
+                       (builder, "GNUNET_GTK_pseudonym_tree_store"));
 
   if (TRUE !=
       gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (ts), &iter, cpath))
@@ -962,7 +978,7 @@ void GNUNET_GTK_master_publish_dialog_pseudonym_identifier_renderer_edited_cb
     return;
   }
   gtk_tree_store_set (ts, &iter, 2, new_text, -1);
-  update_selectivity ();
+  update_selectivity (user_data);
 }
 
 
@@ -978,9 +994,12 @@ GNUNET_GTK_master_publish_dialog_right_button_clicked_cb (GtkWidget * dummy,
   GtkTreeIter pred;
   GtkTreeIter prev;
   GtkTreeIter pos;
+  GtkBuilder *builder;
+  
+  builder = GTK_BUILDER (data);
 
   tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (master_builder,
+                      (builder,
                        "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
   sel = gtk_tree_view_get_selection (tv);
   if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
@@ -1010,7 +1029,7 @@ GNUNET_GTK_master_publish_dialog_right_button_clicked_cb (GtkWidget * dummy,
     GNUNET_break (0);
     return;
   }
-  move_entry (tm, &iter, &pos, GNUNET_YES);
+  move_entry (data, tm, &iter, &pos, GNUNET_YES);
   remove_old_entry (GTK_TREE_STORE (tm), &iter);
 }
 
@@ -1025,9 +1044,12 @@ GNUNET_GTK_master_publish_dialog_left_button_clicked_cb (GtkWidget * dummy,
   GtkTreeIter iter;
   GtkTreeIter parent;
   GtkTreeIter pos;
+  GtkBuilder *builder;
+  
+  builder = GTK_BUILDER (data);
 
   tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (master_builder,
+                      (builder,
                        "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
   sel = gtk_tree_view_get_selection (tv);
   if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
@@ -1046,7 +1068,7 @@ GNUNET_GTK_master_publish_dialog_left_button_clicked_cb (GtkWidget * dummy,
     GNUNET_break (0);
     return;
   }
-  move_entry (tm, &iter, &pos, GNUNET_YES);
+  move_entry (data, tm, &iter, &pos, GNUNET_YES);
   remove_old_entry (GTK_TREE_STORE (tm), &iter);
 }
 
@@ -1064,9 +1086,12 @@ GNUNET_GTK_master_publish_dialog_up_button_clicked_cb (GtkWidget * dummy,
   GtkTreeIter prev;
   GtkTreeIter *pprev;
   GtkTreeIter pos;
+  GtkBuilder *builder;
+  
+  builder = GTK_BUILDER (data);
 
   tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (master_builder,
+                      (builder,
                        "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
   sel = gtk_tree_view_get_selection (tv);
   if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
@@ -1101,7 +1126,7 @@ GNUNET_GTK_master_publish_dialog_up_button_clicked_cb (GtkWidget * dummy,
     GNUNET_break (0);
     return;
   }
-  move_entry (tm, &iter, &pos, GNUNET_YES);
+  move_entry (data, tm, &iter, &pos, GNUNET_YES);
   remove_old_entry (GTK_TREE_STORE (tm), &iter);
 }
 
@@ -1116,9 +1141,12 @@ GNUNET_GTK_master_publish_dialog_down_button_clicked_cb (GtkWidget * dummy,
   GtkTreeIter iter;
   GtkTreeIter next;
   GtkTreeIter pos;
+  GtkBuilder *builder;
+  
+  builder = GTK_BUILDER (data);
 
   tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (master_builder,
+                      (builder,
                        "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
   sel = gtk_tree_view_get_selection (tv);
   if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
@@ -1138,7 +1166,7 @@ GNUNET_GTK_master_publish_dialog_down_button_clicked_cb (GtkWidget * dummy,
     GNUNET_break (0);
     return;
   }
-  move_entry (tm, &iter, &pos, GNUNET_YES);
+  move_entry (data, tm, &iter, &pos, GNUNET_YES);
   remove_old_entry (GTK_TREE_STORE (tm), &iter);
 }
 
@@ -1152,9 +1180,12 @@ GNUNET_GTK_master_publish_dialog_new_button_clicked_cb (GtkWidget * dummy,
   GtkTreeIter iter;
   GtkTreeIter pos;
   struct GNUNET_FS_BlockOptions bo;
+  GtkBuilder *builder;
+  
+  builder = GTK_BUILDER (data);
 
   tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (master_builder,
+                      (builder,
                        "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
   sel = gtk_tree_view_get_selection (tv);
   /* FIXME: consider opening a dialog to get
@@ -1169,10 +1200,10 @@ GNUNET_GTK_master_publish_dialog_new_button_clicked_cb (GtkWidget * dummy,
   bo.replication_level = 1;
   if (TRUE != gtk_tree_selection_get_selected (sel, NULL, &iter))
   {
-    create_dir_at_iter ("unnamed/", &bo, NULL, &pos);
+    create_dir_at_iter (data, "unnamed/", &bo, NULL, &pos);
     return;
   }
-  create_dir_at_iter ("unnamed/", &bo, &iter, &pos);
+  create_dir_at_iter (data, "unnamed/", &bo, &iter, &pos);
 }
 
 
@@ -1182,55 +1213,49 @@ GNUNET_GTK_master_publish_dialog_add_button_clicked_cb (GtkWidget * dummy,
 {
   GtkWidget *ad;
   GtkBuilder *builder;
-  char *filename;
-  struct GNUNET_FS_BlockOptions bo;
-  int do_index;
-  GtkSpinButton *sb;
+  GtkWindow *master_pubdialog;
+  
+  builder = GTK_BUILDER (data);
 
-  builder =
-      GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_publish_file_dialog.glade");
-  if (builder == NULL)
-  {
-    GNUNET_break (0);
-    return;
-  }
   ad = GTK_WIDGET (gtk_builder_get_object
                    (builder, "GNUNET_GTK_publish_file_dialog"));
   GNUNET_FS_GTK_setup_expiration_year_adjustment (builder);
-  if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad)))
-  {
-    gtk_widget_destroy (ad);
-    g_object_unref (G_OBJECT (builder));
-    return;
-  }
-  filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ad));
-  sb = GTK_SPIN_BUTTON (gtk_builder_get_object
-                        (builder,
-                         "GNUNET_GTK_publish_file_dialog_expiration_year_spin_button"));
-  bo.anonymity_level =
-      gtk_spin_button_get_value (GTK_SPIN_BUTTON
-                                 (gtk_builder_get_object
-                                  (builder,
-                                   "GNUNET_GTK_publish_file_dialog_anonymity_spin_button")));
-  bo.content_priority =
-      gtk_spin_button_get_value (GTK_SPIN_BUTTON
-                                 (gtk_builder_get_object
-                                  (builder,
-                                   "GNUNET_GTK_publish_file_dialog_priority_spin_button")));
-  bo.expiration_time = GNUNET_FS_GTK_get_expiration_time (sb);
-  bo.replication_level = 1;     /* FIXME... */
-  do_index =
-      gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
-                                    (gtk_builder_get_object
-                                     (builder,
-                                      "GNUNET_GTK_publish_file_dialog_do_index_checkbutton")));
-  add_file_at_iter (filename, &bo, do_index, NULL);
-  gtk_widget_destroy (ad);
-  g_object_unref (G_OBJECT (builder));
-  g_free (filename);
-  update_selectivity ();
+
+  master_pubdialog = GTK_WINDOW (gtk_builder_get_object (builder,
+      "GNUNET_GTK_master_publish_dialog"));
+  gtk_window_set_transient_for (GTK_WINDOW (ad), master_pubdialog);
+
+  gtk_window_present (GTK_WINDOW (ad));
 }
 
+struct edit_pub_cb_args
+{
+  GtkTreeModel *tm;
+  GtkTreeIter iter;
+  /* FIXME: this indirection madness is not really required any longer.
+   * we only need to pass over *tm and iter, everything else can be
+   * copied.
+   */
+  gchar *short_fn;
+  struct GNUNET_FS_FileInformation *fip;
+  int do_index;
+  guint anonymity_level;
+  guint priority;
+};
+
+void
+master_publish_edit_publish_dialog_cb (gpointer cls, int *do_index, char **short_fn,
+    guint * anonymity_level, guint * priority, gchar *root,
+    struct GNUNET_FS_FileInformation *fip, gint ret)
+{
+  struct edit_pub_cb_args *cbargs = (struct edit_pub_cb_args *) cls;
+  if (ret == GTK_RESPONSE_OK)
+    gtk_tree_store_set (GTK_TREE_STORE (cbargs->tm), &cbargs->iter,
+        1, *do_index, 2, *short_fn, 3, *anonymity_level, 4, *priority, -1);
+  g_free (root);
+  g_free (short_fn);
+  g_free (cbargs);
+}
 
 void
 GNUNET_GTK_master_publish_dialog_edit_button_clicked_cb (GtkWidget * dummy,
@@ -1239,29 +1264,36 @@ GNUNET_GTK_master_publish_dialog_edit_button_clicked_cb (GtkWidget * dummy,
   GtkTreeView *tv;
   GtkTreeModel *tm;
   GtkTreeSelection *sel;
-  GtkTreeIter iter;
-  int do_index;
-  guint anonymity_level;
-  guint priority;
-  gchar *short_fn;
-  struct GNUNET_FS_FileInformation *fip;
+  struct edit_pub_cb_args *cbargs;
+  GtkBuilder *builder;
+  GtkWindow *master_pubdialog;
+
+  builder = GTK_BUILDER (data);
 
   tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (master_builder,
+                      (builder,
                        "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
+
+  cbargs = g_new0 (struct edit_pub_cb_args, 1);
+  cbargs->tm = gtk_tree_view_get_model (tv);
+
+  master_pubdialog = GTK_WINDOW (gtk_builder_get_object (builder,
+      "GNUNET_GTK_master_publish_dialog"));
   sel = gtk_tree_view_get_selection (tv);
-  if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
+  if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &cbargs->iter))
   {
     GNUNET_break (0);
+    g_free (cbargs);
     return;
   }
-  gtk_tree_model_get (tm, &iter, 1, &do_index, 2, &short_fn, 3,
-                      &anonymity_level, 4, &priority, 5, &fip, -1);
-  GNUNET_FS_GTK_edit_publish_dialog (&do_index, &short_fn, &anonymity_level,
-                                     &priority, fip);
-  gtk_tree_store_set (GTK_TREE_STORE (tm), &iter, 1, do_index, 2, short_fn, 3,
-                      anonymity_level, 4, priority, -1);
-  g_free (short_fn);
+
+  gtk_tree_model_get (tm, &cbargs->iter, 1, &cbargs->do_index, 2,
+      &cbargs->short_fn, 3, &cbargs->anonymity_level, 4, &cbargs->priority,
+      5, &cbargs->fip, -1);
+
+  GNUNET_FS_GTK_edit_publish_dialog (builder, master_pubdialog, &cbargs->do_index,
+      &cbargs->short_fn, &cbargs->anonymity_level, &cbargs->priority,
+      cbargs->fip, TRUE, &master_publish_edit_publish_dialog_cb, cbargs);
 }
 
 
@@ -1298,9 +1330,12 @@ GNUNET_GTK_master_publish_dialog_delete_button_clicked_cb (GtkWidget * dummy,
   GtkTreeSelection *sel;
   GtkTreeIter iter;
   struct GNUNET_FS_FileInformation *fip;
+  GtkBuilder *builder;
+  
+  builder = GTK_BUILDER (data);
 
   tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (master_builder,
+                      (builder,
                        "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
   sel = gtk_tree_view_get_selection (tv);
   if (TRUE != gtk_tree_selection_get_selected (sel, &tm, &iter))
@@ -1311,65 +1346,69 @@ GNUNET_GTK_master_publish_dialog_delete_button_clicked_cb (GtkWidget * dummy,
   gtk_tree_model_get (tm, &iter, 5, &fip, -1);
   GNUNET_FS_file_information_destroy (fip, &free_fi_row_reference, NULL);
   gtk_tree_store_remove (GTK_TREE_STORE (tm), &iter);
-  update_selectivity ();
+  update_selectivity (data);
 }
 
-
 void
-GNUNET_GTK_master_publish_dialog_open_button_clicked_cb (GtkWidget * dummy,
-                                                         gpointer data)
+GNUNET_GTK_publish_directory_dialog_response_cb (GtkDialog *dialog,
+    gint response_id, gpointer user_data)
 {
-  GtkWidget *ad;
-  GtkBuilder *builder;
   char *filename;
   int do_index;
   GtkSpinButton *sb;
   struct GNUNET_FS_BlockOptions bo;
+  GtkWidget *ad;
+  GtkBuilder *builder;
+
+  builder = GTK_BUILDER (user_data);
 
-  builder =
-      GNUNET_GTK_get_new_builder
-      ("gnunet_fs_gtk_publish_directory_dialog.glade");
-  if (builder == NULL)
+  ad = GTK_WIDGET (gtk_builder_get_object (builder,
+      "GNUNET_GTK_publish_directory_dialog"));
+
+  if (response_id == -5)
   {
-    GNUNET_break (0);
-    return;
+    filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ad));
+    sb = GTK_SPIN_BUTTON (gtk_builder_get_object (builder,
+        "GNUNET_GTK_publish_directory_dialog_expiration_year_spin_button"));
+    if (!GNUNET_GTK_get_selected_anonymity_level (builder,
+        "GNUNET_GTK_publish_directory_dialog_anonymity_combobox",
+        &bo.anonymity_level))
+      bo.anonymity_level = 1;
+    bo.content_priority = gtk_spin_button_get_value (GTK_SPIN_BUTTON (
+        gtk_builder_get_object (builder,
+        "GNUNET_GTK_publish_directory_dialog_priority_spin_button")));
+    bo.expiration_time = GNUNET_FS_GTK_get_expiration_time (sb);
+    do_index = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (
+        gtk_builder_get_object (builder,
+        "GNUNET_GTK_publish_directory_dialog_do_index_checkbutton")));
+
+    /* FIXME: open progress dialog here... */
+    add_dir (user_data, filename, &bo, do_index);
+    g_free (filename);
+    update_selectivity (user_data);
   }
+  gtk_widget_hide (ad);
+}
+
+
+void
+GNUNET_GTK_master_publish_dialog_open_button_clicked_cb (GtkWidget * dummy,
+                                                         gpointer data)
+{
+  GtkWidget *ad;
+  GtkBuilder *builder;
+  GtkWindow *master_pubdialog;
+  
+  builder = GTK_BUILDER (data);
   GNUNET_FS_GTK_setup_expiration_year_adjustment (builder);
   ad = GTK_WIDGET (gtk_builder_get_object
                    (builder, "GNUNET_GTK_publish_directory_dialog"));
-  if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad)))
-  {
-    gtk_widget_destroy (ad);
-    g_object_unref (G_OBJECT (builder));
-    return;
-  }
-  filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ad));
-  sb = GTK_SPIN_BUTTON (gtk_builder_get_object
-                        (builder,
-                         "GNUNET_GTK_publish_directory_dialog_expiration_year_spin_button"));
-  bo.anonymity_level =
-      gtk_spin_button_get_value (GTK_SPIN_BUTTON
-                                 (gtk_builder_get_object
-                                  (builder,
-                                   "GNUNET_GTK_publish_directory_dialog_anonymity_spin_button")));
-  bo.content_priority =
-      gtk_spin_button_get_value (GTK_SPIN_BUTTON
-                                 (gtk_builder_get_object
-                                  (builder,
-                                   "GNUNET_GTK_publish_directory_dialog_priority_spin_button")));
-  bo.expiration_time = GNUNET_FS_GTK_get_expiration_time (sb);
-  do_index =
-      gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
-                                    (gtk_builder_get_object
-                                     (builder,
-                                      "GNUNET_GTK_publish_directory_dialog_do_index_checkbutton")));
-
-  gtk_widget_destroy (ad);
-  g_object_unref (G_OBJECT (builder));
-  /* FIXME: open progress dialog here... */
-  add_dir (filename, &bo, do_index);
-  g_free (filename);
-  update_selectivity ();
+
+  master_pubdialog = GTK_WINDOW (gtk_builder_get_object (builder,
+      "GNUNET_GTK_master_publish_dialog"));
+  gtk_window_set_transient_for (GTK_WINDOW (ad), master_pubdialog);
+
+  gtk_window_present (GTK_WINDOW (ad));
 }
 
 
@@ -1598,52 +1637,58 @@ free_file_information_tree_store (GtkTreeModel * tm, GtkTreeIter * iter)
   }
 }
 
-
-/**
- */
 void
-GNUNET_GTK_main_menu_file_publish_activate_cb (GtkWidget * dummy, gpointer data)
+GNUNET_GTK_master_publish_dialog_realize_cb (GtkWidget *widget,
+    gpointer user_data)
 {
-  GtkWidget *ad;
-  GtkTreeStore *ts;
-  gint ret;
   GtkTreeView *tv;
   GtkTreeSelection *sel;
-  GtkTreeIter iter;
-  struct GNUNET_FS_FileInformation *fi;
-  GtkTreeModel *tm;
-  GtkTreeModel *ptm;
-  struct GNUNET_FS_Namespace *namespace;
-  gchar *namespace_id;
-  gchar *namespace_uid;
+  GtkBuilder *builder;
+  
+  builder = GTK_BUILDER (user_data);
 
-  GNUNET_assert (master_builder == NULL);
-  master_builder =
-      GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_publish_dialog.glade");
-  if (master_builder == NULL)
-    return;
   tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (master_builder,
+                      (builder,
                        "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
   sel = gtk_tree_view_get_selection (tv);
   g_signal_connect (G_OBJECT (sel), "changed",
-                    G_CALLBACK (selection_changed_cb), NULL);
-  ad = GTK_WIDGET (gtk_builder_get_object
-                   (master_builder, "GNUNET_GTK_master_publish_dialog"));
-  ts = GTK_TREE_STORE (gtk_builder_get_object
-                       (master_builder, "GNUNET_GTK_pseudonym_tree_store"));
-  GNUNET_FS_namespace_list (GNUNET_FS_GTK_get_fs_handle (),
-                            &add_namespace_to_ts, ts);
-  tm = GTK_TREE_MODEL (gtk_builder_get_object
-                       (master_builder,
-                        "GNUNET_GTK_file_sharing_publishing_tree_store"));
+                    G_CALLBACK (selection_changed_cb), user_data);
   tv = GTK_TREE_VIEW (gtk_builder_get_object
-                      (master_builder,
+                      (builder,
                        "GNUNET_GTK_master_publish_dialog_pseudonym_tree_view"));
   sel = gtk_tree_view_get_selection (tv);
   g_signal_connect (G_OBJECT (sel), "changed",
-                    G_CALLBACK (selection_changed_cb), NULL);
-  ret = gtk_dialog_run (GTK_DIALOG (ad));
+                    G_CALLBACK (selection_changed_cb), user_data);
+}
+
+void
+hide_master_publish_dialog (gpointer user_data, gint ret)
+{
+  GtkTreeView *tv, *ptv;
+  GtkTreeSelection *sel;
+  GtkTreeModel *tm, *ptm;
+  GtkTreeIter iter;
+  gpointer namespace;
+  gchar *namespace_id;
+  gchar *namespace_uid;
+  struct GNUNET_FS_FileInformation *fi;
+  GtkWidget *ad;
+  GtkBuilder *builder = GTK_BUILDER (user_data);
+
+  ad = GTK_WIDGET (gtk_builder_get_object
+                   (builder, "GNUNET_GTK_master_publish_dialog"));
+
+  ptv = GTK_TREE_VIEW (gtk_builder_get_object
+                      (builder,
+                       "GNUNET_GTK_master_publish_dialog_pseudonym_tree_view"));
+  sel = gtk_tree_view_get_selection (ptv);
+  ptm = gtk_tree_view_get_model (ptv);
+
+  tv = GTK_TREE_VIEW (gtk_builder_get_object
+                      (builder,
+                       "GNUNET_GTK_master_publish_dialog_file_information_tree_view"));
+  tm = gtk_tree_view_get_model (tv);
+  
   if (ret == GTK_RESPONSE_OK)
   {
     if (TRUE == gtk_tree_selection_get_selected (sel, &ptm, &iter))
@@ -1666,14 +1711,10 @@ GNUNET_GTK_main_menu_file_publish_activate_cb (GtkWidget * dummy, gpointer data)
                                  GNUNET_FS_PUBLISH_OPTION_NONE);
       }
       while (gtk_tree_model_iter_next (tm, &iter));
-    if (namespace_id != NULL)
-      g_free (namespace_id);
-    if (namespace_uid != NULL)
-      g_free (namespace_uid);
+    g_free (namespace_id);
+    g_free (namespace_uid);
   }
-  ptm =
-      GTK_TREE_MODEL (gtk_builder_get_object
-                      (master_builder, "GNUNET_GTK_pseudonym_tree_store"));
+
   /* free state from 'ptm' */
   if (TRUE == gtk_tree_model_get_iter_first (ptm, &iter))
     do
@@ -1681,6 +1722,7 @@ GNUNET_GTK_main_menu_file_publish_activate_cb (GtkWidget * dummy, gpointer data)
       free_pseudonym_tree_store (ptm, &iter);
     }
     while (TRUE == gtk_tree_model_iter_next (ptm, &iter));
+  gtk_tree_store_clear (GTK_TREE_STORE (ptm));
 
   /* free state from 'tm' */
   if (TRUE == gtk_tree_model_get_iter_first (tm, &iter))
@@ -1689,10 +1731,100 @@ GNUNET_GTK_main_menu_file_publish_activate_cb (GtkWidget * dummy, gpointer data)
       free_file_information_tree_store (tm, &iter);
     }
     while (TRUE == gtk_tree_model_iter_next (tm, &iter));
+  gtk_tree_store_clear (GTK_TREE_STORE (tm));
+
+  gtk_widget_hide (ad);
+}
+
+void
+GNUNET_GTK_master_publish_dialog_execute_button_clicked_cb (GtkButton *button,
+    gpointer user_data)
+{
+  hide_master_publish_dialog (user_data, GTK_RESPONSE_OK);
+}
+
+void
+GNUNET_GTK_master_publish_dialog_cancel_button_clicked_cb (GtkButton *button,
+    gpointer user_data)
+{
+  hide_master_publish_dialog (user_data, GTK_RESPONSE_CANCEL);
+}
+
+gboolean
+GNUNET_GTK_master_publish_dialog_delete_event_cb (GtkWidget *widget,
+    GdkEvent *event, gpointer user_data)
+{
+  hide_master_publish_dialog (user_data, GTK_RESPONSE_CANCEL);
+  return TRUE;
+}
+
+void
+GNUNET_GTK_publish_file_dialog_response_cb (GtkDialog *dialog,
+    gint response_id, gpointer user_data)
+{
+  char *filename;
+  struct GNUNET_FS_BlockOptions bo;
+  int do_index;
+  GtkSpinButton *sb;
+  GtkWidget *ad;
+
+  GtkBuilder *builder = GTK_BUILDER (user_data);
+
+  ad = GTK_WIDGET (gtk_builder_get_object (builder,
+      "GNUNET_GTK_publish_file_dialog"));
+
+  if (response_id == -5)
+  {
+    /* OK */
+    filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ad));
+    sb = GTK_SPIN_BUTTON (gtk_builder_get_object (builder,
+        "GNUNET_GTK_publish_file_dialog_expiration_year_spin_button"));
+
+    if (!GNUNET_GTK_get_selected_anonymity_level (builder,
+        "GNUNET_GTK_publish_file_dialog_anonymity_combobox", &bo.anonymity_level))
+      bo.anonymity_level = 1;
+    bo.content_priority = gtk_spin_button_get_value (GTK_SPIN_BUTTON (
+        gtk_builder_get_object (builder,
+        "GNUNET_GTK_publish_file_dialog_priority_spin_button")));
+    bo.expiration_time = GNUNET_FS_GTK_get_expiration_time (sb);
+    bo.replication_level = 1;     /* FIXME... */
+    do_index = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (
+        gtk_builder_get_object (builder,
+        "GNUNET_GTK_publish_file_dialog_do_index_checkbutton")));
+    add_file_at_iter (user_data, filename, &bo, do_index, NULL);
+    g_free (filename);
+    update_selectivity (user_data);
+  }
+  else
+  {
+    /* Cancel/Escape/close/etc */
+  }
+  gtk_widget_hide (ad);
+}
+
+/**
+ */
+void
+GNUNET_GTK_main_menu_file_publish_activate_cb (GtkWidget * dummy, gpointer data)
+{
+  GtkWidget *ad;
+  GtkTreeStore *ts;
+  GtkBuilder *builder;
+  
+  builder = GTK_BUILDER (data);
+
+  ad = GTK_WIDGET (gtk_builder_get_object
+                   (builder, "GNUNET_GTK_master_publish_dialog"));
+
+  if (!gtk_widget_get_visible (ad))
+  {
+    ts = GTK_TREE_STORE (gtk_builder_get_object (builder,
+        "GNUNET_GTK_pseudonym_tree_store"));
+    GNUNET_FS_namespace_list (GNUNET_FS_GTK_get_fs_handle (),
+        &add_namespace_to_ts, ts);
+  }
 
-  gtk_widget_destroy (ad);
-  g_object_unref (G_OBJECT (master_builder));
-  master_builder = NULL;
+  gtk_window_present (GTK_WINDOW (ad));
 }
 
 
diff --git a/src/fs/gnunet-fs-gtk-main_window_open_directory.c b/src/fs/gnunet-fs-gtk-main_window_open_directory.c
index ae3b7d0..23e71fc 100644
--- a/src/fs/gnunet-fs-gtk-main_window_open_directory.c
+++ b/src/fs/gnunet-fs-gtk-main_window_open_directory.c
@@ -85,6 +85,34 @@ add_child (void *cls, const char *filename, const struct GNUNET_FS_Uri *uri,
                                                meta, NULL, 0));
 }
 
+void
+GNUNET_GTK_open_directory_dialog_response_cb (GtkDialog *dialog,
+    gint response_id, gpointer user_data)
+{
+  GtkBuilder *builder;
+  GtkWidget *ad;
+  char *filename;
+  struct AddChildContext acc;
+
+  builder = GTK_BUILDER (user_data);
+  ad = GTK_WIDGET (gtk_builder_get_object
+                   (builder, "GNUNET_GTK_open_directory_dialog"));
+
+  if (response_id != -5)
+  {
+    gtk_widget_destroy (ad);
+    g_object_unref (G_OBJECT (builder));
+    return;
+  }
+
+  filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ad));
+  gtk_widget_destroy (ad);
+  g_object_unref (G_OBJECT (builder));
+  acc.filename = filename;
+  acc.ts = NULL;
+  GNUNET_FS_GTK_mmap_and_scan (filename, &add_child, &acc);
+  g_free (filename);
+}
 
 /**
  * User selected "Open directory" in menu.  Display dialog, open
@@ -94,12 +122,12 @@ void
 GNUNET_GTK_main_menu_file_open_gnunet_directory_activate_cb (GtkWidget * dummy,
                                                              gpointer data)
 {
-  struct AddChildContext acc;
   GtkWidget *ad;
   GtkBuilder *builder;
-  char *filename;
+  GtkWidget *toplevel;
   GtkFileFilter *ff;
 
+
   builder =
       GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_open_directory_dialog.glade");
   if (builder == NULL)
@@ -113,19 +141,11 @@ GNUNET_GTK_main_menu_file_open_gnunet_directory_activate_cb (GtkWidget * dummy,
                         (builder, "gnunet_directory_filter"));
   /* FIXME: some day, write a custom file filter for gnunet-directories... */
   gtk_file_filter_add_pattern (ff, "*" GNUNET_FS_DIRECTORY_EXT);
-  if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad)))
-  {
-    gtk_widget_destroy (ad);
-    g_object_unref (G_OBJECT (builder));
-    return;
-  }
-  filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ad));
-  gtk_widget_destroy (ad);
-  g_object_unref (G_OBJECT (builder));
-  acc.filename = filename;
-  acc.ts = NULL;
-  GNUNET_FS_GTK_mmap_and_scan (filename, &add_child, &acc);
-  g_free (filename);
+
+  toplevel = gtk_widget_get_toplevel (dummy);
+  if (GTK_IS_WINDOW (toplevel))
+    gtk_window_set_transient_for (GTK_WINDOW (ad), GTK_WINDOW (toplevel));
+  gtk_window_present (GTK_WINDOW (ad));
 }
 
 /* end of gnunet-fs-gtk-main_window_open_directory.c */
diff --git a/src/fs/gnunet-fs-gtk.c b/src/fs/gnunet-fs-gtk.c
index 2e0f299..3c48512 100644
--- a/src/fs/gnunet-fs-gtk.c
+++ b/src/fs/gnunet-fs-gtk.c
@@ -247,7 +247,7 @@ GNUNET_GTK_get_selected_anonymity_level (GtkBuilder *builder, gchar *combo_name,
   GtkTreeModel *model;
   guint level;
 
-  combo = GTK_COMBO_BOX(gtk_builder_get_object (builder, combo_name));
+  combo = GTK_COMBO_BOX (gtk_builder_get_object (builder, combo_name));
   if (!combo)
     return FALSE;
 
@@ -265,6 +265,38 @@ GNUNET_GTK_get_selected_anonymity_level (GtkBuilder *builder, gchar *combo_name,
 }
 
 gboolean
+GNUNET_GTK_select_anonymity_level (GtkBuilder *builder, gchar *combo_name, guint sel_level)
+{
+  GtkComboBox *combo;
+  GtkTreeIter iter;
+  GtkTreeModel *model;
+  guint level;
+  gboolean go_on;
+
+  combo = GTK_COMBO_BOX (gtk_builder_get_object (builder, combo_name));
+  if (!combo)
+    return FALSE;
+
+  model = gtk_combo_box_get_model (combo);
+  if (!model)
+    return FALSE;
+
+  for (go_on = gtk_tree_model_get_iter_first (model, &iter);
+      go_on;
+      go_on = gtk_tree_model_iter_next (model, &iter))
+  {
+    gboolean is_it = FALSE;
+    gtk_tree_model_get (model, &iter, 1, &level, -1);
+    if (level == sel_level)
+    {
+      gtk_combo_box_set_active_iter (combo, &iter);
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+gboolean
 get_selected_namespace_treepath_iter_model_widget (GtkBuilder *builder,
     GtkTreePath **p_treepath, GtkTreeIter *p_iter, GtkTreeModel **p_model,
     GtkWidget **p_widget)
diff --git a/src/fs/gnunet-fs-gtk.h b/src/fs/gnunet-fs-gtk.h
index 4cd76de..114be04 100644
--- a/src/fs/gnunet-fs-gtk.h
+++ b/src/fs/gnunet-fs-gtk.h
@@ -76,5 +76,18 @@ GNUNET_GTK_get_selected_anonymity_level (GtkBuilder *builder,
     gchar *combo_name, guint *p_level);
 
 
+/**
+ * Set the selected anonymity level.
+ * For dialogue initialization.
+ *
+ * @param builder builder object for the window
+ * @param combo_name name of the combobox widget to get anonymity from
+ * @param sel_level the level value to select
+ * @return TRUE on success, FALSE on error (no item with such level)
+ */
+gboolean
+GNUNET_GTK_select_anonymity_level (GtkBuilder *builder,
+    gchar *combo_name, guint sel_level);
+
 #endif
 /* end of gnunet-fs-gtk.h */
-- 
1.7.4

LRN

2011-12-23 07:01

developer   ~0005164

0001-Finally-got-rid-of-gtk_dialog_run-.-Completely.patch is here!

I have to admit that it could have been MUCH smoother if i knew from the start how to handle GtkDialogs without gtk_dialog_run(). Still, some dialogs required changes (IMHO) anyway, so it wasn't too much a waste of time.

For edit_publication window UI discussion (if any) i suggest a separate issue. This one is fixed.

Christian Grothoff

2011-12-23 09:41

manager   ~0005165

Applied 0001-Finally-got-rid... patch in SVN 18757.

Christian Grothoff

2011-12-23 10:48

manager   ~0005166

Not quite done yet:

$ ../gnunet/bin/grepsrc.sh gtk_dialog_run
./src/fs/gnunet-fs-gtk-main_window_file_search.c:202: gtk_dialog_run (GTK_DIALOG (ad));

LRN

2011-12-23 10:50

developer   ~0005167

No, it's an old piece of code, not really used anymore. I kept it for ... sentimental reasons.

Christian Grothoff

2011-12-23 17:57

manager   ~0005183

Could you please make a patch to remove all sentimental code? Pretty please...

Christian Grothoff

2011-12-26 13:05

manager   ~0005207

Sentimental code removed in 18825, resolving bug.

Issue History

Date Modified Username Field Change
2011-08-15 18:27 Christian Grothoff New Issue
2011-09-15 14:17 Christian Grothoff Category gnunet-gtk => gnunet-fs-gtk
2011-09-16 10:14 Christian Grothoff Priority normal => low
2011-09-16 10:14 Christian Grothoff Severity major => minor
2011-09-16 10:14 Christian Grothoff Status new => confirmed
2011-11-26 18:23 Christian Grothoff Relationship added child of 0001966
2011-12-07 15:08 LRN File Added: 0001-Starting-to-get-rid-of-gtk_dialog_run-and-more.patch
2011-12-07 15:11 LRN Note Added: 0005018
2011-12-07 15:47 Christian Grothoff Note Added: 0005019
2011-12-07 16:02 LRN Note Added: 0005020
2011-12-07 19:58 LRN Note Added: 0005021
2011-12-08 17:15 Christian Grothoff Note Added: 0005025
2011-12-11 03:12 LRN File Added: 0004-New-search-bar-in-the-main-window.patch
2011-12-11 03:16 LRN Note Added: 0005029
2011-12-12 00:07 LRN File Added: 0001-A-lump-of-GUI-changes-and-tweaks.patch
2011-12-12 00:08 LRN File Added: 0002-Get-text-from-the-combobox-entry.patch
2011-12-12 00:09 LRN Note Added: 0005041
2011-12-12 00:28 LRN File Added: 0003-Do-not-use-the-new-search-tab-keep-the-code-for-now.patch
2011-12-12 00:28 LRN File Added: 0004-Fix-search-tab-label.patch
2011-12-12 00:29 LRN Note Added: 0005042
2011-12-12 00:30 LRN Note Edited: 0005029
2011-12-12 14:23 Christian Grothoff Note Added: 0005047
2011-12-12 14:28 Christian Grothoff Note Added: 0005048
2011-12-12 14:29 Christian Grothoff Note Added: 0005049
2011-12-12 14:34 LRN Note Added: 0005050
2011-12-12 15:08 LRN File Added: gtk-2.24.8-custom-combo-01.png
2011-12-12 15:08 LRN File Added: gtk-2.24.8-custom-combo-02.png
2011-12-12 15:10 LRN File Added: custom_combo.glade
2011-12-12 15:10 LRN Note Added: 0005051
2011-12-12 15:15 LRN Note Added: 0005052
2011-12-12 15:15 LRN Note Added: 0005053
2011-12-12 15:41 LRN File Added: 0001-Make-tabs-smaller.patch
2011-12-12 15:41 LRN File Added: 0002-Remove-has-entry-hide-columns-del-signals.patch
2011-12-12 15:41 LRN File Added: 0003-Revert-Get-text-from-the-combobox-entry.patch
2011-12-12 15:42 LRN Note Added: 0005054
2011-12-12 16:33 Christian Grothoff Note Added: 0005059
2011-12-12 16:36 Christian Grothoff Note Added: 0005060
2011-12-12 20:55 LRN File Added: 0001-Multiple-GUI-changes.patch
2011-12-12 20:55 LRN File Added: 0002-Change-required-GTK-to-2.20.patch
2011-12-12 20:56 LRN Note Added: 0005061
2011-12-13 19:22 LRN File Added: 0001-Change-required-GTK-to-2.20.patch
2011-12-13 19:22 LRN File Deleted: 0001-Change-required-GTK-to-2.20.patch
2011-12-13 19:22 LRN File Added: 0002-Various-changes.patch
2011-12-13 19:22 LRN File Added: 0003-Disable-propes-and-persistence-they-are-broken.patch
2011-12-13 19:24 LRN Note Added: 0005092
2011-12-13 19:24 LRN Summary gtk_dialog_run is bad as it stops the GNUnet scheduler loop as well => [patch] gtk_dialog_run is bad as it stops the GNUnet scheduler loop as well
2011-12-16 10:43 LRN File Added: 0001-Make-metadata-list-items-selectable.patch
2011-12-16 10:44 LRN File Added: 0002-Make-metadata-copyable.patch
2011-12-16 10:44 LRN File Added: 0003-Be-more-careful-with-strings.patch
2011-12-16 10:46 LRN Note Added: 0005105
2011-12-16 10:57 LRN File Added: 0001-Don-t-re-attach-the-menu.patch
2011-12-16 20:08 Christian Grothoff Note Added: 0005111
2011-12-16 20:08 Christian Grothoff Summary [patch] gtk_dialog_run is bad as it stops the GNUnet scheduler loop as well => gtk_dialog_run is bad as it stops the GNUnet scheduler loop as well
2011-12-18 03:57 LRN File Added: 0001-Remove-old-commented-out-code.patch
2011-12-18 03:57 LRN File Added: 0002-Make-download-by-uri-dialogue-less.patch
2011-12-18 03:58 LRN Summary gtk_dialog_run is bad as it stops the GNUnet scheduler loop as well => [patch] gtk_dialog_run is bad as it stops the GNUnet scheduler loop as well
2011-12-18 04:00 LRN Note Added: 0005124
2011-12-18 12:18 Christian Grothoff Summary [patch] gtk_dialog_run is bad as it stops the GNUnet scheduler loop as well => gtk_dialog_run is bad as it stops the GNUnet scheduler loop as well
2011-12-19 13:54 Christian Grothoff Assigned To => LRN
2011-12-19 14:22 Christian Grothoff Product Version => 0.9.0
2011-12-19 14:22 Christian Grothoff Target Version => 0.9.1
2011-12-23 06:59 LRN File Added: 0001-Finally-got-rid-of-gtk_dialog_run-.-Completely.patch
2011-12-23 07:00 LRN Summary gtk_dialog_run is bad as it stops the GNUnet scheduler loop as well => [patch] gtk_dialog_run is bad as it stops the GNUnet scheduler loop as well
2011-12-23 07:01 LRN Note Added: 0005164
2011-12-23 09:41 Christian Grothoff Note Added: 0005165
2011-12-23 10:48 Christian Grothoff Note Added: 0005166
2011-12-23 10:48 Christian Grothoff Summary [patch] gtk_dialog_run is bad as it stops the GNUnet scheduler loop as well => gtk_dialog_run is bad as it stops the GNUnet scheduler loop as well
2011-12-23 10:50 LRN Note Added: 0005167
2011-12-23 17:57 Christian Grothoff Note Added: 0005183
2011-12-26 13:05 Christian Grothoff Note Added: 0005207
2011-12-26 13:05 Christian Grothoff Status confirmed => resolved
2011-12-26 13:05 Christian Grothoff Fixed in Version => 0.9.1
2011-12-26 13:05 Christian Grothoff Resolution open => fixed
2011-12-26 22:28 Christian Grothoff Status resolved => closed