tFix compile errors with Win32 GTK+ implementation - 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 112bdb7551b937475088691c071a7e034fa1414f
(DIR) parent fbddb9bf7cb2e0023beed6039895844347737e7b
(HTM) Author: Ben Webb <ben@salilab.org>
Date: Fri, 27 Nov 2020 23:11:44 -0800
Fix compile errors with Win32 GTK+ implementation
Diffstat:
M src/gtkport/gtkport.c | 41 ++++++++++++++-----------------
M src/gtkport/gtkport.h | 13 +++++++++++--
M src/gtkport/treeview.c | 96 ++++++++++++++++++++++++++++---
M src/gtkport/treeview.h | 34 +++++++++++++++++++++++++++++--
M src/gui_client/newgamedia.c | 3 ++-
M src/serverside.c | 4 ++--
6 files changed, 152 insertions(+), 39 deletions(-)
---
(DIR) diff --git a/src/gtkport/gtkport.c b/src/gtkport/gtkport.c
t@@ -234,8 +234,6 @@ static void gtk_window_set_initial_position(GtkWindow *window,
static void gtk_progress_bar_size_request(GtkWidget *widget,
GtkRequisition *requisition);
static void gtk_progress_bar_realize(GtkWidget *widget);
-static gint gtk_accel_group_add(GtkAccelGroup *accel_group,
- ACCEL *newaccel);
static void gtk_accel_group_set_id(GtkAccelGroup *accel_group, gint ind,
gint ID);
static void EnableParent(GtkWindow *window);
t@@ -1070,8 +1068,8 @@ static BOOL HandleWinMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam,
}
if (widget && nmhdr->code == TCN_SELCHANGE) {
- gtk_notebook_set_page(GTK_NOTEBOOK(widget),
- TabCtrl_GetCurSel(nmhdr->hwndFrom));
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(widget),
+ TabCtrl_GetCurSel(nmhdr->hwndFrom));
return FALSE;
}
break;
t@@ -3708,12 +3706,23 @@ GtkWidget *gtk_menu_item_new_with_label(const gchar *label)
return GTK_WIDGET(menu_item);
}
+void gtk_menu_item_set_right_justified(GtkMenuItem *menu_item,
+ gboolean right_justified)
+{
+ /* noop */
+}
+
void gtk_menu_item_set_submenu(GtkMenuItem *menu_item, GtkWidget *submenu)
{
menu_item->submenu = GTK_MENU(submenu);
submenu->parent = GTK_WIDGET(menu_item);
}
+GtkMenu *gtk_menu_item_get_submenu(GtkMenuItem *menu_item)
+{
+ return menu_item->submenu;
+}
+
gboolean gtk_check_menu_item_get_active(GtkMenuItem *menu_item)
{
return menu_item->active;
t@@ -3922,7 +3931,7 @@ void gtk_notebook_insert_page(GtkNotebook *notebook, GtkWidget *child,
child->parent = GTK_WIDGET(notebook);
}
-void gtk_notebook_set_page(GtkNotebook *notebook, gint page_num)
+void gtk_notebook_set_current_page(GtkNotebook *notebook, gint page_num)
{
GSList *children;
GtkNotebookChild *note_child;
t@@ -3994,8 +4003,8 @@ void gtk_notebook_realize(GtkWidget *widget)
}
}
}
- gtk_notebook_set_page(GTK_NOTEBOOK(widget),
- GTK_NOTEBOOK(widget)->selection);
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(widget),
+ GTK_NOTEBOOK(widget)->selection);
}
void gtk_notebook_show_all(GtkWidget *widget, gboolean hWndOnly)
t@@ -4010,8 +4019,8 @@ void gtk_notebook_show_all(GtkWidget *widget, gboolean hWndOnly)
if (note_child && note_child->child)
gtk_widget_show_all_full(note_child->child, hWndOnly);
}
- gtk_notebook_set_page(GTK_NOTEBOOK(widget),
- GTK_NOTEBOOK(widget)->selection);
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(widget),
+ GTK_NOTEBOOK(widget)->selection);
}
void gtk_notebook_hide_all(GtkWidget *widget, gboolean hWndOnly)
t@@ -4854,20 +4863,6 @@ static void gtk_menu_item_set_text(GtkMenuItem *menuitem, gchar *text)
}
}
-guint gtk_label_parse_uline(GtkLabel *label, const gchar *str)
-{
- gint i;
-
- gtk_label_set_text(label, str);
- if (str)
- for (i = 0; i < strlen(str); i++) {
- if (str[i] == '_') {
- return str[i + 1];
- }
- }
- return 0;
-}
-
const char *gtk_label_get_text(GtkLabel *label)
{
return label->text;
(DIR) diff --git a/src/gtkport/gtkport.h b/src/gtkport/gtkport.h
t@@ -444,6 +444,11 @@ void gtk_menu_insert(GtkMenu *menu, GtkWidget *child, gint position);
void gtk_menu_append(GtkMenu *menu, GtkWidget *child);
void gtk_menu_prepend(GtkMenu *menu, GtkWidget *child);
GtkWidget *gtk_menu_item_new_with_label(const gchar *label);
+void gtk_menu_item_set_right_justified(GtkMenuItem *menu_item,
+ gboolean right_justified);
+#define gtk_menu_item_new_with_mnemonic gtk_menu_item_new_with_label
+#define gtk_check_menu_item_new_with_mnemonic gtk_menu_item_new_with_label
+GtkMenu *gtk_menu_item_get_submenu(GtkMenuItem *menu_item);
void gtk_menu_item_set_submenu(GtkMenuItem *menu_item, GtkWidget *submenu);
void gtk_check_menu_item_set_active(GtkMenuItem *menu_item, gboolean active);
gboolean gtk_check_menu_item_get_active(GtkMenuItem *menu_item);
t@@ -453,7 +458,7 @@ void gtk_notebook_append_page(GtkNotebook *notebook, GtkWidget *child,
GtkWidget *tab_label);
void gtk_notebook_insert_page(GtkNotebook *notebook, GtkWidget *child,
GtkWidget *tab_label, gint position);
-void gtk_notebook_set_page(GtkNotebook *notebook, gint page_num);
+void gtk_notebook_set_current_page(GtkNotebook *notebook, gint page_num);
gint gtk_notebook_get_current_page(GtkNotebook *notebook);
GObject *gtk_adjustment_new(gfloat value, gfloat lower, gfloat upper,
gfloat step_increment, gfloat page_increment,
t@@ -472,6 +477,8 @@ void g_object_set_data(GObject *object, const gchar *key,
gpointer g_object_get_data(GObject *object, const gchar *key);
GtkAccelGroup *gtk_accel_group_new();
void gtk_accel_group_destroy(GtkAccelGroup *accel_group);
+gint gtk_accel_group_add(GtkAccelGroup *accel_group,
+ ACCEL *newaccel);
void gtk_widget_grab_default(GtkWidget *widget);
void gtk_widget_grab_focus(GtkWidget *widget);
void gtk_window_set_modal(GtkWindow *window, gboolean modal);
t@@ -511,7 +518,9 @@ GtkTreeModel *gtk_combo_box_get_model(GtkComboBox *combo_box);
gboolean gtk_combo_box_get_active_iter(GtkComboBox *combo_box,
GtkTreeIter *iter);
void gtk_label_set_text(GtkLabel *label, const gchar *str);
-guint gtk_label_parse_uline(GtkLabel *label, const gchar *str);
+/* Not currently supported */
+#define gtk_label_set_text_with_mnemonic gtk_label_set_text
+#define gtk_label_set_mnemonic_widget(label, widget) {}
const gchar *gtk_label_get_text(GtkLabel *label);
void gtk_text_set_point(GtkText *text, guint index);
void gtk_widget_set_size_request(GtkWidget *widget, gint width, gint height);
(DIR) diff --git a/src/gtkport/treeview.c b/src/gtkport/treeview.c
t@@ -153,11 +153,11 @@ gboolean gtk_tree_view_wndproc(GtkWidget *widget, UINT msg, WPARAM wParam,
return FALSE;
case HDN_ITEMCLICKA:
phdr = (HD_NOTIFYA FAR *)lParam;
- gtk_signal_emit(GTK_OBJECT(widget), "click-column", (gint)phdr->iItem);
+ gtk_signal_emit(G_OBJECT(widget), "click-column", (gint)phdr->iItem);
return FALSE;
case HDN_ITEMCLICKW:
phdrw = (HD_NOTIFYW FAR *)lParam;
- gtk_signal_emit(GTK_OBJECT(widget), "click-column", (gint)phdrw->iItem);
+ gtk_signal_emit(G_OBJECT(widget), "click-column", (gint)phdrw->iItem);
return FALSE;
default:
break;
t@@ -320,6 +320,7 @@ void gtk_list_store_clear(GtkListStore *list_store)
gtk_list_store_row_free(row, list_store);
}
g_array_set_size(list_store->rows, 0);
+ list_store->need_sort = FALSE; /* an empty store is sorted */
if (list_store->view) {
HWND hWnd;
t@@ -357,6 +358,7 @@ void gtk_list_store_set(GtkListStore *list_store, GtkTreeIter *iter, ...)
int colind;
GtkListStoreRow *row = &g_array_index(list_store->rows, GtkListStoreRow,
*iter);
+ list_store->need_sort = TRUE;
va_start(ap, iter);
while ((colind = va_arg(ap, int)) >= 0) {
t@@ -391,6 +393,16 @@ void gtk_list_store_set(GtkListStore *list_store, GtkTreeIter *iter, ...)
}
}
+void gtk_list_store_swap(GtkListStore *store, GtkTreeIter *a, GtkTreeIter *b)
+{
+ GtkListStoreRow rowa = g_array_index(store->rows, GtkListStoreRow, *a);
+ GtkListStoreRow rowb = g_array_index(store->rows, GtkListStoreRow, *b);
+
+ g_array_index(store->rows, GtkListStoreRow, *a) = rowb;
+ g_array_index(store->rows, GtkListStoreRow, *b) = rowa;
+ store->need_sort = TRUE;
+}
+
void gtk_tree_model_get(GtkTreeModel *tree_model, GtkTreeIter *iter, ...)
{
va_list ap;
t@@ -433,8 +445,21 @@ gboolean gtk_tree_model_iter_nth_child(GtkTreeModel *tree_model,
/* We only work with one level (lists) for now */
g_assert(parent == NULL);
*iter = n;
+ return TRUE;
+}
+
+gint gtk_tree_model_iter_n_children(GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ /* We only work with one level (lists) for now */
+ if (iter) {
+ return 1;
+ } else {
+ return tree_model->rows->len;
+ }
}
+
static void gtk_tree_view_column_free(gpointer data)
{
GtkTreeViewColumn *col = data;
t@@ -446,6 +471,7 @@ void gtk_tree_model_free(GtkTreeModel *model)
{
gtk_list_store_clear(model); /* Remove all rows */
g_array_free(model->rows, TRUE);
+ g_array_free(model->sort_func, TRUE);
g_free(model->coltype);
g_free(model);
}
t@@ -483,11 +509,12 @@ static void draw_cell_text(GtkTreeViewColumn *col, GtkTreeModel *model,
UINT align;
char *val;
int modcol = col->model_column;
- switch(col->justification) {
- case GTK_JUSTIFY_RIGHT:
+ /* Convert float 0.0, 0.5 or 1.0 into int, allow for some rounding error */
+ switch((int)(col->xalign * 10. + 0.1)) {
+ case 10:
align = DT_RIGHT;
break;
- case GTK_JUSTIFY_CENTER:
+ case 5:
align = DT_CENTER;
break;
default:
t@@ -749,7 +776,7 @@ void gtk_tree_selection_unselect_all(GtkTreeSelection *selection)
{
GList *sel;
for (sel = selection->selection; sel; sel = g_list_next(sel)) {
- int row = GPOINTER_TO_INT(sel->data);
+ guint row = GPOINTER_TO_UINT(sel->data);
gtk_tree_selection_unselect_path(selection, &row);
}
}
t@@ -759,7 +786,7 @@ GList *gtk_tree_selection_get_selected_rows(GtkTreeSelection *selection,
{
GList *sel, *pathsel = NULL;
for (sel = selection->selection; sel; sel = g_list_next(sel)) {
- int row = GPOINTER_TO_INT(sel->data);
+ guint row = GPOINTER_TO_UINT(sel->data);
GtkTreePath *path = g_new(GtkTreePath, 1);
*path = row;
pathsel = g_list_append(pathsel, path);
t@@ -767,6 +794,13 @@ GList *gtk_tree_selection_get_selected_rows(GtkTreeSelection *selection,
return pathsel;
}
+gint *gtk_tree_path_get_indices_with_depth(GtkTreePath *path, gint *depth)
+{
+ /* Only one level; path *is* the row index */
+ *depth = 1;
+ return path;
+}
+
void gtk_tree_selection_unselect_path(GtkTreeSelection *selection,
GtkTreePath *path)
{
t@@ -815,7 +849,7 @@ void gtk_tree_selection_selected_foreach(GtkTreeSelection *selection,
{
GList *sel;
for (sel = selection->selection; sel; sel = g_list_next(sel)) {
- int row = GPOINTER_TO_INT(sel->data);
+ guint row = GPOINTER_TO_UINT(sel->data);
func(selection->model, &row, &row, data);
}
}
t@@ -834,7 +868,7 @@ void gtk_tree_view_update_selection(GtkWidget *widget)
}
}
- gtk_signal_emit(GTK_OBJECT(widget), "changed");
+ gtk_signal_emit(G_OBJECT(widget), "changed");
}
}
t@@ -888,6 +922,9 @@ GtkListStore *gtk_list_store_new(gint n_columns, ...)
store->ncols = n_columns;
store->coltype = g_new(int, n_columns);
store->rows = g_array_new(FALSE, FALSE, sizeof(GtkListStoreRow));
+ store->sort_column_id = GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID;
+ store->sort_func = g_array_new(FALSE, TRUE, sizeof(gpointer));
+ store->need_sort = FALSE;
for (i = 0; i < n_columns; ++i) {
store->coltype[i] = va_arg(ap, int);
}
t@@ -895,6 +932,31 @@ GtkListStore *gtk_list_store_new(gint n_columns, ...)
return store;
}
+void gtk_tree_sortable_set_sort_func(GtkTreeSortable *sortable,
+ gint sort_column_id,
+ GtkTreeIterCompareFunc sort_func,
+ gpointer user_data,
+ GDestroyNotify destroy)
+{
+ /* We don't currently support user_data */
+ if (sort_column_id >= sortable->sort_func->len) {
+ g_array_set_size(sortable->sort_func, sort_column_id+1);
+ }
+ g_array_index(sortable->sort_func, gpointer, sort_column_id) = sort_func;
+}
+
+void gtk_tree_sortable_set_sort_column_id(GtkTreeSortable *sortable,
+ gint sort_column_id,
+ GtkSortType order)
+{
+ if (sortable->sort_column_id != sort_column_id
+ || sortable->sort_order != order) {
+ sortable->sort_column_id = sort_column_id;
+ sortable->sort_order = order;
+ sortable->need_sort = TRUE;
+ }
+}
+
/* We don't support customizing renderers right now */
GtkCellRenderer *gtk_cell_renderer_text_new(void)
{
t@@ -912,6 +974,7 @@ static GtkTreeViewColumn *new_column_internal(const char *title, va_list args)
col->expand = FALSE;
col->sort_column_id = -1;
col->model_column = -1;
+ col->xalign = 0.0; /* left align by default */
/* Currently we only support the "text" attribute to point to the
ListStore column */
t@@ -948,6 +1011,15 @@ gint gtk_tree_view_insert_column_with_attributes
return gtk_tree_view_insert_column(tree_view, col, position);
}
+void gtk_tree_view_scroll_to_cell(GtkTreeView *tree_view,
+ GtkTreePath *path,
+ GtkTreeViewColumn *column,
+ gboolean use_align, gfloat row_align,
+ gfloat col_align)
+{
+ /* not implemented */
+}
+
void gtk_tree_view_column_set_resizable(GtkTreeViewColumn *tree_column,
gboolean resizable)
{
t@@ -966,6 +1038,12 @@ void gtk_tree_view_column_set_sort_column_id(GtkTreeViewColumn *tree_column,
tree_column->sort_column_id = sort_column_id;
}
+void gtk_tree_view_column_set_alignment(GtkTreeViewColumn *tree_column,
+ gfloat xalign)
+{
+ tree_column->xalign = xalign;
+}
+
gint gtk_tree_view_insert_column(GtkTreeView *tree_view,
GtkTreeViewColumn *column,
gint position)
(DIR) diff --git a/src/gtkport/treeview.h b/src/gtkport/treeview.h
t@@ -52,6 +52,10 @@ typedef struct _GtkListStoreRow GtkListStoreRow;
typedef guint GtkTreeIter;
typedef guint GtkTreePath;
+typedef gint (*GtkTreeIterCompareFunc) (GtkTreeModel *model,
+ GtkTreeIter *a, GtkTreeIter *b,
+ gpointer user_data);
+
struct _GtkTreeView {
GtkContainer container;
HWND header, scrollwin;
t@@ -70,7 +74,7 @@ struct _GtkTreeViewColumn {
gint sort_column_id; /* what to sort by when this column is selected */
gint width;
gint optimal_width;
- GtkJustification justification;
+ gfloat xalign; /* 0.0 for left, 0.5 for center, 1.0 for right align */
guint visible:1;
guint resizeable:1;
guint auto_resize:1;
t@@ -86,6 +90,10 @@ struct _GtkListStore {
int *coltype; /* Type of each column (e.g. G_TYPE_STRING) */
GArray *rows; /* All rows in the list as GtkListStoreRow */
GtkTreeView *view; /* The currently connected view (only one supported) */
+ gint sort_column_id; /* what to sort by, if >= 0 */
+ GtkSortType sort_order;
+ GArray *sort_func; /* callback functions for sorting, by sort_column_id */
+ gint need_sort:1; /* set once data is added/changed */
};
/* Empty struct; we don't support customizing the renderer */
t@@ -110,11 +118,14 @@ void gtk_list_store_insert(GtkListStore *list_store, GtkTreeIter *iter,
void gtk_list_store_append(GtkListStore *list_store, GtkTreeIter *iter);
gboolean gtk_list_store_remove(GtkListStore *list_store, GtkTreeIter *iter);
void gtk_list_store_set(GtkListStore *list_store, GtkTreeIter *iter, ...);
+void gtk_list_store_swap(GtkListStore *store, GtkTreeIter *a, GtkTreeIter *b);
void gtk_tree_model_get(GtkTreeModel *tree_model, GtkTreeIter *iter, ...);
gboolean gtk_tree_model_iter_nth_child(GtkTreeModel *tree_model,
GtkTreeIter *iter,
GtkTreeIter *parent, gint n);
+gint gtk_tree_model_iter_n_children(GtkTreeModel *tree_model,
+ GtkTreeIter *iter);
GtkWidget *gtk_tree_view_new(void);
GtkTreeSelection *gtk_tree_view_get_selection(GtkTreeView *tree_view);
t@@ -125,7 +136,11 @@ void gtk_tree_view_set_headers_clickable(GtkTreeView *tree_view,
gint gtk_tree_view_insert_column_with_attributes
(GtkTreeView *tree_view, gint position, const gchar *title,
GtkCellRenderer *cell, ...);
-
+void gtk_tree_view_scroll_to_cell(GtkTreeView *tree_view,
+ GtkTreePath *path,
+ GtkTreeViewColumn *column,
+ gboolean use_align, gfloat row_align,
+ gfloat col_align);
void gtk_tree_selection_selected_foreach(GtkTreeSelection *selection,
GtkTreeSelectionForeachFunc func,
gpointer data);
t@@ -145,6 +160,7 @@ void gtk_tree_selection_unselect_all(GtkTreeSelection *selection);
GList *gtk_tree_selection_get_selected_rows(GtkTreeSelection *selection,
GtkTreeModel **model);
#define gtk_tree_path_free g_free
+gint *gtk_tree_path_get_indices_with_depth(GtkTreePath *path, gint *depth);
GtkTreeViewColumn *gtk_tree_view_column_new_with_attributes
(const gchar *title, GtkCellRenderer *cell, ...);
void gtk_tree_view_column_set_resizable(GtkTreeViewColumn *tree_column,
t@@ -153,11 +169,25 @@ void gtk_tree_view_column_set_expand(GtkTreeViewColumn *tree_column,
gboolean expand);
void gtk_tree_view_column_set_sort_column_id(GtkTreeViewColumn *tree_column,
gint sort_column_id);
+/* We treat this as the alignment of all cells in this column, not just the
+ alignment of the header */
+void gtk_tree_view_column_set_alignment(GtkTreeViewColumn *tree_column,
+ gfloat xalign);
+/* This is only used to set the xalign property, so make it a noop */
+#define g_object_set(object, name, value, end) {}
gint gtk_tree_view_insert_column(GtkTreeView *tree_view,
GtkTreeViewColumn *column,
gint position);
GtkTreeViewColumn *gtk_tree_view_get_column(GtkTreeView *tree_view, gint n);
+void gtk_tree_sortable_set_sort_func(GtkTreeSortable *sortable,
+ gint sort_column_id,
+ GtkTreeIterCompareFunc sort_func,
+ gpointer user_data,
+ GDestroyNotify destroy);
+void gtk_tree_sortable_set_sort_column_id(GtkTreeSortable *sortable,
+ gint sort_column_id,
+ GtkSortType order);
GtkCellRenderer *gtk_cell_renderer_text_new(void);
void g_object_unref(gpointer object);
(DIR) diff --git a/src/gui_client/newgamedia.c b/src/gui_client/newgamedia.c
t@@ -636,7 +636,8 @@ void NewGameDialog(Player *play)
G_CALLBACK(MetaServerConnect), NULL);
gtk_widget_set_sensitive(button, FALSE);
treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(clist));
- g_signal_connect(treesel, "changed", G_CALLBACK(metalist_changed), button);
+ g_signal_connect(G_OBJECT(treesel), "changed", G_CALLBACK(metalist_changed),
+ button);
my_gtk_box_pack_start_defaults(GTK_BOX(hbbox), button);
gtk_box_pack_start(GTK_BOX(vbox2), hbbox, FALSE, FALSE, 0);
(DIR) diff --git a/src/serverside.c b/src/serverside.c
t@@ -1661,7 +1661,7 @@ void GuiServerLoop(struct CMDLINE *cmdline, gboolean is_service)
}
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- g_signal_connect(GTK_OBJECT(window), "delete_event",
+ g_signal_connect(G_OBJECT(window), "delete_event",
G_CALLBACK(GuiRequestDelete), NULL);
gtk_window_set_default_size(GTK_WINDOW(window), 500, 250);
t@@ -1680,7 +1680,7 @@ void GuiServerLoop(struct CMDLINE *cmdline, gboolean is_service)
label = gtk_label_new(_("Command:"));
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
entry = gtk_entry_new();
- g_signal_connect(GTK_OBJECT(entry), "activate",
+ g_signal_connect(G_OBJECT(entry), "activate",
G_CALLBACK(GuiDoCommand), NULL);
gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);