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 = ℘ + 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 = ℘ - 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 */