libergtk/src/erGtkToggleButton.c File Reference

ereader gtk library - GtkToggleButton object adapted for ereader system More...

#include <string.h>
#include <gtk/gtk.h>
#include "ergtklog.h"
#include "erGtkToggleButton.h"

Go to the source code of this file.

Defines

#define DEFAULT_STYLE_INDEX   0
#define STYLE_PREFIX   "erGtkToggleButton"
#define STYLE_PREFIX_LEN   strlen(STYLE_PREFIX)

Functions

static void ergtk_toggle_button_notify (GObject *object, GParamSpec *pspec)
static gboolean ergtk_toggle_button_expose_event (GtkWidget *widget, GdkEventExpose *event)
static void ergtk_toggle_button_toggled (GtkToggleButton *toggleButton)
static void ergtk_toggle_button_class_init (erGtkToggleButtonClass *klass)
static void ergtk_toggle_button_init (erGtkToggleButton *input_entry)
static void fix_label_colour (erGtkToggleButton *toggleButton)
GtkWidget * ergtk_toggle_button_new ()
GtkWidget * ergtk_toggle_button_new_with_label (const gchar *label)
GType ergtk_toggle_button_get_type (void)

Variables

static GtkToggleButtonClass * g_parent_class = NULL
struct {
   guint   width
   guint   height
   const gchar *   style
g_style_tbl []


Detailed Description

ereader gtk library - GtkToggleButton object adapted for ereader system

Changes colour of the button's child object as a fucntion of the button state.

Copyright (C) 2007 iRex Technologies B.V. All rights reserved.

Definition in file erGtkToggleButton.c.


Define Documentation

#define DEFAULT_STYLE_INDEX   0

Definition at line 58 of file erGtkToggleButton.c.

#define STYLE_PREFIX   "erGtkToggleButton"

Definition at line 59 of file erGtkToggleButton.c.

#define STYLE_PREFIX_LEN   strlen(STYLE_PREFIX)

Definition at line 60 of file erGtkToggleButton.c.


Function Documentation

static void ergtk_toggle_button_class_init ( erGtkToggleButtonClass klass  )  [static]

Definition at line 122 of file erGtkToggleButton.c.

00123 {
00124     LOGPRINTF("entry");
00125 
00126     GObjectClass*         object_class       = (GObjectClass*        )klass;
00127     GtkWidgetClass*       widget_class       = (GtkWidgetClass*      )klass;
00128     GtkToggleButtonClass* toggleButton_class = (GtkToggleButtonClass*)klass;
00129 
00130     // remember parent class struct, needed for chaining up to parent class
00131     g_parent_class = g_type_class_peek_parent(klass);
00132 
00133     // overload some virtual methods
00134     object_class->notify        = ergtk_toggle_button_notify;
00135     // 
00136     widget_class->expose_event  = ergtk_toggle_button_expose_event;
00137     // 
00138     toggleButton_class->toggled = ergtk_toggle_button_toggled;
00139 }

Here is the call graph for this function:

static gboolean ergtk_toggle_button_expose_event ( GtkWidget *  widget,
GdkEventExpose *  event 
) [static]

Definition at line 195 of file erGtkToggleButton.c.

00196 {
00197     g_return_val_if_fail(ERGTK_IS_TOGGLE_BUTTON(widget), FALSE);
00198 
00199     // chain to parent class
00200     GtkWidgetClass* parent_widget_class = GTK_WIDGET_CLASS(g_parent_class);
00201     if (parent_widget_class->expose_event)
00202     {
00203         parent_widget_class->expose_event(widget, event);
00204     }
00205 
00206     fix_label_colour(ERGTK_TOGGLE_BUTTON(widget));
00207 
00208     return FALSE;  // continue event handling
00209 }

Here is the call graph for this function:

GType ergtk_toggle_button_get_type ( void   ) 

get type of erGtkToggleButton widget

Returns:
type

Definition at line 97 of file erGtkToggleButton.c.

00098 {
00099     static GType class_type = 0;
00100 
00101     if (class_type == 0)
00102     {
00103         static const GTypeInfo class_info =
00104         {
00105             sizeof(erGtkToggleButtonClass),
00106             NULL,               /* base_init */
00107             NULL,               /* base_finalize */
00108             (GClassInitFunc) ergtk_toggle_button_class_init,
00109             NULL,               /* class_finalize */
00110             NULL,               /* class_data */
00111             sizeof(erGtkToggleButton),
00112             0,                  /* n_preallocs */
00113             (GInstanceInitFunc) ergtk_toggle_button_init,
00114         };
00115         class_type = g_type_register_static(GTK_TYPE_TOGGLE_BUTTON, "erGtkToggleButton", &class_info, 0);
00116     }
00117 
00118     return class_type;
00119 }

Here is the call graph for this function:

static void ergtk_toggle_button_init ( erGtkToggleButton input_entry  )  [static]

Definition at line 142 of file erGtkToggleButton.c.

00143 {
00144     LOGPRINTF("entry");
00145     g_return_if_fail(ERGTK_IS_TOGGLE_BUTTON(item));
00146 
00147     GtkWidget* widget = (GtkWidget*)item;
00148     
00149     // set default size
00150     gtk_widget_set_size_request( widget,
00151                                  g_style_tbl[DEFAULT_STYLE_INDEX].width,
00152                                  g_style_tbl[DEFAULT_STYLE_INDEX].height );
00153 }

GtkWidget* ergtk_toggle_button_new (  ) 

create a new erGtkToggleButton widget

Parameters:
- 
Returns:
reference to created widget

Definition at line 77 of file erGtkToggleButton.c.

00078 {
00079     erGtkToggleButton* item = (erGtkToggleButton*) g_object_new(ERGTK_TOGGLE_BUTTON_TYPE, NULL);
00080 
00081     GtkWidget* widget = (GtkWidget*)item;
00082     GTK_WIDGET_UNSET_FLAGS(widget, GTK_CAN_FOCUS);
00083     
00084     return widget;
00085 }

GtkWidget* ergtk_toggle_button_new_with_label ( const gchar *  label  ) 

Definition at line 87 of file erGtkToggleButton.c.

00088 {
00089     erGtkToggleButton* item = (erGtkToggleButton*) g_object_new(ERGTK_TOGGLE_BUTTON_TYPE, "label", label, NULL);
00090     
00091     GtkWidget* widget = (GtkWidget*)item;
00092     GTK_WIDGET_UNSET_FLAGS(widget, GTK_CAN_FOCUS);
00093 
00094     return widget;
00095 }

static void ergtk_toggle_button_notify ( GObject *  object,
GParamSpec *  pspec 
) [static]

Definition at line 160 of file erGtkToggleButton.c.

00161 {
00162     g_return_if_fail(ERGTK_IS_TOGGLE_BUTTON(object));
00163 
00164     int          i;
00165     gint         width;
00166     const gchar* name = pspec->name;
00167     GtkWidget*   widget = (GtkWidget*)object;
00168     const gchar* widget_name;
00169 
00170     // chain to parent class
00171     GObjectClass* parent_object_class = G_OBJECT_CLASS(g_parent_class);
00172     if (parent_object_class->notify)
00173     {
00174         parent_object_class->notify(object, pspec);
00175     }
00176 
00177     if (strcmp(name, "width-request") == 0)
00178     {
00179         // set name and rc-style as a function of width
00180         g_object_get(object, name, &width, NULL);
00181         widget_name = gtk_widget_get_name(widget);
00182         if (   strcmp(widget_name, "erGtkToggleButton") == 0
00183             || strncmp(widget_name, STYLE_PREFIX, STYLE_PREFIX_LEN) == 0 )
00184         {
00185             i = 0;
00186             while (width > g_style_tbl[i].width  &&  g_style_tbl[i+1].width != 0)
00187             {
00188                 i++;
00189             }
00190             gtk_widget_set_name(widget, g_style_tbl[i].style);
00191         }
00192     }
00193 }

static void ergtk_toggle_button_toggled ( GtkToggleButton *  toggleButton  )  [static]

Definition at line 211 of file erGtkToggleButton.c.

00212 {
00213     g_return_if_fail(ERGTK_IS_TOGGLE_BUTTON(toggleButton));
00214 
00215     // chain to parent class
00216     if (g_parent_class->toggled)
00217     {
00218         g_parent_class->toggled(toggleButton);
00219     }
00220 
00221     fix_label_colour(ERGTK_TOGGLE_BUTTON(toggleButton));
00222 }

Here is the call graph for this function:

static void fix_label_colour ( erGtkToggleButton toggleButton  )  [static]

Definition at line 224 of file erGtkToggleButton.c.

00225 {
00226 
00227     // update text colour for button label
00228     // when the (invisible) cursor is on the button, the text label remains in state PRELIGHT
00229     // we now change the PRELIGHT colour the one that goes with the button state
00230     gboolean     active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(erToggleButton));
00231     GtkWidget*   label  = gtk_bin_get_child(GTK_BIN(erToggleButton));
00232     GtkStyle*    style  = gtk_widget_get_style(label);
00233     GtkStateType betterstate;
00234     if (active)
00235     {
00236         betterstate = GTK_STATE_ACTIVE;
00237     }
00238     else
00239     {
00240         betterstate = GTK_STATE_NORMAL;
00241     }
00242     
00243     // set colour for prelight style
00244     // Note: only call gtk_widget_modify_fg() when needed, to avoid an avalanche of expose events
00245     if (memcmp( &(style->fg[GTK_STATE_PRELIGHT]), &(style->fg[betterstate]), sizeof(style->fg[0])) != 0)
00246     {
00247         gtk_widget_modify_fg(label, GTK_STATE_PRELIGHT, &(style->fg[betterstate]));
00248     }
00249 }


Variable Documentation

GtkToggleButtonClass* g_parent_class = NULL [static]

Definition at line 40 of file erGtkToggleButton.c.

struct { ... } g_style_tbl[] [static]

guint height

Definition at line 47 of file erGtkToggleButton.c.

const gchar* style

Definition at line 48 of file erGtkToggleButton.c.

guint width

Definition at line 46 of file erGtkToggleButton.c.


Generated on Sun Dec 14 17:12:36 2008 by  doxygen 1.5.6