Mercurial > dwindows
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; |