tDrop our old Win32 GtkCList implementation - vaccinewars - be a doctor and try… | |
git clone git://src.adamsgaard.dk/vaccinewars | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 66e285514734be7ba71885e8e178cbfd25ac2180 | |
parent 63b61df04aa175dd7db2f71a556548ee6cc3b7ed | |
Author: Ben Webb <[email protected]> | |
Date: Sun, 29 Nov 2020 00:04:25 -0800 | |
Drop our old Win32 GtkCList implementation | |
We have now switched to GTK+3 and use GtkTreeView | |
for all lists, so our GtkCList implementation is | |
no longer needed on Win32. | |
Diffstat: | |
M src/gtkport/Makefile.am | 2 +- | |
D src/gtkport/clist.c | 890 -----------------------------… | |
D src/gtkport/clist.h | 113 -----------------------------… | |
M src/gtkport/gtkport.c | 1 - | |
M src/gtkport/gtkport.h | 4 ---- | |
5 files changed, 1 insertion(+), 1009 deletions(-) | |
--- | |
diff --git a/src/gtkport/Makefile.am b/src/gtkport/Makefile.am | |
t@@ -1,5 +1,5 @@ | |
noinst_LIBRARIES = libgtkport.a | |
-libgtkport_a_SOURCES = gtkport.c gtkport.h clist.c clist.h gtkenums.h \ | |
+libgtkport_a_SOURCES = gtkport.c gtkport.h gtkenums.h \ | |
unicodewrap.c unicodewrap.h treeview.h treeview.c \ | |
itemfactory.c itemfactory.h gtktypes.h | |
AM_CPPFLAGS= -I../../intl -I${srcdir} -I${srcdir}/.. -I../.. @GTK_CFLAGS@ @GLI… | |
diff --git a/src/gtkport/clist.c b/src/gtkport/clist.c | |
t@@ -1,890 +0,0 @@ | |
-/************************************************************************ | |
- * clist.c GtkCList implementation for gtkport * | |
- * Copyright (C) 1998-2020 Ben Webb * | |
- * Email: [email protected] * | |
- * WWW: https://dopewars.sourceforge.io/ * | |
- * * | |
- * 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 | |
- | |
-#include <winsock2.h> | |
-#include <windows.h> | |
-#include <commctrl.h> | |
- | |
-#include "unicodewrap.h" | |
- | |
-#define LISTITEMHPACK 3 | |
-#define LISTHEADERPACK 6 | |
- | |
-static const gchar *WC_GTKCLISTHDR = "WC_GTKCLISTHDR"; | |
- | |
-static WNDPROC wpOrigListProc; | |
- | |
-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, gboolean *dodef); | |
-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 | |
-}; | |
- | |
-static void SetCListHeaderSize(GtkCList *clist) | |
-{ | |
- RECT rc; | |
- HWND hWnd; | |
- int width; | |
- | |
- hWnd = GTK_WIDGET(clist)->hWnd; | |
- clist->scrollpos = GetScrollPos(hWnd, SB_HORZ); | |
- | |
- GetWindowRect(hWnd, &rc); | |
- width = (int)mySendMessage(hWnd, LB_GETHORIZONTALEXTENT, 0, 0); | |
- width = MAX(width, rc.right - rc.left) + 100; | |
- | |
- SetWindowPos(clist->header, HWND_TOP, -clist->scrollpos, 0, | |
- width, clist->header_size, SWP_NOZORDER); | |
-} | |
- | |
-static LRESULT APIENTRY ListWndProc(HWND hwnd, UINT msg, WPARAM wParam, | |
- LPARAM lParam) | |
-{ | |
- LRESULT retval; | |
- GtkWidget *widget; | |
- | |
- widget = GTK_WIDGET(GetWindowLongPtr(hwnd, GWLP_USERDATA)); | |
- retval = myCallWindowProc(wpOrigListProc, hwnd, msg, wParam, lParam); | |
- | |
- if (msg == WM_HSCROLL && widget) { | |
- GtkCList *clist = GTK_CLIST(widget); | |
- SetCListHeaderSize(clist); | |
- } | |
- | |
- return retval; | |
-} | |
- | |
-gboolean gtk_clist_wndproc(GtkWidget *widget, UINT msg, WPARAM wParam, | |
- LPARAM lParam, gboolean *dodef) | |
-{ | |
- LPDRAWITEMSTRUCT lpdis; | |
- HD_NOTIFYA FAR *phdr; | |
- HD_NOTIFYW FAR *phdrw; | |
- 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); | |
- *dodef = FALSE; | |
- return TRUE; | |
- } | |
- break; | |
- case WM_NOTIFY: | |
- nmhdr = (NMHDR *)lParam; | |
- if (nmhdr) { | |
- switch(nmhdr->code) { | |
- case HDN_ENDTRACKA: | |
- phdr = (HD_NOTIFYA FAR *)lParam; | |
- gtk_clist_set_column_width_full(GTK_CLIST(widget), phdr->iItem, | |
- phdr->pitem->cxy, FALSE); | |
- return FALSE; | |
- case HDN_ENDTRACKW: | |
- phdrw = (HD_NOTIFYW FAR *)lParam; | |
- gtk_clist_set_column_width_full(GTK_CLIST(widget), phdrw->iItem, | |
- phdrw->pitem->cxy, FALSE); | |
- return FALSE; | |
- case HDN_ITEMCLICKA: | |
- phdr = (HD_NOTIFYA FAR *)lParam; | |
- gtk_signal_emit(G_OBJECT(widget), "click-column", (gint)phdr->iItem); | |
- return FALSE; | |
- case HDN_ITEMCLICKW: | |
- phdrw = (HD_NOTIFYW FAR *)lParam; | |
- gtk_signal_emit(G_OBJECT(widget), "click-column", (gint)phdrw->iItem); | |
- return FALSE; | |
- default: | |
- break; | |
- } | |
- } | |
- break; | |
- } | |
- | |
- return FALSE; | |
-} | |
- | |
-static void gtk_clist_set_extent(GtkCList *clist) | |
-{ | |
- gint i; | |
- HWND hWnd; | |
- | |
- hWnd = GTK_WIDGET(clist)->hWnd; | |
- if (hWnd) { | |
- int width = 0; | |
- | |
- for (i = 0; i < clist->cols; i++) { | |
- width += clist->coldata[i].width; | |
- } | |
- mySendMessage(hWnd, LB_SETHORIZONTALEXTENT, (WPARAM)width, 0); | |
- SetCListHeaderSize(clist); | |
- } | |
-} | |
- | |
-void gtk_clist_set_size(GtkWidget *widget, GtkAllocation *allocation) | |
-{ | |
- GtkCList *clist = GTK_CLIST(widget); | |
- | |
- gtk_container_set_size(widget, allocation); | |
- if (clist->header) { | |
- POINT pt; | |
- pt.x = allocation->x; | |
- pt.y = allocation->y; | |
- MapWidgetOrigin(widget, &pt); | |
- SetWindowPos(clist->scrollwin, HWND_TOP, pt.x, pt.y, | |
- allocation->width, clist->header_size, SWP_NOZORDER); | |
- allocation->y += clist->header_size - 1; | |
- allocation->height -= clist->header_size - 1; | |
- } | |
- gtk_clist_set_extent(clist); | |
-} | |
- | |
-GtkWidget *gtk_clist_new(gint columns) | |
-{ | |
- GtkCList *clist; | |
- int i; | |
- | |
- clist = GTK_CLIST(GtkNewObject(&GtkCListClass)); | |
- clist->scrollpos = 0; | |
- 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].optimal_width = 0; | |
- clist->coldata[i].visible = TRUE; | |
- clist->coldata[i].resizeable = TRUE; | |
- clist->coldata[i].justification = GTK_JUSTIFY_LEFT; | |
- } | |
- | |
- 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, scrollwin; | |
- 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; | |
- scrollwin = myCreateWindow(WC_GTKCLISTHDR, NULL, WS_CHILD | WS_BORDER, | |
- 0, 0, 0, 0, Parent, NULL, hInst, NULL); | |
- SetWindowLongPtr(scrollwin, GWLP_USERDATA, (LONG_PTR)widget); | |
- header = myCreateWindowEx(0, WC_HEADER, NULL, | |
- WS_CHILD | HDS_HORZ | WS_VISIBLE | |
- | (GTK_CLIST(widget)->coldata[0].button_passive ? | |
- 0 : HDS_BUTTONS), | |
- 0, 0, 0, 0, scrollwin, NULL, hInst, NULL); | |
- SetWindowLongPtr(header, GWLP_USERDATA, (LONG_PTR)widget); | |
- GTK_CLIST(widget)->header = header; | |
- GTK_CLIST(widget)->scrollwin = scrollwin; | |
- gtk_set_default_font(header); | |
- hdl.prc = &rcParent; | |
- hdl.pwpos = ℘ | |
- mySendMessage(header, HDM_LAYOUT, 0, (LPARAM)&hdl); | |
- clist->header_size = wp.cy; | |
- widget->hWnd = myCreateWindowEx(WS_EX_CLIENTEDGE, "LISTBOX", "", | |
- WS_CHILD | WS_TABSTOP | WS_VSCROLL | |
- | WS_HSCROLL | LBS_OWNERDRAWFIXED | |
- | LBS_NOTIFY, 0, 0, 0, 0, Parent, NULL, | |
- hInst, NULL); | |
- /* Subclass the window */ | |
- wpOrigListProc = (WNDPROC)mySetWindowLong(widget->hWnd, GWLP_WNDPROC, | |
- (LONG_PTR)ListWndProc); | |
- gtk_set_default_font(widget->hWnd); | |
- | |
- for (rows = clist->rowdata; rows; rows = g_slist_next(rows)) { | |
- row = (GtkCListRow *)rows->data; | |
- if (row) { | |
- mySendMessage(widget->hWnd, LB_ADDSTRING, 0, 1); | |
- } | |
- } | |
- gtk_clist_update_all_widths(clist); | |
- | |
- for (i = 0; i < clist->cols; i++) { | |
- if (clist->coldata[i].auto_resize) { | |
- clist->coldata[i].width = clist->coldata[i].optimal_width; | |
- } | |
- 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; | |
- myHeader_InsertItem(header, i + 1, &hdi); | |
- } | |
- } | |
-} | |
- | |
-void gtk_clist_show(GtkWidget *widget) | |
-{ | |
- if (GTK_WIDGET_REALIZED(widget)) { | |
- ShowWindow(GTK_CLIST(widget)->scrollwin, SW_SHOWNORMAL); | |
- } | |
-} | |
- | |
-void gtk_clist_hide(GtkWidget *widget) | |
-{ | |
- if (GTK_WIDGET_REALIZED(widget)) { | |
- ShowWindow(GTK_CLIST(widget)->scrollwin, SW_HIDE); | |
- } | |
-} | |
- | |
-void gtk_clist_draw_row(GtkCList *clist, LPDRAWITEMSTRUCT lpdis) | |
-{ | |
- HBRUSH bkgrnd; | |
- COLORREF textcol, oldtextcol; | |
- RECT rcCol; | |
- int oldbkmode; | |
- gint i, CurrentX, right; | |
- 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); | |
- oldbkmode = SetBkMode(lpdis->hDC, TRANSPARENT); | |
- FillRect(lpdis->hDC, &lpdis->rcItem, bkgrnd); | |
- | |
- if (lpdis->itemID >= 0 && lpdis->itemID < clist->rows) { | |
- int width; | |
- row = (GtkCListRow *)g_slist_nth_data(clist->rowdata, lpdis->itemID); | |
- width = CurrentX = 0; | |
- for (i = 0; i < clist->cols; i++) { | |
- width += clist->coldata[i].width; | |
- } | |
- right = MAX(lpdis->rcItem.right, width); | |
- 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 > right) | |
- rcCol.left = right; | |
- if (rcCol.right > right - LISTITEMHPACK) | |
- rcCol.right = right - LISTITEMHPACK; | |
- if (i == clist->cols - 1) | |
- rcCol.right = right - LISTITEMHPACK; | |
- if (row->text[i]) { | |
- UINT align; | |
- switch(clist->coldata[i].justification) { | |
- case GTK_JUSTIFY_RIGHT: | |
- align = DT_RIGHT; | |
- break; | |
- case GTK_JUSTIFY_CENTER: | |
- align = DT_CENTER; | |
- break; | |
- default: | |
- align = DT_LEFT; | |
- break; | |
- } | |
- myDrawText(lpdis->hDC, row->text[i], -1, &rcCol, | |
- align | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS); | |
- } | |
- } | |
- } | |
- | |
- SetTextColor(lpdis->hDC, oldtextcol); | |
- SetBkMode(lpdis->hDC, oldbkmode); | |
- 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].optimal_width); | |
- } | |
-} | |
- | |
-gint gtk_clist_optimal_column_width(GtkCList *clist, gint column) | |
-{ | |
- return clist->coldata[column].optimal_width; | |
-} | |
- | |
-void gtk_clist_update_all_widths(GtkCList *clist) | |
-{ | |
- GSList *list; | |
- GtkCListRow *row; | |
- SIZE size; | |
- HWND header; | |
- gint i; | |
- | |
- header = clist->header; | |
- if (header) { | |
- for (i = 0; i < clist->cols; i++) { | |
- if (GetTextSize(header, clist->coldata[i].title, &size, defFont)) { | |
- int new_width = size.cx + 4 + 2 * LISTHEADERPACK; | |
- clist->coldata[i].width = MAX(clist->coldata[i].width, new_width); | |
- clist->coldata[i].optimal_width = MAX(clist->coldata[i].optimal_width, | |
- new_width); | |
- } | |
- } | |
- } | |
- | |
- 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); | |
- } | |
- } | |
- | |
- gtk_clist_set_extent(clist); | |
-} | |
- | |
-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 (GetTextSize(hWnd, text[i], &size, defFont)) { | |
- int new_width = size.cx + 4 + 2 * LISTITEMHPACK; | |
- clist->coldata[i].optimal_width = MAX(clist->coldata[i].optimal_width, | |
- new_width); | |
- } | |
- } | |
-} | |
- | |
-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); | |
- new_row->data = GINT_TO_POINTER(1); | |
- | |
- 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; | |
- mySendMessage(hWnd, LB_INSERTSTRING, (WPARAM)row, 1); | |
- } | |
- | |
- 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; | |
- | |
- mySendMessage(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 (mySendMessage(header, HDM_GETITEM, (WPARAM)column, (LPARAM)&hdi) | |
- && hdi.cxy != width) { | |
- hdi.mask = HDI_WIDTH; | |
- hdi.cxy = width; | |
- mySendMessage(header, HDM_SETITEM, (WPARAM)column, (LPARAM)&hdi); | |
- } | |
- } | |
- gtk_clist_set_extent(clist); | |
- 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; | |
- mySendMessage(hWnd, LB_SETCURSEL, (WPARAM)rowind, 0); | |
- } else { | |
- for (rowind = 0; rowind < clist->rows; rowind++) { | |
- mySendMessage(hWnd, LB_SETSEL, (WPARAM)FALSE, (LPARAM)rowind); | |
- } | |
- for (sel = clist->selection; sel; sel = g_list_next(sel)) { | |
- rowind = GPOINTER_TO_INT(sel->data); | |
- mySendMessage(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) { | |
- mySendMessage(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) { | |
- mySendMessage(hWnd, LB_SETCURSEL, (WPARAM)row, 0); | |
- } else { | |
- mySendMessage(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) { | |
- mySendMessage(hWnd, LB_SETCURSEL, (WPARAM)(-1), 0); | |
- } else { | |
- mySendMessage(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 (mySendMessage(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(G_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(G_OBJECT(widget), "select_row", row, 0, NULL); | |
- } | |
- } | |
- } | |
- g_list_free(oldsel); | |
-} | |
- | |
-void gtk_clist_set_column_justification(GtkCList *clist, gint column, | |
- GtkJustification justification) | |
-{ | |
- clist->coldata[column].justification = justification; | |
-} | |
- | |
-static LRESULT CALLBACK CListHdrWndProc(HWND hwnd, UINT msg, WPARAM wParam, | |
- LPARAM lParam) | |
-{ | |
- GtkWidget *widget; | |
- gboolean retval = FALSE, dodef = TRUE; | |
- | |
- widget = GTK_WIDGET(GetWindowLongPtr(hwnd, GWLP_USERDATA)); | |
- | |
- if (widget) { | |
- retval = gtk_clist_wndproc(widget, msg, wParam, lParam, &dodef); | |
- } | |
- | |
- if (dodef) { | |
- return myDefWindowProc(hwnd, msg, wParam, lParam); | |
- } else { | |
- return retval; | |
- } | |
-} | |
- | |
-void InitCListClass(HINSTANCE hInstance) | |
-{ | |
- WNDCLASS wc; | |
- | |
- wc.style = 0; | |
- wc.lpfnWndProc = CListHdrWndProc; | |
- wc.cbClsExtra = 0; | |
- wc.cbWndExtra = 0; | |
- wc.hInstance = hInstance; | |
- wc.hIcon = NULL; | |
- wc.hCursor = LoadCursor(NULL, IDC_ARROW); | |
- wc.hbrBackground = NULL; | |
- wc.lpszMenuName = NULL; | |
- wc.lpszClassName = WC_GTKCLISTHDR; | |
- myRegisterClass(&wc); | |
-} | |
- | |
-#endif | |
diff --git a/src/gtkport/clist.h b/src/gtkport/clist.h | |
t@@ -1,113 +0,0 @@ | |
-/************************************************************************ | |
- * clist.h GtkCList implementation for gtkport * | |
- * Copyright (C) 1998-2020 Ben Webb * | |
- * Email: [email protected] * | |
- * WWW: https://dopewars.sourceforge.io/ * | |
- * * | |
- * 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> | |
-#include "gtkenums.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; | |
- gint optimal_width; | |
- GtkJustification justification; | |
- 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, scrollwin; | |
- int scrollpos; | |
- 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); | |
-gint gtk_clist_optimal_column_width(GtkCList *clist, gint column); | |
-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); | |
-void gtk_clist_set_column_justification(GtkCList *clist, gint column, | |
- GtkJustification justification); | |
- | |
-/* Private functions */ | |
-void InitCListClass(HINSTANCE hInstance); | |
-#endif /* CYGWIN */ | |
- | |
-#endif | |
diff --git a/src/gtkport/gtkport.c b/src/gtkport/gtkport.c | |
t@@ -1283,7 +1283,6 @@ void win32_init(HINSTANCE hInstance, HINSTANCE hPrevInst… | |
wc.lpszClassName = WC_GTKURL; | |
myRegisterClass(&wc); | |
- InitCListClass(hInstance); | |
InitTreeViewClass(hInstance); | |
} | |
} | |
diff --git a/src/gtkport/gtkport.h b/src/gtkport/gtkport.h | |
t@@ -44,7 +44,6 @@ | |
#include "gtkenums.h" | |
#include "gtktypes.h" | |
-#include "clist.h" | |
#include "treeview.h" | |
struct _GtkMisc { | |
t@@ -637,9 +636,6 @@ typedef enum | |
/* Global functions */ | |
gint GtkMessageBox(GtkWidget *parent, const gchar *Text, | |
const gchar *Title, GtkMessageType type, gint Options); | |
-GtkWidget *gtk_scrolled_clist_new_with_titles(gint columns, | |
- gchar *titles[], | |
- GtkWidget **pack_widg); | |
guint SetAccelerator(GtkWidget *labelparent, gchar *Text, | |
GtkWidget *sendto, gchar *signal, | |
GtkAccelGroup *accel_group, gboolean needalt); |