# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1000718140 0 # Node ID cddb02f847e1c015a7d437d02d5fac87c3b096db # Parent 432c39a4ff86f57c139cce54e7339d45505f5b29 Added unix versions of functions in compat, and added getfsname, plus some GTK fixes. diff -r 432c39a4ff86 -r cddb02f847e1 compat.c --- a/compat.c Fri Sep 07 15:27:55 2001 +0000 +++ b/compat.c Mon Sep 17 09:15:40 2001 +0000 @@ -5,6 +5,17 @@ #include #endif +#ifdef __UNIX__ +#ifdef __FreeBSD__ +#include +#include +#include +#else +#include +#include +#endif +#endif + int sockread (int a, void *b, int c, int d) { #if defined(__IBMC__) || (defined(__WIN32__) && !defined(__CYGWIN32__)) @@ -188,13 +199,54 @@ #elif defined(__WIN32__) || defined(WINNT) char buffer[10] = "C:\\"; DWORD spc, bps, fc, tc; + ULONG kbytes; buffer[0] = drive + 'A' - 1; if(GetDiskFreeSpace(buffer, &spc, &bps, &fc, &tc) == 0) return 0; - return (unsigned long)(spc*bps*(fc/1024)); + + kbytes = fc/1024; + + return (unsigned long)(spc*bps*kbytes); +#elif defined(__FreeBSD__) + struct statfs *fsp; + int entries, index = 1; + + entries = getmntinfo (&fsp, MNT_NOWAIT); + + for (; entries-- > 0; fsp++) + { + if(index == drive) + return (fsp->f_bsize * fsp->f_bavail) / 1024; + } + return 0; #else + FILE *fp = setmntent(MOUNTED, "r"); + struct mntent *mnt; + struct statfs sfs; + int index = 1; + + if(fp) + { + while((mnt = getmntent(fp))) + { + if(index == drive) + { + long long size = 0; + + if(mnt->mnt_dir) + { + statfs(mnt->mnt_dir, &sfs); + size = sfs.f_bsize * (sfs.f_bavail / 1024); + } + endmntent(fp); + return size; + } + index++; + } + endmntent(fp); + } return 0; #endif } @@ -228,13 +280,54 @@ #elif defined(__WIN32__) || defined(WINNT) char buffer[10] = "C:\\"; DWORD spc, bps, fc, tc; + ULONG kbytes; buffer[0] = drive + 'A' - 1; if(GetDiskFreeSpace(buffer, &spc, &bps, &fc, &tc) == 0) return 0; - return (unsigned long)(spc*bps*(tc/1024)); + + kbytes = tc/1024; + + return (unsigned long)(spc*bps*kbytes); +#elif defined(__FreeBSD__) + struct statfs *fsp; + int entries, index = 1; + + entries = getmntinfo (&fsp, MNT_NOWAIT); + + for (; entries-- > 0; fsp++) + { + if(index == drive) + return (fsp->f_bsize * fsp->f_blocks) / 1024; + } + return 0; #else + FILE *fp = setmntent(MOUNTED, "r"); + struct mntent *mnt; + struct statfs sfs; + int index = 1; + + if(fp) + { + while((mnt = getmntent(fp))) + { + if(index == drive) + { + long long size = 0; + + if(mnt->mnt_dir) + { + statfs(mnt->mnt_dir, &sfs); + size = sfs.f_bsize * (sfs.f_blocks / 1024); + } + endmntent(fp); + return size; + } + index++; + } + endmntent(fp); + } return 0; #endif } @@ -263,10 +356,89 @@ if(GetVolumeInformation(buffer, volname, 100, &spc, &bps, &fc, NULL, 0) != 0) return 1; +#elif defined(__FreeBSD__) + struct statfs *fsp; + int entries, index = 1; + + entries = getmntinfo (&fsp, MNT_NOWAIT); + + for (; entries-- > 0; fsp++) + { + if(index == drive && fsp->f_blocks) + return 1; + } + return 0; +#else + FILE *fp = setmntent(MOUNTED, "r"); + struct mntent *mnt; + struct statfs sfs; + int index = 1; + + if(fp) + { + while((mnt = getmntent(fp))) + { + if(index == drive) + { + endmntent(fp); + if(mnt->mnt_dir) + { + statfs(mnt->mnt_dir, &sfs); + if(sfs.f_blocks) + return 1; + } + return 0; + } + index++; + } + endmntent(fp); + } #endif return 0; } +void getfsname(int drive, char *buf, int len) +{ +#ifdef __UNIX__ +#ifdef __FreeBSD__ + struct statfs *fsp; + int entries, index = 1; + + strncpy(buf, "Unknown", len); + + entries = getmntinfo (&fsp, MNT_NOWAIT); + + for (; entries-- > 0; fsp++) + { + if(index == drive) + strncpy(buf, fsp->f_mntonname, len); + } +#else + FILE *fp = setmntent(MOUNTED, "r"); + struct mntent *mnt; + int index = 1; + + strncpy(buf, "Unknown", len); + + if(fp) + { + while((mnt = getmntent(fp))) + { + if(index == drive && mnt->mnt_dir) + strncpy(buf, mnt->mnt_dir, len); + index++; + } + endmntent(fp); + } +#endif +#elif defined(__OS2__) + /* No snprintf() on OS/2 ??? */ + sprintf(buf, "Drive %c", (char)drive + 'A' - 1); +#else + snprintf(buf, len, "Drive %c", (char)drive + 'A' - 1); +#endif +} + void setfileinfo(char *filename, char *url) { time_t ltime; diff -r 432c39a4ff86 -r cddb02f847e1 compat.h --- a/compat.h Fri Sep 07 15:27:55 2001 +0000 +++ b/compat.h Mon Sep 17 09:15:40 2001 +0000 @@ -189,9 +189,11 @@ void nonblock(int fd); void setfileinfo(char *filename, char *url); #if defined(__IBMC__) || defined(__WIN32__) +unsigned long drivesize(int drive); unsigned long drivefree(int drive); #else unsigned long long drivefree(int drive); +unsigned long long drivesize(int drive); #endif int isdrive(int drive); FILE *fsopen(char *path, char *modes); diff -r 432c39a4ff86 -r cddb02f847e1 dwcompat.def --- a/dwcompat.def Fri Sep 07 15:27:55 2001 +0000 +++ b/dwcompat.def Mon Sep 17 09:15:40 2001 +0000 @@ -22,6 +22,7 @@ drivefree @23 isdrive @24 drivesize @25 + getfsname @26 opendir @30 openxdir @31 diff -r 432c39a4ff86 -r cddb02f847e1 dwcompatw.def --- a/dwcompatw.def Fri Sep 07 15:27:55 2001 +0000 +++ b/dwcompatw.def Mon Sep 17 09:15:40 2001 +0000 @@ -17,6 +17,7 @@ drivefree @23 isdrive @24 drivesize @25 + getfsname @26 opendir @30 openxdir @31 diff -r 432c39a4ff86 -r cddb02f847e1 gtk/dw.c --- a/gtk/dw.c Fri Sep 07 15:27:55 2001 +0000 +++ b/gtk/dw.c Mon Sep 17 09:15:40 2001 +0000 @@ -119,6 +119,11 @@ { _set_focus_event, "set-focus" } }; +/* Alignment flags */ +#define DW_CENTER 0.5f +#define DW_LEFT 0.0f +#define DW_RIGHT 1.0f + /* Finds the translation function for a given signal name */ void *_findsigfunc(char *signame) { @@ -823,6 +828,7 @@ char *font; int _locked_by_me = FALSE; gpointer data; + GdkFont *gdkfont; DW_MUTEX_LOCK; if(GTK_IS_SCROLLED_WINDOW(handle)) @@ -833,6 +839,14 @@ } font = strdup(fontname); + /* Free old font if it exists */ + gdkfont = (GdkFont *)gtk_object_get_data(GTK_OBJECT(handle2), "gdkfont"); + if(gdkfont) + gdk_font_unref(gdkfont); + gdkfont = gdk_font_load(fontname); + gtk_object_set_data(GTK_OBJECT(handle2), "gdkfont", (gpointer)gdkfont); + + /* Free old font name if one is allocated */ data = gtk_object_get_data(GTK_OBJECT(handle2), "fontname"); if(data) free(data); @@ -840,6 +854,7 @@ if(font) gtk_object_set_data(GTK_OBJECT(handle2), "fontname", (gpointer)font); + DW_MUTEX_UNLOCK; return TRUE; } @@ -1024,7 +1039,7 @@ { GtkWidget *tmp; int _locked_by_me = FALSE; - int flags = 0, cx = 0, cy = 0; + int flags = 0; DW_MUTEX_LOCK; tmp = gtk_window_new(GTK_WINDOW_TOPLEVEL); @@ -1036,27 +1051,18 @@ gtk_widget_realize(tmp); if(flStyle & DW_FCF_TITLEBAR) - { - cy += DEFAULT_TITLEBAR_HEIGHT; flags |= GDK_DECOR_TITLE; - } if(flStyle & DW_FCF_MINMAX) flags |= GDK_DECOR_MINIMIZE | GDK_DECOR_MAXIMIZE; if(flStyle & DW_FCF_SIZEBORDER) - { - cy += DEFAULT_SIZE_HEIGHT; - cx += DEFAULT_SIZE_WIDTH; flags |= GDK_DECOR_RESIZEH; - } if(flStyle & DW_FCF_BORDER) flags |= GDK_DECOR_BORDER; gdk_window_set_decorations(tmp->window, flags); - gtk_object_set_data(GTK_OBJECT(tmp), "cx", (gpointer)cx); - gtk_object_set_data(GTK_OBJECT(tmp), "cy", (gpointer)cy); if(hwndOwner) gdk_window_reparent(GTK_WIDGET(tmp)->window, GTK_WIDGET(hwndOwner)->window, 0, 0); @@ -1077,10 +1083,9 @@ int _locked_by_me = FALSE; DW_MUTEX_LOCK; - if(type == BOXVERT) - tmp = gtk_vbox_new(FALSE, pad); - else - tmp = gtk_hbox_new(FALSE, pad); + tmp = gtk_table_new(1, 1, FALSE); + gtk_object_set_data(GTK_OBJECT(tmp), "boxtype", (gpointer)type); + gtk_object_set_data(GTK_OBJECT(tmp), "boxpad", (gpointer)pad); gtk_widget_show(tmp); DW_MUTEX_UNLOCK; return tmp; @@ -1525,7 +1530,9 @@ DW_MUTEX_LOCK; tmp = gtk_label_new(text); - gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_LEFT); + + /* Left and centered */ + gtk_misc_set_alignment(GTK_MISC(tmp), 0.0f, 0.5f); gtk_widget_show(tmp); gtk_object_set_data(GTK_OBJECT(tmp), "id", (gpointer)id); DW_MUTEX_UNLOCK; @@ -1550,7 +1557,9 @@ gtk_container_add(GTK_CONTAINER(frame), tmp); gtk_widget_show(tmp); gtk_widget_show(frame); - gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_LEFT); + + /* Left and centered */ + gtk_misc_set_alignment(GTK_MISC(tmp), 0.0f, 0.5f); gtk_object_set_data(GTK_OBJECT(frame), "id", (gpointer)id); gtk_object_set_data(GTK_OBJECT(frame), "label", (gpointer)tmp); DW_MUTEX_UNLOCK; @@ -1935,6 +1944,21 @@ DW_MUTEX_UNLOCK; } +void _strip_cr(char *dest, char *src) +{ + int z, x = 0; + + for(z=0;zwindow : pixmap->pixmap, font, gc, x, y + ascent, text, strlen(text)); + gdk_draw_text(handle ? handle->window : pixmap->pixmap, font, gc, x, y + ascent + 2, text, strlen(text)); gdk_gc_unref(gc); gdk_font_unref(font); } @@ -3562,6 +3596,8 @@ exit(exitcode); } +#define DW_EXPAND (GTK_EXPAND | GTK_SHRINK | GTK_FILL) + /* * Pack windows (widgets) into a box from the end (or bottom). * Parameters: @@ -3575,7 +3611,6 @@ */ void dw_box_pack_end(HWND box, HWND item, int width, int height, int hsize, int vsize, int pad) { - int expand = (hsize == FALSE && vsize == FALSE) ? FALSE : TRUE; int _locked_by_me = FALSE; if(!box) @@ -3589,9 +3624,26 @@ gtk_widget_show(item); } - if(GTK_IS_BOX(box)) + if(GTK_IS_TABLE(box)) { - gtk_box_pack_end(GTK_BOX(box), item, expand, TRUE, pad); + int boxcount = (int)gtk_object_get_data(GTK_OBJECT(box), "boxcount"); + int boxtype = (int)gtk_object_get_data(GTK_OBJECT(box), "boxtype"); + + /* If the item being packed is a box, then we use it's padding + * instead of the padding specified on the pack line, this is + * due to a bug in the OS/2 and Win32 renderer and a limitation + * of the GtkTable class. + */ + if(GTK_IS_TABLE(item)) + pad = (int)gtk_object_get_data(GTK_OBJECT(item), "boxpad"); + + if(boxtype == BOXVERT) + gtk_table_resize(GTK_TABLE(box), boxcount + 1, 1); + else + gtk_table_resize(GTK_TABLE(box), 1, boxcount + 1); + + gtk_table_attach(GTK_TABLE(box), item, 0, 1, 0, 1, hsize ? DW_EXPAND : 0, vsize ? DW_EXPAND : 0, pad, pad); + gtk_object_set_data(GTK_OBJECT(box), "boxcount", (gpointer)boxcount + 1); gtk_widget_set_usize(item, width, height); if(GTK_IS_RADIO_BUTTON(item)) { @@ -3612,7 +3664,7 @@ GtkWidget *vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(box), vbox); - gtk_box_pack_end(GTK_BOX(vbox), item, expand, TRUE, 0); + gtk_box_pack_end(GTK_BOX(vbox), item, TRUE, TRUE, 0); gtk_widget_show(vbox); gtk_widget_set_usize(item, width, height); @@ -3716,13 +3768,10 @@ DW_MUTEX_LOCK; if(handle && GTK_IS_WINDOW(handle)) { - int cx = (int)gtk_object_get_data(GTK_OBJECT(handle), "cx"); - int cy = (int)gtk_object_get_data(GTK_OBJECT(handle), "cy"); - _size_allocate(GTK_WINDOW(handle)); gtk_widget_set_uposition(handle, x, y); - gtk_window_set_default_size(GTK_WINDOW(handle), width - cx, height - cy); + gtk_window_set_default_size(GTK_WINDOW(handle), width, height); } else if(handle && handle->window) { @@ -3748,13 +3797,8 @@ if(handle && handle->window) { - int cx, cy; - DW_MUTEX_LOCK; - cx = (int)gtk_object_get_data(GTK_OBJECT(handle), "cx"); - cy = (int)gtk_object_get_data(GTK_OBJECT(handle), "cy"); - gdk_window_get_geometry(handle->window, &gx, &gy, &gwidth, &gheight, &gdepth); gdk_window_get_root_origin(handle->window, &gx, &gy); if(x) @@ -3762,9 +3806,9 @@ if(y) *y = gy; if(width) - *width = gwidth - cx; + *width = gwidth; if(height) - *height = gheight - cy; + *height = gheight; DW_MUTEX_UNLOCK; } } @@ -3795,6 +3839,20 @@ if(style & DW_CCS_SINGLESEL) gtk_clist_set_selection_mode(GTK_CLIST(handle2), GTK_SELECTION_SINGLE); } + if(GTK_IS_LABEL(handle2)) + { + gfloat x, y; + + x = y = DW_LEFT; + + if(style & DW_DT_CENTER) + x = DW_CENTER; + + if(style & DW_DT_VCENTER) + y = DW_CENTER; + + gtk_misc_set_alignment(GTK_MISC(handle2), x, y); + } DW_MUTEX_UNLOCK; } @@ -4370,7 +4428,6 @@ */ void dw_box_pack_start(HWND box, HWND item, int width, int height, int hsize, int vsize, int pad) { - int expand = (hsize == FALSE && vsize == FALSE) ? FALSE : TRUE; int _locked_by_me = FALSE; if(!box) @@ -4384,9 +4441,35 @@ gtk_widget_show(item); } - if(GTK_IS_BOX(box)) + if(GTK_IS_TABLE(box)) { - gtk_box_pack_start(GTK_BOX(box), item, expand, TRUE, pad); + int boxcount = (int)gtk_object_get_data(GTK_OBJECT(box), "boxcount"); + int boxtype = (int)gtk_object_get_data(GTK_OBJECT(box), "boxtype"); + int x, y; + + /* If the item being packed is a box, then we use it's padding + * instead of the padding specified on the pack line, this is + * due to a bug in the OS/2 and Win32 renderer and a limitation + * of the GtkTable class. + */ + if(GTK_IS_TABLE(item)) + pad = (int)gtk_object_get_data(GTK_OBJECT(item), "boxpad"); + + if(boxtype == BOXVERT) + { + x = 0; + y = boxcount; + gtk_table_resize(GTK_TABLE(box), boxcount + 1, 1); + } + else + { + x = boxcount; + y = 0; + gtk_table_resize(GTK_TABLE(box), 1, boxcount + 1); + } + + gtk_table_attach(GTK_TABLE(box), item, x, x + 1, y, y + 1, hsize ? DW_EXPAND : 0, vsize ? DW_EXPAND : 0, pad, pad); + gtk_object_set_data(GTK_OBJECT(box), "boxcount", (gpointer)boxcount + 1); gtk_widget_set_usize(item, width, height); if(GTK_IS_RADIO_BUTTON(item)) { @@ -4407,7 +4490,7 @@ GtkWidget *vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(box), vbox); - gtk_box_pack_end(GTK_BOX(vbox), item, expand, TRUE, 0); + gtk_box_pack_end(GTK_BOX(vbox), item, TRUE, TRUE, 0); gtk_widget_show(vbox); gtk_widget_set_usize(item, width, height);