?? frontend.c
字號:
#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <getopt.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/ioctl.h>#include <sys/mman.h>#include <fcntl.h>#include <pthread.h>#include <linux/types.h> #include <gtk/gtk.h>#include <glib.h>#include <linux/videodev.h>#include <png.h>#include "gqcam.h"#include "frontend.h"#include "preferences.h"#include "save.h"#include "color.h"#include "greyscale.h"#include "timer.h"void closedialog(GtkWidget *widget, GtkWidget *dialog){ gtk_widget_destroy(dialog);}void errordialog(char *message, struct Camera *camera){ GtkWidget *errordialog; GtkWidget *button; GtkWidget *label; errordialog = gtk_dialog_new(); button = gtk_button_new_with_label("Oops..."); gtk_box_pack_start (GTK_BOX (GTK_DIALOG(errordialog)->action_area), button, TRUE, TRUE, 0); gtk_signal_connect (GTK_OBJECT(button), "clicked", (GtkSignalFunc) closedialog, errordialog); gtk_widget_show (button); label = gtk_label_new(message); gtk_box_pack_start (GTK_BOX (GTK_DIALOG(errordialog)->vbox), label, TRUE, TRUE, 8); gtk_widget_show (label); gtk_widget_show(errordialog); return;}void setbrightness(GtkAdjustment *adj, struct Camera *camera){ pthread_mutex_lock(&camera->pref_mutex); camera->vid_pic.brightness = (adj->value)*256; camera->update_camera = 1; pthread_mutex_unlock(&camera->pref_mutex);}void setwhite(GtkAdjustment *adj, struct Camera *camera){ pthread_mutex_lock(&camera->pref_mutex); camera->vid_pic.whiteness = (adj->value)*256; camera->update_camera = 1; pthread_mutex_unlock(&camera->pref_mutex);}void setcontrast(GtkAdjustment *adj, struct Camera *camera){ pthread_mutex_lock(&camera->pref_mutex); camera->vid_pic.contrast = (adj->value)*256; camera->update_camera = 1; pthread_mutex_unlock(&camera->pref_mutex);}void sethue(GtkAdjustment *adj, struct Camera *camera){ pthread_mutex_lock(&camera->pref_mutex); camera->vid_pic.hue = (adj->value)*256; camera->update_camera = 1; pthread_mutex_unlock(&camera->pref_mutex);}void setcolor(GtkAdjustment *adj, struct Camera *camera){ pthread_mutex_lock(&camera->pref_mutex); camera->vid_pic.colour = (adj->value)*256; camera->update_camera = 1; pthread_mutex_unlock(&camera->pref_mutex);}void setsizefull(GtkWidget *widget, struct Camera *camera){ pthread_mutex_lock(&camera->pref_mutex); camera->vid_win.width = camera->vid_caps.maxwidth; camera->vid_win.height = camera->vid_caps.maxheight; camera->update_camera = 1; pthread_mutex_unlock(&camera->pref_mutex);}void setsizehalf(GtkWidget *widget, struct Camera *camera){ pthread_mutex_lock(&camera->pref_mutex); camera->vid_win.width = (camera->vid_caps.maxwidth)/2; camera->vid_win.height = (camera->vid_caps.maxheight)/2; camera->update_camera = 1; clearimg(camera); pthread_mutex_unlock(&camera->pref_mutex);}void setsizequarter(GtkWidget *widget, struct Camera *camera){ pthread_mutex_lock(&camera->pref_mutex); camera->vid_win.width = (camera->vid_caps.maxwidth)/4; camera->vid_win.height = (camera->vid_caps.maxheight)/4; camera->update_camera = 1; clearimg(camera); pthread_mutex_unlock(&camera->pref_mutex);}void setdepth4(GtkWidget *widget, struct Camera *camera){ pthread_mutex_lock(&camera->pref_mutex); camera->vid_pic.depth = 4; camera->update_camera = 1; pthread_mutex_unlock(&camera->pref_mutex);}void setdepth6(GtkWidget *widget, struct Camera *camera){ pthread_mutex_lock(&camera->pref_mutex); camera->vid_pic.depth = 6; camera->update_camera = 1; pthread_mutex_unlock(&camera->pref_mutex);}void stop_capture(GtkWidget *widget, struct Camera *camera){ pthread_mutex_lock( &camera->pref_mutex ); if( camera->dev ) { camera->capture = 0; close_cam(camera, 0); } pthread_mutex_unlock( &camera->pref_mutex );}void start_capture(GtkWidget *widget, struct Camera *camera){ pthread_mutex_lock( &camera->pref_mutex ); open_cam(camera); get_cam_info(camera); camera->capture = 1; update_controls(camera); if( !camera->frozen ){ clearimg(camera); } pthread_mutex_unlock( &camera->pref_mutex );}void en_dis_able(GtkWidget *disable, GtkWidget *enable){ /* k-l-u-d-g-e */ /* when you call this func w/ NULL, NULL it will go back to the orig state */ /* I don't know how to ask GTK for object refs, so I put in this hack -jackd */ static GtkWidget *a = NULL; static GtkWidget *b = NULL; if( a == NULL && b == NULL ) { b = disable; a = enable; } if( disable == NULL && enable == NULL ) { gtk_widget_set_sensitive(a, FALSE); gtk_widget_set_sensitive(b, TRUE); } else { gtk_widget_set_sensitive(disable, FALSE); gtk_widget_set_sensitive(enable, TRUE); }}void camera_info(GtkWidget *widget, struct Camera *camera){ GtkWidget *dialog; GtkWidget *textbox; GtkWidget *button; GtkWidget *hbox; GtkWidget *vscrollbar; char buff[80]; dialog = gtk_dialog_new(); gtk_window_set_title(GTK_WINDOW (dialog),"Gqcam - Camera Info"); textbox = gtk_text_new(NULL, NULL); gtk_widget_set_usize(textbox, 400, 200); button = gtk_button_new_with_label("Close"); gtk_signal_connect_object (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), GTK_OBJECT(dialog)); hbox = gtk_hbox_new(FALSE, 0); gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), hbox); vscrollbar = gtk_vscrollbar_new (GTK_TEXT(textbox)->vadj); gtk_container_add(GTK_CONTAINER (GTK_DIALOG(dialog)->action_area), button); gtk_container_add (GTK_CONTAINER (hbox), textbox); gtk_container_add (GTK_CONTAINER(hbox), vscrollbar); gtk_widget_show_all (dialog); sprintf(buff, "Name: %s\n", camera->vid_caps.name); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); sprintf(buff, "Type: %i\n", camera->vid_caps.type); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); if (camera->vid_caps.type & VID_TYPE_CAPTURE) { sprintf(buff, "\tCan capture\n"); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); } if (camera->vid_caps.type & VID_TYPE_TUNER) { sprintf(buff, "\tCan tune\n"); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); } if (camera->vid_caps.type & VID_TYPE_TELETEXT) { sprintf(buff, "\tDoes teletext\n"); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); } if (camera->vid_caps.type & VID_TYPE_OVERLAY) { sprintf(buff, "\tOverlay onto frame buffer\n"); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); } if (camera->vid_caps.type & VID_TYPE_CHROMAKEY) { sprintf(buff, "\tOverlay by chromakey\n"); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); } if (camera->vid_caps.type & VID_TYPE_CLIPPING) { sprintf(buff, "\tCan clip\n"); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); } if (camera->vid_caps.type & VID_TYPE_FRAMERAM) { sprintf(buff, "\tUses the frame buffer memory\n"); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); } if (camera->vid_caps.type & VID_TYPE_SCALES) { sprintf(buff, "\tScalable\n"); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); } if (camera->vid_caps.type & VID_TYPE_MONOCHROME) { sprintf(buff, "\tMonochrome only\n"); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); } if (camera->vid_caps.type & VID_TYPE_SUBCAPTURE) { sprintf(buff, "\tCan capture subareas of the image\n"); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); } sprintf(buff, "Channels: %i\n", camera->vid_caps.channels); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); sprintf(buff, "Audios: %i\n", camera->vid_caps.audios); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); sprintf(buff, "Maxwidth: %i\n", camera->vid_caps.maxwidth); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); sprintf(buff, "Maxheight: %i\n", camera->vid_caps.maxheight); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); sprintf(buff, "Minwidth: %i\n", camera->vid_caps.minwidth); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); sprintf(buff, "Minheight: %i\n", camera->vid_caps.minheight); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); sprintf(buff, "---------\n"); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); sprintf(buff, "X: %i\n", camera->vid_win.x); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); sprintf(buff, "Y: %i\n", camera->vid_win.y); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); sprintf(buff, "Width: %i\n", camera->vid_win.width); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); sprintf(buff, "Height: %i\n", camera->vid_win.height); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); sprintf(buff, "Chromakey: %i\n", camera->vid_win.chromakey); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); sprintf(buff, "Flags: %i\n", camera->vid_win.flags); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); sprintf(buff, "---------\n"); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); sprintf(buff, "Brightness:\t%i (%i)\n", camera->vid_pic.brightness, camera->vid_pic.brightness/256); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); sprintf(buff, "Hue:\t\t%i (%i)\n", camera->vid_pic.hue, camera->vid_pic.hue/256); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); sprintf(buff, "Color:\t\t%i (%i)\n", camera->vid_pic.colour, camera->vid_pic.colour/256); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); sprintf(buff, "Contrast:\t%i (%i)\n", camera->vid_pic.contrast, camera->vid_pic.contrast/256); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); sprintf(buff, "Whiteness:\t%i (%i)\n", camera->vid_pic.whiteness, camera->vid_pic.whiteness/256); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); sprintf(buff, "Depth:\t\t%i\n", camera->vid_pic.depth); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); sprintf(buff, "Palette:\t%i\n", camera->vid_pic.palette); gtk_text_insert(GTK_TEXT(textbox), NULL, NULL, NULL, buff, -1); gtk_adjustment_set_value(GTK_ADJUSTMENT(GTK_TEXT(textbox)->vadj), 0); // print_cam_info(camera);}void about_dialog(GtkWidget *widget, struct Camera *camera){ GtkWidget *dialog, *label, *button; char buff[80]; dialog = gtk_dialog_new(); sprintf(buff, "Gqcam version %s\n(C)2000 Cory Lueninghoener", VERSION); label = gtk_label_new (buff); button = gtk_button_new_with_label("Thanks, Cory!"); gtk_window_set_title(GTK_WINDOW (dialog),"Gqcam - About"); gtk_signal_connect_object (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), GTK_OBJECT(dialog)); gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->action_area), button); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label, FALSE, FALSE, 10); //gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), // label); gtk_widget_show_all (dialog);}/*void pref_dialog(GtkWidget *widget, struct Camera *camera){ errordialog("Preferences dialog is not implemented yet...", camera);}*/void open_dialog_ok(GtkWidget *widget, struct Camera *camera){ stop_capture( NULL, camera ); usleep(1); clearimg(camera); sprintf(camera->devname,"%s",gtk_file_selection_get_filename (GTK_FILE_SELECTION (widget->parent->parent->parent))); gtk_widget_destroy(widget->parent->parent->parent); start_capture(NULL, camera); en_dis_able( NULL, NULL );}void open_dialog(GtkWidget *widget, struct Camera *camera){ GtkWidget *opendialog; opendialog = gtk_file_selection_new ("Open Device"); gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (opendialog)->ok_button), "clicked", (GtkSignalFunc) open_dialog_ok, camera); gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (opendialog)->cancel_button), "clicked", (GtkSignalFunc) gtk_widget_destroy, GTK_OBJECT (opendialog)); gtk_file_selection_set_filename(GTK_FILE_SELECTION(opendialog), camera->devname); gtk_widget_show(opendialog);}/* void close_dialog(GtkWidget *widget, struct Camera *camera) { fprintf( stderr, "close_dialog calling stop_capture\n" ); stop_capture( NULL, camera ); usleep(1); clearimg(camera); }*/void update_controls(struct Camera *camera){ gtk_widget_destroy(camera->controltop); if (camera->greyscale) create_controls_greyscale(camera); else create_controls_color(camera); if (camera->docked)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -