28
33
#include "gtk/gtksignal.h"
29
34
#include "led_meter.h"
36
static void led_meter_class_init (LedMeterClass *klass);
37
static void led_meter_init (LedMeter *ttt);
38
static gint on_motion_notify_event (GtkWidget *widget, GdkEventMotion *event, gpointer* );
42
static void led_meter_class_init (LedMeterClass * klass);
43
static void led_meter_init (LedMeter * ttt);
40
45
static gint led_meter_signals[LAST_SIGNAL] = { 0 };
43
48
led_meter_get_type ()
45
static GType lm_type = 0;
49
static const GTypeInfo lm_info =
51
sizeof (LedMeterClass),
54
(GClassInitFunc) led_meter_class_init,
59
(GInstanceInitFunc) led_meter_init,
62
lm_type = g_type_register_static (GTK_TYPE_VBOX, "LedMeter", &lm_info, 0);
69
led_meter_class_init (LedMeterClass *class)
71
GtkObjectClass *object_class;
73
object_class = (GtkObjectClass*) class;
75
led_meter_signals[LED_METER_SIGNAL] = g_signal_new ("led_meter",
76
G_TYPE_FROM_CLASS (object_class),
81
g_cclosure_marshal_VOID__VOID,
82
G_TYPE_NONE, 0, NULL);
85
class->led_meter = NULL;
89
led_meter_init (LedMeter *lm)
92
GtkWidget *table, *viewport1;
95
// set colours [x][0] for inactive [x][1] for active
96
lm->led_background[LM_LOW][0].red = 0;
97
lm->led_background[LM_LOW][0].green = 0x3333;
98
lm->led_background[LM_LOW][0].blue = 0;
99
lm->led_background[LM_LOW][1].red = 0;
100
lm->led_background[LM_LOW][1].green = 0xFFFF;
101
lm->led_background[LM_LOW][1].blue = 0;
102
lm->led_background[LM_MEDIUM][0].red = 0x3333;
103
lm->led_background[LM_MEDIUM][0].green = 0x3333;
104
lm->led_background[LM_MEDIUM][0].blue = 0;
105
lm->led_background[LM_MEDIUM][1].red = 0xFFFF;
106
lm->led_background[LM_MEDIUM][1].green = 0xFFFF;
107
lm->led_background[LM_MEDIUM][1].blue = 0;
108
lm->led_background[LM_HIGH][0].red = 0x3333;
109
lm->led_background[LM_HIGH][0].green = 0;
110
lm->led_background[LM_HIGH][0].blue = 0;
111
lm->led_background[LM_HIGH][1].red = 0xFFFF;
112
lm->led_background[LM_HIGH][1].green = 0;
113
lm->led_background[LM_HIGH][1].blue = 0;
114
// set current max_da to 0 (no led active)
118
gtk_container_set_border_width (GTK_CONTAINER(lm), 0);
120
// add viewport to get shadow
121
viewport1 = gtk_viewport_new (NULL, NULL);
122
gtk_widget_show (viewport1);
123
gtk_container_add (GTK_CONTAINER (lm), viewport1);
124
// gtk_container_set_border_width (GTK_CONTAINER (viewport1), 8);
126
// add eventbox to be able to set a background colour
127
lm->ebox = gtk_event_box_new ();
128
gtk_container_add (GTK_CONTAINER (viewport1), lm->ebox);
130
/* g_signal_connect (G_OBJECT (lm->ebox), "motion_notify_event",
131
G_CALLBACK (on_motion_notify_event), (gpointer*) lm); */
136
gtk_widget_modify_bg (lm->ebox, GTK_STATE_NORMAL, &g_col);
138
// add a table for the da/led layout
139
table = gtk_table_new (LM_NUM_DAS, 1, TRUE);
140
gtk_container_add (GTK_CONTAINER (lm->ebox), table);
141
gtk_widget_show (table);
144
for ( i=0; i < LM_NUM_DAS; i++ ) {
145
lm->da[i] = gtk_drawing_area_new ();
147
// set colours according to threshholds defined elsewhere
148
if ( i < LM_LOW_THRESHOLD ) g_col = lm->led_background[LM_LOW][0];
149
else if ( i < LM_MEDIUM_THRESHOLD ) g_col = lm->led_background[LM_MEDIUM][0];
150
else g_col = lm->led_background[LM_HIGH][0];
151
gtk_widget_modify_bg (lm->da[i], GTK_STATE_NORMAL, &g_col );
153
gtk_widget_set_size_request (lm->da[i], 8, 1);
154
gtk_table_attach (GTK_TABLE(table), lm->da[i], 0, 1, (LM_NUM_DAS-i-1), (LM_NUM_DAS-i), (GTK_EXPAND|GTK_SHRINK|GTK_FILL), (GTK_EXPAND|GTK_SHRINK|GTK_FILL), 0, 0);
155
gtk_widget_show (lm->da[i]);
156
gtk_table_set_row_spacing(GTK_TABLE(table), i, 1);
159
gtk_widget_show (lm->ebox);
50
static GType lm_type = 0;
53
static const GTypeInfo lm_info = {
54
sizeof (LedMeterClass),
57
(GClassInitFunc) led_meter_class_init,
62
(GInstanceInitFunc) led_meter_init,
66
g_type_register_static (GTK_TYPE_VBOX, "LedMeter", &lm_info, 0);
73
led_meter_class_init (LedMeterClass * class)
75
GtkObjectClass *object_class;
77
object_class = (GtkObjectClass *) class;
79
led_meter_signals[LED_METER_SIGNAL] = g_signal_new ("led_meter",
84
g_cclosure_marshal_VOID__VOID,
85
G_TYPE_NONE, 0, NULL);
87
class->led_meter = NULL;
91
led_meter_init (LedMeter * lm)
94
GtkWidget *table, *viewport1;
97
// set colours [x][0] for inactive [x][1] for active
98
lm->led_background[LM_LOW][0].red = 0;
99
lm->led_background[LM_LOW][0].green = 0x3333;
100
lm->led_background[LM_LOW][0].blue = 0;
101
lm->led_background[LM_LOW][1].red = 0;
102
lm->led_background[LM_LOW][1].green = 0xFFFF;
103
lm->led_background[LM_LOW][1].blue = 0;
104
lm->led_background[LM_MEDIUM][0].red = 0x3333;
105
lm->led_background[LM_MEDIUM][0].green = 0x3333;
106
lm->led_background[LM_MEDIUM][0].blue = 0;
107
lm->led_background[LM_MEDIUM][1].red = 0xFFFF;
108
lm->led_background[LM_MEDIUM][1].green = 0xFFFF;
109
lm->led_background[LM_MEDIUM][1].blue = 0;
110
lm->led_background[LM_HIGH][0].red = 0x3333;
111
lm->led_background[LM_HIGH][0].green = 0;
112
lm->led_background[LM_HIGH][0].blue = 0;
113
lm->led_background[LM_HIGH][1].red = 0xFFFF;
114
lm->led_background[LM_HIGH][1].green = 0;
115
lm->led_background[LM_HIGH][1].blue = 0;
116
// set current max_da to 0 (no led active)
120
gtk_container_set_border_width (GTK_CONTAINER (lm), 0);
122
// add viewport to get shadow
123
viewport1 = gtk_viewport_new (NULL, NULL);
124
gtk_widget_show (viewport1);
125
gtk_container_add (GTK_CONTAINER (lm), viewport1);
126
// gtk_container_set_border_width (GTK_CONTAINER (viewport1), 8);
128
// add eventbox to be able to set a background colour
129
lm->ebox = gtk_event_box_new ();
130
gtk_container_add (GTK_CONTAINER (viewport1), lm->ebox);
135
gtk_widget_modify_bg (lm->ebox, GTK_STATE_NORMAL, &g_col);
137
// add a table for the da/led layout
138
table = gtk_table_new (LM_NUM_DAS, 1, TRUE);
139
gtk_container_add (GTK_CONTAINER (lm->ebox), table);
140
gtk_widget_show (table);
143
for (i = 0; i < LM_NUM_DAS; i++) {
144
lm->da[i] = gtk_drawing_area_new ();
146
// set colours according to threshholds defined elsewhere
147
if (i < LM_LOW_THRESHOLD)
148
g_col = lm->led_background[LM_LOW][0];
149
else if (i < LM_MEDIUM_THRESHOLD)
150
g_col = lm->led_background[LM_MEDIUM][0];
152
g_col = lm->led_background[LM_HIGH][0];
153
gtk_widget_modify_bg (lm->da[i], GTK_STATE_NORMAL, &g_col);
155
gtk_widget_set_size_request (lm->da[i], 8, 1);
156
gtk_table_attach (GTK_TABLE (table), lm->da[i], 0, 1,
157
(LM_NUM_DAS - i - 1), (LM_NUM_DAS - i),
158
(GTK_EXPAND | GTK_SHRINK | GTK_FILL),
159
(GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
160
gtk_widget_show (lm->da[i]);
161
gtk_table_set_row_spacing (GTK_TABLE (table), i, 1);
164
gtk_widget_show (lm->ebox);
168
* \brief creates a new led_meter widget
170
* @return new led_meter widget
165
return GTK_WIDGET (g_object_new (led_meter_get_type (), NULL));
169
void led_meter_set_percent (LedMeter *lm, int percent) {
173
if ( percent > 100 ) percent = 100;
174
if ( percent < 0 ) percent = 0;
176
lm->max_da = ( LM_NUM_DAS * percent / 100 ) - 1;
177
/* printf("lm-pointer: %p - percent: %i \n", lm, percent);
178
printf("set percent - max_da %i - old_max_da %i\n", lm->max_da, lm->old_max_da); */
179
if ( lm->max_da == lm->old_max_da ) return;
180
// printf("set percent ... new percent\n");
181
if ( lm->max_da > lm->old_max_da ) {
183
for ( n = lm->old_max_da; n <= lm->max_da; n++ ) {
185
if ( n < LM_LOW_THRESHOLD ) g_col = lm->led_background[LM_LOW][1];
186
else if ( n < LM_MEDIUM_THRESHOLD ) g_col = lm->led_background[LM_MEDIUM][1];
187
else g_col = lm->led_background[LM_HIGH][1];
189
gtk_widget_modify_bg (GTK_WIDGET(lm->da[n]), GTK_STATE_NORMAL, &g_col );
192
for ( n = lm->old_max_da; n >= lm->max_da; n-- ) {
193
if ( n < LM_LOW_THRESHOLD ) g_col = lm->led_background[LM_LOW][0];
194
else if ( n < LM_MEDIUM_THRESHOLD ) g_col = lm->led_background[LM_MEDIUM][0];
195
else g_col = lm->led_background[LM_HIGH][0];
197
gtk_widget_modify_bg (GTK_WIDGET(lm->da[n]), GTK_STATE_NORMAL, &g_col );
200
lm->old_max_da = lm->max_da;
205
void led_meter_set_tip (LedMeter *lm, char* tip) {
206
static GtkTooltips *tooltips;
208
tooltips = gtk_tooltips_new ();
210
gtk_tooltips_set_tip (tooltips, lm->ebox, tip, NULL);
212
// "Monitor current rate of dropped frames\nyellow = 10-60 %, red = 60+ %",
217
static gint on_motion_notify_event( GtkWidget *widget,
218
GdkEventMotion *event, gpointer *t )
222
// GdkModifierType state;
227
x = (int) (sin(a) * 100);
230
led_meter_set_percent (lm, x);
234
// printf("a: %f - x: %i\n", a, x);
175
return GTK_WIDGET (g_object_new (led_meter_get_type (), NULL));
179
* \brief sets the percentage to use for the amplitude in the led meter
181
* @param lm pointer to the led meter widget to work on
182
* @param percent percentag value (1-100)
185
led_meter_set_percent (LedMeter * lm, int percent)
195
lm->max_da = (LM_NUM_DAS * percent / 100) - 1;
197
if (lm->max_da == lm->old_max_da)
199
if (lm->max_da > lm->old_max_da) {
200
for (n = lm->old_max_da; n <= lm->max_da; n++) {
201
if (n < LM_LOW_THRESHOLD)
202
g_col = lm->led_background[LM_LOW][1];
203
else if (n < LM_MEDIUM_THRESHOLD)
204
g_col = lm->led_background[LM_MEDIUM][1];
206
g_col = lm->led_background[LM_HIGH][1];
207
gtk_widget_modify_bg (GTK_WIDGET (lm->da[n]), GTK_STATE_NORMAL,
211
for (n = lm->old_max_da; n >= lm->max_da; n--) {
212
if (n < LM_LOW_THRESHOLD)
213
g_col = lm->led_background[LM_LOW][0];
214
else if (n < LM_MEDIUM_THRESHOLD)
215
g_col = lm->led_background[LM_MEDIUM][0];
217
g_col = lm->led_background[LM_HIGH][0];
219
gtk_widget_modify_bg (GTK_WIDGET (lm->da[n]), GTK_STATE_NORMAL,
223
lm->old_max_da = lm->max_da;
228
* \brief sets tooltip on an led meter widget
230
* @param lm pointer to led meter widget to work on
231
* @param tip string to set as tooltip
234
led_meter_set_tip (LedMeter * lm, char *tip)
236
static GtkTooltips *tooltips;
238
tooltips = gtk_tooltips_new ();
240
gtk_tooltips_set_tip (tooltips, lm->ebox, tip, NULL);