$ git clone http://tcclient.ion.nu/tc_client.git
commit ed80d57a8e849595ab95668e483492901e2954e9
Author: Alicia <...>
Date:   Wed May 4 14:02:09 2016 +0200

    tc_client-gtk: added an option to use the --cookies parameter of the core to keep/reuse HTTP cookies.

diff --git a/ChangeLog b/ChangeLog
index 8d833eb..2a27ad4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,6 +7,7 @@ tc_client-gtk: added horizontal and vertical flip as postprocessing options.
 tc_client-gtk: reallocate frame when camera input size changes.
 tc_client-gtk: if we failed to open the camera, just give a grey screen.
 tc_client-gtk: made the settings accessible from the start window (previously only accessible from the main window, after already joining a channel)
+tc_client-gtk: added an option to use the --cookies parameter of the core to keep/reuse HTTP cookies.
 tc_client-gtk and camviewer: fixed compatibility with newer libavutil.
 tc_client-gtk and camviewer: added compatibility fallbacks for av_image_get_buffer_size() and av_packet_unref()
 libcamera(v4l2): if we failed to read the frame, give grey instead.
diff --git a/gtkgui.glade b/gtkgui.glade
index 5b4131a..83ae919 100644
--- a/gtkgui.glade
+++ b/gtkgui.glade
@@ -10,8 +10,8 @@
   <object class="GtkWindow" id="settings">
     <property name="can_focus">False</property>
     <property name="title" translatable="yes">tc_client settings</property>
-    <property name="default_width">350</property>
-    <property name="default_height">200</property>
+    <property name="default_width">400</property>
+    <property name="default_height">280</property>
     <signal name="delete-event" handler="gtk_widget_hide_on_delete" swapped="no"/>
     <child>
       <object class="GtkBox" id="box1">
@@ -466,6 +466,50 @@
                 <property name="tab_fill">False</property>
               </packing>
             </child>
+            <child>
+              <object class="GtkScrolledWindow" id="scrolledwindow6">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="shadow_type">in</property>
+                <child>
+                  <object class="GtkViewport" id="viewport7">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <child>
+                      <object class="GtkCheckButton" id="storecookiecheckbox">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="xalign">0</property>
+                        <property name="draw_indicator">True</property>
+                        <child>
+                          <object class="GtkLabel" id="label26">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="label" translatable="yes">Store HTTP cookies (prevents having to solve the captchas as often)</property>
+                            <property name="wrap">True</property>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="position">5</property>
+              </packing>
+            </child>
+            <child type="tab">
+              <object class="GtkLabel" id="label25">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Misc</property>
+              </object>
+              <packing>
+                <property name="position">5</property>
+                <property name="tab_fill">False</property>
+              </packing>
+            </child>
           </object>
           <packing>
             <property name="expand">True</property>
diff --git a/utilities/gtk/camviewer.c b/utilities/gtk/camviewer.c
index 51323fe..95cadc3 100644
--- a/utilities/gtk/camviewer.c
+++ b/utilities/gtk/camviewer.c
@@ -843,8 +843,12 @@ void startsession(GtkButton* button, void* x)
   const char* acc_user=gtk_entry_get_text(GTK_ENTRY(gtk_builder_get_object(gui, "acc_username")));
   const char* acc_pass=gtk_entry_get_text(GTK_ENTRY(gtk_builder_get_object(gui, "acc_password")));
 #ifdef _WIN32
-  char cmd[strlen("./tc_client --hexcolors -u    0")+strlen(acc_user)+strlen(channel)+strlen(nick)+strlen(chanpass)];
+  char cmd[strlen("./tc_client --hexcolors --cookies tinychat.cookie -u    0")+strlen(acc_user)+strlen(channel)+strlen(nick)+strlen(chanpass)];
   strcpy(cmd, "./tc_client --hexcolors ");
+  if(config_get_bool("storecookies"))
+  {
+    strcat(cmd, "--cookies tinychat.cookie ");
+  }
   if(acc_user[0])
   {
     strcat(cmd, "-u ");
@@ -868,11 +872,24 @@ void startsession(GtkButton* button, void* x)
     close(tc_client_in[1]);
     dup2(tc_client[1], 1);
     dup2(tc_client_in[0], 0);
-    if(acc_user[0])
+    if(config_get_bool("storecookies"))
     {
-      execlp(TC_CLIENT, TC_CLIENT, "--hexcolors", "-u", acc_user, channel, nick, chanpass, (char*)0);
+      const char* home=getenv("HOME");
+      char filename[strlen(home)+strlen("/.tinychat.cookie0")];
+      sprintf(filename, "%s/.tinychat.cookie", home);
+      if(acc_user[0])
+      {
+        execlp(TC_CLIENT, TC_CLIENT, "--hexcolors", "-u", acc_user, "--cookies", filename, channel, nick, chanpass, (char*)0);
+      }else{
+        execlp(TC_CLIENT, TC_CLIENT, "--hexcolors", "--cookies", filename, channel, nick, chanpass, (char*)0);
+      }
     }else{
-      execlp(TC_CLIENT, TC_CLIENT, "--hexcolors", channel, nick, chanpass, (char*)0);
+      if(acc_user[0])
+      {
+        execlp(TC_CLIENT, TC_CLIENT, "--hexcolors", "-u", acc_user, channel, nick, chanpass, (char*)0);
+      }else{
+        execlp(TC_CLIENT, TC_CLIENT, "--hexcolors", channel, nick, chanpass, (char*)0);
+      }
     }
   }
 #endif
diff --git a/utilities/gtk/gui.c b/utilities/gtk/gui.c
index ee59d7f..debf7ce 100644
--- a/utilities/gtk/gui.c
+++ b/utilities/gtk/gui.c
@@ -72,6 +72,9 @@ void settings_reset(GtkBuilder* gui)
   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(option), config_get_bool("camdownonjoin"));
   option=GTK_WIDGET(gtk_builder_get_object(gui, "autoopencams"));
   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(option), config_get_set("autoopencams")?config_get_bool("autoopencams"):1);
+  // Misc/cookies
+  option=GTK_WIDGET(gtk_builder_get_object(gui, "storecookiecheckbox"));
+  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(option), config_get_bool("storecookies"));
 }
 
 void showsettings(GtkMenuItem* item, GtkBuilder* gui)
@@ -110,6 +113,9 @@ void savesettings(GtkButton* button, GtkBuilder* gui)
   config_set("camdownonjoin", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(option))?"True":"False");
   option=GTK_WIDGET(gtk_builder_get_object(gui, "autoopencams"));
   config_set("autoopencams", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(option))?"True":"False");
+  // Misc/cookies
+  option=GTK_WIDGET(gtk_builder_get_object(gui, "storecookiecheckbox"));
+  config_set("storecookies", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(option))?"True":"False");
 
   config_save();
   GtkWidget* settings=GTK_WIDGET(gtk_builder_get_object(gui, "settings"));