1 /* GtkEnhancedScale - A gtk(h)scale with multiple sliders
2 * Copyright (C) 2001 - Ronald Bultje
3 * Modified look-and-feel by Dan Dennedy
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
21 /* Some code used was taken from GtkScale and GtkRange, all part
22 * of the Gimp Toolkit (Gtk+), http://www.gtk.org/
29 #include <gtk/gtkmain.h>
30 #include <gtk/gtksignal.h>
31 #include <gdk/gdkkeysyms.h>
32 #include <gtk/gtkadjustment.h>
33 #include "gtkenhancedscale.h"
39 #define ENHANCED_SCALE_CLASS(w) GTK_ENHANCED_SCALE_CLASS ( G_OBJECT_GET_CLASS( G_OBJECT( w ) ) )
42 static void gtk_enhanced_scale_class_init (GtkEnhancedScaleClass
*klass
);
43 static void gtk_enhanced_scale_init (GtkEnhancedScale
*enhanced_scale
);
44 static void gtk_enhanced_scale_destroy (GtkObject
*object
);
45 static void gtk_enhanced_scale_realize (GtkWidget
*widget
);
46 static void gtk_enhanced_scale_unrealize (GtkWidget
*widget
);
47 static void gtk_enhanced_scale_size_request (GtkWidget
*widget
, GtkRequisition
*requisition
);
48 static void gtk_enhanced_scale_size_allocate (GtkWidget
*widget
, GtkAllocation
*allocation
);
49 static gint
gtk_enhanced_scale_expose (GtkWidget
*widget
, GdkEventExpose
*event
);
50 static void gtk_enhanced_scale_pos_trough (GtkEnhancedScale
*enhanced_scale
, gint
*x
, gint
*y
, gint
*w
, gint
*h
);
51 static void gtk_enhanced_scale_draw (GtkWidget
*widget
, GdkRectangle
*area
);
52 static void gtk_enhanced_scale_draw_slider (GtkEnhancedScale
*enhanced_scale
, gint i
);
53 static void gtk_enhanced_scale_draw_trough (GtkEnhancedScale
*enhanced_scale
);
54 static void gtk_enhanced_scale_slider_update (GtkEnhancedScale
*enhanced_scale
, gint i
);
55 static void gtk_enhanced_scale_trough_hdims (GtkEnhancedScale
*enhanced_scale
, gint
*left
, gint
*right
, gint i
);
56 static void gtk_enhanced_scale_get_slider_position(GtkEnhancedScale
*enhanced_scale
,gint
*x
, gint
*y
, gint i
);
57 static gint
gtk_enhanced_scale_get_stepper_spacing(GtkWidget
*widget
);
58 static gint
gtk_enhanced_scale_get_trough_border(GtkWidget
*widget
);
59 /*static gint gtk_enhanced_scale_get_stepper_size(GtkWidget *widget);*/
60 static gint
gtk_enhanced_scale_get_slider_width(GtkWidget
*widget
);
61 static gint
gtk_enhanced_scale_button_press(GtkWidget
*widget
, GdkEventButton
*event
);
62 static gint
gtk_enhanced_scale_button_release(GtkWidget
*widget
, GdkEventButton
*event
);
63 static gint
gtk_enhanced_scale_motion_notify(GtkWidget
*widget
, GdkEventMotion
*event
);
64 static void gtk_enhanced_scale_motion_x(GtkEnhancedScale
*enhanced_scale
, gint x
, gint i
);
65 static gint
gtk_enhanced_scale_key_press(GtkWidget
*widget
, GdkEventKey
*event
);
66 static gint
gtk_enhanced_scale_enter_notify(GtkWidget
*widget
, GdkEventCrossing
*event
);
67 static gint
gtk_enhanced_scale_leave_notify(GtkWidget
*widget
, GdkEventCrossing
*event
);
68 static gint
gtk_enhanced_scale_focus_in(GtkWidget
*widget
, GdkEventFocus
*event
);
69 static gint
gtk_enhanced_scale_focus_out(GtkWidget
*widget
, GdkEventFocus
*event
);
70 static void gtk_enhanced_scale_style_set(GtkWidget
*widget
, GtkStyle
*style
);
71 static void gtk_enhanced_scale_adjustment_value_changed(GtkAdjustment
*adjustment
, gpointer data
);
73 static GtkWidgetClass
*parent_class
= NULL
;
75 /* ================================================================= */
77 guint
gtk_enhanced_scale_get_type ()
79 static guint enhanced_scale_type
= 0;
81 if (!enhanced_scale_type
)
83 GtkTypeInfo enhanced_scale_info
=
86 sizeof (GtkEnhancedScale
),
87 sizeof (GtkEnhancedScaleClass
),
88 (GtkClassInitFunc
) gtk_enhanced_scale_class_init
,
89 (GtkObjectInitFunc
) gtk_enhanced_scale_init
,
93 enhanced_scale_type
= gtk_type_unique (gtk_widget_get_type (),
94 &enhanced_scale_info
);
96 return enhanced_scale_type
;
99 static void gtk_enhanced_scale_class_init (GtkEnhancedScaleClass
*class)
101 GtkObjectClass
*object_class
;
102 GtkWidgetClass
*widget_class
;
104 object_class
= (GtkObjectClass
*) class;
105 widget_class
= (GtkWidgetClass
*) class;
106 parent_class
= gtk_type_class (gtk_widget_get_type ());
108 object_class
->destroy
= gtk_enhanced_scale_destroy
;
110 widget_class
->realize
= gtk_enhanced_scale_realize
;
111 widget_class
->unrealize
= gtk_enhanced_scale_unrealize
;
112 widget_class
->expose_event
= gtk_enhanced_scale_expose
;
113 widget_class
->size_request
= gtk_enhanced_scale_size_request
;
114 widget_class
->size_allocate
= gtk_enhanced_scale_size_allocate
;
116 /* Events and their corresponding reaction-functions */
117 widget_class
->button_press_event
= gtk_enhanced_scale_button_press
;
118 widget_class
->button_release_event
= gtk_enhanced_scale_button_release
;
119 widget_class
->motion_notify_event
= gtk_enhanced_scale_motion_notify
;
120 widget_class
->key_press_event
= gtk_enhanced_scale_key_press
;
121 widget_class
->enter_notify_event
= gtk_enhanced_scale_enter_notify
;
122 widget_class
->leave_notify_event
= gtk_enhanced_scale_leave_notify
;
123 widget_class
->focus_in_event
= gtk_enhanced_scale_focus_in
;
124 widget_class
->focus_out_event
= gtk_enhanced_scale_focus_out
;
125 widget_class
->style_set
= gtk_enhanced_scale_style_set
;
127 class->slider_width
= 32;
128 class->trough_width
= 10;
129 class->stepper_size
= 11;
130 class->stepper_slider_spacing
= 1;
133 class->arrow_width
= 20;
134 class->arrow_height
= 10;
137 static void gtk_enhanced_scale_init (GtkEnhancedScale
*enhanced_scale
)
139 enhanced_scale
->in_child
= 0;
140 enhanced_scale
->click_child
= 0;
141 enhanced_scale
->active_slider
= 0; /* default */
142 enhanced_scale
->clicked_slider
= -1; /* none */
143 enhanced_scale
->x_click_point
= 0;
144 enhanced_scale
->breaks
= NULL
;
146 GTK_WIDGET_SET_FLAGS (GTK_WIDGET(enhanced_scale
), GTK_CAN_FOCUS
);
149 GtkWidget
* gtk_enhanced_scale_new (GtkObject
*adjustment
[],
150 gint num_adjustments
)
152 GtkEnhancedScale
*enhanced_scale
;
155 for(i
=0;i
<num_adjustments
;i
++)
157 if (adjustment
[i
] == NULL
) return NULL
;
160 enhanced_scale
= gtk_type_new (gtk_enhanced_scale_get_type ());
161 enhanced_scale
->adjustment
= adjustment
;
162 enhanced_scale
->num_adjustments
= num_adjustments
;
164 enhanced_scale
->handler_id
= malloc(num_adjustments
);
166 for (i
=0;i
<num_adjustments
;i
++)
168 enhanced_scale
->handler_id
[i
] = gtk_signal_connect (adjustment
[i
], "value_changed",
169 (GtkSignalFunc
) gtk_enhanced_scale_adjustment_value_changed
,
170 (gpointer
) enhanced_scale
);
173 return GTK_WIDGET (enhanced_scale
);
176 static void gtk_enhanced_scale_destroy (GtkObject
*object
)
178 GtkEnhancedScale
*enhanced_scale
;
181 g_return_if_fail (object
!= NULL
);
182 g_return_if_fail (GTK_IS_ENHANCED_SCALE (object
));
184 enhanced_scale
= GTK_ENHANCED_SCALE (object
);
186 printf("Received destroy signal, let's disappear!\n");
188 for(i
=0;i
<enhanced_scale
->num_adjustments
;i
++)
189 gtk_signal_disconnect(enhanced_scale
->adjustment
[i
], enhanced_scale
->handler_id
[i
]);
191 if ( enhanced_scale
->breaks
!= NULL
)
192 g_array_free( enhanced_scale
->breaks
, TRUE
);
194 if (GTK_OBJECT_CLASS (parent_class
)->destroy
)
195 (* GTK_OBJECT_CLASS (parent_class
)->destroy
) (object
);
197 printf("Finished destroy signal\n");
201 static void gtk_enhanced_scale_realize (GtkWidget
*widget
)
203 GdkWindowAttr attributes
;
204 GtkEnhancedScale
*enhanced_scale
;
205 gint attributes_mask
;
206 gint x
=0, y
=0, w
=0, h
=0;
210 g_return_if_fail (widget
!= NULL
);
211 g_return_if_fail (GTK_IS_ENHANCED_SCALE (widget
));
213 slider_width
= gtk_enhanced_scale_get_slider_width(widget
);
215 GTK_WIDGET_SET_FLAGS (widget
, GTK_REALIZED
);
216 enhanced_scale
= GTK_ENHANCED_SCALE (widget
);
218 attributes
.x
= widget
->allocation
.x
;
219 attributes
.y
= widget
->allocation
.y
;
220 attributes
.width
= widget
->allocation
.width
;
221 attributes
.height
= widget
->allocation
.height
;
222 attributes
.wclass
= GDK_INPUT_OUTPUT
;
223 attributes
.window_type
= GDK_WINDOW_CHILD
;
224 attributes
.event_mask
= gtk_widget_get_events (widget
) |
225 GDK_EXPOSURE_MASK
| GDK_BUTTON_PRESS_MASK
|
226 GDK_BUTTON_RELEASE_MASK
| GDK_POINTER_MOTION_MASK
|
227 GDK_POINTER_MOTION_HINT_MASK
;
228 attributes
.visual
= gtk_widget_get_visual (widget
);
229 attributes
.colormap
= gtk_widget_get_colormap (widget
);
230 attributes_mask
= GDK_WA_X
| GDK_WA_Y
| GDK_WA_VISUAL
| GDK_WA_COLORMAP
;
231 widget
->window
= gdk_window_new (widget
->parent
->window
, &attributes
, attributes_mask
);
233 gtk_enhanced_scale_pos_trough (enhanced_scale
, &x
, &y
, &w
, &h
);
236 attributes
.width
= w
;
237 attributes
.height
= h
;
238 attributes
.wclass
= GDK_INPUT_OUTPUT
;
239 attributes
.window_type
= GDK_WINDOW_CHILD
;
240 attributes
.event_mask
= gtk_widget_get_events (widget
) |
242 GDK_BUTTON_PRESS_MASK
|
243 GDK_BUTTON_RELEASE_MASK
|
244 GDK_ENTER_NOTIFY_MASK
|
245 GDK_LEAVE_NOTIFY_MASK
);
246 attributes
.visual
= gtk_widget_get_visual (widget
);
247 attributes
.colormap
= gtk_widget_get_colormap (widget
);
248 attributes_mask
= GDK_WA_X
| GDK_WA_Y
| GDK_WA_VISUAL
| GDK_WA_COLORMAP
;
250 printf("Scale trough properties - x: %d, y: %d, w: %d, h: %d\n",x
,y
,w
,h
);
252 enhanced_scale
->trough
= gdk_window_new (widget
->window
, &attributes
, attributes_mask
);
254 enhanced_scale
->slider
= malloc(enhanced_scale
->num_adjustments
);
255 attributes
.width
= ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
;
256 attributes
.height
= ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_height
;
257 attributes
.event_mask
|= (GDK_BUTTON_MOTION_MASK
|
258 GDK_POINTER_MOTION_HINT_MASK
);
259 enhanced_scale
->slider
[0] = gdk_window_new (enhanced_scale
->trough
,
260 &attributes
, attributes_mask
);
261 attributes
.y
+= ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_height
+ ENHANCED_SCALE_CLASS (enhanced_scale
)->trough_width
;
262 attributes
.width
= ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
/2;
263 for(i
=1;i
<enhanced_scale
->num_adjustments
;i
++)
264 enhanced_scale
->slider
[i
] = gdk_window_new (enhanced_scale
->trough
,
265 &attributes
, attributes_mask
);
267 widget
->style
= gtk_style_attach (widget
->style
, widget
->window
);
270 for(i
=0;i
<enhanced_scale
->num_adjustments
;i
++)
271 gdk_window_set_user_data (enhanced_scale
->slider
[i
], widget
);
272 gdk_window_set_user_data (enhanced_scale
->trough
, widget
);
273 gdk_window_set_user_data (widget
->window
, widget
);
275 for(i
=0;i
<enhanced_scale
->num_adjustments
;i
++)
276 gtk_style_set_background (widget
->style
, enhanced_scale
->slider
[i
], GTK_STATE_NORMAL
);
277 gtk_style_set_background (widget
->style
, enhanced_scale
->trough
, GTK_STATE_NORMAL
);
278 gtk_style_set_background (widget
->style
, widget
->window
, GTK_STATE_NORMAL
);
280 for (i
=0;i
<enhanced_scale
->num_adjustments
;i
++)
282 gtk_enhanced_scale_slider_update (GTK_ENHANCED_SCALE (widget
), i
);
283 gdk_window_show (enhanced_scale
->slider
[i
]);
285 gdk_window_show (enhanced_scale
->trough
);
288 static void gtk_enhanced_scale_unrealize (GtkWidget
*widget
)
290 GtkEnhancedScale
*enhanced_scale
;
293 g_return_if_fail (widget
!= NULL
);
294 g_return_if_fail (GTK_IS_ENHANCED_SCALE (widget
));
296 enhanced_scale
= GTK_ENHANCED_SCALE (widget
);
298 for (i
=0;i
<enhanced_scale
->num_adjustments
;i
++)
300 if (enhanced_scale
->slider
[i
])
302 gdk_window_set_user_data (enhanced_scale
->slider
[i
], NULL
);
303 gdk_window_destroy (enhanced_scale
->slider
[i
]);
304 enhanced_scale
->slider
[i
] = NULL
;
307 if (enhanced_scale
->trough
)
309 gdk_window_set_user_data (enhanced_scale
->trough
, NULL
);
310 gdk_window_destroy (enhanced_scale
->trough
);
311 enhanced_scale
->trough
= NULL
;
314 gdk_window_set_user_data (widget
->window
, NULL
);
316 printf("Received unrealize signal, let's disappear!\n");
318 if (GTK_WIDGET_CLASS (parent_class
)->unrealize
)
319 (* GTK_WIDGET_CLASS (parent_class
)->unrealize
) (widget
);
322 static void gtk_enhanced_scale_size_request (GtkWidget
*widget
,
323 GtkRequisition
*requisition
)
325 GtkEnhancedScale
*enhanced_scale
;
326 gint trough_border
, slider_width
;
328 enhanced_scale
= GTK_ENHANCED_SCALE (widget
);
331 printf("Received size_request signal\n");
334 trough_border
= gtk_enhanced_scale_get_trough_border(GTK_WIDGET(enhanced_scale
));
335 slider_width
= gtk_enhanced_scale_get_slider_width(GTK_WIDGET(enhanced_scale
));
337 requisition
->width
= (ENHANCED_SCALE_CLASS(enhanced_scale
)->arrow_width
+ trough_border
) * 4;
338 requisition
->height
= (slider_width
+ trough_border
* 2);
342 static void gtk_enhanced_scale_size_allocate (GtkWidget
*widget
,
343 GtkAllocation
*allocation
)
345 GtkEnhancedScale
*enhanced_scale
;
347 g_return_if_fail (widget
!= NULL
);
348 g_return_if_fail (GTK_IS_ENHANCED_SCALE (widget
));
349 g_return_if_fail (allocation
!= NULL
);
351 widget
->allocation
= *allocation
;
352 enhanced_scale
= GTK_ENHANCED_SCALE (widget
);
355 printf("Received size allocate signal: %d\n", allocation
->width
);
358 if (GTK_WIDGET_REALIZED (widget
))
360 gint i
, x
, y
, width
, height
;
362 gdk_window_move_resize (widget
->window
,
363 allocation
->x
, allocation
->y
,
364 allocation
->width
, allocation
->height
);
368 width
= allocation
->width
;
369 height
= allocation
->height
;
370 gtk_enhanced_scale_pos_trough( enhanced_scale
, &x
, &y
, &width
, &height
);
371 gdk_window_move_resize (enhanced_scale
->trough
, x
, y
, width
, height
);
373 for ( i
= 0; i
<enhanced_scale
->num_adjustments
; i
++ )
374 gtk_enhanced_scale_slider_update( enhanced_scale
, i
);
380 static gint
gtk_enhanced_scale_expose (GtkWidget
*widget
, GdkEventExpose
*event
)
382 GtkEnhancedScale
*enhanced_scale
;
385 g_return_val_if_fail (widget
!= NULL
, FALSE
);
386 g_return_val_if_fail (GTK_IS_ENHANCED_SCALE (widget
), FALSE
);
387 g_return_val_if_fail (event
!= NULL
, FALSE
);
389 if (event
->count
> 0)
392 enhanced_scale
= GTK_ENHANCED_SCALE (widget
);
394 gdk_window_clear_area (widget
->window
, 0, 0,
395 widget
->allocation
.width
, widget
->allocation
.height
);
397 /* This would be the place to draw it */
400 area
.width
= widget
->allocation
.width
;
401 area
.height
= widget
->allocation
.height
;
402 gtk_enhanced_scale_draw (widget
, &area
);
407 /* =========================================================================
409 * Some were directly taken from GtkScale, GtkHScale and GtkRange
412 static void gtk_enhanced_scale_draw (GtkWidget
*widget
, GdkRectangle
*area
)
414 GtkEnhancedScale
*enhanced_scale
;
415 GdkRectangle tmp_area
;
416 gint x
=0, y
=0, w
=0, h
=0;
418 g_return_if_fail (widget
!= NULL
);
419 g_return_if_fail (GTK_IS_ENHANCED_SCALE (widget
));
421 printf("Trying to draw enhanced_scale\n");
423 if (GTK_WIDGET_VISIBLE (widget
) && GTK_WIDGET_MAPPED (widget
))
427 printf("Drawing enhanced_scale\n");
429 enhanced_scale
= GTK_ENHANCED_SCALE (widget
);
431 gtk_enhanced_scale_pos_trough (GTK_ENHANCED_SCALE (widget
), &x
, &y
, &w
, &h
);
439 printf("Drawing enhanced_scale with size = %d\n", w
);
441 //if (gdk_rectangle_intersect (area, &tmp_area, area))
443 for(i
=0;i
<enhanced_scale
->num_adjustments
;i
++) {
444 gtk_enhanced_scale_slider_update (enhanced_scale
, i
);
445 gtk_enhanced_scale_draw_slider (enhanced_scale
, i
);
447 gtk_enhanced_scale_draw_trough (enhanced_scale
);
452 static void gtk_enhanced_scale_draw_trough (GtkEnhancedScale
*enhanced_scale
)
454 g_return_if_fail (enhanced_scale
!= NULL
);
455 g_return_if_fail (GTK_IS_ENHANCED_SCALE(enhanced_scale
));
457 if (enhanced_scale
->trough
)
463 printf("Drawing trough: %d\n", GTK_WIDGET(enhanced_scale
)->allocation
.width
-2);
466 if ( enhanced_scale
->num_adjustments
> 1 )
469 b
= gtk_enhanced_scale_get_trough_border(GTK_WIDGET(enhanced_scale
));
470 gtk_enhanced_scale_trough_hdims (enhanced_scale
, &left
, &right
, 0);
472 gdk_draw_rectangle( enhanced_scale
->trough
, GTK_WIDGET (enhanced_scale
)->style
->mid_gc
[GTK_STATE_NORMAL
],
473 TRUE
, ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
/2 + 1,
474 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_height
+ b
+ 1,
476 ENHANCED_SCALE_CLASS (enhanced_scale
)->trough_width
- 2
480 gtk_enhanced_scale_get_slider_position( enhanced_scale
, &x
, &y
, 1);
481 gtk_enhanced_scale_get_slider_position( enhanced_scale
, &x2
, &y
, 2);
482 if (x2
- x
- ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
/2 > 0)
484 gdk_draw_rectangle( enhanced_scale
->trough
,
485 GTK_WIDGET (enhanced_scale
)->style
->mid_gc
[GTK_STATE_SELECTED
],
487 x
+ ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
/2 + 1,
488 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_height
+ b
+ 1,
489 x2
- x
- ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
/2,
490 ENHANCED_SCALE_CLASS (enhanced_scale
)->trough_width
- 2
497 b
= gtk_enhanced_scale_get_trough_border(GTK_WIDGET(enhanced_scale
));
498 gtk_enhanced_scale_trough_hdims (enhanced_scale
, &left
, &right
, 0);
499 gdk_draw_rectangle( enhanced_scale
->trough
, GTK_WIDGET (enhanced_scale
)->style
->mid_gc
[GTK_STATE_NORMAL
],
500 TRUE
, ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
/2 + 1,
501 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_height
+ b
+ 1,
503 ENHANCED_SCALE_CLASS (enhanced_scale
)->trough_width
- 2
508 if ( enhanced_scale
->breaks
!= NULL
)
509 if ( enhanced_scale
->breaks
->len
> 1 )
510 for ( x2
= 0; x2
< (enhanced_scale
->breaks
->len
- 1); x2
++ )
514 gtk_enhanced_scale_trough_hdims (enhanced_scale
, &left
, &right
, 0);
515 x
= left
+ ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
/2;
516 x
+= ((right
- left
) * ( g_array_index( enhanced_scale
->breaks
, gint
, x2
) -
517 GTK_ADJUSTMENT(enhanced_scale
->adjustment
[0])->lower
) /
518 (GTK_ADJUSTMENT(enhanced_scale
->adjustment
[0])->upper
-
519 GTK_ADJUSTMENT(enhanced_scale
->adjustment
[0])->lower
-
520 GTK_ADJUSTMENT(enhanced_scale
->adjustment
[0])->page_size
));
521 gdk_draw_line (enhanced_scale
->trough
, GTK_WIDGET (enhanced_scale
)->style
->light_gc
[GTK_STATE_NORMAL
],
523 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_height
+ b
,
525 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_height
+ b
+ ENHANCED_SCALE_CLASS (enhanced_scale
)->trough_width
-1
531 gtk_enhanced_scale_get_slider_position( enhanced_scale
, &x
, &y
, 0);
535 static void gtk_enhanced_scale_draw_slider (GtkEnhancedScale
*enhanced_scale
, gint i
)
537 GtkStateType state_type
;
540 g_return_if_fail (enhanced_scale
!= NULL
);
541 g_return_if_fail (GTK_IS_ENHANCED_SCALE (enhanced_scale
));
542 g_return_if_fail (i
>=0);
543 g_return_if_fail (i
<enhanced_scale
->num_adjustments
);
545 if (enhanced_scale
->slider
[i
])
548 printf("Drawing slider %d\n", i
);
550 if ((enhanced_scale
->in_child
== ENHANCED_SCALE_CLASS (enhanced_scale
)->slider
) ||
551 (enhanced_scale
->click_child
== ENHANCED_SCALE_CLASS (enhanced_scale
)->slider
))
552 state_type
= GTK_STATE_SELECTED
;
554 state_type
= GTK_STATE_SELECTED
;
559 gdk_draw_line (enhanced_scale
->slider
[i
], GTK_WIDGET (enhanced_scale
)->style
->dark_gc
[GTK_STATE_NORMAL
],
560 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
,
562 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
/2 + 1,
563 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_height
- 1
565 gdk_draw_line (enhanced_scale
->slider
[i
], GTK_WIDGET (enhanced_scale
)->style
->dark_gc
[GTK_STATE_NORMAL
],
566 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
+1,
568 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
/2 + 2,
569 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_height
571 points
[0].x
= ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
;
575 points
[2].x
= ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
/2;
576 points
[2].y
= ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_height
;
579 gdk_draw_line (enhanced_scale
->slider
[i
], GTK_WIDGET (enhanced_scale
)->style
->dark_gc
[GTK_STATE_NORMAL
],
580 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
/2 - 1,
582 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
/2 - 1,
583 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_height
- 1
585 gdk_draw_line (enhanced_scale
->slider
[i
], GTK_WIDGET (enhanced_scale
)->style
->dark_gc
[GTK_STATE_NORMAL
],
586 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
/2 - 1,
587 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_height
- 1,
589 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_height
- 1
591 points
[0].x
= ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
/2 - 1;
594 points
[1].y
= ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_height
- 1;
595 points
[2].x
= ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
/2 - 1;
596 points
[2].y
= ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_height
- 1;
599 gdk_draw_line (enhanced_scale
->slider
[i
], GTK_WIDGET (enhanced_scale
)->style
->dark_gc
[GTK_STATE_NORMAL
],
602 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
/2 - 1,
603 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_height
- 1
605 gdk_draw_line (enhanced_scale
->slider
[i
], GTK_WIDGET (enhanced_scale
)->style
->dark_gc
[GTK_STATE_NORMAL
],
607 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_height
- 1,
608 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
/2,
609 ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_height
- 1
614 points
[1].y
= ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_height
- 1;
615 points
[2].x
= ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_width
/2 - 1;
616 points
[2].y
= ENHANCED_SCALE_CLASS (enhanced_scale
)->arrow_height
- 1;
621 gdk_draw_polygon( enhanced_scale
->slider
[i
],
622 GTK_WIDGET(enhanced_scale
)->style
->bg_gc
[state_type
], TRUE
, points
, 3 );
624 gtk_paint_polygon( GTK_WIDGET(enhanced_scale)->style, enhanced_scale->slider[i],
625 state_type, GTK_SHADOW_NONE, NULL, GTK_WIDGET(enhanced_scale), NULL,
627 gtk_paint_arrow( GTK_WIDGET(enhanced_scale)->style, enhanced_scale->slider[i],
629 (enhanced_scale->clicked_slider == i ? GTK_SHADOW_IN : GTK_SHADOW_OUT),
630 NULL, GTK_WIDGET(enhanced_scale), NULL,
631 (i==0)? GTK_ARROW_DOWN : GTK_ARROW_UP, TRUE, 0, 0,
632 ENHANCED_SCALE_CLASS (enhanced_scale)->arrow_width,
633 ENHANCED_SCALE_CLASS (enhanced_scale)->arrow_height
639 /* =========================================================================
640 * Functions to make life easier
641 * positioning functions etc, mostly directly taken from GtkScale, GtkHScale
645 static void gtk_enhanced_scale_pos_trough (GtkEnhancedScale
*enhanced_scale
,
646 gint
*x
, gint
*y
, gint
*w
, gint
*h
)
649 gint trough_border
, slider_width
;
651 g_return_if_fail (enhanced_scale
!= NULL
);
652 g_return_if_fail (GTK_IS_ENHANCED_SCALE (enhanced_scale
));
653 g_return_if_fail ((x
!= NULL
) && (y
!= NULL
) && (w
!= NULL
) && (h
!= NULL
));
655 widget
= GTK_WIDGET (enhanced_scale
);
656 trough_border
= gtk_enhanced_scale_get_trough_border(GTK_WIDGET(enhanced_scale
));
657 slider_width
= gtk_enhanced_scale_get_slider_width(GTK_WIDGET(enhanced_scale
));
659 *w
= widget
->allocation
.width
- 2;
660 *h
= (slider_width
+ trough_border
* 2);
662 *y
= (widget
->allocation
.height
- *h
) / 2;
665 static void gtk_enhanced_scale_slider_update (GtkEnhancedScale
*enhanced_scale
, gint i
)
667 /* i is the number of the adjustment */
673 g_return_if_fail (enhanced_scale
!= NULL
);
674 g_return_if_fail (GTK_IS_ENHANCED_SCALE (enhanced_scale
));
675 g_return_if_fail (i
>= 0);
676 g_return_if_fail (i
< enhanced_scale
->num_adjustments
);
678 trough_border
= gtk_enhanced_scale_get_trough_border(GTK_WIDGET(enhanced_scale
));
680 if (GTK_WIDGET_REALIZED (enhanced_scale
))
682 gtk_enhanced_scale_trough_hdims (enhanced_scale
, &left
, &right
, i
);
685 printf("Updating slider %d\n",i
);
687 if (GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->value
<
688 GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->lower
)
690 GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->value
=
691 GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->lower
;
692 gtk_signal_emit_by_name (GTK_OBJECT (GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])),
695 else if (GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->value
>
696 GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->upper
)
698 GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->value
=
699 GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->upper
;
700 gtk_signal_emit_by_name(GTK_OBJECT (GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])),
703 if (GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->lower
!=
704 (GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->upper
-
705 GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->page_size
))
707 x
+= ((right
- left
) * (GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->value
-
708 GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->lower
) /
709 (GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->upper
-
710 GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->lower
-
711 GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->page_size
));
714 if (GTK_ADJUSTMENT(enhanced_scale->adjustment[i])->lower !=
715 (GTK_ADJUSTMENT(enhanced_scale->adjustment[i])->upper))
717 x += ((right - left) * (GTK_ADJUSTMENT(enhanced_scale->adjustment[i])->value -
718 GTK_ADJUSTMENT(enhanced_scale->adjustment[i])->lower) /
719 (GTK_ADJUSTMENT(enhanced_scale->adjustment[i])->upper -
720 GTK_ADJUSTMENT(enhanced_scale->adjustment[i])->lower));
728 gdk_window_move (enhanced_scale
->slider
[i
], x
,
729 trough_border
+ (i
>0 ?
ENHANCED_SCALE_CLASS(enhanced_scale
)->arrow_height
+ENHANCED_SCALE_CLASS(enhanced_scale
)->trough_width
: 0) );
733 static void gtk_enhanced_scale_trough_hdims (GtkEnhancedScale
*enhanced_scale
, gint
*left
, gint
*right
, gint i
)
739 gint stepper_spacing
;
742 g_return_if_fail (enhanced_scale
!= NULL
);
744 gdk_window_get_size (enhanced_scale
->trough
, &trough_width
, NULL
);
745 gdk_window_get_size (enhanced_scale
->slider
[0], &slider_length
, NULL
);
747 trough_border
= gtk_enhanced_scale_get_trough_border(GTK_WIDGET(enhanced_scale
));
748 stepper_spacing
= gtk_enhanced_scale_get_stepper_spacing(GTK_WIDGET(enhanced_scale
));
750 tleft
= trough_border
;
751 tright
= trough_width
- slider_length
+ trough_border
;
754 tleft
+= slider_length
/2;
755 tright
+= slider_length
/2;
764 static void gtk_enhanced_scale_get_slider_position(GtkEnhancedScale
*enhanced_scale
, gint
*x
, gint
*y
, gint i
)
766 g_return_if_fail (enhanced_scale
!= NULL
);
767 g_return_if_fail (GTK_IS_ENHANCED_SCALE (enhanced_scale
));
768 g_return_if_fail (i
>= 0);
769 g_return_if_fail (i
< enhanced_scale
->num_adjustments
);
771 gdk_window_get_position(enhanced_scale
->slider
[i
], x
, y
);
774 static gint
gtk_enhanced_scale_get_stepper_spacing(GtkWidget
*widget
)
776 /*return gtk_style_get_prop_experimental (widget->style,
777 "GtkEnhancedScale::stepper_spacing",
778 ENHANCED_SCALE_CLASS (widget)->stepper_slider_spacing);*/
779 return ENHANCED_SCALE_CLASS (widget
)->stepper_slider_spacing
;
782 static gint
gtk_enhanced_scale_get_trough_border(GtkWidget
*widget
)
784 /*return gtk_style_get_prop_experimental (widget->style,
785 "GtkEnhancedScale::trough_border",
786 widget->style->klass->xthickness);*/
787 return widget
->style
->ythickness
;
790 /*static gint gtk_enhanced_scale_get_stepper_size(GtkWidget *widget)
792 return gtk_style_get_prop_experimental (widget->style,
793 "GtkEnhancedScale::stepper_size",
794 ENHANCED_SCALE_CLASS (widget)->stepper_size);
797 static gint
gtk_enhanced_scale_get_slider_width(GtkWidget
*widget
)
799 /*return gtk_style_get_prop_experimental (widget->style,
800 "GtkEnhancedScale::slider_width",
801 ENHANCED_SCALE_CLASS (widget)->slider_width);*/
802 return ENHANCED_SCALE_CLASS (widget
)->slider_width
;
805 /* =========================================================================
806 * Signal handlers/Callbacks for motion, buttons, keys, focus etc.
807 * Partly helped by code from GtkScale/GtkRange
810 static gint
gtk_enhanced_scale_button_press(GtkWidget
*widget
, GdkEventButton
*event
)
812 GtkEnhancedScale
*enhanced_scale
;
815 g_return_val_if_fail (widget
!= NULL
, FALSE
);
816 g_return_val_if_fail (GTK_IS_ENHANCED_SCALE (widget
), FALSE
);
817 g_return_val_if_fail (event
!= NULL
, FALSE
);
819 if (!GTK_WIDGET_HAS_FOCUS (widget
))
820 gtk_widget_grab_focus (widget
);
822 printf("Received press event, button %d\n", event
->button
);
824 enhanced_scale
= GTK_ENHANCED_SCALE (widget
);
825 enhanced_scale
->x_click_point
= event
->x
;
827 if (event
->window
== enhanced_scale
->trough
)
829 gint x
,y
,n
,left
,right
;
830 gtk_enhanced_scale_get_slider_position(enhanced_scale
, &x
,&y
,enhanced_scale
->active_slider
);
832 printf("Source: trough. Active slider: %d (pos: %d,%d). Click position: %d,%d.\n",
833 enhanced_scale
->active_slider
, x
,y
,(int)(event
->x
), (int)(event
->y
));
835 gtk_enhanced_scale_trough_hdims (enhanced_scale
, &left
, &right
,
836 enhanced_scale
->active_slider
);
837 n
= (GTK_ADJUSTMENT(enhanced_scale
->adjustment
[enhanced_scale
->active_slider
])->page_increment
)
839 /(GTK_ADJUSTMENT(enhanced_scale
->adjustment
[enhanced_scale
->active_slider
])->upper
-
840 GTK_ADJUSTMENT(enhanced_scale
->adjustment
[enhanced_scale
->active_slider
])->lower
);
842 if (event
->x
> x
+ gtk_enhanced_scale_get_slider_width(widget
)) /* Click at right of slider */
844 gtk_enhanced_scale_motion_x(enhanced_scale
, n
, enhanced_scale
->active_slider
);
846 else if (event
->x
< x
) /* click at left of active slider */
848 gtk_enhanced_scale_motion_x(enhanced_scale
, -n
, enhanced_scale
->active_slider
);
851 else for (i
=0;i
<enhanced_scale
->num_adjustments
;i
++)
854 gtk_enhanced_scale_get_slider_position(enhanced_scale
, &x
,&y
,i
);
855 if (event
->window
== enhanced_scale
->slider
[i
])
857 enhanced_scale
->active_slider
= i
;
859 printf("Source: slider %d (pos: %d,%d)\n",i
,x
,y
);
861 enhanced_scale
->clicked_slider
= i
;
867 static gint
gtk_enhanced_scale_button_release(GtkWidget
*widget
, GdkEventButton
*event
)
869 GtkEnhancedScale
*enhanced_scale
;
871 g_return_val_if_fail (widget
!= NULL
, FALSE
);
872 g_return_val_if_fail (GTK_IS_ENHANCED_SCALE (widget
), FALSE
);
873 g_return_val_if_fail (event
!= NULL
, FALSE
);
875 enhanced_scale
= GTK_ENHANCED_SCALE (widget
);
877 enhanced_scale
->x_click_point
= 0;
879 printf("Button released");
880 if (enhanced_scale
->clicked_slider
!= -1) printf(" - slider %d unselected", enhanced_scale
->clicked_slider
);
883 enhanced_scale
->clicked_slider
= -1;
884 gtk_widget_queue_draw (widget
);
888 static gint
gtk_enhanced_scale_motion_notify(GtkWidget
*widget
, GdkEventMotion
*event
)
890 GtkEnhancedScale
*enhanced_scale
;
892 GdkModifierType mods
;
894 g_return_val_if_fail (widget
!= NULL
, FALSE
);
895 g_return_val_if_fail (GTK_IS_ENHANCED_SCALE (widget
), FALSE
);
896 g_return_val_if_fail (event
!= NULL
, FALSE
);
898 enhanced_scale
= GTK_ENHANCED_SCALE (widget
);
900 if (enhanced_scale
->clicked_slider
!= -1)
902 gdk_window_get_pointer (enhanced_scale
->slider
[enhanced_scale
->clicked_slider
], &x
, &y
, &mods
);
904 printf("Motion notify\n");
906 if (mods
& GDK_BUTTON1_MASK
)
907 gtk_enhanced_scale_motion_x(enhanced_scale
, x
- enhanced_scale
->x_click_point
,
908 enhanced_scale
->clicked_slider
);
914 static void gtk_enhanced_scale_motion_x(GtkEnhancedScale
*enhanced_scale
, gint delta_x
, gint i
)
918 gint slider_x
, slider_y
;
921 g_return_if_fail (enhanced_scale
!= NULL
);
922 g_return_if_fail (GTK_IS_ENHANCED_SCALE (enhanced_scale
));
923 g_return_if_fail (i
>=0);
924 g_return_if_fail (i
<enhanced_scale
->num_adjustments
);
926 gdk_window_get_position (enhanced_scale
->slider
[i
], &slider_x
, &slider_y
);
927 gtk_enhanced_scale_trough_hdims (enhanced_scale
, &left
, &right
,i
);
929 printf("motion_x called: delta_x = %d, slider_x = %d, l/r=%d/%d\n", delta_x
, slider_x
, left
, right
);
934 new_pos
= slider_x
+ delta_x
;
938 else if (new_pos
> right
)
941 old_value
= GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->value
;
942 GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->value
= (gint
)
943 ((GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->upper
-
944 GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->lower
-
945 GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->page_size
) *
946 (new_pos
- left
) / (right
- left
) +
947 GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->lower
);
948 if ( (int) old_value
!= (int) GTK_ADJUSTMENT(enhanced_scale
->adjustment
[i
])->value
)
950 gtk_signal_emit_by_name (GTK_OBJECT (enhanced_scale
->adjustment
[i
]), "value_changed");
954 static gint
gtk_enhanced_scale_key_press(GtkWidget
*widget
, GdkEventKey
*event
)
956 GtkEnhancedScale
*enhanced_scale
;
960 g_return_val_if_fail (widget
!= NULL
, FALSE
);
961 g_return_val_if_fail (GTK_IS_ENHANCED_SCALE (widget
), FALSE
);
962 g_return_val_if_fail (event
!= NULL
, FALSE
);
966 enhanced_scale
= GTK_ENHANCED_SCALE (widget
);
968 if(enhanced_scale
->active_slider
>= 0 && enhanced_scale
->active_slider
< enhanced_scale
->num_adjustments
)
970 gint n1
,n2
,left
,right
;
972 gtk_enhanced_scale_trough_hdims (enhanced_scale
, &left
, &right
,
973 enhanced_scale
->active_slider
);
974 n1
= (GTK_ADJUSTMENT(enhanced_scale
->adjustment
[enhanced_scale
->active_slider
])->
975 page_increment
)*(right
-left
)/
976 (GTK_ADJUSTMENT(enhanced_scale
->adjustment
[enhanced_scale
->active_slider
])->upper
-
977 GTK_ADJUSTMENT(enhanced_scale
->adjustment
[enhanced_scale
->active_slider
])->lower
);
978 n2
= (GTK_ADJUSTMENT(enhanced_scale
->adjustment
[enhanced_scale
->active_slider
])->
979 step_increment
)*(right
-left
)/
980 (GTK_ADJUSTMENT(enhanced_scale
->adjustment
[enhanced_scale
->active_slider
])->upper
-
981 GTK_ADJUSTMENT(enhanced_scale
->adjustment
[enhanced_scale
->active_slider
])->lower
);
983 switch (event
->keyval
)
986 if (event
->state
& GDK_CONTROL_MASK
)
987 gtk_enhanced_scale_motion_x(enhanced_scale
,
988 -n1
, enhanced_scale
->active_slider
);
990 gtk_enhanced_scale_motion_x(enhanced_scale
,
991 -n2
, enhanced_scale
->active_slider
);
997 if (event
->state
& GDK_CONTROL_MASK
)
998 gtk_enhanced_scale_motion_x(enhanced_scale
,
999 n1
, enhanced_scale
->active_slider
);
1001 gtk_enhanced_scale_motion_x(enhanced_scale
,
1002 n2
, enhanced_scale
->active_slider
);
1004 key
= "right_arrow";
1008 /* Clumsy, but the check in gtk_enhanced_scale_motion_x() will take care */
1009 gtk_enhanced_scale_motion_x(enhanced_scale
,
1010 0 - GTK_ADJUSTMENT(enhanced_scale
->adjustment
[enhanced_scale
->active_slider
])->upper
,
1011 enhanced_scale
->active_slider
);
1017 /* Clumsy, but the check in gtk_enhanced_scale_motion_x() will take care */
1018 gtk_enhanced_scale_motion_x(enhanced_scale
,
1019 GTK_ADJUSTMENT(enhanced_scale
->adjustment
[enhanced_scale
->active_slider
])->upper
,
1020 enhanced_scale
->active_slider
);
1028 printf("Key pressed: %s\n", key
);
1033 static gint
gtk_enhanced_scale_enter_notify(GtkWidget
*widget
, GdkEventCrossing
*event
)
1035 GtkEnhancedScale
*enhanced_scale
;
1038 g_return_val_if_fail (widget
!= NULL
, FALSE
);
1039 g_return_val_if_fail (GTK_IS_ENHANCED_SCALE (widget
), FALSE
);
1040 g_return_val_if_fail (event
!= NULL
, FALSE
);
1042 enhanced_scale
= GTK_ENHANCED_SCALE (widget
);
1044 if (event
->window
== enhanced_scale
->trough
)
1046 enhanced_scale
->in_child
= ENHANCED_SCALE_CLASS (enhanced_scale
)->trough
;
1048 else for (i
=0;i
<enhanced_scale
->num_adjustments
;i
++)
1049 if (event
->window
== enhanced_scale
->slider
[i
])
1051 enhanced_scale
->in_child
= ENHANCED_SCALE_CLASS (enhanced_scale
)->slider
;
1052 if ((enhanced_scale
->click_child
== 0) ||
1053 (enhanced_scale
->click_child
== ENHANCED_SCALE_CLASS (enhanced_scale
)->trough
))
1054 gtk_enhanced_scale_draw_slider (enhanced_scale
,i
);
1060 static gint
gtk_enhanced_scale_leave_notify(GtkWidget
*widget
, GdkEventCrossing
*event
)
1062 GtkEnhancedScale
*enhanced_scale
;
1065 g_return_val_if_fail (widget
!= NULL
, FALSE
);
1066 g_return_val_if_fail (GTK_IS_ENHANCED_SCALE (widget
), FALSE
);
1067 g_return_val_if_fail (event
!= NULL
, FALSE
);
1069 enhanced_scale
= GTK_ENHANCED_SCALE (widget
);
1071 enhanced_scale
->in_child
= 0;
1073 if (event
->window
== enhanced_scale
->trough
)
1076 else for (i
=0;i
<enhanced_scale
->num_adjustments
;i
++)
1077 if (event
->window
== enhanced_scale
->slider
[i
])
1079 if ((enhanced_scale
->click_child
== 0) ||
1080 (enhanced_scale
->click_child
== ENHANCED_SCALE_CLASS (enhanced_scale
)->trough
))
1081 gtk_enhanced_scale_draw_slider (enhanced_scale
, i
);
1087 static gint
gtk_enhanced_scale_focus_in(GtkWidget
*widget
, GdkEventFocus
*event
)
1089 g_return_val_if_fail (widget
!= NULL
, FALSE
);
1090 g_return_val_if_fail (GTK_IS_ENHANCED_SCALE (widget
), FALSE
);
1091 g_return_val_if_fail (event
!= NULL
, FALSE
);
1093 GTK_WIDGET_SET_FLAGS (widget
, GTK_HAS_FOCUS
);
1094 gtk_widget_queue_draw (widget
);
1096 printf("focus_in\n");
1098 gtk_widget_queue_draw (widget
);
1102 static gint
gtk_enhanced_scale_focus_out(GtkWidget
*widget
, GdkEventFocus
*event
)
1104 g_return_val_if_fail (widget
!= NULL
, FALSE
);
1105 g_return_val_if_fail (GTK_IS_ENHANCED_SCALE (widget
), FALSE
);
1106 g_return_val_if_fail (event
!= NULL
, FALSE
);
1108 GTK_WIDGET_UNSET_FLAGS (widget
, GTK_HAS_FOCUS
);
1109 gtk_widget_queue_draw (widget
);
1111 printf("focus_out\n");
1113 gtk_widget_queue_draw (widget
);
1117 static void gtk_enhanced_scale_style_set(GtkWidget
*widget
, GtkStyle
*style
)
1119 GtkEnhancedScale
*enhanced_scale
;
1122 g_return_if_fail (widget
!= NULL
);
1123 g_return_if_fail (GTK_IS_ENHANCED_SCALE (widget
));
1125 enhanced_scale
= GTK_ENHANCED_SCALE (widget
);
1127 if (GTK_WIDGET_REALIZED (widget
))
1129 if (enhanced_scale
->trough
)
1130 gtk_style_set_background (widget
->style
, enhanced_scale
->trough
, GTK_STATE_NORMAL
);
1132 for(i
=0;i
<enhanced_scale
->num_adjustments
;i
++)
1133 if (enhanced_scale
->slider
[i
])
1134 gtk_style_set_background (widget
->style
, enhanced_scale
->slider
[i
],
1139 static void gtk_enhanced_scale_adjustment_value_changed(GtkAdjustment
*adjustment
, gpointer data
)
1141 GtkEnhancedScale
*enhanced_scale
;
1144 g_return_if_fail (adjustment
!= NULL
);
1145 g_return_if_fail (data
!= NULL
);
1147 enhanced_scale
= GTK_ENHANCED_SCALE(data
);
1149 for (i
=0;i
<enhanced_scale
->num_adjustments
;i
++)
1151 //if(adjustment == GTK_ADJUSTMENT(enhanced_scale->adjustment[i]))
1152 gtk_enhanced_scale_slider_update (enhanced_scale
,i
);
1154 gtk_enhanced_scale_draw (GTK_WIDGET( enhanced_scale
), NULL
);
1157 void gtk_enhanced_scale_set_breaks( GtkWidget
*widget
, GArray
*breaks
)
1159 GtkEnhancedScale
*enhanced_scale
;
1162 g_return_if_fail( widget
!= NULL
);
1163 g_return_if_fail( breaks
!= NULL
);
1164 enhanced_scale
= GTK_ENHANCED_SCALE( widget
);
1165 enhanced_scale
->breaks
= breaks
;
1167 gdk_window_clear_area (widget
->window
, 0, 0,
1168 widget
->allocation
.width
, widget
->allocation
.height
);
1170 /* This would be the place to draw it */
1173 area
.width
= widget
->allocation
.width
;
1174 area
.height
= widget
->allocation
.height
;
1175 gtk_enhanced_scale_draw (widget
, &area
);