kwo pushed a commit to branch master.

commit 6b2567ba8fddec5a1a10aeb9ee4a678eade23be9
Author: Kim Woelders <[email protected]>
Date:   Sat Mar 16 12:55:45 2013 +0100

    Remove gtk1 support, add (mostly working) gtk3 support.
    
    Default is still gtk2.
    
    Gtk3 seems to require quite a lot more memory (twice what is used by
    gtk2 ?!?). It also feels a lot slower.
---
 Makefile.am  |   6 +-
 configure.ac |  42 ++--
 e16keyedit.h |  38 ++++
 ipc.c        | 129 ++++++-------
 ipc.h        |   5 -
 menus.c      |  26 ++-
 menus.h      |   6 -
 viewer.c     | 616 +++++++++++++++++++++++++++++++++++++++--------------------
 viewer.h     |   4 -
 9 files changed, 539 insertions(+), 333 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 5a70b37..39634e1 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -2,8 +2,8 @@ AUTOMAKE_OPTIONS=foreign
 
 bin_PROGRAMS = e16keyedit
 
-e16keyedit_SOURCES = ipc.c ipc.h menus.c menus.h viewer.c viewer.h
+e16keyedit_SOURCES = ipc.c menus.c viewer.c e16keyedit.h
 
-CPPFLAGS = -D DATADIR=\"$(datadir)\"
+CPPFLAGS = -D DATADIR=\"$(datadir)\" $(GTK_CFLAGS)
 
-LDADD = $(X_LIBS) -lX11
+LDADD = $(GTK_LIBS) $(X_LIBS) -lX11
diff --git a/configure.ac b/configure.ac
index 2346ad7..731cecf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -14,27 +14,31 @@ AC_PROG_INSTALL
 AC_PROG_LN_S
 AC_PROG_MAKE_SET
 
+PKG_PROG_PKG_CONFIG
+
 dnl Checks for libraries.
-AC_ARG_ENABLE(gtk2,
-       [AC_HELP_STRING([--enable-gtk2],[enable gtk2 GUI (instead of GTK1) 
[default=yes]])],,
-       [enable_gtk2=yes])
-
-if test "x$enable_gtk2" = "xyes" ; then
-       pkg_modules="gtk+-2.0 >= 2.0.0"
-       PKG_CHECK_MODULES(PACKAGE, [$pkg_modules])
-       CFLAGS="$CFLAGS $PACKAGE_CFLAGS"
-       LIBS="$LIBS $PACKAGE_LIBS"
-       AC_DEFINE(ENABLE_GTK2, , [Define to enable gtk2 support])
-else
-       if ! gtk-config --version &> /dev/null ; then
-               AC_MSG_ERROR([Gtk+ is required.])
-       else
-               CFLAGS="$CFLAGS `gtk-config --cflags`"
-               LIBS="$LIBS `gtk-config --libs`"
-       fi
-fi
+AC_ARG_WITH(gtk,
+  [  --with-gtk              Select GTK version to use (auto/gtk2/gtk3) 
@<:@default=auto@:>@],,
+  with_gtk=auto)
+
+test_gtk="$with_gtk"
+if test "x$with_gtk" = "xauto" ; then test_gtk="gtk2"; fi
+
+if test "x$test_gtk" = "xgtk2" ; then
+  AC_MSG_CHECKING([for GTK2]);
+  pkg_modules="gtk+-2.0 >= 2.0.0"
+  PKG_CHECK_MODULES(GTK, [$pkg_modules],,
+                   [if test "x$with_gtk" = "xauto" ; then test_gtk="gtk3"; fi])
 
-AC_SUBST(ENABLE_GTK2)
+fi
+if test "x$test_gtk" = "xgtk3" ; then
+  AC_MSG_CHECKING([for GTK3]);
+  pkg_modules="gtk+-3.0 >= 3.0.0"
+  PKG_CHECK_MODULES(GTK, [$pkg_modules])
+fi
+if test "x$GTK_CFLAGS" = "x" ; then
+  AC_MSG_ERROR([GTK 2 or 3 is required.])
+fi
 
 dnl Checks for header files.
 AC_PATH_X
diff --git a/e16keyedit.h b/e16keyedit.h
new file mode 100644
index 0000000..efd28d7
--- /dev/null
+++ b/e16keyedit.h
@@ -0,0 +1,38 @@
+#ifndef _E16KEYEDIT_H_
+#define _E16KEYEDIT_H_
+
+#if __GNUC__                   /* FIXME - Use autofoo */
+#define __UNUSED__ __attribute__((unused))
+#else
+#define __UNUSED__
+#endif
+
+#if GTK_CHECK_VERSION(3,0,0)
+#define USE_GTK 3
+
+#define gtk_hbox_new(homogeneous, spacing) \
+       gtk_box_new(GTK_ORIENTATION_HORIZONTAL, spacing)
+#define gtk_vbox_new(homogeneous, spacing) \
+       gtk_box_new(GTK_ORIENTATION_VERTICAL, spacing)
+
+#else
+#define USE_GTK 2
+#endif
+
+/* ipc.c */
+extern gint         CommsInit(void (*msg_receive_func) (gchar * msg));
+extern void         CommsSend(const gchar * s);
+
+/* menus.c */
+extern GtkWidget   *CreateBarSubMenu(GtkWidget * menu, const char *szName);
+extern GtkWidget   *CreateRightAlignBarSubMenu(GtkWidget * menu,
+                                              const char *szName);
+extern GtkWidget   *CreateMenuItem(GtkWidget * menu, const char *szName,
+                                  const char *szAccel, const char *szTip,
+                                  GCallback func, const void *data);
+
+/* viewer.c */
+extern GtkAccelGroup *accel_group;
+void                on_exit_application(void);
+
+#endif /* _E16KEYEDIT_H_ */
diff --git a/ipc.c b/ipc.c
index 6ab2cad..02ebb9c 100644
--- a/ipc.c
+++ b/ipc.c
@@ -8,8 +8,11 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
-#include "ipc.h"
-#include "viewer.h"
+
+#include "e16keyedit.h"
+
+#define gdk_window_foreign_new(xwin) \
+       gdk_x11_window_foreign_new_for_display(gdk_display_get_default(), xwin)
 
 typedef struct _client
 {
@@ -41,8 +44,8 @@ static Window       CommsFindCommsWindow(void);
 static gchar       *CommsGet(Client ** c, XEvent * ev);
 static Client      *MakeClient(Window win);
 static void         ListFreeClient(void *ptr);
-extern gchar        in_init;
-extern gint         gdk_error_warnings;
+static gchar        in_init = 0;
+static gint         gdk_error_warnings;
 
 gint
 CommsInit(void      (*msg_receive_func) (gchar * msg))
@@ -53,6 +56,9 @@ CommsInit(void      (*msg_receive_func) (gchar * msg))
 
    CommsSetup();
    comms_win = win = CommsFindCommsWindow();
+   if (win == None)
+      return 1;
+
    cl = MakeClient(win);
    g_snprintf(st, sizeof(st), "%8x", (int)win);
    cl->name = g_strdup(st);
@@ -61,10 +67,10 @@ CommsInit(void      (*msg_receive_func) (gchar * msg))
    gdk_window_add_filter(gdkwin, CommsFilter, NULL);
    gdkwin2 = gdk_window_foreign_new(my_win);
    gdk_window_add_filter(gdkwin2, CommsFilter, NULL);
-   XSelectInput(GDK_DISPLAY(), win,
-               StructureNotifyMask | SubstructureNotifyMask);
+   gdk_window_set_events(gdkwin, GDK_STRUCTURE_MASK);
    msg_receive_callback = msg_receive_func;
-   return 1;
+
+   return 0;
 }
 
 void
@@ -80,8 +86,10 @@ CommsSend(const gchar * s)
    if ((!s) || (!c))
       return;
    len = strlen(s);
+
    if (!a)
-      a = XInternAtom(GDK_DISPLAY(), "ENL_MSG", True);
+      a = gdk_x11_get_xatom_by_name("ENL_MSG");
+
    ev.xclient.type = ClientMessage;
    ev.xclient.serial = 0;
    ev.xclient.send_event = True;
@@ -101,13 +109,15 @@ CommsSend(const gchar * s)
        ss[20] = 0;
        for (k = 0; k < 20; k++)
           ev.xclient.data.b[k] = ss[k];
-       XSendEvent(GDK_DISPLAY(), c->win, False, 0, (XEvent *) & ev);
+       XSendEvent(gdk_x11_get_default_xdisplay(), c->win, False, 0,
+                  (XEvent *) & ev);
      }
-   return;
+   XFlush(gdk_x11_get_default_xdisplay());
 }
 
 static              GdkFilterReturn
-CommsFilter(GdkXEvent * gdk_xevent, GdkEvent * event, gpointer data)
+CommsFilter(GdkXEvent * gdk_xevent, GdkEvent * event __UNUSED__,
+           gpointer data __UNUSED__)
 {
    XEvent             *xevent;
    gchar              *msg = NULL;
@@ -117,7 +127,8 @@ CommsFilter(GdkXEvent * gdk_xevent, GdkEvent * event, 
gpointer data)
    data = NULL;
 
    if (!a)
-      a = XInternAtom(GDK_DISPLAY(), "ENL_MSG", True);
+      a = gdk_x11_get_xatom_by_name("ENL_MSG");
+
    xevent = (XEvent *) gdk_xevent;
    switch (xevent->type)
      {
@@ -140,12 +151,10 @@ CommsFilter(GdkXEvent * gdk_xevent, GdkEvent * event, 
gpointer data)
                            g_snprintf(st, sizeof(st), "%8x", (int)comms_win);
                            e_client->name = g_strdup(st);
                            if (gdkwin)
-                              gdk_window_unref(gdkwin);
+                              g_object_unref(gdkwin);
                            gdkwin = gdk_window_foreign_new(comms_win);
                            gdk_window_add_filter(gdkwin, CommsFilter, NULL);
-                           XSelectInput(GDK_DISPLAY(), comms_win,
-                                        StructureNotifyMask |
-                                        SubstructureNotifyMask);
+                           gdk_window_set_events(gdkwin, GDK_STRUCTURE_MASK);
                         }
                       sleep(1);
                    }
@@ -155,12 +164,8 @@ CommsFilter(GdkXEvent * gdk_xevent, GdkEvent * event, 
gpointer data)
                  GtkWidget          *win, *label, *align, *frame, *button,
                     *vbox;
 
-#ifdef ENABLE_GTK2
                  win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-#else
-                 win = gtk_window_new(GTK_WINDOW_DIALOG);
-#endif
-                 gtk_window_set_policy(GTK_WINDOW(win), 0, 0, 1);
+                 gtk_window_set_resizable(GTK_WINDOW(win), FALSE);
                  gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER);
                  frame = gtk_frame_new(NULL);
                  gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT);
@@ -168,9 +173,8 @@ CommsFilter(GdkXEvent * gdk_xevent, GdkEvent * event, 
gpointer data)
                  gtk_container_set_border_width(GTK_CONTAINER(align), 32);
                  vbox = gtk_vbox_new(FALSE, 5);
                  button = gtk_button_new_with_label("Bye bye!");
-                 gtk_signal_connect(GTK_OBJECT(button), "clicked",
-                                    GTK_SIGNAL_FUNC(on_exit_application),
-                                    NULL);
+                 g_signal_connect(G_OBJECT(button), "clicked",
+                                  on_exit_application, NULL);
                  label =
                     gtk_label_new("EEEEEEEEEEEEEEK! HELP! HEEEEEEEEEELP!\n"
                                   "\n" "Enlightenemnt dissapeared on me!\n"
@@ -192,10 +196,12 @@ CommsFilter(GdkXEvent * gdk_xevent, GdkEvent * event, 
gpointer data)
          }
        else
          {
+#if USE_GTK == 0               /* Needed? */
             gdk_window_destroy_notify(((GdkEventAny *) event)->window);
+#endif
          }
-       return GDK_FILTER_REMOVE;
        break;
+
      case ClientMessage:
        if (xevent->xclient.message_type != a)
           return GDK_FILTER_CONTINUE;
@@ -205,11 +211,11 @@ CommsFilter(GdkXEvent * gdk_xevent, GdkEvent * event, 
gpointer data)
             if (msg_receive_callback)
                (*msg_receive_callback) (msg);
             g_free(msg);
-            return GDK_FILTER_REMOVE;
          }
        break;
+
      default:
-       return GDK_FILTER_REMOVE;
+       break;
      }
    return GDK_FILTER_REMOVE;
 }
@@ -222,7 +228,7 @@ CommsSetup(void)
    str = getenv("ENL_WM_ROOT");
    root_win = (str) ? strtoul(str, NULL, 0) : GDK_ROOT_WINDOW();
 
-   my_win = XCreateSimpleWindow(GDK_DISPLAY(), root_win,
+   my_win = XCreateSimpleWindow(gdk_x11_get_default_xdisplay(), root_win,
                                -100, -100, 5, 5, 0, 0, 0);
 }
 
@@ -238,12 +244,13 @@ CommsFindCommsWindow(void)
    int                 dint;
    unsigned int        duint;
 
-   a = XInternAtom(GDK_DISPLAY(), "ENLIGHTENMENT_COMMS", True);
+   a = gdk_x11_get_xatom_by_name("ENLIGHTENMENT_COMMS");
    if (a != None)
      {
        s = NULL;
-       XGetWindowProperty(GDK_DISPLAY(), root_win, a, 0, 14, False,
-                          AnyPropertyType, &ar, &format, &num, &after, &s);
+       XGetWindowProperty(gdk_x11_get_default_xdisplay(), root_win, a, 0, 14,
+                          False, AnyPropertyType, &ar, &format, &num, &after,
+                          &s);
        if (s)
          {
             sscanf((char *)s, "%*s %x", (unsigned int *)&win);
@@ -255,17 +262,18 @@ CommsFindCommsWindow(void)
 
             p = gdk_error_warnings;
             gdk_error_warnings = 0;
-            if (!XGetGeometry(GDK_DISPLAY(), win, &rt, &dint, &dint,
-                              &duint, &duint, &duint, &duint))
+            if (!XGetGeometry
+                (gdk_x11_get_default_xdisplay(), win, &rt, &dint, &dint,
+                 &duint, &duint, &duint, &duint))
                win = 0;
             gdk_flush();
             gdk_error_warnings = p;
             s = NULL;
             if (win)
               {
-                 XGetWindowProperty(GDK_DISPLAY(), win, a, 0, 14, False,
-                                    AnyPropertyType, &ar, &format, &num,
-                                    &after, &s);
+                 XGetWindowProperty(gdk_x11_get_default_xdisplay(), win, a, 0,
+                                    14, False, AnyPropertyType, &ar, &format,
+                                    &num, &after, &s);
                  if (s)
                     XFree(s);
                  else
@@ -286,7 +294,8 @@ CommsGet(Client ** c, XEvent * ev)
    static Atom         a;
 
    if (!a)
-      a = XInternAtom(GDK_DISPLAY(), "ENL_MSG", True);
+      a = gdk_x11_get_xatom_by_name("ENL_MSG");
+
    if ((!ev) || (!c))
       return (NULL);
    if (ev->type != ClientMessage)
@@ -334,20 +343,10 @@ MakeClient(Window win)
 {
    Client             *c;
 
-   c = g_malloc(sizeof(Client));
-   if (!c)
-      return (NULL);
-   c->name = NULL;
-   c->win = win;
-   c->msg = NULL;
-   c->clientname = NULL;
-   c->version = NULL;
-   c->author = NULL;
-   c->email = NULL;
-   c->web = NULL;
-   c->address = NULL;
-   c->info = NULL;
-   return (c);
+   c = g_malloc0(sizeof(Client));
+   if (c)
+      c->win = win;
+   return c;
 }
 
 static void
@@ -358,24 +357,14 @@ ListFreeClient(void *ptr)
    c = (Client *) ptr;
    if (!c)
       return;
-   if (c->name)
-      g_free(c->name);
-   if (c->msg)
-      g_free(c->msg);
-   if (c->clientname)
-      g_free(c->clientname);
-   if (c->version)
-      g_free(c->version);
-   if (c->author)
-      g_free(c->author);
-   if (c->email)
-      g_free(c->email);
-   if (c->web)
-      g_free(c->web);
-   if (c->address)
-      g_free(c->address);
-   if (c->info)
-      g_free(c->info);
+   g_free(c->name);
+   g_free(c->msg);
+   g_free(c->clientname);
+   g_free(c->version);
+   g_free(c->author);
+   g_free(c->email);
+   g_free(c->web);
+   g_free(c->address);
+   g_free(c->info);
    g_free(c);
-   return;
 }
diff --git a/ipc.h b/ipc.h
deleted file mode 100644
index 3fb3a7e..0000000
--- a/ipc.h
+++ /dev/null
@@ -1,5 +0,0 @@
-gint                CommsInit(void (*msg_receive_func) (gchar * msg));
-void                CommsSend(const gchar * s);
-
-gchar               in_init;
-gint                gdk_error_warnings;
diff --git a/menus.c b/menus.c
index 4538656..e7e5e03 100644
--- a/menus.c
+++ b/menus.c
@@ -8,8 +8,7 @@
 #include <gdk/gdkkeysyms.h>
 #include <gtk/gtk.h>
 
-#include "menus.h"
-#include "viewer.h"
+#include "e16keyedit.h"
 
 GtkWidget          *
 CreateBarSubMenu(GtkWidget * menu, const char *szName)
@@ -18,13 +17,12 @@ CreateBarSubMenu(GtkWidget * menu, const char *szName)
    GtkWidget          *submenu;
 
    menuitem = gtk_menu_item_new_with_label(szName);
-   gtk_menu_bar_append(GTK_MENU_BAR(menu), menuitem);
+   gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
    gtk_widget_show(menuitem);
    submenu = gtk_menu_new();
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu);
 
    return submenu;
-
 }
 
 GtkWidget          *
@@ -34,19 +32,20 @@ CreateRightAlignBarSubMenu(GtkWidget * menu, const char 
*szName)
    GtkWidget          *submenu;
 
    menuitem = gtk_menu_item_new_with_label(szName);
+#if USE_GTK == 2
    gtk_menu_item_right_justify(GTK_MENU_ITEM(menuitem));
-   gtk_menu_bar_append(GTK_MENU_BAR(menu), menuitem);
+#endif
+   gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
    gtk_widget_show(menuitem);
    submenu = gtk_menu_new();
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), submenu);
 
    return submenu;
-
 }
 
 GtkWidget          *
 CreateMenuItem(GtkWidget * menu, const char *szName, const char *szAccel,
-              const char *szTip, GtkSignalFunc func, const void *data)
+              const char *szTip, GCallback func, const void *data)
 {
    GtkWidget          *menuitem;
 
@@ -54,15 +53,15 @@ CreateMenuItem(GtkWidget * menu, const char *szName, const 
char *szAccel,
      {
        menuitem = gtk_menu_item_new_with_label(szName);
        if (func)
-          gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
-                             GTK_SIGNAL_FUNC(func), (gpointer) data);
+          g_signal_connect(G_OBJECT(menuitem), "activate", func,
+                           (gpointer) data);
      }
    else
      {
        menuitem = gtk_menu_item_new();
      }
 
-   gtk_menu_append(GTK_MENU(menu), menuitem);
+   gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
    gtk_widget_show(menuitem);
 
    if (szAccel && szAccel[0] == '^')
@@ -72,11 +71,8 @@ CreateMenuItem(GtkWidget * menu, const char *szName, const 
char *szAccel,
                                   GTK_ACCEL_VISIBLE);
      }
 
-   if (szTip && strlen(szTip))
-     {
-       gtk_tooltips_set_tip(tooltips, menuitem, szTip, NULL);
-     }
+   if (szTip && *szTip)
+      gtk_widget_set_tooltip_text(menuitem, szTip);
 
    return menuitem;
-
 }
diff --git a/menus.h b/menus.h
deleted file mode 100644
index 2a32ade..0000000
--- a/menus.h
+++ /dev/null
@@ -1,6 +0,0 @@
-GtkWidget          *CreateBarSubMenu(GtkWidget * menu, const char *szName);
-GtkWidget          *CreateRightAlignBarSubMenu(GtkWidget * menu,
-                                              const char *szName);
-GtkWidget          *CreateMenuItem(GtkWidget * menu, const char *szName,
-                                  const char *szAccel, const char *szTip,
-                                  GtkSignalFunc func, const void *data);
diff --git a/viewer.c b/viewer.c
index a44866b..5c95273 100644
--- a/viewer.c
+++ b/viewer.c
@@ -2,6 +2,7 @@
 
 #include <gtk/gtk.h>
 #include <ctype.h>
+#include <locale.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -11,22 +12,22 @@
 #include <gdk/gdkx.h>
 #include <unistd.h>
 
-#include "viewer.h"
-#include "menus.h"
-#include "ipc.h"
+#include "e16keyedit.h"
 
-#if __GNUC__                   /* FIXME - Use autofoo */
-#define __UNUSED__ __attribute__((unused))
+#if USE_GTK == 3
+#define USE_GTK_TREEVIEW 1
 #else
-#define __UNUSED__
+#define USE_GTK_TREEVIEW 1
+#endif
+#if !USE_GTK_TREEVIEW
+#define ENABLE_SORTING 1
 #endif
 
 #define DEBUG 0
 
 #define VER(maj, min, mic) (10000 * (maj) + 100 * (min) + (mic))
 
-extern GtkTooltips *tooltips;
-extern GtkAccelGroup *accel_group;
+GtkAccelGroup      *accel_group;
 
 static GtkWidget   *clist;
 static GtkWidget   *act_key;
@@ -219,13 +220,68 @@ mod_short_to_index(const char *name_short)
    return 0;                   /* Discard modifier */
 }
 
+#if USE_GTK_TREEVIEW
+static int
+clist_sel_row_get(GtkTreeSelection * sel)
+{
+   int                 row, *rows;
+   GtkTreeIter         iter;
+   GtkTreeModel       *model;
+   GtkTreePath        *path;
+
+   row = -1;
+   if (gtk_tree_selection_get_selected(sel, &model, &iter))
+     {
+       path = gtk_tree_model_get_path(model, &iter);
+       rows = gtk_tree_path_get_indices(path);
+       row = rows[0];
+     }
+
+   return row;
+}
+#endif
+
+static void
+clist_row_current_set_value(GtkWidget * widget, int col, const char *txt)
+{
+#if USE_GTK_TREEVIEW
+   GtkTreeSelection   *sel;
+   GtkTreeModel       *model;
+   GtkTreeIter         iter;
+
+   sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+   if (gtk_tree_selection_get_selected(sel, &model, &iter))
+      gtk_list_store_set(GTK_LIST_STORE(model), &iter, col, txt, -1);
+#else
+   gtk_clist_set_text(GTK_CLIST(widget), last_row, col, txt);
+#endif
+}
+
+static void
+clist_row_moveto(GtkWidget * widget, int row)
+{
+#if USE_GTK_TREEVIEW
+   GtkTreeSelection   *sel;
+   GtkTreePath        *path;
+
+   sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+   path = gtk_tree_path_new_from_indices(row, -1);
+   gtk_tree_selection_select_path(sel, path);
+   gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(widget), path, NULL, FALSE, .5,
+                               .5);
+   gtk_tree_path_free(path);
+#else
+   gtk_clist_select_row(GTK_CLIST(widget), row, 0);
+   gtk_clist_moveto(GTK_CLIST(widget), row, 0, 0.5, 0.5);
+#endif
+}
+
 static void
 e_cb_key_change(GtkWidget * widget __UNUSED__, gpointer data __UNUSED__)
 {
    GtkWidget          *win, *label, *frame, *align;
 
    win = gtk_window_new(GTK_WINDOW_POPUP);
-   gtk_window_set_policy(GTK_WINDOW(win), 0, 0, 1);
    gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_MOUSE);
    frame = gtk_frame_new(NULL);
    gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT);
@@ -248,72 +304,96 @@ e_cb_key_change(GtkWidget * widget __UNUSED__, gpointer 
data __UNUSED__)
       char               *key;
       XEvent              ev;
 
-      gdk_window_set_events(win->window, GDK_KEY_PRESS_MASK);
-      XSetInputFocus(GDK_DISPLAY(), GDK_WINDOW_XWINDOW(win->window),
+#define WIDGET_XID(widget) GDK_WINDOW_XID(gtk_widget_get_window(widget))
+      gdk_window_set_events(gtk_widget_get_window(win), GDK_KEY_PRESS_MASK);
+      XGrabKeyboard(gdk_x11_get_default_xdisplay(), WIDGET_XID(win),
+                   False, GrabModeAsync, GrabModeAsync, CurrentTime);
+      XSetInputFocus(gdk_x11_get_default_xdisplay(), WIDGET_XID(win),
                     RevertToPointerRoot, CurrentTime);
-      gdk_keyboard_grab(win->window, TRUE, CurrentTime);
-      XWindowEvent(GDK_DISPLAY(), GDK_WINDOW_XWINDOW(win->window),
+      XWindowEvent(gdk_x11_get_default_xdisplay(), WIDGET_XID(win),
                   KeyPressMask, &ev);
-#ifdef ENABLE_GTK2
-      gdk_keyboard_ungrab(GDK_CURRENT_TIME);
-#else
-      gdk_keyboard_ungrab(gdk_time_get());
-#endif
-      key = XKeysymToString(XkbKeycodeToKeysym(GDK_DISPLAY(),
-                                            ev.xkey.keycode, 0, 0));
+      XUngrabKeyboard(gdk_x11_get_default_xdisplay(), CurrentTime);
+      key = XKeysymToString(XkbKeycodeToKeysym(gdk_x11_get_default_xdisplay(),
+                                              ev.xkey.keycode, 0, 0));
       gtk_entry_set_text(GTK_ENTRY(act_key), key);
-      gtk_clist_set_text(GTK_CLIST(clist), last_row, 1, key);
+      clist_row_current_set_value(clist, 1, key);
    }
 
    gtk_widget_destroy(win);
 }
 
 static void
-e_cb_modifier(GtkWidget * widget __UNUSED__, gpointer data)
+e_cb_modifier(GtkWidget * widget, gpointer data __UNUSED__)
 {
-   gint                value;
+   int                 i;
 
-   value = (gint) (glong) data;
-   gtk_clist_set_text(GTK_CLIST(clist), last_row, 0, MOD_TEXT(value));
+   if (dont_update)
+      return;
+
+   i = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
+   clist_row_current_set_value(clist, 0, MOD_TEXT(i));
 }
 
 static gchar       *
 wait_for_ipc_msg(void)
 {
-   gtk_main();
+   e_ipc_msg = NULL;
+   do
+     {
+       gtk_main_iteration();
+     }
+   while (!e_ipc_msg);
+
    return e_ipc_msg;
 }
 
+#if USE_GTK_TREEVIEW
+static void
+change_action(GtkTreeSelection * sel, gpointer data __UNUSED__)
+#else
 static void
 change_action(GtkWidget * my_clist __UNUSED__, gint row, gint column 
__UNUSED__,
              GdkEventButton * event __UNUSED__, gpointer data __UNUSED__)
+#endif
 {
    int                 k;
 
    if (dont_update)
       return;
 
+#if USE_GTK_TREEVIEW
+   int                 row;
+
+   row = clist_sel_row_get(sel);
+#endif
+
+   if (row < 0)
+      return;
+
    k = action_row_to_index[row];
 
    if (actions[k].param_tpe != 0)
      {
-       gtk_entry_set_editable(GTK_ENTRY(act_params), TRUE);
+       gtk_editable_set_editable(GTK_EDITABLE(act_params), TRUE);
        gtk_widget_set_sensitive(act_params, TRUE);
      }
    else
      {
-       gtk_entry_set_editable(GTK_ENTRY(act_params), FALSE);
+       gtk_editable_set_editable(GTK_EDITABLE(act_params), FALSE);
        gtk_widget_set_sensitive(act_params, FALSE);
        gtk_entry_set_text(GTK_ENTRY(act_params), "");
      }
 
+   dont_update = 1;
    if (actions[k].command)
       gtk_entry_set_text(GTK_ENTRY(act_params), actions[k].command);
    else
       gtk_entry_set_text(GTK_ENTRY(act_params), "* Not available *");
-   gtk_clist_set_text(GTK_CLIST(clist), last_row, 2, actions[k].text);
-   gtk_clist_set_text(GTK_CLIST(clist), last_row, 3,
-                     gtk_entry_get_text(GTK_ENTRY(act_params)));
+   dont_update = 0;
+
+   clist_row_current_set_value(clist, 2, actions[k].text);
+   clist_row_current_set_value(clist, 3,
+                              gtk_entry_get_text(GTK_ENTRY(act_params)));
 }
 
 static char        *
@@ -335,23 +415,39 @@ dupcat(char *dst, const char *src)
 }
 
 static void
-on_save_data(GtkWidget * widget __UNUSED__, gpointer data __UNUSED__)
+on_save_data(void)
 {
    char               *buf = NULL;
-   int                 i;
 
    buf = dupcat(buf, "ac kb set\nAclass KEYBINDINGS global\n");
 
+#if USE_GTK_TREEVIEW
+   GtkTreeModel       *model;
+   GtkTreeIter         iter;
+   gboolean            ok;
+
+   model = gtk_tree_view_get_model(GTK_TREE_VIEW(clist));
+   for (ok = gtk_tree_model_get_iter_first(model, &iter); ok;
+       ok = gtk_tree_model_iter_next(model, &iter))
+#else
+   int                 i;
+
    for (i = 0; i < real_rows; i++)
+#endif
      {
        char                tmp[1024];
-       char               *params;
-       char               *key;
-       char               *mod;
+       char               *mod, *key, *prm;
        int                 modifier = 0;
        int                 j;
 
+#if USE_GTK_TREEVIEW
+       gtk_tree_model_get(model, &iter, 0, &mod, 1, &key, 3, &prm, -1);
+#else
        gtk_clist_get_text(GTK_CLIST(clist), i, 0, &mod);
+       gtk_clist_get_text(GTK_CLIST(clist), i, 1, &key);
+       gtk_clist_get_text(GTK_CLIST(clist), i, 3, &prm);
+#endif
+
        for (j = 0; j < 21; j++)
          {
             if (!strcmp(MOD_TEXT(j), mod))
@@ -359,11 +455,8 @@ on_save_data(GtkWidget * widget __UNUSED__, gpointer data 
__UNUSED__)
                  modifier = j;
               }
          }
-       gtk_clist_get_text(GTK_CLIST(clist), i, 1, &key);
-       gtk_clist_get_text(GTK_CLIST(clist), i, 3, &params);
-
        snprintf(tmp, sizeof(tmp), "%s %s %s %s\n", "KeyDown",
-                modifiers[modifier].name_short, key, params);
+                modifiers[modifier].name_short, key, prm);
        buf = dupcat(buf, tmp);
      }
 
@@ -377,57 +470,80 @@ on_save_data(GtkWidget * widget __UNUSED__, gpointer data 
__UNUSED__)
    free(buf);
 }
 
+#if USE_GTK_TREEVIEW
+static void
+selection_made(GtkTreeSelection * sel, gpointer data __UNUSED__)
+#else
 static void
 selection_made(GtkWidget * my_clist __UNUSED__, gint row,
               gint column __UNUSED__, GdkEventButton * event __UNUSED__,
               gpointer data __UNUSED__)
+#endif
 {
-   gchar              *modstring;
-   gchar              *keyused;
-   gchar              *actperform;
-   gchar              *paramsused;
+   gchar              *mod, *key, *act, *prm;
    int                 i;
 
+#if USE_GTK_TREEVIEW
+   int                 row;
+
+   row = clist_sel_row_get(sel);
+#endif
+
+   if (row < 0)
+      return;
+
    dont_update = 1;
 
-   gtk_clist_get_text(GTK_CLIST(clist), row, 0, &modstring);
-   gtk_option_menu_set_history(GTK_OPTION_MENU(act_mod), 0);
-   for (i = 1; i < 21; i++)
+#if USE_GTK_TREEVIEW
+   GtkTreeIter         iter;
+   GtkTreeModel       *model;
+
+   if (gtk_tree_selection_get_selected(sel, &model, &iter))
      {
-       if (!strcmp(MOD_TEXT(i), modstring))
-         {
-            gtk_option_menu_set_history(GTK_OPTION_MENU(act_mod), i);
-         }
+       gtk_tree_model_get(model, &iter,
+                          0, &mod, 1, &key, 2, &act, 3, &prm, -1);
      }
+#else
+   gtk_clist_get_text(GTK_CLIST(clist), row, 0, &mod);
+   gtk_clist_get_text(GTK_CLIST(clist), row, 1, &key);
+   gtk_clist_get_text(GTK_CLIST(clist), row, 2, &act);
+   gtk_clist_get_text(GTK_CLIST(clist), row, 3, &prm);
+#endif
 
-   gtk_clist_get_text(GTK_CLIST(clist), row, 1, &keyused);
-   gtk_entry_set_text(GTK_ENTRY(act_key), keyused);
-
-   gtk_clist_get_text(GTK_CLIST(clist), row, 2, &actperform);
-
-   gtk_clist_get_text(GTK_CLIST(clist), row, 3, &paramsused);
-   gtk_entry_set_text(GTK_ENTRY(act_params), paramsused);
+   for (i = 0; i < 21; i++)
+     {
+       if (!strcmp(MOD_TEXT(i), mod))
+          gtk_combo_box_set_active(GTK_COMBO_BOX(act_mod), i);
+     }
+   gtk_entry_set_text(GTK_ENTRY(act_key), key);
+   gtk_entry_set_text(GTK_ENTRY(act_params), prm);
 
-   i = match_action_by_selection(actperform);
+   i = match_action_by_selection(act);
    if (i < 0 || actions[i].param_tpe == 0)
      {
-       gtk_entry_set_editable(GTK_ENTRY(act_params), FALSE);
+       gtk_editable_set_editable(GTK_EDITABLE(act_params), FALSE);
        gtk_widget_set_sensitive(act_params, FALSE);
      }
    else
      {
-       gtk_entry_set_editable(GTK_ENTRY(act_params), TRUE);
+       gtk_editable_set_editable(GTK_EDITABLE(act_params), TRUE);
        gtk_widget_set_sensitive(act_params, TRUE);
      }
 
+#if USE_GTK_TREEVIEW
+   g_free(mod);
+   g_free(key);
+   g_free(act);
+   g_free(prm);
+#endif
+
    if (i >= 0)
      {
        i = action_index_to_row[i];
-       gtk_clist_select_row(GTK_CLIST(act_clist), i, 0);
-       gtk_clist_moveto(GTK_CLIST(act_clist), i, 0, 0.5, 0.5);
+       clist_row_moveto(act_clist, i);
      }
 
-   /* printf("%s\n%s\n%s\n%s\n",modstring,keyused,actperform,paramsused); */
+   /* printf("%s\n%s\n%s\n%s\n",mod,key,act,prm); */
 
    last_row = row;
 
@@ -469,6 +585,7 @@ get_line(gchar * str, int num)
      }
 }
 
+#if ENABLE_SORTING
 static void
 on_resort_columns(GtkWidget * widget __UNUSED__, gint column,
                  gpointer data __UNUSED__)
@@ -499,70 +616,79 @@ on_resort_columns(GtkWidget * widget __UNUSED__, gint 
column,
 
    gtk_clist_sort(GTK_CLIST(clist));
 }
+#endif /* ENABLE_SORTING */
 
 static void
 on_delete_row(GtkWidget * widget __UNUSED__, gpointer data __UNUSED__)
 {
+#if USE_GTK_TREEVIEW
+   GtkTreeSelection   *sel;
+   GtkTreeIter         iter;
+   GtkTreeModel       *model;
+
+   sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(clist));
+   if (!gtk_tree_selection_get_selected(sel, &model, &iter))
+      return;
+   gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
+#else
    gtk_clist_remove(GTK_CLIST(clist), last_row);
+#endif
 
    real_rows--;
    if (last_row >= real_rows)
       last_row--;
-   gtk_clist_select_row(GTK_CLIST(clist), last_row, 0);
-   gtk_clist_moveto(GTK_CLIST(clist), last_row, 0, 0.5, 0.5);
+   clist_row_moveto(clist, last_row);
 }
 
 static void
 on_create_row(GtkWidget * widget __UNUSED__, gpointer data __UNUSED__)
 {
+#if USE_GTK_TREEVIEW
+   GtkTreeModel       *model;
+   GtkTreeIter         iter;
+
+   model = gtk_tree_view_get_model(GTK_TREE_VIEW(clist));
+   gtk_list_store_append(GTK_LIST_STORE(model), &iter);
+   gtk_list_store_set(GTK_LIST_STORE(model), &iter,
+                     0, "", 1, "", 2, "", 3, "", -1);
+#else
    char               *stuff[4];
 
-   stuff[0] = malloc(2);
-   strcpy(stuff[0], "");
-   stuff[1] = malloc(2);
-   strcpy(stuff[1], "");
-   stuff[2] = malloc(2);
-   strcpy(stuff[2], "");
-   stuff[3] = malloc(2);
-   strcpy(stuff[3], "");
+   stuff[0] = "";
+   stuff[1] = "";
+   stuff[2] = "";
+   stuff[3] = "";
    gtk_clist_select_row(GTK_CLIST(clist),
                        gtk_clist_append(GTK_CLIST(clist), stuff), 0);
-
-   if (stuff[0])
-      free(stuff[0]);
-   if (stuff[1])
-      free(stuff[1]);
-   if (stuff[2])
-      free(stuff[2]);
-   if (stuff[3])
-      free(stuff[3]);
+#endif
 
    last_row = real_rows++;
-   gtk_clist_select_row(GTK_CLIST(clist), last_row, 0);
-   gtk_clist_moveto(GTK_CLIST(clist), last_row, 0, 0.5, 0.5);
+   clist_row_moveto(clist, last_row);
 }
 
 static void
-on_change_params(GtkWidget * widget __UNUSED__, gpointer data __UNUSED__)
+on_change_params(GtkWidget * widget, gpointer data __UNUSED__)
 {
-   if (!dont_update)
-     {
-       gtk_clist_set_text(GTK_CLIST(clist), last_row, 3,
-                          gtk_entry_get_text(GTK_ENTRY(act_params)));
-     }
+   const char         *txt;
+
+   if (dont_update)
+      return;
+
+   txt = gtk_entry_get_text(GTK_ENTRY(widget));
+   clist_row_current_set_value(clist, 3, txt);
 }
 
 void
-on_exit_application(GtkWidget * widget __UNUSED__, gpointer data __UNUSED__)
+on_exit_application(void)
 {
-   gtk_exit(0);
+   exit(0);
 }
 
 static void
-on_save_and_exit_application(GtkWidget * widget, gpointer data)
+on_save_and_exit_application(void)
 {
-   on_save_data(widget, data);
-   on_exit_application(widget, data);
+   on_save_data();
+   on_exit_application();
 }
 
 static GtkWidget   *
@@ -582,75 +708,99 @@ create_list_window(void)
    GtkWidget          *entry;
    GtkWidget          *button;
    GtkWidget          *hbox;
-   GtkWidget          *m, *mi, *om;
-   GtkWidget          *menu, *menuitem;
+   GtkWidget          *om;
+   GtkWidget          *menu;
+
+#if USE_GTK_TREEVIEW
+   GtkCellRenderer    *renderer;
+   GtkListStore       *store;
+   GtkTreeIter         iter;
+   GtkTreeSelection   *sel;
+#endif
+
+   int                 i;
 
    list_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(list_window), 400, 400);
-   gtk_object_set_data(GTK_OBJECT(list_window), "key_editor", list_window);
-   GTK_WIDGET_SET_FLAGS(list_window, GTK_CAN_FOCUS);
-   GTK_WIDGET_SET_FLAGS(list_window, GTK_CAN_DEFAULT);
+   g_object_set_data(G_OBJECT(list_window), "key_editor", list_window);
+   gtk_widget_set_can_focus(list_window, TRUE);
+   gtk_widget_set_can_default(list_window, TRUE);
    gtk_window_set_title(GTK_WINDOW(list_window), "E Keys Editor");
 
    bigvbox = gtk_vbox_new(FALSE, 0);
-   gtk_widget_show(bigvbox);
    gtk_container_add(GTK_CONTAINER(list_window), bigvbox);
 
    menubar = gtk_menu_bar_new();
-   gtk_widget_show(menubar);
    gtk_box_pack_start(GTK_BOX(bigvbox), menubar, FALSE, FALSE, 0);
 
    menu = CreateBarSubMenu(menubar, "File");
-   menuitem = CreateMenuItem(menu, "Save", "", "Save Current Data", NULL,
-                            "save data");
-   gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
-                     GTK_SIGNAL_FUNC(on_save_data), NULL);
-   menuitem = CreateMenuItem(menu, "Save & Quit", "",
-                            "Save Current Data & Quit Application", NULL,
-                            "save quit");
-   gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
-                     GTK_SIGNAL_FUNC(on_save_and_exit_application), NULL);
-   menuitem =
-      CreateMenuItem(menu, "Quit", "", "Quit Without Saving", NULL,
-                    "quit program");
-   gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
-                     GTK_SIGNAL_FUNC(on_exit_application), NULL);
-
+   CreateMenuItem(menu, "Save", "", "Save Current Data", on_save_data, NULL);
+   CreateMenuItem(menu, "Save & Quit", "",
+                 "Save Current Data & Quit Application",
+                 on_save_and_exit_application, NULL);
+   CreateMenuItem(menu, "Quit", "", "Quit Without Saving",
+                 on_exit_application, NULL);
+
+#if 0                          /* Not implemented */
    menu = CreateRightAlignBarSubMenu(menubar, "Help");
    menuitem = CreateMenuItem(menu, "About", "", "About E Keybinding Editor",
                             NULL, "about");
    menuitem = CreateMenuItem(menu, "Documentation", "",
                             "Read the Keybinding Editor Documentation", NULL,
                             "read docs");
+#endif
 
+#if USE_GTK == 3
+   panes = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
+#else
    panes = gtk_hpaned_new();
-   gtk_widget_show(panes);
-   gtk_paned_set_gutter_size(GTK_PANED(panes), 10);
+#endif
    gtk_box_pack_start(GTK_BOX(bigvbox), panes, TRUE, TRUE, 0);
 
    scrollybit = gtk_scrolled_window_new(NULL, NULL);
-   gtk_widget_show(scrollybit);
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollybit),
                                  GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
    gtk_paned_pack1(GTK_PANED(panes), scrollybit, TRUE, FALSE);
 
+#if USE_GTK_TREEVIEW
+   clist = gtk_tree_view_new();
+
+   renderer = gtk_cell_renderer_text_new();
+   gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(clist),
+                                              -1, "Modifier", renderer, "text",
+                                              0, NULL);
+   renderer = gtk_cell_renderer_text_new();
+   gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(clist),
+                                              -1, "Key", renderer, "text", 1,
+                                              NULL);
+   renderer = gtk_cell_renderer_text_new();
+   gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(clist),
+                                              -1, "Action to Perform",
+                                              renderer, "text", 2, NULL);
+   renderer = gtk_cell_renderer_text_new();
+   gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(clist),
+                                              -1, "Command", renderer, "text",
+                                              3, NULL);
+
+   store = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
+                             G_TYPE_STRING);
+#else
    clist = gtk_clist_new(4);
-   gtk_widget_show(clist);
-   gtk_container_add(GTK_CONTAINER(scrollybit), clist);
-
    gtk_clist_set_column_title(GTK_CLIST(clist), 0, "Modifier");
    gtk_clist_set_column_title(GTK_CLIST(clist), 1, "Key");
    gtk_clist_set_column_title(GTK_CLIST(clist), 2, "Action to Perform");
    gtk_clist_set_column_title(GTK_CLIST(clist), 3, "Command");
+#if 0
+   gtk_clist_set_column_auto_resize(GTK_CLIST(clist), 0, TRUE);
+   gtk_clist_set_column_auto_resize(GTK_CLIST(clist), 1, TRUE);
+#endif
    gtk_clist_column_titles_show(GTK_CLIST(clist));
-   gtk_signal_connect(GTK_OBJECT(clist), "select_row",
-                     GTK_SIGNAL_FUNC(selection_made), NULL);
-   gtk_signal_connect(GTK_OBJECT(clist), "click_column",
-                     GTK_SIGNAL_FUNC(on_resort_columns), NULL);
+#endif
+   gtk_container_add(GTK_CONTAINER(scrollybit), clist);
 
    {
       char               *msg, *buf;
-      int                 i, j, k, modifier;
+      int                 j, k, modifier;
       char                event[128], mod[128], key[128], *params;
       const char         *stuff[4];
       int                 len;
@@ -691,7 +841,14 @@ create_list_window(void)
           stuff[1] = key;
           stuff[2] = (k >= 0) ? actions[k].text : "* Not recognised *";
           stuff[3] = params;
+#if USE_GTK_TREEVIEW
+          gtk_list_store_append(store, &iter);
+          gtk_list_store_set(store, &iter,
+                             0, stuff[0], 1, stuff[1],
+                             2, stuff[2], 3, stuff[3], -1);
+#else
           gtk_clist_append(GTK_CLIST(clist), (char **)stuff);
+#endif
           real_rows++;
 
         next:
@@ -699,118 +856,152 @@ create_list_window(void)
        }
       g_free(msg);
    }
+#if USE_GTK_TREEVIEW
+   gtk_tree_view_set_model(GTK_TREE_VIEW(clist), GTK_TREE_MODEL(store));
+   g_object_unref(store);
+   sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(clist));
+   gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
+   g_signal_connect(G_OBJECT(sel), "changed", G_CALLBACK(selection_made), 
NULL);
+#if ENABLE_SORTING
+   g_signal_connect(G_OBJECT(clist), "click_column",   /////////////////// CRAP
+                   G_CALLBACK(on_resort_columns), NULL);
+#endif
+#else
    gtk_clist_columns_autosize(GTK_CLIST(clist));
 
+   g_signal_connect(G_OBJECT(clist), "select_row",
+                   G_CALLBACK(selection_made), NULL);
+   g_signal_connect(G_OBJECT(clist), "click_column",
+                   G_CALLBACK(on_resort_columns), NULL);
+#endif
+
    vbox = gtk_vbox_new(FALSE, 0);
-   gtk_widget_show(vbox);
    frames = gtk_frame_new("Edit Keybinding Properties");
    gtk_container_set_border_width(GTK_CONTAINER(frames), 2);
-   gtk_widget_show(frames);
-   gtk_paned_pack2(GTK_PANED(panes), vbox, FALSE, TRUE);
+   gtk_paned_pack2(GTK_PANED(panes), vbox, FALSE, FALSE);
    gtk_box_pack_start(GTK_BOX(vbox), frames, TRUE, TRUE, 0);
 
    frame_vbox = gtk_vbox_new(FALSE, 3);
-   gtk_widget_show(frame_vbox);
 
    gtk_container_set_border_width(GTK_CONTAINER(frame_vbox), 4);
    gtk_container_add(GTK_CONTAINER(frames), frame_vbox);
 
+#if USE_GTK == 3
+   table = gtk_grid_new();
+   gtk_grid_set_row_spacing(GTK_GRID(table), 3);
+   gtk_grid_set_column_spacing(GTK_GRID(table), 3);
+#else
    table = gtk_table_new(3, 3, FALSE);
-   gtk_widget_show(table);
    gtk_table_set_row_spacings(GTK_TABLE(table), 3);
    gtk_table_set_col_spacings(GTK_TABLE(table), 3);
+#endif
    gtk_box_pack_start(GTK_BOX(frame_vbox), table, FALSE, FALSE, 2);
 
    alignment = gtk_alignment_new(1.0, 0.5, 0, 0);
    label = gtk_label_new("Key:");
    gtk_container_add(GTK_CONTAINER(alignment), label);
-   gtk_widget_show(alignment);
    gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT);
-   gtk_widget_show(label);
+#if USE_GTK == 3
+   gtk_widget_set_hexpand(alignment, GTK_FILL);
+   gtk_grid_attach(GTK_GRID(table), alignment, 0, 0, 1, 1);
+#else
    gtk_table_attach(GTK_TABLE(table), alignment, 0, 1, 0, 1,
                    GTK_FILL, (GtkAttachOptions) (0), 0, 0);
+#endif
 
    alignment = gtk_alignment_new(1.0, 0.5, 0, 0);
    label = gtk_label_new("Modifier:");
    gtk_container_add(GTK_CONTAINER(alignment), label);
-   gtk_widget_show(alignment);
    gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT);
-   gtk_widget_show(label);
+#if USE_GTK == 3
+   gtk_widget_set_hexpand(alignment, GTK_FILL);
+   gtk_grid_attach(GTK_GRID(table), alignment, 0, 1, 1, 1);
+#else
    gtk_table_attach(GTK_TABLE(table), alignment, 0, 1, 1, 2,
                    GTK_FILL, (GtkAttachOptions) (0), 0, 0);
+#endif
 
    alignment = gtk_alignment_new(1.0, 0.5, 0, 0);
    label = gtk_label_new("Command:");
    gtk_container_add(GTK_CONTAINER(alignment), label);
-   gtk_widget_show(alignment);
    gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_RIGHT);
-   gtk_widget_show(label);
+#if USE_GTK == 3
+   gtk_widget_set_hexpand(alignment, GTK_FILL);
+   gtk_grid_attach(GTK_GRID(table), alignment, 0, 2, 1, 1);
+#else
    gtk_table_attach(GTK_TABLE(table), alignment, 0, 1, 2, 3,
                    GTK_FILL, (GtkAttachOptions) (0), 0, 0);
+#endif
 
-   act_key = entry = gtk_entry_new_with_max_length(4096);
-   gtk_widget_show(entry);
+   act_key = entry = gtk_entry_new();
+   gtk_entry_set_max_length(GTK_ENTRY(entry), 4096);
    gtk_widget_set_sensitive(entry, FALSE);
    /* gtk_widget_set_usize(entry, 24, -1); */
+#if USE_GTK == 3
+   gtk_widget_set_hexpand(entry, GTK_EXPAND | GTK_FILL);
+   gtk_grid_attach(GTK_GRID(table), entry, 1, 0, 1, 1);
+#else
    gtk_table_attach(GTK_TABLE(table), entry, 1, 2, 0, 1,
                    GTK_EXPAND | GTK_FILL, (GtkAttachOptions) (0), 0, 0);
+#endif
 
    button = gtk_button_new_with_label("Change");
-   gtk_widget_show(button);
+#if USE_GTK == 3
+   gtk_widget_set_hexpand(button, GTK_EXPAND | GTK_FILL);
+   gtk_grid_attach(GTK_GRID(table), button, 2, 0, 1, 1);
+#else
    gtk_table_attach(GTK_TABLE(table), button, 2, 3, 0, 1,
                    GTK_EXPAND | GTK_FILL, (GtkAttachOptions) (0), 0, 0);
-   gtk_signal_connect(GTK_OBJECT(button), "clicked",
-                     GTK_SIGNAL_FUNC(e_cb_key_change), NULL);
-
-   m = gtk_menu_new();
-   gtk_widget_show(m);
-
-   mi = gtk_menu_item_new_with_label("NONE");
-   gtk_widget_show(mi);
-   gtk_signal_connect(GTK_OBJECT(mi), "activate",
-                     GTK_SIGNAL_FUNC(e_cb_modifier), (gpointer) 0);
-   gtk_menu_append(GTK_MENU(m), mi);
-   {
-      gint                i;
-
-      for (i = 1; i < 21; i++)
-       {
-          mi = gtk_menu_item_new_with_label(MOD_TEXT(i));
-          gtk_widget_show(mi);
-          gtk_signal_connect(GTK_OBJECT(mi), "activate",
-                             GTK_SIGNAL_FUNC(e_cb_modifier),
-                             (gpointer) (glong) i);
-          gtk_menu_append(GTK_MENU(m), mi);
-       }
-   }
+#endif
+   g_signal_connect(G_OBJECT(button), "clicked",
+                   G_CALLBACK(e_cb_key_change), NULL);
 
-   act_mod = om = gtk_option_menu_new();
-   gtk_widget_show(om);
-   gtk_option_menu_set_menu(GTK_OPTION_MENU(om), m);
-   gtk_option_menu_set_history(GTK_OPTION_MENU(om), 0);
+   act_mod = om = gtk_combo_box_text_new();
+   gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(om), "None");
+   for (i = 1; i < 21; i++)
+      gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(om), MOD_TEXT(i));
+   gtk_combo_box_set_active(GTK_COMBO_BOX(om), 0);
+   g_signal_connect(G_OBJECT(om), "changed", G_CALLBACK(e_cb_modifier), NULL);
+#if USE_GTK == 3
+   gtk_widget_set_hexpand(om, GTK_EXPAND | GTK_FILL);
+   gtk_grid_attach(GTK_GRID(table), om, 1, 1, 2, 1);
+#else
    gtk_table_attach(GTK_TABLE(table), om, 1, 3, 1, 2,
                    GTK_EXPAND | GTK_FILL, (GtkAttachOptions) (0), 0, 0);
+#endif
 
-   act_params = entry = gtk_entry_new_with_max_length(4096);
-   gtk_widget_show(entry);
+   act_params = entry = gtk_entry_new();
+   gtk_entry_set_max_length(GTK_ENTRY(entry), 4096);
    gtk_widget_set_sensitive(entry, FALSE);
+#if USE_GTK == 3
+   gtk_widget_set_hexpand(entry, GTK_EXPAND | GTK_FILL);
+   gtk_grid_attach(GTK_GRID(table), entry, 1, 2, 2, 1);
+#else
    gtk_table_attach(GTK_TABLE(table), entry, 1, 3, 2, 3,
                    GTK_EXPAND | GTK_FILL, (GtkAttachOptions) (0), 0, 0);
-   gtk_signal_connect(GTK_OBJECT(entry), "changed",
-                     GTK_SIGNAL_FUNC(on_change_params), NULL);
+#endif
+   g_signal_connect(G_OBJECT(entry), "changed",
+                   G_CALLBACK(on_change_params), NULL);
 
    scrollybit = gtk_scrolled_window_new(NULL, NULL);
-   gtk_widget_show(scrollybit);
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollybit),
                                  GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
 
+#if USE_GTK_TREEVIEW
+   act_clist = gtk_tree_view_new();
+
+   renderer = gtk_cell_renderer_text_new();
+   gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(act_clist),
+                                              -1, "Action Used:", renderer,
+                                              "text", 0, NULL);
+
+   store = gtk_list_store_new(1, G_TYPE_STRING);
+#else
    act_clist = gtk_clist_new(1);
-   gtk_widget_show(act_clist);
-   gtk_box_pack_start(GTK_BOX(frame_vbox), scrollybit, TRUE, TRUE, 0);
    gtk_clist_set_column_title(GTK_CLIST(act_clist), 0, "Action Used:");
    gtk_clist_column_titles_show(GTK_CLIST(act_clist));
-   gtk_signal_connect(GTK_OBJECT(act_clist), "select_row",
-                     GTK_SIGNAL_FUNC(change_action), NULL);
+#endif
+   gtk_box_pack_start(GTK_BOX(frame_vbox), scrollybit, TRUE, TRUE, 0);
    gtk_container_add(GTK_CONTAINER(scrollybit), act_clist);
 
    {
@@ -823,41 +1014,51 @@ create_list_window(void)
       for (k = row = 0; (actions[k].text); k++)
        {
           stuff[0] = actions[k].text;
+#if USE_GTK_TREEVIEW
+          gtk_list_store_append(store, &iter);
+          gtk_list_store_set(store, &iter, 0, stuff[0], -1);
+#else
           gtk_clist_append(GTK_CLIST(act_clist), (char **)stuff);
+#endif
           action_index_to_row[k] = row;
           action_row_to_index[row++] = k;
        }
    }
+#if USE_GTK_TREEVIEW
+   gtk_tree_view_set_model(GTK_TREE_VIEW(act_clist), GTK_TREE_MODEL(store));
+   g_object_unref(store);
+   sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(act_clist));
+   gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE);
+   g_signal_connect(G_OBJECT(sel), "changed", G_CALLBACK(change_action), NULL);
+#else
+   g_signal_connect(G_OBJECT(act_clist), "select_row",
+                   G_CALLBACK(change_action), NULL);
+#endif
 
    hbox = gtk_hbox_new(FALSE, 0);
-   gtk_widget_show(hbox);
    gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
 
    button = gtk_button_new_with_label(" New Keybinding ");
-   gtk_widget_show(button);
    gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 5);
-   gtk_signal_connect(GTK_OBJECT(button), "clicked",
-                     GTK_SIGNAL_FUNC(on_create_row), NULL);
+   g_signal_connect(G_OBJECT(button), "clicked",
+                   G_CALLBACK(on_create_row), NULL);
 
    button = gtk_button_new_with_label(" Delete Current Row ");
-   gtk_widget_show(button);
    gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 5);
-   gtk_signal_connect(GTK_OBJECT(button), "clicked",
-                     GTK_SIGNAL_FUNC(on_delete_row), NULL);
+   g_signal_connect(G_OBJECT(button), "clicked",
+                   G_CALLBACK(on_delete_row), NULL);
 
    button = gtk_button_new_with_label(" Save ");
-   gtk_widget_show(button);
    gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 5);
-   gtk_signal_connect(GTK_OBJECT(button), "clicked",
-                     GTK_SIGNAL_FUNC(on_save_data), NULL);
+   g_signal_connect(G_OBJECT(button), "clicked",
+                   G_CALLBACK(on_save_data), NULL);
 
    button = gtk_button_new_with_label(" Quit ");
-   gtk_widget_show(button);
    gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, FALSE, 5);
-   gtk_signal_connect(GTK_OBJECT(button), "clicked",
-                     GTK_SIGNAL_FUNC(on_exit_application), NULL);
+   g_signal_connect(G_OBJECT(button), "clicked",
+                   G_CALLBACK(on_exit_application), NULL);
 
-   gtk_clist_select_row(GTK_CLIST(clist), 0, 0);
+   clist_row_moveto(clist, 0);
 
    return list_window;
 }
@@ -865,10 +1066,7 @@ create_list_window(void)
 static void
 receive_ipc_msg(gchar * msg)
 {
-   gdk_flush();
    e_ipc_msg = g_strdup(msg);
-
-   gtk_main_quit();
 }
 
 static void
@@ -993,18 +1191,17 @@ main(int argc, char *argv[])
 {
    GtkWidget          *lister;
 
-   gtk_set_locale();
+   setlocale(LC_ALL, "");
+
    gtk_init(&argc, &argv);
 
-   tooltips = gtk_tooltips_new();
    accel_group = gtk_accel_group_new();
 
-   if (!CommsInit(receive_ipc_msg))
+   if (CommsInit(receive_ipc_msg))
      {
        GtkWidget          *win, *label, *align, *frame, *button, *vbox;
 
        win = gtk_window_new(GTK_WINDOW_POPUP);
-       gtk_window_set_policy(GTK_WINDOW(win), 0, 0, 1);
        gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER);
        frame = gtk_frame_new(NULL);
        gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT);
@@ -1012,8 +1209,8 @@ main(int argc, char *argv[])
        gtk_container_set_border_width(GTK_CONTAINER(align), 32);
        vbox = gtk_vbox_new(FALSE, 5);
        button = gtk_button_new_with_label("Quit");
-       gtk_signal_connect(GTK_OBJECT(button), "clicked",
-                          GTK_SIGNAL_FUNC(on_exit_application), NULL);
+       g_signal_connect(G_OBJECT(button), "clicked",
+                        G_CALLBACK(on_exit_application), NULL);
        label = gtk_label_new("You are not running Enlightenment\n"
                              "\n"
                              "This window manager has to be running in order\n"
@@ -1047,15 +1244,12 @@ main(int argc, char *argv[])
 
    lister = create_list_window();
 
-   gtk_clist_set_column_auto_resize(GTK_CLIST(clist), 0, TRUE);
-   gtk_clist_set_column_auto_resize(GTK_CLIST(clist), 1, TRUE);
-
-   gtk_widget_show(lister);
-   gtk_signal_connect(GTK_OBJECT(lister), "destroy",
-                     GTK_SIGNAL_FUNC(on_exit_application), NULL);
-   gtk_signal_connect(GTK_OBJECT(lister), "delete_event",
-                     GTK_SIGNAL_FUNC(on_exit_application), NULL);
+   g_signal_connect(G_OBJECT(lister), "destroy",
+                   G_CALLBACK(on_exit_application), NULL);
+   g_signal_connect(G_OBJECT(lister), "delete_event",
+                   G_CALLBACK(on_exit_application), NULL);
 
+   gtk_widget_show_all(lister);
    gtk_main();
 
    return 0;
diff --git a/viewer.h b/viewer.h
deleted file mode 100644
index 4e8abd0..0000000
--- a/viewer.h
+++ /dev/null
@@ -1,4 +0,0 @@
-void                on_exit_application(GtkWidget * widget, gpointer 
user_data);
-
-GtkTooltips        *tooltips;
-GtkAccelGroup      *accel_group;

-- 

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_mar

Reply via email to