diff gtk/dw.c @ 63:a6801a2260af

Synched up with the latest dynamic windows, has new slider support and transparency, focus, and other bug fixes on various platforms.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Mon, 14 Jan 2002 00:48:08 +0000
parents 61869769c050
children 664a274a46a6
line wrap: on
line diff
--- a/gtk/dw.c	Sat Dec 08 04:47:43 2001 +0000
+++ b/gtk/dw.c	Mon Jan 14 00:48:08 2002 +0000
@@ -3,7 +3,7 @@
  *          A GTK like implementation of the PM GUI
  *          GTK forwarder module for portabilty.
  *
- * (C) 2000,2001 Brian Smith <dbsoft@technologist.com>
+ * (C) 2000-2002 Brian Smith <dbsoft@technologist.com>
  *
  */
 #include "dw.h"
@@ -91,6 +91,8 @@
 void _set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data);
 void _tree_select_event(GtkTree *tree, GtkWidget *child, gpointer data);
 void _tree_context_event(GtkWidget *widget, GdkEventButton *event, gpointer data);
+void _value_changed_event(GtkAdjustment *adjustment, gpointer user_data);
+
 
 void msleep(long period);
 
@@ -109,7 +111,7 @@
 
 } SignalHandler;
 
-#define SIGNALMAX 15
+#define SIGNALMAX 16
 
 /* A list of signal forwarders, to account for paramater differences. */
 SignalList SignalTranslate[SIGNALMAX] = {
@@ -127,7 +129,8 @@
 	{ _tree_context_event, "tree-context" },
 	{ _item_select_event, "item-select" },
 	{ _tree_select_event, "tree-select" },
-	{ _set_focus_event, "set-focus" }
+	{ _set_focus_event, "set-focus" },
+	{ _value_changed_event, "value_changed" }
 };
 
 /* Alignment flags */
@@ -464,6 +467,39 @@
 	}
 }
 
+int _round_value(gfloat val)
+{
+	int newval = (int)val;
+
+	if(val >= 0.5 + (gfloat)newval)
+		newval++;
+
+	return newval;
+}
+
+void _value_changed_event(GtkAdjustment *adjustment, gpointer data)
+{
+	GtkWidget *slider = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(adjustment), "slider");
+	SignalHandler *work = (SignalHandler *)data;
+
+	if(slider && work)
+	{
+		int (*valuechangedfunc)(HWND, int, void *) = work->func;
+		int max = _round_value(adjustment->upper) - 1;
+		int val = _round_value(adjustment->value);
+		static int lastval = -1;
+		static GtkWidget *lastwidget = 0;
+
+		if(lastval != val || lastwidget != slider)
+		{
+			if(GTK_IS_VSCALE(slider))
+				valuechangedfunc(work->window, max - val,  work->data);
+			else
+				valuechangedfunc(work->window, val,  work->data);
+		}
+	}
+}
+
 gint _default_key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
 {
 	GtkWidget *next = (GtkWidget *)data;
@@ -633,17 +669,21 @@
 }
 
 /*
- * Runs a message loop for Dynamic Windows, for a period of seconds.
+ * Runs a message loop for Dynamic Windows, for a period of milliseconds.
  * Parameters:
- *           seconds: Number of seconds to run the loop for.
- */
-void dw_main_sleep(int seconds)
-{
-	time_t start = time(NULL);
+ *           milliseconds: Number of milliseconds to run the loop for.
+ */
+void dw_main_sleep(int milliseconds)
+{
+	struct timeval tv, start;
+
+	gettimeofday(&start, NULL);
 
 	if(_dw_thread == (pthread_t)-1 || _dw_thread == pthread_self())
 	{
-		while(time(NULL) - start <= seconds)
+		gettimeofday(&tv, NULL);
+
+		while(((tv.tv_sec - start.tv_sec)*1000) + ((tv.tv_usec - start.tv_usec)/1000) <= milliseconds)
 		{
 			gdk_threads_enter();
 			if(gtk_events_pending())
@@ -651,10 +691,11 @@
 			else
 				msleep(1);
 			gdk_threads_leave();
+			gettimeofday(&tv, NULL);
 		}
 	}
 	else
-		msleep(seconds * 1000);
+		msleep(milliseconds);
 }
 
 /*
@@ -2040,6 +2081,35 @@
 }
 
 /*
+ * Create a new slider window (widget) to be packed.
+ * Parameters:
+ *       vertical: TRUE or FALSE if slider is vertical.
+ *       increments: Number of increments available.
+ *       id: An ID to be used with WinWindowFromID() or 0L.
+ */
+HWND dw_slider_new(int vertical, int increments, ULONG id)
+{
+	GtkWidget *tmp;
+	GtkAdjustment *adjustment;
+	int _locked_by_me = FALSE;
+
+	DW_MUTEX_LOCK;
+	adjustment = (GtkAdjustment *)gtk_adjustment_new(0, 0, (gfloat)(increments + 1), 1, 1, 1);
+	if(vertical)
+		tmp = gtk_vscale_new(adjustment);
+	else
+		tmp = gtk_hscale_new(adjustment);
+	gtk_widget_show(tmp);
+	gtk_scale_set_draw_value(GTK_SCALE(tmp), 0);
+	gtk_scale_set_digits(GTK_SCALE(tmp), 0);
+	gtk_object_set_data(GTK_OBJECT(tmp), "adjustment", (gpointer)adjustment);
+	gtk_object_set_data(GTK_OBJECT(adjustment), "slider", (gpointer)tmp);
+	gtk_object_set_data(GTK_OBJECT(tmp), "id", (gpointer)id);
+	DW_MUTEX_UNLOCK;
+	return tmp;
+}
+
+/*
  * Create a new percent bar window (widget) to be packed.
  * Parameters:
  *       id: An ID to be used with WinWindowFromID() or 0L.
@@ -2628,7 +2698,7 @@
 /*
  * Returns the range of the percent bar.
  * Parameters:
- *          handle: Handle to the slider to be queried.
+ *          handle: Handle to the percent bar to be queried.
  */
 unsigned int dw_percent_query_range(HWND handle)
 {
@@ -2638,8 +2708,8 @@
 /*
  * Sets the percent bar position.
  * Parameters:
- *          handle: Handle to the slider to be set.
- *          position: Position of the slider withing the range.
+ *          handle: Handle to the percent bar to be set.
+ *          position: Position of the percent bar withing the range.
  */
 void dw_percent_set_pos(HWND handle, unsigned int position)
 {
@@ -2651,6 +2721,63 @@
 }
 
 /*
+ * Returns the position of the slider.
+ * Parameters:
+ *          handle: Handle to the slider to be queried.
+ */
+unsigned int dw_slider_query_pos(HWND handle)
+{
+	int val = 0, _locked_by_me = FALSE;
+	GtkAdjustment *adjustment;
+
+	if(!handle)
+		return 0;
+
+	DW_MUTEX_LOCK;
+	adjustment = (GtkAdjustment *)gtk_object_get_data(GTK_OBJECT(handle), "adjustment");
+	if(adjustment)
+	{
+		int max = _round_value(adjustment->upper) - 1;
+		int thisval = _round_value(adjustment->value);
+
+		if(GTK_IS_VSCALE(handle))
+			val = max - thisval;
+        else
+			val = thisval;
+	}
+	DW_MUTEX_UNLOCK;
+	return val;
+}
+
+/*
+ * Sets the slider position.
+ * Parameters:
+ *          handle: Handle to the slider to be set.
+ *          position: Position of the slider withing the range.
+ */
+void dw_slider_set_pos(HWND handle, unsigned int position)
+{
+	int _locked_by_me = FALSE;
+	GtkAdjustment *adjustment;
+
+	if(!handle)
+		return;
+
+	DW_MUTEX_LOCK;
+	adjustment = (GtkAdjustment *)gtk_object_get_data(GTK_OBJECT(handle), "adjustment");
+	if(adjustment)
+	{
+		int max = _round_value(adjustment->upper) - 1;
+
+		if(GTK_IS_VSCALE(handle))
+			gtk_adjustment_set_value(adjustment, (gfloat)(max - position));
+        else
+			gtk_adjustment_set_value(adjustment, (gfloat)position);
+	}
+	DW_MUTEX_UNLOCK;
+}
+
+/*
  * Sets the spinbutton value.
  * Parameters:
  *          handle: Handle to the spinbutton to be set.
@@ -5606,6 +5733,10 @@
 		}
 		thisname = "select-child";
 	}
+	else if(GTK_IS_VSCALE(thiswindow) || GTK_IS_HSCALE(thiswindow))
+	{
+		thiswindow = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(thiswindow), "adjustment");
+	}
 
 	if(!thisfunc || !thiswindow)
 	{