gnucash master: Multiple changes pushed

John Ralls jralls at code.gnucash.org
Fri Aug 25 19:39:33 EDT 2017


Updated	 via  https://github.com/Gnucash/gnucash/commit/2ee5b202 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/35752e59 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/0f2719ce (commit)
	from  https://github.com/Gnucash/gnucash/commit/7ee15a3d (commit)



commit 2ee5b202bfe48e87d1c56ea3e7b8d1008e61b086
Author: John Ralls <jralls at ceridwen.us>
Date:   Fri Aug 25 15:09:20 2017 -0700

    Temporarily include building libgwengui-gtk3 in GnuCash.
    
    Revert this commit when it's widely available in distributed packages.

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2800c10..4ec44d6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -290,7 +290,6 @@ IF (WITH_AQBANKING)
   GNC_PKG_CHECK_MODULES (GWENHYWFAR REQUIRED gwenhywfar)
   GNC_PKG_CHECK_MODULES (AQBANKING REQUIRED aqbanking)
   IF(WITH_GNUCASH)
-    GNC_PKG_CHECK_MODULES (GWENGUI_GTK3 REQUIRED gwengui-gtk3)
     GNC_PKG_CHECK_MODULES (KTOBLZCHECK ktoblzcheck)
     IF(KTOBLZCHECK_FOUND)
       SET(HAVE_KTOBLZCHECK_H 1)
diff --git a/borrowed/CMakeLists.txt b/borrowed/CMakeLists.txt
index e3a702b..57ba90e 100644
--- a/borrowed/CMakeLists.txt
+++ b/borrowed/CMakeLists.txt
@@ -1,5 +1,6 @@
 ADD_SUBDIRECTORY(libc)
 ADD_SUBDIRECTORY(goffice)
+ADD_SUBDIRECTORY(gwengui-gtk3)
 
 SET_LOCAL_DIST(borrowed_DIST_local CMakeLists.txt Makefile.am README)
 SET(borrowed_DIST ${borrowed_DIST_local} ${libc_DIST} ${goffice_DIST} PARENT_SCOPE)
diff --git a/borrowed/Makefile.am b/borrowed/Makefile.am
index a18f998..16baedb 100644
--- a/borrowed/Makefile.am
+++ b/borrowed/Makefile.am
@@ -1,5 +1,5 @@
 if GNUCASH_ENABLE_GUI
-SUBDIRS = libc goffice
+SUBDIRS = libc goffice gwengui-gtk3
 else
 SUBDIRS = libc
 endif
diff --git a/borrowed/gwengui-gtk3/CMakeLists.txt b/borrowed/gwengui-gtk3/CMakeLists.txt
new file mode 100644
index 0000000..89ab74f
--- /dev/null
+++ b/borrowed/gwengui-gtk3/CMakeLists.txt
@@ -0,0 +1,56 @@
+SET (gwengui_gtk3_noinst_HEADERS
+  gtk3_gui_p.h
+  gtk3_gui_dialog_l.h
+  gtk3_gui_dialog_p.h
+  )
+
+SET (gwengui_gtk3_SOURCES
+  gtk3_gui_dialog.c
+  gtk3_gui.c
+  )
+
+SET (gwengui_gtk3_EXTRA_DIST
+  w_combobox.c
+  w_label.c
+  w_dialog.c
+  w_gridlayout.c
+  w_groupbox.c
+  w_hlayout.c
+  w_hline.c
+  w_hspacer.c
+  w_lineedit.c
+  w_vlayout.c
+  w_vline.c
+  w_vspacer.c
+  w_pushbutton.c
+  w_textbrowser.c
+  w_textedit.c
+  w_stack.c
+  w_tabbook.c
+  w_progressbar.c
+  w_listbox.c
+  w_checkbox.c
+  w_scrollarea.c
+  w_radiobutton.c
+  w_spinbox.c
+  )
+
+SET_DIST_LIST(gwengui_gtk3_DIST CMakeLists.txt Makefile.am
+  ${gwengui_gtk3_SOURCES}
+  ${gwengui_gtk3_noinst_HEADERS}
+  ${gwengui_gtk3_EXTRA_DIST}
+  )
+
+ADD_LIBRARY(gwengui-gtk3 ${gwengui_gtk3_SOURCES})
+
+TARGET_COMPILE_DEFINITIONS(gwengui-gtk3 PRIVATE BUILDING_GTK3_GUI=True)
+TARGET_INCLUDE_DIRECTORIES(gwengui-gtk3 PUBLIC
+  ${GTK3_INCLUDE_DIRS}
+  ${GWENHYWFAR_INCLUDE_DIRS}
+  )
+TARGET_LINK_LIBRARIES(gwengui-gtk3 ${GWENHYWFAR_LDFLAGS} ${GTK3_LDFLAGS})
+
+INSTALL(TARGETS gwengui-gtk3
+  LIBRARY DESTINATION lib
+  ARCHIVE DESTINATION lib
+  )
diff --git a/borrowed/gwengui-gtk3/Makefile.am b/borrowed/gwengui-gtk3/Makefile.am
new file mode 100644
index 0000000..5b6d1a7
--- /dev/null
+++ b/borrowed/gwengui-gtk3/Makefile.am
@@ -0,0 +1,43 @@
+AM_CPPFLAGS=$(GWEN_CFLAGS) $(GTK_CFLAGS)
+
+DEFS+=-DBUILDING_GTK3_GUI -DPACKAGE=\"$(PACKAGE)\"
+
+lib_LTLIBRARIES=libgwengui-gtk3.la
+
+libgwengui_gtk3_la_LIBADD=$(GTK_LIBS) $(GWEN_LIBS)
+libgwengui_gtk3_la_LDFLAGS = -no-undefined
+
+noinst_HEADERS=\
+  gtk3_gui_p.h \
+  gtk3_gui_dialog_l.h \
+  gtk3_gui_dialog_p.h
+
+libgwengui_gtk3_la_SOURCES=\
+  gtk3_gui_dialog.c \
+  gtk3_gui.c
+
+
+EXTRA_DIST=\
+  w_combobox.c \
+  w_label.c \
+  w_dialog.c \
+  w_gridlayout.c \
+  w_groupbox.c \
+  w_hlayout.c \
+  w_hline.c \
+  w_hspacer.c \
+  w_lineedit.c \
+  w_vlayout.c \
+  w_vline.c \
+  w_vspacer.c \
+  w_pushbutton.c \
+  w_textbrowser.c \
+  w_textedit.c \
+  w_stack.c \
+  w_tabbook.c \
+  w_progressbar.c \
+  w_listbox.c \
+  w_checkbox.c \
+  w_scrollarea.c \
+  w_radiobutton.c \
+  w_spinbox.c
diff --git a/borrowed/gwengui-gtk3/gtk3_gui.c b/borrowed/gwengui-gtk3/gtk3_gui.c
new file mode 100644
index 0000000..7814db2
--- /dev/null
+++ b/borrowed/gwengui-gtk3/gtk3_gui.c
@@ -0,0 +1,293 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+#include "gtk3_gui_p.h"
+#include "gtk3_gui_dialog_l.h"
+
+#include <assert.h>
+
+#include <gwenhywfar/inherit.h>
+#include <gwenhywfar/debug.h>
+#include <gwenhywfar/gui_be.h>
+#include <gwenhywfar/i18n.h>
+
+#include <gwenhywfar/text.h>
+#include <gwenhywfar/mdigest.h>
+#include <gwenhywfar/debug.h>
+
+#define PACKAGE "gnucash"
+#define I18N(msg) GWEN_I18N_Translate(PACKAGE, msg)
+
+
+
+GWEN_INHERIT(GWEN_GUI, GTK3_GUI)
+
+
+
+GWEN_GUI *Gtk3_Gui_new() {
+  GWEN_GUI *gui;
+  GTK3_GUI *xgui;
+
+  gui=GWEN_Gui_new();
+  GWEN_NEW_OBJECT(GTK3_GUI, xgui);
+  GWEN_INHERIT_SETDATA(GWEN_GUI, GTK3_GUI, gui, xgui, Gtk3_Gui_FreeData);
+
+  GWEN_Gui_AddFlags(gui, GWEN_GUI_FLAGS_DIALOGSUPPORTED);
+  GWEN_Gui_UseDialogs(gui);
+  xgui->execDialogFn=GWEN_Gui_SetExecDialogFn(gui, GTK3_Gui_ExecDialog);
+  xgui->openDialogFn=GWEN_Gui_SetOpenDialogFn(gui, GTK3_Gui_OpenDialog);
+  xgui->closeDialogFn=GWEN_Gui_SetCloseDialogFn(gui, GTK3_Gui_CloseDialog);
+  xgui->runDialogFn=GWEN_Gui_SetRunDialogFn(gui, GTK3_Gui_RunDialog);
+  xgui->getFileNameDialogFn=GWEN_Gui_SetGetFileNameFn(gui, GTK3_Gui_GetFileName);
+
+  return gui;
+}
+
+
+
+GWENHYWFAR_CB void Gtk3_Gui_FreeData(void *bp, void *p) {
+  GTK3_GUI *xgui;
+
+  xgui=(GTK3_GUI*) p;
+
+  GWEN_FREE_OBJECT(xgui);
+}
+
+
+
+GWENHYWFAR_CB int GTK3_Gui_ExecDialog(GWEN_GUI *gui,
+                                      GWEN_DIALOG *dlg,
+                                      uint32_t guiid) {
+  int rv;
+
+  assert(dlg);
+  rv=GTK3_Gui_OpenDialog(gui, dlg, guiid);
+  if (rv<0) {
+    DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
+    return rv;
+  }
+
+  rv=GTK3_Gui_RunDialog(gui, dlg, 1);
+  GTK3_Gui_CloseDialog(gui, dlg);
+  if (rv<0) {
+    DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
+    return rv;
+  }
+
+  return rv;
+}
+
+
+
+GWENHYWFAR_CB int GTK3_Gui_OpenDialog(GWEN_GUI *gui,
+                                      GWEN_DIALOG *dlg,
+                                      uint32_t guiid) {
+  int rv;
+  GtkWidget *g;
+
+  assert(dlg);
+  Gtk3Gui_Dialog_Extend(dlg);
+  rv=Gtk3Gui_Dialog_Setup(dlg, NULL);
+  if (rv<0) {
+    DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
+    Gtk3Gui_Dialog_Unextend(dlg);
+    return rv;
+  }
+
+  g=Gtk3Gui_Dialog_GetMainWidget(dlg);
+  if (g==NULL) {
+    DBG_ERROR(GWEN_LOGDOMAIN, "No main widget");
+    Gtk3Gui_Dialog_Unextend(dlg);
+    return GWEN_ERROR_INVALID;
+  }
+
+  rv=GWEN_Dialog_EmitSignalToAll(dlg, GWEN_DialogEvent_TypeInit, "");
+  if (rv<0) {
+    DBG_INFO(GWEN_LOGDOMAIN, "Error initializing dialog: %d", rv);
+    Gtk3Gui_Dialog_Unextend(dlg);
+    return rv;
+  }
+
+  /* show dialog */
+  gtk_widget_show_all(g);
+
+  return 0;
+}
+
+
+
+GWENHYWFAR_CB int GTK3_Gui_CloseDialog(GWEN_GUI *gui, GWEN_DIALOG *dlg) {
+  GtkWidget *g;
+  int rv;
+
+  assert(dlg);
+  g=Gtk3Gui_Dialog_GetMainWidget(dlg);
+  if (g==NULL) {
+    DBG_ERROR(GWEN_LOGDOMAIN, "No main widget");
+    Gtk3Gui_Dialog_Unextend(dlg);
+    return GWEN_ERROR_INVALID;
+  }
+
+  /* hide dialog */
+  gtk_widget_hide(g);
+
+  /* send fini signal to dialog */
+  rv=GWEN_Dialog_EmitSignalToAll(dlg, GWEN_DialogEvent_TypeFini, "");
+  if (rv<0) {
+    DBG_INFO(GWEN_LOGDOMAIN, "Error deinitializing dialog: %d", rv);
+    Gtk3Gui_Dialog_Unextend(dlg);
+    return rv;
+  }
+
+  Gtk3Gui_Dialog_Unextend(dlg);
+  return 0;
+}
+
+
+
+GWENHYWFAR_CB int GTK3_Gui_RunDialog(GWEN_GUI *gui, GWEN_DIALOG *dlg, int untilEnd) {
+  int rv;
+
+  assert(dlg);
+  rv=GTK3_Gui_Dialog_Run(dlg, untilEnd);
+  if (rv<0) {
+    DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
+    return rv;
+  }
+  return rv;
+}
+
+
+
+GWENHYWFAR_CB int GTK3_Gui_GetFileName(GWEN_GUI *gui,
+                                       const char *caption,
+                                       GWEN_GUI_FILENAME_TYPE fnt,
+                                       uint32_t flags,
+                                       const char *patterns,
+                                       GWEN_BUFFER *pathBuffer,
+                                       uint32_t guiid) {
+  char *folder=NULL;
+  char *fileName=NULL;
+
+  if (GWEN_Buffer_GetUsedBytes(pathBuffer)) {
+    folder=strdup(GWEN_Buffer_GetStart(pathBuffer));
+    fileName=strchr(folder, GWEN_DIR_SEPARATOR);
+    if (fileName) {
+      *fileName=0;
+      fileName++;
+      if (*fileName==0)
+        fileName=NULL;
+    }
+  }
+
+  switch(fnt) {
+  case GWEN_Gui_FileNameType_OpenFileName: {
+    GtkWidget *dialog;
+
+    if (!(caption && *caption))
+      caption=I18N("Open File");
+    dialog=gtk_file_chooser_dialog_new (caption,
+                                        NULL,
+                                        GTK_FILE_CHOOSER_ACTION_OPEN,
+                                        "_Cancel", GTK_RESPONSE_CANCEL,
+                                        "_Open", GTK_RESPONSE_ACCEPT,
+                                        NULL);
+    if (folder && *folder)
+      gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (dialog), folder);
+    if (fileName && *fileName)
+      gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), fileName);
+
+    if (gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT) {
+      char *filename;
+
+      filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+      GWEN_Buffer_Reset(pathBuffer);
+      GWEN_Buffer_AppendString(pathBuffer, filename);
+      g_free (filename);
+      gtk_widget_destroy (dialog);
+      free(folder);
+      return 0;
+    }
+    gtk_widget_destroy (dialog);
+    free(folder);
+    return GWEN_ERROR_USER_ABORTED;
+  }
+
+  case GWEN_Gui_FileNameType_SaveFileName: {
+    GtkWidget *dialog;
+
+    if (!(caption && *caption))
+      caption=I18N("Save File");
+    dialog=gtk_file_chooser_dialog_new (caption,
+                                        NULL,
+                                        GTK_FILE_CHOOSER_ACTION_SAVE,
+                                        "_Cancel", GTK_RESPONSE_CANCEL,
+                                        "_Open", GTK_RESPONSE_ACCEPT,
+                                        NULL);
+    gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE);
+    if (folder && *folder)
+      gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (dialog), folder);
+    if (fileName && *fileName)
+      gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), fileName);
+
+    if (gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT) {
+      char *filename;
+
+      filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+      GWEN_Buffer_Reset(pathBuffer);
+      GWEN_Buffer_AppendString(pathBuffer, filename);
+      g_free(filename);
+      gtk_widget_destroy(dialog);
+      free(folder);
+      return 0;
+    }
+    gtk_widget_destroy (dialog);
+    free(folder);
+    return GWEN_ERROR_USER_ABORTED;
+  }
+
+  case GWEN_Gui_FileNameType_OpenDirectory: {
+    GtkWidget *dialog;
+
+    if (!(caption && *caption))
+      caption=I18N("Select Folder");
+    dialog=gtk_file_chooser_dialog_new (caption,
+                                        NULL,
+                                        GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
+                                        "_Cancel", GTK_RESPONSE_CANCEL,
+                                        "_Open", GTK_RESPONSE_ACCEPT,
+                                        NULL);
+    if (gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT) {
+      char *filename;
+
+      filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+      GWEN_Buffer_Reset(pathBuffer);
+      GWEN_Buffer_AppendString(pathBuffer, filename);
+      g_free (filename);
+      gtk_widget_destroy (dialog);
+      free(folder);
+      return 0;
+    }
+    gtk_widget_destroy (dialog);
+    free(folder);
+    return GWEN_ERROR_USER_ABORTED;
+  }
+
+  default:
+    break;
+  }
+  free(folder);
+
+  return GWEN_ERROR_USER_ABORTED;
+}
+
+
+
+
+
diff --git a/borrowed/gwengui-gtk3/gtk3_gui.h b/borrowed/gwengui-gtk3/gtk3_gui.h
new file mode 100644
index 0000000..ab9a719
--- /dev/null
+++ b/borrowed/gwengui-gtk3/gtk3_gui.h
@@ -0,0 +1,37 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+#ifndef GTK3_GUI_H
+#define GTK3_GUI_H
+
+
+#include <gtk/gtk.h>
+
+
+#if defined __GNUC__ && (! defined (__sun)) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3))
+# ifdef BUILDING_GTK3_GUI
+#   define GTK3GUI_API __attribute__ ((visibility("default")))
+# else
+#   define GTK3GUI_API
+# endif
+#else
+# define GTK3GUI_API
+#endif
+
+#include <gwenhywfar/gui.h>
+
+
+
+GTK3GUI_API GWEN_GUI *Gtk3_Gui_new(void);
+
+
+
+#endif
+
+
diff --git a/borrowed/gwengui-gtk3/gtk3_gui_dialog.c b/borrowed/gwengui-gtk3/gtk3_gui_dialog.c
new file mode 100644
index 0000000..d047b5f
--- /dev/null
+++ b/borrowed/gwengui-gtk3/gtk3_gui_dialog.c
@@ -0,0 +1,551 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+#include "gtk3_gui_dialog_p.h"
+#include <assert.h>
+
+#include <gwenhywfar/inherit.h>
+#include <gwenhywfar/debug.h>
+#include <gwenhywfar/gui_be.h>
+#include <gwenhywfar/i18n.h>
+
+#include <gwenhywfar/text.h>
+#include <gwenhywfar/mdigest.h>
+#include <gwenhywfar/debug.h>
+#include <gwenhywfar/directory.h>
+
+#include <ctype.h>
+
+
+#define I18N(msg) GWEN_I18N_Translate(PACKAGE, msg)
+
+
+#define GTK3_DIALOG_WIDGET_REAL    0
+#define GTK3_DIALOG_WIDGET_CONTENT 1
+#define GTK3_DIALOG_WIDGET_DATA    2
+
+#define GTK3_DIALOG_STRING_TITLE  0
+#define GTK3_DIALOG_STRING_VALUE  1
+
+
+#include "w_combobox.c"
+#include "w_label.c"
+#include "w_dialog.c"
+#include "w_gridlayout.c"
+#include "w_hlayout.c"
+#include "w_hline.c"
+#include "w_hspacer.c"
+#include "w_vlayout.c"
+#include "w_vline.c"
+#include "w_vspacer.c"
+#include "w_pushbutton.c"
+#include "w_lineedit.c"
+#include "w_textedit.c"
+#include "w_textbrowser.c"
+#include "w_stack.c"
+#include "w_tabbook.c"
+#include "w_groupbox.c"
+#include "w_progressbar.c"
+#include "w_listbox.c"
+#include "w_checkbox.c"
+#include "w_scrollarea.c"
+#include "w_radiobutton.c"
+#include "w_spinbox.c"
+
+
+
+GWEN_INHERIT(GWEN_DIALOG, GTK3_GUI_DIALOG)
+
+
+
+
+void Gtk3Gui_Dialog_Extend(GWEN_DIALOG *dlg) {
+  GTK3_GUI_DIALOG *xdlg;
+
+  GWEN_NEW_OBJECT(GTK3_GUI_DIALOG, xdlg);
+  GWEN_INHERIT_SETDATA(GWEN_DIALOG, GTK3_GUI_DIALOG, dlg, xdlg, Gtk3Gui_Dialog_FreeData);
+
+  /* set virtual functions */
+  xdlg->setIntPropertyFn=GWEN_Dialog_SetSetIntPropertyFn(dlg, Gtk3Gui_Dialog_SetIntProperty);
+  xdlg->getIntPropertyFn=GWEN_Dialog_SetGetIntPropertyFn(dlg, Gtk3Gui_Dialog_GetIntProperty);
+  xdlg->setCharPropertyFn=GWEN_Dialog_SetSetCharPropertyFn(dlg, Gtk3Gui_Dialog_SetCharProperty);
+  xdlg->getCharPropertyFn=GWEN_Dialog_SetGetCharPropertyFn(dlg, Gtk3Gui_Dialog_GetCharProperty);
+
+}
+
+
+
+void Gtk3Gui_Dialog_Unextend(GWEN_DIALOG *dlg) {
+  GTK3_GUI_DIALOG *xdlg;
+
+  assert(dlg);
+  xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, GTK3_GUI_DIALOG, dlg);
+  assert(xdlg);
+
+  /* reset virtual functions */
+  GWEN_Dialog_SetSetIntPropertyFn(dlg, xdlg->setIntPropertyFn);
+  GWEN_Dialog_SetGetIntPropertyFn(dlg, xdlg->getIntPropertyFn);
+  GWEN_Dialog_SetSetCharPropertyFn(dlg, xdlg->setCharPropertyFn);
+  GWEN_Dialog_SetGetCharPropertyFn(dlg, xdlg->getCharPropertyFn);
+
+  GWEN_INHERIT_UNLINK(GWEN_DIALOG, GTK3_GUI_DIALOG, dlg);
+}
+
+
+
+void GWENHYWFAR_CB Gtk3Gui_Dialog_FreeData(void *bp, void *p) {
+  GTK3_GUI_DIALOG *xdlg;
+
+  xdlg=(GTK3_GUI_DIALOG*) p;
+
+  if (xdlg->mainWidget)
+    gtk_widget_destroy(xdlg->mainWidget);
+
+  GWEN_FREE_OBJECT(xdlg);
+}
+
+
+
+GtkWidget *Gtk3Gui_Dialog_GetMainWidget(const GWEN_DIALOG *dlg) {
+  GTK3_GUI_DIALOG *xdlg;
+
+  assert(dlg);
+  xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, GTK3_GUI_DIALOG, dlg);
+  assert(xdlg);
+
+  return xdlg->mainWidget;
+}
+
+
+
+GWENHYWFAR_CB int Gtk3Gui_Dialog_SetIntProperty(GWEN_DIALOG *dlg,
+    GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    int value,
+    int doSignal) {
+  return GWEN_Widget_SetIntProperty(w, prop, index, value, doSignal);
+}
+
+
+
+GWENHYWFAR_CB int Gtk3Gui_Dialog_GetIntProperty(GWEN_DIALOG *dlg,
+    GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    int defaultValue) {
+  return GWEN_Widget_GetIntProperty(w, prop, index, defaultValue);
+}
+
+
+
+GWENHYWFAR_CB int Gtk3Gui_Dialog_SetCharProperty(GWEN_DIALOG *dlg,
+    GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *value,
+    int doSignal) {
+  return GWEN_Widget_SetCharProperty(w, prop, index, value, doSignal);
+}
+
+
+
+GWENHYWFAR_CB const char *Gtk3Gui_Dialog_GetCharProperty(GWEN_DIALOG *dlg,
+    GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *defaultValue) {
+  return GWEN_Widget_GetCharProperty(w, prop, index, defaultValue);
+}
+
+
+
+int Gtk3Gui_Dialog_Setup(GWEN_DIALOG *dlg, GtkWidget *parentWindow) {
+  GTK3_GUI_DIALOG *xdlg;
+  GWEN_WIDGET_TREE *wtree;
+  GWEN_WIDGET *w;
+  GtkWindow *gw;
+  int rv;
+  GList *tll;
+
+  assert(dlg);
+  xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, GTK3_GUI_DIALOG, dlg);
+  assert(xdlg);
+
+  wtree=GWEN_Dialog_GetWidgets(dlg);
+  if (wtree==NULL) {
+    DBG_ERROR(GWEN_LOGDOMAIN, "No widget tree in dialog");
+    return GWEN_ERROR_NOT_FOUND;
+  }
+  w=GWEN_Widget_Tree_GetFirst(wtree);
+  if (w==NULL) {
+    DBG_ERROR(GWEN_LOGDOMAIN, "No widgets in dialog");
+    return GWEN_ERROR_NOT_FOUND;
+  }
+
+  rv=Gtk3Gui_Dialog_SetupTree(w);
+  if (rv<0) {
+    DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
+    return rv;
+  }
+
+  gw=GTK_WINDOW(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  gtk_window_set_type_hint(GTK_WINDOW(gw), GDK_WINDOW_TYPE_HINT_DIALOG);
+  gtk_window_set_position (GTK_WINDOW (gw), GTK_WIN_POS_CENTER_ON_PARENT);
+  /*gtk_window_set_keep_above(GTK_WINDOW(gw), TRUE);*/
+  xdlg->mainWidget=GTK_WIDGET(gw);
+
+  tll=gtk_window_list_toplevels();
+  if (tll) {
+    GList* element;
+    GtkWindow *topLevel=NULL;
+
+    for (element = tll; element; element = g_list_next(element)) {
+      GtkWindow* win = GTK_WINDOW(element->data);
+      if (gtk_window_is_active(win)) {
+        topLevel=win;
+        break;
+      }
+    }
+    g_list_free(tll);
+
+    if (topLevel) {
+      DBG_NOTICE(GWEN_LOGDOMAIN, "Found active window [%s]",
+                 gtk_window_get_title(topLevel));
+      gtk_window_set_transient_for(gw, topLevel);
+    }
+    else {
+      DBG_ERROR(GWEN_LOGDOMAIN, "No active window found...");
+    }
+  }
+
+  return 0;
+}
+
+
+
+void Gtk3Gui_Dialog_Leave(GWEN_DIALOG *dlg, int result) {
+  GTK3_GUI_DIALOG *xdlg;
+  GWEN_DIALOG *parent;
+
+  /* get toplevel dialog, the one which actually is the GUI dialog */
+  while( (parent=GWEN_Dialog_GetParentDialog(dlg)) )
+    dlg=parent;
+
+  assert(dlg);
+  xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, GTK3_GUI_DIALOG, dlg);
+  assert(xdlg);
+
+  xdlg->response=result;
+  if (g_main_loop_is_running(xdlg->loop))
+    g_main_loop_quit(xdlg->loop);
+}
+
+
+
+static void
+run_unmap_handler (GtkWindow *window, gpointer data) {
+  GWEN_DIALOG *dlg;
+  GTK3_GUI_DIALOG *xdlg;
+
+  dlg=data;
+  assert(dlg);
+  xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, GTK3_GUI_DIALOG, dlg);
+  assert(xdlg);
+
+  Gtk3Gui_Dialog_Leave(dlg, 0);
+}
+
+
+
+static gint
+run_delete_handler(GtkWindow *window,
+                   GdkEventAny *event,
+                   gpointer data) {
+  GWEN_DIALOG *dlg;
+  GTK3_GUI_DIALOG *xdlg;
+
+  dlg=data;
+  assert(dlg);
+  xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, GTK3_GUI_DIALOG, dlg);
+  assert(xdlg);
+
+  Gtk3Gui_Dialog_Leave(dlg, 0);
+  return TRUE; /* Do not destroy */
+}
+
+
+
+static void
+run_destroy_handler(GtkWindow *window, gpointer data) {
+  GWEN_DIALOG *dlg;
+  GTK3_GUI_DIALOG *xdlg;
+
+  dlg=data;
+  assert(dlg);
+  xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, GTK3_GUI_DIALOG, dlg);
+  assert(xdlg);
+
+  xdlg->destroyed=1;
+}
+
+
+
+int GTK3_Gui_Dialog_Run(GWEN_DIALOG *dlg, int untilEnd) {
+  GTK3_GUI_DIALOG *xdlg;
+  GtkWidget *g;
+
+  assert(dlg);
+  xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, GTK3_GUI_DIALOG, dlg);
+  assert(xdlg);
+
+  g=Gtk3Gui_Dialog_GetMainWidget(dlg);
+  if (g==NULL) {
+    DBG_ERROR(GWEN_LOGDOMAIN, "No main widget");
+    Gtk3Gui_Dialog_Unextend(dlg);
+    return GWEN_ERROR_INVALID;
+  }
+
+  xdlg->unmap_handler =
+    g_signal_connect(g,
+                     "unmap",
+                     G_CALLBACK (run_unmap_handler),
+                     dlg);
+
+  xdlg->delete_handler =
+    g_signal_connect(g,
+                     "delete-event",
+                     G_CALLBACK (run_delete_handler),
+                     dlg);
+
+  xdlg->destroy_handler =
+    g_signal_connect(g,
+                     "destroy",
+                     G_CALLBACK (run_destroy_handler),
+                     dlg);
+
+  xdlg->loop=g_main_loop_new(NULL, FALSE);
+  if (untilEnd)
+    g_main_loop_run(xdlg->loop);
+  else {
+    GMainContext *ctx;
+
+    ctx=g_main_loop_get_context(xdlg->loop);
+    while(g_main_context_pending(ctx))
+      g_main_context_iteration(ctx, FALSE);
+  }
+  g_main_loop_unref(xdlg->loop);
+
+  if (!xdlg->destroyed) {
+    g_signal_handler_disconnect(g, xdlg->unmap_handler);
+    g_signal_handler_disconnect(g, xdlg->delete_handler);
+    g_signal_handler_disconnect(g, xdlg->destroy_handler);
+  }
+
+  return xdlg->response;
+}
+
+
+
+int Gtk3Gui_Dialog_SetupTree(GWEN_WIDGET *w) {
+  int rv;
+
+  switch(GWEN_Widget_GetType(w)) {
+  case GWEN_Widget_TypeDialog:
+    rv=Gtk3Gui_WDialog_Setup(w);
+    break;
+  case GWEN_Widget_TypeLabel:
+    rv=Gtk3Gui_WLabel_Setup(w);
+    break;
+  case GWEN_Widget_TypeGridLayout:
+    rv=Gtk3Gui_WGridLayout_Setup(w);
+    break;
+  case GWEN_Widget_TypeVLayout:
+    rv=Gtk3Gui_WVLayout_Setup(w);
+    break;
+  case GWEN_Widget_TypeHLayout:
+    rv=Gtk3Gui_WHLayout_Setup(w);
+    break;
+  case GWEN_Widget_TypePushButton:
+    rv=Gtk3Gui_WPushButton_Setup(w);
+    break;
+  case GWEN_Widget_TypeLineEdit:
+    rv=Gtk3Gui_WLineEdit_Setup(w);
+    break;
+  case GWEN_Widget_TypeHLine:
+    rv=Gtk3Gui_WHLine_Setup(w);
+    break;
+  case GWEN_Widget_TypeVLine:
+    rv=Gtk3Gui_WVLine_Setup(w);
+    break;
+  case GWEN_Widget_TypeVSpacer:
+    rv=Gtk3Gui_WVSpacer_Setup(w);
+    break;
+  case GWEN_Widget_TypeHSpacer:
+    rv=Gtk3Gui_WHSpacer_Setup(w);
+    break;
+  case GWEN_Widget_TypeComboBox:
+    rv=Gtk3Gui_WComboBox_Setup(w);
+    break;
+  case GWEN_Widget_TypeTextEdit:
+    rv=Gtk3Gui_WTextEdit_Setup(w);
+    break;
+  case GWEN_Widget_TypeWidgetStack:
+    rv=Gtk3Gui_WStack_Setup(w);
+    break;
+  case GWEN_Widget_TypeTabBook:
+    rv=Gtk3Gui_WTabBook_Setup(w);
+    break;
+  case GWEN_Widget_TypeTabPage:
+    /* just re-use vbox */
+    GWEN_Widget_AddFlags(w, GWEN_WIDGET_FLAGS_FILLX | GWEN_WIDGET_FLAGS_FILLY);
+    rv=Gtk3Gui_WVLayout_Setup(w);
+    break;
+  case GWEN_Widget_TypeGroupBox:
+    rv=Gtk3Gui_WGroupBox_Setup(w);
+    break;
+  case GWEN_Widget_TypeTextBrowser:
+    rv=Gtk3Gui_WTextBrowser_Setup(w);
+    break;
+  case GWEN_Widget_TypeProgressBar:
+    rv=Gtk3Gui_WProgressBar_Setup(w);
+    break;
+  case GWEN_Widget_TypeSpinBox:
+    rv=Gtk3Gui_WSpinBox_Setup(w);
+    break;
+  case GWEN_Widget_TypeListBox:
+    rv=Gtk3Gui_WListBox_Setup(w);
+    break;
+  case GWEN_Widget_TypeCheckBox:
+    rv=Gtk3Gui_WCheckBox_Setup(w);
+    break;
+  case GWEN_Widget_TypeScrollArea:
+    rv=Gtk3Gui_WScrollArea_Setup(w);
+    break;
+  case GWEN_Widget_TypeRadioButton:
+    rv=Gtk3Gui_WRadioButton_Setup(w);
+    break;
+  default:
+    DBG_ERROR(GWEN_LOGDOMAIN, "Unhandled widget type %d", GWEN_Widget_GetType(w));
+    rv=GWEN_ERROR_INVALID;
+    break;
+  }
+
+  if (rv<0) {
+    DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
+    return rv;
+  }
+  else {
+    GWEN_WIDGET *wChild;
+
+    /* handle children */
+    wChild=GWEN_Widget_Tree_GetFirstChild(w);
+    while(wChild) {
+      /* recursion */
+      rv=Gtk3Gui_Dialog_SetupTree(wChild);
+      if (rv<0) {
+        DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
+        return rv;
+      }
+      wChild=GWEN_Widget_Tree_GetNext(wChild);
+    }
+  }
+
+  return 0;
+}
+
+
+
+
+int Gtk3Gui_GetRawText(const char *text, GWEN_BUFFER *tbuf) {
+  const char *p=0;
+  const char *p2=0;
+
+  if (text==NULL)
+    return 0;
+
+  /* find begin of HTML area */
+  p=text;
+  while ((p=strchr(p, '<'))) {
+    const char *t;
+
+    t=p;
+    t++;
+    if (toupper(*t)=='H') {
+      t++;
+      if (toupper(*t)=='T') {
+        t++;
+        if (toupper(*t)=='M') {
+          t++;
+          if (toupper(*t)=='L') {
+            t++;
+            if (toupper(*t)=='>') {
+              break;
+            }
+          }
+        }
+      }
+    }
+    p++;
+  } /* while */
+
+  /* find end of HTML area */
+  if (p) {
+    p2=p;
+    p2+=6; /* skip "<html>" */
+    while ((p2=strchr(p2, '<'))) {
+      const char *t;
+
+      t=p2;
+      t++;
+      if (toupper(*t)=='/') {
+        t++;
+        if (toupper(*t)=='H') {
+          t++;
+          if (toupper(*t)=='T') {
+            t++;
+            if (toupper(*t)=='M') {
+              t++;
+              if (toupper(*t)=='L') {
+                t++;
+                if (toupper(*t)=='>') {
+                  break;
+                }
+              }
+            }
+          }
+        }
+      }
+      p2++;
+    } /* while */
+  }
+
+  if (p && p2) {
+    int startPos;
+    int endPos;
+
+    p2+=7; /* skip "</html>" */
+
+    startPos=(p-text);
+    endPos=(p2-text);
+
+    /* append stuff before startPos */
+    if (startPos)
+      GWEN_Buffer_AppendBytes(tbuf, text, startPos);
+    if (*p2)
+      GWEN_Buffer_AppendString(tbuf, p2);
+    return 0;
+  }
+  else {
+    GWEN_Buffer_AppendString(tbuf, text);
+    return 0;
+  }
+}
+
+
diff --git a/borrowed/gwengui-gtk3/gtk3_gui_dialog_l.h b/borrowed/gwengui-gtk3/gtk3_gui_dialog_l.h
new file mode 100644
index 0000000..f54b72e
--- /dev/null
+++ b/borrowed/gwengui-gtk3/gtk3_gui_dialog_l.h
@@ -0,0 +1,51 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+#ifndef GTK3_GUI_DIALOG_L_H
+#define GTK3_GUI_DIALOG_L_H
+
+
+#include "gtk3_gui.h"
+
+
+#include <gtk/gtk.h>
+
+#include <gwenhywfar/dialog_be.h>
+
+
+#define GTK3_GUI_DIALOG_DEFAULT_BOX_SPACING 3
+
+
+typedef struct {
+  GWEN_DIALOG *dialog;
+  GtkWindow *window;
+  int response;
+  GMainLoop *loop;
+  int destroyed;
+} RunInfo;
+
+
+
+void Gtk3Gui_Dialog_Extend(GWEN_DIALOG *dlg);
+void Gtk3Gui_Dialog_Unextend(GWEN_DIALOG *dlg);
+
+int Gtk3Gui_Dialog_Setup(GWEN_DIALOG *dlg, GtkWidget *parentWindow);
+
+
+GtkWidget *Gtk3Gui_Dialog_GetMainWidget(const GWEN_DIALOG *dlg);
+
+
+int GTK3_Gui_Dialog_Run(GWEN_DIALOG *dlg, int timeout);
+void Gtk3Gui_Dialog_Leave(GWEN_DIALOG *dlg, int result);
+
+int Gtk3Gui_GetRawText(const char *text, GWEN_BUFFER *tbuf);
+
+#endif
+
+
diff --git a/borrowed/gwengui-gtk3/gtk3_gui_dialog_p.h b/borrowed/gwengui-gtk3/gtk3_gui_dialog_p.h
new file mode 100644
index 0000000..371e84d
--- /dev/null
+++ b/borrowed/gwengui-gtk3/gtk3_gui_dialog_p.h
@@ -0,0 +1,72 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+#ifndef GTK3_GUI_DIALOG_P_H
+#define GTK3_GUI_DIALOG_P_H
+
+
+#include "gtk3_gui_dialog_l.h"
+
+
+typedef struct GTK3_GUI_DIALOG GTK3_GUI_DIALOG;
+struct GTK3_GUI_DIALOG {
+  GWEN_DIALOG_SETINTPROPERTY_FN setIntPropertyFn;
+  GWEN_DIALOG_GETINTPROPERTY_FN getIntPropertyFn;
+  GWEN_DIALOG_SETCHARPROPERTY_FN setCharPropertyFn;
+  GWEN_DIALOG_GETCHARPROPERTY_FN getCharPropertyFn;
+
+  GtkWidget *mainWidget;
+
+  int response;
+  GMainLoop *loop;
+  int destroyed;
+
+  gulong unmap_handler;
+  gulong destroy_handler;
+  gulong delete_handler;
+
+};
+
+static void GWENHYWFAR_CB Gtk3Gui_Dialog_FreeData(void *bp, void *p);
+
+
+static int GWENHYWFAR_CB Gtk3Gui_Dialog_SetIntProperty(GWEN_DIALOG *dlg,
+    GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    int value,
+    int doSignal);
+
+
+static int GWENHYWFAR_CB Gtk3Gui_Dialog_GetIntProperty(GWEN_DIALOG *dlg,
+    GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    int defaultValue);
+
+static int GWENHYWFAR_CB Gtk3Gui_Dialog_SetCharProperty(GWEN_DIALOG *dlg,
+    GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *value,
+    int doSignal);
+
+static const char * GWENHYWFAR_CB Gtk3Gui_Dialog_GetCharProperty(GWEN_DIALOG *dlg,
+    GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *defaultValue);
+
+
+static int Gtk3Gui_Dialog_SetupTree(GWEN_WIDGET *w);
+
+
+#endif
+
+
diff --git a/borrowed/gwengui-gtk3/gtk3_gui_p.h b/borrowed/gwengui-gtk3/gtk3_gui_p.h
new file mode 100644
index 0000000..60e70d5
--- /dev/null
+++ b/borrowed/gwengui-gtk3/gtk3_gui_p.h
@@ -0,0 +1,64 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+#ifndef GTK3_GUI_P_H
+#define GTK3_GUI_P_H
+
+
+#include "gtk3_gui.h"
+
+#include <gwenhywfar/gui_be.h>
+
+
+
+typedef struct GTK3_GUI GTK3_GUI;
+struct GTK3_GUI {
+
+  GWEN_GUI_EXEC_DIALOG_FN execDialogFn;
+
+  GWEN_GUI_OPEN_DIALOG_FN openDialogFn;
+  GWEN_GUI_CLOSE_DIALOG_FN closeDialogFn;
+  GWEN_GUI_RUN_DIALOG_FN runDialogFn;
+  GWEN_GUI_GET_FILENAME_FN getFileNameDialogFn;
+};
+
+static GWENHYWFAR_CB
+void Gtk3_Gui_FreeData(void *bp, void *p);
+
+
+static GWENHYWFAR_CB
+int GTK3_Gui_ExecDialog(GWEN_GUI *gui,
+                        GWEN_DIALOG *dlg,
+                        uint32_t guiid);
+
+
+static GWENHYWFAR_CB
+int GTK3_Gui_OpenDialog(GWEN_GUI *gui,
+                        GWEN_DIALOG *dlg,
+                        uint32_t guiid);
+
+static GWENHYWFAR_CB
+int GTK3_Gui_CloseDialog(GWEN_GUI *gui, GWEN_DIALOG *dlg);
+
+static GWENHYWFAR_CB
+int GTK3_Gui_RunDialog(GWEN_GUI *gui, GWEN_DIALOG *dlg, int timeout);
+
+static GWENHYWFAR_CB
+int GTK3_Gui_GetFileName(GWEN_GUI *gui,
+                         const char *caption,
+                         GWEN_GUI_FILENAME_TYPE fnt,
+                         uint32_t flags,
+                         const char *patterns,
+                         GWEN_BUFFER *pathBuffer,
+                         uint32_t guiid);
+
+
+#endif
+
+
diff --git a/borrowed/gwengui-gtk3/gwengui-gtk3.pc.in b/borrowed/gwengui-gtk3/gwengui-gtk3.pc.in
new file mode 100644
index 0000000..23e1067
--- /dev/null
+++ b/borrowed/gwengui-gtk3/gwengui-gtk3.pc.in
@@ -0,0 +1,23 @@
+# pkg-config configuration for gwengui_gtk3
+# For information about the syntax, see pkg-config(1)
+
+# General installation directories
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+pkgincludedir=@includedir@/gwenhywfar
+datarootdir=@datarootdir@
+datadir=@datadir@
+bindir=@bindir@
+sysconfdir=@sysconfdir@
+
+# Human-readable name
+Name: gwengui-gtk3
+# Human-readable description
+Description: GTK3 Implementation of the GWEN_DIALOG framework.
+
+Version: @VERSION@
+Libs: -L at libdir@ -lgwengui-gtk3
+Cflags: -I at includedir@
+
diff --git a/borrowed/gwengui-gtk3/w_checkbox.c b/borrowed/gwengui-gtk3/w_checkbox.c
new file mode 100644
index 0000000..f8d8661
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_checkbox.c
@@ -0,0 +1,198 @@
+/***************************************************************************
+    begin       : Mon Jul 12 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WCheckBox_SetIntProperty(GWEN_WIDGET *w,
+                                     GWEN_DIALOG_PROPERTY prop,
+                                     int index,
+                                     int value,
+                                     int doSignal) {
+  GtkButton *g;
+
+  g=GTK_BUTTON(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  case GWEN_DialogProperty_Value:
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WCheckBox_GetIntProperty(GWEN_WIDGET *w,
+                                     GWEN_DIALOG_PROPERTY prop,
+                                     int index,
+                                     int defaultValue) {
+  GtkButton *g;
+
+  g=GTK_BUTTON(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  case GWEN_DialogProperty_Value:
+    return (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g))==TRUE)?1:0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WCheckBox_SetCharProperty(GWEN_WIDGET *w,
+                                      GWEN_DIALOG_PROPERTY prop,
+                                      int index,
+                                      const char *value,
+                                      int doSignal) {
+  GtkButton *g;
+
+  g=GTK_BUTTON(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Title:
+    gtk_button_set_label(g, value);
+    return 0;
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+static GWENHYWFAR_CB
+const char* Gtk3Gui_WCheckBox_GetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *defaultValue) {
+  GtkButton *g;
+
+  g=GTK_BUTTON(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Title:
+    return gtk_button_get_label(g);
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static void Gtk3Gui_WCheckBox_Toggled_handler(GtkButton *button, gpointer data) {
+  GWEN_WIDGET *w;
+  int rv;
+
+  w=data;
+  assert(w);
+  rv=GWEN_Dialog_EmitSignal(GWEN_Widget_GetDialog(w),
+                            GWEN_DialogEvent_TypeActivated,
+                            GWEN_Widget_GetName(w));
+  if (rv==GWEN_DialogEvent_ResultAccept)
+    Gtk3Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 1);
+  else if (rv==GWEN_DialogEvent_ResultReject)
+    Gtk3Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 0);
+}
+
+
+
+static int Gtk3Gui_WCheckBox_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  const char *s;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+  gulong toggled_handler_id;
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+  s=GWEN_Widget_GetText(w, 0);
+
+  /* create widget */
+  if (s && *s)
+    g=gtk_check_button_new_with_mnemonic(s);
+  else
+    g=gtk_check_button_new();
+
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WCheckBox_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WCheckBox_GetIntProperty);
+  GWEN_Widget_SetSetCharPropertyFn(w, Gtk3Gui_WCheckBox_SetCharProperty);
+  GWEN_Widget_SetGetCharPropertyFn(w, Gtk3Gui_WCheckBox_GetCharProperty);
+
+  toggled_handler_id=g_signal_connect(g,
+                                      "toggled",
+                                      G_CALLBACK (Gtk3Gui_WCheckBox_Toggled_handler),
+                                      w);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_combobox.c b/borrowed/gwengui-gtk3/w_combobox.c
new file mode 100644
index 0000000..f82dbf8
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_combobox.c
@@ -0,0 +1,294 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+typedef struct W_COMBOBOX W_COMBOBOX;
+struct W_COMBOBOX {
+  GWEN_STRINGLIST *entries;
+};
+
+
+GWEN_INHERIT(GWEN_WIDGET, W_COMBOBOX)
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WComboBox_SetIntProperty(GWEN_WIDGET *w,
+                                     GWEN_DIALOG_PROPERTY prop,
+                                     int index,
+                                     int value,
+                                     int doSignal) {
+  GtkWidget *g;
+  W_COMBOBOX *xw;
+
+  assert(w);
+  xw=GWEN_INHERIT_GETDATA(GWEN_WIDGET, W_COMBOBOX, w);
+  assert(xw);
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  case GWEN_DialogProperty_Value:
+    gtk_combo_box_set_active(GTK_COMBO_BOX(g), value);
+    return 0;
+
+  case GWEN_DialogProperty_ClearValues: {
+    GtkListStore *store;
+
+    store=GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(g)));
+    assert(store);
+    gtk_list_store_clear(store);
+    GWEN_StringList_Clear(xw->entries);
+    return 0;
+  }
+
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WComboBox_GetIntProperty(GWEN_WIDGET *w,
+                                     GWEN_DIALOG_PROPERTY prop,
+                                     int index,
+                                     int defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+    return 0;
+
+  case GWEN_DialogProperty_Value: {
+    gint i;
+
+    i=gtk_combo_box_get_active(GTK_COMBO_BOX(g));
+    if (i==-1)
+      return defaultValue;
+    else
+      return i;
+  }
+
+  case GWEN_DialogProperty_ValueCount: {
+    GtkListStore *store;
+    gint i;
+
+    store=GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(g)));
+    assert(store);
+    i=gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), NULL);
+    return i;
+  }
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WComboBox_SetCharProperty(GWEN_WIDGET *w,
+                                      GWEN_DIALOG_PROPERTY prop,
+                                      int index,
+                                      const char *value,
+                                      int doSignal) {
+  GtkWidget *g;
+  W_COMBOBOX *xw;
+
+  assert(w);
+  xw=GWEN_INHERIT_GETDATA(GWEN_WIDGET, W_COMBOBOX, w);
+  assert(xw);
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Value:
+    /* undefined */
+    break;
+
+  case GWEN_DialogProperty_AddValue: {
+    GtkListStore *store;
+    GtkTreeIter iter;
+
+    store=GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(g)));
+    assert(store);
+
+    gtk_list_store_append(store, &iter);
+    gtk_list_store_set(store, &iter, 0, value, -1);
+    GWEN_StringList_AppendString(xw->entries, value, 0, 0);
+    return 0;
+  }
+
+  case GWEN_DialogProperty_ClearValues: {
+    GtkListStore *store;
+
+    store=GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(g)));
+    assert(store);
+    gtk_list_store_clear(store);
+    GWEN_StringList_Clear(xw->entries);
+    return 0;
+  }
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+static GWENHYWFAR_CB
+const char* Gtk3Gui_WComboBox_GetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *defaultValue) {
+  GtkWidget *g;
+  W_COMBOBOX *xw;
+
+  assert(w);
+  xw=GWEN_INHERIT_GETDATA(GWEN_WIDGET, W_COMBOBOX, w);
+  assert(xw);
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Value: {
+    const char *s;
+
+    s=GWEN_StringList_StringAt(xw->entries, index);
+    if (s && *s)
+      return s;
+    else
+      return defaultValue;
+  }
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static void changed_handler(GtkWidget *comboBox, gpointer data) {
+  GWEN_WIDGET *w;
+  int rv;
+
+  w=data;
+  assert(w);
+  rv=GWEN_Dialog_EmitSignal(GWEN_Widget_GetDialog(w),
+                            GWEN_DialogEvent_TypeActivated,
+                            GWEN_Widget_GetName(w));
+  if (rv==GWEN_DialogEvent_ResultAccept)
+    Gtk3Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 1);
+  else if (rv==GWEN_DialogEvent_ResultReject)
+    Gtk3Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 0);
+}
+
+
+
+static void GWENHYWFAR_CB Gtk3Gui_WComboBox_FreeData(void *bp, void *p) {
+  W_COMBOBOX *xw;
+
+  xw=(W_COMBOBOX*) p;
+  GWEN_StringList_free(xw->entries);
+  GWEN_FREE_OBJECT(xw);
+}
+
+
+static
+int Gtk3Gui_WComboBox_Setup(GWEN_WIDGET *w) {
+  W_COMBOBOX *xw;
+  GtkWidget *g;
+  GtkCellRenderer *cr;
+  GtkListStore *store;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+  gulong changed_handler_id;
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+
+  /* create widget */
+  store=gtk_list_store_new(1, G_TYPE_STRING);
+  if (flags & GWEN_WIDGET_FLAGS_READONLY)
+    g=gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(store));
+  else
+    /* TODO: why the heck does *this* combo box have two columns in the list?? */
+    g=gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(store));
+  g_object_unref(store);
+
+  cr=gtk_cell_renderer_text_new();
+  gtk_cell_layout_pack_start(GTK_CELL_LAYOUT (g), cr, TRUE);
+  gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(g), cr, "text", 0, NULL);
+
+  GWEN_NEW_OBJECT(W_COMBOBOX, xw);
+  GWEN_INHERIT_SETDATA(GWEN_WIDGET, W_COMBOBOX, w, xw, Gtk3Gui_WComboBox_FreeData);
+  xw->entries=GWEN_StringList_new();
+
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WComboBox_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WComboBox_GetIntProperty);
+  GWEN_Widget_SetSetCharPropertyFn(w, Gtk3Gui_WComboBox_SetCharProperty);
+  GWEN_Widget_SetGetCharPropertyFn(w, Gtk3Gui_WComboBox_GetCharProperty);
+
+  changed_handler_id=g_signal_connect(g,
+                                      "changed",
+                                      G_CALLBACK (changed_handler),
+                                      w);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_dialog.c b/borrowed/gwengui-gtk3/w_dialog.c
new file mode 100644
index 0000000..42dfa4d
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_dialog.c
@@ -0,0 +1,202 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WDialog_SetIntProperty(GWEN_WIDGET *w,
+                                   GWEN_DIALOG_PROPERTY prop,
+                                   int index,
+                                   int value,
+                                   int doSignal) {
+  GtkWindow *g;
+
+  g=GTK_WINDOW(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  case GWEN_DialogProperty_Width: {
+    gint width, height;
+
+    gtk_window_get_size(GTK_WINDOW(g), &width, &height);
+    gtk_window_resize(GTK_WINDOW(g), value, height);
+    return 0;
+  }
+
+  case GWEN_DialogProperty_Height: {
+    gint width, height;
+
+    gtk_window_get_size(GTK_WINDOW(g), &width, &height);
+    gtk_window_resize(GTK_WINDOW(g), width, value);
+    return 0;
+  }
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WDialog_GetIntProperty(GWEN_WIDGET *w,
+                                   GWEN_DIALOG_PROPERTY prop,
+                                   int index,
+                                   int defaultValue) {
+  GtkWindow *g;
+
+  g=GTK_WINDOW(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+    return 0;
+
+  case GWEN_DialogProperty_Width: {
+    gint width, height;
+
+    gtk_window_get_size(GTK_WINDOW(g), &width, &height);
+    return width;
+  }
+
+  case GWEN_DialogProperty_Height: {
+    gint width, height;
+
+    gtk_window_get_size(GTK_WINDOW(g), &width, &height);
+    return height;
+  }
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WDialog_SetCharProperty(GWEN_WIDGET *w,
+                                    GWEN_DIALOG_PROPERTY prop,
+                                    int index,
+                                    const char *value,
+                                    int doSignal) {
+  GtkWindow *g;
+
+  g=GTK_WINDOW(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Title:
+    gtk_window_set_title(GTK_WINDOW(g), value);
+    return 0;
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+static GWENHYWFAR_CB
+const char* Gtk3Gui_WDialog_GetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *defaultValue) {
+  GtkWindow *g;
+
+  g=GTK_WINDOW(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Title:
+    return gtk_window_get_title(GTK_WINDOW(g));
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WDialog_AddChildGuiWidget(GWEN_WIDGET *w, GWEN_WIDGET *wChild) {
+  GtkWidget *g;
+  GtkWidget *gChild;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  gChild=GTK_WIDGET(GWEN_Widget_GetImplData(wChild, GTK3_DIALOG_WIDGET_REAL));
+  assert(gChild);
+
+  gtk_container_add(GTK_CONTAINER(g), gChild);
+
+  return 0;
+}
+
+
+
+static int Gtk3Gui_WDialog_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  const char *s;
+  uint32_t flags;
+
+  flags=GWEN_Widget_GetFlags(w);
+  s=GWEN_Widget_GetText(w, 0);
+
+  g=gtk_window_new(GTK_WINDOW_TOPLEVEL);
+  gtk_window_set_modal(GTK_WINDOW(g), TRUE);
+  if (s && *s)
+    gtk_window_set_title(GTK_WINDOW(g), s);
+
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WDialog_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WDialog_GetIntProperty);
+  GWEN_Widget_SetSetCharPropertyFn(w, Gtk3Gui_WDialog_SetCharProperty);
+  GWEN_Widget_SetGetCharPropertyFn(w, Gtk3Gui_WDialog_GetCharProperty);
+  GWEN_Widget_SetAddChildGuiWidgetFn(w, Gtk3Gui_WDialog_AddChildGuiWidget);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_gridlayout.c b/borrowed/gwengui-gtk3/w_gridlayout.c
new file mode 100644
index 0000000..622cba4
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_gridlayout.c
@@ -0,0 +1,239 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+typedef struct {
+  int sortByRow;
+  int allocatedColumns;
+  int allocatedRows;
+
+  int currentColumn;
+  int currentRow;
+}  GTK3_GRIDLAYOUT_WIDGET;
+
+
+GWEN_INHERIT(GWEN_WIDGET, GTK3_GRIDLAYOUT_WIDGET)
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WGridLayout_SetIntProperty(GWEN_WIDGET *w,
+                                       GWEN_DIALOG_PROPERTY prop,
+                                       int index,
+                                       int value,
+                                       int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WGridLayout_GetIntProperty(GWEN_WIDGET *w,
+                                       GWEN_DIALOG_PROPERTY prop,
+                                       int index,
+                                       int defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WGridLayout_SetCharProperty(GWEN_WIDGET *w,
+                                        GWEN_DIALOG_PROPERTY prop,
+                                        int index,
+                                        const char *value,
+                                        int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+static GWENHYWFAR_CB
+const char* Gtk3Gui_WGridLayout_GetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WGridLayout_AddChildGuiWidget(GWEN_WIDGET *w, GWEN_WIDGET *wChild) {
+  GTK3_GRIDLAYOUT_WIDGET *xw;
+  GtkWidget *g;
+  GtkWidget *gChild;
+  uint32_t cflags;
+  int x;
+  int y;
+
+  assert(w);
+  xw=GWEN_INHERIT_GETDATA(GWEN_WIDGET, GTK3_GRIDLAYOUT_WIDGET, w);
+  assert(xw);
+
+  cflags=GWEN_Widget_GetFlags(wChild);
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  gChild=GTK_WIDGET(GWEN_Widget_GetImplData(wChild, GTK3_DIALOG_WIDGET_REAL));
+  assert(gChild);
+
+  if (xw->sortByRow) {
+    /* fill rows, enter next column if column full */
+    y=(xw->currentRow)++;
+    if (y>=xw->allocatedRows) {
+      xw->currentRow=0;
+      y=(xw->currentRow)++;
+      xw->currentColumn++;
+    }
+
+    x=xw->currentColumn;
+    if (x>=xw->allocatedColumns) {
+      xw->allocatedColumns=x+1;
+    }
+  }
+  else {
+    /* fill columns, enter next row if row full */
+    x=(xw->currentColumn)++;
+    if (x>=xw->allocatedColumns) {
+      xw->currentColumn=0;
+      x=(xw->currentColumn)++;
+      xw->currentRow++;
+    }
+
+    y=xw->currentRow;
+    if (y>=xw->allocatedRows) {
+      xw->allocatedRows=y+1;
+    }
+  }
+
+  gtk_grid_attach(GTK_GRID(g), gChild, x, y, 1, 1);
+
+  return 0;
+}
+
+
+
+
+static GWENHYWFAR_CB
+void Gtk3Gui_WGridLayout_FreeData(void *bp, void *p) {
+  GTK3_GRIDLAYOUT_WIDGET *xw;
+
+  xw=(GTK3_GRIDLAYOUT_WIDGET*) p;
+
+  GWEN_FREE_OBJECT(xw);
+}
+
+
+
+static int Gtk3Gui_WGridLayout_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+  GTK3_GRIDLAYOUT_WIDGET *xw;
+  int rows;
+  int cols;
+
+  GWEN_NEW_OBJECT(GTK3_GRIDLAYOUT_WIDGET, xw);
+  GWEN_INHERIT_SETDATA(GWEN_WIDGET, GTK3_GRIDLAYOUT_WIDGET, w, xw, Gtk3Gui_WGridLayout_FreeData);
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+  cols=GWEN_Widget_GetColumns(w);
+  rows=GWEN_Widget_GetRows(w);
+
+  if (rows>0) {
+    xw->sortByRow=1;
+    xw->allocatedRows=rows;
+    xw->allocatedColumns=1;
+  }
+  else {
+    xw->sortByRow=0;
+    xw->allocatedColumns=cols;
+    xw->allocatedRows=1;
+  }
+
+  g=gtk_grid_new();
+
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WGridLayout_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WGridLayout_GetIntProperty);
+  GWEN_Widget_SetSetCharPropertyFn(w, Gtk3Gui_WGridLayout_SetCharProperty);
+  GWEN_Widget_SetGetCharPropertyFn(w, Gtk3Gui_WGridLayout_GetCharProperty);
+  GWEN_Widget_SetAddChildGuiWidgetFn(w, Gtk3Gui_WGridLayout_AddChildGuiWidget);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_groupbox.c b/borrowed/gwengui-gtk3/w_groupbox.c
new file mode 100644
index 0000000..65fde56
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_groupbox.c
@@ -0,0 +1,195 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WGroupBox_SetIntProperty(GWEN_WIDGET *w,
+                                     GWEN_DIALOG_PROPERTY prop,
+                                     int index,
+                                     int value,
+                                     int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WGroupBox_GetIntProperty(GWEN_WIDGET *w,
+                                     GWEN_DIALOG_PROPERTY prop,
+                                     int index,
+                                     int defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+    return 0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WGroupBox_SetCharProperty(GWEN_WIDGET *w,
+                                      GWEN_DIALOG_PROPERTY prop,
+                                      int index,
+                                      const char *value,
+                                      int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Title:
+    gtk_frame_set_label(GTK_FRAME(g), value);
+    return 0;
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+static GWENHYWFAR_CB
+const char* Gtk3Gui_WGroupBox_GetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Title:
+    return gtk_frame_get_label(GTK_FRAME(g));
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WGroupBox_AddChildGuiWidget(GWEN_WIDGET *w, GWEN_WIDGET *wChild) {
+  GtkWidget *g;
+  GtkWidget *gChild;
+  uint32_t cflags;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_CONTENT));
+  assert(g);
+
+  gChild=GTK_WIDGET(GWEN_Widget_GetImplData(wChild, GTK3_DIALOG_WIDGET_REAL));
+  assert(gChild);
+
+  cflags=GWEN_Widget_GetFlags(wChild);
+
+  gtk_box_pack_start(GTK_BOX(g), gChild,
+                     (cflags & GWEN_WIDGET_FLAGS_FILLY)?TRUE:FALSE,
+                     (cflags & GWEN_WIDGET_FLAGS_FILLY)?TRUE:FALSE,
+                     0);
+
+  return 0;
+}
+
+
+
+static int Gtk3Gui_WGroupBox_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  GtkWidget *gContent;
+  const char *s;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+  s=GWEN_Widget_GetText(w, 0);
+
+  g=gtk_frame_new(s);
+
+  gContent=gtk_box_new(GTK_ORIENTATION_VERTICAL,
+                       GTK3_GUI_DIALOG_DEFAULT_BOX_SPACING);
+  gtk_container_add(GTK_CONTAINER(g), gContent);
+
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) gContent);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WGroupBox_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WGroupBox_GetIntProperty);
+  GWEN_Widget_SetSetCharPropertyFn(w, Gtk3Gui_WGroupBox_SetCharProperty);
+  GWEN_Widget_SetGetCharPropertyFn(w, Gtk3Gui_WGroupBox_GetCharProperty);
+  GWEN_Widget_SetAddChildGuiWidgetFn(w, Gtk3Gui_WGroupBox_AddChildGuiWidget);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_hlayout.c b/borrowed/gwengui-gtk3/w_hlayout.c
new file mode 100644
index 0000000..792e9f4
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_hlayout.c
@@ -0,0 +1,164 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WHLayout_SetIntProperty(GWEN_WIDGET *w,
+                                    GWEN_DIALOG_PROPERTY prop,
+                                    int index,
+                                    int value,
+                                    int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WHLayout_GetIntProperty(GWEN_WIDGET *w,
+                                    GWEN_DIALOG_PROPERTY prop,
+                                    int index,
+                                    int defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WHLayout_SetCharProperty(GWEN_WIDGET *w,
+                                     GWEN_DIALOG_PROPERTY prop,
+                                     int index,
+                                     const char *value,
+                                     int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+static GWENHYWFAR_CB
+const char* Gtk3Gui_WHLayout_GetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WHLayout_AddChildGuiWidget(GWEN_WIDGET *w, GWEN_WIDGET *wChild) {
+  GtkWidget *g;
+  GtkWidget *gChild;
+  uint32_t cflags;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  gChild=GTK_WIDGET(GWEN_Widget_GetImplData(wChild, GTK3_DIALOG_WIDGET_REAL));
+  assert(gChild);
+
+  cflags=GWEN_Widget_GetFlags(wChild);
+
+  gtk_box_pack_start(GTK_BOX(g), gChild,
+                     (cflags & GWEN_WIDGET_FLAGS_FILLX)?TRUE:FALSE,
+                     (cflags & GWEN_WIDGET_FLAGS_FILLX)?TRUE:FALSE,
+                     0);
+
+  return 0;
+}
+
+
+
+static int Gtk3Gui_WHLayout_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+
+  g=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,
+                 GTK3_GUI_DIALOG_DEFAULT_BOX_SPACING);
+
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WHLayout_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WHLayout_GetIntProperty);
+  GWEN_Widget_SetSetCharPropertyFn(w, Gtk3Gui_WHLayout_SetCharProperty);
+  GWEN_Widget_SetGetCharPropertyFn(w, Gtk3Gui_WHLayout_GetCharProperty);
+  GWEN_Widget_SetAddChildGuiWidgetFn(w, Gtk3Gui_WHLayout_AddChildGuiWidget);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_hline.c b/borrowed/gwengui-gtk3/w_hline.c
new file mode 100644
index 0000000..b074a52
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_hline.c
@@ -0,0 +1,98 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WHLine_SetIntProperty(GWEN_WIDGET *w,
+                                  GWEN_DIALOG_PROPERTY prop,
+                                  int index,
+                                  int value,
+                                  int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WHLine_GetIntProperty(GWEN_WIDGET *w,
+                                  GWEN_DIALOG_PROPERTY prop,
+                                  int index,
+                                  int defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static int Gtk3Gui_WHLine_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+
+  g=gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WHLine_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WHLine_GetIntProperty);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_hspacer.c b/borrowed/gwengui-gtk3/w_hspacer.c
new file mode 100644
index 0000000..22790c7
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_hspacer.c
@@ -0,0 +1,100 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WHSpacer_SetIntProperty(GWEN_WIDGET *w,
+                                    GWEN_DIALOG_PROPERTY prop,
+                                    int index,
+                                    int value,
+                                    int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WHSpacer_GetIntProperty(GWEN_WIDGET *w,
+                                    GWEN_DIALOG_PROPERTY prop,
+                                    int index,
+                                    int defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static int Gtk3Gui_WHSpacer_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+
+  g=gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+  GWEN_Widget_AddFlags(w, GWEN_WIDGET_FLAGS_FILLX);
+
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WHSpacer_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WHSpacer_GetIntProperty);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_image.c b/borrowed/gwengui-gtk3/w_image.c
new file mode 100644
index 0000000..002bb69
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_image.c
@@ -0,0 +1,118 @@
+/***************************************************************************
+    begin       : Mon Jul 12 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WImage_SetIntProperty(GWEN_WIDGET *w,
+                                  GWEN_DIALOG_PROPERTY prop,
+                                  int index,
+                                  int value,
+                                  int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WImage_GetIntProperty(GWEN_WIDGET *w,
+                                  GWEN_DIALOG_PROPERTY prop,
+                                  int index,
+                                  int defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static int Gtk3Gui_WImage_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+  const char *s;
+  GWEN_BUFFER *tbuf;
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+
+  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
+  s=GWEN_Widget_GetImageFileName(w);
+  if (s && *s) {
+    GWEN_STRINGLIST *sl;
+
+    sl=GWEN_Dialog_GetMediaPaths(GWEN_Widget_GetDialog(w));
+    if (sl) {
+      int rv;
+
+      rv=GWEN_Directory_FindFileInPaths(sl, s, tbuf);
+      if (rv<0) {
+        DBG_ERROR(GWEN_LOGDOMAIN, "Image file [%s] not found (%d)", s, rv);
+        /* ignore result here, instead create GtkImage with "broken mage" later */
+      }
+    }
+  }
+
+  g=gtk_image_new_from_file(GWEN_Buffer_GetStart(tbuf));
+  GWEN_Buffer_free(tbuf);
+
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WImage_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WImage_GetIntProperty);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_label.c b/borrowed/gwengui-gtk3/w_label.c
new file mode 100644
index 0000000..210e6fd
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_label.c
@@ -0,0 +1,177 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WLabel_SetIntProperty(GWEN_WIDGET *w,
+                                  GWEN_DIALOG_PROPERTY prop,
+                                  int index,
+                                  int value,
+                                  int doSignal) {
+  GtkLabel *g;
+
+  g=GTK_LABEL(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WLabel_GetIntProperty(GWEN_WIDGET *w,
+                                  GWEN_DIALOG_PROPERTY prop,
+                                  int index,
+                                  int defaultValue) {
+  GtkLabel *g;
+
+  g=GTK_LABEL(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+    return 0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WLabel_SetCharProperty(GWEN_WIDGET *w,
+                                   GWEN_DIALOG_PROPERTY prop,
+                                   int index,
+                                   const char *value,
+                                   int doSignal) {
+  GtkLabel *g;
+  GWEN_BUFFER *tbuf;
+
+  g=GTK_LABEL(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  tbuf=GWEN_Buffer_new(0, 128, 0, 1);
+  if (value && *value)
+    Gtk3Gui_GetRawText(value, tbuf);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Title:
+    gtk_label_set_text(g, GWEN_Buffer_GetStart(tbuf));
+    GWEN_Buffer_free(tbuf);
+    return 0;
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  GWEN_Buffer_free(tbuf);
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+static GWENHYWFAR_CB
+const char* Gtk3Gui_WLabel_GetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *defaultValue) {
+  GtkLabel *g;
+
+  g=GTK_LABEL(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Title:
+    return gtk_label_get_label(g);
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static int Gtk3Gui_WLabel_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  const char *s;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+  GWEN_BUFFER *tbuf;
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+  s=GWEN_Widget_GetText(w, 0);
+
+  tbuf=GWEN_Buffer_new(0, 128, 0, 1);
+  if (s && *s)
+    Gtk3Gui_GetRawText(s, tbuf);
+
+  g=gtk_label_new(GWEN_Buffer_GetStart(tbuf));
+  GWEN_Buffer_free(tbuf);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WLabel_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WLabel_GetIntProperty);
+  GWEN_Widget_SetSetCharPropertyFn(w, Gtk3Gui_WLabel_SetCharProperty);
+  GWEN_Widget_SetGetCharPropertyFn(w, Gtk3Gui_WLabel_GetCharProperty);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_lineedit.c b/borrowed/gwengui-gtk3/w_lineedit.c
new file mode 100644
index 0000000..2fe7062
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_lineedit.c
@@ -0,0 +1,224 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WLineEdit_SetIntProperty(GWEN_WIDGET *w,
+                                     GWEN_DIALOG_PROPERTY prop,
+                                     int index,
+                                     int value,
+                                     int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WLineEdit_GetIntProperty(GWEN_WIDGET *w,
+                                     GWEN_DIALOG_PROPERTY prop,
+                                     int index,
+                                     int defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+    return 0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WLineEdit_SetCharProperty(GWEN_WIDGET *w,
+                                      GWEN_DIALOG_PROPERTY prop,
+                                      int index,
+                                      const char *value,
+                                      int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Value:
+    gtk_entry_set_text(GTK_ENTRY(g), value);
+    return 0;
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+static GWENHYWFAR_CB
+const char* Gtk3Gui_WLineEdit_GetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Value:
+    return gtk_entry_get_text(GTK_ENTRY(g));
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static void Gtk3Gui_WLineEdit_Deleted_text_handler(GtkEntryBuffer *entrybuffer,
+    guint arg1,
+    guint arg2,
+    gpointer data) {
+  GWEN_WIDGET *w;
+  int rv;
+
+  w=data;
+  assert(w);
+  rv=GWEN_Dialog_EmitSignal(GWEN_Widget_GetDialog(w),
+                            GWEN_DialogEvent_TypeValueChanged,
+                            GWEN_Widget_GetName(w));
+  if (rv==GWEN_DialogEvent_ResultAccept)
+    Gtk3Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 1);
+  else if (rv==GWEN_DialogEvent_ResultReject)
+    Gtk3Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 0);
+}
+
+
+
+static void Gtk3Gui_WLineEdit_Inserted_text_handler(GtkEntryBuffer *entrybuffer,
+    guint arg1,
+    gchar *arg2,
+    guint arg3,
+    gpointer data) {
+  GWEN_WIDGET *w;
+  int rv;
+
+  w=data;
+  assert(w);
+  rv=GWEN_Dialog_EmitSignal(GWEN_Widget_GetDialog(w),
+                            GWEN_DialogEvent_TypeValueChanged,
+                            GWEN_Widget_GetName(w));
+  if (rv==GWEN_DialogEvent_ResultAccept)
+    Gtk3Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 1);
+  else if (rv==GWEN_DialogEvent_ResultReject)
+    Gtk3Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 0);
+}
+
+
+
+static int Gtk3Gui_WLineEdit_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  const char *s;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+  gulong deleted_text_handler_id;
+  gulong inserted_text_handler_id;
+  gboolean text_is_visible;
+
+  flags=GWEN_Widget_GetFlags(w);
+  text_is_visible = (flags & GWEN_WIDGET_FLAGS_PASSWORD) == 0;
+  wParent=GWEN_Widget_Tree_GetParent(w);
+  s=GWEN_Widget_GetText(w, 0);
+
+  /* create widget */
+  g=gtk_entry_new();
+  if (s && *s)
+    gtk_entry_set_text(GTK_ENTRY(g), s);
+  gtk_entry_set_visibility(GTK_ENTRY(g), text_is_visible);
+
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WLineEdit_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WLineEdit_GetIntProperty);
+  GWEN_Widget_SetSetCharPropertyFn(w, Gtk3Gui_WLineEdit_SetCharProperty);
+  GWEN_Widget_SetGetCharPropertyFn(w, Gtk3Gui_WLineEdit_GetCharProperty);
+
+  deleted_text_handler_id=g_signal_connect(gtk_entry_get_buffer(GTK_ENTRY(g)),
+                          "deleted-text",
+                          G_CALLBACK (Gtk3Gui_WLineEdit_Deleted_text_handler),
+                          w);
+
+  inserted_text_handler_id=g_signal_connect(gtk_entry_get_buffer(GTK_ENTRY(g)),
+                           "inserted-text",
+                           G_CALLBACK (Gtk3Gui_WLineEdit_Inserted_text_handler),
+                           w);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_listbox.c b/borrowed/gwengui-gtk3/w_listbox.c
new file mode 100644
index 0000000..e4c44cf
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_listbox.c
@@ -0,0 +1,540 @@
+/***************************************************************************
+    begin       : Fri Jul 09 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+#define W_LISTBOX_MAX_TYPES 256
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WListBox_SetIntProperty(GWEN_WIDGET *w,
+                                    GWEN_DIALOG_PROPERTY prop,
+                                    int index,
+                                    int value,
+                                    int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_CONTENT));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  case GWEN_DialogProperty_Value: {
+    GtkTreePath *path;
+
+    path=gtk_tree_path_new_from_indices(value, -1);
+    gtk_tree_view_set_cursor(GTK_TREE_VIEW(g), path, NULL, FALSE);
+    gtk_tree_path_free(path);
+    return 0;
+  }
+
+  case GWEN_DialogProperty_SelectionMode: {
+    GtkTreeSelection *sel;
+
+    sel=gtk_tree_view_get_selection(GTK_TREE_VIEW(g));
+    if (sel) {
+      switch(value) {
+      case GWEN_Dialog_SelectionMode_None:
+        gtk_tree_selection_set_mode(sel, GTK_SELECTION_NONE);
+        return 0;
+      case GWEN_Dialog_SelectionMode_Single:
+        gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
+        return 0;
+      case GWEN_Dialog_SelectionMode_Multi:
+        gtk_tree_selection_set_mode(sel, GTK_SELECTION_MULTIPLE);
+        return 0;
+      }
+      DBG_ERROR(GWEN_LOGDOMAIN, "Unknown SelectionMode %d", value);
+      return GWEN_ERROR_INVALID;
+    }
+    break;
+  }
+
+  case GWEN_DialogProperty_ColumnWidth: {
+    GtkTreeViewColumn *col;
+
+    col=gtk_tree_view_get_column(GTK_TREE_VIEW(g), index);
+    if (col) {
+      gtk_tree_view_column_set_fixed_width(col, value);
+      return 0;
+    }
+
+    /* no width */
+    return GWEN_ERROR_INVALID;
+  }
+
+  case GWEN_DialogProperty_SortDirection: {
+    GtkTreeViewColumn *col;
+    int i;
+    int cols;
+
+    /* remove sort indicator from all columns */
+    cols=GWEN_Widget_GetColumns(w);
+    for (i=0; i<cols; i++) {
+      col=gtk_tree_view_get_column(GTK_TREE_VIEW(g), index);
+      if (col) {
+        if (gtk_tree_view_column_get_sort_indicator(col)==TRUE)
+          gtk_tree_view_column_set_sort_indicator(col, FALSE);
+      }
+    }
+
+    if (value!=GWEN_DialogSortDirection_None) {
+      /* set sort indicator on given column */
+      col=gtk_tree_view_get_column(GTK_TREE_VIEW(g), index);
+      if (col) {
+        switch(value) {
+        case GWEN_DialogSortDirection_Up:
+          gtk_tree_view_column_set_sort_order(col, GTK_SORT_ASCENDING);
+          break;
+        case GWEN_DialogSortDirection_Down:
+          gtk_tree_view_column_set_sort_order(col, GTK_SORT_DESCENDING);
+          break;
+        default:
+          break;
+        }
+      }
+    }
+
+    return 0;
+  }
+
+  case GWEN_DialogProperty_ClearValues: {
+    GtkListStore *sto;
+
+    sto=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(g)));
+    if (sto)
+      gtk_list_store_clear(sto);
+    return 0;
+  }
+
+  case GWEN_DialogProperty_Sort:
+    /* NOOP, we use auto-sorting for now (TODO: figure out how to manually sort) */
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WListBox_GetIntProperty(GWEN_WIDGET *w,
+                                    GWEN_DIALOG_PROPERTY prop,
+                                    int index,
+                                    int defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_CONTENT));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+    return 0;
+
+  case GWEN_DialogProperty_Value: {
+    GtkTreePath *path=NULL;
+
+    gtk_tree_view_get_cursor(GTK_TREE_VIEW(g), &path, NULL);
+    if (path!=NULL) {
+      gint *idxlist;
+
+      idxlist=gtk_tree_path_get_indices(path);
+      if (idxlist!=NULL) {
+        int res;
+
+        res=idxlist[0];
+        gtk_tree_path_free(path);
+        return res;
+      }
+      gtk_tree_path_free(path);
+    }
+
+    /* no cursor */
+    return -1;
+  }
+
+  case GWEN_DialogProperty_ColumnWidth: {
+    GtkTreeViewColumn *col;
+
+    col=gtk_tree_view_get_column(GTK_TREE_VIEW(g), index);
+    if (col)
+      return gtk_tree_view_column_get_width(col);
+
+    /* no width */
+    return -1;
+  }
+
+  case GWEN_DialogProperty_SortDirection: {
+    GtkTreeViewColumn *col;
+
+    col=gtk_tree_view_get_column(GTK_TREE_VIEW(g), index);
+    if (col) {
+      if (gtk_tree_view_column_get_sort_indicator(col)==TRUE) {
+        switch(gtk_tree_view_column_get_sort_order(col)) {
+        case GTK_SORT_ASCENDING:
+          return GWEN_DialogSortDirection_Up;
+        case GTK_SORT_DESCENDING:
+          return GWEN_DialogSortDirection_Down;
+        default:
+          break;
+        }
+      }
+      /*break; <- this is wrong here, isn't it? */
+    }
+
+    return GWEN_DialogSortDirection_None;
+  }
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function %d is not appropriate for this type of widget (%s)",
+           prop,
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WListBox_SetCharProperty(GWEN_WIDGET *w,
+                                     GWEN_DIALOG_PROPERTY prop,
+                                     int index,
+                                     const char *value,
+                                     int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_CONTENT));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Title: {
+    int cols=0;
+    if (value && *value) {
+      int i;
+      int l;
+
+      l=strlen(value);
+      cols=1;
+      for (i=0; i<l; i++) {
+        if (value[i]=='\t')
+          cols++;
+      }
+    }
+
+    if (cols) {
+      GType types[W_LISTBOX_MAX_TYPES];
+      GtkListStore *sto;
+      int i;
+      const char *s;
+      GtkTreeViewColumn *col;
+      char *vcopy;
+      char *p;
+
+      if (cols>W_LISTBOX_MAX_TYPES)
+        cols=W_LISTBOX_MAX_TYPES;
+      for (i=0; i<cols; i++)
+        types[i]=G_TYPE_STRING;
+      sto=gtk_list_store_newv(cols, types);
+      s=value;
+
+      /* clear current headers in tree view */
+      while( (col=gtk_tree_view_get_column(GTK_TREE_VIEW(g), 0)) )
+        gtk_tree_view_remove_column(GTK_TREE_VIEW(g), col);
+
+      /* set new model */
+      gtk_tree_view_set_model(GTK_TREE_VIEW(g), GTK_TREE_MODEL(sto));
+
+      /* insert new headers */
+      i=0;
+      vcopy=strdup(value);
+      p=vcopy;
+      while(*p && i<cols) {
+        char *pT;
+        GtkCellRenderer *renderer;
+
+        pT=strchr(p, '\t');
+        if (pT)
+          *pT=0;
+
+        renderer=gtk_cell_renderer_text_new();
+        col=gtk_tree_view_column_new();
+        gtk_tree_view_column_set_title(col, p);
+        gtk_tree_view_column_pack_start(col, renderer, TRUE);
+        gtk_tree_view_column_set_sort_column_id(col, i);
+        gtk_tree_view_column_set_resizable(col, TRUE);
+        gtk_tree_view_column_set_sizing(col, GTK_TREE_VIEW_COLUMN_FIXED);
+        gtk_tree_view_column_set_attributes(col, renderer, "text", i, NULL);
+
+        gtk_tree_view_append_column(GTK_TREE_VIEW(g), col);
+
+        if (pT)
+          p=pT+1;
+        else
+          /* no more tab, all columns done */
+          break;
+        i++;
+      }
+      free(vcopy);
+      GWEN_Widget_SetColumns(w, cols);
+      gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(g), TRUE);
+    }
+    else {
+      DBG_ERROR(GWEN_LOGDOMAIN, "No columns (empty title)");
+      return GWEN_ERROR_INVALID;
+    }
+
+    return 0;
+  }
+
+  case GWEN_DialogProperty_ClearValues: {
+    GtkListStore *sto;
+
+    sto=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(g)));
+    if (sto)
+      gtk_list_store_clear(sto);
+    return 0;
+  }
+
+  case GWEN_DialogProperty_AddValue: {
+    GtkListStore *sto;
+
+    sto=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(g)));
+    if (sto) {
+      GtkTreeIter iter;
+      int cols;
+      int i;
+      char *vcopy;
+      char *p;
+
+      cols=GWEN_Widget_GetColumns(w);
+
+      vcopy=strdup(value);
+      p=vcopy;
+      i=0;
+      gtk_list_store_append(sto, &iter);
+      while(*p && i<cols) {
+        char *pT;
+        GValue val= {0};
+
+        g_value_init(&val, G_TYPE_STRING);
+
+        pT=strchr(p, '\t');
+        if (pT)
+          *pT=0;
+        g_value_set_string(&val, p);
+        gtk_list_store_set_value(sto, &iter, i, &val);
+        g_value_unset(&val);
+
+        if (pT)
+          p=pT+1;
+        else
+          /* no more tabs, all columns done */
+          break;
+        i++;
+      }
+      free(vcopy);
+    }
+
+    return 0;
+  }
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+static GWENHYWFAR_CB
+const char* Gtk3Gui_WListBox_GetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_CONTENT));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Title: {
+    GList *cols;
+
+    cols=gtk_tree_view_get_columns(GTK_TREE_VIEW(g));
+    if (cols) {
+      GList *le;
+      GWEN_BUFFER *tbuf;
+      int cnt=0;
+
+      tbuf=GWEN_Buffer_new(0, 256, 0, 1);
+      le=g_list_first(cols);
+      while(le) {
+        const gchar *s;
+
+        if (cnt)
+          GWEN_Buffer_AppendByte(tbuf, '\t');
+        s=gtk_tree_view_column_get_title(GTK_TREE_VIEW_COLUMN(le->data));
+        if (s && *s)
+          GWEN_Buffer_AppendString(tbuf, s);
+        cnt++;
+        le=g_list_next(le);
+      } /* while */
+      GWEN_Widget_SetText(w, GTK3_DIALOG_STRING_TITLE, GWEN_Buffer_GetStart(tbuf));
+      GWEN_Buffer_free(tbuf);
+
+      g_list_free(cols);
+      return GWEN_Widget_GetText(w, GTK3_DIALOG_STRING_TITLE);
+    }
+    return defaultValue;
+  }
+
+  case GWEN_DialogProperty_Value: {
+    GtkTreePath *path;
+
+    path=gtk_tree_path_new_from_indices(index, -1);
+    if (path!=NULL) {
+      GtkListStore *sto;
+      GtkTreeIter iter;
+
+      sto=GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(g)));
+      if (gtk_tree_model_get_iter(GTK_TREE_MODEL(sto), &iter, path)) {
+        GList *cols;
+
+        cols=gtk_tree_view_get_columns(GTK_TREE_VIEW(g));
+        if (cols) {
+          GList *le;
+          GWEN_BUFFER *tbuf;
+          int cnt=0;
+
+          tbuf=GWEN_Buffer_new(0, 256, 0, 1);
+          le=g_list_first(cols);
+          while(le) {
+            gchar *s;
+
+            if (cnt)
+              GWEN_Buffer_AppendByte(tbuf, '\t');
+            gtk_tree_model_get(GTK_TREE_MODEL(sto), &iter, cnt, &s, -1, NULL);
+            if (s) {
+              GWEN_Buffer_AppendString(tbuf, s);
+              g_free(s);
+            }
+            cnt++;
+            le=g_list_next(le);
+          } /* while */
+          GWEN_Widget_SetText(w, GTK3_DIALOG_STRING_VALUE, GWEN_Buffer_GetStart(tbuf));
+          GWEN_Buffer_free(tbuf);
+
+          g_list_free(cols);
+          return GWEN_Widget_GetText(w, GTK3_DIALOG_STRING_VALUE);
+        }
+      }
+
+      gtk_tree_path_free(path);
+    }
+    return defaultValue;
+  }
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static void Gtk3Gui_WListBox_CursorChanged_handler(GtkTreeView *g, gpointer data) {
+  GWEN_WIDGET *w;
+  int rv;
+
+  w=data;
+  assert(w);
+  rv=GWEN_Dialog_EmitSignal(GWEN_Widget_GetDialog(w),
+                            GWEN_DialogEvent_TypeActivated,
+                            GWEN_Widget_GetName(w));
+  if (rv==GWEN_DialogEvent_ResultAccept)
+    Gtk3Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 1);
+  else if (rv==GWEN_DialogEvent_ResultReject)
+    Gtk3Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 0);
+}
+
+
+
+static int Gtk3Gui_WListBox_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  GtkWidget *gScroll;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+  gulong changed_handler_id;
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+
+  gScroll=gtk_scrolled_window_new(NULL, NULL);
+  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gScroll),
+                                 GTK_POLICY_AUTOMATIC,
+                                 GTK_POLICY_AUTOMATIC);
+  g=gtk_tree_view_new();
+  gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(g), TRUE);
+/* gtk_tree_view_set_rules_hint is deprecated in gtk-3.14 on the
+ * grounds that it's really up to the theme and the user whether the
+ * treeview should be drawn with alternating background colors. */
+G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+  gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(g), TRUE);
+G_GNUC_END_IGNORE_DEPRECATIONS
+  gtk_container_add(GTK_CONTAINER(gScroll), GTK_WIDGET(g));
+
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) gScroll);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WListBox_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WListBox_GetIntProperty);
+  GWEN_Widget_SetSetCharPropertyFn(w, Gtk3Gui_WListBox_SetCharProperty);
+  GWEN_Widget_SetGetCharPropertyFn(w, Gtk3Gui_WListBox_GetCharProperty);
+
+  changed_handler_id=g_signal_connect(g,
+                                      "cursor-changed",
+                                      G_CALLBACK (Gtk3Gui_WListBox_CursorChanged_handler),
+                                      w);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_progressbar.c b/borrowed/gwengui-gtk3/w_progressbar.c
new file mode 100644
index 0000000..6a159f6
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_progressbar.c
@@ -0,0 +1,239 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+typedef struct W_PROGRESSBAR W_PROGRESSBAR;
+struct W_PROGRESSBAR {
+  int minValue;
+  int maxValue;
+  int currentValue;
+};
+
+
+GWEN_INHERIT(GWEN_WIDGET, W_PROGRESSBAR)
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WProgressBar_SetIntProperty(GWEN_WIDGET *w,
+                                        GWEN_DIALOG_PROPERTY prop,
+                                        int index,
+                                        int value,
+                                        int doSignal) {
+  GtkProgressBar *g;
+  W_PROGRESSBAR *xw;
+
+  assert(w);
+  xw=GWEN_INHERIT_GETDATA(GWEN_WIDGET, W_PROGRESSBAR, w);
+  assert(xw);
+
+  g=GTK_PROGRESS_BAR(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  case GWEN_DialogProperty_Value: {
+
+    xw->currentValue=value;
+    if (xw->maxValue) {
+      gdouble d;
+      char numbuf[32];
+
+      d=(gdouble)(xw->currentValue-xw->minValue)/(gdouble)(xw->maxValue);
+      gtk_progress_bar_set_fraction(g, d);
+      snprintf(numbuf, sizeof(numbuf)-1, "%d %%", (int)(d*100.0));
+      numbuf[sizeof(numbuf)-1]=0;
+      gtk_progress_bar_set_text(g, numbuf);
+    }
+    else {
+      gtk_progress_bar_set_fraction(g, 0.0);
+      gtk_progress_bar_set_text(g, "");
+    }
+    return 0;
+  }
+
+  case GWEN_DialogProperty_MinValue: {
+    xw->minValue=value;
+    if (xw->maxValue) {
+      gdouble d;
+      char numbuf[32];
+
+      d=(gdouble)(xw->currentValue-xw->minValue)/(gdouble)(xw->maxValue);
+      gtk_progress_bar_set_fraction(g, d);
+      snprintf(numbuf, sizeof(numbuf)-1, "%d %%", (int)(d*100.0));
+      numbuf[sizeof(numbuf)-1]=0;
+      gtk_progress_bar_set_text(g, numbuf);
+    }
+    else {
+      gtk_progress_bar_set_fraction(g, 0.0);
+      gtk_progress_bar_set_text(g, "");
+    }
+    return 0;
+  }
+
+  case GWEN_DialogProperty_MaxValue: {
+    xw->maxValue=value;
+    if (xw->maxValue) {
+      gdouble d;
+      char numbuf[32];
+
+      d=(gdouble)(xw->currentValue-xw->minValue)/(gdouble)(xw->maxValue);
+      gtk_progress_bar_set_fraction(g, d);
+      snprintf(numbuf, sizeof(numbuf)-1, "%d %%", (int)(d*100.0));
+      numbuf[sizeof(numbuf)-1]=0;
+      gtk_progress_bar_set_text(g, numbuf);
+      return 0;
+    }
+    else {
+      gtk_progress_bar_set_fraction(g, 0.0);
+      gtk_progress_bar_set_text(g, "");
+    }
+  }
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WProgressBar_GetIntProperty(GWEN_WIDGET *w,
+                                        GWEN_DIALOG_PROPERTY prop,
+                                        int index,
+                                        int defaultValue) {
+  GtkProgressBar *g;
+  W_PROGRESSBAR *xw;
+
+  assert(w);
+  xw=GWEN_INHERIT_GETDATA(GWEN_WIDGET, W_PROGRESSBAR, w);
+  assert(xw);
+
+  g=GTK_PROGRESS_BAR(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+    return 0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  case GWEN_DialogProperty_Value:
+    return xw->currentValue;
+
+  case GWEN_DialogProperty_MinValue:
+    return xw->minValue;
+
+  case GWEN_DialogProperty_MaxValue:
+    return xw->maxValue;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WProgressBar_SetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *value,
+    int doSignal) {
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+static GWENHYWFAR_CB
+const char* Gtk3Gui_WProgressBar_GetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *defaultValue) {
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static void GWENHYWFAR_CB Gtk3Gui_WProgressBar_FreeData(void *bp, void *p) {
+  W_PROGRESSBAR *xw;
+
+  xw=(W_PROGRESSBAR*) p;
+  GWEN_FREE_OBJECT(xw);
+}
+
+
+
+static int Gtk3Gui_WProgressBar_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  const char *s;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+  W_PROGRESSBAR *xw;
+
+  GWEN_NEW_OBJECT(W_PROGRESSBAR, xw);
+  GWEN_INHERIT_SETDATA(GWEN_WIDGET, W_PROGRESSBAR, w, xw, Gtk3Gui_WProgressBar_FreeData);
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+  s=GWEN_Widget_GetText(w, 0);
+
+  g=gtk_progress_bar_new();
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WProgressBar_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WProgressBar_GetIntProperty);
+  GWEN_Widget_SetSetCharPropertyFn(w, Gtk3Gui_WProgressBar_SetCharProperty);
+  GWEN_Widget_SetGetCharPropertyFn(w, Gtk3Gui_WProgressBar_GetCharProperty);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_pushbutton.c b/borrowed/gwengui-gtk3/w_pushbutton.c
new file mode 100644
index 0000000..35d7554
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_pushbutton.c
@@ -0,0 +1,218 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WPushButton_SetIntProperty(GWEN_WIDGET *w,
+                                       GWEN_DIALOG_PROPERTY prop,
+                                       int index,
+                                       int value,
+                                       int doSignal) {
+  GtkButton *g;
+
+  g=GTK_BUTTON(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WPushButton_GetIntProperty(GWEN_WIDGET *w,
+                                       GWEN_DIALOG_PROPERTY prop,
+                                       int index,
+                                       int defaultValue) {
+  GtkButton *g;
+
+  g=GTK_BUTTON(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+    return 0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WPushButton_SetCharProperty(GWEN_WIDGET *w,
+                                        GWEN_DIALOG_PROPERTY prop,
+                                        int index,
+                                        const char *value,
+                                        int doSignal) {
+  GtkButton *g;
+
+  g=GTK_BUTTON(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Title:
+    gtk_button_set_label(g, value);
+    return 0;
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+static GWENHYWFAR_CB
+const char* Gtk3Gui_WPushButton_GetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *defaultValue) {
+  GtkButton *g;
+
+  g=GTK_BUTTON(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Title:
+    return gtk_button_get_label(g);
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static void Gtk3Gui_WPushButton_Clicked_handler(GtkButton *button, gpointer data) {
+  GWEN_WIDGET *w;
+  int rv;
+
+  w=data;
+  assert(w);
+  rv=GWEN_Dialog_EmitSignal(GWEN_Widget_GetDialog(w),
+                            GWEN_DialogEvent_TypeActivated,
+                            GWEN_Widget_GetName(w));
+  if (rv==GWEN_DialogEvent_ResultAccept)
+    Gtk3Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 1);
+  else if (rv==GWEN_DialogEvent_ResultReject)
+    Gtk3Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 0);
+}
+
+
+
+static int Gtk3Gui_WPushButton_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  const char *s;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+  gulong clicked_handler_id;
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+  s=GWEN_Widget_GetText(w, 0);
+
+  /* create widget */
+  if (s && *s)
+    g=gtk_button_new_with_mnemonic(s);
+  else
+    g=gtk_button_new();
+
+  s=GWEN_Widget_GetIconFileName(w);
+  if (s && *s) {
+    GWEN_STRINGLIST *sl;
+
+    sl=GWEN_Dialog_GetMediaPaths(GWEN_Widget_GetDialog(w));
+    if (sl) {
+      int rv;
+      GWEN_BUFFER *tbuf;
+
+      tbuf=GWEN_Buffer_new(0, 256, 0, 1);
+      rv=GWEN_Directory_FindFileInPaths(sl, s, tbuf);
+      if (rv<0) {
+        DBG_ERROR(GWEN_LOGDOMAIN, "Image file [%s] not found (%d)", s, rv);
+        /* ignore result here, instead create GtkImage with "broken mage" later */
+      }
+      else {
+        GtkWidget *gImage;
+
+        gImage=gtk_image_new_from_file(GWEN_Buffer_GetStart(tbuf));
+        gtk_button_set_image(GTK_BUTTON(g), gImage);
+        gtk_button_set_image_position(GTK_BUTTON(g), GTK_POS_LEFT);
+      }
+      GWEN_Buffer_free(tbuf);
+    }
+  }
+
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WPushButton_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WPushButton_GetIntProperty);
+  GWEN_Widget_SetSetCharPropertyFn(w, Gtk3Gui_WPushButton_SetCharProperty);
+  GWEN_Widget_SetGetCharPropertyFn(w, Gtk3Gui_WPushButton_GetCharProperty);
+
+  clicked_handler_id=g_signal_connect(g,
+                                      "clicked",
+                                      G_CALLBACK (Gtk3Gui_WPushButton_Clicked_handler),
+                                      w);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_radiobutton.c b/borrowed/gwengui-gtk3/w_radiobutton.c
new file mode 100644
index 0000000..9efe271
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_radiobutton.c
@@ -0,0 +1,222 @@
+/***************************************************************************
+    begin       : Mon Jul 12 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WRadioButton_SetIntProperty(GWEN_WIDGET *w,
+                                        GWEN_DIALOG_PROPERTY prop,
+                                        int index,
+                                        int value,
+                                        int doSignal) {
+  GtkButton *g;
+
+  g=GTK_BUTTON(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  case GWEN_DialogProperty_Value:
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WRadioButton_GetIntProperty(GWEN_WIDGET *w,
+                                        GWEN_DIALOG_PROPERTY prop,
+                                        int index,
+                                        int defaultValue) {
+  GtkButton *g;
+
+  g=GTK_BUTTON(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  case GWEN_DialogProperty_Value:
+    return (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g))==TRUE)?1:0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WRadioButton_SetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *value,
+    int doSignal) {
+  GtkButton *g;
+
+  g=GTK_BUTTON(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Title:
+    gtk_button_set_label(g, value);
+    return 0;
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+static GWENHYWFAR_CB
+const char* Gtk3Gui_WRadioButton_GetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *defaultValue) {
+  GtkButton *g;
+
+  g=GTK_BUTTON(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Title:
+    return gtk_button_get_label(g);
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static void Gtk3Gui_WRadioButton_Toggled_handler(GtkButton *button, gpointer data) {
+  GWEN_WIDGET *w;
+  int rv;
+
+  w=data;
+  assert(w);
+  rv=GWEN_Dialog_EmitSignal(GWEN_Widget_GetDialog(w),
+                            GWEN_DialogEvent_TypeActivated,
+                            GWEN_Widget_GetName(w));
+  if (rv==GWEN_DialogEvent_ResultAccept)
+    Gtk3Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 1);
+  else if (rv==GWEN_DialogEvent_ResultReject)
+    Gtk3Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 0);
+}
+
+
+
+static int Gtk3Gui_WRadioButton_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  const char *s;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+  GWEN_WIDGET *wT;
+  gulong toggled_handler_id;
+  int groupId;
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+  groupId=GWEN_Widget_GetGroupId(w);
+
+  s=GWEN_Widget_GetText(w, 0);
+
+  /* create widget */
+  if (s && *s)
+    g=gtk_radio_button_new_with_mnemonic(NULL, s);
+  else
+    g=gtk_radio_button_new(NULL);
+
+  /* get root widget */
+  wT=wParent;
+  while(GWEN_Widget_Tree_GetParent(wT))
+    wT=GWEN_Widget_Tree_GetParent(wT);
+
+  /* get first radio button of the same group */
+  while(wT) {
+    if ((GWEN_Widget_GetType(wT)==GWEN_Widget_TypeRadioButton) &&
+        GWEN_Widget_GetGroupId(wT)==groupId)
+      break;
+    wT=GWEN_Widget_Tree_GetBelow(wT);
+  }
+  if (wT && wT!=w) {
+    GSList *grp;
+
+    grp=gtk_radio_button_get_group(GTK_RADIO_BUTTON(GWEN_Widget_GetImplData(wT, GTK3_DIALOG_WIDGET_REAL)));
+    gtk_radio_button_set_group(GTK_RADIO_BUTTON(g), grp);
+  }
+
+  /* set pointers */
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WRadioButton_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WRadioButton_GetIntProperty);
+  GWEN_Widget_SetSetCharPropertyFn(w, Gtk3Gui_WRadioButton_SetCharProperty);
+  GWEN_Widget_SetGetCharPropertyFn(w, Gtk3Gui_WRadioButton_GetCharProperty);
+
+  toggled_handler_id=g_signal_connect(g,
+                                      "toggled",
+                                      G_CALLBACK (Gtk3Gui_WRadioButton_Toggled_handler),
+                                      w);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_scrollarea.c b/borrowed/gwengui-gtk3/w_scrollarea.c
new file mode 100644
index 0000000..8e36791
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_scrollarea.c
@@ -0,0 +1,192 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WScrollArea_SetIntProperty(GWEN_WIDGET *w,
+                                       GWEN_DIALOG_PROPERTY prop,
+                                       int index,
+                                       int value,
+                                       int doSignal) {
+  GtkWidget *g;  /* text view */
+  GtkWidget *gs; /* scrollable window */
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_CONTENT));
+  assert(g);
+  gs=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(gs);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(gs), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(gs));
+    return 0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WScrollArea_GetIntProperty(GWEN_WIDGET *w,
+                                       GWEN_DIALOG_PROPERTY prop,
+                                       int index,
+                                       int defaultValue) {
+  GtkWidget *g;  /* text view */
+  GtkWidget *gs; /* scrollable window */
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_CONTENT));
+  assert(g);
+  gs=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(gs);
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_CONTENT));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(gs))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(gs))==TRUE)?1:0;
+    return 0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WScrollArea_SetCharProperty(GWEN_WIDGET *w,
+                                        GWEN_DIALOG_PROPERTY prop,
+                                        int index,
+                                        const char *value,
+                                        int doSignal) {
+  GtkWidget *g;         /* scrollable window */
+  GtkWidget *gContent;  /* vbox */
+
+  gContent=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_CONTENT));
+  assert(gContent);
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+static GWENHYWFAR_CB
+const char* Gtk3Gui_WScrollArea_GetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *defaultValue) {
+  GtkWidget *gs; /* scrollable window */
+  GtkWidget *g;  /* vbox */
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_CONTENT));
+  assert(g);
+  gs=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(gs);
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WScrollArea_AddChildGuiWidget(GWEN_WIDGET *w, GWEN_WIDGET *wChild) {
+  GtkWidget *g;
+  GtkWidget *gChild;
+  uint32_t cflags;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_CONTENT));
+  assert(g);
+
+  gChild=GTK_WIDGET(GWEN_Widget_GetImplData(wChild, GTK3_DIALOG_WIDGET_REAL));
+  assert(gChild);
+
+  cflags=GWEN_Widget_GetFlags(wChild);
+
+  gtk_box_pack_start(GTK_BOX(g), gChild,
+                     (cflags & GWEN_WIDGET_FLAGS_FILLY)?TRUE:FALSE,
+                     (cflags & GWEN_WIDGET_FLAGS_FILLY)?TRUE:FALSE,
+                     0);
+
+  return 0;
+}
+
+
+
+static int Gtk3Gui_WScrollArea_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  GtkWidget *gContent;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+
+  /* create widget */
+  g=gtk_scrolled_window_new(NULL, NULL);
+  gContent=gtk_box_new(GTK_ORIENTATION_VERTICAL,
+                       GTK3_GUI_DIALOG_DEFAULT_BOX_SPACING);
+
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) gContent);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WScrollArea_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WScrollArea_GetIntProperty);
+  GWEN_Widget_SetSetCharPropertyFn(w, Gtk3Gui_WScrollArea_SetCharProperty);
+  GWEN_Widget_SetGetCharPropertyFn(w, Gtk3Gui_WScrollArea_GetCharProperty);
+  GWEN_Widget_SetAddChildGuiWidgetFn(w, Gtk3Gui_WScrollArea_AddChildGuiWidget);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_spinbox.c b/borrowed/gwengui-gtk3/w_spinbox.c
new file mode 100644
index 0000000..f0630ed
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_spinbox.c
@@ -0,0 +1,215 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+typedef struct W_SPINBOX W_SPINBOX;
+struct W_SPINBOX {
+  GtkAdjustment *adjustment;
+};
+
+
+GWEN_INHERIT(GWEN_WIDGET, W_SPINBOX)
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WSpinBox_SetIntProperty(GWEN_WIDGET *w,
+                                    GWEN_DIALOG_PROPERTY prop,
+                                    int index,
+                                    int value,
+                                    int doSignal) {
+  GtkWidget *g;
+  W_SPINBOX *xw;
+
+  assert(w);
+  xw=GWEN_INHERIT_GETDATA(GWEN_WIDGET, W_SPINBOX, w);
+  assert(xw);
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  case GWEN_DialogProperty_Value:
+    gtk_adjustment_set_value(GTK_ADJUSTMENT(xw->adjustment), value);
+    return 0;
+
+  case GWEN_DialogProperty_MinValue:
+    gtk_adjustment_set_lower(GTK_ADJUSTMENT(xw->adjustment), value);
+    return 0;
+
+  case GWEN_DialogProperty_MaxValue:
+    gtk_adjustment_set_upper(GTK_ADJUSTMENT(xw->adjustment), value);
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WSpinBox_GetIntProperty(GWEN_WIDGET *w,
+                                    GWEN_DIALOG_PROPERTY prop,
+                                    int index,
+                                    int defaultValue) {
+  GtkWidget *g;
+  W_SPINBOX *xw;
+
+  assert(w);
+  xw=GWEN_INHERIT_GETDATA(GWEN_WIDGET, W_SPINBOX, w);
+  assert(xw);
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+    return 0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  case GWEN_DialogProperty_Value:
+    return gtk_adjustment_get_value(GTK_ADJUSTMENT(xw->adjustment));
+
+  case GWEN_DialogProperty_MinValue:
+    return gtk_adjustment_get_lower(GTK_ADJUSTMENT(xw->adjustment));
+
+  case GWEN_DialogProperty_MaxValue:
+    return gtk_adjustment_get_upper(GTK_ADJUSTMENT(xw->adjustment));
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WSpinBox_SetCharProperty(GWEN_WIDGET *w,
+                                     GWEN_DIALOG_PROPERTY prop,
+                                     int index,
+                                     const char *value,
+                                     int doSignal) {
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+static GWENHYWFAR_CB
+const char* Gtk3Gui_WSpinBox_GetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *defaultValue) {
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static void GWENHYWFAR_CB Gtk3Gui_WSpinBox_FreeData(void *bp, void *p) {
+  W_SPINBOX *xw;
+
+  xw=(W_SPINBOX*) p;
+  GWEN_FREE_OBJECT(xw);
+}
+
+
+
+static void Gtk3Gui_WSpinBox_Changed_handler(GtkAdjustment *adjustment, gpointer data) {
+  GWEN_WIDGET *w;
+  int rv;
+
+  w=data;
+  assert(w);
+  rv=GWEN_Dialog_EmitSignal(GWEN_Widget_GetDialog(w),
+                            GWEN_DialogEvent_TypeValueChanged,
+                            GWEN_Widget_GetName(w));
+  if (rv==GWEN_DialogEvent_ResultAccept)
+    Gtk3Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 1);
+  else if (rv==GWEN_DialogEvent_ResultReject)
+    Gtk3Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 0);
+}
+
+
+
+static int Gtk3Gui_WSpinBox_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  const char *s;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+  W_SPINBOX *xw;
+  gulong changed_handler_id;
+
+  GWEN_NEW_OBJECT(W_SPINBOX, xw);
+  GWEN_INHERIT_SETDATA(GWEN_WIDGET, W_SPINBOX, w, xw, Gtk3Gui_WSpinBox_FreeData);
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+  s=GWEN_Widget_GetText(w, 0);
+
+  xw->adjustment=GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 100.0, 1.0, 5.0, 5.0));
+  g=gtk_spin_button_new(xw->adjustment, 1.0, 0);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WSpinBox_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WSpinBox_GetIntProperty);
+  GWEN_Widget_SetSetCharPropertyFn(w, Gtk3Gui_WSpinBox_SetCharProperty);
+  GWEN_Widget_SetGetCharPropertyFn(w, Gtk3Gui_WSpinBox_GetCharProperty);
+
+  changed_handler_id=g_signal_connect(g,
+                                      "value-changed",
+                                      G_CALLBACK (Gtk3Gui_WSpinBox_Changed_handler),
+                                      w);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_stack.c b/borrowed/gwengui-gtk3/w_stack.c
new file mode 100644
index 0000000..d015f65
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_stack.c
@@ -0,0 +1,175 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+/*
+ * Note: This is a special use case for gtk_notebook.
+ * To use it as a WidgetStack we have to disable drawing od tabs
+ * and borders by calling:
+ * - gtk_notebook_set_show_tabs(GTK_NOTEBOOK(g), FALSE);
+ * - gtk_notebook_set_show_border(GTK_NOTEBOOK(g), FALSE);
+ *
+ */
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WStack_SetIntProperty(GWEN_WIDGET *w,
+                                  GWEN_DIALOG_PROPERTY prop,
+                                  int index,
+                                  int value,
+                                  int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  case GWEN_DialogProperty_Value:
+    gtk_notebook_set_current_page(GTK_NOTEBOOK(g), value);
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WStack_GetIntProperty(GWEN_WIDGET *w,
+                                  GWEN_DIALOG_PROPERTY prop,
+                                  int index,
+                                  int defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+    return 0;
+
+  case GWEN_DialogProperty_Value:
+    return gtk_notebook_get_current_page(GTK_NOTEBOOK(g));
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WStack_SetCharProperty(GWEN_WIDGET *w,
+                                   GWEN_DIALOG_PROPERTY prop,
+                                   int index,
+                                   const char *value,
+                                   int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+static GWENHYWFAR_CB
+const char* Gtk3Gui_WStack_GetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WStack_AddChildGuiWidget(GWEN_WIDGET *w, GWEN_WIDGET *wChild) {
+  GtkWidget *g;
+  GtkWidget *gChild;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  gChild=GTK_WIDGET(GWEN_Widget_GetImplData(wChild, GTK3_DIALOG_WIDGET_REAL));
+  assert(gChild);
+
+  gtk_notebook_append_page(GTK_NOTEBOOK(g), gChild, NULL);
+
+  return 0;
+}
+
+
+
+static int Gtk3Gui_WStack_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+
+  g=gtk_notebook_new();
+  gtk_notebook_set_show_tabs(GTK_NOTEBOOK(g), FALSE);
+  gtk_notebook_set_show_border(GTK_NOTEBOOK(g), FALSE);
+
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WStack_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WStack_GetIntProperty);
+  GWEN_Widget_SetSetCharPropertyFn(w, Gtk3Gui_WStack_SetCharProperty);
+  GWEN_Widget_SetGetCharPropertyFn(w, Gtk3Gui_WStack_GetCharProperty);
+  GWEN_Widget_SetAddChildGuiWidgetFn(w, Gtk3Gui_WStack_AddChildGuiWidget);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_tabbook.c b/borrowed/gwengui-gtk3/w_tabbook.c
new file mode 100644
index 0000000..476f5ae
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_tabbook.c
@@ -0,0 +1,166 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WTabBook_SetIntProperty(GWEN_WIDGET *w,
+                                    GWEN_DIALOG_PROPERTY prop,
+                                    int index,
+                                    int value,
+                                    int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  case GWEN_DialogProperty_Value:
+    gtk_notebook_set_current_page(GTK_NOTEBOOK(g), value);
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WTabBook_GetIntProperty(GWEN_WIDGET *w,
+                                    GWEN_DIALOG_PROPERTY prop,
+                                    int index,
+                                    int defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+    return 0;
+
+  case GWEN_DialogProperty_Value:
+    return gtk_notebook_get_current_page(GTK_NOTEBOOK(g));
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WTabBook_SetCharProperty(GWEN_WIDGET *w,
+                                     GWEN_DIALOG_PROPERTY prop,
+                                     int index,
+                                     const char *value,
+                                     int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+static GWENHYWFAR_CB
+const char* Gtk3Gui_WTabBook_GetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WTabBook_AddChildGuiWidget(GWEN_WIDGET *w, GWEN_WIDGET *wChild) {
+  GtkWidget *g;
+  GtkWidget *gChild;
+  const char *s;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  gChild=GTK_WIDGET(GWEN_Widget_GetImplData(wChild, GTK3_DIALOG_WIDGET_REAL));
+  assert(gChild);
+
+  s=GWEN_Widget_GetText(wChild, 0);
+
+  gtk_notebook_append_page(GTK_NOTEBOOK(g), gChild, (s && *s)?gtk_label_new(s):NULL);
+
+  return 0;
+}
+
+
+
+static int Gtk3Gui_WTabBook_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+
+  g=gtk_notebook_new();
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WTabBook_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WTabBook_GetIntProperty);
+  GWEN_Widget_SetSetCharPropertyFn(w, Gtk3Gui_WTabBook_SetCharProperty);
+  GWEN_Widget_SetGetCharPropertyFn(w, Gtk3Gui_WTabBook_GetCharProperty);
+  GWEN_Widget_SetAddChildGuiWidgetFn(w, Gtk3Gui_WTabBook_AddChildGuiWidget);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_textbrowser.c b/borrowed/gwengui-gtk3/w_textbrowser.c
new file mode 100644
index 0000000..8d1393f
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_textbrowser.c
@@ -0,0 +1,230 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WTextBrowser_SetIntProperty(GWEN_WIDGET *w,
+                                        GWEN_DIALOG_PROPERTY prop,
+                                        int index,
+                                        int value,
+                                        int doSignal) {
+  GtkWidget *g;  /* text view */
+  GtkWidget *gs; /* scrollable window */
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_CONTENT));
+  assert(g);
+  gs=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(gs);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(gs), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(gs));
+    return 0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WTextBrowser_GetIntProperty(GWEN_WIDGET *w,
+                                        GWEN_DIALOG_PROPERTY prop,
+                                        int index,
+                                        int defaultValue) {
+  GtkWidget *g;  /* text view */
+  GtkWidget *gs; /* scrollable window */
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_CONTENT));
+  assert(g);
+  gs=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(gs);
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_CONTENT));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(gs))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(gs))==TRUE)?1:0;
+    return 0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WTextBrowser_SetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *value,
+    int doSignal) {
+  GtkWidget *g;  /* text view */
+  GtkWidget *gs; /* scrollable window */
+  GWEN_BUFFER *tbuf;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_CONTENT));
+  assert(g);
+  gs=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(gs);
+
+  tbuf=GWEN_Buffer_new(0, 128, 0, 1);
+  if (value && *value)
+    Gtk3Gui_GetRawText(value, tbuf);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Value: {
+    GtkTextBuffer *tb;
+    GtkAdjustment *va;
+
+    tb=gtk_text_view_get_buffer(GTK_TEXT_VIEW(g));
+    assert(tb);
+    gtk_text_buffer_set_text(tb, GWEN_Buffer_GetStart(tbuf), -1);
+
+    /* scroll to end */
+    va=gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(gs));
+    if (va)
+      gtk_adjustment_set_value(va, gtk_adjustment_get_upper(va));
+    GWEN_Buffer_free(tbuf);
+
+    return 0;
+  }
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  GWEN_Buffer_free(tbuf);
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+static GWENHYWFAR_CB
+const char* Gtk3Gui_WTextBrowser_GetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *defaultValue) {
+  GtkWidget *g;  /* text view */
+  GtkWidget *gs; /* scrollable window */
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_CONTENT));
+  assert(g);
+  gs=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(gs);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Value: {
+    GtkTextBuffer *tb;
+    GtkTextIter startIter;
+    GtkTextIter endIter;
+    gchar *s;
+
+    tb=gtk_text_view_get_buffer(GTK_TEXT_VIEW(g));
+    assert(tb);
+
+    gtk_text_buffer_get_start_iter(tb, &startIter);
+    gtk_text_buffer_get_end_iter(tb, &endIter);
+
+    s=gtk_text_buffer_get_text(tb, &startIter, &endIter, FALSE);
+    if (s) {
+      GWEN_Widget_SetText(w, GTK3_DIALOG_STRING_VALUE, s);
+      g_free(s);
+      return GWEN_Widget_GetText(w, GTK3_DIALOG_STRING_VALUE);
+    }
+    return defaultValue;
+  }
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static int Gtk3Gui_WTextBrowser_Setup(GWEN_WIDGET *w) {
+  GtkWidget *gs;
+  GtkWidget *g;
+  const char *s;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+  s=GWEN_Widget_GetText(w, 0);
+
+  /* create widget */
+  gs=gtk_scrolled_window_new(NULL, NULL);
+  g=gtk_text_view_new();
+
+  if (s && *s) {
+    GWEN_BUFFER *tbuf;
+
+    tbuf=GWEN_Buffer_new(0, 128, 0, 1);
+    Gtk3Gui_GetRawText(s, tbuf);
+    gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(g)), GWEN_Buffer_GetStart(tbuf), -1);
+    GWEN_Buffer_free(tbuf);
+  }
+
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) gs);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WTextBrowser_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WTextBrowser_GetIntProperty);
+  GWEN_Widget_SetSetCharPropertyFn(w, Gtk3Gui_WTextBrowser_SetCharProperty);
+  GWEN_Widget_SetGetCharPropertyFn(w, Gtk3Gui_WTextBrowser_GetCharProperty);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_textedit.c b/borrowed/gwengui-gtk3/w_textedit.c
new file mode 100644
index 0000000..c470586
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_textedit.c
@@ -0,0 +1,222 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WTextEdit_SetIntProperty(GWEN_WIDGET *w,
+                                     GWEN_DIALOG_PROPERTY prop,
+                                     int index,
+                                     int value,
+                                     int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WTextEdit_GetIntProperty(GWEN_WIDGET *w,
+                                     GWEN_DIALOG_PROPERTY prop,
+                                     int index,
+                                     int defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+    return 0;
+
+  case GWEN_DialogProperty_Width:
+  case GWEN_DialogProperty_Height:
+    /* just ignore these for now */
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WTextEdit_SetCharProperty(GWEN_WIDGET *w,
+                                      GWEN_DIALOG_PROPERTY prop,
+                                      int index,
+                                      const char *value,
+                                      int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Value: {
+    GtkTextBuffer *tb;
+    GtkTextIter endIter;
+
+    tb=gtk_text_view_get_buffer(GTK_TEXT_VIEW(g));
+    assert(tb);
+    if (value && *value)
+      gtk_text_buffer_set_text(tb, value, -1);
+    else
+      gtk_text_buffer_set_text(tb, "", -1);
+
+    gtk_text_buffer_get_end_iter(tb, &endIter);
+    gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(g), &endIter, 0.5, FALSE, 0.0, 0.0);
+    return 0;
+  }
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+static GWENHYWFAR_CB
+const char* Gtk3Gui_WTextEdit_GetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Value: {
+    GtkTextBuffer *tb;
+    GtkTextIter startIter;
+    GtkTextIter endIter;
+    gchar *s;
+
+    tb=gtk_text_view_get_buffer(GTK_TEXT_VIEW(g));
+    assert(tb);
+
+    gtk_text_buffer_get_start_iter(tb, &startIter);
+    gtk_text_buffer_get_end_iter(tb, &endIter);
+
+    s=gtk_text_buffer_get_text(tb, &startIter, &endIter, FALSE);
+    if (s) {
+      GWEN_Widget_SetText(w, GTK3_DIALOG_STRING_VALUE, s);
+      g_free(s);
+      return GWEN_Widget_GetText(w, GTK3_DIALOG_STRING_VALUE);
+    }
+    return defaultValue;
+  }
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static void Gtk3Gui_WTextEdit_Changed_handler(GtkTextBuffer *buffer, gpointer data) {
+  GWEN_WIDGET *w;
+  int rv;
+
+  w=data;
+  assert(w);
+  rv=GWEN_Dialog_EmitSignal(GWEN_Widget_GetDialog(w),
+                            GWEN_DialogEvent_TypeValueChanged,
+                            GWEN_Widget_GetName(w));
+  if (rv==GWEN_DialogEvent_ResultAccept)
+    Gtk3Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 1);
+  else if (rv==GWEN_DialogEvent_ResultReject)
+    Gtk3Gui_Dialog_Leave(GWEN_Widget_GetTopDialog(w), 0);
+}
+
+
+
+static int Gtk3Gui_WTextEdit_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  const char *s;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+  gulong changed_handler_id;
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+  s=GWEN_Widget_GetText(w, 0);
+
+  /* create widget */
+  g=gtk_text_view_new();
+  if (s && *s)
+    gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(g)), s, -1);
+
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WTextEdit_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WTextEdit_GetIntProperty);
+  GWEN_Widget_SetSetCharPropertyFn(w, Gtk3Gui_WTextEdit_SetCharProperty);
+  GWEN_Widget_SetGetCharPropertyFn(w, Gtk3Gui_WTextEdit_GetCharProperty);
+
+  changed_handler_id=g_signal_connect(gtk_text_view_get_buffer(GTK_TEXT_VIEW(g)),
+                                      "changed",
+                                      G_CALLBACK (Gtk3Gui_WTextEdit_Changed_handler),
+                                      w);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_vlayout.c b/borrowed/gwengui-gtk3/w_vlayout.c
new file mode 100644
index 0000000..e7431aa
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_vlayout.c
@@ -0,0 +1,161 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WVLayout_SetIntProperty(GWEN_WIDGET *w,
+                                    GWEN_DIALOG_PROPERTY prop,
+                                    int index,
+                                    int value,
+                                    int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WVLayout_GetIntProperty(GWEN_WIDGET *w,
+                                    GWEN_DIALOG_PROPERTY prop,
+                                    int index,
+                                    int defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WVLayout_SetCharProperty(GWEN_WIDGET *w,
+                                     GWEN_DIALOG_PROPERTY prop,
+                                     int index,
+                                     const char *value,
+                                     int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+static GWENHYWFAR_CB
+const char* Gtk3Gui_WVLayout_GetCharProperty(GWEN_WIDGET *w,
+    GWEN_DIALOG_PROPERTY prop,
+    int index,
+    const char *defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WVLayout_AddChildGuiWidget(GWEN_WIDGET *w, GWEN_WIDGET *wChild) {
+  GtkWidget *g;
+  GtkWidget *gChild;
+  uint32_t cflags;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  gChild=GTK_WIDGET(GWEN_Widget_GetImplData(wChild, GTK3_DIALOG_WIDGET_REAL));
+  assert(gChild);
+
+  cflags=GWEN_Widget_GetFlags(wChild);
+
+  gtk_box_pack_start(GTK_BOX(g), gChild,
+                     (cflags & GWEN_WIDGET_FLAGS_FILLY)?TRUE:FALSE,
+                     (cflags & GWEN_WIDGET_FLAGS_FILLY)?TRUE:FALSE,
+                     0);
+
+  return 0;
+}
+
+
+
+static int Gtk3Gui_WVLayout_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+
+  g=gtk_box_new(GTK_ORIENTATION_VERTICAL,
+                 GTK3_GUI_DIALOG_DEFAULT_BOX_SPACING);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WVLayout_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WVLayout_GetIntProperty);
+  GWEN_Widget_SetSetCharPropertyFn(w, Gtk3Gui_WVLayout_SetCharProperty);
+  GWEN_Widget_SetGetCharPropertyFn(w, Gtk3Gui_WVLayout_GetCharProperty);
+  GWEN_Widget_SetAddChildGuiWidgetFn(w, Gtk3Gui_WVLayout_AddChildGuiWidget);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
diff --git a/borrowed/gwengui-gtk3/w_vline.c b/borrowed/gwengui-gtk3/w_vline.c
new file mode 100644
index 0000000..256bfcf
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_vline.c
@@ -0,0 +1,98 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WVLine_SetIntProperty(GWEN_WIDGET *w,
+                                  GWEN_DIALOG_PROPERTY prop,
+                                  int index,
+                                  int value,
+                                  int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WVLine_GetIntProperty(GWEN_WIDGET *w,
+                                  GWEN_DIALOG_PROPERTY prop,
+                                  int index,
+                                  int defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static int Gtk3Gui_WVLine_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+
+  g=gtk_separator_new(GTK_ORIENTATION_VERTICAL);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WVLine_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WVLine_GetIntProperty);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
+
+
diff --git a/borrowed/gwengui-gtk3/w_vspacer.c b/borrowed/gwengui-gtk3/w_vspacer.c
new file mode 100644
index 0000000..faa7c7d
--- /dev/null
+++ b/borrowed/gwengui-gtk3/w_vspacer.c
@@ -0,0 +1,98 @@
+/***************************************************************************
+    begin       : Sun May 16 2010
+    copyright   : (C) 2010 by Martin Preuss
+    email       : martin at libchipcard.de
+
+ ***************************************************************************
+ *          Please see toplevel file COPYING for license details           *
+ ***************************************************************************/
+
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WVSpacer_SetIntProperty(GWEN_WIDGET *w,
+                                    GWEN_DIALOG_PROPERTY prop,
+                                    int index,
+                                    int value,
+                                    int doSignal) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    gtk_widget_set_sensitive(GTK_WIDGET(g), (value==0)?FALSE:TRUE);
+    return 0;
+
+  case GWEN_DialogProperty_Focus:
+    gtk_widget_grab_focus(GTK_WIDGET(g));
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return GWEN_ERROR_INVALID;
+}
+
+
+
+
+static GWENHYWFAR_CB
+int Gtk3Gui_WVSpacer_GetIntProperty(GWEN_WIDGET *w,
+                                    GWEN_DIALOG_PROPERTY prop,
+                                    int index,
+                                    int defaultValue) {
+  GtkWidget *g;
+
+  g=GTK_WIDGET(GWEN_Widget_GetImplData(w, GTK3_DIALOG_WIDGET_REAL));
+  assert(g);
+
+  switch(prop) {
+  case GWEN_DialogProperty_Enabled:
+    return (gtk_widget_get_sensitive(GTK_WIDGET(g))==TRUE)?1:0;
+
+  case GWEN_DialogProperty_Focus:
+    return (gtk_widget_has_focus(GTK_WIDGET(g))==TRUE)?1:0;
+    return 0;
+
+  default:
+    break;
+  }
+
+  DBG_WARN(GWEN_LOGDOMAIN,
+           "Function is not appropriate for this type of widget (%s)",
+           GWEN_Widget_Type_toString(GWEN_Widget_GetType(w)));
+  return defaultValue;
+}
+
+
+
+static int Gtk3Gui_WVSpacer_Setup(GWEN_WIDGET *w) {
+  GtkWidget *g;
+  uint32_t flags;
+  GWEN_WIDGET *wParent;
+
+  flags=GWEN_Widget_GetFlags(w);
+  wParent=GWEN_Widget_Tree_GetParent(w);
+
+  g=gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+  GWEN_Widget_AddFlags(w, GWEN_WIDGET_FLAGS_FILLY);
+
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_REAL, (void*) g);
+  GWEN_Widget_SetImplData(w, GTK3_DIALOG_WIDGET_CONTENT, (void*) g);
+
+  GWEN_Widget_SetSetIntPropertyFn(w, Gtk3Gui_WVSpacer_SetIntProperty);
+  GWEN_Widget_SetGetIntPropertyFn(w, Gtk3Gui_WVSpacer_GetIntProperty);
+
+  if (wParent)
+    GWEN_Widget_AddChildGuiWidget(wParent, w);
+
+  return 0;
+}
diff --git a/configure.ac b/configure.ac
index dc51a60..74e7eeb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1076,7 +1076,7 @@ then
     AC_MSG_ERROR([Could not find aqbanking >= 4.0.0. If you use --enable-aqbanking, you MUST have aqbanking installed!])
   ])
   # For libgwenhywfar > 3.99.20, look for its library gwengui-gtk2.
-  PKG_CHECK_MODULES([GWENGUI_GTK3], [gwengui-gtk3 gwenhywfar], [has_gwengui_gtk3=1], [has_gwengui_gtk2=0])
+  PKG_CHECK_MODULES([GWEN], [gwenhywfar], [has_gwen=1], [has_gwen=0])
 
   # also check for ktoblzcheck
   AC_CHECK_HEADERS(ktoblzcheck.h)
@@ -1646,6 +1646,7 @@ AC_CONFIG_FILES(
   borrowed/Makefile
   borrowed/goffice/Makefile
   borrowed/libc/Makefile
+  borrowed/gwengui-gtk3/Makefile
   common/Makefile
   common/debug/Makefile
   common/debug/valgrind/Makefile
diff --git a/gnucash/import-export/aqb/CMakeLists.txt b/gnucash/import-export/aqb/CMakeLists.txt
index 6c135f3..44c1bdf 100644
--- a/gnucash/import-export/aqb/CMakeLists.txt
+++ b/gnucash/import-export/aqb/CMakeLists.txt
@@ -56,15 +56,18 @@ IF(WITH_AQBANKING)
 
   TARGET_LINK_LIBRARIES(gncmod-aqbanking gnc-gnome gncmod-gnome-utils
          gncmod-generic-import gncmod-register-core
-         gncmod-register-gnome gncmod-ledger-core gncmod-engine
+         gncmod-register-gnome gncmod-ledger-core gncmod-engine gwengui-gtk3
          ${AQB_EXPORT_SYMBOLS} ${AQBANKING_LDFLAGS}
-         ${GWENHYWFAR_LDFLAGS} ${GWENGUI_GTK3_LDFLAGS}
+         ${GWENHYWFAR_LDFLAGS} 
          ${GNOME_LDFLAGS} ${KTOBLZCHECK_LDFLAGS} ${AQB_LIBSTDCXX})
 
   TARGET_COMPILE_DEFINITIONS(gncmod-aqbanking PRIVATE -DG_LOG_DOMAIN=\"gnc.import.aqbanking\")
 
-  TARGET_INCLUDE_DIRECTORIES(gncmod-aqbanking PRIVATE ${AQBANKING_INCLUDE_DIRS}
-         ${GWENHYWFAR_INCLUDE_DIRS} ${KTOBLZCHECK_INCLUDE_DIRS})
+  TARGET_INCLUDE_DIRECTORIES(gncmod-aqbanking PRIVATE
+    ${CMAKE_SOURCE_DIR}/borrowed/gwengui-gtk3
+    ${AQBANKING_INCLUDE_DIRS}
+    ${GWENHYWFAR_INCLUDE_DIRS}
+    ${KTOBLZCHECK_INCLUDE_DIRS})
 
   INSTALL(TARGETS gncmod-aqbanking
     LIBRARY DESTINATION lib/gnucash
diff --git a/gnucash/import-export/aqb/Makefile.am b/gnucash/import-export/aqb/Makefile.am
index 1bc3991..9463a0a 100644
--- a/gnucash/import-export/aqb/Makefile.am
+++ b/gnucash/import-export/aqb/Makefile.am
@@ -41,13 +41,14 @@ libgncmod_aqbanking_la_LIBADD = \
   ${top_builddir}/libgnucash/engine/libgncmod-engine.la \
   ${top_builddir}/libgnucash/core-utils/libgnc-core-utils.la \
   ${top_builddir}/libgnucash/gnc-module/libgnc-module.la \
+  ${top_builddir}/borrowed/gwengui-gtk3/libgwengui-gtk3.la \
   ${GTK_LIBS} \
   ${GLIB_LIBS} \
-  ${GWENGUI_GTK3_LIBS} \
   ${AQBANKING_LIBS}
 
 AM_CPPFLAGS = \
   -I${top_srcdir}/common \
+  -I${top_srcdir}/borrowed/gwengui-gtk3 \
   -I${top_srcdir}/gnucash/import-export \
   -I${top_srcdir}/gnucash/gnome \
   -I${top_srcdir}/gnucash/register/ledger-core \
diff --git a/gnucash/import-export/aqb/gnc-gwen-gui.c b/gnucash/import-export/aqb/gnc-gwen-gui.c
index c24c59d..8a7f8bb 100644
--- a/gnucash/import-export/aqb/gnc-gwen-gui.c
+++ b/gnucash/import-export/aqb/gnc-gwen-gui.c
@@ -61,7 +61,7 @@
 #define GNC_PREF_REMEMBER_PIN      "remember-pin"
 
 #ifdef USING_GWENHYWFAR_GTK3_GUI
-# include <gwen-gui-gtk3/gtk3_gui.h>
+# include <gtk3_gui.h>
 #endif
 
 /* This static indicates the debugging module that this .o belongs to.  */

commit 35752e5929ed00822da0aecaf84ca22e9b821fc4
Author: John Ralls <jralls at ceridwen.us>
Date:   Thu Aug 24 20:58:06 2017 +0100

    Conditionally modify getpassword_cb to match new signature in gwenhywfar 4.7.99.

diff --git a/gnucash/import-export/aqb/CMakeLists.txt b/gnucash/import-export/aqb/CMakeLists.txt
index 8a64933..6c135f3 100644
--- a/gnucash/import-export/aqb/CMakeLists.txt
+++ b/gnucash/import-export/aqb/CMakeLists.txt
@@ -58,7 +58,7 @@ IF(WITH_AQBANKING)
          gncmod-generic-import gncmod-register-core
          gncmod-register-gnome gncmod-ledger-core gncmod-engine
          ${AQB_EXPORT_SYMBOLS} ${AQBANKING_LDFLAGS}
-         ${GWENHYWFAR_LDFLAGS} ${GWENGUI_GTK2_LDFLAGS}
+         ${GWENHYWFAR_LDFLAGS} ${GWENGUI_GTK3_LDFLAGS}
          ${GNOME_LDFLAGS} ${KTOBLZCHECK_LDFLAGS} ${AQB_LIBSTDCXX})
 
   TARGET_COMPILE_DEFINITIONS(gncmod-aqbanking PRIVATE -DG_LOG_DOMAIN=\"gnc.import.aqbanking\")
diff --git a/gnucash/import-export/aqb/gnc-gwen-gui.c b/gnucash/import-export/aqb/gnc-gwen-gui.c
index 0a58ea7..c24c59d 100644
--- a/gnucash/import-export/aqb/gnc-gwen-gui.c
+++ b/gnucash/import-export/aqb/gnc-gwen-gui.c
@@ -34,6 +34,7 @@
 #include <glib/gi18n.h>
 #include <gwenhywfar/gui_be.h>
 #include <gwenhywfar/inherit.h>
+#include <gwenhywfar/version.h>
 
 #include "dialog-utils.h"
 #include "gnc-ab-utils.h"
@@ -195,9 +196,23 @@ static gint progress_advance_cb(GWEN_GUI *gwen_gui, uint32_t id,
 static gint progress_log_cb(GWEN_GUI *gwen_gui, guint32 id,
                             GWEN_LOGGER_LEVEL level, const gchar *text);
 static gint progress_end_cb(GWEN_GUI *gwen_gui, guint32 id);
-static gint GNC_GWENHYWFAR_CB getpassword_cb(GWEN_GUI *gwen_gui, guint32 flags, const gchar *token,
-        const gchar *title, const gchar *text, gchar *buffer,
-        gint min_len, gint max_len, guint32 guiid);
+#if GWENHYWFAR_VERSION_INT <= 41700
+static gint GNC_GWENHYWFAR_CB getpassword_cb(GWEN_GUI *gwen_gui, guint32 flags,
+                                             const gchar *token,
+                                             const gchar *title,
+                                             const gchar *text, gchar *buffer,
+                                             gint min_len, gint max_len,
+                                             guint32 guiid);
+#else
+static gint GNC_GWENHYWFAR_CB getpassword_cb(GWEN_GUI *gwen_gui, guint32 flags,
+                                             const gchar *token,
+                                             const gchar *title,
+                                             const gchar *text, gchar *buffer,
+                                             gint min_len, gint max_len,
+                                             GWEN_GUI_PASSWORD_METHOD methodId,
+                                             GWEN_DB_NODE *methodParams,
+                                             guint32 guiid);
+#endif
 static gint GNC_GWENHYWFAR_CB setpasswordstatus_cb(GWEN_GUI *gwen_gui, const gchar *token,
         const gchar *pin,
         GWEN_GUI_PASSWORD_STATUS status, guint32 guiid);
@@ -1395,9 +1410,16 @@ progress_end_cb(GWEN_GUI *gwen_gui, guint32 id)
 }
 
 static gint GNC_GWENHYWFAR_CB
+#if GWENHYWFAR_VERSION_INT <= 41700
 getpassword_cb(GWEN_GUI *gwen_gui, guint32 flags, const gchar *token,
                const gchar *title, const gchar *text, gchar *buffer,
                gint min_len, gint max_len, guint32 guiid)
+#else
+getpassword_cb(GWEN_GUI *gwen_gui, guint32 flags, const gchar *token,
+               const gchar *title, const gchar *text, gchar *buffer,
+               gint min_len, gint max_len, GWEN_GUI_PASSWORD_METHOD methodId,
+               GWEN_DB_NODE *methodParams, guint32 guiid)
+#endif
 {
     GncGWENGui *gui = GETDATA_GUI(gwen_gui);
     gchar *password = NULL;

commit 0f2719ced1261e41f2c0217d7c77bd509376d109
Author: John Ralls <jralls at ceridwen.us>
Date:   Thu Aug 24 20:56:17 2017 +0100

    Convert to libgwengui-gtk3

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6bd90a0..2800c10 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -290,7 +290,7 @@ IF (WITH_AQBANKING)
   GNC_PKG_CHECK_MODULES (GWENHYWFAR REQUIRED gwenhywfar)
   GNC_PKG_CHECK_MODULES (AQBANKING REQUIRED aqbanking)
   IF(WITH_GNUCASH)
-    GNC_PKG_CHECK_MODULES (GWENGUI_GTK2 REQUIRED gwengui-gtk2)
+    GNC_PKG_CHECK_MODULES (GWENGUI_GTK3 REQUIRED gwengui-gtk3)
     GNC_PKG_CHECK_MODULES (KTOBLZCHECK ktoblzcheck)
     IF(KTOBLZCHECK_FOUND)
       SET(HAVE_KTOBLZCHECK_H 1)
diff --git a/configure.ac b/configure.ac
index 49fa326..dc51a60 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1076,7 +1076,7 @@ then
     AC_MSG_ERROR([Could not find aqbanking >= 4.0.0. If you use --enable-aqbanking, you MUST have aqbanking installed!])
   ])
   # For libgwenhywfar > 3.99.20, look for its library gwengui-gtk2.
-  PKG_CHECK_MODULES([GWENGUI_GTK2], [gwengui-gtk2 gwenhywfar], [has_gwengui_gtk2=1], [has_gwengui_gtk2=0])
+  PKG_CHECK_MODULES([GWENGUI_GTK3], [gwengui-gtk3 gwenhywfar], [has_gwengui_gtk3=1], [has_gwengui_gtk2=0])
 
   # also check for ktoblzcheck
   AC_CHECK_HEADERS(ktoblzcheck.h)
diff --git a/gnucash/import-export/aqb/Makefile.am b/gnucash/import-export/aqb/Makefile.am
index d699d80..1bc3991 100644
--- a/gnucash/import-export/aqb/Makefile.am
+++ b/gnucash/import-export/aqb/Makefile.am
@@ -43,7 +43,7 @@ libgncmod_aqbanking_la_LIBADD = \
   ${top_builddir}/libgnucash/gnc-module/libgnc-module.la \
   ${GTK_LIBS} \
   ${GLIB_LIBS} \
-  ${GWENGUI_GTK2_LIBS} \
+  ${GWENGUI_GTK3_LIBS} \
   ${AQBANKING_LIBS}
 
 AM_CPPFLAGS = \
diff --git a/gnucash/import-export/aqb/gnc-gwen-gui.c b/gnucash/import-export/aqb/gnc-gwen-gui.c
index 6d49f18..0a58ea7 100644
--- a/gnucash/import-export/aqb/gnc-gwen-gui.c
+++ b/gnucash/import-export/aqb/gnc-gwen-gui.c
@@ -46,9 +46,9 @@
 #include "qof.h"
 
 #if GWENHYWFAR_VERSION_INT >= 39921
-/* For sufficiently new gwenhywfar (>=3.99.21) the gtk2 gui object is
+/* For sufficiently new gwenhywfar (>=3.99.21) the gtk3 gui object is
  * working fine and it is enabled here here. */
-# define USING_GWENHYWFAR_GTK2_GUI
+# define USING_GWENHYWFAR_GTK3_GUI
 # define GNC_GWENHYWFAR_CB GWENHYWFAR_CB
 #else
 # define GNC_GWENHYWFAR_CB
@@ -59,25 +59,25 @@
 #define GNC_PREF_CLOSE_ON_FINISH   "close-on-finish"
 #define GNC_PREF_REMEMBER_PIN      "remember-pin"
 
-#ifdef USING_GWENHYWFAR_GTK2_GUI
-# include <gwen-gui-gtk2/gtk2_gui.h>
+#ifdef USING_GWENHYWFAR_GTK3_GUI
+# include <gwen-gui-gtk3/gtk3_gui.h>
 #endif
 
 /* This static indicates the debugging module that this .o belongs to.  */
 static QofLogModule log_module = G_LOG_DOMAIN;
 
-/* The following block can be enabled, but the gwen-gtk2 widgets might
+/* The following block can be enabled, but the gwen-gtk3 widgets might
  * still need some work. */
-#if 0 /*#ifdef USING_GWENHYWFAR_GTK2_GUI*/
+#if 0 /*#ifdef USING_GWENHYWFAR_GTK3_GUI*/
 
-/* A GWEN_GUI implementation using gtk2 widgets  */
+/* A GWEN_GUI implementation using gtk3 widgets  */
 static GWEN_GUI *gwen_gui = NULL;
 
 void gnc_GWEN_Gui_log_init(void)
 {
     if (!gwen_gui)
     {
-        gwen_gui = Gtk2_Gui_new();
+        gwen_gui = Gtk3_Gui_new();
         GWEN_Gui_SetGui(gwen_gui);
     }
 }
@@ -291,8 +291,8 @@ gnc_GWEN_Gui_log_init(void)
     if (!log_gwen_gui)
     {
         log_gwen_gui =
-#ifdef USING_GWENHYWFAR_GTK2_GUI
-            Gtk2_Gui_new()
+#ifdef USING_GWENHYWFAR_GTK3_GUI
+            Gtk3_Gui_new()
 #else
             GWEN_Gui_new()
 #endif
@@ -461,8 +461,8 @@ register_callbacks(GncGWENGui *gui)
     ENTER("gui=%p", gui);
 
     gwen_gui =
-#ifdef USING_GWENHYWFAR_GTK2_GUI
-        Gtk2_Gui_new()
+#ifdef USING_GWENHYWFAR_GTK3_GUI
+        Gtk3_Gui_new()
 #else
         GWEN_Gui_new()
 #endif



Summary of changes:
 CMakeLists.txt                            |   1 -
 borrowed/CMakeLists.txt                   |   1 +
 borrowed/Makefile.am                      |   2 +-
 borrowed/gwengui-gtk3/CMakeLists.txt      |  56 +++
 borrowed/gwengui-gtk3/Makefile.am         |  43 +++
 borrowed/gwengui-gtk3/gtk3_gui.c          | 293 ++++++++++++++++
 borrowed/gwengui-gtk3/gtk3_gui.h          |  37 ++
 borrowed/gwengui-gtk3/gtk3_gui_dialog.c   | 551 ++++++++++++++++++++++++++++++
 borrowed/gwengui-gtk3/gtk3_gui_dialog_l.h |  51 +++
 borrowed/gwengui-gtk3/gtk3_gui_dialog_p.h |  72 ++++
 borrowed/gwengui-gtk3/gtk3_gui_p.h        |  64 ++++
 borrowed/gwengui-gtk3/gwengui-gtk3.pc.in  |  23 ++
 borrowed/gwengui-gtk3/w_checkbox.c        | 198 +++++++++++
 borrowed/gwengui-gtk3/w_combobox.c        | 294 ++++++++++++++++
 borrowed/gwengui-gtk3/w_dialog.c          | 202 +++++++++++
 borrowed/gwengui-gtk3/w_gridlayout.c      | 239 +++++++++++++
 borrowed/gwengui-gtk3/w_groupbox.c        | 195 +++++++++++
 borrowed/gwengui-gtk3/w_hlayout.c         | 164 +++++++++
 borrowed/gwengui-gtk3/w_hline.c           |  98 ++++++
 borrowed/gwengui-gtk3/w_hspacer.c         | 100 ++++++
 borrowed/gwengui-gtk3/w_image.c           | 118 +++++++
 borrowed/gwengui-gtk3/w_label.c           | 177 ++++++++++
 borrowed/gwengui-gtk3/w_lineedit.c        | 224 ++++++++++++
 borrowed/gwengui-gtk3/w_listbox.c         | 540 +++++++++++++++++++++++++++++
 borrowed/gwengui-gtk3/w_progressbar.c     | 239 +++++++++++++
 borrowed/gwengui-gtk3/w_pushbutton.c      | 218 ++++++++++++
 borrowed/gwengui-gtk3/w_radiobutton.c     | 222 ++++++++++++
 borrowed/gwengui-gtk3/w_scrollarea.c      | 192 +++++++++++
 borrowed/gwengui-gtk3/w_spinbox.c         | 215 ++++++++++++
 borrowed/gwengui-gtk3/w_stack.c           | 175 ++++++++++
 borrowed/gwengui-gtk3/w_tabbook.c         | 166 +++++++++
 borrowed/gwengui-gtk3/w_textbrowser.c     | 230 +++++++++++++
 borrowed/gwengui-gtk3/w_textedit.c        | 222 ++++++++++++
 borrowed/gwengui-gtk3/w_vlayout.c         | 161 +++++++++
 borrowed/gwengui-gtk3/w_vline.c           |  98 ++++++
 borrowed/gwengui-gtk3/w_vspacer.c         |  98 ++++++
 configure.ac                              |   3 +-
 gnucash/import-export/aqb/CMakeLists.txt  |  11 +-
 gnucash/import-export/aqb/Makefile.am     |   3 +-
 gnucash/import-export/aqb/gnc-gwen-gui.c  |  52 ++-
 40 files changed, 6025 insertions(+), 23 deletions(-)
 create mode 100644 borrowed/gwengui-gtk3/CMakeLists.txt
 create mode 100644 borrowed/gwengui-gtk3/Makefile.am
 create mode 100644 borrowed/gwengui-gtk3/gtk3_gui.c
 create mode 100644 borrowed/gwengui-gtk3/gtk3_gui.h
 create mode 100644 borrowed/gwengui-gtk3/gtk3_gui_dialog.c
 create mode 100644 borrowed/gwengui-gtk3/gtk3_gui_dialog_l.h
 create mode 100644 borrowed/gwengui-gtk3/gtk3_gui_dialog_p.h
 create mode 100644 borrowed/gwengui-gtk3/gtk3_gui_p.h
 create mode 100644 borrowed/gwengui-gtk3/gwengui-gtk3.pc.in
 create mode 100644 borrowed/gwengui-gtk3/w_checkbox.c
 create mode 100644 borrowed/gwengui-gtk3/w_combobox.c
 create mode 100644 borrowed/gwengui-gtk3/w_dialog.c
 create mode 100644 borrowed/gwengui-gtk3/w_gridlayout.c
 create mode 100644 borrowed/gwengui-gtk3/w_groupbox.c
 create mode 100644 borrowed/gwengui-gtk3/w_hlayout.c
 create mode 100644 borrowed/gwengui-gtk3/w_hline.c
 create mode 100644 borrowed/gwengui-gtk3/w_hspacer.c
 create mode 100644 borrowed/gwengui-gtk3/w_image.c
 create mode 100644 borrowed/gwengui-gtk3/w_label.c
 create mode 100644 borrowed/gwengui-gtk3/w_lineedit.c
 create mode 100644 borrowed/gwengui-gtk3/w_listbox.c
 create mode 100644 borrowed/gwengui-gtk3/w_progressbar.c
 create mode 100644 borrowed/gwengui-gtk3/w_pushbutton.c
 create mode 100644 borrowed/gwengui-gtk3/w_radiobutton.c
 create mode 100644 borrowed/gwengui-gtk3/w_scrollarea.c
 create mode 100644 borrowed/gwengui-gtk3/w_spinbox.c
 create mode 100644 borrowed/gwengui-gtk3/w_stack.c
 create mode 100644 borrowed/gwengui-gtk3/w_tabbook.c
 create mode 100644 borrowed/gwengui-gtk3/w_textbrowser.c
 create mode 100644 borrowed/gwengui-gtk3/w_textedit.c
 create mode 100644 borrowed/gwengui-gtk3/w_vlayout.c
 create mode 100644 borrowed/gwengui-gtk3/w_vline.c
 create mode 100644 borrowed/gwengui-gtk3/w_vspacer.c



More information about the gnucash-changes mailing list