changeset 240:405f8b880142

restored jisko support.
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Tue, 07 Oct 2008 16:44:02 +0900
parents e3a24c98772d
children 1a4d37f15e9c
files pidgin-twitter.c pidgin-twitter.h prefs.ui
diffstat 3 files changed, 227 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/pidgin-twitter.c	Tue Oct 07 14:51:22 2008 +0900
+++ b/pidgin-twitter.c	Tue Oct 07 16:44:02 2008 +0900
@@ -24,8 +24,8 @@
 /***********/
 /* globals */
 /***********/
-#define NUM_REGPS 12
-#define NUM_SERVICES 3          /* twitter, wassr, identica. */
+#define NUM_REGPS 13
+#define NUM_SERVICES 4          /* twitter, wassr, identica, jisko. */
 static GRegex *regp[NUM_REGPS];
 static gboolean suppress_oops = FALSE;
 static GHashTable *icon_hash[NUM_SERVICES];
@@ -909,6 +909,9 @@
         case identica_service:
             format = RECIPIENT_FORMAT_IDENTICA;
             break;
+        case jisko_service:
+            format = RECIPIENT_FORMAT_JISKO;
+            break;
         default:
             twitter_debug("unknown service\n");
             break;
@@ -932,6 +935,9 @@
         case identica_service:
             format = SENDER_FORMAT_IDENTICA;
             break;
+        case jisko_service:
+            format = SENDER_FORMAT_JISKO;
+            break;
         default:
             twitter_debug("unknown service\n");
             break;
@@ -1069,6 +1075,9 @@
         case identica_service:
             screen_name = purple_prefs_get_string(OPT_SCREEN_NAME_IDENTICA);
             break;
+        case jisko_service:
+            screen_name = purple_prefs_get_string(OPT_SCREEN_NAME_JISKO);
+            break;
         }
 
         if (screen_name) {
@@ -1135,6 +1144,7 @@
     switch(service) {
     case twitter_service:
     case identica_service:
+    case jisko_service:
         count = gtk_text_buffer_get_char_count(textbuffer) +
             (unsigned int)g_utf8_strlen(new_text, -1);
         markup = g_markup_printf_escaped("<span color=\"%s\">%u</span>",
@@ -1175,6 +1185,7 @@
     switch(service) {
     case twitter_service:
     case identica_service:
+    case jisko_service:
         count= gtk_text_buffer_get_char_count(textbuffer) -
             (gtk_text_iter_get_offset(end_pos) -
              gtk_text_iter_get_offset(start_pos));
@@ -1216,6 +1227,7 @@
         case twitter_service:
         case wassr_service:
         case identica_service:
+        case jisko_service:
             detach_from_conv(conv, NULL);
             break;
         default:
@@ -1333,6 +1345,7 @@
         case twitter_service:
         case wassr_service:
         case identica_service:
+        case jisko_service:
             attach_to_conv(conv, NULL);
             break;
         default:
@@ -1474,6 +1487,30 @@
     return is_identica_account(account, name);
 }
 
+static gboolean
+is_jisko_account(PurpleAccount *account, const char *name)
+{
+    const gchar *proto = purple_account_get_protocol_id(account);
+
+    if(g_strstr_len(name,  16, "bot@jisko.net") &&
+       g_strstr_len(proto, 11, "prpl-jabber")) {
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+static gboolean
+is_jisko_conv(PurpleConversation *conv)
+{
+    g_return_val_if_fail(conv != NULL, FALSE);
+
+    const char *name = purple_conversation_get_name(conv);
+    PurpleAccount *account = purple_conversation_get_account(conv);
+
+    return is_jisko_account(account, name);
+}
+
 static gint
 get_service_type_by_account(PurpleAccount *account, const char *sender)
 {
@@ -1488,6 +1525,8 @@
         service = wassr_service;
     else if(is_identica_account(account, sender))
         service = identica_service;
+    else if(is_jisko_account(account, sender))
+        service = jisko_service;
 
     return service;
 }
@@ -1505,6 +1544,8 @@
         service = wassr_service;
     else if(is_identica_conv(conv))
         service = identica_service;
+    else if(is_jisko_conv(conv))
+        service = jisko_service;
 
     return service;
 }
@@ -1531,6 +1572,7 @@
         break;
     case wassr_service:
     case identica_service:
+    case jisko_service:
         attach_to_conv(conv, NULL);
         break;
     default:
@@ -1567,6 +1609,9 @@
     case identica_service:
         hash = icon_hash[identica_service];
         break;
+    case jisko_service:
+        hash = icon_hash[jisko_service];
+        break;
     default:
         twitter_debug("unknown service\n");
         break;
@@ -1603,6 +1648,10 @@
         list = purple_prefs_get_string(OPT_FILTER_IDENTICA);
         screen_name = g_strdup_printf("@%s", purple_prefs_get_string(OPT_SCREEN_NAME_IDENTICA));
         break;
+    case jisko_service:
+        list = purple_prefs_get_string(OPT_FILTER_JISKO);
+        screen_name = g_strdup_printf("@%s", purple_prefs_get_string(OPT_SCREEN_NAME_JISKO));
+        break;
     }
     g_return_if_fail(list != NULL);
     if(strstr(list, DEFAULT_LIST))
@@ -1829,6 +1878,9 @@
     case identica_service:
         hash = icon_hash[identica_service];
         break;
+    case jisko_service:
+        hash = icon_hash[jisko_service];
+        break;
     default:
         twitter_debug("unknown service\n");
     }
@@ -1875,6 +1927,9 @@
     case identica_service:
         hash = icon_hash[identica_service];
         break;
+    case jisko_service:
+        hash = icon_hash[jisko_service];
+        break;
     default:
         twitter_debug("unknown service\n");
         break;
@@ -1933,6 +1988,11 @@
             icon_hash[identica_service], user_name);
         regp_id = IMAGE_IDENTICA;
     }
+    else if(service == jisko_service) {
+        data = (icon_data *)g_hash_table_lookup(
+            icon_hash[jisko_service], user_name);
+        regp_id = IMAGE_JISKO;
+    }
 
     if(!url_text) {
         if(data) {
@@ -2100,6 +2160,9 @@
     case identica_service:
         hash = icon_hash[identica_service];
         break;
+    case jisko_service:
+        hash = icon_hash[jisko_service];
+        break;
     default:
         twitter_debug("unknown service\n");
     }
@@ -2171,6 +2234,9 @@
         case identica_service:
             suffix = "identica";
             break;
+        case jisko_service:
+            suffix = "jisko";
+            break;
         default:
             twitter_debug("unknown service\n");
             break;
@@ -2235,6 +2301,10 @@
         suffix = "identica";
         hash = icon_hash[identica_service];
         break;
+    case jisko_service:
+        suffix = "jisko";
+        hash = icon_hash[jisko_service];
+        break;
     default:
         twitter_debug("unknown service\n");
         break;
@@ -2324,6 +2394,9 @@
     case identica_service:
         url = g_strdup_printf("http://identi.ca/%s", user_name);
         break;
+    case jisko_service:
+        url = g_strdup_printf("http://jisko.net/%s", user_name);
+        break;
     default:
         twitter_debug("unknown service\n");
         break;
@@ -2337,7 +2410,8 @@
         /* gotdata will be released in got_icon_cb */
         if(service == twitter_service ||
            service == wassr_service ||
-           service == identica_service) {
+           service == identica_service ||
+           service == jisko_service) {
             data->fetch_data = purple_util_fetch_url(url, TRUE, NULL, TRUE,
                                                      got_page_cb, gotdata);
         }
@@ -2369,6 +2443,9 @@
     case identica_service:
         hash = icon_hash[identica_service];
         break;
+    case jisko_service:
+        hash = icon_hash[jisko_service];
+        break;
     default:
         twitter_debug("unknown service\n");
         break;
@@ -2468,6 +2545,9 @@
     case identica_service:
         hash = icon_hash[identica_service];
         break;
+    case jisko_service:
+        hash = icon_hash[jisko_service];
+        break;
     default:
         twitter_debug("unknown service\n");
         break;
@@ -2611,10 +2691,11 @@
     regp[PSEUDO]    = g_regex_new(P_PSEUDO,  G_REGEX_RAW, 0, NULL);
     regp[USER]      = g_regex_new(P_USER, 0, 0, NULL);
     regp[CHANNEL_WASSR]  = g_regex_new(P_CHANNEL, 0, 0, NULL);
+    regp[TAG_IDENTICA]   = g_regex_new(P_TAG_IDENTICA, 0, 0, NULL);
     regp[IMAGE_TWITTER]  = g_regex_new(P_IMAGE_TWITTER, 0, 0, NULL);
     regp[IMAGE_WASSR]    = g_regex_new(P_IMAGE_WASSR, 0, 0, NULL);
     regp[IMAGE_IDENTICA] = g_regex_new(P_IMAGE_IDENTICA, 0, 0, NULL);
-    regp[TAG_IDENTICA]   = g_regex_new(P_TAG_IDENTICA, 0, 0, NULL);
+    regp[IMAGE_JISKO]    = g_regex_new(P_IMAGE_JISKO, 0, 0, NULL);
     regp[SIZE_128_WASSR] = g_regex_new(P_SIZE_128_WASSR, 0, 0, NULL);
     regp[EXCESS_LF] = g_regex_new(P_EXCESS_LF, 0, 0, NULL);
 
@@ -2913,6 +2994,13 @@
     g_signal_connect(e, "changed",
                      G_CALLBACK(text_changed_cb), &e);
 
+    e = GTK_WIDGET(gtk_builder_get_object (builder, "account_jisko"));
+    g_object_set_data(G_OBJECT(e), "pref", OPT_SCREEN_NAME_JISKO);
+    text = purple_prefs_get_string(OPT_SCREEN_NAME_JISKO);
+    gtk_entry_set_text(GTK_ENTRY(e), text);
+    g_signal_connect(e, "changed",
+                     G_CALLBACK(text_changed_cb), &e);
+
     e = GTK_WIDGET(gtk_builder_get_object (builder, "account_api"));
     g_object_set_data(G_OBJECT(e), "pref", OPT_API_BASE_POST);
     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(e),
@@ -3025,6 +3113,13 @@
     g_signal_connect(e, "changed",
                      G_CALLBACK(text_changed_cb), &e);
 
+    e = GTK_WIDGET(gtk_builder_get_object (builder, "filter_jisko"));
+    g_object_set_data(G_OBJECT(e), "pref", OPT_FILTER_JISKO);
+    text = purple_prefs_get_string(OPT_FILTER_JISKO);
+    gtk_entry_set_text(GTK_ENTRY(e), text);
+    g_signal_connect(e, "changed",
+                     G_CALLBACK(text_changed_cb), &e);
+
 
 
     /*************/
@@ -3238,7 +3333,7 @@
     PURPLE_PRIORITY_DEFAULT,    /**< priority	*/
     PLUGIN_ID,                  /**< id     */
     "Pidgin-Twitter",           /**< name	*/
-    "0.8.0b1",                  /**< version	*/
+    "0.8.0b2",                  /**< version	*/
     "provides useful features for twitter", /**  summary	*/
     "provides useful features for twitter", /**  desc	*/
     "Yoshiki Yazawa, mikanbako, \nKonosuke Watanabe, IWATA Ray, \nmojin, umq, \nthe pidging-twitter team",     /**< author	*/
@@ -3288,6 +3383,7 @@
     purple_prefs_add_string(OPT_PASSWORD_TWITTER, EMPTY);
     purple_prefs_add_string(OPT_SCREEN_NAME_WASSR, EMPTY);
     purple_prefs_add_string(OPT_SCREEN_NAME_IDENTICA, EMPTY);
+    purple_prefs_add_string(OPT_SCREEN_NAME_JISKO, EMPTY);
 
     purple_prefs_add_bool(OPT_SHOW_ICON, TRUE);
     purple_prefs_add_int(OPT_ICON_SIZE, DEFAULT_ICON_SIZE);
@@ -3301,6 +3397,7 @@
     purple_prefs_add_string(OPT_FILTER_TWITTER, DEFAULT_LIST);
     purple_prefs_add_string(OPT_FILTER_WASSR, DEFAULT_LIST);
     purple_prefs_add_string(OPT_FILTER_IDENTICA, DEFAULT_LIST);
+    purple_prefs_add_string(OPT_FILTER_JISKO, DEFAULT_LIST);
 }
 
 PURPLE_INIT_PLUGIN(pidgin_twitter, init_plugin, info)
--- a/pidgin-twitter.h	Tue Oct 07 14:51:22 2008 +0900
+++ b/pidgin-twitter.h	Tue Oct 07 16:44:02 2008 +0900
@@ -32,10 +32,11 @@
     PSEUDO,
     USER,
     CHANNEL_WASSR,
+    TAG_IDENTICA,
     IMAGE_TWITTER,
     IMAGE_WASSR,
     IMAGE_IDENTICA,
-    TAG_IDENTICA,
+    IMAGE_JISKO,
     SIZE_128_WASSR,
     EXCESS_LF
 };
@@ -45,7 +46,8 @@
     unknown_service = -1,
     twitter_service,
     wassr_service,
-    identica_service
+    identica_service,
+    jisko_service
 };
 
 /* container to hold icon data */
@@ -112,6 +114,7 @@
 #define OPT_SCREEN_NAME_TWITTER OPT_PIDGINTWITTER "/screen_name_twitter"
 #define OPT_SCREEN_NAME_WASSR   OPT_PIDGINTWITTER "/screen_name_wassr"
 #define OPT_SCREEN_NAME_IDENTICA OPT_PIDGINTWITTER "/screen_name_identica"
+#define OPT_SCREEN_NAME_JISKO   OPT_PIDGINTWITTER "/screen_name_jisko"
 #define OPT_PASSWORD_TWITTER    OPT_PIDGINTWITTER "/password_twitter"
 #define OPT_SHOW_ICON           OPT_PIDGINTWITTER "/show_icon"
 #define OPT_ICON_SIZE           OPT_PIDGINTWITTER "/icon_size"
@@ -125,6 +128,7 @@
 #define OPT_FILTER_TWITTER      OPT_PIDGINTWITTER "/filter_twitter"
 #define OPT_FILTER_WASSR        OPT_PIDGINTWITTER "/filter_wassr"
 #define OPT_FILTER_IDENTICA     OPT_PIDGINTWITTER "/filter_identica"
+#define OPT_FILTER_JISKO        OPT_PIDGINTWITTER "/filter_jisko"
 #define OPT_STRIP_EXCESS_LF     OPT_PIDGINTWITTER "/strip_excess_lf"
 
 #ifdef _WIN32
@@ -138,6 +142,8 @@
 #define SENDER_FORMAT_WASSR     "%s<a href='http://wassr.jp/user/%s'>%s</a>: "
 #define RECIPIENT_FORMAT_IDENTICA "%s@<a href='http://identi.ca/%s'>%s</a>"
 #define SENDER_FORMAT_IDENTICA  "%s<a href='http://identi.ca/%s'>%s</a>: "
+#define RECIPIENT_FORMAT_JISKO  "@<a href='http://jisko.net/%s'>%s</a>"
+#define SENDER_FORMAT_JISKO     "%s<a href='http://jisko.net/%s'>%s</a>: "
 #define CHANNEL_FORMAT_WASSR    "%s<a href='http://wassr.jp/channel/%s'>%s</a> "
 #define CHANNEL_FORMAT_IDENTICA "%s<a href='http://identi.ca/tag/%s'>%s</a> "
 #define TAG_FORMAT_IDENTICA     "#<a href='http://identi.ca/tag/%s'>%s</a>"
@@ -153,11 +159,12 @@
 #define P_PSEUDO            "^\\s*(?:[\"#$%&'()*+,\\-./:;<=>?\\[\\\\\\]_`{|}~]|[^\\s\\x21-\\x7E])*([dDfFgGlLmMnNtTwW]{1})(?:\\Z|\\s+|[^\\x21-\\x7E]+\\Z)"
 #define P_USER              "^.*?(?:<a .+?>)?([-A-Za-z0-9_]+)(?:</a>)?:"
 #define P_CHANNEL           "^(.*?(?:<a .+?>)?[-A-Za-z0-9_]+(?:</a>)?: \\r?\\n?#)([A-Za-z0-9_]+) "
+#define P_TAG_IDENTICA      "#([-A-Za-z0-9_]+)"
 #define P_IMAGE_TWITTER     "<a href=\"/account/profile_image/.+?\"><img .+? id=\"profile-image\".*src=\"(http://.+)\" .+?/>"
 #define P_IMAGE_WASSR       "<div class=\"image\"><a href=\".+\"><img src=\"(.+)\" width=\".+?\" /></a></div>"
+#define P_IMAGE_IDENTICA    "<img src=\"(http://.+.identi.ca/.+)\" class=\"avatar profile\" width=\"96\" height=\"96\" alt=\"[A-Za-z0-0_]+\"/>"
+#define P_IMAGE_JISKO       "<img src=\"(http://jisko.net/users/.+/img/avatar/thumb_side\\..+)\" alt=\"Avatar\" />"
 #define P_SIZE_128_WASSR    "\\.128\\."
-#define P_IMAGE_IDENTICA    "<img src=\"(http://.+.identi.ca/.+)\" class=\"avatar profile\" width=\"96\" height=\"96\" alt=\"[A-Za-z0-0_]+\"/>"
-#define P_TAG_IDENTICA      "#([-A-Za-z0-9_]+)"
 #define P_EXCESS_LF         "([\\r|\\n]{3,})"
 
 /* twitter API specific macros */
@@ -212,6 +219,8 @@
 static gboolean is_wassr_conv(PurpleConversation *conv);
 static gboolean is_identica_account(PurpleAccount *account, const char *name);
 static gboolean is_identica_conv(PurpleConversation *conv);
+static gboolean is_jisko_account(PurpleAccount *account, const char *name);
+static gboolean is_jisko_conv(PurpleConversation *conv);
 static void conv_created_cb(PurpleConversation *conv, gpointer null);
 static void deleting_conv_cb(PurpleConversation *conv);
 static gboolean receiving_im_cb(PurpleAccount *account, char **sender, char **buffer, PurpleConversation *conv, PurpleMessageFlags *flags, void *data);
--- a/prefs.ui	Tue Oct 07 14:51:22 2008 +0900
+++ b/prefs.ui	Tue Oct 07 16:44:02 2008 +0900
@@ -188,6 +188,47 @@
               </packing>
             </child>
             <child>
+              <object class="GtkHBox" id="hbox10">
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkAlignment" id="alignment43">
+                    <property name="visible">True</property>
+                    <property name="left_padding">20</property>
+                    <child>
+                      <object class="GtkLabel" id="label30">
+                        <property name="visible">True</property>
+                        <property name="xalign">0</property>
+                        <property name="label" translatable="yes">jisko</property>
+                        <property name="max_width_chars">10</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkAlignment" id="alignment44">
+                    <property name="visible">True</property>
+                    <property name="xalign">1</property>
+                    <property name="right_padding">4</property>
+                    <child>
+                      <object class="GtkEntry" id="account_jisko">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="width_chars">20</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="position">4</property>
+              </packing>
+            </child>
+            <child>
               <object class="GtkAlignment" id="alignment8">
                 <property name="visible">True</property>
                 <property name="top_padding">8</property>
@@ -204,7 +245,7 @@
                 </child>
               </object>
               <packing>
-                <property name="position">4</property>
+                <property name="position">5</property>
               </packing>
             </child>
             <child>
@@ -223,7 +264,7 @@
                 </child>
               </object>
               <packing>
-                <property name="position">5</property>
+                <property name="position">6</property>
               </packing>
             </child>
             <child>
@@ -267,7 +308,7 @@
                 </child>
               </object>
               <packing>
-                <property name="position">6</property>
+                <property name="position">7</property>
               </packing>
             </child>
             <child>
@@ -336,7 +377,7 @@
               </object>
               <packing>
                 <property name="expand">False</property>
-                <property name="position">7</property>
+                <property name="position">8</property>
               </packing>
             </child>
           </object>
@@ -521,7 +562,7 @@
               </packing>
             </child>
             <child>
-              <object class="GtkAlignment" id="alignment43">
+              <object class="GtkAlignment" id="alignment12">
                 <property name="visible">True</property>
                 <property name="xalign">0</property>
                 <property name="top_padding">4</property>
@@ -543,10 +584,10 @@
               </packing>
             </child>
             <child>
-              <object class="GtkHBox" id="hbox10">
+              <object class="GtkHBox" id="hbox6">
                 <property name="visible">True</property>
                 <child>
-                  <object class="GtkAlignment" id="alignment44">
+                  <object class="GtkAlignment" id="alignment16">
                     <property name="visible">True</property>
                     <property name="left_padding">20</property>
                     <child>
@@ -673,6 +714,50 @@
                 <property name="position">6</property>
               </packing>
             </child>
+            <child>
+              <object class="GtkHBox" id="hbox14">
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkAlignment" id="alignment67">
+                    <property name="visible">True</property>
+                    <property name="left_padding">20</property>
+                    <child>
+                      <object class="GtkLabel" id="label38">
+                        <property name="visible">True</property>
+                        <property name="xalign">0</property>
+                        <property name="label" translatable="yes">jisko</property>
+                        <property name="max_width_chars">10</property>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkAlignment" id="alignment68">
+                    <property name="visible">True</property>
+                    <property name="xalign">1</property>
+                    <property name="right_padding">4</property>
+                    <child>
+                      <object class="GtkEntry" id="filter_jisko">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="width_chars">35</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="padding">2</property>
+                <property name="position">7</property>
+              </packing>
+            </child>
           </object>
           <packing>
             <property name="position">2</property>
@@ -680,7 +765,7 @@
           </packing>
         </child>
         <child type="tab">
-          <object class="GtkLabel" id="label30">
+          <object class="GtkLabel" id="label3">
             <property name="visible">True</property>
             <property name="label" translatable="yes">&lt;b&gt;Filter&lt;/b&gt;</property>
             <property name="use_markup">True</property>
@@ -694,7 +779,7 @@
           <object class="GtkVBox" id="vbox1">
             <property name="visible">True</property>
             <child>
-              <object class="GtkAlignment" id="alignment12">
+              <object class="GtkAlignment" id="alignment17">
                 <property name="visible">True</property>
                 <property name="top_padding">12</property>
                 <property name="bottom_padding">4</property>
@@ -774,7 +859,7 @@
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkAlignment" id="alignment16">
+                  <object class="GtkAlignment" id="alignment19">
                     <property name="visible">True</property>
                     <child>
                       <placeholder/>
@@ -848,7 +933,7 @@
               </packing>
             </child>
             <child>
-              <object class="GtkAlignment" id="alignment17">
+              <object class="GtkAlignment" id="alignment20">
                 <property name="visible">True</property>
                 <property name="top_padding">12</property>
                 <property name="bottom_padding">8</property>
@@ -927,7 +1012,7 @@
                   <placeholder/>
                 </child>
                 <child>
-                  <object class="GtkAlignment" id="alignment19">
+                  <object class="GtkAlignment" id="alignment21">
                     <property name="visible">True</property>
                     <child>
                       <placeholder/>
@@ -980,7 +1065,7 @@
                   <object class="GtkAlignment" id="alignment53">
                     <property name="visible">True</property>
                     <child>
-                      <object class="GtkLabel" id="label3">
+                      <object class="GtkLabel" id="label4">
                         <property name="visible">True</property>
                         <property name="label" translatable="yes">times  or</property>
                       </object>
@@ -1093,7 +1178,7 @@
               </packing>
             </child>
             <child>
-              <object class="GtkHBox" id="hbox6">
+              <object class="GtkHBox" id="hbox7">
                 <property name="visible">True</property>
                 <child>
                   <object class="GtkAlignment" id="alignment28">
@@ -1137,7 +1222,7 @@
               </packing>
             </child>
             <child>
-              <object class="GtkHBox" id="hbox7">
+              <object class="GtkHBox" id="hbox8">
                 <property name="visible">True</property>
                 <child>
                   <object class="GtkAlignment" id="alignment30">
@@ -1225,7 +1310,7 @@
               </packing>
             </child>
             <child>
-              <object class="GtkHBox" id="hbox8">
+              <object class="GtkHBox" id="hbox9">
                 <property name="visible">True</property>
                 <child>
                   <object class="GtkAlignment" id="alignment34">
@@ -1269,7 +1354,7 @@
               </packing>
             </child>
             <child>
-              <object class="GtkHBox" id="hbox9">
+              <object class="GtkHBox" id="hbox13">
                 <property name="visible">True</property>
                 <child>
                   <object class="GtkAlignment" id="alignment36">
@@ -1327,7 +1412,7 @@
           </packing>
         </child>
         <child type="tab">
-          <object class="GtkLabel" id="label4">
+          <object class="GtkLabel" id="label12">
             <property name="visible">True</property>
             <property name="label" translatable="yes">&lt;b&gt;Sound&lt;/b&gt;</property>
             <property name="use_markup">True</property>
@@ -1341,7 +1426,7 @@
           <object class="GtkVBox" id="vbox4">
             <property name="visible">True</property>
             <child>
-              <object class="GtkAlignment" id="alignment20">
+              <object class="GtkAlignment" id="alignment22">
                 <property name="visible">True</property>
                 <property name="top_padding">8</property>
                 <property name="bottom_padding">4</property>
@@ -1357,7 +1442,7 @@
               </object>
             </child>
             <child>
-              <object class="GtkAlignment" id="alignment21">
+              <object class="GtkAlignment" id="alignment23">
                 <property name="visible">True</property>
                 <property name="left_padding">20</property>
                 <child>
@@ -1375,7 +1460,7 @@
               </packing>
             </child>
             <child>
-              <object class="GtkAlignment" id="alignment22">
+              <object class="GtkAlignment" id="alignment24">
                 <property name="visible">True</property>
                 <property name="top_padding">8</property>
                 <property name="bottom_padding">4</property>
@@ -1394,7 +1479,7 @@
               </packing>
             </child>
             <child>
-              <object class="GtkAlignment" id="alignment23">
+              <object class="GtkAlignment" id="alignment25">
                 <property name="visible">True</property>
                 <property name="left_padding">20</property>
                 <child>
@@ -1412,7 +1497,7 @@
               </packing>
             </child>
             <child>
-              <object class="GtkAlignment" id="alignment24">
+              <object class="GtkAlignment" id="alignment49">
                 <property name="visible">True</property>
                 <property name="left_padding">20</property>
                 <child>
@@ -1448,7 +1533,7 @@
               </packing>
             </child>
             <child>
-              <object class="GtkAlignment" id="alignment25">
+              <object class="GtkAlignment" id="alignment63">
                 <property name="visible">True</property>
                 <property name="left_padding">20</property>
                 <child>
@@ -1466,7 +1551,7 @@
               </packing>
             </child>
             <child>
-              <object class="GtkAlignment" id="alignment63">
+              <object class="GtkAlignment" id="alignment65">
                 <property name="visible">True</property>
                 <property name="top_padding">8</property>
                 <property name="bottom_padding">4</property>
@@ -1485,7 +1570,7 @@
               </packing>
             </child>
             <child>
-              <object class="GtkAlignment" id="alignment49">
+              <object class="GtkAlignment" id="alignment66">
                 <property name="visible">True</property>
                 <property name="bottom_padding">10</property>
                 <property name="left_padding">20</property>
@@ -1509,7 +1594,7 @@
           </packing>
         </child>
         <child type="tab">
-          <object class="GtkLabel" id="label12">
+          <object class="GtkLabel" id="label37">
             <property name="visible">True</property>
             <property name="label" translatable="yes">&lt;b&gt;Utility&lt;/b&gt;</property>
             <property name="use_markup">True</property>