$ git clone http://tcclient.ion.nu/tc_client.git
commit c369714248f11ba4eec06dbf1c8455217bbd2145
Author: Alicia <...>
Date:   Thu Dec 17 17:00:33 2015 +0100

    tc_client-gtk: made automatically opening cam streams an option which can be disabled.

diff --git a/ChangeLog b/ChangeLog
index e8be003..fba1096 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,7 @@ Reimplemented announcement of people cammed up when joining.
 Minor build fixes.
 libcamera: added support for a virtual "Image" camera.
 tc_client-gtk: added workarounds for the camera code (with the platform-agnostic "Image" camera) to work on windows.
+tc_client-gtk: made automatically opening cam streams an option which can be disabled.
 libcamera: fixed compiler warnings.
 libcamera: added support for cameras on windows through the ESCAPI library.
 0.36:
diff --git a/gtkgui.glade b/gtkgui.glade
index ca5fc0c..82c71cb 100644
--- a/gtkgui.glade
+++ b/gtkgui.glade
@@ -963,20 +963,55 @@
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
                     <child>
-                      <object class="GtkCheckButton" id="camdownonjoin">
+                      <object class="GtkBox" id="box11">
                         <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>
+                        <property name="can_focus">False</property>
+                        <property name="orientation">vertical</property>
                         <child>
-                          <object class="GtkLabel" id="label19">
+                          <object class="GtkCheckButton" id="camdownonjoin">
                             <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="label" translatable="yes">Automatically cam down when someone joins (or "Shy mode")</property>
-                            <property name="wrap">True</property>
-                            <property name="wrap_mode">word-char</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="label19">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="label" translatable="yes">Automatically cam down when someone joins (or "Shy mode")</property>
+                                <property name="wrap">True</property>
+                                <property name="wrap_mode">word-char</property>
+                              </object>
+                            </child>
                           </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkCheckButton" id="autoopencams">
+                            <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="label20">
+                                <property name="visible">True</property>
+                                <property name="can_focus">False</property>
+                                <property name="label" translatable="yes">Automatically open cam streams</property>
+                                <property name="wrap">True</property>
+                                <property name="wrap_mode">word-char</property>
+                              </object>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">1</property>
+                          </packing>
                         </child>
                       </object>
                     </child>
@@ -991,7 +1026,7 @@
               <object class="GtkLabel" id="label18">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="label" translatable="yes">Misc</property>
+                <property name="label" translatable="yes">Cameras</property>
               </object>
               <packing>
                 <property name="position">3</property>
diff --git a/utilities/gtk/camviewer.c b/utilities/gtk/camviewer.c
index d410d2f..b7962fd 100644
--- a/utilities/gtk/camviewer.c
+++ b/utilities/gtk/camviewer.c
@@ -405,7 +405,7 @@ gboolean handledata(GIOChannel* iochannel, GIOCondition condition, gpointer data
     return 1;
   }
   // Start a stream when someone cams up
-  if(space && !strcmp(space, " cammed up"))
+  if(space && !strcmp(space, " cammed up") && (config_get_bool("autoopencams") || !config_get_set("autoopencams")))
   {
     space[0]=0;
     dprintf(tc_client_in[1], "/opencam %s\n", buf);
diff --git a/utilities/gtk/config.c b/utilities/gtk/config.c
index d14ac6e..1b91c59 100644
--- a/utilities/gtk/config.c
+++ b/utilities/gtk/config.c
@@ -108,6 +108,16 @@ int config_get_int(const char* name)
   return 0;
 }
 
+char config_get_set(const char* name)
+{
+  unsigned int i;
+  for(i=0; i<configitemcount; ++i)
+  {
+    if(!strcmp(configitems[i].name, name)){return 1;}
+  }
+  return 0;
+}
+
 void config_set(const char* name, const char* value)
 {
   unsigned int i;
diff --git a/utilities/gtk/config.h b/utilities/gtk/config.h
index a12032c..979bfd2 100644
--- a/utilities/gtk/config.h
+++ b/utilities/gtk/config.h
@@ -20,6 +20,7 @@ extern void config_save(void);
 extern char config_get_bool(const char* name);
 extern const char* config_get_str(const char* name);
 extern int config_get_int(const char* name);
+extern char config_get_set(const char* name);
 
 extern void config_set(const char* name, const char* value);
 extern void config_set_int(const char* name, int value);
diff --git a/utilities/gtk/gui.c b/utilities/gtk/gui.c
index 8caa388..c6322d6 100644
--- a/utilities/gtk/gui.c
+++ b/utilities/gtk/gui.c
@@ -63,9 +63,11 @@ void settings_reset(GtkBuilder* gui)
   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(option), config_get_bool("youtuberadio_cmd"));
   option=GTK_WIDGET(gtk_builder_get_object(gui, "youtubecmd"));
   gtk_entry_set_text(GTK_ENTRY(option), config_get_str("youtubecmd"));
-  // Misc
+  // Cameras
   option=GTK_WIDGET(gtk_builder_get_object(gui, "camdownonjoin"));
   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);
 }
 
 void showsettings(GtkMenuItem* item, GtkBuilder* gui)
@@ -95,9 +97,11 @@ void savesettings(GtkButton* button, GtkBuilder* gui)
   config_set("youtubecmd", gtk_entry_get_text(GTK_ENTRY(youtubecmd)));
   GtkWidget* youtuberadio_cmd=GTK_WIDGET(gtk_builder_get_object(gui, "youtuberadio_cmd"));
   config_set("youtuberadio_cmd", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(youtuberadio_cmd))?"True":"False");
-  // Misc
+  // Cameras
   GtkWidget* option=GTK_WIDGET(gtk_builder_get_object(gui, "camdownonjoin"));
   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");
 
   config_save();
   GtkWidget* settings=GTK_WIDGET(gtk_builder_get_object(gui, "settings"));