tUpdates to GTK+ library for Win32; Win32 client now functional - 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 4fbf221d8daa964b0f74d5eda5fe51b35ed5df2e (DIR) parent 787438c63e3be440e14161b651b55e13ab135353 (HTM) Author: Ben Webb <ben@salilab.org> Date: Mon, 11 Dec 2000 12:57:43 +0000 Updates to GTK+ library for Win32; Win32 client now functional Diffstat: M src/gtk.c | 529 ++++++++++++++++++++++++++----- M src/gtk.h | 60 ++++++++++++++++++++++++++++++- M src/gtk_client.c | 94 +++++++++++++++++-------------- M src/gtk_client.h | 4 ++++ M src/win32_client.c | 12 ++++++------ 5 files changed, 572 insertions(+), 127 deletions(-) --- (DIR) diff --git a/src/gtk.c b/src/gtk.c t@@ -87,6 +87,7 @@ 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); static void gtk_widget_show_full(GtkWidget *widget,gboolean recurse); +static void gtk_widget_update(GtkWidget *widget,gboolean ForceResize); static void gtk_container_hide_all(GtkWidget *widget,gboolean hWndOnly); static void gtk_box_hide_all(GtkWidget *widget,gboolean hWndOnly); static void gtk_table_hide_all(GtkWidget *widget,gboolean hWndOnly); t@@ -146,6 +147,16 @@ static void gtk_hpaned_size_request(GtkWidget *widget, GtkRequisition *requisition); static void gtk_vpaned_set_size(GtkWidget *widget,GtkAllocation *allocation); static void gtk_hpaned_set_size(GtkWidget *widget,GtkAllocation *allocation); +static void gtk_option_menu_size_request(GtkWidget *widget, + GtkRequisition *requisition); +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); typedef struct _GdkInput GdkInput; t@@ -232,6 +243,7 @@ static GtkClass GtkMenuBarClass = { static GtkSignalType GtkMenuItemSignals[] = { { "realize",gtk_marshal_VOID__VOID,gtk_menu_item_realize }, + { "set_text",gtk_marshal_VOID__GPOIN,gtk_menu_item_set_text }, { "activate",gtk_marshal_VOID__VOID,NULL }, { "enable",gtk_marshal_VOID__VOID,gtk_menu_item_enable }, { "disable",gtk_marshal_VOID__VOID,gtk_menu_item_disable }, t@@ -251,8 +263,13 @@ static GtkClass GtkMenuClass = { "menu",&GtkMenuShellClass,sizeof(GtkMenu),GtkMenuSignals }; +static GtkSignalType GtkEditableSignals[] = { + { "create",gtk_marshal_VOID__VOID,gtk_editable_create }, + { "",NULL,NULL } +}; + static GtkClass GtkEditableClass = { - "editable",&GtkWidgetClass,sizeof(GtkEditable),NULL + "editable",&GtkWidgetClass,sizeof(GtkEditable),GtkEditableSignals }; static GtkSignalType GtkEntrySignals[] = { t@@ -292,6 +309,7 @@ static GtkClass GtkTextClass = { static GtkSignalType GtkLabelSignals[] = { { "size_request",gtk_marshal_VOID__GPOIN,gtk_label_size_request }, { "set_size",gtk_marshal_VOID__GPOIN,gtk_label_set_size }, + { "set_text",gtk_marshal_VOID__GPOIN,gtk_label_set_text }, { "realize",gtk_marshal_VOID__VOID,gtk_label_realize }, { "destroy",gtk_marshal_VOID__VOID,gtk_label_destroy }, { "",NULL,NULL } t@@ -303,6 +321,7 @@ static GtkClass GtkLabelClass = { static GtkSignalType GtkButtonSignals[] = { { "size_request",gtk_marshal_VOID__GPOIN,gtk_button_size_request }, + { "set_text",gtk_marshal_VOID__GPOIN,gtk_button_set_text }, { "realize",gtk_marshal_VOID__VOID,gtk_button_realize }, { "destroy",gtk_marshal_VOID__VOID,gtk_button_destroy }, { "clicked",gtk_marshal_VOID__VOID,NULL }, t@@ -313,6 +332,17 @@ static GtkClass GtkButtonClass = { "button",&GtkWidgetClass,sizeof(GtkButton),GtkButtonSignals }; +static GtkSignalType GtkOptionMenuSignals[] = { + { "size_request",gtk_marshal_VOID__GPOIN,gtk_option_menu_size_request }, + { "set_size",gtk_marshal_VOID__GPOIN,gtk_option_menu_set_size }, + { "realize",gtk_marshal_VOID__VOID,gtk_option_menu_realize }, + { "",NULL,NULL } +}; + +static GtkClass GtkOptionMenuClass = { + "optionmenu",&GtkButtonClass,sizeof(GtkOptionMenu),GtkOptionMenuSignals +}; + static GtkSignalType GtkToggleButtonSignals[] = { { "toggled",gtk_marshal_VOID__VOID,NULL }, { "",NULL,NULL } t@@ -357,8 +387,8 @@ static GtkClass GtkContainerClass = { }; static GtkSignalType GtkPanedSignals[] = { - { "show_all",gtk_marshal_VOID__VOID,gtk_paned_show_all }, - { "hide_all",gtk_marshal_VOID__VOID,gtk_paned_hide_all }, + { "show_all",gtk_marshal_VOID__BOOL,gtk_paned_show_all }, + { "hide_all",gtk_marshal_VOID__BOOL,gtk_paned_hide_all }, { "",NULL,NULL } }; static GtkClass GtkPanedClass = { t@@ -431,6 +461,7 @@ 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__GPOIN,NULL }, { "show",gtk_marshal_VOID__VOID,gtk_clist_show }, { "hide",gtk_marshal_VOID__VOID,gtk_clist_hide }, { "",NULL,NULL } t@@ -570,6 +601,7 @@ LRESULT CALLBACK GtkSepProc(HWND hwnd,UINT msg,UINT wParam,LONG lParam) { LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,UINT wParam,LONG lParam) { GtkWidget *window,*widget; + GtkClass *klass; RECT rect; GtkAllocation alloc; gboolean signal_return; t@@ -590,13 +622,19 @@ LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,UINT wParam,LONG lParam) { gtk_widget_set_size(window,&alloc); break; case WM_COMMAND: - if (lParam && HIWORD(wParam)==BN_CLICKED) { - gtk_signal_emit(GTK_OBJECT(GetWindowLong((HWND)lParam, - GWL_USERDATA)),"clicked"); + 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) { - widget=gtk_window_get_menu_ID( - GTK_WINDOW(GetWindowLong(hwnd,GWL_USERDATA)), - LOWORD(wParam)); + 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; break; t@@ -682,15 +720,40 @@ void win32_init(HINSTANCE hInstance,HINSTANCE hPrevInstance) { InitCommonControls(); } +void gtk_widget_update(GtkWidget *widget,gboolean ForceResize) { + GtkRequisition req; + GtkWidget *window; + GtkAllocation alloc; + + if (!GTK_WIDGET_REALIZED(widget)) return; + + gtk_widget_size_request(widget,&req); + window=gtk_widget_get_ancestor(widget,GTK_TYPE_WINDOW); + if (window) { + alloc.x=alloc.y=0; + alloc.width=window->requisition.width; + alloc.height=window->requisition.height; + if (alloc.width < window->allocation.width) { + alloc.width=window->allocation.width; + } + if (alloc.height < window->allocation.height) { + alloc.height=window->allocation.height; + } + if (alloc.width!=window->allocation.width || + alloc.height!=window->allocation.height || ForceResize) { + gtk_widget_set_size(window,&alloc); + } + } +} + void gtk_widget_show(GtkWidget *widget) { gtk_widget_show_full(widget,TRUE); } void gtk_widget_show_full(GtkWidget *widget,gboolean recurse) { GtkAllocation alloc; - GtkRequisition req; - GtkWidget *window; + if (GTK_WIDGET_VISIBLE(widget)) return; GTK_WIDGET_SET_FLAGS(widget,GTK_VISIBLE); if (recurse) gtk_widget_show_all_full(widget,TRUE); else gtk_signal_emit(GTK_OBJECT(widget),"show"); t@@ -705,21 +768,8 @@ void gtk_widget_show_full(GtkWidget *widget,gboolean recurse) { ShowWindow(widget->hWnd,SW_SHOWNORMAL); UpdateWindow(widget->hWnd); } else if (GTK_WIDGET_REALIZED(widget)) { - gtk_widget_size_request(widget,&req); + gtk_widget_update(widget,TRUE); if (!recurse) ShowWindow(widget->hWnd,SW_SHOWNORMAL); - window=gtk_widget_get_ancestor(widget,GTK_TYPE_WINDOW); - if (window) { - alloc.x=alloc.y=0; - alloc.width=window->requisition.width; - alloc.height=window->requisition.height; - if (alloc.width < window->allocation.width) { - alloc.width=window->allocation.width; - } - if (alloc.height < window->allocation.height) { - alloc.height=window->allocation.height; - } - gtk_widget_set_size(window,&alloc); - } } } t@@ -732,6 +782,8 @@ void gtk_widget_hide_full(GtkWidget *widget,gboolean recurse) { GtkRequisition req; GtkWidget *window; + if (!GTK_WIDGET_VISIBLE(widget)) return; + if (recurse) gtk_widget_hide_all_full(widget,TRUE); else { gtk_signal_emit(GTK_OBJECT(widget),"hide"); t@@ -763,6 +815,7 @@ void gtk_widget_realize(GtkWidget *widget) { gtk_signal_emit(GTK_OBJECT(widget),"realize",&req); if (widget->hWnd) SetWindowLong(widget->hWnd,GWL_USERDATA,(LONG)widget); GTK_WIDGET_SET_FLAGS(widget,GTK_REALIZED); + gtk_widget_set_sensitive(widget,GTK_WIDGET_SENSITIVE(widget)); gtk_widget_size_request(widget,&req); } t@@ -794,8 +847,11 @@ void gtk_widget_size_request(GtkWidget *widget,GtkRequisition *requisition) { if (GTK_WIDGET_VISIBLE(widget)) { gtk_signal_emit(GTK_OBJECT(widget),"size_request",requisition); } - memcpy(&widget->requisition,requisition,sizeof(GtkRequisition)); - if (widget->parent) gtk_widget_size_request(widget->parent,&req); + if (requisition->width != widget->requisition.width || + requisition->height != widget->requisition.height) { + memcpy(&widget->requisition,requisition,sizeof(GtkRequisition)); + if (widget->parent) gtk_widget_size_request(widget->parent,&req); + } } void gtk_widget_set_size(GtkWidget *widget,GtkAllocation *allocation) { t@@ -915,12 +971,25 @@ void gtk_window_size_request(GtkWidget *widget,GtkRequisition *requisition) { void gtk_window_set_size(GtkWidget *widget,GtkAllocation *allocation) { GtkAllocation child_alloc; GtkWindow *window=GTK_WINDOW(widget); + RECT rect; + + GetWindowRect(GetDesktopWindow(),&rect); + if (allocation->width < window->default_width) { allocation->width=window->default_width; } if (allocation->height < window->default_height) { allocation->height=window->default_height; } + + if (widget->parent) { + allocation->x = rect.left+(rect.right-rect.left-allocation->width)/2; + allocation->y = rect.top+(rect.bottom-rect.top-allocation->height)/2; + if (allocation->x < 0) allocation->x = 0; + if (allocation->y < 0) allocation->y = 0; + if (widget->hWnd) SetWindowPos(widget->hWnd,HWND_TOP,allocation->x, + allocation->y,0,0,SWP_NOSIZE|SWP_NOZORDER); + } child_alloc.x=child_alloc.y=0; child_alloc.width=allocation->width-GetSystemMetrics(SM_CXSIZEFRAME)*2; child_alloc.height=allocation->height-GetSystemMetrics(SM_CYSIZEFRAME)*2 t@@ -1076,13 +1145,9 @@ GtkWidget *gtk_radio_button_new_with_label(GSList *group,const gchar *label) { GtkWidget *gtk_label_new(const gchar *text) { GtkLabel *label; - gint i; label=GTK_LABEL(GtkNewObject(&GtkLabelClass)); - label->text = g_strdup(text); - for (i=0;i<strlen(label->text);i++) { - if (label->text[i]=='_') label->text[i]='&'; - } + gtk_label_set_text(label,text); return GTK_WIDGET(label); } t@@ -1153,55 +1218,84 @@ GSList *gtk_radio_button_group(GtkRadioButton *radio_button) { return radio_button->group; } +static void gtk_editable_sync_text(GtkEditable *editable) { + HWND hWnd; + gint textlen; + gchar *buffer; + + hWnd=GTK_WIDGET(editable)->hWnd; + if (!hWnd) return; + + textlen=SendMessage(hWnd,WM_GETTEXTLENGTH,0,0); + buffer=g_new(gchar,textlen+1); + SendMessage(hWnd,WM_GETTEXT,(WPARAM)(textlen+1),(LPARAM)buffer); + g_string_assign(editable->text,buffer); + g_free(buffer); +} + void gtk_editable_insert_text(GtkEditable *editable,const gchar *new_text, gint new_text_length,gint *position) { GtkWidget *widget=GTK_WIDGET(editable); HWND hWnd; - if (!GTK_WIDGET_REALIZED(widget)) return; + gint i,textlen; + + gtk_editable_sync_text(editable); + g_string_insert(editable->text,*position,new_text); + for (i=*position;i<*position+strlen(new_text);i++) { + if (editable->text->str[i]=='\r' && + editable->text->str[i+1]=='\n') { + i++; + } else if (editable->text->str[i]=='\n') { + g_string_insert_c(editable->text,i,'\r'); + i++; + (*position)++; + } + } + hWnd=widget->hWnd; - SendMessage(hWnd,EM_SETSEL,(WPARAM)-1,(LPARAM)*position); - SendMessage(hWnd,EM_REPLACESEL,(WPARAM)FALSE,(LPARAM)new_text); - *position+=strlen(new_text); + if (hWnd) { + SendMessage(hWnd,WM_SETTEXT,0,(LPARAM)editable->text->str); + *position+=strlen(new_text); + gtk_editable_set_position(editable,*position); + } } void gtk_editable_delete_text(GtkEditable *editable, gint start_pos,gint end_pos) { GtkWidget *widget=GTK_WIDGET(editable); HWND hWnd; - if (!GTK_WIDGET_REALIZED(widget)) return; + + gtk_editable_sync_text(editable); + if (end_pos < 0 || end_pos >= editable->text->len) + end_pos=editable->text->len; + g_string_erase(editable->text,start_pos,end_pos-start_pos); + hWnd=widget->hWnd; - SendMessage(hWnd,EM_SETSEL,(WPARAM)start_pos,(LPARAM)end_pos); - SendMessage(hWnd,EM_REPLACESEL,(WPARAM)FALSE,(LPARAM)""); + if (hWnd) { + SendMessage(hWnd,WM_SETTEXT,0,(LPARAM)editable->text->str); + } } gchar *gtk_editable_get_chars(GtkEditable *editable, gint start_pos,gint end_pos) { - GtkWidget *widget=GTK_WIDGET(editable); - HWND hWnd; - LRESULT textlen; - gchar *buffer,*retbuf; + gchar *retbuf; gint copylen; - if (!GTK_WIDGET_REALIZED(widget)) return NULL; - hWnd=widget->hWnd; - textlen=SendMessage(hWnd,WM_GETTEXTLENGTH,0,0); - buffer=g_new(gchar,textlen+1); - SendMessage(hWnd,WM_GETTEXT,(WPARAM)(textlen+1),(LPARAM)buffer); - if (start_pos==0 && end_pos<0) return buffer; - else { - copylen=end_pos-start_pos; - retbuf=g_new(gchar,copylen+1); - memcpy(retbuf,&buffer[start_pos],copylen+1); - g_free(buffer); - return retbuf; - } + gtk_editable_sync_text(editable); + if (end_pos < 0 || end_pos >= editable->text->len) + end_pos=editable->text->len; + copylen=end_pos-start_pos+1; + retbuf=g_new(gchar,copylen); + memcpy(retbuf,&editable->text->str[start_pos],copylen); + retbuf[copylen]='\0'; + return retbuf; } void gtk_editable_set_editable(GtkEditable *editable,gboolean is_editable) { GtkWidget *widget=GTK_WIDGET(editable); HWND hWnd; - if (!GTK_WIDGET_REALIZED(widget)) return; + editable->is_editable=is_editable; hWnd=widget->hWnd; - SendMessage(hWnd,EM_SETREADONLY,(WPARAM)(!is_editable),(LPARAM)0); + if (hWnd) SendMessage(hWnd,EM_SETREADONLY,(WPARAM)(!is_editable),(LPARAM)0); } void gtk_editable_set_position(GtkEditable *editable,gint position) { t@@ -1210,6 +1304,8 @@ void gtk_editable_set_position(GtkEditable *editable,gint position) { if (!GTK_WIDGET_REALIZED(widget)) return; hWnd=widget->hWnd; SendMessage(hWnd,EM_SETSEL,(WPARAM)-1,(LPARAM)position); + SendMessage(hWnd,EM_SCROLLCARET,0,0); + SendMessage(hWnd,EM_LINESCROLL,0,(LPARAM)1000); } gint gtk_editable_get_position(GtkEditable *editable) { t@@ -1223,13 +1319,7 @@ gint gtk_editable_get_position(GtkEditable *editable) { } guint gtk_text_get_length(GtkText *text) { - GtkWidget *widget=GTK_WIDGET(text); - HWND hWnd; - LRESULT textlen; - if (!GTK_WIDGET_REALIZED(widget)) return 0; - hWnd=widget->hWnd; - textlen=SendMessage(hWnd,WM_GETTEXTLENGTH,0,0); - return (guint)textlen; + return GTK_EDITABLE(text)->text->len; } void gtk_box_pack_start(GtkBox *box,GtkWidget *child,gboolean Expand, t@@ -1450,7 +1540,7 @@ void gtk_window_realize(GtkWidget *widget) { widget->hWnd = CreateWindow("mainwin",win->title, win->type == GTK_WINDOW_TOPLEVEL ? WS_OVERLAPPEDWINDOW|CS_HREDRAW|CS_VREDRAW|WS_SIZEBOX : - WS_CAPTION|CS_HREDRAW|CS_VREDRAW, + WS_CAPTION|WS_SYSMENU|CS_HREDRAW|CS_VREDRAW, CW_USEDEFAULT,0, widget->allocation.width,widget->allocation.height, Parent,NULL,hInst,NULL); t@@ -1509,16 +1599,25 @@ void gtk_entry_realize(GtkWidget *widget) { widget->allocation.width,widget->allocation.height, Parent,NULL,hInst,NULL); gtk_set_default_font(widget->hWnd); + gtk_editable_set_editable(GTK_EDITABLE(widget), + GTK_EDITABLE(widget)->is_editable); + SendMessage(widget->hWnd,WM_SETTEXT,0, + (LPARAM)GTK_EDITABLE(widget)->text->str); } void gtk_text_realize(GtkWidget *widget) { HWND Parent; Parent=gtk_get_parent_hwnd(widget); widget->hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","", - WS_CHILD|WS_TABSTOP|ES_AUTOHSCROLL| - ES_MULTILINE|ES_WANTRETURN|WS_VSCROLL, + WS_CHILD|WS_TABSTOP| + ES_MULTILINE|ES_WANTRETURN|WS_VSCROLL| + (GTK_TEXT(widget)->word_wrap ? 0 : ES_AUTOHSCROLL), 0,0,0,0,Parent,NULL,hInst,NULL); gtk_set_default_font(widget->hWnd); + gtk_editable_set_editable(GTK_EDITABLE(widget), + GTK_EDITABLE(widget)->is_editable); + SendMessage(widget->hWnd,WM_SETTEXT,0, + (LPARAM)GTK_EDITABLE(widget)->text->str); } void gtk_frame_realize(GtkWidget *widget) { t@@ -1641,7 +1740,8 @@ void gtk_clist_realize(GtkWidget *widget) { /* g_print("Header %p, size %d\n",header,wp.cy);*/ widget->hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,"LISTBOX","", WS_CHILD|WS_TABSTOP|LBS_DISABLENOSCROLL| - WS_VSCROLL|LBS_USETABSTOPS|LBS_OWNERDRAWFIXED, + WS_VSCROLL|LBS_USETABSTOPS| + LBS_OWNERDRAWFIXED|LBS_NOTIFY, 0,0,0,0,Parent,NULL,hInst,NULL); gtk_set_default_font(widget->hWnd); t@@ -1719,6 +1819,8 @@ gint gtk_clist_insert(GtkCList *clist,gint row,gchar *text[]) { GtkCListRow *new_row; gint i; + if (row<0) row=g_slist_length(clist->rows); + new_row=g_new0(GtkCListRow,1); new_row->text=g_new0(gchar *,clist->ncols); for (i=0;i<clist->ncols;i++) { t@@ -1747,6 +1849,14 @@ GtkWidget *gtk_clist_new_with_titles(gint columns,gchar *titles[]) { 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); } t@@ -1776,6 +1886,18 @@ void gtk_clist_column_titles_passive(GtkCList *clist) { } } +void gtk_clist_column_title_active(GtkCList *clist,gint column) { + if (column>=0 && column<clist->ncols) + clist->cols[column].button_passive=FALSE; +} + +void gtk_clist_column_titles_active(GtkCList *clist) { + gint i; + for (i=0;i<clist->ncols;i++) { + gtk_clist_column_title_active(clist,i); + } +} + void gtk_clist_set_column_width(GtkCList *clist,gint column,gint width) { HWND hWnd; if (column<0 || column>=clist->ncols) return; t@@ -2205,7 +2327,7 @@ void gtk_main() { for (list=WindowList;list && !MsgDone;list=g_slist_next(list)) { if ((MsgDone=IsDialogMessage((HWND)list->data,&msg))==TRUE) break; } - if (!MsgDone && GTK_OBJECT(widget)->klass==&GtkWindowClass) { + if (!MsgDone && widget && GTK_OBJECT(widget)->klass==&GtkWindowClass) { hAccel=GTK_WINDOW(widget)->hAccel; if (hAccel) MsgDone=TranslateAccelerator(widget->hWnd,hAccel,&msg); } t@@ -2662,6 +2784,10 @@ void gtk_menu_realize(GtkWidget *widget) { gtk_menu_shell_realize(widget); } +void gtk_menu_set_active(GtkMenu *menu,guint index) { + menu->active=index; +} + void gtk_menu_shell_realize(GtkWidget *widget) { GSList *children; GtkMenuShell *menu=GTK_MENU_SHELL(widget); t@@ -2894,7 +3020,7 @@ GtkWidget *gtk_spin_button_new(GtkAdjustment *adjustment,gfloat climb_rate, GtkSpinButton *spin; spin=GTK_SPIN_BUTTON(GtkNewObject(&GtkSpinButtonClass)); - spin->adj=adjustment; + gtk_spin_button_set_adjustment(spin,adjustment); return GTK_WIDGET(spin); } t@@ -2923,6 +3049,37 @@ void gtk_spin_button_set_size(GtkWidget *widget, } } +gint gtk_spin_button_get_value_as_int(GtkSpinButton *spin_button) { + HWND hWnd; + LRESULT lres; + hWnd=spin_button->updown; + if (hWnd) { + lres=SendMessage(hWnd,UDM_GETPOS,0,0); + if (HIWORD(lres) != 0) return 0; + else return (gint)LOWORD(lres); + } else return (gint)spin_button->adj->value; +} + +void gtk_spin_button_set_value(GtkSpinButton *spin_button,gfloat value) { + HWND hWnd; + spin_button->adj->value=value; + hWnd=spin_button->updown; + if (hWnd) SendMessage(hWnd,UDM_SETPOS,0,(LPARAM)MAKELONG((short)value,0)); +} + +void gtk_spin_button_set_adjustment(GtkSpinButton *spin_button, + GtkAdjustment *adjustment) { + HWND hWnd; + spin_button->adj=adjustment; + hWnd=spin_button->updown; + if (hWnd) { + SendMessage(hWnd,UDM_SETRANGE,0, + (LPARAM)MAKELONG((short)adjustment->upper,(short)adjustment->lower)); + SendMessage(hWnd,UDM_SETPOS,0, + (LPARAM)MAKELONG((short)adjustment->value,0)); + } +} + void gtk_spin_button_realize(GtkWidget *widget) { GtkSpinButton *spin=GTK_SPIN_BUTTON(widget); HWND Parent; t@@ -2932,10 +3089,9 @@ void gtk_spin_button_realize(GtkWidget *widget) { Parent=gtk_get_parent_hwnd(widget->parent); spin->updown=CreateUpDownControl(WS_CHILD|WS_BORDER| UDS_SETBUDDYINT|UDS_NOTHOUSANDS|UDS_ARROWKEYS, - 0,0,0,0,Parent,0,hInst,widget->hWnd, - (int)spin->adj->upper,(int)spin->adj->lower, - (int)spin->adj->value); + 0,0,0,0,Parent,0,hInst,widget->hWnd,20,10,15); gtk_set_default_font(spin->updown); + gtk_spin_button_set_adjustment(spin,spin->adj); } void gtk_spin_button_destroy(GtkWidget *widget) { t@@ -3045,13 +3201,15 @@ void gtk_entry_set_text(GtkEntry *entry,const gchar *text) { guint SetAccelerator(GtkWidget *labelparent,gchar *Text, GtkWidget *sendto,gchar *signal, GtkAccelGroup *accel_group) { + gtk_signal_emit(GTK_OBJECT(labelparent),"set_text",Text); return 0; } void gtk_widget_add_accelerator(GtkWidget *widget, const gchar *accel_signal, GtkAccelGroup *accel_group, - guint accel_key,guint accel_mods) { + guint accel_key,guint accel_mods, + GtkAccelFlags accel_flags) { } void gtk_widget_remove_accelerator(GtkWidget *widget, t@@ -3173,8 +3331,6 @@ void gtk_hpaned_set_size(GtkWidget *widget,GtkAllocation *allocation) { child_alloc.height=allocation->height; child_alloc.width=allocation->width/numchildren; for (i=0;i<2;i++) if (paned->children[i].widget) { -/* g_print("Setting size of child to %d,%d at %d,%d\n", - child_alloc.width,child_alloc.height,child_alloc.x,child_alloc.y);*/ gtk_widget_set_size(paned->children[i].widget,&child_alloc); child_alloc.x+=allocation->width/numchildren; } t@@ -3185,6 +3341,7 @@ void gtk_text_set_editable(GtkText *text,gboolean is_editable) { } void gtk_text_set_word_wrap(GtkText *text,gboolean word_wrap) { + text->word_wrap=word_wrap; } void gtk_text_freeze(GtkText *text) { t@@ -3203,4 +3360,222 @@ void gtk_clist_thaw(GtkCList *clist) { } void gtk_clist_clear(GtkCList *clist) { + GtkCListRow *row; + GSList *list; + gint i; + HWND hWnd; + + for (list=clist->rows;list;list=g_slist_next(list)) { + row=(GtkCListRow *)list->data; + for (i=0;i<clist->ncols;i++) { + g_free(row->text[i]); + } + g_free(row); + } + g_slist_free(clist->rows); + clist->rows=NULL; + + hWnd=GTK_WIDGET(clist)->hWnd; + if (hWnd) { + SendMessage(hWnd,LB_RESETCONTENT,0,0); + } +} + +GtkWidget *gtk_option_menu_new() { + GtkOptionMenu *option_menu; + option_menu=GTK_OPTION_MENU(GtkNewObject(&GtkOptionMenuClass)); + return GTK_WIDGET(option_menu); +} + +GtkWidget *gtk_option_menu_get_menu(GtkOptionMenu *option_menu) { + return option_menu->menu; +} + +void gtk_option_menu_set_menu(GtkOptionMenu *option_menu,GtkWidget *menu) { + GSList *list; + GtkMenuItem *menu_item; + HWND hWnd; + + if (!menu) return; + option_menu->menu=menu; + hWnd=GTK_WIDGET(option_menu)->hWnd; + + if (hWnd) { + SendMessage(hWnd,CB_RESETCONTENT,0,0); + for (list=GTK_MENU_SHELL(menu)->children;list;list=g_slist_next(list)) { + menu_item=GTK_MENU_ITEM(list->data); + if (menu_item && menu_item->text) + SendMessage(hWnd,CB_ADDSTRING,0,(LPARAM)menu_item->text); + } + SendMessage(hWnd,CB_SETCURSEL,(WPARAM)GTK_MENU(menu)->active,0); + } +} + +void gtk_option_menu_set_history(GtkOptionMenu *option_menu,guint index) { + GtkWidget *menu; + menu=gtk_option_menu_get_menu(option_menu); + if (menu) gtk_menu_set_active(GTK_MENU(menu),index); +} + +void gtk_option_menu_size_request(GtkWidget *widget, + GtkRequisition *requisition) { + SIZE size; + + if (GetTextSize(widget->hWnd,"Sample text",&size)) { + requisition->width = size.cx+40; + requisition->height = size.cy+4; + } +} + +void gtk_option_menu_set_size(GtkWidget *widget,GtkAllocation *allocation) { + allocation->height *= 6; +} + +void gtk_option_menu_realize(GtkWidget *widget) { + HWND Parent; + GtkOptionMenu *option_menu=GTK_OPTION_MENU(widget); + + Parent=gtk_get_parent_hwnd(widget); + widget->hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,"COMBOBOX","", + WS_CHILD|WS_TABSTOP|WS_VSCROLL| + CBS_HASSTRINGS|CBS_DROPDOWNLIST, + 0,0,0,0,Parent,NULL,hInst,NULL); + gtk_set_default_font(widget->hWnd); + gtk_option_menu_set_menu(option_menu,option_menu->menu); +} + +void gtk_label_set_text(GtkLabel *label,const gchar *str) { + gint i; + HWND hWnd; + g_free(label->text); + label->text = g_strdup(str ? str : ""); + for (i=0;i<strlen(label->text);i++) { + if (label->text[i]=='_') label->text[i]='&'; + } + hWnd=GTK_WIDGET(label)->hWnd; + if (hWnd) { + gtk_widget_update(GTK_WIDGET(label),FALSE); + SendMessage(hWnd,WM_SETTEXT,0,(LPARAM)label->text); + } +} + +void gtk_button_set_text(GtkButton *button,gchar *text) { + gint i; + HWND hWnd; + g_free(button->text); + button->text = g_strdup(text ? text : ""); + for (i=0;i<strlen(button->text);i++) { + if (button->text[i]=='_') button->text[i]='&'; + } + hWnd=GTK_WIDGET(button)->hWnd; + if (hWnd) { + gtk_widget_update(GTK_WIDGET(button),FALSE); + SendMessage(hWnd,WM_SETTEXT,0,(LPARAM)button->text); + } +} + +static void gtk_menu_item_set_text(GtkMenuItem *menuitem,gchar *text) { + gint i; + g_free(menuitem->text); + menuitem->text = g_strdup(text ? text : ""); + for (i=0;i<strlen(menuitem->text);i++) { + if (menuitem->text[i]=='_') menuitem->text[i]='&'; + } +} + +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; +} + +void gtk_clist_set_row_data(GtkCList *clist,gint row,gpointer data) { + GtkCListRow *list_row; + if (row>=0 && row<g_slist_length(clist->rows)) { + list_row=(GtkCListRow *)g_slist_nth_data(clist->rows,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<g_slist_length(clist->rows)) { + list_row=(GtkCListRow *)g_slist_nth_data(clist->rows,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); +} + +void gtk_widget_set_usize(GtkWidget *widget,gint width,gint height) { +} + +void gtk_clist_select_row(GtkCList *clist,gint row,gint column) { +} + +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) { +} + +void gtk_clist_set_column_auto_resize(GtkCList *clist,gint column, + gboolean auto_resize) { + if (clist && column>=0 && column<clist->ncols) { + clist->cols[column].auto_resize=auto_resize; + } +} + +void gtk_clist_update_selection(GtkWidget *widget) { + GtkCList *clist=GTK_CLIST(widget); + gint i; + g_list_free(clist->selection); + clist->selection=NULL; + if (widget->hWnd==NULL) return; + for (i=0;i<g_slist_length(clist->rows);i++) { + if (SendMessage(widget->hWnd,LB_GETSEL,(WPARAM)i,0) > 0) { + clist->selection=g_list_append(clist->selection,GINT_TO_POINTER(i)); + } + } +} + +void gtk_editable_create(GtkWidget *widget) { + GtkEditable *editable=GTK_EDITABLE(widget); + gtk_widget_create(widget); + editable->is_editable=TRUE; + editable->text=g_string_new(""); +} + +void gtk_option_menu_update_selection(GtkWidget *widget) { + LRESULT lres; + GtkMenuShell *menu; + GtkWidget *menu_item; + + if (widget->hWnd==NULL) return; + lres=SendMessage(widget->hWnd,CB_GETCURSEL,0,0); + if (lres==CB_ERR) return; + + menu=GTK_MENU_SHELL(gtk_option_menu_get_menu(GTK_OPTION_MENU(widget))); + if (menu) { + menu_item=GTK_WIDGET(g_slist_nth_data(menu->children,lres)); + if (menu_item) gtk_signal_emit(GTK_OBJECT(menu_item),"activate"); + } } (DIR) diff --git a/src/gtk.h b/src/gtk.h t@@ -10,6 +10,17 @@ typedef enum { } GtkWindowType; typedef enum { + GTK_ACCEL_VISIBLE = 1 << 0, + GTK_ACCEL_SIGNAL_VISIBLE = 1 << 1 +} GtkAccelFlags; + +typedef enum { + GTK_VISIBILITY_NONE, + GTK_VISIBILITY_PARTIAL, + GTK_VISIBILITY_FULL +} GtkVisibility; + +typedef enum { GTK_EXPAND = 1 << 0, GTK_SHRINK = 1 << 1, GTK_FILL = 1 << 2 t@@ -68,6 +79,7 @@ typedef struct _GtkPanedChild GtkPanedChild; typedef struct _GtkPaned GtkPaned; typedef struct _GtkVPaned GtkVPaned; typedef struct _GtkHPaned GtkHPaned; +typedef struct _GtkOptionMenu GtkOptionMenu; struct _GtkAccelGroup { GSList *accel; t@@ -144,6 +156,7 @@ struct _GtkMenuShell { struct _GtkMenu { GtkMenuShell menushell; + guint active; }; struct _GtkMenuBar { t@@ -158,6 +171,8 @@ typedef struct _GtkSpinButton GtkSpinButton; struct _GtkEditable { GtkWidget widget; + GString *text; + gint is_editable : 1; }; struct _GtkEntry { t@@ -172,6 +187,7 @@ struct _GtkSpinButton { struct _GtkText { GtkEditable editable; + gint word_wrap : 1; }; typedef struct _GtkLabel GtkLabel; t@@ -222,6 +238,9 @@ 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@@ -289,7 +308,9 @@ struct _GtkCList { gint16 header_size; GSList *rows; GtkCListColumn *cols; + GList *selection; GtkSelectionMode mode; + gint auto_sort : 1; }; typedef struct _GtkBin GtkBin; t@@ -316,6 +337,12 @@ struct _GtkButton { gchar *text; }; +struct _GtkOptionMenu { + GtkButton button; + GtkWidget *menu; + guint selection; +}; + struct _GtkToggleButton { GtkButton button; gboolean toggled; t@@ -386,6 +413,7 @@ struct _GtkTableRowCol { #define GTK_TEXT(obj) ((GtkText *)(obj)) #define GTK_WINDOW(obj) ((GtkWindow *)(obj)) #define GTK_BUTTON(obj) ((GtkButton *)(obj)) +#define GTK_OPTION_MENU(obj) ((GtkOptionMenu *)(obj)) #define GTK_TOGGLE_BUTTON(obj) ((GtkToggleButton *)(obj)) #define GTK_RADIO_BUTTON(obj) ((GtkRadioButton *)(obj)) #define GTK_CHECK_BUTTON(obj) ((GtkCheckButton *)(obj)) t@@ -409,6 +437,7 @@ typedef int GdkEvent; void gtk_widget_show(GtkWidget *widget); void gtk_widget_show_all(GtkWidget *widget); +void gtk_widget_hide_all(GtkWidget *widget); void gtk_widget_hide(GtkWidget *widget); void gtk_widget_destroy(GtkWidget *widget); void gtk_widget_realize(GtkWidget *widget); t@@ -449,12 +478,16 @@ 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[]); +GtkWidget *gtk_scrolled_clist_new_with_titles(gint columns,gchar *titles[], + GtkWidget **pack_widg); gint gtk_clist_append(GtkCList *clist,gchar *text[]); void gtk_clist_set_column_title(GtkCList *clist,gint column,const gchar *title); gint gtk_clist_insert(GtkCList *clist,gint row,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); t@@ -515,6 +548,7 @@ 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_submenu(GtkMenuItem *menu_item,GtkWidget *submenu); +void gtk_menu_set_active(GtkMenu *menu,guint index); GtkWidget *gtk_notebook_new(); void gtk_notebook_append_page(GtkNotebook *notebook,GtkWidget *child, GtkWidget *tab_label); t@@ -546,7 +580,8 @@ void gtk_entry_set_text(GtkEntry *entry,const gchar *text); void gtk_widget_add_accelerator(GtkWidget *widget, const gchar *accel_signal, GtkAccelGroup *accel_group, - guint accel_key,guint accel_mods); + guint accel_key,guint accel_mods, + GtkAccelFlags accel_flags); void gtk_widget_remove_accelerator(GtkWidget *widget, GtkAccelGroup *accel_group, guint accel_key,guint accel_mods); t@@ -567,5 +602,28 @@ void gtk_paned_pack2(GtkPaned *paned,GtkWidget *child,gboolean resize, #define gtk_container_border_width gtk_container_set_border_width #define gtk_hbutton_box_new() gtk_hbox_new(TRUE,5) #define gtk_vbutton_box_new() gtk_vbox_new(TRUE,5) +GtkWidget *gtk_option_menu_new(); +GtkWidget *gtk_option_menu_get_menu(GtkOptionMenu *option_menu); +void gtk_option_menu_set_menu(GtkOptionMenu *option_menu,GtkWidget *menu); +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_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); +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, + GtkAdjustment *adjustment); #endif (DIR) diff --git a/src/gtk_client.c b/src/gtk_client.c t@@ -125,10 +125,8 @@ static void Jet(); static void DealDrugs(GtkWidget *widget,gpointer data); static void DealGuns(GtkWidget *widget,gpointer data); static void QuestionDialog(char *Data,Player *From); -#ifndef CYGWIN -static gint MessageBox(GtkWidget *parent,const gchar *Text, - const gchar *Title,gint Options); -#endif +static gint GtkMessageBox(GtkWidget *parent,const gchar *Text, + const gchar *Title,gint Options); static void TransferDialog(gboolean Debt); static void ListPlayers(GtkWidget *widget,gpointer data); static void TalkToAll(GtkWidget *widget,gpointer data); t@@ -180,9 +178,9 @@ static gchar *MenuTranslate(const gchar *path,gpointer func_data) { static void LogMessage(const gchar *log_domain,GLogLevelFlags log_level, const gchar *message,gpointer user_data) { - MessageBox(NULL,message, - log_level&G_LOG_LEVEL_WARNING ? _("Warning") : _("Message"), - MB_OK); + GtkMessageBox(NULL,message, + log_level&G_LOG_LEVEL_WARNING ? _("Warning") : _("Message"), + MB_OK); } #ifndef CYGWIN t@@ -201,8 +199,8 @@ static guint SetAccelerator(GtkWidget *labelparent,gchar *Text, void QuitGame(GtkWidget *widget,gpointer data) { if (!InGame || - MessageBox(ClientData.window,_("Abandon current game?"),_("Quit Game"), - MB_YESNO)==IDYES) { + GtkMessageBox(ClientData.window,_("Abandon current game?"), + _("Quit Game"),MB_YESNO)==IDYES) { gtk_main_quit(); } } t@@ -212,15 +210,15 @@ void DestroyGtk(GtkWidget *widget,gpointer data) { } gint MainDelete(GtkWidget *widget,GdkEvent *event,gpointer data) { - return (InGame && MessageBox(ClientData.window,_("Abandon current game?"), - _("Quit Game"),MB_YESNO)==IDNO); + return (InGame && GtkMessageBox(ClientData.window,_("Abandon current game?"), + _("Quit Game"),MB_YESNO)==IDNO); } void NewGame(GtkWidget *widget,gpointer data) { if (InGame) { - if (MessageBox(ClientData.window,_("Abandon current game?"), - _("Start new game"),MB_YESNO)==IDYES) EndGame(); + if (GtkMessageBox(ClientData.window,_("Abandon current game?"), + _("Start new game"),MB_YESNO)==IDYES) EndGame(); else return; } NewGameDialog(); t@@ -549,6 +547,19 @@ static GtkWidget *gtk_scrolled_text_new(GtkAdjustment *hadj,GtkAdjustment *vadj, *pack_widg=hbox; return text; } + +static GtkWidget *gtk_scrolled_clist_new_with_titles(gint columns, + gchar *titles[], + GtkWidget **pack_widg) { + GtkWidget *scrollwin,*clist; + clist=gtk_clist_new_with_titles(5,server_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 static GtkWidget *AddFightButton(gchar *Text,GtkAccelGroup *accel_group, t@@ -1156,24 +1167,24 @@ void DealGuns(GtkWidget *widget,gpointer data) { if (data!=BT_BUY && TotalGunsCarried(ClientData.Play)==0) { dpg_string_sprintf(text,_("You don't have any %tde!"),Names.Guns); - MessageBox(dialog,text->str,Title,MB_OK); + GtkMessageBox(dialog,text->str,Title,MB_OK); } else if (data==BT_BUY && TotalGunsCarried(ClientData.Play) >= ClientData.Play->Bitches.Carried+2) { dpg_string_sprintf(text, _("You'll need more %tde to carry any more %tde!"), Names.Bitches,Names.Guns); - MessageBox(dialog,text->str,Title,MB_OK); + GtkMessageBox(dialog,text->str,Title,MB_OK); } else if (data==BT_BUY && Gun[GunInd].Space > ClientData.Play->CoatSize) { dpg_string_sprintf(text, _("You don't have enough space to carry that %tde!"), Names.Gun); - MessageBox(dialog,text->str,Title,MB_OK); + GtkMessageBox(dialog,text->str,Title,MB_OK); } else if (data==BT_BUY && Gun[GunInd].Price > ClientData.Play->Cash) { dpg_string_sprintf(text,_("You don't have enough cash to buy that %tde!"), Names.Gun); - MessageBox(dialog,text->str,Title,MB_OK); + GtkMessageBox(dialog,text->str,Title,MB_OK); } else if (data==BT_SELL && ClientData.Play->Guns[GunInd].Carried == 0) { - MessageBox(dialog,_("You don't have any to sell!"),Title,MB_OK); + GtkMessageBox(dialog,_("You don't have any to sell!"),Title,MB_OK); } else { g_string_sprintf(text,"gun^%d^%d",GunInd,data==BT_BUY ? 1 : -1); SendClientMessage(ClientData.Play,C_NONE,C_BUYOBJECT,NULL,text->str); t@@ -1402,7 +1413,7 @@ void SetJetButtonTitle(GtkAccelGroup *accel_group) { } #ifdef CYGWIN -char GtkLoop(HINST hInstance,HINST hPrevInstance) { +char GtkLoop(HINSTANCE hInstance,HINSTANCE hPrevInstance) { #else char GtkLoop(int *argc,char **argv[],char ReturnOnFail) { #endif t@@ -1466,16 +1477,12 @@ char GtkLoop(int *argc,char **argv[],char ReturnOnFail) { vpaned=gtk_vpaned_new(); - hbox=gtk_hbox_new(FALSE,0); adj=(GtkAdjustment *)gtk_adjustment_new(0.0,0.0,100.0,1.0,10.0,10.0); - text=ClientData.messages=gtk_text_new(NULL,adj); + text=ClientData.messages=gtk_scrolled_text_new(NULL,adj,&hbox); gtk_widget_set_usize(text,100,80); gtk_text_set_point(GTK_TEXT(text),0); gtk_text_set_editable(GTK_TEXT(text),FALSE); gtk_text_set_word_wrap(GTK_TEXT(text),TRUE); - gtk_box_pack_start(GTK_BOX(hbox),text,TRUE,TRUE,0); - vscroll=gtk_vscrollbar_new(adj); - gtk_box_pack_start(GTK_BOX(hbox),vscroll,FALSE,FALSE,0); gtk_paned_pack1(GTK_PANED(vpaned),hbox,TRUE,TRUE); hbox=gtk_hbox_new(FALSE,7); t@@ -1838,13 +1845,12 @@ void NewGameDialog() { vbox2=gtk_vbox_new(FALSE,7); gtk_container_set_border_width(GTK_CONTAINER(vbox2),4); - scrollwin=gtk_scrolled_window_new(NULL,NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), - GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); - clist=widgets.metaserv=gtk_clist_new_with_titles(5,server_titles); + + clist=widgets.metaserv=gtk_scrolled_clist_new_with_titles(5,server_titles, + &scrollwin); gtk_clist_column_titles_passive(GTK_CLIST(clist)); gtk_clist_set_selection_mode(GTK_CLIST(clist),GTK_SELECTION_SINGLE); - gtk_container_add(GTK_CONTAINER(scrollwin),clist); + gtk_box_pack_start(GTK_BOX(vbox2),scrollwin,TRUE,TRUE,0); hbbox=gtk_hbutton_box_new(); t@@ -1883,11 +1889,11 @@ void NewGameDialog() { } #ifndef CYGWIN -static void DestroyMessageBox(GtkWidget *widget,gpointer data) { +static void DestroyGtkMessageBox(GtkWidget *widget,gpointer data) { gtk_main_quit(); } -static void MessageBoxCallback(GtkWidget *widget,gpointer data) { +static void GtkMessageBoxCallback(GtkWidget *widget,gpointer data) { gint *retval; GtkWidget *dialog; dialog=gtk_widget_get_ancestor(widget,GTK_TYPE_WINDOW); t@@ -1896,8 +1902,8 @@ static void MessageBoxCallback(GtkWidget *widget,gpointer data) { gtk_widget_destroy(dialog); } -gint MessageBox(GtkWidget *parent,const gchar *Text, - const gchar *Title,gint Options) { +gint GtkMessageBox(GtkWidget *parent,const gchar *Text, + const gchar *Title,gint Options) { GtkWidget *dialog,*button,*label,*vbox,*hbbox,*hsep; GtkAccelGroup *accel_group; gint i; t@@ -1913,7 +1919,7 @@ gint MessageBox(GtkWidget *parent,const gchar *Text, if (parent) gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent)); gtk_signal_connect(GTK_OBJECT(dialog),"destroy", - GTK_SIGNAL_FUNC(DestroyMessageBox),NULL); + GTK_SIGNAL_FUNC(DestroyGtkMessageBox),NULL); if (Title) gtk_window_set_title(GTK_WINDOW(dialog),Title); vbox=gtk_vbox_new(FALSE,7); t@@ -1936,7 +1942,7 @@ gint MessageBox(GtkWidget *parent,const gchar *Text, "clicked",accel_group); gtk_object_set_data(GTK_OBJECT(button),"retval",&retval); gtk_signal_connect(GTK_OBJECT(button),"clicked", - GTK_SIGNAL_FUNC(MessageBoxCallback), + GTK_SIGNAL_FUNC(GtkMessageBoxCallback), GINT_TO_POINTER(1<<i)); gtk_box_pack_start(GTK_BOX(hbbox),button,TRUE,TRUE,0); } t@@ -1947,6 +1953,12 @@ gint MessageBox(GtkWidget *parent,const gchar *Text, gtk_main(); return retval; } +#else +gint GtkMessageBox(GtkWidget *parent,const gchar *Text, + const gchar *Title,gint Options) { + return MessageBox(parent && parent->hWnd ? parent->hWnd : NULL, + Text,Title,Options); +} #endif static void SendDoneMessage(GtkWidget *widget,gpointer data) { t@@ -1982,13 +1994,13 @@ static void TransferOK(GtkWidget *widget,GtkWidget *dialog) { money=-money; } if (-money>ClientData.Play->Bank) { - MessageBox(dialog,_("There isn't that much money in the bank..."), + GtkMessageBox(dialog,_("There isn't that much money in the bank..."), "Bank",MB_OK); return; } } if (money>ClientData.Play->Cash) { - MessageBox(dialog,_("You don't have that much money!"), + GtkMessageBox(dialog,_("You don't have that much money!"), Debt ? "Pay loan" : "Bank",MB_OK); return; } t@@ -2369,7 +2381,7 @@ void SackBitch(GtkWidget *widget,gpointer data) { text=dpg_strdup_printf(_("Are you sure? (Any %tde or %tde carried\n" "by this %tde may be lost!)"),Names.Guns, Names.Drugs,Names.Bitch); - if (MessageBox(ClientData.window,text,title,MB_YESNO)==IDYES) { + if (GtkMessageBox(ClientData.window,text,title,MB_YESNO)==IDYES) { SendClientMessage(ClientData.Play,C_NONE,C_SACKBITCH,NULL,NULL); } g_free(text); g_free(title); t@@ -2407,16 +2419,12 @@ void CreateInventory(GtkWidget *hbox,gchar *Objects,GtkAccelGroup *accel_group, for (i=mini;i<2;i++) { gtk_container_set_border_width(GTK_CONTAINER(frame[i]),5); - scrollwin=gtk_scrolled_window_new(NULL,NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), - GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); - clist=gtk_clist_new_with_titles(2,titles[i]); + clist=gtk_scrolled_clist_new_with_titles(2,titles[i],&scrollwin); gtk_clist_set_column_auto_resize(GTK_CLIST(clist),0,TRUE); gtk_clist_set_column_auto_resize(GTK_CLIST(clist),1,TRUE); gtk_clist_column_titles_passive(GTK_CLIST(clist)); gtk_clist_set_selection_mode(GTK_CLIST(clist),GTK_SELECTION_SINGLE); gtk_clist_set_auto_sort(GTK_CLIST(clist),FALSE); - gtk_container_add(GTK_CONTAINER(scrollwin),clist); gtk_container_add(GTK_CONTAINER(frame[i]),scrollwin); if (i==0) widgets->HereList=clist; else widgets->CarriedList=clist; } (DIR) diff --git a/src/gtk_client.h b/src/gtk_client.h t@@ -26,6 +26,10 @@ #include <config.h> #endif +#ifdef CYGWIN +char GtkLoop(HINSTANCE hInstance,HINSTANCE hPrevInstance); +#else char GtkLoop(int *argc,char **argv[],char ReturnOnFail); +#endif #endif (DIR) diff --git a/src/win32_client.c b/src/win32_client.c t@@ -1734,7 +1734,7 @@ int APIENTRY Win32Loop(HINSTANCE hInstance,HINSTANCE hPrevInstance, split=g_strsplit(lpszCmdParam," ",0); argc=0; while (split[argc]) argc++; - g_set_print_handler(Win32PrintFunc); +// g_set_print_handler(Win32PrintFunc); HandleCmdLine(argc,split); g_strfreev(split); if (WantVersion || WantHelp) { t@@ -1790,14 +1790,14 @@ int APIENTRY Win32Loop(HINSTANCE hInstance,HINSTANCE hPrevInstance, } StopNetworking(); return msg.wParam; - } #elif GUI_CLIENT - GtkLoop(hInstance,hPrevInstance); + GtkLoop(hInstance,hPrevInstance); #else - g_print("No windowed client available - rebuild the binary passing the\n" - "--enable-win32-client option to configure, or use the curses\n" - "client (if available) instead!\n"); + g_print("No windowed client available - rebuild the binary passing\n" + "the --enable-win32-client option to configure, or use the\n" + "curses client (if available) instead!\n"); #endif + } StopNetworking(); } if (PidFile) g_free(PidFile);