tTidied up Win32 main message loop - now passes control to a class-specific message handler. Split out all GtkCList handling to a separate file. - vaccinewars - be a doctor and try to vaccinate the world
 (HTM) git clone git://src.adamsgaard.dk/vaccinewars
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 78e0d578944ebf15dd90531a4189046a746d4281
 (DIR) parent 3b2b449a26e9406aea4f4336df2252c07bd95c47
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Fri,  1 Mar 2002 13:59:03 +0000
       
       Tidied up Win32 main message loop - now passes control to a class-specific
       message handler. Split out all GtkCList handling to a separate file.
       
       
       Diffstat:
         M src/gtkport/Makefile.am             |       2 +-
         M src/gtkport/Makefile.in             |       6 +++---
         A src/gtkport/clist.c                 |     734 ++++++++++++++++++++++++++++++
         A src/gtkport/clist.h                 |     103 +++++++++++++++++++++++++++++++
         M src/gtkport/gtkport.c               |     917 +++++--------------------------
         M src/gtkport/gtkport.h               |      90 ++++++-------------------------
       
       6 files changed, 984 insertions(+), 868 deletions(-)
       ---
 (DIR) diff --git a/src/gtkport/Makefile.am b/src/gtkport/Makefile.am
       t@@ -1,4 +1,4 @@
        noinst_LIBRARIES = libgtkport.a
       -libgtkport_a_SOURCES = gtkport.c gtkport.h
       +libgtkport_a_SOURCES = gtkport.c gtkport.h clist.c clist.h
        INCLUDES   = -I../../intl -I${srcdir} -I${srcdir}/.. -I../.. @GTK_CFLAGS@
        DEFS       = @DEFS@ -DLOCALEDIR=\"${localedir}\"
 (DIR) diff --git a/src/gtkport/Makefile.in b/src/gtkport/Makefile.in
       t@@ -94,7 +94,7 @@ WNDRES = @WNDRES@
        localedir = @localedir@
        
        noinst_LIBRARIES = libgtkport.a
       -libgtkport_a_SOURCES = gtkport.c gtkport.h
       +libgtkport_a_SOURCES = gtkport.c gtkport.h clist.c clist.h
        INCLUDES = -I../../intl -I${srcdir} -I${srcdir}/.. -I../.. @GTK_CFLAGS@
        DEFS = @DEFS@ -DLOCALEDIR=\"${localedir}\"
        mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
       t@@ -106,7 +106,7 @@ CPPFLAGS = @CPPFLAGS@
        LDFLAGS = @LDFLAGS@
        LIBS = @LIBS@
        libgtkport_a_LIBADD = 
       -libgtkport_a_OBJECTS =  gtkport.o
       +libgtkport_a_OBJECTS =  gtkport.o clist.o
        AR = ar
        CFLAGS = @CFLAGS@
        COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
       t@@ -119,7 +119,7 @@ DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
        
        TAR = gtar
        GZIP_ENV = --best
       -DEP_FILES =  .deps/gtkport.P
       +DEP_FILES =  .deps/clist.P .deps/gtkport.P
        SOURCES = $(libgtkport_a_SOURCES)
        OBJECTS = $(libgtkport_a_OBJECTS)
        
 (DIR) diff --git a/src/gtkport/clist.c b/src/gtkport/clist.c
       t@@ -0,0 +1,734 @@
       +/************************************************************************
       + * clist.c        GtkCList implementation for gtkport                   *
       + * Copyright (C)  1998-2002  Ben Webb                                   *
       + *                Email: ben@bellatrix.pcl.ox.ac.uk                     *
       + *                WWW: http://dopewars.sourceforge.net/                 *
       + *                                                                      *
       + * This program is free software; you can redistribute it and/or        *
       + * modify it under the terms of the GNU General Public License          *
       + * as published by the Free Software Foundation; either version 2       *
       + * of the License, or (at your option) any later version.               *
       + *                                                                      *
       + * This program is distributed in the hope that it will be useful,      *
       + * but WITHOUT ANY WARRANTY; without even the implied warranty of       *
       + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
       + * GNU General Public License for more details.                         *
       + *                                                                      *
       + * You should have received a copy of the GNU General Public License    *
       + * along with this program; if not, write to the Free Software          *
       + * Foundation, Inc., 59 Temple Place - Suite 330, Boston,               *
       + *                   MA  02111-1307, USA.                               *
       + ************************************************************************/
       +
       +#ifdef HAVE_CONFIG_H
       +#include <config.h>
       +#endif
       +
       +#include "gtkport.h"
       +
       +#ifdef CYGWIN
       +
       +static void gtk_clist_size_request(GtkWidget *widget,
       +                                   GtkRequisition *requisition);
       +static void gtk_clist_set_size(GtkWidget *widget,
       +                               GtkAllocation *allocation);
       +static gboolean gtk_clist_wndproc(GtkWidget *widget, UINT msg, WPARAM wParam,
       +                                  LPARAM lParam);
       +static void gtk_clist_realize(GtkWidget *widget);
       +static void gtk_clist_show(GtkWidget *widget);
       +static void gtk_clist_hide(GtkWidget *widget);
       +static void gtk_clist_draw_row(GtkCList *clist, LPDRAWITEMSTRUCT lpdis);
       +static void gtk_clist_update_selection(GtkWidget *widget);
       +static void gtk_clist_update_widths(GtkCList *clist, gchar *text[]);
       +static void gtk_clist_update_all_widths(GtkCList *clist);
       +static void gtk_clist_do_auto_resize(GtkCList *clist);
       +static void gtk_clist_set_column_width_full(GtkCList *clist, gint column,
       +                                            gint width,
       +                                            gboolean ResizeHeader);
       +
       +static GtkSignalType GtkCListSignals[] = {
       +  {"size_request", gtk_marshal_VOID__GPOIN, gtk_clist_size_request},
       +  {"set_size", gtk_marshal_VOID__GPOIN, gtk_clist_set_size},
       +  {"realize", gtk_marshal_VOID__VOID, gtk_clist_realize},
       +  {"click-column", gtk_marshal_VOID__GINT, NULL},
       +  {"select_row", gtk_marshal_VOID__GINT_GINT_EVENT, NULL},
       +  {"unselect_row", gtk_marshal_VOID__GINT_GINT_EVENT, NULL},
       +  {"show", gtk_marshal_VOID__VOID, gtk_clist_show},
       +  {"hide", gtk_marshal_VOID__VOID, gtk_clist_hide},
       +  {"", NULL, NULL}
       +};
       +
       +static GtkClass GtkCListClass = {
       +  "clist", &GtkContainerClass, sizeof(GtkCList), GtkCListSignals,
       +  gtk_clist_wndproc
       +};
       +
       +gboolean gtk_clist_wndproc(GtkWidget *widget, UINT msg, WPARAM wParam,
       +                           LPARAM lParam)
       +{
       +  LPDRAWITEMSTRUCT lpdis;
       +  HD_NOTIFY FAR *phdr;
       +  NMHDR *nmhdr;
       +
       +  switch(msg) {
       +  case WM_COMMAND:
       +    if (lParam && HIWORD(wParam) == LBN_SELCHANGE) {
       +      gtk_clist_update_selection(widget);
       +      return FALSE;
       +    }
       +    break;
       +  case WM_DRAWITEM:
       +    lpdis = (LPDRAWITEMSTRUCT)lParam;
       +    if (lpdis) {
       +      gtk_clist_draw_row(GTK_CLIST(widget), lpdis);
       +      return FALSE;
       +    }
       +    break;
       +  case WM_NOTIFY:
       +    nmhdr = (NMHDR *)lParam;
       +    phdr = (HD_NOTIFY FAR *)lParam;
       +    if (nmhdr && nmhdr->code == HDN_ENDTRACK) {
       +      gtk_clist_set_column_width_full(GTK_CLIST(widget), phdr->iItem,
       +                                      phdr->pitem->cxy, FALSE);
       +      return FALSE;
       +    } else if (nmhdr && nmhdr->code == HDN_ITEMCLICK) {
       +      gtk_signal_emit(GTK_OBJECT(widget), "click-column", (gint)phdr->iItem);
       +      return FALSE;
       +    }
       +    break;
       +  }
       +  return TRUE;
       +}
       +
       +void gtk_clist_set_size(GtkWidget *widget, GtkAllocation *allocation)
       +{
       +  GtkCList *clist = GTK_CLIST(widget);
       +
       +  gtk_container_set_size(widget, allocation);
       +  if (clist->header) {
       +    SetWindowPos(clist->header, HWND_TOP,
       +                 allocation->x, allocation->y,
       +                 allocation->width, clist->header_size, SWP_NOZORDER);
       +    allocation->y += clist->header_size - 1;
       +    allocation->height -= clist->header_size - 1;
       +  }
       +}
       +
       +GtkWidget *gtk_clist_new(gint columns)
       +{
       +  GtkCList *clist;
       +  int i;
       +
       +  clist = GTK_CLIST(GtkNewObject(&GtkCListClass));
       +  clist->cols = columns;
       +  clist->coldata = g_new0(GtkCListColumn, columns);
       +  clist->rows = 0;
       +  clist->rowdata = NULL;
       +  for (i = 0; i < columns; i++) {
       +    clist->coldata[i].width = 0;
       +    clist->coldata[i].visible = TRUE;
       +    clist->coldata[i].resizeable = TRUE;
       +  }
       +
       +  return GTK_WIDGET(clist);
       +}
       +
       +void gtk_clist_size_request(GtkWidget *widget, GtkRequisition *requisition)
       +{
       +  SIZE size;
       +
       +  if (GetTextSize(widget->hWnd, "Sample text", &size, defFont)) {
       +    requisition->width = size.cx;
       +    requisition->height = size.cy * 6 + 12;
       +  }
       +}
       +
       +void gtk_clist_realize(GtkWidget *widget)
       +{
       +  HWND Parent, header;
       +  HD_LAYOUT hdl;
       +  HD_ITEM hdi;
       +  RECT rcParent;
       +  WINDOWPOS wp;
       +  GtkCList *clist = GTK_CLIST(widget);
       +  GSList *rows;
       +  GtkCListRow *row;
       +  gint i;
       +
       +  gtk_container_realize(widget);
       +  Parent = gtk_get_parent_hwnd(widget);
       +  GTK_WIDGET_SET_FLAGS(widget, GTK_CAN_FOCUS);
       +  rcParent.left = rcParent.top = 0;
       +  rcParent.right = rcParent.bottom = 800;
       +  header = CreateWindowEx(0, WC_HEADER, NULL,
       +                          WS_CHILD | WS_BORDER | HDS_HORZ
       +                          | (GTK_CLIST(widget)->coldata[0].button_passive ?
       +                             0 : HDS_BUTTONS),
       +                          0, 0, 0, 0, Parent, NULL, hInst, NULL);
       +  SetWindowLong(header, GWL_USERDATA, (LONG)widget);
       +  GTK_CLIST(widget)->header = header;
       +  gtk_set_default_font(header);
       +  hdl.prc = &rcParent;
       +  hdl.pwpos = &wp;
       +  SendMessage(header, HDM_LAYOUT, 0, (LPARAM)&hdl);
       +  clist->header_size = wp.cy;
       +  widget->hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX", "",
       +                                WS_CHILD | WS_TABSTOP | LBS_DISABLENOSCROLL
       +                                | WS_VSCROLL | LBS_OWNERDRAWFIXED |
       +                                LBS_NOTIFY, 0, 0, 0, 0, Parent, NULL,
       +                                hInst, NULL);
       +  gtk_set_default_font(widget->hWnd);
       +
       +  gtk_clist_update_all_widths(clist);
       +  for (rows = clist->rowdata; rows; rows = g_slist_next(rows)) {
       +    row = (GtkCListRow *)rows->data;
       +    if (row)
       +      SendMessage(widget->hWnd, LB_ADDSTRING, 0, (LPARAM)row->data);
       +  }
       +
       +  for (i = 0; i < clist->cols; i++) {
       +    hdi.mask = HDI_TEXT | HDI_FORMAT | HDI_WIDTH;
       +    hdi.pszText = clist->coldata[i].title;
       +    if (hdi.pszText) {
       +      if (i == clist->cols - 1)
       +        hdi.cxy = 9000;
       +      else
       +        hdi.cxy = clist->coldata[i].width;
       +      hdi.cchTextMax = strlen(hdi.pszText);
       +      hdi.fmt = HDF_LEFT | HDF_STRING;
       +      SendMessage(header, HDM_INSERTITEM, i + 1, (LPARAM)&hdi);
       +    }
       +  }
       +}
       +
       +void gtk_clist_show(GtkWidget *widget)
       +{
       +  if (GTK_WIDGET_REALIZED(widget)) {
       +    ShowWindow(GTK_CLIST(widget)->header, SW_SHOWNORMAL);
       +  }
       +}
       +
       +void gtk_clist_hide(GtkWidget *widget)
       +{
       +  if (GTK_WIDGET_REALIZED(widget)) {
       +    ShowWindow(GTK_CLIST(widget)->header, SW_HIDE);
       +  }
       +}
       +
       +void gtk_clist_draw_row(GtkCList *clist, LPDRAWITEMSTRUCT lpdis)
       +{
       +  HBRUSH bkgrnd;
       +  COLORREF textcol, oldtextcol;
       +  RECT rcCol;
       +  gint i, CurrentX;
       +  GtkCListRow *row;
       +
       +  if (lpdis->itemState & ODS_SELECTED) {
       +    bkgrnd = (HBRUSH)(1 + COLOR_HIGHLIGHT);
       +    textcol = (COLORREF)GetSysColor(COLOR_HIGHLIGHTTEXT);
       +  } else {
       +    bkgrnd = (HBRUSH)(1 + COLOR_WINDOW);
       +    textcol = (COLORREF)GetSysColor(COLOR_WINDOWTEXT);
       +  }
       +  oldtextcol = SetTextColor(lpdis->hDC, textcol);
       +  SetBkMode(lpdis->hDC, TRANSPARENT);
       +  FillRect(lpdis->hDC, &lpdis->rcItem, bkgrnd);
       +
       +  if (lpdis->itemID >= 0 && lpdis->itemID < clist->rows) {
       +    row = (GtkCListRow *)g_slist_nth_data(clist->rowdata, lpdis->itemID);
       +    CurrentX = lpdis->rcItem.left;
       +    rcCol.top = lpdis->rcItem.top;
       +    rcCol.bottom = lpdis->rcItem.bottom;
       +    if (row->text)
       +      for (i = 0; i < clist->cols; i++) {
       +        rcCol.left = CurrentX + LISTITEMHPACK;
       +        CurrentX += clist->coldata[i].width;
       +        rcCol.right = CurrentX - LISTITEMHPACK;
       +        if (rcCol.left > lpdis->rcItem.right)
       +          rcCol.left = lpdis->rcItem.right;
       +        if (rcCol.right > lpdis->rcItem.right)
       +          rcCol.right = lpdis->rcItem.right;
       +        if (i == clist->cols - 1)
       +          rcCol.right = lpdis->rcItem.right;
       +        if (row->text[i]) {
       +          DrawText(lpdis->hDC, row->text[i], -1, &rcCol,
       +                   DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS);
       +        }
       +      }
       +  }
       +
       +  SetTextColor(lpdis->hDC, oldtextcol);
       +  SetBkMode(lpdis->hDC, OPAQUE);
       +  if (lpdis->itemState & ODS_FOCUS)
       +    DrawFocusRect(lpdis->hDC, &lpdis->rcItem);
       +}
       +
       +void gtk_clist_do_auto_resize(GtkCList *clist)
       +{
       +  gint i;
       +
       +  for (i = 0; i < clist->cols; i++)
       +    if (clist->coldata[i].auto_resize) {
       +      gtk_clist_set_column_width(clist, i, clist->coldata[i].width);
       +    }
       +}
       +
       +void gtk_clist_update_all_widths(GtkCList *clist)
       +{
       +  GSList *list;
       +  GtkCListRow *row;
       +  gint i;
       +  SIZE size;
       +  HWND header;
       +
       +  header = clist->header;
       +  if (header)
       +    for (i = 0; i < clist->cols; i++) {
       +      if (GetTextSize(header, clist->coldata[i].title, &size, defFont) &&
       +          clist->coldata[i].width < size.cx + 2 * LISTHEADERPACK) {
       +        clist->coldata[i].width = size.cx + 2 * LISTHEADERPACK;
       +      }
       +    }
       +
       +  for (list = clist->rowdata; list; list = g_slist_next(list)) {
       +    row = (GtkCListRow *)list->data;
       +    if (row && row->text)
       +      gtk_clist_update_widths(clist, row->text);
       +  }
       +}
       +
       +void gtk_clist_update_widths(GtkCList *clist, gchar *text[])
       +{
       +  gint i;
       +  SIZE size;
       +  HWND hWnd;
       +
       +  hWnd = GTK_WIDGET(clist)->hWnd;
       +  if (!hWnd)
       +    return;
       +  for (i = 0; i < clist->cols; i++) {
       +    if (clist->coldata[i].auto_resize
       +        && GetTextSize(hWnd, text[i], &size, defFont)
       +        && size.cx + 2 * LISTITEMHPACK > clist->coldata[i].width) {
       +      clist->coldata[i].width = size.cx + 2 * LISTITEMHPACK;
       +    }
       +  }
       +}
       +
       +gint gtk_clist_insert(GtkCList *clist, gint row, gchar *text[])
       +{
       +  GtkWidget *widget = GTK_WIDGET(clist);
       +  HWND hWnd;
       +  GtkCListRow *new_row;
       +  gint i;
       +
       +  if (row < 0)
       +    row = clist->rows;
       +
       +  new_row = g_new0(GtkCListRow, 1);
       +  new_row->text = g_new0(gchar *, clist->cols);
       +
       +  for (i = 0; i < clist->cols; i++) {
       +    new_row->text[i] = g_strdup(text[i]);
       +  }
       +  gtk_clist_update_widths(clist, new_row->text);
       +  gtk_clist_do_auto_resize(clist);
       +  clist->rowdata = g_slist_insert(clist->rowdata, (gpointer)new_row, row);
       +  clist->rows = g_slist_length(clist->rowdata);
       +
       +  if (GTK_WIDGET_REALIZED(widget)) {
       +    hWnd = widget->hWnd;
       +    SendMessage(hWnd, LB_INSERTSTRING, (WPARAM)row, (LPARAM)NULL);
       +  }
       +
       +  return row;
       +}
       +
       +gint gtk_clist_set_text(GtkCList *clist, gint row, gint col, gchar *text)
       +{
       +  GtkCListRow *list_row;
       +
       +  if (row < 0 || row >= clist->rows || col < 0 || col >= clist->cols)
       +    return -1;
       +
       +  list_row = (GtkCListRow *)g_slist_nth_data(clist->rowdata, row);
       +  g_free(list_row->text[col]);
       +  list_row->text[col] = g_strdup(text);
       +
       +  if (GTK_WIDGET_REALIZED(GTK_WIDGET(clist))) {
       +    HWND hWnd = GTK_WIDGET(clist)->hWnd;
       +
       +    InvalidateRect(hWnd, NULL, FALSE);
       +    UpdateWindow(hWnd);
       +  }
       +  return row;
       +}
       +
       +void gtk_clist_remove(GtkCList *clist, gint row)
       +{
       +  if (row >= 0 && row < clist->rows) {
       +    GSList *dellink;
       +    GtkCListRow *delrow;
       +    int i;
       +
       +    gtk_clist_unselect_row(clist, row, 0);
       +    dellink = g_slist_nth(clist->rowdata, row);
       +    delrow = (GtkCListRow *)dellink->data;
       +    for (i = 0; i < clist->cols; i++) {
       +      g_free(delrow->text[i]);
       +    }
       +    g_free(delrow->text);
       +    clist->rowdata = g_slist_remove_link(clist->rowdata, dellink);
       +    g_free(dellink);
       +
       +    clist->rows = g_slist_length(clist->rowdata);
       +
       +    if (GTK_WIDGET_REALIZED(GTK_WIDGET(clist))) {
       +      HWND hWnd = GTK_WIDGET(clist)->hWnd;
       +
       +      SendMessage(hWnd, LB_DELETESTRING, (WPARAM)row, 0);
       +    }
       +  }
       +}
       +
       +GtkWidget *gtk_clist_new_with_titles(gint columns, gchar *titles[])
       +{
       +  GtkWidget *widget;
       +  GtkCList *clist;
       +  gint i;
       +
       +  widget = gtk_clist_new(columns);
       +  clist = GTK_CLIST(widget);
       +  for (i = 0; i < clist->cols; i++) {
       +    gtk_clist_set_column_title(clist, i, titles[i]);
       +  }
       +  return widget;
       +}
       +
       +GtkWidget *gtk_scrolled_clist_new_with_titles(gint columns,
       +                                              gchar *titles[],
       +                                              GtkWidget **pack_widg)
       +{
       +  GtkWidget *widget;
       +
       +  widget = gtk_clist_new_with_titles(columns, titles);
       +  *pack_widg = widget;
       +  return widget;
       +}
       +
       +gint gtk_clist_append(GtkCList *clist, gchar *text[])
       +{
       +  return gtk_clist_insert(clist, -1, text);
       +}
       +
       +void gtk_clist_set_column_title(GtkCList *clist, gint column,
       +                                const gchar *title)
       +{
       +  HWND hWnd;
       +
       +  if (column < 0 || column >= clist->cols)
       +    return;
       +  g_free(clist->coldata[column].title);
       +  clist->coldata[column].title = g_strdup(title);
       +  if (GTK_WIDGET_REALIZED(GTK_WIDGET(clist))) {
       +    hWnd = GTK_WIDGET(clist)->hWnd;
       +    InvalidateRect(hWnd, NULL, FALSE);
       +    UpdateWindow(hWnd);
       +  }
       +}
       +
       +void gtk_clist_column_title_passive(GtkCList *clist, gint column)
       +{
       +  if (column >= 0 && column < clist->cols)
       +    clist->coldata[column].button_passive = TRUE;
       +}
       +
       +void gtk_clist_column_titles_passive(GtkCList *clist)
       +{
       +  gint i;
       +
       +  for (i = 0; i < clist->cols; i++) {
       +    gtk_clist_column_title_passive(clist, i);
       +  }
       +}
       +
       +void gtk_clist_column_title_active(GtkCList *clist, gint column)
       +{
       +  if (column >= 0 && column < clist->cols)
       +    clist->coldata[column].button_passive = FALSE;
       +}
       +
       +void gtk_clist_column_titles_active(GtkCList *clist)
       +{
       +  gint i;
       +
       +  for (i = 0; i < clist->cols; i++) {
       +    gtk_clist_column_title_active(clist, i);
       +  }
       +}
       +
       +void gtk_clist_set_column_width(GtkCList *clist, gint column, gint width)
       +{
       +  gtk_clist_set_column_width_full(clist, column, width, TRUE);
       +}
       +
       +void gtk_clist_set_column_width_full(GtkCList *clist, gint column,
       +                                     gint width, gboolean ResizeHeader)
       +{
       +  HWND hWnd, header;
       +  HD_ITEM hdi;
       +
       +  if (column < 0 || column >= clist->cols)
       +    return;
       +
       +  clist->coldata[column].width = width;
       +  if (GTK_WIDGET_REALIZED(GTK_WIDGET(clist))) {
       +    header = clist->header;
       +    if (ResizeHeader && header) {
       +      hdi.mask = HDI_WIDTH;
       +      if (column == clist->cols - 1)
       +        width = 9000;
       +      hdi.cxy = width;
       +      if (SendMessage(header, HDM_GETITEM, (WPARAM)column, (LPARAM)&hdi) &&
       +          hdi.cxy != width) {
       +        hdi.mask = HDI_WIDTH;
       +        hdi.cxy = width;
       +        SendMessage(header, HDM_SETITEM, (WPARAM)column, (LPARAM)&hdi);
       +      }
       +    }
       +    hWnd = GTK_WIDGET(clist)->hWnd;
       +    if (hWnd)
       +      InvalidateRect(hWnd, NULL, FALSE);
       +  }
       +}
       +
       +void gtk_clist_set_selection_mode(GtkCList *clist, GtkSelectionMode mode)
       +{
       +  clist->mode = mode;
       +}
       +
       +static GtkCList *sorting_clist;
       +static gint gtk_clist_sort_func(gconstpointer a, gconstpointer b)
       +{
       +  return (*sorting_clist->cmp_func) (sorting_clist, a, b);
       +}
       +
       +void gtk_clist_sort(GtkCList *clist)
       +{
       +  HWND hWnd;
       +  gint rowind;
       +  GList *sel;
       +  GSList *rowpt;
       +
       +  sorting_clist = clist;
       +  if (clist && clist->cmp_func && clist->rows) {
       +    /* Since the order of the list may change, we need to change the
       +     * selection as well. Do this by converting the row indices into
       +     * GSList pointers (which are invariant to the sort) and then convert
       +     * back afterwards */
       +    for (sel = clist->selection; sel; sel = g_list_next(sel)) {
       +      rowind = GPOINTER_TO_INT(sel->data);
       +      sel->data = (gpointer)g_slist_nth(clist->rowdata, rowind);
       +    }
       +    clist->rowdata = g_slist_sort(clist->rowdata, gtk_clist_sort_func);
       +    for (sel = clist->selection; sel; sel = g_list_next(sel)) {
       +      rowpt = (GSList *)(sel->data);
       +      sel->data = GINT_TO_POINTER(g_slist_position(clist->rowdata, rowpt));
       +    }
       +    if (GTK_WIDGET_REALIZED(GTK_WIDGET(clist))) {
       +      hWnd = GTK_WIDGET(clist)->hWnd;
       +      if (clist->mode == GTK_SELECTION_SINGLE) {
       +        sel = clist->selection;
       +        if (sel)
       +          rowind = GPOINTER_TO_INT(sel->data);
       +        else
       +          rowind = -1;
       +        SendMessage(hWnd, LB_SETCURSEL, (WPARAM)rowind, 0);
       +      } else {
       +        for (rowind = 0; rowind < clist->rows; rowind++) {
       +          SendMessage(hWnd, LB_SETSEL, (WPARAM)FALSE, (LPARAM)rowind);
       +        }
       +        for (sel = clist->selection; sel; sel = g_list_next(sel)) {
       +          rowind = GPOINTER_TO_INT(sel->data);
       +          SendMessage(hWnd, LB_SETSEL, (WPARAM)TRUE, (LPARAM)rowind);
       +        }
       +      }
       +      InvalidateRect(hWnd, NULL, FALSE);
       +      UpdateWindow(hWnd);
       +    }
       +  }
       +}
       +
       +void gtk_clist_freeze(GtkCList *clist)
       +{
       +}
       +
       +void gtk_clist_thaw(GtkCList *clist)
       +{
       +}
       +
       +void gtk_clist_clear(GtkCList *clist)
       +{
       +  GtkCListRow *row;
       +  GSList *list;
       +  gint i;
       +  HWND hWnd;
       +
       +  for (list = clist->rowdata; list; list = g_slist_next(list)) {
       +    row = (GtkCListRow *)list->data;
       +    for (i = 0; i < clist->cols; i++) {
       +      g_free(row->text[i]);
       +    }
       +    g_free(row);
       +  }
       +  g_slist_free(clist->rowdata);
       +  clist->rowdata = NULL;
       +  clist->rows = 0;
       +
       +  gtk_clist_update_all_widths(clist);
       +  hWnd = GTK_WIDGET(clist)->hWnd;
       +  if (hWnd) {
       +    SendMessage(hWnd, LB_RESETCONTENT, 0, 0);
       +  }
       +}
       +
       +void gtk_clist_set_row_data(GtkCList *clist, gint row, gpointer data)
       +{
       +  GtkCListRow *list_row;
       +
       +  if (row >= 0 && row < clist->rows) {
       +    list_row = (GtkCListRow *)g_slist_nth_data(clist->rowdata, row);
       +    if (list_row)
       +      list_row->data = data;
       +  }
       +}
       +
       +gpointer gtk_clist_get_row_data(GtkCList *clist, gint row)
       +{
       +  GtkCListRow *list_row;
       +
       +  if (row >= 0 && row < clist->rows) {
       +    list_row = (GtkCListRow *)g_slist_nth_data(clist->rowdata, row);
       +    if (list_row)
       +      return list_row->data;
       +  }
       +  return NULL;
       +}
       +
       +void gtk_clist_set_auto_sort(GtkCList *clist, gboolean auto_sort)
       +{
       +  clist->auto_sort = auto_sort;
       +}
       +
       +void gtk_clist_columns_autosize(GtkCList *clist)
       +{
       +}
       +
       +void gtk_clist_select_row(GtkCList *clist, gint row, gint column)
       +{
       +  HWND hWnd;
       +
       +  hWnd = GTK_WIDGET(clist)->hWnd;
       +  if (hWnd) {
       +    if (clist->mode == GTK_SELECTION_SINGLE) {
       +      SendMessage(hWnd, LB_SETCURSEL, (WPARAM)row, 0);
       +    } else {
       +      SendMessage(hWnd, LB_SETSEL, (WPARAM)TRUE, (LPARAM)row);
       +    }
       +    gtk_clist_update_selection(GTK_WIDGET(clist));
       +  }
       +}
       +
       +void gtk_clist_unselect_row(GtkCList *clist, gint row, gint column)
       +{
       +  HWND hWnd;
       +
       +  hWnd = GTK_WIDGET(clist)->hWnd;
       +  if (hWnd) {
       +    if (clist->mode == GTK_SELECTION_SINGLE) {
       +      SendMessage(hWnd, LB_SETCURSEL, (WPARAM)(-1), 0);
       +    } else {
       +      SendMessage(hWnd, LB_SETSEL, (WPARAM)FALSE, (LPARAM)row);
       +    }
       +    gtk_clist_update_selection(GTK_WIDGET(clist));
       +  }
       +}
       +
       +GtkVisibility gtk_clist_row_is_visible(GtkCList *clist, gint row)
       +{
       +  return GTK_VISIBILITY_FULL;
       +}
       +
       +void gtk_clist_moveto(GtkCList *clist, gint row, gint column,
       +                      gfloat row_align, gfloat col_align)
       +{
       +}
       +
       +void gtk_clist_set_compare_func(GtkCList *clist,
       +                                GtkCListCompareFunc cmp_func)
       +{
       +  if (clist)
       +    clist->cmp_func = cmp_func;
       +}
       +
       +void gtk_clist_set_column_auto_resize(GtkCList *clist, gint column,
       +                                      gboolean auto_resize)
       +{
       +  if (clist && column >= 0 && column < clist->cols) {
       +    clist->coldata[column].auto_resize = auto_resize;
       +  }
       +}
       +
       +void gtk_clist_update_selection(GtkWidget *widget)
       +{
       +  GtkCList *clist = GTK_CLIST(widget);
       +  GList *oldsel, *selpt;
       +  gint i;
       +
       +  oldsel = clist->selection;
       +  clist->selection = NULL;
       +  if (widget->hWnd) {
       +    for (i = 0; i < clist->rows; i++) {
       +      if (SendMessage(widget->hWnd, LB_GETSEL, (WPARAM)i, 0) > 0) {
       +        clist->selection = g_list_append(clist->selection, GINT_TO_POINTER(i));
       +      }
       +    }
       +
       +    for (selpt = oldsel; selpt; selpt = g_list_next(selpt)) {
       +      gint row = GPOINTER_TO_INT(selpt->data);
       +
       +      if (!g_list_find(clist->selection, GINT_TO_POINTER(row))) {
       +        gtk_signal_emit(GTK_OBJECT(widget), "unselect_row", row, 0, NULL);
       +      }
       +    }
       +
       +    for (selpt = clist->selection; selpt; selpt = g_list_next(selpt)) {
       +      gint row = GPOINTER_TO_INT(selpt->data);
       +
       +      if (!g_list_find(oldsel, GINT_TO_POINTER(row))) {
       +        gtk_signal_emit(GTK_OBJECT(widget), "select_row", row, 0, NULL);
       +      }
       +    }
       +  }
       +  g_list_free(oldsel);
       +}
       +
       +#else /* for systems with GTK+ */
       +
       +GtkWidget *gtk_scrolled_clist_new_with_titles(gint columns,
       +                                              gchar *titles[],
       +                                              GtkWidget **pack_widg)
       +{
       +  GtkWidget *scrollwin, *clist;
       +
       +  clist = gtk_clist_new_with_titles(columns, titles);
       +  scrollwin = gtk_scrolled_window_new(NULL, NULL);
       +  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin),
       +                                 GTK_POLICY_AUTOMATIC,
       +                                 GTK_POLICY_AUTOMATIC);
       +  gtk_container_add(GTK_CONTAINER(scrollwin), clist);
       +  *pack_widg = scrollwin;
       +  return clist;
       +}
       +
       +#endif
 (DIR) diff --git a/src/gtkport/clist.h b/src/gtkport/clist.h
       t@@ -0,0 +1,103 @@
       +/************************************************************************
       + * clist.h        GtkCList implementation for gtkport                   *
       + * Copyright (C)  1998-2002  Ben Webb                                   *
       + *                Email: ben@bellatrix.pcl.ox.ac.uk                     *
       + *                WWW: http://dopewars.sourceforge.net/                 *
       + *                                                                      *
       + * This program is free software; you can redistribute it and/or        *
       + * modify it under the terms of the GNU General Public License          *
       + * as published by the Free Software Foundation; either version 2       *
       + * of the License, or (at your option) any later version.               *
       + *                                                                      *
       + * This program is distributed in the hope that it will be useful,      *
       + * but WITHOUT ANY WARRANTY; without even the implied warranty of       *
       + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
       + * GNU General Public License for more details.                         *
       + *                                                                      *
       + * You should have received a copy of the GNU General Public License    *
       + * along with this program; if not, write to the Free Software          *
       + * Foundation, Inc., 59 Temple Place - Suite 330, Boston,               *
       + *                   MA  02111-1307, USA.                               *
       + ************************************************************************/
       +
       +#ifndef __CLIST_H__
       +#define __CLIST_H__
       +
       +#ifdef HAVE_CONFIG_H
       +#include <config.h>
       +#endif
       +
       +#ifdef CYGWIN
       +
       +#include <glib.h>
       +
       +typedef struct _GtkCList GtkCList;
       +typedef struct _GtkCListRow GtkCListRow;
       +typedef struct _GtkCListColumn GtkCListColumn;
       +
       +typedef gint (*GtkCListCompareFunc) (GtkCList *clist, gconstpointer ptr1,
       +                                     gconstpointer ptr2);
       +
       +struct _GtkCListColumn {
       +  gchar *title;
       +  gint width;
       +  guint visible:1;
       +  guint resizeable:1;
       +  guint auto_resize:1;
       +  guint button_passive:1;
       +};
       +
       +struct _GtkCListRow {
       +  gpointer data;
       +  gchar **text;
       +};
       +
       +struct _GtkCList {
       +  GtkContainer container;
       +  gint cols, rows;
       +  HWND header;
       +  gint16 header_size;
       +  GSList *rowdata;
       +  GtkCListColumn *coldata;
       +  GList *selection;
       +  GtkSelectionMode mode;
       +  GtkCListCompareFunc cmp_func;
       +  gint auto_sort:1;
       +};
       +
       +#define GTK_CLIST(obj) ((GtkCList *)(obj))
       +
       +GtkWidget *gtk_clist_new(gint columns);
       +GtkWidget *gtk_clist_new_with_titles(gint columns, gchar *titles[]);
       +gint gtk_clist_append(GtkCList *clist, gchar *text[]);
       +void gtk_clist_remove(GtkCList *clist, gint row);
       +void gtk_clist_set_column_title(GtkCList *clist, gint column,
       +                                const gchar *title);
       +gint gtk_clist_insert(GtkCList *clist, gint row, gchar *text[]);
       +gint gtk_clist_set_text(GtkCList *clist, gint row, gint col, gchar *text);
       +void gtk_clist_set_column_width(GtkCList *clist, gint column, gint width);
       +void gtk_clist_column_title_passive(GtkCList *clist, gint column);
       +void gtk_clist_column_titles_passive(GtkCList *clist);
       +void gtk_clist_column_title_active(GtkCList *clist, gint column);
       +void gtk_clist_column_titles_active(GtkCList *clist);
       +void gtk_clist_set_selection_mode(GtkCList *clist, GtkSelectionMode mode);
       +void gtk_clist_sort(GtkCList *clist);
       +void gtk_clist_freeze(GtkCList *clist);
       +void gtk_clist_thaw(GtkCList *clist);
       +void gtk_clist_clear(GtkCList *clist);
       +void gtk_clist_set_row_data(GtkCList *clist, gint row, gpointer data);
       +gpointer gtk_clist_get_row_data(GtkCList *clist, gint row);
       +void gtk_clist_set_auto_sort(GtkCList *clist, gboolean auto_sort);
       +void gtk_clist_columns_autosize(GtkCList *clist);
       +void gtk_clist_select_row(GtkCList *clist, gint row, gint column);
       +void gtk_clist_unselect_row(GtkCList *clist, gint row, gint column);
       +GtkVisibility gtk_clist_row_is_visible(GtkCList *clist, gint row);
       +void gtk_clist_moveto(GtkCList *clist, gint row, gint column,
       +                      gfloat row_align, gfloat col_align);
       +void gtk_clist_set_compare_func(GtkCList *clist,
       +                                GtkCListCompareFunc cmp_func);
       +void gtk_clist_set_column_auto_resize(GtkCList *clist, gint column,
       +                                      gboolean auto_resize);
       +#endif /* CYGWIN */
       +
       +#endif
 (DIR) diff --git a/src/gtkport/gtkport.c b/src/gtkport/gtkport.c
       t@@ -83,8 +83,6 @@ static void gtk_radio_button_toggled(GtkRadioButton *radio_button,
        static void gtk_container_destroy(GtkWidget *widget);
        static void gtk_container_size_request(GtkWidget *widget,
                                               GtkRequisition *requisition);
       -static void gtk_container_set_size(GtkWidget *widget,
       -                                   GtkAllocation *allocation);
        static void gtk_container_show_all(GtkWidget *widget, gboolean hWndOnly);
        static void gtk_window_size_request(GtkWidget *widget,
                                            GtkRequisition *requisition);
       t@@ -93,6 +91,8 @@ static void gtk_window_set_size(GtkWidget *widget,
        static void gtk_window_destroy(GtkWidget *widget);
        static void gtk_window_set_menu(GtkWindow *window, GtkMenuBar *menu_bar);
        static GtkWidget *gtk_window_get_menu_ID(GtkWindow *window, gint ID);
       +static gboolean gtk_window_wndproc(GtkWidget *widget, UINT msg, WPARAM wParam,
       +                                   LPARAM lParam);
        static void gtk_table_destroy(GtkWidget *widget);
        static void gtk_table_size_request(GtkWidget *widget,
                                           GtkRequisition *requisition);
       t@@ -138,14 +138,6 @@ static void gtk_frame_set_size(GtkWidget *widget,
                                       GtkAllocation *allocation);
        static void gtk_frame_destroy(GtkWidget *widget);
        static void gtk_frame_realize(GtkWidget *widget);
       -static void gtk_clist_size_request(GtkWidget *widget,
       -                                   GtkRequisition *requisition);
       -static void gtk_clist_set_size(GtkWidget *widget,
       -                               GtkAllocation *allocation);
       -static void gtk_clist_realize(GtkWidget *widget);
       -static void gtk_clist_show(GtkWidget *widget);
       -static void gtk_clist_hide(GtkWidget *widget);
       -static void gtk_clist_draw_row(GtkCList *clist, LPDRAWITEMSTRUCT lpdis);
        static void gtk_box_show_all(GtkWidget *widget, gboolean hWndOnly);
        static void gtk_table_show_all(GtkWidget *widget, gboolean hWndOnly);
        static void gtk_widget_show_all_full(GtkWidget *widget, gboolean hWndOnly);
       t@@ -224,17 +216,10 @@ static void gtk_option_menu_size_request(GtkWidget *widget,
        static void gtk_option_menu_set_size(GtkWidget *widget,
                                             GtkAllocation *allocation);
        static void gtk_option_menu_realize(GtkWidget *widget);
       -static void gtk_clist_update_selection(GtkWidget *widget);
        static void gtk_button_set_text(GtkButton *button, gchar *text);
        static void gtk_menu_item_set_text(GtkMenuItem *menuitem, gchar *text);
        static void gtk_editable_create(GtkWidget *widget);
        static void gtk_option_menu_update_selection(GtkWidget *widget);
       -static void gtk_clist_update_widths(GtkCList *clist, gchar *text[]);
       -static void gtk_clist_update_all_widths(GtkCList *clist);
       -static void gtk_clist_do_auto_resize(GtkCList *clist);
       -static void gtk_clist_set_column_width_full(GtkCList *clist, gint column,
       -                                            gint width,
       -                                            gboolean ResizeHeader);
        static void gtk_widget_set_focus(GtkWidget *widget);
        static void gtk_widget_lose_focus(GtkWidget *widget);
        static void gtk_window_update_focus(GtkWindow *window);
       t@@ -287,15 +272,15 @@ static GtkSignalType GtkObjectSignals[] = {
        };
        
        static GtkClass GtkObjectClass = {
       -  "object", NULL, sizeof(GtkObject), GtkObjectSignals
       +  "object", NULL, sizeof(GtkObject), GtkObjectSignals, NULL
        };
        
        static GtkClass GtkAdjustmentClass = {
       -  "adjustment", &GtkObjectClass, sizeof(GtkAdjustment), NULL
       +  "adjustment", &GtkObjectClass, sizeof(GtkAdjustment), NULL, NULL
        };
        
        static GtkClass GtkItemFactoryClass = {
       -  "itemfactory", &GtkObjectClass, sizeof(GtkItemFactory), NULL
       +  "itemfactory", &GtkObjectClass, sizeof(GtkItemFactory), NULL, NULL
        };
        
        static GtkSignalType GtkWidgetSignals[] = {
       t@@ -314,7 +299,7 @@ static GtkSignalType GtkWidgetSignals[] = {
        };
        
        static GtkClass GtkWidgetClass = {
       -  "widget", &GtkObjectClass, sizeof(GtkWidget), GtkWidgetSignals
       +  "widget", &GtkObjectClass, sizeof(GtkWidget), GtkWidgetSignals, NULL
        };
        
        static GtkSignalType GtkSeparatorSignals[] = {
       t@@ -324,7 +309,7 @@ static GtkSignalType GtkSeparatorSignals[] = {
        };
        
        static GtkClass GtkMiscClass = {
       -  "misc", &GtkWidgetClass, sizeof(GtkMisc), NULL
       +  "misc", &GtkWidgetClass, sizeof(GtkMisc), NULL, NULL
        };
        
        static GtkSignalType GtkProgressBarSignals[] = {
       t@@ -335,23 +320,23 @@ static GtkSignalType GtkProgressBarSignals[] = {
        
        static GtkClass GtkProgressBarClass = {
          "progressbar", &GtkWidgetClass, sizeof(GtkProgressBar),
       -      GtkProgressBarSignals
       +      GtkProgressBarSignals, NULL
        };
        
        static GtkClass GtkSeparatorClass = {
       -  "separator", &GtkWidgetClass, sizeof(GtkSeparator), GtkSeparatorSignals
       +  "separator", &GtkWidgetClass, sizeof(GtkSeparator), GtkSeparatorSignals, NULL
        };
        
        static GtkClass GtkHSeparatorClass = {
       -  "hseparator", &GtkSeparatorClass, sizeof(GtkHSeparator), NULL
       +  "hseparator", &GtkSeparatorClass, sizeof(GtkHSeparator), NULL, NULL
        };
        
        static GtkClass GtkVSeparatorClass = {
       -  "vseparator", &GtkSeparatorClass, sizeof(GtkVSeparator), NULL
       +  "vseparator", &GtkSeparatorClass, sizeof(GtkVSeparator), NULL, NULL
        };
        
        static GtkClass GtkMenuShellClass = {
       -  "menushell", &GtkWidgetClass, sizeof(GtkMenuShell), NULL
       +  "menushell", &GtkWidgetClass, sizeof(GtkMenuShell), NULL, NULL
        };
        
        static GtkSignalType GtkMenuBarSignals[] = {
       t@@ -360,7 +345,7 @@ static GtkSignalType GtkMenuBarSignals[] = {
        };
        
        static GtkClass GtkMenuBarClass = {
       -  "menubar", &GtkMenuShellClass, sizeof(GtkMenuBar), GtkMenuBarSignals
       +  "menubar", &GtkMenuShellClass, sizeof(GtkMenuBar), GtkMenuBarSignals, NULL
        };
        
        static GtkSignalType GtkMenuItemSignals[] = {
       t@@ -373,7 +358,7 @@ static GtkSignalType GtkMenuItemSignals[] = {
        };
        
        static GtkClass GtkMenuItemClass = {
       -  "menuitem", &GtkWidgetClass, sizeof(GtkMenuItem), GtkMenuItemSignals
       +  "menuitem", &GtkWidgetClass, sizeof(GtkMenuItem), GtkMenuItemSignals, NULL
        };
        
        static GtkSignalType GtkMenuSignals[] = {
       t@@ -382,7 +367,7 @@ static GtkSignalType GtkMenuSignals[] = {
        };
        
        static GtkClass GtkMenuClass = {
       -  "menu", &GtkMenuShellClass, sizeof(GtkMenu), GtkMenuSignals
       +  "menu", &GtkMenuShellClass, sizeof(GtkMenu), GtkMenuSignals, NULL
        };
        
        static GtkSignalType GtkEditableSignals[] = {
       t@@ -392,7 +377,7 @@ static GtkSignalType GtkEditableSignals[] = {
        };
        
        static GtkClass GtkEditableClass = {
       -  "editable", &GtkWidgetClass, sizeof(GtkEditable), GtkEditableSignals
       +  "editable", &GtkWidgetClass, sizeof(GtkEditable), GtkEditableSignals, NULL
        };
        
        static GtkSignalType GtkEntrySignals[] = {
       t@@ -403,7 +388,7 @@ static GtkSignalType GtkEntrySignals[] = {
        };
        
        static GtkClass GtkEntryClass = {
       -  "entry", &GtkEditableClass, sizeof(GtkEntry), GtkEntrySignals
       +  "entry", &GtkEditableClass, sizeof(GtkEntry), GtkEntrySignals, NULL
        };
        
        static GtkSignalType GtkSpinButtonSignals[] = {
       t@@ -417,7 +402,8 @@ static GtkSignalType GtkSpinButtonSignals[] = {
        };
        
        static GtkClass GtkSpinButtonClass = {
       -  "spinbutton", &GtkEntryClass, sizeof(GtkSpinButton), GtkSpinButtonSignals
       +  "spinbutton", &GtkEntryClass, sizeof(GtkSpinButton),
       +  GtkSpinButtonSignals, NULL
        };
        
        static GtkSignalType GtkTextSignals[] = {
       t@@ -427,7 +413,7 @@ static GtkSignalType GtkTextSignals[] = {
        };
        
        static GtkClass GtkTextClass = {
       -  "text", &GtkEditableClass, sizeof(GtkText), GtkTextSignals
       +  "text", &GtkEditableClass, sizeof(GtkText), GtkTextSignals, NULL
        };
        
        static GtkSignalType GtkLabelSignals[] = {
       t@@ -440,7 +426,7 @@ static GtkSignalType GtkLabelSignals[] = {
        };
        
        static GtkClass GtkLabelClass = {
       -  "label", &GtkWidgetClass, sizeof(GtkLabel), GtkLabelSignals
       +  "label", &GtkWidgetClass, sizeof(GtkLabel), GtkLabelSignals, NULL
        };
        
        static GtkSignalType GtkUrlSignals[] = {
       t@@ -452,7 +438,7 @@ static GtkSignalType GtkUrlSignals[] = {
        };
        
        static GtkClass GtkUrlClass = {
       -  "URL", &GtkLabelClass, sizeof(GtkUrl), GtkUrlSignals
       +  "URL", &GtkLabelClass, sizeof(GtkUrl), GtkUrlSignals, NULL
        };
        
        static GtkSignalType GtkButtonSignals[] = {
       t@@ -465,7 +451,7 @@ static GtkSignalType GtkButtonSignals[] = {
        };
        
        static GtkClass GtkButtonClass = {
       -  "button", &GtkWidgetClass, sizeof(GtkButton), GtkButtonSignals
       +  "button", &GtkWidgetClass, sizeof(GtkButton), GtkButtonSignals, NULL
        };
        
        static GtkSignalType GtkOptionMenuSignals[] = {
       t@@ -477,7 +463,7 @@ static GtkSignalType GtkOptionMenuSignals[] = {
        
        static GtkClass GtkOptionMenuClass = {
          "optionmenu", &GtkButtonClass, sizeof(GtkOptionMenu),
       -  GtkOptionMenuSignals
       +  GtkOptionMenuSignals, NULL
        };
        
        static GtkSignalType GtkToggleButtonSignals[] = {
       t@@ -487,7 +473,7 @@ static GtkSignalType GtkToggleButtonSignals[] = {
        
        static GtkClass GtkToggleButtonClass = {
          "toggle", &GtkButtonClass, sizeof(GtkToggleButton),
       -  GtkToggleButtonSignals
       +  GtkToggleButtonSignals, NULL
        };
        
        static GtkSignalType GtkCheckButtonSignals[] = {
       t@@ -498,7 +484,7 @@ static GtkSignalType GtkCheckButtonSignals[] = {
        
        static GtkClass GtkCheckButtonClass = {
          "check", &GtkToggleButtonClass, sizeof(GtkCheckButton),
       -  GtkCheckButtonSignals
       +  GtkCheckButtonSignals, NULL
        };
        
        static GtkSignalType GtkRadioButtonSignals[] = {
       t@@ -509,7 +495,7 @@ static GtkSignalType GtkRadioButtonSignals[] = {
        
        static GtkClass GtkRadioButtonClass = {
          "radio", &GtkCheckButtonClass, sizeof(GtkRadioButton),
       -  GtkRadioButtonSignals
       +  GtkRadioButtonSignals, NULL
        };
        
        static GtkSignalType GtkContainerSignals[] = {
       t@@ -523,7 +509,7 @@ static GtkSignalType GtkContainerSignals[] = {
        };
        
        static GtkClass GtkContainerClass = {
       -  "container", &GtkWidgetClass, sizeof(GtkContainer), GtkContainerSignals
       +  "container", &GtkWidgetClass, sizeof(GtkContainer), GtkContainerSignals, NULL
        };
        
        static GtkSignalType GtkPanedSignals[] = {
       t@@ -533,7 +519,7 @@ static GtkSignalType GtkPanedSignals[] = {
        };
        
        static GtkClass GtkPanedClass = {
       -  "paned", &GtkContainerClass, sizeof(GtkPaned), GtkPanedSignals
       +  "paned", &GtkContainerClass, sizeof(GtkPaned), GtkPanedSignals, NULL
        };
        
        static GtkSignalType GtkVPanedSignals[] = {
       t@@ -544,7 +530,7 @@ static GtkSignalType GtkVPanedSignals[] = {
        };
        
        static GtkClass GtkVPanedClass = {
       -  "vpaned", &GtkPanedClass, sizeof(GtkVPaned), GtkVPanedSignals
       +  "vpaned", &GtkPanedClass, sizeof(GtkVPaned), GtkVPanedSignals, NULL
        };
        
        static GtkSignalType GtkHPanedSignals[] = {
       t@@ -555,7 +541,7 @@ static GtkSignalType GtkHPanedSignals[] = {
        };
        
        static GtkClass GtkHPanedClass = {
       -  "hpaned", &GtkPanedClass, sizeof(GtkHPaned), GtkHPanedSignals
       +  "hpaned", &GtkPanedClass, sizeof(GtkHPaned), GtkHPanedSignals, NULL
        };
        
        static GtkSignalType GtkBoxSignals[] = {
       t@@ -567,7 +553,7 @@ static GtkSignalType GtkBoxSignals[] = {
        };
        
        static GtkClass GtkBoxClass = {
       -  "box", &GtkContainerClass, sizeof(GtkBox), GtkBoxSignals
       +  "box", &GtkContainerClass, sizeof(GtkBox), GtkBoxSignals, NULL
        };
        
        static GtkSignalType GtkNotebookSignals[] = {
       t@@ -581,7 +567,7 @@ static GtkSignalType GtkNotebookSignals[] = {
        };
        
        static GtkClass GtkNotebookClass = {
       -  "notebook", &GtkContainerClass, sizeof(GtkNotebook), GtkNotebookSignals
       +  "notebook", &GtkContainerClass, sizeof(GtkNotebook), GtkNotebookSignals, NULL
        };
        
        static GtkSignalType GtkTableSignals[] = {
       t@@ -595,23 +581,7 @@ static GtkSignalType GtkTableSignals[] = {
        };
        
        static GtkClass GtkTableClass = {
       -  "table", &GtkContainerClass, sizeof(GtkTable), GtkTableSignals
       -};
       -
       -static GtkSignalType GtkCListSignals[] = {
       -  {"size_request", gtk_marshal_VOID__GPOIN, gtk_clist_size_request},
       -  {"set_size", gtk_marshal_VOID__GPOIN, gtk_clist_set_size},
       -  {"realize", gtk_marshal_VOID__VOID, gtk_clist_realize},
       -  {"click-column", gtk_marshal_VOID__GINT, NULL},
       -  {"select_row", gtk_marshal_VOID__GINT_GINT_EVENT, NULL},
       -  {"unselect_row", gtk_marshal_VOID__GINT_GINT_EVENT, NULL},
       -  {"show", gtk_marshal_VOID__VOID, gtk_clist_show},
       -  {"hide", gtk_marshal_VOID__VOID, gtk_clist_hide},
       -  {"", NULL, NULL}
       -};
       -
       -static GtkClass GtkCListClass = {
       -  "clist", &GtkContainerClass, sizeof(GtkCList), GtkCListSignals
       +  "table", &GtkContainerClass, sizeof(GtkTable), GtkTableSignals, NULL
        };
        
        static GtkSignalType GtkHBoxSignals[] = {
       t@@ -621,7 +591,7 @@ static GtkSignalType GtkHBoxSignals[] = {
        };
        
        static GtkClass GtkHBoxClass = {
       -  "hbox", &GtkBoxClass, sizeof(GtkHBox), GtkHBoxSignals
       +  "hbox", &GtkBoxClass, sizeof(GtkHBox), GtkHBoxSignals, NULL
        };
        
        static GtkSignalType GtkVBoxSignals[] = {
       t@@ -631,11 +601,11 @@ static GtkSignalType GtkVBoxSignals[] = {
        };
        
        static GtkClass GtkVBoxClass = {
       -  "vbox", &GtkBoxClass, sizeof(GtkVBox), GtkVBoxSignals
       +  "vbox", &GtkBoxClass, sizeof(GtkVBox), GtkVBoxSignals, NULL
        };
        
        static GtkClass GtkBinClass = {
       -  "bin", &GtkContainerClass, sizeof(GtkBin), NULL
       +  "bin", &GtkContainerClass, sizeof(GtkBin), NULL, NULL
        };
        
        static GtkSignalType GtkFrameSignals[] = {
       t@@ -647,7 +617,7 @@ static GtkSignalType GtkFrameSignals[] = {
        };
        
        static GtkClass GtkFrameClass = {
       -  "frame", &GtkBinClass, sizeof(GtkFrame), GtkFrameSignals
       +  "frame", &GtkBinClass, sizeof(GtkFrame), GtkFrameSignals, NULL
        };
        
        static GtkSignalType GtkWindowSignals[] = {
       t@@ -663,7 +633,8 @@ static GtkSignalType GtkWindowSignals[] = {
        };
        
        static GtkClass GtkWindowClass = {
       -  "window", &GtkBinClass, sizeof(GtkWindow), GtkWindowSignals
       +  "window", &GtkBinClass, sizeof(GtkWindow), GtkWindowSignals,
       +  gtk_window_wndproc
        };
        
        const GtkType GTK_TYPE_WINDOW = &GtkWindowClass;
       t@@ -942,102 +913,87 @@ LRESULT CALLBACK GtkSepProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
            return DefWindowProc(hwnd, msg, wParam, lParam);
        }
        
       -LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
       +gboolean gtk_window_wndproc(GtkWidget *widget, UINT msg, WPARAM wParam,
       +                            LPARAM lParam)
        {
       -  GtkWidget *window, *widget;
       -  GtkClass *klass;
          RECT rect;
          GtkAllocation alloc;
       +  GtkWidget *menu;
          gboolean signal_return;
          GdkEvent event = 0;
       -  LPMEASUREITEMSTRUCT lpmis;
       -  HDC hDC;
       -  TEXTMETRIC tm;
       -  LPDRAWITEMSTRUCT lpdis;
       -  HD_NOTIFY FAR *phdr;
       -  NMHDR *nmhdr;
       -
       -  if (customWndProc
       -      && CallWindowProc(customWndProc, hwnd, msg, wParam, lParam))
       -    return TRUE;
        
       -  switch (msg) {
       +  switch(msg) {
          case WM_SIZE:
       -    window = GTK_WIDGET(GetWindowLong(hwnd, GWL_USERDATA));
       -    GetWindowRect(hwnd, &rect);
       +    GetWindowRect(widget->hWnd, &rect);
            alloc.x = rect.left;
            alloc.y = rect.top;
            alloc.width = rect.right - rect.left;
            alloc.height = rect.bottom - rect.top;
       -    gtk_window_handle_user_size(GTK_WINDOW(window), &alloc);
       -    gtk_widget_set_size(window, &alloc);
       -    break;
       +    gtk_window_handle_user_size(GTK_WINDOW(widget), &alloc);
       +    gtk_widget_set_size(widget, &alloc);
       +    return FALSE;
          case WM_GETMINMAXINFO:
       -    widget = GTK_WIDGET(GetWindowLong(hwnd, GWL_USERDATA));
       -    if (widget)
       -      klass = GTK_OBJECT(widget)->klass;
       -    else
       -      klass = NULL;
       -    if (klass == &GtkWindowClass) {
       -      gtk_window_handle_minmax_size(GTK_WINDOW(widget),
       -                                    (LPMINMAXINFO)lParam);
       -    }
       -    break;
       +    gtk_window_handle_minmax_size(GTK_WINDOW(widget), (LPMINMAXINFO)lParam);
       +    return FALSE;
          case WM_ACTIVATE:
          case WM_ACTIVATEAPP:
       -    widget = GTK_WIDGET(GetWindowLong(hwnd, GWL_USERDATA));
       -    if (widget)
       -      klass = GTK_OBJECT(widget)->klass;
       -    else
       -      klass = NULL;
       -    if (klass == &GtkWindowClass) {
       -      if ((msg == WM_ACTIVATE && LOWORD(wParam) != WA_INACTIVE)
       -          || (msg == WM_ACTIVATEAPP && wParam)) {
       -        if (GTK_WINDOW(widget)->focus) {
       -          gtk_widget_set_focus(GTK_WINDOW(widget)->focus);
       -        }
       -        if (!GTK_WINDOW(widget)->focus) {
       -          gtk_window_set_focus(GTK_WINDOW(widget));
       -        }
       -      } else if (msg == WM_ACTIVATE && LOWORD(wParam) == WA_INACTIVE) {
       -        gtk_window_update_focus(GTK_WINDOW(widget));
       +    if ((msg == WM_ACTIVATE && LOWORD(wParam) != WA_INACTIVE)
       +        || (msg == WM_ACTIVATEAPP && wParam)) {
       +      if (GTK_WINDOW(widget)->focus) {
       +        gtk_widget_set_focus(GTK_WINDOW(widget)->focus);
       +      }
       +      if (!GTK_WINDOW(widget)->focus) {
       +        gtk_window_set_focus(GTK_WINDOW(widget));
              }
       +    } else if (msg == WM_ACTIVATE && LOWORD(wParam) == WA_INACTIVE) {
       +      gtk_window_update_focus(GTK_WINDOW(widget));
            }
       -    break;
       +    return FALSE;
       +  case WM_CLOSE:
       +    gtk_signal_emit(GTK_OBJECT(widget), "delete_event",
       +                    &event, &signal_return);
       +    return FALSE;
          case WM_COMMAND:
       -    widget = GTK_WIDGET(GetWindowLong((HWND)lParam, GWL_USERDATA));
       -    if (widget)
       -      klass = GTK_OBJECT(widget)->klass;
       -    else
       -      klass = NULL;
       -
       -    if (lParam && klass == &GtkCListClass
       -        && HIWORD(wParam) == LBN_SELCHANGE) {
       -      gtk_clist_update_selection(widget);
       -    } else if (lParam && klass == &GtkOptionMenuClass &&
       -               HIWORD(wParam) == CBN_SELENDOK) {
       -      gtk_option_menu_update_selection(widget);
       -    } else if (lParam && HIWORD(wParam) == BN_CLICKED) {
       -      gtk_signal_emit(GTK_OBJECT(widget), "clicked");
       -    } else if (HIWORD(wParam) == 0 || HIWORD(wParam) == 1) {
       -      window = GTK_WIDGET(GetWindowLong(hwnd, GWL_USERDATA));
       -      widget = gtk_window_get_menu_ID(GTK_WINDOW(window), LOWORD(wParam));
       -      if (widget)
       -        gtk_signal_emit(GTK_OBJECT(widget), "activate");
       -    } else
       -      return TRUE;
       +    if (HIWORD(wParam) == 0 || HIWORD(wParam) == 1) {
       +      menu = gtk_window_get_menu_ID(GTK_WINDOW(widget), LOWORD(wParam));
       +      if (menu) {
       +        gtk_signal_emit(GTK_OBJECT(menu), "activate");
       +        return FALSE;
       +      }
       +    }
            break;
       -  case WM_CLOSE:
       -    gtk_signal_emit(GTK_OBJECT(GetWindowLong(hwnd, GWL_USERDATA)),
       -                    "delete_event", &event, &signal_return);
       +  }
       +  return TRUE;
       +}
       +
       +LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
       +{
       +  GtkWidget *widget;
       +  GtkClass *klass;
       +  LPMEASUREITEMSTRUCT lpmis;
       +  HDC hDC;
       +  TEXTMETRIC tm;
       +  LPDRAWITEMSTRUCT lpdis;
       +  HD_NOTIFY FAR *phdr;
       +  NMHDR *nmhdr;
       +
       +  if (customWndProc
       +      && CallWindowProc(customWndProc, hwnd, msg, wParam, lParam))
            return TRUE;
       -    break;
       +
       +  widget = GTK_WIDGET(GetWindowLong(hwnd, GWL_USERDATA));
       +  if (widget && (klass = GTK_OBJECT(widget)->klass)
       +      && klass->wndproc && !klass->wndproc(widget, msg, wParam, lParam)) {
       +    return FALSE;
       +  }
       +
       +  switch (msg) {
          case WM_DRAWITEM:
       -    lpdis = (LPDRAWITEMSTRUCT) lParam;
       -    if (lpdis) {
       -      gtk_clist_draw_row(GTK_CLIST(GetWindowLong(lpdis->hwndItem,
       -                                                 GWL_USERDATA)), lpdis);
       -      return TRUE;
       +    if ((lpdis = (LPDRAWITEMSTRUCT)lParam)
       +        && (widget = GTK_WIDGET(GetWindowLong(lpdis->hwndItem, GWL_USERDATA)))
       +        && (klass = GTK_OBJECT(widget)->klass)
       +        && klass->wndproc && !klass->wndproc(widget, msg, wParam, lParam)) {
       +      return FALSE;
            }
            break;
          case WM_MEASUREITEM:
       t@@ -1051,26 +1007,36 @@ LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
              return TRUE;
            }
            break;
       +  case WM_COMMAND:
       +    widget = GTK_WIDGET(GetWindowLong((HWND)lParam, GWL_USERDATA));
       +    klass = NULL;
       +    if (widget && (klass = GTK_OBJECT(widget)->klass)
       +        && klass->wndproc && !klass->wndproc(widget, msg, wParam, lParam)) {
       +      return FALSE;
       +    }
       +
       +    if (lParam && klass == &GtkOptionMenuClass &&
       +               HIWORD(wParam) == CBN_SELENDOK) {
       +      gtk_option_menu_update_selection(widget);
       +    } else if (lParam && HIWORD(wParam) == BN_CLICKED) {
       +      gtk_signal_emit(GTK_OBJECT(widget), "clicked");
       +    } else
       +      return TRUE;
       +    break;
          case WM_NOTIFY:
            phdr = (HD_NOTIFY FAR *)lParam;
            nmhdr = (NMHDR *)lParam;
            if (!nmhdr)
              break;
       -    if (nmhdr->code == HDN_ENDTRACK) {
       -      gtk_clist_set_column_width_full(GTK_CLIST
       -                                      (GetWindowLong
       -                                       (nmhdr->hwndFrom, GWL_USERDATA)),
       -                                      phdr->iItem, phdr->pitem->cxy,
       -                                      FALSE);
       -      return FALSE;
       -    } else if (nmhdr->code == HDN_ITEMCLICK) {
       -      gtk_signal_emit(GTK_OBJECT
       -                      (GetWindowLong(nmhdr->hwndFrom, GWL_USERDATA)),
       -                      "click-column", (gint)phdr->iItem);
       +
       +    widget = GTK_WIDGET(GetWindowLong(nmhdr->hwndFrom, GWL_USERDATA));
       +    if (widget && (klass = GTK_OBJECT(widget)->klass)
       +        && klass->wndproc && !klass->wndproc(widget, msg, wParam, lParam)) {
              return FALSE;
       -    } else if (nmhdr->code == TCN_SELCHANGE) {
       -      gtk_notebook_set_page(GTK_NOTEBOOK
       -                            (GetWindowLong(nmhdr->hwndFrom, GWL_USERDATA)),
       +    }
       +
       +    if (widget && nmhdr->code == TCN_SELCHANGE) {
       +      gtk_notebook_set_page(GTK_NOTEBOOK(widget),
                                    TabCtrl_GetCurSel(nmhdr->hwndFrom));
              return FALSE;
            }
       t@@ -1079,8 +1045,7 @@ LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, UINT wParam, LONG lParam)
            /* Ignore network messages if in recursive message loops, to avoid
             * dodgy race conditions */
            if (RecurseLevel <= 1) {
       -      /* Make any error available by the usual WSAGetLastError() mechanism 
       -       */
       +      /* Make any error available by the usual WSAGetLastError() mechanism */
              WSASetLastError(WSAGETSELECTERROR(lParam));
              DispatchSocketEvent((SOCKET)wParam, WSAGETSELECTEVENT(lParam));
            }
       t@@ -1886,25 +1851,6 @@ GtkWidget *gtk_entry_new()
          return GTK_WIDGET(entry);
        }
        
       -GtkWidget *gtk_clist_new(gint columns)
       -{
       -  GtkCList *clist;
       -  int i;
       -
       -  clist = GTK_CLIST(GtkNewObject(&GtkCListClass));
       -  clist->cols = columns;
       -  clist->coldata = g_new0(GtkCListColumn, columns);
       -  clist->rows = 0;
       -  clist->rowdata = NULL;
       -  for (i = 0; i < columns; i++) {
       -    clist->coldata[i].width = 0;
       -    clist->coldata[i].visible = TRUE;
       -    clist->coldata[i].resizeable = TRUE;
       -  }
       -
       -  return GTK_WIDGET(clist);
       -}
       -
        GSList *gtk_radio_button_group(GtkRadioButton *radio_button)
        {
          return radio_button->group;
       t@@ -2550,395 +2496,6 @@ void gtk_radio_button_destroy(GtkWidget *widget)
          }
        }
        
       -
       -void gtk_clist_size_request(GtkWidget *widget, GtkRequisition *requisition)
       -{
       -  SIZE size;
       -
       -  if (GetTextSize(widget->hWnd, "Sample text", &size, defFont)) {
       -    requisition->width = size.cx;
       -    requisition->height = size.cy * 6 + 12;
       -  }
       -}
       -
       -void gtk_clist_set_size(GtkWidget *widget, GtkAllocation *allocation)
       -{
       -  GtkCList *clist = GTK_CLIST(widget);
       -
       -  gtk_container_set_size(widget, allocation);
       -  if (clist->header) {
       -    SetWindowPos(clist->header, HWND_TOP,
       -                 allocation->x, allocation->y,
       -                 allocation->width, clist->header_size, SWP_NOZORDER);
       -    allocation->y += clist->header_size - 1;
       -    allocation->height -= clist->header_size - 1;
       -  }
       -}
       -
       -void gtk_clist_realize(GtkWidget *widget)
       -{
       -  HWND Parent, header;
       -  HD_LAYOUT hdl;
       -  HD_ITEM hdi;
       -  RECT rcParent;
       -  WINDOWPOS wp;
       -  GtkCList *clist = GTK_CLIST(widget);
       -  GSList *rows;
       -  GtkCListRow *row;
       -  gint i;
       -
       -  gtk_container_realize(widget);
       -  Parent = gtk_get_parent_hwnd(widget);
       -  GTK_WIDGET_SET_FLAGS(widget, GTK_CAN_FOCUS);
       -  rcParent.left = rcParent.top = 0;
       -  rcParent.right = rcParent.bottom = 800;
       -  header = CreateWindowEx(0, WC_HEADER, NULL,
       -                          WS_CHILD | WS_BORDER | HDS_HORZ
       -                          | (GTK_CLIST(widget)->coldata[0].button_passive ?
       -                             0 : HDS_BUTTONS),
       -                          0, 0, 0, 0, Parent, NULL, hInst, NULL);
       -  SetWindowLong(header, GWL_USERDATA, (LONG)widget);
       -  GTK_CLIST(widget)->header = header;
       -  gtk_set_default_font(header);
       -  hdl.prc = &rcParent;
       -  hdl.pwpos = &wp;
       -  SendMessage(header, HDM_LAYOUT, 0, (LPARAM)&hdl);
       -  clist->header_size = wp.cy;
       -  widget->hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX", "",
       -                                WS_CHILD | WS_TABSTOP | LBS_DISABLENOSCROLL
       -                                | WS_VSCROLL | LBS_OWNERDRAWFIXED |
       -                                LBS_NOTIFY, 0, 0, 0, 0, Parent, NULL,
       -                                hInst, NULL);
       -  gtk_set_default_font(widget->hWnd);
       -
       -  gtk_clist_update_all_widths(clist);
       -  for (rows = clist->rowdata; rows; rows = g_slist_next(rows)) {
       -    row = (GtkCListRow *)rows->data;
       -    if (row)
       -      SendMessage(widget->hWnd, LB_ADDSTRING, 0, (LPARAM)row->data);
       -  }
       -
       -  for (i = 0; i < clist->cols; i++) {
       -    hdi.mask = HDI_TEXT | HDI_FORMAT | HDI_WIDTH;
       -    hdi.pszText = clist->coldata[i].title;
       -    if (hdi.pszText) {
       -      if (i == clist->cols - 1)
       -        hdi.cxy = 9000;
       -      else
       -        hdi.cxy = clist->coldata[i].width;
       -      hdi.cchTextMax = strlen(hdi.pszText);
       -      hdi.fmt = HDF_LEFT | HDF_STRING;
       -      SendMessage(header, HDM_INSERTITEM, i + 1, (LPARAM)&hdi);
       -    }
       -  }
       -}
       -
       -void gtk_clist_show(GtkWidget *widget)
       -{
       -  if (GTK_WIDGET_REALIZED(widget)) {
       -    ShowWindow(GTK_CLIST(widget)->header, SW_SHOWNORMAL);
       -  }
       -}
       -
       -void gtk_clist_hide(GtkWidget *widget)
       -{
       -  if (GTK_WIDGET_REALIZED(widget)) {
       -    ShowWindow(GTK_CLIST(widget)->header, SW_HIDE);
       -  }
       -}
       -
       -void gtk_clist_draw_row(GtkCList *clist, LPDRAWITEMSTRUCT lpdis)
       -{
       -  HBRUSH bkgrnd;
       -  COLORREF textcol, oldtextcol;
       -  RECT rcCol;
       -  gint i, CurrentX;
       -  GtkCListRow *row;
       -
       -  if (lpdis->itemState & ODS_SELECTED) {
       -    bkgrnd = (HBRUSH)(1 + COLOR_HIGHLIGHT);
       -    textcol = (COLORREF)GetSysColor(COLOR_HIGHLIGHTTEXT);
       -  } else {
       -    bkgrnd = (HBRUSH)(1 + COLOR_WINDOW);
       -    textcol = (COLORREF)GetSysColor(COLOR_WINDOWTEXT);
       -  }
       -  oldtextcol = SetTextColor(lpdis->hDC, textcol);
       -  SetBkMode(lpdis->hDC, TRANSPARENT);
       -  FillRect(lpdis->hDC, &lpdis->rcItem, bkgrnd);
       -
       -  if (lpdis->itemID >= 0 && lpdis->itemID < clist->rows) {
       -    row = (GtkCListRow *)g_slist_nth_data(clist->rowdata, lpdis->itemID);
       -    CurrentX = lpdis->rcItem.left;
       -    rcCol.top = lpdis->rcItem.top;
       -    rcCol.bottom = lpdis->rcItem.bottom;
       -    if (row->text)
       -      for (i = 0; i < clist->cols; i++) {
       -        rcCol.left = CurrentX + LISTITEMHPACK;
       -        CurrentX += clist->coldata[i].width;
       -        rcCol.right = CurrentX - LISTITEMHPACK;
       -        if (rcCol.left > lpdis->rcItem.right)
       -          rcCol.left = lpdis->rcItem.right;
       -        if (rcCol.right > lpdis->rcItem.right)
       -          rcCol.right = lpdis->rcItem.right;
       -        if (i == clist->cols - 1)
       -          rcCol.right = lpdis->rcItem.right;
       -        if (row->text[i]) {
       -          DrawText(lpdis->hDC, row->text[i], -1, &rcCol,
       -                   DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS);
       -        }
       -      }
       -  }
       -
       -  SetTextColor(lpdis->hDC, oldtextcol);
       -  SetBkMode(lpdis->hDC, OPAQUE);
       -  if (lpdis->itemState & ODS_FOCUS)
       -    DrawFocusRect(lpdis->hDC, &lpdis->rcItem);
       -}
       -
       -void gtk_clist_do_auto_resize(GtkCList *clist)
       -{
       -  gint i;
       -
       -  for (i = 0; i < clist->cols; i++)
       -    if (clist->coldata[i].auto_resize) {
       -      gtk_clist_set_column_width(clist, i, clist->coldata[i].width);
       -    }
       -}
       -
       -void gtk_clist_update_all_widths(GtkCList *clist)
       -{
       -  GSList *list;
       -  GtkCListRow *row;
       -  gint i;
       -  SIZE size;
       -  HWND header;
       -
       -  header = clist->header;
       -  if (header)
       -    for (i = 0; i < clist->cols; i++) {
       -      if (GetTextSize(header, clist->coldata[i].title, &size, defFont) &&
       -          clist->coldata[i].width < size.cx + 2 * LISTHEADERPACK) {
       -        clist->coldata[i].width = size.cx + 2 * LISTHEADERPACK;
       -      }
       -    }
       -
       -  for (list = clist->rowdata; list; list = g_slist_next(list)) {
       -    row = (GtkCListRow *)list->data;
       -    if (row && row->text)
       -      gtk_clist_update_widths(clist, row->text);
       -  }
       -}
       -
       -void gtk_clist_update_widths(GtkCList *clist, gchar *text[])
       -{
       -  gint i;
       -  SIZE size;
       -  HWND hWnd;
       -
       -  hWnd = GTK_WIDGET(clist)->hWnd;
       -  if (!hWnd)
       -    return;
       -  for (i = 0; i < clist->cols; i++) {
       -    if (clist->coldata[i].auto_resize
       -        && GetTextSize(hWnd, text[i], &size, defFont)
       -        && size.cx + 2 * LISTITEMHPACK > clist->coldata[i].width) {
       -      clist->coldata[i].width = size.cx + 2 * LISTITEMHPACK;
       -    }
       -  }
       -}
       -
       -gint gtk_clist_insert(GtkCList *clist, gint row, gchar *text[])
       -{
       -  GtkWidget *widget = GTK_WIDGET(clist);
       -  HWND hWnd;
       -  GtkCListRow *new_row;
       -  gint i;
       -
       -  if (row < 0)
       -    row = clist->rows;
       -
       -  new_row = g_new0(GtkCListRow, 1);
       -  new_row->text = g_new0(gchar *, clist->cols);
       -
       -  for (i = 0; i < clist->cols; i++) {
       -    new_row->text[i] = g_strdup(text[i]);
       -  }
       -  gtk_clist_update_widths(clist, new_row->text);
       -  gtk_clist_do_auto_resize(clist);
       -  clist->rowdata = g_slist_insert(clist->rowdata, (gpointer)new_row, row);
       -  clist->rows = g_slist_length(clist->rowdata);
       -
       -  if (GTK_WIDGET_REALIZED(widget)) {
       -    hWnd = widget->hWnd;
       -    SendMessage(hWnd, LB_INSERTSTRING, (WPARAM)row, (LPARAM)NULL);
       -  }
       -
       -  return row;
       -}
       -
       -gint gtk_clist_set_text(GtkCList *clist, gint row, gint col, gchar *text)
       -{
       -  GtkCListRow *list_row;
       -
       -  if (row < 0 || row >= clist->rows || col < 0 || col >= clist->cols)
       -    return -1;
       -
       -  list_row = (GtkCListRow *)g_slist_nth_data(clist->rowdata, row);
       -  g_free(list_row->text[col]);
       -  list_row->text[col] = g_strdup(text);
       -
       -  if (GTK_WIDGET_REALIZED(GTK_WIDGET(clist))) {
       -    HWND hWnd = GTK_WIDGET(clist)->hWnd;
       -
       -    InvalidateRect(hWnd, NULL, FALSE);
       -    UpdateWindow(hWnd);
       -  }
       -  return row;
       -}
       -
       -void gtk_clist_remove(GtkCList *clist, gint row)
       -{
       -  if (row >= 0 && row < clist->rows) {
       -    GSList *dellink;
       -    GtkCListRow *delrow;
       -    int i;
       -
       -    gtk_clist_unselect_row(clist, row, 0);
       -    dellink = g_slist_nth(clist->rowdata, row);
       -    delrow = (GtkCListRow *)dellink->data;
       -    for (i = 0; i < clist->cols; i++) {
       -      g_free(delrow->text[i]);
       -    }
       -    g_free(delrow->text);
       -    clist->rowdata = g_slist_remove_link(clist->rowdata, dellink);
       -    g_free(dellink);
       -
       -    clist->rows = g_slist_length(clist->rowdata);
       -
       -    if (GTK_WIDGET_REALIZED(GTK_WIDGET(clist))) {
       -      HWND hWnd = GTK_WIDGET(clist)->hWnd;
       -
       -      SendMessage(hWnd, LB_DELETESTRING, (WPARAM)row, 0);
       -    }
       -  }
       -}
       -
       -GtkWidget *gtk_clist_new_with_titles(gint columns, gchar *titles[])
       -{
       -  GtkWidget *widget;
       -  GtkCList *clist;
       -  gint i;
       -
       -  widget = gtk_clist_new(columns);
       -  clist = GTK_CLIST(widget);
       -  for (i = 0; i < clist->cols; i++) {
       -    gtk_clist_set_column_title(clist, i, titles[i]);
       -  }
       -  return widget;
       -}
       -
       -GtkWidget *gtk_scrolled_clist_new_with_titles(gint columns,
       -                                              gchar *titles[],
       -                                              GtkWidget **pack_widg)
       -{
       -  GtkWidget *widget;
       -
       -  widget = gtk_clist_new_with_titles(columns, titles);
       -  *pack_widg = widget;
       -  return widget;
       -}
       -
       -gint gtk_clist_append(GtkCList *clist, gchar *text[])
       -{
       -  return gtk_clist_insert(clist, -1, text);
       -}
       -
       -void gtk_clist_set_column_title(GtkCList *clist, gint column,
       -                                const gchar *title)
       -{
       -  HWND hWnd;
       -
       -  if (column < 0 || column >= clist->cols)
       -    return;
       -  g_free(clist->coldata[column].title);
       -  clist->coldata[column].title = g_strdup(title);
       -  if (GTK_WIDGET_REALIZED(GTK_WIDGET(clist))) {
       -    hWnd = GTK_WIDGET(clist)->hWnd;
       -    InvalidateRect(hWnd, NULL, FALSE);
       -    UpdateWindow(hWnd);
       -  }
       -}
       -
       -void gtk_clist_column_title_passive(GtkCList *clist, gint column)
       -{
       -  if (column >= 0 && column < clist->cols)
       -    clist->coldata[column].button_passive = TRUE;
       -}
       -
       -void gtk_clist_column_titles_passive(GtkCList *clist)
       -{
       -  gint i;
       -
       -  for (i = 0; i < clist->cols; i++) {
       -    gtk_clist_column_title_passive(clist, i);
       -  }
       -}
       -
       -void gtk_clist_column_title_active(GtkCList *clist, gint column)
       -{
       -  if (column >= 0 && column < clist->cols)
       -    clist->coldata[column].button_passive = FALSE;
       -}
       -
       -void gtk_clist_column_titles_active(GtkCList *clist)
       -{
       -  gint i;
       -
       -  for (i = 0; i < clist->cols; i++) {
       -    gtk_clist_column_title_active(clist, i);
       -  }
       -}
       -
       -void gtk_clist_set_column_width(GtkCList *clist, gint column, gint width)
       -{
       -  gtk_clist_set_column_width_full(clist, column, width, TRUE);
       -}
       -
       -void gtk_clist_set_column_width_full(GtkCList *clist, gint column,
       -                                     gint width, gboolean ResizeHeader)
       -{
       -  HWND hWnd, header;
       -  HD_ITEM hdi;
       -
       -  if (column < 0 || column >= clist->cols)
       -    return;
       -
       -  clist->coldata[column].width = width;
       -  if (GTK_WIDGET_REALIZED(GTK_WIDGET(clist))) {
       -    header = clist->header;
       -    if (ResizeHeader && header) {
       -      hdi.mask = HDI_WIDTH;
       -      if (column == clist->cols - 1)
       -        width = 9000;
       -      hdi.cxy = width;
       -      if (SendMessage(header, HDM_GETITEM, (WPARAM)column, (LPARAM)&hdi) &&
       -          hdi.cxy != width) {
       -        hdi.mask = HDI_WIDTH;
       -        hdi.cxy = width;
       -        SendMessage(header, HDM_SETITEM, (WPARAM)column, (LPARAM)&hdi);
       -      }
       -    }
       -    hWnd = GTK_WIDGET(clist)->hWnd;
       -    if (hWnd)
       -      InvalidateRect(hWnd, NULL, FALSE);
       -  }
       -}
       -
       -void gtk_clist_set_selection_mode(GtkCList *clist, GtkSelectionMode mode)
       -{
       -  clist->mode = mode;
       -}
       -
        void gtk_container_show_all(GtkWidget *widget, gboolean hWndOnly)
        {
          GtkContainer *container = GTK_CONTAINER(widget);
       t@@ -5031,91 +4588,6 @@ void gtk_text_thaw(GtkText *text)
        {
        }
        
       -static GtkCList *sorting_clist;
       -static gint gtk_clist_sort_func(gconstpointer a, gconstpointer b)
       -{
       -  return (*sorting_clist->cmp_func) (sorting_clist, a, b);
       -}
       -
       -void gtk_clist_sort(GtkCList *clist)
       -{
       -  HWND hWnd;
       -  gint rowind;
       -  GList *sel;
       -  GSList *rowpt;
       -
       -  sorting_clist = clist;
       -  if (clist && clist->cmp_func && clist->rows) {
       -    /* Since the order of the list may change, we need to change the
       -     * selection as well. Do this by converting the row indices into
       -     * GSList pointers (which are invariant to the sort) and then convert
       -     * back afterwards */
       -    for (sel = clist->selection; sel; sel = g_list_next(sel)) {
       -      rowind = GPOINTER_TO_INT(sel->data);
       -      sel->data = (gpointer)g_slist_nth(clist->rowdata, rowind);
       -    }
       -    clist->rowdata = g_slist_sort(clist->rowdata, gtk_clist_sort_func);
       -    for (sel = clist->selection; sel; sel = g_list_next(sel)) {
       -      rowpt = (GSList *)(sel->data);
       -      sel->data = GINT_TO_POINTER(g_slist_position(clist->rowdata, rowpt));
       -    }
       -    if (GTK_WIDGET_REALIZED(GTK_WIDGET(clist))) {
       -      hWnd = GTK_WIDGET(clist)->hWnd;
       -      if (clist->mode == GTK_SELECTION_SINGLE) {
       -        sel = clist->selection;
       -        if (sel)
       -          rowind = GPOINTER_TO_INT(sel->data);
       -        else
       -          rowind = -1;
       -        SendMessage(hWnd, LB_SETCURSEL, (WPARAM)rowind, 0);
       -      } else {
       -        for (rowind = 0; rowind < clist->rows; rowind++) {
       -          SendMessage(hWnd, LB_SETSEL, (WPARAM)FALSE, (LPARAM)rowind);
       -        }
       -        for (sel = clist->selection; sel; sel = g_list_next(sel)) {
       -          rowind = GPOINTER_TO_INT(sel->data);
       -          SendMessage(hWnd, LB_SETSEL, (WPARAM)TRUE, (LPARAM)rowind);
       -        }
       -      }
       -      InvalidateRect(hWnd, NULL, FALSE);
       -      UpdateWindow(hWnd);
       -    }
       -  }
       -}
       -
       -void gtk_clist_freeze(GtkCList *clist)
       -{
       -}
       -
       -void gtk_clist_thaw(GtkCList *clist)
       -{
       -}
       -
       -void gtk_clist_clear(GtkCList *clist)
       -{
       -  GtkCListRow *row;
       -  GSList *list;
       -  gint i;
       -  HWND hWnd;
       -
       -  for (list = clist->rowdata; list; list = g_slist_next(list)) {
       -    row = (GtkCListRow *)list->data;
       -    for (i = 0; i < clist->cols; i++) {
       -      g_free(row->text[i]);
       -    }
       -    g_free(row);
       -  }
       -  g_slist_free(clist->rowdata);
       -  clist->rowdata = NULL;
       -  clist->rows = 0;
       -
       -  gtk_clist_update_all_widths(clist);
       -  hWnd = GTK_WIDGET(clist)->hWnd;
       -  if (hWnd) {
       -    SendMessage(hWnd, LB_RESETCONTENT, 0, 0);
       -  }
       -}
       -
        GtkWidget *gtk_option_menu_new()
        {
          GtkOptionMenu *option_menu;
       t@@ -5258,38 +4730,6 @@ void gtk_label_get(GtkLabel *label, gchar **str)
          *str = label->text;
        }
        
       -void gtk_clist_set_row_data(GtkCList *clist, gint row, gpointer data)
       -{
       -  GtkCListRow *list_row;
       -
       -  if (row >= 0 && row < clist->rows) {
       -    list_row = (GtkCListRow *)g_slist_nth_data(clist->rowdata, row);
       -    if (list_row)
       -      list_row->data = data;
       -  }
       -}
       -
       -gpointer gtk_clist_get_row_data(GtkCList *clist, gint row)
       -{
       -  GtkCListRow *list_row;
       -
       -  if (row >= 0 && row < clist->rows) {
       -    list_row = (GtkCListRow *)g_slist_nth_data(clist->rowdata, row);
       -    if (list_row)
       -      return list_row->data;
       -  }
       -  return NULL;
       -}
       -
       -void gtk_clist_set_auto_sort(GtkCList *clist, gboolean auto_sort)
       -{
       -  clist->auto_sort = auto_sort;
       -}
       -
       -void gtk_clist_columns_autosize(GtkCList *clist)
       -{
       -}
       -
        void gtk_text_set_point(GtkText *text, guint index)
        {
          gtk_editable_set_position(GTK_EDITABLE(text), index);
       t@@ -5301,95 +4741,6 @@ void gtk_widget_set_usize(GtkWidget *widget, gint width, gint height)
          widget->usize.height = height;
        }
        
       -void gtk_clist_select_row(GtkCList *clist, gint row, gint column)
       -{
       -  HWND hWnd;
       -
       -  hWnd = GTK_WIDGET(clist)->hWnd;
       -  if (hWnd) {
       -    if (clist->mode == GTK_SELECTION_SINGLE) {
       -      SendMessage(hWnd, LB_SETCURSEL, (WPARAM)row, 0);
       -    } else {
       -      SendMessage(hWnd, LB_SETSEL, (WPARAM)TRUE, (LPARAM)row);
       -    }
       -    gtk_clist_update_selection(GTK_WIDGET(clist));
       -  }
       -}
       -
       -void gtk_clist_unselect_row(GtkCList *clist, gint row, gint column)
       -{
       -  HWND hWnd;
       -
       -  hWnd = GTK_WIDGET(clist)->hWnd;
       -  if (hWnd) {
       -    if (clist->mode == GTK_SELECTION_SINGLE) {
       -      SendMessage(hWnd, LB_SETCURSEL, (WPARAM)(-1), 0);
       -    } else {
       -      SendMessage(hWnd, LB_SETSEL, (WPARAM)FALSE, (LPARAM)row);
       -    }
       -    gtk_clist_update_selection(GTK_WIDGET(clist));
       -  }
       -}
       -
       -GtkVisibility gtk_clist_row_is_visible(GtkCList *clist, gint row)
       -{
       -  return GTK_VISIBILITY_FULL;
       -}
       -
       -void gtk_clist_moveto(GtkCList *clist, gint row, gint column,
       -                      gfloat row_align, gfloat col_align)
       -{
       -}
       -
       -void gtk_clist_set_compare_func(GtkCList *clist,
       -                                GtkCListCompareFunc cmp_func)
       -{
       -  if (clist)
       -    clist->cmp_func = cmp_func;
       -}
       -
       -void gtk_clist_set_column_auto_resize(GtkCList *clist, gint column,
       -                                      gboolean auto_resize)
       -{
       -  if (clist && column >= 0 && column < clist->cols) {
       -    clist->coldata[column].auto_resize = auto_resize;
       -  }
       -}
       -
       -void gtk_clist_update_selection(GtkWidget *widget)
       -{
       -  GtkCList *clist = GTK_CLIST(widget);
       -  GList *oldsel, *selpt;
       -  gint i;
       -
       -  oldsel = clist->selection;
       -  clist->selection = NULL;
       -  if (widget->hWnd) {
       -    for (i = 0; i < clist->rows; i++) {
       -      if (SendMessage(widget->hWnd, LB_GETSEL, (WPARAM)i, 0) > 0) {
       -        clist->selection = g_list_append(clist->selection, GINT_TO_POINTER(i));
       -      }
       -    }
       -
       -    for (selpt = oldsel; selpt; selpt = g_list_next(selpt)) {
       -      gint row = GPOINTER_TO_INT(selpt->data);
       -
       -      if (!g_list_find(clist->selection, GINT_TO_POINTER(row))) {
       -        gtk_signal_emit(GTK_OBJECT(widget), "unselect_row", row, 0, NULL);
       -      }
       -    }
       -
       -    for (selpt = clist->selection; selpt; selpt = g_list_next(selpt)) {
       -      gint row = GPOINTER_TO_INT(selpt->data);
       -
       -      if (!g_list_find(oldsel, GINT_TO_POINTER(row))) {
       -        gtk_signal_emit(GTK_OBJECT(widget), "select_row", row, 0, NULL);
       -      }
       -    }
       -  }
       -  g_list_free(oldsel);
       -}
       -
        void gtk_editable_create(GtkWidget *widget)
        {
          GtkEditable *editable = GTK_EDITABLE(widget);
       t@@ -5652,22 +5003,6 @@ GtkWidget *gtk_scrolled_text_new(GtkAdjustment *hadj, GtkAdjustment *vadj,
          return text;
        }
        
       -GtkWidget *gtk_scrolled_clist_new_with_titles(gint columns,
       -                                              gchar *titles[],
       -                                              GtkWidget **pack_widg)
       -{
       -  GtkWidget *scrollwin, *clist;
       -
       -  clist = gtk_clist_new_with_titles(columns, titles);
       -  scrollwin = gtk_scrolled_window_new(NULL, NULL);
       -  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin),
       -                                 GTK_POLICY_AUTOMATIC,
       -                                 GTK_POLICY_AUTOMATIC);
       -  gtk_container_add(GTK_CONTAINER(scrollwin), clist);
       -  *pack_widg = scrollwin;
       -  return clist;
       -}
       -
        static void DestroyGtkMessageBox(GtkWidget *widget, gpointer data)
        {
          gtk_main_quit();
 (DIR) diff --git a/src/gtkport/gtkport.h b/src/gtkport/gtkport.h
       t@@ -120,12 +120,14 @@ typedef struct _GtkRequisition GtkRequisition;
        typedef struct _GtkAllocation GtkAllocation;
        typedef struct _GtkWidget GtkWidget;
        typedef struct _GtkSignalType GtkSignalType;
       +typedef struct _GtkContainer GtkContainer;
        
        typedef void (*GtkSignalFunc) ();
        typedef void (*GtkItemFactoryCallback) ();
        typedef void (*GtkSignalMarshaller) (GtkObject *object, GSList *actions,
                                             GtkSignalFunc default_action,
                                             va_list args);
       +
        typedef struct _GtkMenuShell GtkMenuShell;
        typedef struct _GtkMenuBar GtkMenuBar;
        typedef struct _GtkMenuItem GtkMenuItem;
       t@@ -154,11 +156,15 @@ struct _GtkSignalType {
          GtkSignalFunc default_action;
        };
        
       +typedef gboolean (*GtkWndProc) (GtkWidget *widget, UINT msg,
       +                                WPARAM wParam, LPARAM lParam);
       +
        struct _GtkClass {
          gchar *Name;
          GtkClass *parent;
          gint Size;
          GtkSignalType *signals;
       +  GtkWndProc wndproc;
        };
        
        typedef GtkClass *GtkType;
       t@@ -193,6 +199,14 @@ struct _GtkWidget {
          GtkWidget *parent;
        };
        
       +struct _GtkContainer {
       +  GtkWidget widget;
       +  GtkWidget *child;
       +  guint border_width:16;
       +};
       +
       +#include "clist.h"
       +
        struct _GtkMisc {
          GtkWidget widget;
        };
       t@@ -280,14 +294,6 @@ struct _GtkUrl {
          gchar *target;
        };
        
       -typedef struct _GtkContainer GtkContainer;
       -
       -struct _GtkContainer {
       -  GtkWidget widget;
       -  GtkWidget *child;
       -  guint border_width:16;
       -};
       -
        struct _GtkPanedChild {
          GtkWidget *widget;
          gint resize:1;
       t@@ -317,15 +323,9 @@ typedef struct _GtkHBox GtkHBox;
        typedef struct _GtkVBox GtkVBox;
        typedef struct _GtkNotebookChild GtkNotebookChild;
        typedef struct _GtkNotebook GtkNotebook;
       -typedef struct _GtkCList GtkCList;
       -typedef struct _GtkCListRow GtkCListRow;
       -typedef struct _GtkCListColumn GtkCListColumn;
        typedef struct _GtkItemFactoryEntry GtkItemFactoryEntry;
        typedef struct _GtkItemFactory GtkItemFactory;
        
       -typedef gint (*GtkCListCompareFunc) (GtkCList *clist, gconstpointer ptr1,
       -                                     gconstpointer ptr2);
       -
        struct _GtkItemFactoryEntry {
          gchar *path;
          gchar *accelerator;
       t@@ -376,33 +376,6 @@ struct _GtkNotebook {
          gint selection;
        };
        
       -struct _GtkCListColumn {
       -  gchar *title;
       -  gint width;
       -  guint visible:1;
       -  guint resizeable:1;
       -  guint auto_resize:1;
       -  guint button_passive:1;
       -};
       -
       -struct _GtkCListRow {
       -  gpointer data;
       -  gchar **text;
       -};
       -
       -struct _GtkCList {
       -  GtkContainer container;
       -  gint cols, rows;
       -  HWND header;
       -  gint16 header_size;
       -  GSList *rowdata;
       -  GtkCListColumn *coldata;
       -  GList *selection;
       -  GtkSelectionMode mode;
       -  GtkCListCompareFunc cmp_func;
       -  gint auto_sort:1;
       -};
       -
        typedef struct _GtkBin GtkBin;
        
        struct _GtkBin {
       t@@ -497,7 +470,6 @@ struct _GtkTableRowCol {
        #define GTK_BIN(obj) ((GtkBin *)(obj))
        #define GTK_FRAME(obj) ((GtkFrame *)(obj))
        #define GTK_BOX(obj) ((GtkBox *)(obj))
       -#define GTK_CLIST(obj) ((GtkCList *)(obj))
        #define GTK_HBOX(obj) ((GtkHBox *)(obj))
        #define GTK_VBOX(obj) ((GtkVBox *)(obj))
        #define GTK_NOTEBOOK(obj) ((GtkNotebook *)(obj))
       t@@ -584,24 +556,6 @@ void gtk_item_factory_create_items(GtkItemFactory *ifactory,
                                           gpointer callback_data);
        GtkWidget *gtk_item_factory_get_widget(GtkItemFactory *ifactory,
                                               const gchar *path);
       -GtkWidget *gtk_clist_new(gint columns);
       -GtkWidget *gtk_clist_new_with_titles(gint columns, gchar *titles[]);
       -gint gtk_clist_append(GtkCList *clist, gchar *text[]);
       -void gtk_clist_remove(GtkCList *clist, gint row);
       -void gtk_clist_set_column_title(GtkCList *clist, gint column,
       -                                const gchar *title);
       -gint gtk_clist_insert(GtkCList *clist, gint row, gchar *text[]);
       -gint gtk_clist_set_text(GtkCList *clist, gint row, gint col, gchar *text);
       -void gtk_clist_set_column_width(GtkCList *clist, gint column, gint width);
       -void gtk_clist_column_title_passive(GtkCList *clist, gint column);
       -void gtk_clist_column_titles_passive(GtkCList *clist);
       -void gtk_clist_column_title_active(GtkCList *clist, gint column);
       -void gtk_clist_column_titles_active(GtkCList *clist);
       -void gtk_clist_set_selection_mode(GtkCList *clist, GtkSelectionMode mode);
       -void gtk_clist_sort(GtkCList *clist);
       -void gtk_clist_freeze(GtkCList *clist);
       -void gtk_clist_thaw(GtkCList *clist);
       -void gtk_clist_clear(GtkCList *clist);
        GSList *gtk_radio_button_group(GtkRadioButton *radio_button);
        void gtk_editable_insert_text(GtkEditable *editable, const gchar *new_text,
                                      gint new_text_length, gint *position);
       t@@ -724,21 +678,8 @@ void gtk_option_menu_set_history(GtkOptionMenu *option_menu, guint index);
        void gtk_label_set_text(GtkLabel *label, const gchar *str);
        guint gtk_label_parse_uline(GtkLabel *label, const gchar *str);
        void gtk_label_get(GtkLabel *label, gchar **str);
       -void gtk_clist_set_row_data(GtkCList *clist, gint row, gpointer data);
       -gpointer gtk_clist_get_row_data(GtkCList *clist, gint row);
       -void gtk_clist_set_auto_sort(GtkCList *clist, gboolean auto_sort);
       -void gtk_clist_columns_autosize(GtkCList *clist);
        void gtk_text_set_point(GtkText *text, guint index);
        void gtk_widget_set_usize(GtkWidget *widget, gint width, gint height);
       -void gtk_clist_select_row(GtkCList *clist, gint row, gint column);
       -void gtk_clist_unselect_row(GtkCList *clist, gint row, gint column);
       -GtkVisibility gtk_clist_row_is_visible(GtkCList *clist, gint row);
       -void gtk_clist_moveto(GtkCList *clist, gint row, gint column,
       -                      gfloat row_align, gfloat col_align);
       -void gtk_clist_set_compare_func(GtkCList *clist,
       -                                GtkCListCompareFunc cmp_func);
       -void gtk_clist_set_column_auto_resize(GtkCList *clist, gint column,
       -                                      gboolean auto_resize);
        gint gtk_spin_button_get_value_as_int(GtkSpinButton *spin_button);
        void gtk_spin_button_set_value(GtkSpinButton *spin_button, gfloat value);
        void gtk_spin_button_set_adjustment(GtkSpinButton *spin_button,
       t@@ -754,6 +695,9 @@ guint gtk_timeout_add(guint32 interval, GtkFunction function,
        void gtk_timeout_remove(guint timeout_handler_id);
        guint gtk_main_level(void);
        
       +/* Private functions */
       +void gtk_container_set_size(GtkWidget *widget, GtkAllocation *allocation);
       +
        #else /* CYGWIN */
        
        /* Include standard GTK+ headers on Unix systems */