ifndef __GTK_DIAL_H__
define __GTK_DIAL_H__
include <gdk/gdk.h
include <gtk/gtkadjustment.h
include <gtk/gtkwidget.h
ifdef __cplusplus
extern "C{
endif /* __cplusplus */
define GTK_DIAL(obj) GTK_CHECK_CAST (obj, gtk_dial_get_type (), GtkDial)
define GTK_DIAL_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, gtk_dial_get_type (), GtkDialClass)
define GTK_IS_DIAL(obj) GTK_CHECK_TYPE (obj, gtk_dial_get_type ())
typedef struct _GtkDial GtkDial;
typedef struct _GtkDialClass GtkDialClass;
struct _GtkDial
{
GtkWidget widget;
/* update policy (GTK_UPDATE_[CONTINUOUS/DELAYED/DISCONTINUOUS]) */
guint policy : 2;
/* Button currently pressed or 0 if none */
guint8 button;
/* Dimensions of dial components */
gint radius;
gint pointer_;
/* ID of update timer, or 0 if none */
guint32 timer;
/* Current angle */
gfloat angle;
gfloat last_angle;
/* Old values from adjustment stored so we know when something changes */
gfloat old_value;
gfloat old_lower;
gfloat old_upper;
/* The adjustment object that stores the data for this dial */
GtkAdjustment *adjustment;
};
struct _GtkDialClass
{
GtkWidgetClass parent_class;
};
GtkWidget* gtk_dial_new (GtkAdjustment *adjustment);
GtkType gtk_dial_get_type (void);
GtkAdjustment* gtk_dial_get_adjustment (GtkDial *dial);
void gtk_dial_set_update_policy (GtkDial *dial,
GtkUpdateType policy);
void gtk_dial_set_adjustment (GtkDial *dial,
GtkAdjustment *adjustment);
ifdef __cplusplus
}
endif /* __cplusplus */
endif /* __GTK_DIAL_H__ */
include <math.h
include <stdio.h
include <gtk/gtkmain.h
include <gtk/gtksignal.h
include "gtkdial.hdefine SCROLL_DELAY_LENGTH 300
define DIAL__SIZE 100
/* Forward declarations */
static void gtk_dial_class_init (GtkDialClass *klass);
static void gtk_dial_init (GtkDial *dial);
static void gtk_dial_destroy (GtkObject *object);
static void gtk_dial_realize (GtkWidget *widget);
static void gtk_dial_size_request (GtkWidget *widget,
GtkRequisition *requisition);
static void gtk_dial_size_allocate (GtkWidget *widget,
GtkAllocation *allocation);
static gboolean gtk_dial_expose (GtkWidget *widget,
GdkEventExpose *event);
static gboolean gtk_dial_button_press (GtkWidget *widget,
GdkEventButton *event);
static gboolean gtk_dial_button_release (GtkWidget *widget,
GdkEventButton *event);
static gboolean gtk_dial_motion_notify (GtkWidget *widget,
GdkEventMotion *event);
static gboolean gtk_dial_timer (GtkDial *dial);
static void gtk_dial_update_mouse (GtkDial *dial, gint x, gint y);
static void gtk_dial_update (GtkDial *dial);
static void gtk_dial_adjustment_changed (GtkAdjustment *adjustment,
gpointer data);
static void gtk_dial_adjustment_value_changed (GtkAdjustment *adjustment,
gpointer data);
/* Local data */
static GtkWidgetClass *parent_class = NULL;
GType
gtk_dial_get_type ()
{
static GType dial_type = 0;
if (!dial_type)
{
static const GTypeInfo dial_info =
{
sizeof (GtkDialClass),
NULL,
NULL,
(GClassInitFunc) gtk_dial_class_init,
NULL,
NULL,
sizeof (GtkDial),
0,
(GInstanceInitFunc) gtk_dial_init,
};
dial_type = g_type_register_static (GTK_TYPE_WIDGET, "GtkDial, &dial_info, 0);
}
return dial_type;
}
static void
gtk_dial_class_init (GtkDialClass *class)
{
GtkObjectClass *object_class;
GtkWidgetClass *widget_class;
object_class = (GtkObjectClass*) class;
widget_class = (GtkWidgetClass*) class;
parent_class = gtk_type_class (gtk_widget_get_type ());
object_class-destroy = gtk_dial_destroy;
widget_class-realize = gtk_dial_realize;
widget_class-expose_event = gtk_dial_expose;
widget_class-size_request = gtk_dial_size_request;
widget_class-size_allocate = gtk_dial_size_allocate;
widget_class-button_press_event = gtk_dial_button_press;
widget_class-button_release_event = gtk_dial_button_release;
widget_class-motion_notify_event = gtk_dial_motion_notify;
}
static void
gtk_dial_init (GtkDial *dial)
{
dial-button = 0;
dial-policy = GTK_UPDATE_CONTINUOUS;
dial-timer = 0;
dial-radius = 0;
dial-pointer_ = 0;
dial-angle = 0.0;
dial-old_value = 0.0;
dial-old_lower = 0.0;
dial-old_upper = 0.0;
dial-adjustment = NULL;
}
GtkWidget*
gtk_dial_new (GtkAdjustment *adjustment)
{
GtkDial *dial;
dial = g_object_new (gtk_dial_get_type (), NULL);
if (!adjustment)
adjustment = (GtkAdjustment*) gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
gtk_dial_set_adjustment (dial, adjustment);
return GTK_WIDGET (dial);
}
static void
gtk_dial_destroy (GtkObject *object)
{
GtkDial *dial;
g_return_if_fail (object != NULL);
g_return_if_fail (GTK_IS_DIAL (object));
dial = GTK_DIAL (object);
if (dial-adjustment)
{
g_object_unref (GTK_OBJECT (dial-adjustment));
dial-adjustment = NULL;
}
if (GTK_OBJECT_CLASS (parent_class)-destroy)
(* GTK_OBJECT_CLASS (parent_class)-destroy) (object);
}
GtkAdjustment*
gtk_dial_get_adjustment (GtkDial *dial)
{
g_return_val_if_fail (dial != NULL, NULL);
g_return_val_if_fail (GTK_IS_DIAL (dial), NULL);
return dial-adjustment;
}
void
gtk_dial_set_update_policy (GtkDial *dial,
GtkUpdateType policy)
{
g_return_if_fail (dial != NULL);
g_return_if_fail (GTK_IS_DIAL (dial));
dial-policy = policy;
}
void
gtk_dial_set_adjustment (GtkDial *dial,
GtkAdjustment *adjustment)
{
g_return_if_fail (dial != NULL);
g_return_if_fail (GTK_IS_DIAL (dial));
if (dial-adjustment)
{
g_signal_
Bhopal news
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100