aboutsummaryrefslogtreecommitdiffstats
path: root/src/camorama-window.c
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab+samsung@kernel.org>2018-07-24 09:49:09 -0300
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>2018-07-24 11:19:19 -0300
commitcbc8d0905488d9efe5c9ecb2e97076e27049c6b3 (patch)
tree51580318fbcd908b972f1fb74f90655afad41e81 /src/camorama-window.c
parent343b5eb4ae59dbf5583de087326fa3423c923595 (diff)
Allow selecting the image resolution instead of "small/midium/large"resolution_improvement
The concept of small, midium, large is relative, as it depends on whatever the camera supports. Instead of using it, it is a way better to show a list of the supported resolutions. That works fine for most cameras, with uses a fixed set. On cameras with a scale, the Kernel actually exports the resolution range. On this case, let's present 4 resolutions between the minimum and maximum one. That should be reasonable for most usecases. Nowadays, all drivers should be reporting resolutions via VIDIOC_ENUM_FRAMESIZES. Yet, as one might run camorama with very legacy kernels, provide backward support, using small/midium/large resolutions just like before. Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
Diffstat (limited to 'src/camorama-window.c')
-rw-r--r--src/camorama-window.c65
1 files changed, 47 insertions, 18 deletions
diff --git a/src/camorama-window.c b/src/camorama-window.c
index d08e29c..3018e1a 100644
--- a/src/camorama-window.c
+++ b/src/camorama-window.c
@@ -275,28 +275,57 @@ load_interface(cam* cam) {
/*
- * Just one resolution is at the XML files. The other ones are
- * dynamically-created
+ * Dynamically generate the resolutions based on what the camera
+ * actually supports. Provide a fallback method, if the camera driver
+ * is too old and doesn't support formats enumeration.
*/
- glade_xml_signal_connect_data (cam->xml, "activate",
- G_CALLBACK (on_change_size_activate), cam);
-
small_res = glade_xml_get_widget (cam->xml, "small");
- new_res = gtk_radio_menu_item_new_with_label_from_widget(GTK_RADIO_MENU_ITEM(small_res), "Medium");
- gtk_menu_append(GTK_MENU(glade_xml_get_widget (cam->xml, "menuitem4_menu")), new_res);
- gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (new_res), FALSE);
- gtk_widget_show (new_res);
- g_signal_connect(new_res, "activate", G_CALLBACK (on_change_size_activate), cam);
- gtk_widget_set_name(new_res, "medium");
-
- new_res = gtk_radio_menu_item_new_with_label_from_widget(GTK_RADIO_MENU_ITEM(small_res), "Large");
- gtk_menu_append(GTK_MENU(glade_xml_get_widget (cam->xml, "menuitem4_menu")), new_res);
- gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (new_res), FALSE);
- gtk_widget_show (new_res);
- g_signal_connect(new_res, "activate", G_CALLBACK (on_change_size_activate), cam);
- gtk_widget_set_name(new_res, "large");
+ /* Get all supported resolutions by cam->pixformat */
+ get_supported_resolutions(cam);
+
+ if (cam->n_res > 0) {
+ int i;
+
+ for (i = 0; i < cam->n_res; i++) {
+ char name[32];
+
+ sprintf(name, "%dx%d", cam->res[i].x, cam->res[i].y);
+
+ new_res = gtk_radio_menu_item_new_with_label_from_widget(GTK_RADIO_MENU_ITEM(small_res), name);
+ gtk_menu_append(GTK_MENU(glade_xml_get_widget (cam->xml, "menuitem4_menu")), new_res);
+ gtk_widget_show (new_res);
+ g_signal_connect(new_res, "activate",
+ G_CALLBACK (on_change_size_activate), cam);
+ gtk_widget_set_name(new_res, name);
+
+ if (cam->width == cam->res[i].x && cam->height == cam->res[i].y)
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (new_res), TRUE);
+ else
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (new_res), FALSE);
+ }
+
+ /* We won't actually use the small res */
+ gtk_widget_hide (small_res);
+ } else {
+ glade_xml_signal_connect_data (cam->xml, "activate",
+ G_CALLBACK (on_change_size_activate), cam);
+
+ new_res = gtk_radio_menu_item_new_with_label_from_widget(GTK_RADIO_MENU_ITEM(small_res), "Medium");
+ gtk_menu_append(GTK_MENU(glade_xml_get_widget (cam->xml, "menuitem4_menu")), new_res);
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (new_res), FALSE);
+ gtk_widget_show (new_res);
+ g_signal_connect(new_res, "activate", G_CALLBACK (on_change_size_activate), cam);
+ gtk_widget_set_name(new_res, "medium");
+
+ new_res = gtk_radio_menu_item_new_with_label_from_widget(GTK_RADIO_MENU_ITEM(small_res), "Large");
+ gtk_menu_append(GTK_MENU(glade_xml_get_widget (cam->xml, "menuitem4_menu")), new_res);
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (new_res), FALSE);
+ gtk_widget_show (new_res);
+ g_signal_connect(new_res, "activate", G_CALLBACK (on_change_size_activate), cam);
+ gtk_widget_set_name(new_res, "large");
+ }
//glade_xml_signal_connect_data(cam->xml, "capture_func", G_CALLBACK(on_change_size_activate), cam);
glade_xml_signal_connect_data (cam->xml, "capture_func",

Privacy Policy