changeset 36:cddb02f847e1

Added unix versions of functions in compat, and added getfsname, plus some GTK fixes.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Mon, 17 Sep 2001 09:15:40 +0000
parents 432c39a4ff86
children 360bc6a5f1c9
files compat.c compat.h dwcompat.def dwcompatw.def gtk/dw.c
diffstat 5 files changed, 298 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- 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 <share.h>
 #endif
 
+#ifdef __UNIX__
+#ifdef __FreeBSD__
+#include <sys/param.h>
+#include <sys/ucred.h>
+#include <sys/mount.h>
+#else
+#include <mntent.h>
+#include <sys/vfs.h>
+#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;
--- 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);
--- 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
--- 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
--- 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;z<strlen(src);z++)
+	{
+		if(src[z] != '\r')
+		{
+			dest[x] = src[z];
+			x++;
+		}
+	}
+	dest[x] = 0;
+}
+
 /*
  * Adds text to an MLE box and returns the current point.
  * Parameters:
@@ -1951,12 +1975,20 @@
 	if(GTK_IS_BOX(handle))
 	{
 		GtkWidget *tmp = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(handle), "mle");
+		GdkFont *font = (GdkFont *)gtk_object_get_data(GTK_OBJECT(handle), "gdkfont");
 
 		if(tmp && GTK_IS_TEXT(tmp))
 		{
+			GdkColor *fore = (GdkColor *)gtk_object_get_data(GTK_OBJECT(handle), "foregdk");
+			GdkColor *back = (GdkColor *)gtk_object_get_data(GTK_OBJECT(handle), "backgdk");
+			char *impbuf = malloc(strlen(buffer)+1);
+
+			_strip_cr(impbuf, buffer);
+
 			gtk_text_set_point(GTK_TEXT(tmp), startpoint < 0 ? 0 : startpoint);
-			gtk_text_insert(GTK_TEXT(tmp), NULL, NULL, NULL, buffer, -1);
+			gtk_text_insert(GTK_TEXT(tmp), font, fore, back, impbuf, -1);
 			tmppoint = gtk_text_get_point(GTK_TEXT(tmp));
+			free(impbuf);
 		}
 	}
 	DW_MUTEX_UNLOCK;
@@ -2168,6 +2200,7 @@
 		if(tmp && GTK_IS_TEXT(tmp))
 		{
 			gtk_text_set_word_wrap(GTK_TEXT(tmp), state);
+			gtk_text_set_line_wrap(GTK_TEXT(tmp), state);
 		}
 	}
 	DW_MUTEX_UNLOCK;
@@ -2545,6 +2578,7 @@
 	gtk_signal_connect(GTK_OBJECT(clist), "unselect_row", GTK_SIGNAL_FUNC(_unselect_row),  NULL);
 
 	gtk_clist_set_column_auto_resize(GTK_CLIST(clist), 0, TRUE);
+	gtk_clist_set_selection_mode(GTK_CLIST(clist), GTK_SELECTION_SINGLE);
 	gtk_container_add(GTK_CONTAINER(handle), clist);
 	gtk_object_set_user_data(GTK_OBJECT(handle), (gpointer)clist);
 	gtk_widget_show(clist);
@@ -3225,7 +3259,7 @@
 			gint ascent;
 
 			gdk_text_extents(font, text, strlen(text), NULL, NULL, NULL, &ascent, NULL);
-			gdk_draw_text(handle ? handle->window : 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);