Hello,
I have a patch ready that introduces signals in all the custom widgets
used for setting properties for objects or groups. But I have isolated
one widget that needed major rework --- DiaUnitSpinner --- mostly
removing all the customised code and using Gtk+ 2.0 facilities
instead.
Attaching a patch.
Sameer.
--
Research Scholar, KReSIT, IIT Bombay
http://www.it.iitb.ac.in/~sameerds/
Index: lib/widgets.c
===================================================================
--- lib/widgets.c (revision 3697)
+++ lib/widgets.c (working copy)
@@ -1512,9 +1512,6 @@
{ 0 }
};
-static GtkObjectClass *parent_class;
-static GtkObjectClass *entry_class;
-
static void dia_unit_spinner_class_init(DiaUnitSpinnerClass *class);
static void dia_unit_spinner_init(DiaUnitSpinner *self);
@@ -1539,61 +1536,27 @@
return us_type;
}
-/** Updates the spinner display to show digits and units */
-static void
-dia_unit_spinner_value_changed(GtkAdjustment *adjustment,
- DiaUnitSpinner *spinner)
-{
- char buf[256];
- GtkSpinButton *sbutton = GTK_SPIN_BUTTON(spinner);
- g_snprintf(buf, sizeof(buf), "%0.*f %s", sbutton->digits, adjustment->value,
- units[spinner->unit_num].unit);
- gtk_entry_set_text(GTK_ENTRY(spinner), buf);
-}
-
-static void dia_unit_spinner_set_value_direct(DiaUnitSpinner *self, gfloat val);
-static gint dia_unit_spinner_focus_out(GtkWidget *widget, GdkEventFocus *ev);
-static gint dia_unit_spinner_button_press(GtkWidget *widget,GdkEventButton*ev);
-static gint dia_unit_spinner_key_press(GtkWidget *widget, GdkEventKey *event);
-static void dia_unit_spinner_activate(GtkEntry *editable);
-
static void
dia_unit_spinner_class_init(DiaUnitSpinnerClass *class)
{
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
- GtkEntryClass *editable_class;
-
- object_class = (GtkObjectClass *)class;
- widget_class = (GtkWidgetClass *)class;
- editable_class = (GtkEntryClass *)class;
-
- widget_class->focus_out_event = dia_unit_spinner_focus_out;
- widget_class->button_press_event = dia_unit_spinner_button_press;
- widget_class->key_press_event = dia_unit_spinner_key_press;
- editable_class->activate = dia_unit_spinner_activate;
-
- parent_class = gtk_type_class(GTK_TYPE_SPIN_BUTTON);
- entry_class = gtk_type_class(GTK_TYPE_ENTRY);
}
static void
dia_unit_spinner_init(DiaUnitSpinner *self)
{
- /* change over to our own print function that appends the unit name on the
- * end */
- if (self->parent.adjustment) {
- gtk_signal_disconnect_by_data(GTK_OBJECT(self->parent.adjustment),
- (gpointer) self);
- g_signal_connect(GTK_OBJECT(self->parent.adjustment), "value_changed",
- G_CALLBACK(dia_unit_spinner_value_changed),
- (gpointer) self);
- }
-
self->unit_num = DIA_UNIT_CENTIMETER;
}
+/*
+ Callback functions for the "input" and "output" signals emitted by
+ GtkSpinButton. All the normal work is done by the spin button, we
+ simply modify how the text in the GtkEntry is treated.
+*/
+static gboolean
+dia_unit_spinner_input(DiaUnitSpinner *self, gdouble *value);
+static gboolean dia_unit_spinner_output(DiaUnitSpinner *self);
+
GtkWidget *
dia_unit_spinner_new(GtkAdjustment *adjustment, DiaUnit adj_unit)
{
@@ -1601,14 +1564,17 @@
self->unit_num = adj_unit;
- gtk_spin_button_configure(GTK_SPIN_BUTTON(self), adjustment, 0.0, units[adj_unit].digits);
+ gtk_spin_button_configure(GTK_SPIN_BUTTON(self),
+ adjustment, 0.0, units[adj_unit].digits);
+ g_signal_connect(GTK_SPIN_BUTTON(self), "output",
+ G_CALLBACK(dia_unit_spinner_output),
+ NULL);
+ g_signal_connect(GTK_SPIN_BUTTON(self), "input",
+ G_CALLBACK(dia_unit_spinner_input),
+ NULL);
+
if (adjustment) {
- gtk_signal_disconnect_by_data(GTK_OBJECT(adjustment),
- (gpointer) self);
- g_signal_connect(GTK_OBJECT(adjustment), "value_changed",
- G_CALLBACK(dia_unit_spinner_value_changed),
- (gpointer) self);
dia_unit_spinner_set_value(self, adjustment->value);
} else {
/* Don't know any better, hopefully it'll be set later. */
@@ -1618,42 +1584,9 @@
return GTK_WIDGET(self);
}
-/** Set the value (in cm).
- * */
-void
-dia_unit_spinner_set_value(DiaUnitSpinner *self, gfloat val)
+static gboolean
+dia_unit_spinner_input(DiaUnitSpinner *self, gdouble *value)
{
- dia_unit_spinner_set_value_direct(self, val /
- (units[self->unit_num].factor / units[DIA_UNIT_CENTIMETER].factor));
-}
-
-/** Set the value (in preferred units) */
-static void
-dia_unit_spinner_set_value_direct(DiaUnitSpinner *self, gfloat val)
-{
- GtkSpinButton *sbutton = GTK_SPIN_BUTTON(self);
-
- if (val < sbutton->adjustment->lower)
- val = sbutton->adjustment->lower;
- else if (val > sbutton->adjustment->upper)
- val = sbutton->adjustment->upper;
- sbutton->adjustment->value = val;
- dia_unit_spinner_value_changed(sbutton->adjustment, self);
-}
-
-/** Get the value (in cm) */
-gfloat
-dia_unit_spinner_get_value(DiaUnitSpinner *self)
-{
- GtkSpinButton *sbutton = GTK_SPIN_BUTTON(self);
-
- return sbutton->adjustment->value *
- (units[self->unit_num].factor / units[DIA_UNIT_CENTIMETER].factor);
-}
-
-static void
-dia_unit_spinner_update(DiaUnitSpinner *self)
-{
gfloat val, factor = 1.0;
gchar *extra = NULL;
@@ -1672,41 +1605,52 @@
}
/* convert to prefered units */
val *= factor;
- dia_unit_spinner_set_value_direct(self, val);
-}
-static gint
-dia_unit_spinner_focus_out(GtkWidget *widget, GdkEventFocus *event)
-{
- if (GTK_ENTRY (widget)->editable)
- dia_unit_spinner_update(DIA_UNIT_SPINNER(widget));
- return GTK_WIDGET_CLASS(entry_class)->focus_out_event(widget, event);
+ /* Store value in the location provided by the signal emitter. */
+ *value = val;
+
+ /* Return true, so that the default input function is not invoked. */
+ return TRUE;
}
-static gint
-dia_unit_spinner_button_press(GtkWidget *widget, GdkEventButton *event)
+static gboolean dia_unit_spinner_output(DiaUnitSpinner *self)
{
- dia_unit_spinner_update(DIA_UNIT_SPINNER(widget));
- return GTK_WIDGET_CLASS(parent_class)->button_press_event(widget, event);
+ char buf[256];
+
+ GtkSpinButton *sbutton = GTK_SPIN_BUTTON(self);
+ GtkAdjustment *adjustment = gtk_spin_button_get_adjustment(sbutton);
+
+ g_snprintf(buf, sizeof(buf), "%0.*f %s",
+ gtk_spin_button_get_digits(sbutton),
+ gtk_adjustment_get_value(adjustment),
+ units[self->unit_num].unit);
+ gtk_entry_set_text(GTK_ENTRY(self), buf);
+
+ /* Return true, so that the default output function is not invoked. */
+ return TRUE;
}
-static gint
-dia_unit_spinner_key_press(GtkWidget *widget, GdkEventKey *event)
+/** Set the value (in cm).
+ * */
+void
+dia_unit_spinner_set_value(DiaUnitSpinner *self, gdouble val)
{
- gint key = event->keyval;
+ GtkSpinButton *sbutton = GTK_SPIN_BUTTON(self);
- if (GTK_ENTRY (widget)->editable &&
- (key == GDK_Up || key == GDK_Down ||
- key == GDK_Page_Up || key == GDK_Page_Down))
- dia_unit_spinner_update (DIA_UNIT_SPINNER(widget));
- return GTK_WIDGET_CLASS(parent_class)->key_press_event(widget, event);
+ gtk_spin_button_set_value(sbutton,
+ val /
+ (units[self->unit_num].factor /
+ units[DIA_UNIT_CENTIMETER].factor));
}
-static void
-dia_unit_spinner_activate(GtkEntry *editable)
+/** Get the value (in cm) */
+gdouble
+dia_unit_spinner_get_value(DiaUnitSpinner *self)
{
- if (editable->editable)
- dia_unit_spinner_update(DIA_UNIT_SPINNER(editable));
+ GtkSpinButton *sbutton = GTK_SPIN_BUTTON(self);
+
+ return gtk_spin_button_get_value(sbutton) *
+ (units[self->unit_num].factor / units[DIA_UNIT_CENTIMETER].factor);
}
GList *
Index: lib/widgets.h
===================================================================
--- lib/widgets.h (revision 3697)
+++ lib/widgets.h (working copy)
@@ -194,8 +194,8 @@
GtkType dia_unit_spinner_get_type (void);
GtkWidget *dia_unit_spinner_new (GtkAdjustment *adjustment,
DiaUnit adj_unit);
-void dia_unit_spinner_set_value (DiaUnitSpinner *self, gfloat val);
-gfloat dia_unit_spinner_get_value (DiaUnitSpinner *self);
+void dia_unit_spinner_set_value (DiaUnitSpinner *self, gdouble val);
+gdouble dia_unit_spinner_get_value (DiaUnitSpinner *self);
GList * get_units_name_list(void);
/* DiaDynamicMenu */
_______________________________________________
Dia-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/dia-list
FAQ at http://live.gnome.org/Dia/Faq
Main page at http://live.gnome.org/Dia