comparison 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
comparison
equal deleted inserted replaced
62:2be5174bdb5d 63:a6801a2260af
1 /* 1 /*
2 * Dynamic Windows: 2 * Dynamic Windows:
3 * A GTK like implementation of the PM GUI 3 * A GTK like implementation of the PM GUI
4 * GTK forwarder module for portabilty. 4 * GTK forwarder module for portabilty.
5 * 5 *
6 * (C) 2000,2001 Brian Smith <dbsoft@technologist.com> 6 * (C) 2000-2002 Brian Smith <dbsoft@technologist.com>
7 * 7 *
8 */ 8 */
9 #include "dw.h" 9 #include "dw.h"
10 #include <string.h> 10 #include <string.h>
11 #include <stdlib.h> 11 #include <stdlib.h>
89 void _item_select_event(GtkWidget *widget, GtkWidget *child, gpointer data); 89 void _item_select_event(GtkWidget *widget, GtkWidget *child, gpointer data);
90 void _expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data); 90 void _expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data);
91 void _set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data); 91 void _set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data);
92 void _tree_select_event(GtkTree *tree, GtkWidget *child, gpointer data); 92 void _tree_select_event(GtkTree *tree, GtkWidget *child, gpointer data);
93 void _tree_context_event(GtkWidget *widget, GdkEventButton *event, gpointer data); 93 void _tree_context_event(GtkWidget *widget, GdkEventButton *event, gpointer data);
94 void _value_changed_event(GtkAdjustment *adjustment, gpointer user_data);
95
94 96
95 void msleep(long period); 97 void msleep(long period);
96 98
97 typedef struct 99 typedef struct
98 { 100 {
107 void *func; 109 void *func;
108 gpointer data; 110 gpointer data;
109 111
110 } SignalHandler; 112 } SignalHandler;
111 113
112 #define SIGNALMAX 15 114 #define SIGNALMAX 16
113 115
114 /* A list of signal forwarders, to account for paramater differences. */ 116 /* A list of signal forwarders, to account for paramater differences. */
115 SignalList SignalTranslate[SIGNALMAX] = { 117 SignalList SignalTranslate[SIGNALMAX] = {
116 { _configure_event, "configure_event" }, 118 { _configure_event, "configure_event" },
117 { _key_press_event, "key_press_event" }, 119 { _key_press_event, "key_press_event" },
125 { _container_select_event, "container-select" }, 127 { _container_select_event, "container-select" },
126 { _container_context_event, "container-context" }, 128 { _container_context_event, "container-context" },
127 { _tree_context_event, "tree-context" }, 129 { _tree_context_event, "tree-context" },
128 { _item_select_event, "item-select" }, 130 { _item_select_event, "item-select" },
129 { _tree_select_event, "tree-select" }, 131 { _tree_select_event, "tree-select" },
130 { _set_focus_event, "set-focus" } 132 { _set_focus_event, "set-focus" },
133 { _value_changed_event, "value_changed" }
131 }; 134 };
132 135
133 /* Alignment flags */ 136 /* Alignment flags */
134 #define DW_CENTER 0.5f 137 #define DW_CENTER 0.5f
135 #define DW_LEFT 0.0f 138 #define DW_LEFT 0.0f
459 462
460 if(rowdata) 463 if(rowdata)
461 { 464 {
462 g_list_remove(tmp, rowdata); 465 g_list_remove(tmp, rowdata);
463 gtk_object_set_data(GTK_OBJECT(widget), "selectlist", tmp); 466 gtk_object_set_data(GTK_OBJECT(widget), "selectlist", tmp);
467 }
468 }
469
470 int _round_value(gfloat val)
471 {
472 int newval = (int)val;
473
474 if(val >= 0.5 + (gfloat)newval)
475 newval++;
476
477 return newval;
478 }
479
480 void _value_changed_event(GtkAdjustment *adjustment, gpointer data)
481 {
482 GtkWidget *slider = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(adjustment), "slider");
483 SignalHandler *work = (SignalHandler *)data;
484
485 if(slider && work)
486 {
487 int (*valuechangedfunc)(HWND, int, void *) = work->func;
488 int max = _round_value(adjustment->upper) - 1;
489 int val = _round_value(adjustment->value);
490 static int lastval = -1;
491 static GtkWidget *lastwidget = 0;
492
493 if(lastval != val || lastwidget != slider)
494 {
495 if(GTK_IS_VSCALE(slider))
496 valuechangedfunc(work->window, max - val, work->data);
497 else
498 valuechangedfunc(work->window, val, work->data);
499 }
464 } 500 }
465 } 501 }
466 502
467 gint _default_key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer data) 503 gint _default_key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
468 { 504 {
631 gtk_main(); 667 gtk_main();
632 gdk_threads_leave(); 668 gdk_threads_leave();
633 } 669 }
634 670
635 /* 671 /*
636 * Runs a message loop for Dynamic Windows, for a period of seconds. 672 * Runs a message loop for Dynamic Windows, for a period of milliseconds.
637 * Parameters: 673 * Parameters:
638 * seconds: Number of seconds to run the loop for. 674 * milliseconds: Number of milliseconds to run the loop for.
639 */ 675 */
640 void dw_main_sleep(int seconds) 676 void dw_main_sleep(int milliseconds)
641 { 677 {
642 time_t start = time(NULL); 678 struct timeval tv, start;
679
680 gettimeofday(&start, NULL);
643 681
644 if(_dw_thread == (pthread_t)-1 || _dw_thread == pthread_self()) 682 if(_dw_thread == (pthread_t)-1 || _dw_thread == pthread_self())
645 { 683 {
646 while(time(NULL) - start <= seconds) 684 gettimeofday(&tv, NULL);
685
686 while(((tv.tv_sec - start.tv_sec)*1000) + ((tv.tv_usec - start.tv_usec)/1000) <= milliseconds)
647 { 687 {
648 gdk_threads_enter(); 688 gdk_threads_enter();
649 if(gtk_events_pending()) 689 if(gtk_events_pending())
650 gtk_main_iteration(); 690 gtk_main_iteration();
651 else 691 else
652 msleep(1); 692 msleep(1);
653 gdk_threads_leave(); 693 gdk_threads_leave();
694 gettimeofday(&tv, NULL);
654 } 695 }
655 } 696 }
656 else 697 else
657 msleep(seconds * 1000); 698 msleep(milliseconds);
658 } 699 }
659 700
660 /* 701 /*
661 * Free's memory allocated by dynamic windows. 702 * Free's memory allocated by dynamic windows.
662 * Parameters: 703 * Parameters:
2038 DW_MUTEX_UNLOCK; 2079 DW_MUTEX_UNLOCK;
2039 return tmp; 2080 return tmp;
2040 } 2081 }
2041 2082
2042 /* 2083 /*
2084 * Create a new slider window (widget) to be packed.
2085 * Parameters:
2086 * vertical: TRUE or FALSE if slider is vertical.
2087 * increments: Number of increments available.
2088 * id: An ID to be used with WinWindowFromID() or 0L.
2089 */
2090 HWND dw_slider_new(int vertical, int increments, ULONG id)
2091 {
2092 GtkWidget *tmp;
2093 GtkAdjustment *adjustment;
2094 int _locked_by_me = FALSE;
2095
2096 DW_MUTEX_LOCK;
2097 adjustment = (GtkAdjustment *)gtk_adjustment_new(0, 0, (gfloat)(increments + 1), 1, 1, 1);
2098 if(vertical)
2099 tmp = gtk_vscale_new(adjustment);
2100 else
2101 tmp = gtk_hscale_new(adjustment);
2102 gtk_widget_show(tmp);
2103 gtk_scale_set_draw_value(GTK_SCALE(tmp), 0);
2104 gtk_scale_set_digits(GTK_SCALE(tmp), 0);
2105 gtk_object_set_data(GTK_OBJECT(tmp), "adjustment", (gpointer)adjustment);
2106 gtk_object_set_data(GTK_OBJECT(adjustment), "slider", (gpointer)tmp);
2107 gtk_object_set_data(GTK_OBJECT(tmp), "id", (gpointer)id);
2108 DW_MUTEX_UNLOCK;
2109 return tmp;
2110 }
2111
2112 /*
2043 * Create a new percent bar window (widget) to be packed. 2113 * Create a new percent bar window (widget) to be packed.
2044 * Parameters: 2114 * Parameters:
2045 * id: An ID to be used with WinWindowFromID() or 0L. 2115 * id: An ID to be used with WinWindowFromID() or 0L.
2046 */ 2116 */
2047 HWND dw_percent_new(unsigned long id) 2117 HWND dw_percent_new(unsigned long id)
2626 } 2696 }
2627 2697
2628 /* 2698 /*
2629 * Returns the range of the percent bar. 2699 * Returns the range of the percent bar.
2630 * Parameters: 2700 * Parameters:
2701 * handle: Handle to the percent bar to be queried.
2702 */
2703 unsigned int dw_percent_query_range(HWND handle)
2704 {
2705 return 100;
2706 }
2707
2708 /*
2709 * Sets the percent bar position.
2710 * Parameters:
2711 * handle: Handle to the percent bar to be set.
2712 * position: Position of the percent bar withing the range.
2713 */
2714 void dw_percent_set_pos(HWND handle, unsigned int position)
2715 {
2716 int _locked_by_me = FALSE;
2717
2718 DW_MUTEX_LOCK;
2719 gtk_progress_bar_update(GTK_PROGRESS_BAR(handle), (gfloat)position/100);
2720 DW_MUTEX_UNLOCK;
2721 }
2722
2723 /*
2724 * Returns the position of the slider.
2725 * Parameters:
2631 * handle: Handle to the slider to be queried. 2726 * handle: Handle to the slider to be queried.
2632 */ 2727 */
2633 unsigned int dw_percent_query_range(HWND handle) 2728 unsigned int dw_slider_query_pos(HWND handle)
2634 { 2729 {
2635 return 100; 2730 int val = 0, _locked_by_me = FALSE;
2636 } 2731 GtkAdjustment *adjustment;
2637 2732
2638 /* 2733 if(!handle)
2639 * Sets the percent bar position. 2734 return 0;
2735
2736 DW_MUTEX_LOCK;
2737 adjustment = (GtkAdjustment *)gtk_object_get_data(GTK_OBJECT(handle), "adjustment");
2738 if(adjustment)
2739 {
2740 int max = _round_value(adjustment->upper) - 1;
2741 int thisval = _round_value(adjustment->value);
2742
2743 if(GTK_IS_VSCALE(handle))
2744 val = max - thisval;
2745 else
2746 val = thisval;
2747 }
2748 DW_MUTEX_UNLOCK;
2749 return val;
2750 }
2751
2752 /*
2753 * Sets the slider position.
2640 * Parameters: 2754 * Parameters:
2641 * handle: Handle to the slider to be set. 2755 * handle: Handle to the slider to be set.
2642 * position: Position of the slider withing the range. 2756 * position: Position of the slider withing the range.
2643 */ 2757 */
2644 void dw_percent_set_pos(HWND handle, unsigned int position) 2758 void dw_slider_set_pos(HWND handle, unsigned int position)
2645 { 2759 {
2646 int _locked_by_me = FALSE; 2760 int _locked_by_me = FALSE;
2647 2761 GtkAdjustment *adjustment;
2648 DW_MUTEX_LOCK; 2762
2649 gtk_progress_bar_update(GTK_PROGRESS_BAR(handle), (gfloat)position/100); 2763 if(!handle)
2764 return;
2765
2766 DW_MUTEX_LOCK;
2767 adjustment = (GtkAdjustment *)gtk_object_get_data(GTK_OBJECT(handle), "adjustment");
2768 if(adjustment)
2769 {
2770 int max = _round_value(adjustment->upper) - 1;
2771
2772 if(GTK_IS_VSCALE(handle))
2773 gtk_adjustment_set_value(adjustment, (gfloat)(max - position));
2774 else
2775 gtk_adjustment_set_value(adjustment, (gfloat)position);
2776 }
2650 DW_MUTEX_UNLOCK; 2777 DW_MUTEX_UNLOCK;
2651 } 2778 }
2652 2779
2653 /* 2780 /*
2654 * Sets the spinbutton value. 2781 * Sets the spinbutton value.
5604 gtk_object_set_data(GTK_OBJECT(thiswindow), "select-child-func", (gpointer)thisfunc); 5731 gtk_object_set_data(GTK_OBJECT(thiswindow), "select-child-func", (gpointer)thisfunc);
5605 gtk_object_set_data(GTK_OBJECT(thiswindow), "select-child-data", (gpointer)work); 5732 gtk_object_set_data(GTK_OBJECT(thiswindow), "select-child-data", (gpointer)work);
5606 } 5733 }
5607 thisname = "select-child"; 5734 thisname = "select-child";
5608 } 5735 }
5736 else if(GTK_IS_VSCALE(thiswindow) || GTK_IS_HSCALE(thiswindow))
5737 {
5738 thiswindow = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(thiswindow), "adjustment");
5739 }
5609 5740
5610 if(!thisfunc || !thiswindow) 5741 if(!thisfunc || !thiswindow)
5611 { 5742 {
5612 free(work); 5743 free(work);
5613 DW_MUTEX_UNLOCK; 5744 DW_MUTEX_UNLOCK;