$ git clone http://tcclient.ion.nu/tc_client.git
commit 104d8e833de3eec799737b69dcbb516f957c6572
Author: Alicia <...>
Date:   Wed Oct 5 20:06:44 2016 +0200

    tc_client-gtk: added an option to pick the greenscreen "green" color from the camera.

diff --git a/ChangeLog b/ChangeLog
index 2c9cace..a58651d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -14,6 +14,7 @@ tc_client-gtk: turn URLs mentioned in chat into clickable links.
 tc_client-gtk: reimplemented automatic scrolling using a state to keep track of whether the GtkTextView is scrolled to the bottom and using gtk_text_view_scroll_to_mark() to scroll.
 tc_client-gtk: when keeping HTTP cookies, use separate cookies per account and one for no account to avoid serverside issues.
 tc_client-gtk: stop trying to send video data if our media stream was closed.
+tc_client-gtk: added an option to pick the greenscreen "green" color from the camera.
 tc_client-gtk and camviewer: updated to libavcodec's avcodec_{send,receive}_{frame,packet} API.
 libcamera(v4l2): cache the frame and if there is no data to be read, return the cache instead of blocking.
 0.39:
diff --git a/gtkgui.glade b/gtkgui.glade
index a56a5cf..b481225 100644
--- a/gtkgui.glade
+++ b/gtkgui.glade
@@ -1031,6 +1031,26 @@
       </object>
     </child>
   </object>
+  <object class="GtkMenu" id="link_menu">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <child>
+      <object class="GtkMenuItem" id="link_menu_open">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">Open Link</property>
+        <property name="use_underline">True</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="link_menu_copy">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label" translatable="yes">Copy Link</property>
+        <property name="use_underline">True</property>
+      </object>
+    </child>
+  </object>
   <object class="GtkWindow" id="main">
     <property name="can_focus">False</property>
     <property name="title" translatable="yes">tc_client</property>
@@ -1412,6 +1432,19 @@
                         <property name="position">1</property>
                       </packing>
                     </child>
+                    <child>
+                      <object class="GtkToggleButton" id="greenscreen_eyedropper">
+                        <property name="label" translatable="yes">Pick color from cam</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">True</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
                   </object>
                   <packing>
                     <property name="expand">False</property>
@@ -1535,24 +1568,4 @@
       </object>
     </child>
   </object>
-  <object class="GtkMenu" id="link_menu">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <child>
-      <object class="GtkMenuItem" id="link_menu_open">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="label" translatable="yes">Open Link</property>
-        <property name="use_underline">True</property>
-      </object>
-    </child>
-    <child>
-      <object class="GtkMenuItem" id="link_menu_copy">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="label" translatable="yes">Copy Link</property>
-        <property name="use_underline">True</property>
-      </object>
-    </child>
-  </object>
 </interface>
diff --git a/utilities/gtk/gui.c b/utilities/gtk/gui.c
index 0303173..e0599e9 100644
--- a/utilities/gtk/gui.c
+++ b/utilities/gtk/gui.c
@@ -418,8 +418,13 @@ void fontsize_set(double size)
 const char* menu_context_cam=0;
 gboolean gui_show_cam_menu(GtkWidget* widget, GdkEventButton* event, const char* id)
 {
-  if(event->button!=3){return 0;} // Only act on right-click
   struct camera* cam=camera_find(id);
+  if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(gui, "greenscreen_eyedropper"))))
+  {
+    gui_set_greenscreen_color_cam(event->x, event->y, cam);
+    return 1;
+  }
+  if(event->button!=3){return 0;} // Only act on right-click
   free((void*)menu_context_cam);
   menu_context_cam=strdup(cam->id);
   GtkMenu* menu=GTK_MENU(gtk_builder_get_object(gui, "cam_menu"));
@@ -614,6 +619,23 @@ void gui_set_greenscreen_color(GtkColorButton* button, void* x)
   rgb_to_hsv(cam->postproc.greenscreen_color[0], cam->postproc.greenscreen_color[1], cam->postproc.greenscreen_color[2], &cam->postproc.greenscreen_hsv[0], &cam->postproc.greenscreen_hsv[1], &cam->postproc.greenscreen_hsv[2]);
 }
 
+void gui_set_greenscreen_color_cam(unsigned int x, unsigned int y, struct camera* cam)
+{
+  GdkPixbuf* pixbuf=gtk_image_get_pixbuf(GTK_IMAGE(cam->cam));
+  unsigned int rowstride=gdk_pixbuf_get_rowstride(pixbuf);
+  const guint8* pixels=gdk_pixbuf_read_pixels(pixbuf);
+  GdkRGBA color={
+    .red=(double)pixels[y*rowstride+x*3]/255,
+    .green=(double)pixels[y*rowstride+x*3+1]/255,
+    .blue=(double)pixels[y*rowstride+x*3+2]/255,
+    .alpha=1.0
+  };
+  GtkColorChooser* button=GTK_COLOR_CHOOSER(gtk_builder_get_object(gui, "greenscreen_colorpicker"));
+  gtk_color_chooser_set_rgba(button, &color);
+  gui_set_greenscreen_color(GTK_COLOR_BUTTON(button), 0);
+  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(gui, "greenscreen_eyedropper")), 0);
+}
+
 void gui_set_greenscreen_tolerance(GtkAdjustment* adjustment, void* x)
 {
   if(!menu_context_cam){return;}
diff --git a/utilities/gtk/gui.h b/utilities/gtk/gui.h
index e0071fb..939e90a 100644
--- a/utilities/gtk/gui.h
+++ b/utilities/gtk/gui.h
@@ -53,6 +53,7 @@ extern void camcolors_toggle_flip(GtkToggleButton* button, void* vertical);
 extern void gui_hide_cam(GtkMenuItem* menuitem, void* x);
 extern void gui_set_greenscreen_img(GtkButton* button, void* x);
 extern void gui_set_greenscreen_color(GtkColorButton* button, void* x);
+extern void gui_set_greenscreen_color_cam(unsigned int x, unsigned int y, struct camera* cam);
 extern void gui_set_greenscreen_tolerance(GtkAdjustment* adjustment, void* x);
 extern void gui_insert_link(GtkTextBuffer* buffer, GtkTextIter* iter, const char* url, int length);
 extern gboolean gui_click_link(GtkTextView* textview, GdkEventButton* event, void* data);