add desktop file and icon and have that installed, menu as popover, deb package cleanup

This commit is contained in:
Nicole Faerber 2021-02-07 17:32:13 +01:00
parent ece735f467
commit c653d72cf4
10 changed files with 173 additions and 270 deletions

View file

@ -14,6 +14,8 @@ $(PRG): $(OBJ) cam-thread.h planck.h
install: install:
install -D $(PRG) $(DESTDIR)$(prefix)/bin/$(PRG) install -D $(PRG) $(DESTDIR)$(prefix)/bin/$(PRG)
install -D flirgtk.desktop $(DESTDIR)$(prefix)/share/applications/flirgtk.desktop
install -D flirgtk.png $(DESTDIR)$(prefix)/share/icons/hicolor/256x256/apps/flirgtk.png
install -D 77-flirone-lusb.rules $(DESTDIR)/lib/udev/rules.d/77-flirone-lusb.rules install -D 77-flirone-lusb.rules $(DESTDIR)/lib/udev/rules.d/77-flirone-lusb.rules
clean: clean:
@ -26,4 +28,4 @@ clean:
rm -f debian/flirgtk.substvars rm -f debian/flirgtk.substvars
deb: deb:
dpkg-buildpackage -rfakeroot -b -uc -us -ui -i -i dpkg-buildpackage -rfakeroot -b -uc -us -ui -i

View file

@ -1,3 +1,17 @@
[Desktop Entry]
Type=Application
Name=Example
Icon=exampleapp
StartupNotify=true
Exec=@bindir@/exampleapp
Scaling 0.5
xoffst -71
yoffset -40
cairo_surface_t *cairo_get_target (cairo_t *cr); cairo_surface_t *cairo_get_target (cairo_t *cr);
int stride; int stride;

View file

@ -1,25 +1,34 @@
# FLIR-GTK # FLIR-GTK
GTK+ application for FLIR ONE USB thermal camera based on flir-v4l: GTK+ application for FLIR ONE USB thermal camera based on flir-v4l:
Copyright (C) 2015-2016 Thomas <tomas123 @ EEVblog Electronics Community Forum> > Copyright (C) 2015-2016 Thomas <tomas123 @ EEVblog Electronics Community Forum>
https://github.com/fnoop/flirone-v4l2
[https://github.com/fnoop/flirone-v4l2](https://github.com/fnoop/flirone-v4l2)
== depdendencies == ## depdendencies
```
GTK+-3.0 GTK+-3.0
Cairo Cairo
libusb-1.0 libusb-1.0
libjpeg libjpeg
libcjson libcjson
```
This should install everything under Debian and derivatives: This should install everything under Debian and derivatives:
apt install libgtk-3-dev libjpeg-dev libusb-1.0-0-dev libcjson-dev apt install libgtk-3-dev libjpeg-dev libusb-1.0-0-dev libcjson-dev
== building == ## building
Makefile relies on pkg-config, if setup correctly simply running 'make' If you check out the code from git you first need to clone submodule cairo-jpeg:
should build the application. git submodule init
git submodule update
== libusb & udev == Makefile relies on pkg-config, if setup correctly simply running 'make'
cp 77-flirone-lusb.rules /lib/udev/rules.d/ should build the application which can be run from the source directory,
udevadm control --reload-rules 'make deb' builds a Debian package (to the parent directory)
## libusb & udev
For access rights of the application to the USB device:
cp 77-flirone-lusb.rules /lib/udev/rules.d/
udevadm control --reload-rules

View file

@ -44,7 +44,7 @@ extern unsigned char *color_palette;
#include <math.h> #include <math.h>
#include "cam-thread.h" #include "cam-thread.h"
#include "plank.h" #include "planck.h"
// -----------------START-ORG-CODE------------------------------------------ // -----------------START-ORG-CODE------------------------------------------
@ -252,8 +252,6 @@ void vframe(char ep[],char EP_error[], int r, int actual_length, unsigned char b
uint32_t JpgSize = buf85[16] + (buf85[17] << 8) + (buf85[18] << 16) + (buf85[19] << 24); uint32_t JpgSize = buf85[16] + (buf85[17] << 8) + (buf85[18] << 16) + (buf85[19] << 24);
uint32_t StatusSize = buf85[20] + (buf85[21] << 8) + (buf85[22] << 16) + (buf85[23] << 24); uint32_t StatusSize = buf85[20] + (buf85[21] << 8) + (buf85[22] << 16) + (buf85[23] << 24);
//printf("FrameSize= %d (+28=%d), ThermalSize %d, JPG %d, StatusSize %d, Pointer %d\n",FrameSize,FrameSize+28, ThermalSize, JpgSize,StatusSize,buf85pointer);
if ( (FrameSize+28) > (buf85pointer) ) { if ( (FrameSize+28) > (buf85pointer) ) {
// wait for next chunk // wait for next chunk
return; return;
@ -267,22 +265,6 @@ void vframe(char ep[],char EP_error[], int r, int actual_length, unsigned char b
// get a full frame, first print the status // get a full frame, first print the status
t1=t2; t1=t2;
gettimeofday(&t2, NULL); gettimeofday(&t2, NULL);
// fps as moving average over last 20 frames
// fps_t = (19*fps_t+10000000/(((t2.tv_sec * 1000000) + t2.tv_usec) - ((t1.tv_sec * 1000000) + t1.tv_usec)))/20;
//filecount++;
// printf("#%08i %lld/10 fps:",filecount,fps_t);
#if 0
for (i = 0; i < StatusSize; i++) {
v=28+ThermalSize+JpgSize+i;
if (buf85[v]>31) {
printf("%c", buf85[v]);
} else {
printf("<%02x>", buf85[v]);
}
}
printf("\n");
#endif
buf85pointer=0; buf85pointer=0;
unsigned short pix[160*120]; // original Flir 16 Bit RAW unsigned short pix[160*120]; // original Flir 16 Bit RAW
@ -336,46 +318,12 @@ void vframe(char ep[],char EP_error[], int r, int actual_length, unsigned char b
} }
} }
//char st1[100];
//char st2[100];
//struct tm *loctime;
// Convert it to local time and Print it out in a nice format.
//loctime = localtime (&now1);
//strftime (st1, 60, "%H:%M:%S", loctime);
// calc medium of 2x2 center pixels // calc medium of 2x2 center pixels
int med = (pix[59 * 160 + 79]+pix[59 * 160 + 80]+pix[60 * 160 + 79]+pix[60 * 160 + 80])/4; int med = (pix[59 * 160 + 79]+pix[59 * 160 + 80]+pix[60 * 160 + 79]+pix[60 * 160 + 80])/4;
t_min = raw2temperature(min); t_min = raw2temperature(min);
t_max = raw2temperature(max); t_max = raw2temperature(max);
t_center = raw2temperature(med); t_center = raw2temperature(med);
// sprintf(st2," %.1f/%.1f/%.1f'C", raw2temperature(min), raw2temperature(med), raw2temperature(max));
//strcat(st1, st2);
//#define MAXC 26 // max chars in line 160/6=26,6
//strncpy(st2, st1, MAXC);
// write zero to string !!
//st2[MAXC-1] = '\0';
//fprintf(stderr,"%s\r",st2);
// font_write(fb_proc, 1, 120, st2);
// show crosshairs, remove if required
// font_write(fb_proc, 80-2, 60-3, "+");
//maxx -= 4;
//maxy -= 4;
//if (maxx < 0)
// maxx = 0;
//if (maxy < 0)
// maxy = 0;
//if (maxx > 150)
// maxx = 150;
//if (maxy > 110)
// maxy = 110;
// font_write(fb_proc, 160-6, maxy, "<");
// font_write(fb_proc, maxx, 120-8, "|");
if (ir_buffer == NULL) { if (ir_buffer == NULL) {
ir_buffer = (unsigned char *)malloc(640*480*4); ir_buffer = (unsigned char *)malloc(640*480*4);
@ -383,93 +331,19 @@ void vframe(char ep[],char EP_error[], int r, int actual_length, unsigned char b
} }
for (y = 0; y < 120; ++y) { for (y = 0; y < 120; ++y) {
for (x = 0; x < 160; ++x) { for (x = 0; x < 160; ++x) {
// unsigned int *p1, *pc;
// fb_proc is the gray scale frame buffer // fb_proc is the gray scale frame buffer
v=fb_proc[y * 160 + x] ; // unsigned char!! v=fb_proc[y * 160 + x] ; // unsigned char!!
#if 0 ir_buffer[4*y * 160 + x*4] =
// fb_proc2 is an 24bit RGB buffer color_palette[3 * v + 2]; // B
fb_proc2[3*y * 160 + x*3] = colormap[3 * v]; // unsigned char!! ir_buffer[(4*y * 160 + x*4)+1] =
fb_proc2[(3*y * 160 + x*3)+1] = colormap[3 * v + 1]; // unsigned char!! color_palette[3 * v + 1]; // G
fb_proc2[(3*y * 160 + x*3)+2] = colormap[3 * v + 2]; // unsigned char!! ir_buffer[(4*y * 160 + x*4)+2] =
#else color_palette[3 * v]; // R
//fbdata[4*y * 640 + x*4] = colormap[3 * v + 2]; // B // ir_buffer[(4*y * 160 + x*4)+3] =
//fbdata[(4*y * 640 + x*4)+1] = colormap[3 * v + 1]; // G // 0x00; // A, empty
//fbdata[(4*y * 640 + x*4)+2] = colormap[3 * v]; // R
//fbdata[(4*y * 640 + x*4)+3] = 0x00; // empty
// fprintf(stderr, "%d %d %d %d\n",x ,y, (4*y * 160 + x*4), v);
ir_buffer[4*y * 160 + x*4] =
color_palette[3 * v + 2]; // B
ir_buffer[(4*y * 160 + x*4)+1] =
color_palette[3 * v + 1]; // G
ir_buffer[(4*y * 160 + x*4)+2] =
color_palette[3 * v]; // R
// ir_buffer[(4*y * 160 + x*4)+3] =
// 0x00; // A, empty
#if 0
// assemble one 32 bit pixel
fbdata[16*y * 640 + x*16] = color_palette[3 * v + 2]; // B
fbdata[(16*y * 640 + x*16)+1] = color_palette[3 * v + 1]; // G
fbdata[(16*y * 640 + x*16)+2] = color_palette[3 * v]; // R
// fbdata[(16*y * 640 + x*16)+3] = 0x00; // empty
// copy whole 32bit words hor/vert
p1 = (unsigned int *)&fbdata[16*y * 640 + x*16];
// quadruple horizontally
pc = (unsigned int *)&fbdata[(16*y * 640 + x*16)+4];
*pc = *p1;
pc = (unsigned int *)&fbdata[(16*y * 640 + x*16)+8];
*pc = *p1;
pc = (unsigned int *)&fbdata[(16*y * 640 + x*16)+12];
*pc = *p1;
// quadruple vertically+1
pc = (unsigned int *)&fbdata[(4*((y*4)+1) * 640 + x*16)];
*pc = *p1;
pc = (unsigned int *)&fbdata[(4*((y*4)+1) * 640 + x*16)+4];
*pc = *p1;
pc = (unsigned int *)&fbdata[(4*((y*4)+1) * 640 + x*16)+8];
*pc = *p1;
pc = (unsigned int *)&fbdata[(4*((y*4)+1) * 640 + x*16)+12];
*pc = *p1;
pc = (unsigned int *)&fbdata[(4*((y*4)+2) * 640 + x*16)];
*pc = *p1;
pc = (unsigned int *)&fbdata[(4*((y*4)+2) * 640 + x*16)+4];
*pc = *p1;
pc = (unsigned int *)&fbdata[(4*((y*4)+2) * 640 + x*16)+8];
*pc = *p1;
pc = (unsigned int *)&fbdata[(4*((y*4)+2) * 640 + x*16)+12];
*pc = *p1;
pc = (unsigned int *)&fbdata[(4*((y*4)+3) * 640 + x*16)];
*pc = *p1;
pc = (unsigned int *)&fbdata[(4*((y*4)+3) * 640 + x*16)+4];
*pc = *p1;
pc = (unsigned int *)&fbdata[(4*((y*4)+3) * 640 + x*16)+8];
*pc = *p1;
pc = (unsigned int *)&fbdata[(4*((y*4)+3) * 640 + x*16)+12];
*pc = *p1;
#endif
#endif
} }
} }
// write video to v4l2loopback(s)
// write(fdwr0, fb_proc, framesize0); // gray scale Thermal Image
//write(fdwr1, &buf85[28+ThermalSize], JpgSize); // jpg Visual Image
#if 0
fprintf(stderr, "jpgsize %d\n", JpgSize);
{
char fname[64];
int fdf;
snprintf(fname, 64, "frame-%04d.jpg", fcnt++);
fdf=open(fname, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
write (fdf, &buf85[28+ThermalSize], JpgSize);
close(fdf);
}
#endif
if (jpeg_size == 0 && JpgSize > 0) { if (jpeg_size == 0 && JpgSize > 0) {
jpeg_size=JpgSize; jpeg_size=JpgSize;
jpeg_buffer=(unsigned char *)malloc(jpeg_size); jpeg_buffer=(unsigned char *)malloc(jpeg_size);
@ -486,7 +360,6 @@ void vframe(char ep[],char EP_error[], int r, int actual_length, unsigned char b
update_fb(); update_fb();
} }
} }
// free memory // free memory
free(fb_proc); // thermal RAW free(fb_proc); // thermal RAW
free(fb_proc2); // visible jpg free(fb_proc2); // visible jpg

2
debian/control vendored
View file

@ -2,7 +2,7 @@ Source: flirgtk
Maintainer: Nicole Faerber <nicole.faerber@dpin.de> Maintainer: Nicole Faerber <nicole.faerber@dpin.de>
Section: misc Section: misc
Priority: optional Priority: optional
Standards-Version: 3.9.2 Standards-Version: 4.2.1
Build-Depends: Build-Depends:
libgtk-3-dev, libgtk-3-dev,
libjpeg-dev, libjpeg-dev,

6
debian/postinst vendored
View file

@ -1,4 +1,2 @@
# reload udev rules #!/bin/sh
pkg_postinst_${PN}-udevreload () { udevadm control --reload-rules
udevadm control --reload-rules
}

5
debian/postrm vendored
View file

@ -1,4 +1,3 @@
#!/bin/sh
# reload udev rules # reload udev rules
pkg_postrm_${PN}-udevreload () { udevadm control --reload-rules
udevadm control --reload-rules
}

226
flirgtk.c
View file

@ -44,7 +44,7 @@
// UI variables // UI variables
static GtkWidget *window = NULL; static GtkWidget *window = NULL;
static GtkWidget *image_darea = NULL; static GtkWidget *image_darea = NULL;
// static GtkApplication *gapp; static GtkApplication *gapp;
static GtkWidget *play_button, *stop_button; static GtkWidget *play_button, *stop_button;
// we paint everything in here and then into the drawing area widget // we paint everything in here and then into the drawing area widget
static cairo_surface_t *psurface; static cairo_surface_t *psurface;
@ -83,7 +83,7 @@ unsigned char *jpeg_buffer=NULL;
unsigned int jpeg_size=0; unsigned int jpeg_size=0;
static gboolean gboolean
configure_event (GtkWidget *widget, configure_event (GtkWidget *widget,
GdkEventConfigure *event, GdkEventConfigure *event,
gpointer data) gpointer data)
@ -91,16 +91,6 @@ configure_event (GtkWidget *widget,
//GtkAllocation allocation; //GtkAllocation allocation;
// g_printerr("configure event %d x %d\n", allocation.width, allocation.height); // g_printerr("configure event %d x %d\n", allocation.width, allocation.height);
// if (surface)
// cairo_surface_destroy (surface);
// gtk_widget_get_allocation (widget, &allocation);
// surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24,
// 640,
// 500);
// fbdata = cairo_image_surface_get_data(surface);
// memset(fbdata, 0x00, 640*500*4);
// draw_palette();
/* We've handled the configure event, no need for further processing. */ /* We've handled the configure event, no need for further processing. */
return TRUE; return TRUE;
@ -223,6 +213,7 @@ cairo_t *cr;
cairo_restore(cr); cairo_restore(cr);
cairo_surface_destroy (ir_surface); cairo_surface_destroy (ir_surface);
} }
if (jpeg_size != 0 && jpeg_buffer != NULL) { if (jpeg_size != 0 && jpeg_buffer != NULL) {
if (take_vis_shot) { if (take_vis_shot) {
take_vis_shot=FALSE; take_vis_shot=FALSE;
@ -246,44 +237,44 @@ cairo_t *cr;
// then draw decoration on top // then draw decoration on top
// the color palette with min/max temperatures // the color palette with min/max temperatures
if (show_palette) { if (show_palette) {
palette_surface=draw_palette(); palette_surface=draw_palette();
cairo_save(cr); cairo_save(cr);
cairo_rectangle(cr,0,481,640,500); cairo_rectangle(cr,0,481,640,500);
cairo_clip(cr); cairo_clip(cr);
cairo_set_source_surface (cr, palette_surface, 0, 481); cairo_set_source_surface (cr, palette_surface, 0, 481);
cairo_paint (cr); cairo_paint (cr);
cairo_restore(cr); cairo_restore(cr);
} }
if (show_crosshair) { if (show_crosshair) {
// crosshair in the center // crosshair in the center
cairo_set_line_width (cr, 3); cairo_set_line_width (cr, 3);
cairo_set_source_rgb (cr, 0, 0, 0); cairo_set_source_rgb (cr, 0, 0, 0);
cairo_move_to(cr, 320, 200); cairo_move_to(cr, 320, 200);
cairo_line_to(cr, 320, 280); cairo_line_to(cr, 320, 280);
cairo_stroke (cr); cairo_stroke (cr);
cairo_move_to(cr, 280, 240); cairo_move_to(cr, 280, 240);
cairo_line_to(cr, 360, 240); cairo_line_to(cr, 360, 240);
cairo_stroke (cr); cairo_stroke (cr);
cairo_set_line_width (cr, 1); cairo_set_line_width (cr, 1);
cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
cairo_move_to(cr, 320, 200); cairo_move_to(cr, 320, 200);
cairo_line_to(cr, 320, 280); cairo_line_to(cr, 320, 280);
cairo_stroke (cr); cairo_stroke (cr);
cairo_move_to(cr, 280, 240); cairo_move_to(cr, 280, 240);
cairo_line_to(cr, 360, 240); cairo_line_to(cr, 360, 240);
cairo_stroke (cr); cairo_stroke (cr);
// print center temperature near crosshair // print center temperature near crosshair
snprintf(tdisp, 16, "%.1f°C", t_center); snprintf(tdisp, 16, "%.1f°C", t_center);
cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
cairo_select_font_face (cr, "Sans", cairo_select_font_face (cr, "Sans",
CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
cairo_set_font_size (cr, 24); cairo_set_font_size (cr, 24);
cairo_move_to (cr, 330, 220); cairo_move_to (cr, 330, 220);
cairo_show_text (cr, tdisp); cairo_show_text (cr, tdisp);
} }
// print battery % top right // print battery % top right
if (show_battery) { if (show_battery) {
@ -387,8 +378,10 @@ static void
close_window (void) close_window (void)
{ {
// clean up and quit // clean up and quit
window = NULL; //window = NULL;
gtk_main_quit(); // gtk_main_quit();
// g_application_quit(gapp);
gtk_application_remove_window(gapp, GTK_WINDOW(window));
} }
void void
@ -427,7 +420,9 @@ tempreflected_changed (GtkSpinButton *spin_button, gpointer user_data)
} }
void void
ir_settings_activate(GtkMenuItem *menuitem, gpointer user_data) ir_settings_activate(GSimpleAction *simple,
GVariant *parameter,
gpointer user_data)
{ {
GtkWidget *dialog, *hb, *c, *vb, *w; GtkWidget *dialog, *hb, *c, *vb, *w;
GtkDialogFlags flags = GTK_DIALOG_USE_HEADER_BAR /*| GTK_DIALOG_MODAL*/ | GTK_DIALOG_DESTROY_WITH_PARENT; GtkDialogFlags flags = GTK_DIALOG_USE_HEADER_BAR /*| GTK_DIALOG_MODAL*/ | GTK_DIALOG_DESTROY_WITH_PARENT;
@ -516,7 +511,9 @@ show_crosshair_toggled (GtkToggleButton *togglebutton, gpointer user_data)
} }
void void
ui_settings_activate(GtkMenuItem *menuitem, gpointer user_data) ui_settings_activate (GSimpleAction *simple,
GVariant *parameter,
gpointer user_data)
{ {
GtkWidget *dialog, *hb, *c, *vb, *w; GtkWidget *dialog, *hb, *c, *vb, *w;
GtkDialogFlags flags = GTK_DIALOG_USE_HEADER_BAR /*| GTK_DIALOG_MODAL*/ | GTK_DIALOG_DESTROY_WITH_PARENT; GtkDialogFlags flags = GTK_DIALOG_USE_HEADER_BAR /*| GTK_DIALOG_MODAL*/ | GTK_DIALOG_DESTROY_WITH_PARENT;
@ -584,7 +581,10 @@ vis_y_offset_changed (GtkSpinButton *spin_button, gpointer user_data)
} }
void void
vis_settings_activate(GtkMenuItem *menuitem, gpointer user_data) vis_settings_activate
(GSimpleAction *simple,
GVariant *parameter,
gpointer user_data)
{ {
GtkWidget *dialog, *hb, *c, *vb, *w; GtkWidget *dialog, *hb, *c, *vb, *w;
GtkDialogFlags flags = GTK_DIALOG_USE_HEADER_BAR /*| GTK_DIALOG_MODAL*/ | GTK_DIALOG_DESTROY_WITH_PARENT; GtkDialogFlags flags = GTK_DIALOG_USE_HEADER_BAR /*| GTK_DIALOG_MODAL*/ | GTK_DIALOG_DESTROY_WITH_PARENT;
@ -652,55 +652,62 @@ GtkDialogFlags flags = GTK_DIALOG_USE_HEADER_BAR /*| GTK_DIALOG_MODAL*/ | GTK_DI
gtk_widget_destroy(dialog); gtk_widget_destroy(dialog);
} }
GtkWidget *
create_main_window (void) void
quit_activate
(GSimpleAction *simple,
GVariant *parameter,
gpointer user_data)
{
close_window ();
}
void
create_main_window (GtkWidget *appwindow)
{ {
//GtkWidget *gappw; //GtkWidget *gappw;
GtkWidget *box; GtkWidget *box;
GtkWidget *hbox; GtkWidget *hbox;
GtkWidget *w, *i; GtkWidget *w, *i;
GtkWidget *m, *mi; //GtkWidget *m, *mi;
GMenu *menu;
// GtkWidget *da; GActionGroup *group;
const GActionEntry entries[] = {
{ "uisettings", ui_settings_activate },
{ "irsettings", ir_settings_activate },
{ "vissettings", vis_settings_activate },
{ "quit", quit_activate },
};
// init default color palette // init default color palette
color_palette = palette_Rainbow; color_palette = palette_Rainbow;
// gappw=gtk_application_window_new(gapp); // gappw=gtk_application_window_new(gapp);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL); // window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
window = appwindow;
gtk_window_set_title (GTK_WINDOW (window), "FLIR One"); gtk_window_set_title (GTK_WINDOW (window), "FLIR One");
w=gtk_header_bar_new(); w=gtk_header_bar_new();
gtk_header_bar_set_show_close_button (GTK_HEADER_BAR(w), TRUE); gtk_header_bar_set_show_close_button (GTK_HEADER_BAR(w), TRUE);
gtk_header_bar_set_decoration_layout (GTK_HEADER_BAR(w), ":menu,close"); gtk_header_bar_set_decoration_layout (GTK_HEADER_BAR(w), ":menu,close");
// i = gtk_button_new_from_icon_name("open-menu-symbolic", GTK_ICON_SIZE_BUTTON);
i=gtk_menu_button_new(); i=gtk_menu_button_new();
m=gtk_menu_new(); group = (GActionGroup*)g_simple_action_group_new ();
mi=gtk_menu_item_new_with_label("UI Settings"); g_action_map_add_action_entries (G_ACTION_MAP (group), entries, G_N_ELEMENTS (entries), NULL);
gtk_menu_shell_append(GTK_MENU_SHELL(m), mi); menu=g_menu_new();
g_signal_connect (mi, "activate", g_menu_append(menu, "UI Settings", "menu.uisettings");
G_CALLBACK (ui_settings_activate), NULL); g_menu_append(menu, "IR Settings", "menu.irsettings");
mi=gtk_menu_item_new_with_label("IR Settings"); g_menu_append(menu, "Vis Settings", "menu.vissettings");
gtk_menu_shell_append(GTK_MENU_SHELL(m), mi); g_menu_append(menu, "Quit", "menu.quit");
g_signal_connect (mi, "activate",
G_CALLBACK (ir_settings_activate), NULL); gtk_widget_insert_action_group(i, "menu", group);
mi=gtk_menu_item_new_with_label("Vis Settings"); gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(i), G_MENU_MODEL(menu));
gtk_menu_shell_append(GTK_MENU_SHELL(m), mi);
g_signal_connect (mi, "activate",
G_CALLBACK (vis_settings_activate), NULL);
mi=gtk_separator_menu_item_new ();
gtk_menu_shell_append(GTK_MENU_SHELL(m), mi);
mi=gtk_menu_item_new_with_label("Quit");
gtk_menu_shell_append(GTK_MENU_SHELL(m), mi);
g_signal_connect (mi, "activate",
G_CALLBACK (gtk_main_quit), NULL);
gtk_menu_button_set_use_popover(GTK_MENU_BUTTON(i), TRUE); gtk_menu_button_set_use_popover(GTK_MENU_BUTTON(i), TRUE);
gtk_menu_button_set_popup (GTK_MENU_BUTTON(i), m); gtk_menu_button_set_direction(GTK_MENU_BUTTON(i), GTK_ARROW_NONE);
gtk_widget_show_all(m);
gtk_header_bar_pack_end(GTK_HEADER_BAR(w),i); gtk_header_bar_pack_end(GTK_HEADER_BAR(w),i);
gtk_window_set_titlebar(GTK_WINDOW (window), w); gtk_window_set_titlebar(GTK_WINDOW (window), w);
// g_signal_connect (w, "clicked",
// G_CALLBACK (menu_clicked), NULL);
g_signal_connect (window, "destroy", g_signal_connect (window, "destroy",
G_CALLBACK (close_window), NULL); G_CALLBACK (close_window), NULL);
@ -714,8 +721,6 @@ GtkWidget *m, *mi;
// 48 GTK_ICON_SIZE_DIALOG // 48 GTK_ICON_SIZE_DIALOG
// 32 GTK_ICON_SIZE_DND // 32 GTK_ICON_SIZE_DND
// media-playback-start // media-playback-start
// w = gtk_button_new_with_label("Start");
// w = gtk_button_new_from_icon_name("media-playback-start", GTK_ICON_SIZE_DND);
play_button = gtk_toggle_button_new(); play_button = gtk_toggle_button_new();
i = gtk_image_new_from_icon_name("media-playback-start", GTK_ICON_SIZE_DND); i = gtk_image_new_from_icon_name("media-playback-start", GTK_ICON_SIZE_DND);
gtk_button_set_image(GTK_BUTTON(play_button),i); gtk_button_set_image(GTK_BUTTON(play_button),i);
@ -724,9 +729,6 @@ GtkWidget *m, *mi;
g_signal_connect (play_button, "clicked", g_signal_connect (play_button, "clicked",
G_CALLBACK (start_clicked), NULL); G_CALLBACK (start_clicked), NULL);
// media-playback-stop
// w = gtk_button_new_with_label("Stop");
//w = gtk_button_new_from_icon_name("media-playback-stop", GTK_ICON_SIZE_DND);
stop_button = gtk_toggle_button_new(); stop_button = gtk_toggle_button_new();
i = gtk_image_new_from_icon_name("media-playback-stop", GTK_ICON_SIZE_DND); i = gtk_image_new_from_icon_name("media-playback-stop", GTK_ICON_SIZE_DND);
gtk_button_set_image(GTK_BUTTON(stop_button),i); gtk_button_set_image(GTK_BUTTON(stop_button),i);
@ -736,25 +738,6 @@ GtkWidget *m, *mi;
g_signal_connect (stop_button, "clicked", g_signal_connect (stop_button, "clicked",
G_CALLBACK (stop_clicked), NULL); G_CALLBACK (stop_clicked), NULL);
// drop down for color palettes
#if 0
w = gtk_combo_box_text_new();
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT(w), NULL, "7");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT(w), NULL, "15");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT(w), NULL, "17");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT(w), NULL, "85");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT(w), NULL, "92");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT(w), NULL, "Grayscale");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT(w), NULL, "Grey");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT(w), NULL, "Iron 2");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT(w), NULL, "Iron Black");
gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT(w), NULL, "Rainbow");
gtk_combo_box_set_active (GTK_COMBO_BOX(w), 9);
gtk_container_add (GTK_CONTAINER (hbox), w);
g_signal_connect (w, "changed",
G_CALLBACK (palette_changed), NULL);
#endif
w = gtk_toggle_button_new_with_label("IR"); w = gtk_toggle_button_new_with_label("IR");
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), TRUE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), TRUE);
gtk_container_add (GTK_CONTAINER (hbox), w); gtk_container_add (GTK_CONTAINER (hbox), w);
@ -767,8 +750,6 @@ GtkWidget *m, *mi;
g_signal_connect (w, "clicked", g_signal_connect (w, "clicked",
G_CALLBACK (viscam_clicked), NULL); G_CALLBACK (viscam_clicked), NULL);
// w = gtk_scale_new_with_range (GTK_ORIENTATION_VERTICAL, 0.0, 1.0, .01);
psurface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 640, 500); psurface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 640, 500);
image_darea = gtk_drawing_area_new (); image_darea = gtk_drawing_area_new ();
@ -789,18 +770,33 @@ GtkWidget *m, *mi;
gtk_widget_show_all(window); gtk_widget_show_all(window);
return window; // return window;
}
void
flirgtk_app_activate (GApplication *application, gpointer user_data)
{
GtkWidget *widget;
widget = gtk_application_window_new (GTK_APPLICATION (application));
create_main_window(widget);
gtk_window_present (GTK_WINDOW(widget));
} }
int int
main(int argc, char **argv) main (int argc, char **argv)
{ {
// gapp=gtk_application_new("org.gnome.flirgtk", G_APPLICATION_FLAGS_NONE); gapp=gtk_application_new("org.gnome.flirgtk", G_APPLICATION_FLAGS_NONE);
gtk_init(&argc, &argv); // gtk_init(&argc, &argv);
create_main_window(); //create_main_window();
g_signal_connect(gapp, "activate", G_CALLBACK (flirgtk_app_activate), NULL);
gtk_main(); g_application_run (G_APPLICATION (gapp), argc, argv);
g_object_unref (gapp);
// gtk_main();
return 0; return 0;
} }

12
flirgtk.desktop Normal file
View file

@ -0,0 +1,12 @@
[Desktop Entry]
Type=Application
Name=FlirGTK
GenericName=FlirGTK
Comment=Live view and picture taking with FLIR ONE USB IR camera
Comment[de]=Live view and picture taking with FLIR ONE USB IR camera
Icon=flirgtk
StartupNotify=true
Terminal=false
Exec=flirgtk
Categories=GTK;GNOME;Utility;
Keywords=flir;

BIN
flirgtk.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB