Просмотр исходного кода

Pause frame processing when window is not active

Martijn Braam 1 год назад
Родитель
Сommit
e97ce527b0
3 измененных файлов с 16 добавлено и 1 удалено
  1. 6 0
      src/io_pipeline.c
  2. 8 1
      src/main.c
  3. 2 0
      src/main.h

+ 6 - 0
src/io_pipeline.c

@@ -2,6 +2,7 @@
 
 #include "camera.h"
 #include "flash.h"
+#include "main.h"
 #include "pipeline.h"
 #include "process_pipeline.h"
 #include "state.h"
@@ -240,6 +241,11 @@ update_controls()
 static void
 on_frame(MPBuffer buffer, void *_data)
 {
+        // Don't process frame when the window is not active
+        if (!check_window_active()) {
+                return;
+        }
+        
         // Only update controls right after a frame was captured
         update_controls();
 

+ 8 - 1
src/main.c

@@ -55,6 +55,7 @@ static char last_path[260] = "";
 static MPZBarScanResult *zbar_result = NULL;
 
 // Widgets
+GtkWidget *window;
 GtkWidget *preview;
 GtkWidget *main_stack;
 GtkWidget *open_last_stack;
@@ -90,6 +91,12 @@ remap(int value, int input_min, int input_max, int output_min, int output_max)
         return (int)result;
 }
 
+bool
+check_window_active()
+{
+        return gtk_window_is_active(GTK_WINDOW(window));
+}
+
 static void
 update_io_pipeline()
 {
@@ -1126,7 +1133,7 @@ activate(GtkApplication *app, gpointer data)
         GtkBuilder *builder = gtk_builder_new_from_resource(
                 "/org/postmarketos/Megapixels/camera.ui");
 
-        GtkWidget *window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));
+        window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));
         iso_button =
                 GTK_WIDGET(gtk_builder_get_object(builder, "iso-controls-button"));
         shutter_button = GTK_WIDGET(

+ 2 - 0
src/main.h

@@ -31,3 +31,5 @@ void mp_main_capture_completed(GdkTexture *thumb, const char *fname);
 void mp_main_set_zbar_result(MPZBarScanResult *result);
 
 int remap(int value, int input_min, int input_max, int output_min, int output_max);
+
+bool check_window_active();