[byzanz] Make button state handling saner
- From: Benjamin Otte <otte src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [byzanz] Make button state handling saner
- Date: Sun, 30 Aug 2009 17:01:12 +0000 (UTC)
commit e2b74fbe9fea8635f68f344b2686293ca54b423a
Author: Benjamin Otte <otte gnome org>
Date: Sun Aug 30 18:39:49 2009 +0200
Make button state handling saner
Make state queryable and keep an array with info about each state
instead of hardcoding it.
src/byzanzapplet.c | 99 ++++++++++++++++++++++++++++++++++-----------------
1 files changed, 66 insertions(+), 33 deletions(-)
---
diff --git a/src/byzanzapplet.c b/src/byzanzapplet.c
index 71a344d..5b3cc4a 100644
--- a/src/byzanzapplet.c
+++ b/src/byzanzapplet.c
@@ -88,33 +88,59 @@ byzanz_applet_show_error (AppletPrivate *priv, const char *error, const char *de
/*** APPLET ***/
+typedef enum {
+ BYZANZ_APPLET_IDLE,
+ BYZANZ_APPLET_SELECT_FILE,
+ BYZANZ_APPLET_SELECT_AREA,
+ BYZANZ_APPLET_RECORDING,
+ BYZANZ_APPLET_ENCODING,
+ /* add more here */
+ BYZANZ_APPLET_N_STATES
+} ByzanzAppletState;
+
+static struct {
+ const char * tooltip; /* tooltip to present on the applet */
+ const char * stock_icon; /* icon to use for this state */
+ gboolean active; /* wether the togglebutton should be active */
+} state_info[BYZANZ_APPLET_N_STATES] = {
+ [BYZANZ_APPLET_IDLE] = { N_("Start a new recording"), GTK_STOCK_MEDIA_RECORD, FALSE },
+ [BYZANZ_APPLET_SELECT_FILE] = { N_("Record your desktop"), GTK_STOCK_MEDIA_RECORD, TRUE },
+ [BYZANZ_APPLET_SELECT_AREA] = { N_("Select area to record"), GTK_STOCK_CANCEL, TRUE },
+ [BYZANZ_APPLET_RECORDING] = { N_("End current recording"), GTK_STOCK_MEDIA_STOP, TRUE },
+ [BYZANZ_APPLET_ENCODING] = { N_("Abort encoding of recording"), GTK_STOCK_STOP, TRUE }
+};
+
+static ByzanzAppletState
+byzanz_applet_compute_state (AppletPrivate *priv)
+{
+ if (priv->rec == NULL) {
+ if (priv->dialog)
+ return BYZANZ_APPLET_SELECT_FILE;
+ else if (priv->file)
+ return BYZANZ_APPLET_SELECT_AREA;
+ else
+ return BYZANZ_APPLET_IDLE;
+ } else {
+ if (byzanz_session_is_recording (priv->rec))
+ return BYZANZ_APPLET_RECORDING;
+ else
+ return BYZANZ_APPLET_ENCODING;
+ }
+}
+
static gboolean
byzanz_applet_update (gpointer data)
{
AppletPrivate *priv = data;
+ ByzanzAppletState state;
- if (priv->rec == NULL) {
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->button), FALSE);
- gtk_image_set_from_icon_name (GTK_IMAGE (priv->image),
- GTK_STOCK_MEDIA_RECORD, GTK_ICON_SIZE_LARGE_TOOLBAR);
- gtk_tooltips_set_tip (priv->tooltips, priv->button,
- _("Start a new recording"), NULL);
- } else {
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->button), TRUE);
- if (byzanz_session_is_recording (priv->rec)) {
- gtk_image_set_from_icon_name (GTK_IMAGE (priv->image),
- GTK_STOCK_MEDIA_STOP, GTK_ICON_SIZE_LARGE_TOOLBAR);
- gtk_tooltips_set_tip (priv->tooltips, priv->button,
- _("End current recording"), NULL);
- } else if (byzanz_session_is_encoding (priv->rec)) {
- gtk_image_set_from_icon_name (GTK_IMAGE (priv->image),
- GTK_STOCK_CANCEL, GTK_ICON_SIZE_LARGE_TOOLBAR);
- gtk_tooltips_set_tip (priv->tooltips, priv->button,
- _("Abort encoding process"), NULL);
- } else {
- g_assert_not_reached ();
- }
- }
+ state = byzanz_applet_compute_state (priv);
+
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->button), state_info[state].active);
+ gtk_image_set_from_icon_name (GTK_IMAGE (priv->image),
+ state_info[state].stock_icon, GTK_ICON_SIZE_LARGE_TOOLBAR);
+ gtk_tooltips_set_tip (priv->tooltips, priv->button,
+ _(state_info[state].tooltip), NULL);
return TRUE;
}
@@ -227,9 +253,6 @@ out:
static void
byzanz_applet_start_recording (AppletPrivate *priv)
{
- if (priv->rec)
- goto out;
-
if (priv->dialog == NULL) {
char *uri;
guint i;
@@ -284,22 +307,32 @@ byzanz_applet_start_recording (AppletPrivate *priv)
}
gtk_window_present (GTK_WINDOW (priv->dialog));
-out:
byzanz_applet_update (priv);
}
static void
button_clicked_cb (GtkToggleButton *button, AppletPrivate *priv)
{
- gboolean active = gtk_toggle_button_get_active (button);
-
- if (priv->rec && !active) {
- if (byzanz_session_is_recording (priv->rec))
+ ByzanzAppletState state = byzanz_applet_compute_state (priv);
+
+ switch (state) {
+ case BYZANZ_APPLET_IDLE:
+ case BYZANZ_APPLET_SELECT_FILE:
+ byzanz_applet_start_recording (priv);
+ break;
+ case BYZANZ_APPLET_SELECT_AREA:
+ /* FIXME: allow cancelling here */
+ break;
+ case BYZANZ_APPLET_RECORDING:
byzanz_session_stop (priv->rec);
- else
+ break;
+ case BYZANZ_APPLET_ENCODING:
byzanz_session_abort (priv->rec);
- } else if (priv->rec == NULL && active) {
- byzanz_applet_start_recording (priv);
+ break;
+ case BYZANZ_APPLET_N_STATES:
+ default:
+ g_assert_not_reached ();
+ break;
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]