f.tools.cc (fotoxx-22.30) | : | f.tools.cc (fotoxx-22.35) | ||
---|---|---|---|---|
skipping to change at line 28 | skipping to change at line 28 | |||
******************************************************************************** * | ******************************************************************************** * | |||
Fotoxx image edit - Tools menu functions | Fotoxx image edit - Tools menu functions | |||
m_index dialog to create/update image index file | m_index dialog to create/update image index file | |||
index_rebuild create/update image index file | index_rebuild create/update image index file | |||
m_quick_index quick incremental index rebuild, no UI | m_quick_index quick incremental index rebuild, no UI | |||
index_rebuild_old use old image index file without updates | index_rebuild_old use old image index file without updates | |||
m_move_fotoxx_home move fotoxx home folder from default ~/.fotoxx | m_move_fotoxx_home move fotoxx home folder from default ~/.fotoxx | |||
m_preferences user preferences and settings dialog | m_settings user preferences and settings dialog | |||
m_KB_shortcuts edit keyboard shortcuts | m_KB_shortcuts edit keyboard shortcuts | |||
KB_shortcuts_load load KB shortcuts file into memory | KB_shortcuts_load load KB shortcuts file into memory | |||
KB_shortcuts_merge merge default + user-defined shortcuts | KB_shortcuts_merge merge default + user-defined shortcuts | |||
m_RGB_dist show RGB brightness distribution graph | m_RGB_dist show RGB brightness distribution graph | |||
m_magnify magnify the image within a radius of the mouse | m_magnify magnify the image within a radius of the mouse | |||
m_duplicates find all duplicated images | m_duplicates find all duplicated images | |||
m_measure_image measure distances within an image // 22.35 | ||||
m_show_RGB show RGB values for clicked image positions | m_show_RGB show RGB values for clicked image positions | |||
m_popup_text show popup text for edit widget insertion // 22.15 | m_popup_text show popup text for edit widget insertion // 22.15 | |||
m_calibrate_printer printer color calibration | m_calibrate_printer printer color calibration | |||
print_calibrated print current image file with calibrated colors | print_calibrated print current image file with calibrated colors | |||
m_grid_settings configure grid lines | m_grid_settings configure grid lines | |||
m_toggle_grid toggle grid lines on/off | m_toggle_grid toggle grid lines on/off | |||
m_line_color choose color for foreground lines | m_line_color choose color for foreground lines | |||
m_darkbrite highlight darkest and brightest pixels | m_darkbrite highlight darkest and brightest pixels | |||
m_monitor_color monitor color and contrast check | m_monitor_color monitor color and contrast check | |||
m_monitor_gamma monitor gamma check and adjust | m_monitor_gamma monitor gamma check and adjust | |||
skipping to change at line 462 | skipping to change at line 463 | |||
fid = fopen(image_folders_file,"w"); // create stump index config file | fid = fopen(image_folders_file,"w"); // create stump index config file | |||
if (! fid) { // (thumbnails folder only) | if (! fid) { // (thumbnails folder only) | |||
zmessageACK(Mwin,"index config file error: %s",strerror(errno)); | zmessageACK(Mwin,"index config file error: %s",strerror(errno)); | |||
quitxx(); | quitxx(); | |||
} | } | |||
fprintf(fid,"thumbnails: %s\n",thumbfolder); | fprintf(fid,"thumbnails: %s\n",thumbfolder); | |||
fclose(fid); | fclose(fid); | |||
} | } | |||
if (! dirfile(thumbfolder)) { // create thumbnails folder if needed | if (! dirfile(thumbfolder)) { // create thumbnails folder if needed | |||
err = zshell("ack","mkdir -p -m 0750 \"%s\" ",thumbfolder); | err = zshell("log ack","mkdir -p -m 0750 \"%s\" ",thumbfolder); | |||
if (err) quitxx(); | if (err) quitxx(); | |||
} | } | |||
Nthumb = 1; | Nthumb = 1; | |||
Plog(1,"thumbnails folder: \n"); // print thumbnails folder | Plog(1,"thumbnails folder: \n"); // print thumbnails folder | |||
Plog(1," %s \n",thumbfolder); | Plog(1," %s \n",thumbfolder); | |||
Ntopfolders = 0; // no top image folders | Ntopfolders = 0; // no top image folders | |||
Plog(1,"no image index: reports disabled \n"); // no image index | Plog(1,"no image index: reports disabled \n"); // no image index | |||
Findexvalid = 0; | Findexvalid = 0; | |||
skipping to change at line 494 | skipping to change at line 495 | |||
goto cleanup; | goto cleanup; | |||
} | } | |||
cc = strlen(thumbfolder) - 11 ; // check /thumbnails name | cc = strlen(thumbfolder) - 11 ; // check /thumbnails name | |||
if (! strmatch(thumbfolder+cc,"/thumbnails")) { | if (! strmatch(thumbfolder+cc,"/thumbnails")) { | |||
zmessageACK(Mwin,thumberr,thumbfolder); | zmessageACK(Mwin,thumberr,thumbfolder); | |||
goto cleanup; | goto cleanup; | |||
} | } | |||
if (! dirfile(thumbfolder)) { // create thumbnails folder if needed | if (! dirfile(thumbfolder)) { // create thumbnails folder if needed | |||
err = zshell("ack","mkdir -p -m 0750 \"%s\" ",thumbfolder); | err = zshell("log ack","mkdir -p -m 0750 \"%s\" ",thumbfolder); | |||
if (err) quitxx(); | if (err) quitxx(); | |||
} | } | |||
for (ii = 0; ii < Ntopfolders; ii++) { // disallow top dir = thumbnail dir | for (ii = 0; ii < Ntopfolders; ii++) { // disallow top dir = thumbnail dir | |||
if (strmatch(topfolders[ii],thumbfolder)) { | if (strmatch(topfolders[ii],thumbfolder)) { | |||
zmessageACK(Mwin,indexerr2,topfolders[ii]); | zmessageACK(Mwin,indexerr2,topfolders[ii]); | |||
goto cleanup; | goto cleanup; | |||
} | } | |||
} | } | |||
skipping to change at line 1093 | skipping to change at line 1094 | |||
nkey = 12; // add keys for indexed metadata | nkey = 12; // add keys for indexed metadata | |||
for (ii = 0; ii < MXmax; ii++) { // from exifkeys[12] | for (ii = 0; ii < MXmax; ii++) { // from exifkeys[12] | |||
if (! xmeta_keys[ii]) break; | if (! xmeta_keys[ii]) break; | |||
exifkeys[nkey] = xmeta_keys[ii]; | exifkeys[nkey] = xmeta_keys[ii]; | |||
nkey++; | nkey++; | |||
} | } | |||
err = exif_get(file,exifkeys,ppv,nkey); // get exif/iptc metadata | err = exif_get(file,exifkeys,ppv,nkey); // get exif/iptc metadata | |||
if (err) { | if (err) { | |||
Plog(1,"exif_get() failure: %s \n",file); // metadata unreadable | Plog(0,"exif_get() failure: %s \n",file); // metadata unreadable | |||
goto exit_thread; | goto exit_thread; | |||
} | } | |||
exiffile = ppv[0]; // base file name | exiffile = ppv[0]; // base file name | |||
pp = strrchr(file,'/'); | pp = strrchr(file,'/'); | |||
if (! exiffile || ! strmatch(exiffile,pp+1)) { // image file has no metadata | if (! exiffile || ! strmatch(exiffile,pp+1)) { // image file has no metadata | |||
Plog(1,"exif_get() no data: %s \n",file); | Plog(0,"exif_get() no data: %s \n",file); | |||
goto exit_thread; | goto exit_thread; | |||
} | } | |||
exifdate = ppv[1]; // exif/iptc metadata returned | exifdate = ppv[1]; // exif/iptc metadata returned | |||
iptctags = ppv[2]; // 12 fixed keys | iptctags = ppv[2]; // 12 fixed keys | |||
iptcrating = ppv[3]; | iptcrating = ppv[3]; | |||
exifww = ppv[4]; | exifww = ppv[4]; | |||
exifhh = ppv[5]; | exifhh = ppv[5]; | |||
iptctitle = ppv[6]; | iptctitle = ppv[6]; | |||
iptcdesc = ppv[7]; | iptcdesc = ppv[7]; | |||
skipping to change at line 1177 | skipping to change at line 1178 | |||
xxrec_tab[xrec]->flongi = flongi; | xxrec_tab[xrec]->flongi = flongi; | |||
} | } | |||
xcc = 0; | xcc = 0; | |||
for (ii = 12; ii < nkey; ii++) // extra indexed metadata if any | for (ii = 12; ii < nkey; ii++) // extra indexed metadata if any | |||
{ | { | |||
if (! ppv[ii]) continue; | if (! ppv[ii]) continue; | |||
acc = strlen(exifkeys[ii]) + strlen(ppv[ii]) + 3; | acc = strlen(exifkeys[ii]) + strlen(ppv[ii]) + 3; | |||
if (acc > 100 || acc + xcc > 998) { // limit each key < 100, all < 1000 | if (acc > 100 || acc + xcc > 998) { // limit each key < 100, all < 1000 | |||
Plog(1,"indexed metadata too big: %s %s \n",exifkeys[ii],file); | Plog(0,"indexed metadata too big: %s %s \n",exifkeys[ii],file); | |||
continue; | continue; | |||
} | } | |||
strcpy(xmetarec+xcc,exifkeys[ii]); // construct series | strcpy(xmetarec+xcc,exifkeys[ii]); // construct series | |||
xcc += strlen(exifkeys[ii]); // "keyname=keydata^ " | xcc += strlen(exifkeys[ii]); // "keyname=keydata^ " | |||
xmetarec[xcc++] = '='; | xmetarec[xcc++] = '='; | |||
strcpy(xmetarec+xcc,ppv[ii]); | strcpy(xmetarec+xcc,ppv[ii]); | |||
xcc += strlen(ppv[ii]); | xcc += strlen(ppv[ii]); | |||
strcpy(xmetarec+xcc,"^ "); | strcpy(xmetarec+xcc,"^ "); | |||
xcc += 2; | xcc += 2; | |||
zfree(ppv[ii]); | zfree(ppv[ii]); | |||
skipping to change at line 1296 | skipping to change at line 1297 | |||
void m_quick_index(GtkWidget *, cchar *) | void m_quick_index(GtkWidget *, cchar *) | |||
{ | { | |||
char *galleryname = 0; | char *galleryname = 0; | |||
F1_help_topic = "quick index"; | F1_help_topic = "quick index"; | |||
Plog(1,"m_quick_index \n"); | Plog(1,"m_quick_index \n"); | |||
if (Fblock(0,"blocked edits")) return; // check nothing pending | if (Fblock(0,"blocked edits")) return; // check nothing pending | |||
if (navi::galleryname && navi::gallerytype == GDIR) // save current gallery | if (navi::galleryname && navi::gallerytype == FOLDER) // save current gallery | |||
galleryname = zstrdup(navi::galleryname,"quick-index"); | galleryname = zstrdup(navi::galleryname,"quick-index"); | |||
index_rebuild(2,0); // run incremental index | index_rebuild(2,0); // run incremental index | |||
if (galleryname) { | if (galleryname) { | |||
gallery(galleryname,"init",0); // restore gallery and scroll position | gallery(galleryname,"init",0); // restore gallery and scroll position | |||
zfree(galleryname); | zfree(galleryname); | |||
gallery_memory("get"); | gallery_memory("get"); | |||
gallery(0,"paint",-1); | gallery(0,"paint",-1); | |||
} | } | |||
skipping to change at line 1448 | skipping to change at line 1449 | |||
zmessageACK(Mwin,"new home same as old home"); | zmessageACK(Mwin,"new home same as old home"); | |||
goto retry; | goto retry; | |||
} | } | |||
yn = zmessageYN(Mwin,mess1,oldhome,newhome); // ask user to proceed | yn = zmessageYN(Mwin,mess1,oldhome,newhome); // ask user to proceed | |||
if (! yn) goto retry; | if (! yn) goto retry; | |||
Plog(1,"%s \n",mess3); // popup "moving files ..." | Plog(1,"%s \n",mess3); // popup "moving files ..." | |||
poptext_mouse(mess3,0,0,0,0); | poptext_mouse(mess3,0,0,0,0); | |||
err = zshell("ack","cp -p -R %s/* %s",oldhome,newhome); // copy all files from old home to new | err = zshell("log ack","cp -p -R %s/* %s",oldhome,newhome); // copy all files from old home to new | |||
if (err) quitxx(); | if (err) quitxx(); | |||
zmainsleep(2); | zmainsleep(2); | |||
poptext_mouse(0,0,0,0,0); // kill popup | poptext_mouse(0,0,0,0,0); // kill popup | |||
strcpy(new_image_folders_file,newhome); // construct new image folders file | strcpy(new_image_folders_file,newhome); // construct new image folders file | |||
pp = image_folders_file + strlen(oldhome); // from newhome + old file name | pp = image_folders_file + strlen(oldhome); // from newhome + old file name | |||
strcat(new_image_folders_file,pp); | strcat(new_image_folders_file,pp); | |||
Plog(0,"new image folders file: %s \n",new_image_folders_file); | Plog(0,"new image folders file: %s \n",new_image_folders_file); | |||
skipping to change at line 1500 | skipping to change at line 1501 | |||
new_session(0); // start fotoxx again | new_session(0); // start fotoxx again | |||
zsleep(1); // delay before SIGTERM in quitxx() | zsleep(1); // delay before SIGTERM in quitxx() | |||
quitxx(); // exit this session | quitxx(); // exit this session | |||
return; | return; | |||
} | } | |||
/******************************************************************************* */ | /******************************************************************************* */ | |||
// user preferences and settings dialog | // user preferences and settings dialog | |||
namespace preferences | namespace settings | |||
{ | { | |||
cchar *startopt[8][2] = { | cchar *startopt[8][2] = { | |||
{ "recent", "Recent Files Gallery" }, // fotoxx startup view options | { "recent", "Recent Files Gallery" }, // fotoxx startup view options | |||
{ "newest", "Newest Files Gallery" }, | { "newest", "Newest Files Gallery" }, | |||
{ "specG", "Specific Gallery" }, | { "specG", "Specific Gallery" }, | |||
{ "album", "Album Gallery" }, | { "album", "Album Gallery" }, | |||
{ "prevG", "Previous Gallery" }, | { "prevG", "Previous Gallery" }, | |||
{ "prevF", "Previous File" }, | { "prevF", "Previous File" }, | |||
{ "specF", "Specific File" }, | { "specF", "Specific File" }, | |||
{ "blank", "Blank Window" } }; | { "blank", "Blank Window" } }; | |||
skipping to change at line 1525 | skipping to change at line 1526 | |||
{ "LZW", "5" }, | { "LZW", "5" }, | |||
{ "PACKBITS", "32773" }, | { "PACKBITS", "32773" }, | |||
{ "DEFLATE", "8" } }; | { "DEFLATE", "8" } }; | |||
int NTO = 4; | int NTO = 4; | |||
int Frestart; | int Frestart; | |||
} | } | |||
// menu function | // menu function | |||
void m_preferences(GtkWidget *, cchar *) | void m_settings(GtkWidget *, cchar *) | |||
{ | { | |||
using namespace preferences; | using namespace settings; | |||
int preferences_dialog_event(zdialog *zd, cchar *event); | int settings_dialog_event(zdialog *zd, cchar *event); | |||
zdialog *zd; | zdialog *zd; | |||
int ii; | int ii; | |||
char txrgb[20], pct_scale[40]; | char txrgb[20], pct_scale[40]; | |||
snprintf(pct_scale,40,"separation, %c of scale",'%'); // "separation, % of scale" | snprintf(pct_scale,40,"separation, %c of scale",'%'); // "separation, % of scale" | |||
/*** | /*** | |||
____________________________________________________________________ | ____________________________________________________________________ | |||
| Preferences and Settings | | | Preferences and Settings | | |||
skipping to change at line 1557 | skipping to change at line 1558 | |||
| Pan Mode | (o) drag (o) scroll [x] fast | | | Pan Mode | (o) drag (o) scroll [x] fast | | |||
| JPEG files | [ 90 ] quality level | | | JPEG files | [ 90 ] quality level | | |||
| TIFF files | [ LZW |v] compression method | | | TIFF files | [ LZW |v] compression method | | |||
| Curve Node | [ 5 ] separation, % of scale | | | Curve Node | [ 5 ] separation, % of scale | | |||
| Map Markers | [ 9 ] pixel size | | | Map Markers | [ 9 ] pixel size | | |||
| Overlay Text | [ 80 ] [ 100 ] line length range (chars) | // 22.18 | | Overlay Text | [ 80 ] [ 100 ] line length range (chars) | // 22.18 | |||
| Image Position | (o) centered (o) right side | | | Image Position | (o) centered (o) right side | | |||
| Confirm Exit | [x] Confirm Fotoxx exit | | | Confirm Exit | [x] Confirm Fotoxx exit | | |||
| Index Level | [ 2 ] command (2) [ 1 ] file manager (1) | | | Index Level | [ 2 ] command (2) [ 1 ] file manager (1) | | |||
| Log Level | (o) errors (o) info (o) dialog inputs | | | Log Level | (o) errors (o) info (o) dialog inputs | | |||
| Max. Threads | [ 8 ] max. working threads | // 22.35 | ||||
| RAW loader | (o) dcraw (o) Raw Therapee (o) Darktable | | | RAW loader | (o) dcraw (o) Raw Therapee (o) Darktable | | |||
| RAW Options | [x] auto brighten [x] embedded image profile | | | RAW Options | [x] auto brighten [x] embedded image profile | | |||
| RAW Command | (o) [_____________________________________] | // 22.35 | ||||
| RAW files | [ .cr2 .dng .raf .nef .orf .mpo .rw2 .raw ] | | | RAW files | [ .cr2 .dng .raf .nef .orf .mpo .rw2 .raw ] | | |||
| Video Files | [ .mp4 .mov .wmv .mpeg .mpg .h264 .webm ] | | | Video Files | [ .mp4 .mov .wmv .mpeg .mpg .h264 .webm ] | | |||
| Video App | [ vlc |v] | | | Video App | [ vlc -q |v] | | |||
| | | | | | |||
| [ OK ] | | | [ OK ] | | |||
|____________________________________________________________________| | |____________________________________________________________________| | |||
***/ | ***/ | |||
F1_help_topic = "preferences"; | F1_help_topic = "settings"; | |||
Plog(1,"m_preferences \n"); | Plog(1,"m_settings \n"); | |||
if (Fblock("preferences","block edits")) return; // check pending, block | if (Fblock("settings","block edits")) return; // check pending, block | |||
zd = zdialog_new("Preferences and Settings",Mwin,"OK",null); | zd = zdialog_new("Preferences and Settings",Mwin,"OK",null); | |||
// left and right vertical boxes | // left and right vertical boxes | |||
zdialog_add_widget(zd,"scrwin","swmain","dialog",0,"expand"); | zdialog_add_widget(zd,"scrwin","swmain","dialog",0,"expand"); | |||
zdialog_add_widget(zd,"hbox","hb1","swmain"); | zdialog_add_widget(zd,"hbox","hb1","swmain"); | |||
zdialog_add_widget(zd,"vbox","vb1","hb1",0,"space=2|homog"); | zdialog_add_widget(zd,"vbox","vb1","hb1",0,"space=2|homog"); | |||
zdialog_add_widget(zd,"vsep","sep1","hb1",0,"space=10"); | zdialog_add_widget(zd,"vsep","sep1","hb1",0,"space=10"); | |||
zdialog_add_widget(zd,"vbox","vb2","hb1",0,"space=2|homog"); | zdialog_add_widget(zd,"vbox","vb2","hb1",0,"space=2|homog"); | |||
skipping to change at line 1696 | skipping to change at line 1699 | |||
zdialog_add_widget(zd,"zspin","fmindexlev","hbxlev","0|2|1|1","size=3"); | zdialog_add_widget(zd,"zspin","fmindexlev","hbxlev","0|2|1|1","size=3"); | |||
zdialog_add_widget(zd,"label","labfmxlev2","hbxlev","file manager (1)","space =5"); | zdialog_add_widget(zd,"label","labfmxlev2","hbxlev","file manager (1)","space =5"); | |||
// log level | // log level | |||
zdialog_add_widget(zd,"label","log level","vb1","Log Level"); | zdialog_add_widget(zd,"label","log level","vb1","Log Level"); | |||
zdialog_add_widget(zd,"hbox","hbloglev","vb2"); | zdialog_add_widget(zd,"hbox","hbloglev","vb2"); | |||
zdialog_add_widget(zd,"radio","logerrs","hbloglev","errors"); | zdialog_add_widget(zd,"radio","logerrs","hbloglev","errors"); | |||
zdialog_add_widget(zd,"radio","loginfo","hbloglev","+ info messages","space=6 "); | zdialog_add_widget(zd,"radio","loginfo","hbloglev","+ info messages","space=6 "); | |||
zdialog_add_widget(zd,"radio","loginputs","hbloglev","+ dialog inputs","space =6"); | zdialog_add_widget(zd,"radio","loginputs","hbloglev","+ dialog inputs","space =6"); | |||
// max. working threads | ||||
// 22.35 | ||||
zdialog_add_widget(zd,"label","max threads","vb1","Max. Threads"); | ||||
zdialog_add_widget(zd,"hbox","hbmwt","vb2"); | ||||
zdialog_add_widget(zd,"zspin","max_threads","hbmwt","2|16|1|4","size=3"); | ||||
zdialog_add_widget(zd,"label","labmwt","hbmwt","max. working threads","space= | ||||
10"); | ||||
// RAW file loader | // RAW file loader | |||
zdialog_add_widget(zd,"label","raw loader","vb1","RAW Loader"); | zdialog_add_widget(zd,"label","raw loader","vb1","RAW Loader"); | |||
zdialog_add_widget(zd,"hbox","hbrfl","vb2"); | zdialog_add_widget(zd,"hbox","hbrfl","vb2"); | |||
zdialog_add_widget(zd,"radio","dcraw","hbrfl","dcraw"); | zdialog_add_widget(zd,"radio","dcraw","hbrfl","dcraw"); | |||
zdialog_add_widget(zd,"radio","rawtherapee","hbrfl","RawTherapee","space=10") ; | zdialog_add_widget(zd,"radio","rawtherapee","hbrfl","RawTherapee","space=10") ; | |||
zdialog_add_widget(zd,"radio","darktable","hbrfl","Darktable","space=10"); | zdialog_add_widget(zd,"radio","darktable","hbrfl","Darktable","space=8"); | |||
zdialog_add_widget(zd,"radio","customraw","hbrfl","Custom Command","space=8") | ||||
; | ||||
// custom RAW command | ||||
// 22.35 | ||||
zdialog_add_widget(zd,"label","raw command","vb1"," "); | ||||
zdialog_add_widget(zd,"hbox","hbrc","vb2"); | ||||
zdialog_add_widget(zd,"zentry","rawcommand","hbrc","...","space=5|size=50"); | ||||
// RAW conversion options | // RAW conversion options | |||
zdialog_add_widget(zd,"label","raw options","vb1","RAW Options"); | zdialog_add_widget(zd,"label","raw options","vb1","RAW Options"); | |||
zdialog_add_widget(zd,"hbox","hbrc","vb2"); | zdialog_add_widget(zd,"hbox","hbrc","vb2"); | |||
zdialog_add_widget(zd,"check","autobright","hbrc","auto brighten"); | zdialog_add_widget(zd,"check","autobright","hbrc","auto brighten"); | |||
zdialog_add_widget(zd,"check","matchthumb","hbrc","embedded image profile","s pace=10"); | zdialog_add_widget(zd,"check","matchthumb","hbrc","embedded image profile","s pace=10"); | |||
// RAW file types | // RAW file types | |||
zdialog_add_widget(zd,"label","raw files","vb1","RAW Files"); | zdialog_add_widget(zd,"label","raw files","vb1","RAW Files"); | |||
zdialog_add_widget(zd,"hbox","hbrft","vb2"); | zdialog_add_widget(zd,"hbox","hbrft","vb2"); | |||
skipping to change at line 1805 | skipping to change at line 1820 | |||
zdialog_stuff(zd,"indexlev",Findexlev); // index level, always | zdialog_stuff(zd,"indexlev",Findexlev); // index level, always | |||
zdialog_stuff(zd,"fmindexlev",FMindexlev); // index level, file manager call | zdialog_stuff(zd,"fmindexlev",FMindexlev); // index level, file manager call | |||
zdialog_stuff(zd,"logerrs",0); // message log level | zdialog_stuff(zd,"logerrs",0); // message log level | |||
zdialog_stuff(zd,"loginfo",0); | zdialog_stuff(zd,"loginfo",0); | |||
zdialog_stuff(zd,"loginputs",0); | zdialog_stuff(zd,"loginputs",0); | |||
if (zfuncs::Floglevel == 0) zdialog_stuff(zd,"logerrs",1); | if (zfuncs::Floglevel == 0) zdialog_stuff(zd,"logerrs",1); | |||
if (zfuncs::Floglevel == 1) zdialog_stuff(zd,"loginfo",1); | if (zfuncs::Floglevel == 1) zdialog_stuff(zd,"loginfo",1); | |||
if (zfuncs::Floglevel == 2) zdialog_stuff(zd,"loginputs",1); | if (zfuncs::Floglevel == 2) zdialog_stuff(zd,"loginputs",1); | |||
zdialog_stuff(zd,"max_threads",NWT); | ||||
// max. working threads 22.35 | ||||
zdialog_stuff(zd,"dcraw",0); // RAW loader | zdialog_stuff(zd,"dcraw",0); // RAW loader | |||
zdialog_stuff(zd,"rawtherapee",0); | zdialog_stuff(zd,"rawtherapee",0); | |||
zdialog_stuff(zd,"darktable",0); | zdialog_stuff(zd,"darktable",0); | |||
zdialog_stuff(zd,"customraw",0); | ||||
if (Frawloader == 1) zdialog_stuff(zd,"dcraw",1); | if (Frawloader == 1) zdialog_stuff(zd,"dcraw",1); | |||
if (Frawloader == 2) zdialog_stuff(zd,"rawtherapee",1); | if (Frawloader == 2) zdialog_stuff(zd,"rawtherapee",1); | |||
if (Frawloader == 3) zdialog_stuff(zd,"darktable",1); | if (Frawloader == 3) zdialog_stuff(zd,"darktable",1); | |||
if (Frawloader == 4) zdialog_stuff(zd,"customraw",1); | ||||
// custom RAW loader command 22.35 | ||||
zdialog_stuff(zd,"rawcommand",rawcommand); | ||||
// custom RAW loader command 22.35 | ||||
zdialog_stuff(zd,"autobright",Fautobright); // RAW loader, auto-brighten option | zdialog_stuff(zd,"autobright",Fautobright); // RAW loader, auto-brighten option | |||
zdialog_stuff(zd,"matchthumb",Fmatchthumb); // " " match embedded image color | zdialog_stuff(zd,"matchthumb",Fmatchthumb); // " " match embedded image color | |||
zdialog_stuff(zd,"rawtypes",RAWfiletypes); // RAW file types | zdialog_stuff(zd,"rawtypes",RAWfiletypes); // RAW file types | |||
zdialog_stuff(zd,"videotypes",VIDEOfiletypes); // VIDEO file types | zdialog_stuff(zd,"videotypes",VIDEOfiletypes); // VIDEO file types | |||
zdialog_stuff(zd,"videocomm",video_command); // video play command 22.1 | zdialog_stuff(zd,"videocomm",video_command); // video play command 22.1 | |||
Frestart = 0; // some changes require restart | Frestart = 0; // some changes require restart | |||
// run dialog and wait for completion | // run dialog and wait for completion | |||
zdialog_resize(zd,500,500); | zdialog_resize(zd,500,500); | |||
zmainloop(); // GTK bug - help widgets resize | zmainloop(); // GTK bug - help widgets resize | |||
zdialog_run(zd,preferences_dialog_event,"save"); // run dialog and wait for completion | zdialog_run(zd,settings_dialog_event,"save"); // run dialog and wait for completion | |||
zdialog_wait(zd); | zdialog_wait(zd); | |||
zdialog_free(zd); | zdialog_free(zd); | |||
save_params(); // save parameter changes 22.18 | save_params(); // save parameter changes 22.18 | |||
gtk_window_present(MWIN); // refresh window | gtk_window_present(MWIN); // refresh window | |||
Fblock("preferences",0); | Fblock("settings",0); | |||
if (Frestart) { // start new session if needed | if (Frestart) { // start new session if needed | |||
new_session(0); | new_session(0); | |||
zsleep(1); // delay before SIGTERM in quitxx() | zsleep(1); // delay before SIGTERM in quitxx() | |||
quitxx(); | quitxx(); | |||
} | } | |||
return; | return; | |||
} | } | |||
// preferences dialog event function | // settings dialog event function | |||
int preferences_dialog_event(zdialog *zd, cchar *event) // simplifications 22.16 | int settings_dialog_event(zdialog *zd, cchar *event) // simplifications 22.16 | |||
{ | { | |||
using namespace preferences; | using namespace settings; | |||
int ii, jj, nn; | int ii, jj, nn; | |||
char *pp, temp[200]; | char *pp, temp[200]; | |||
cchar *ppc; | cchar *ppc; | |||
char txrgb[20]; | char txrgb[20]; | |||
GtkWidget *font_dialog; | GtkWidget *font_dialog; | |||
printf("event: %s \n",event); ///////////// | ||||
if (strmatch(event,"escape")) zd->zstat = -2; // escape key | if (strmatch(event,"escape")) zd->zstat = -2; // escape key | |||
if (zd->zstat) return 1; // [OK] or [x] | if (zd->zstat) return 1; // [OK] or [x] | |||
if (strmatch(event,"startopt")) // set startup view | if (strmatch(event,"startopt")) // set startup view | |||
{ | { | |||
zdialog_fetch(zd,"startopt",temp,200); | zdialog_fetch(zd,"startopt",temp,200); | |||
for (ii = 0; ii < NSO; ii++) { | for (ii = 0; ii < NSO; ii++) { | |||
if (strmatch(temp,startopt[ii][1])) | if (strmatch(temp,startopt[ii][1])) | |||
zstrcopy(startdisplay,startopt[ii][0],"params"); | zstrcopy(startdisplay,startopt[ii][0],"settings"); | |||
} | } | |||
} | } | |||
if (strmatch(event,"startopt-browse")) // browse for startup folder or file | if (strmatch(event,"startopt-browse")) // browse for startup folder or file | |||
{ | { | |||
if (strmatch(startdisplay,"specG")) { // set startup gallery | if (strmatch(startdisplay,"specG")) { // set startup gallery | |||
if (! startfolder && topfolders[0]) | if (! startfolder && topfolders[0]) | |||
startfolder = zstrdup(topfolders[0],"params"); // default | startfolder = zstrdup(topfolders[0],"settings"); // default | |||
pp = zgetfile("Select startup folder",MWIN,"folder",startfolder); | pp = zgetfile("Select startup folder",MWIN,"folder",startfolder); | |||
if (! pp) return 1; | if (! pp) return 1; | |||
if (image_file_type(pp) != FDIR) { | if (image_file_type(pp) != FDIR) { | |||
zmessageACK(Mwin,"startup folder is invalid"); | zmessageACK(Mwin,"startup folder is invalid"); | |||
zfree(pp); | zfree(pp); | |||
return 1; | return 1; | |||
} | } | |||
if (startfolder) zfree(startfolder); | if (startfolder) zfree(startfolder); | |||
startfolder = pp; | startfolder = pp; | |||
} | } | |||
skipping to change at line 1934 | skipping to change at line 1957 | |||
if (ppc) GBrgb[0] = atoi(ppc); | if (ppc) GBrgb[0] = atoi(ppc); | |||
ppc = substring(txrgb,"|",2); | ppc = substring(txrgb,"|",2); | |||
if (ppc) GBrgb[1] = atoi(ppc); | if (ppc) GBrgb[1] = atoi(ppc); | |||
ppc = substring(txrgb,"|",3); | ppc = substring(txrgb,"|",3); | |||
if (ppc) GBrgb[2] = atoi(ppc); | if (ppc) GBrgb[2] = atoi(ppc); | |||
} | } | |||
if (strstr("icons text both iconsize",event)) // menu options | if (strstr("icons text both iconsize",event)) // menu options | |||
{ | { | |||
zdialog_fetch(zd,"icons",nn); // menu style = icons | zdialog_fetch(zd,"icons",nn); // menu style = icons | |||
if (nn) zstrcopy(menu_style,"icons","params"); | if (nn) zstrcopy(menu_style,"icons","settings"); | |||
zdialog_fetch(zd,"text",nn); // menu style = text | zdialog_fetch(zd,"text",nn); // menu style = text | |||
if (nn) zstrcopy(menu_style,"text","params"); | if (nn) zstrcopy(menu_style,"text","settings"); | |||
zdialog_fetch(zd,"both",nn); // menu style = icons + text | zdialog_fetch(zd,"both",nn); // menu style = icons + text | |||
if (nn) zstrcopy(menu_style,"both","params"); | if (nn) zstrcopy(menu_style,"both","settings"); | |||
zdialog_fetch(zd,"iconsize",nn); // icon size | zdialog_fetch(zd,"iconsize",nn); // icon size | |||
if (nn != iconsize) { | if (nn != iconsize) { | |||
iconsize = nn; | iconsize = nn; | |||
} | } | |||
Frestart = 1; | Frestart = 1; | |||
} | } | |||
if (strstr("MFrgb MBrgb",event)) | if (strstr("MFrgb MBrgb",event)) | |||
skipping to change at line 1982 | skipping to change at line 2005 | |||
{ | { | |||
zdialog_fetch(zd,"font",temp,200); | zdialog_fetch(zd,"font",temp,200); | |||
font_dialog = gtk_font_chooser_dialog_new("select font",MWIN); | font_dialog = gtk_font_chooser_dialog_new("select font",MWIN); | |||
gtk_font_chooser_set_font(GTK_FONT_CHOOSER(font_dialog),temp); | gtk_font_chooser_set_font(GTK_FONT_CHOOSER(font_dialog),temp); | |||
gtk_dialog_run(GTK_DIALOG(font_dialog)); | gtk_dialog_run(GTK_DIALOG(font_dialog)); | |||
pp = gtk_font_chooser_get_font(GTK_FONT_CHOOSER(font_dialog)); | pp = gtk_font_chooser_get_font(GTK_FONT_CHOOSER(font_dialog)); | |||
gtk_widget_destroy(font_dialog); | gtk_widget_destroy(font_dialog); | |||
if (! pp) return 1; | if (! pp) return 1; | |||
zdialog_stuff(zd,"font",pp); | zdialog_stuff(zd,"font",pp); | |||
zsetfont(pp); | zsetfont(pp); | |||
dialog_font = zstrdup(pp,"params"); | dialog_font = zstrdup(pp,"settings"); | |||
g_free(pp); | g_free(pp); | |||
} | } | |||
if (strmatch(event,"zoomcount")) | if (strmatch(event,"zoomcount")) | |||
{ | { | |||
zdialog_fetch(zd,"zoomcount",zoomcount); // zooms for 2x image size | zdialog_fetch(zd,"zoomcount",zoomcount); // zooms for 2x image size | |||
zoomratio = pow( 2.0, 1.0 / zoomcount); // 2.0, 1.4142, 1.2599, 1.1892 ... | zoomratio = pow( 2.0, 1.0 / zoomcount); // 2.0, 1.4142, 1.2599, 1.1892 ... | |||
} | } | |||
if (strstr("drag scroll fast",event)) // drag/scroll option | if (strstr("drag scroll fast",event)) // drag/scroll option | |||
skipping to change at line 2027 | skipping to change at line 2050 | |||
if (strmatch(event,"ovtxcc0")) // overlay text line cc range 22.18 | if (strmatch(event,"ovtxcc0")) // overlay text line cc range 22.18 | |||
zdialog_fetch(zd,"ovtxcc0",ovtxcc[0]); | zdialog_fetch(zd,"ovtxcc0",ovtxcc[0]); | |||
if (strmatch(event,"ovtxcc1")) | if (strmatch(event,"ovtxcc1")) | |||
zdialog_fetch(zd,"ovtxcc1",ovtxcc[1]); | zdialog_fetch(zd,"ovtxcc1",ovtxcc[1]); | |||
if (strstr("ipleft ipcenter ipright",event)) // image position in wider window 22.18 | if (strstr("ipleft ipcenter ipright",event)) // image position in wider window 22.18 | |||
{ | { | |||
zdialog_fetch(zd,"ipleft",nn); | zdialog_fetch(zd,"ipleft",nn); | |||
if (nn) zstrcopy(ImagePosn,"left","params"); | if (nn) zstrcopy(ImagePosn,"left","settings"); | |||
zdialog_fetch(zd,"ipcenter",nn); | zdialog_fetch(zd,"ipcenter",nn); | |||
if (nn) zstrcopy(ImagePosn,"center","params"); | if (nn) zstrcopy(ImagePosn,"center","settings"); | |||
zdialog_fetch(zd,"ipright",nn); | zdialog_fetch(zd,"ipright",nn); | |||
if (nn) zstrcopy(ImagePosn,"right","params"); | if (nn) zstrcopy(ImagePosn,"right","settings"); | |||
} | } | |||
if (strmatch(event,"askquit")) // ask to quit option | if (strmatch(event,"askquit")) // ask to quit option | |||
zdialog_fetch(zd,"askquit",Faskquit); | zdialog_fetch(zd,"askquit",Faskquit); | |||
if (strstr("indexlev fmindexlev",event)) // index level, | if (strstr("indexlev fmindexlev",event)) // index level, | |||
{ | { | |||
zdialog_fetch(zd,"indexlev",Findexlev); // fotoxx started directly | zdialog_fetch(zd,"indexlev",Findexlev); // fotoxx started directly | |||
zdialog_fetch(zd,"fmindexlev",FMindexlev); // fotoxx started via file manager | zdialog_fetch(zd,"fmindexlev",FMindexlev); // fotoxx started via file manager | |||
if (Findexlev < FMindexlev) Findexlev = FMindexlev; // disallow F < FM | if (Findexlev < FMindexlev) Findexlev = FMindexlev; // disallow F < FM | |||
skipping to change at line 2054 | skipping to change at line 2077 | |||
if (strstr("logerrs loginfo loginputs",event)) // log message level | if (strstr("logerrs loginfo loginputs",event)) // log message level | |||
{ | { | |||
zdialog_fetch(zd,"logerrs",nn); | zdialog_fetch(zd,"logerrs",nn); | |||
if (nn == 1) zfuncs::Floglevel = 0; // 0/1/2 = errors/info/inputs | if (nn == 1) zfuncs::Floglevel = 0; // 0/1/2 = errors/info/inputs | |||
zdialog_fetch(zd,"loginfo",nn); | zdialog_fetch(zd,"loginfo",nn); | |||
if (nn == 1) zfuncs::Floglevel = 1; | if (nn == 1) zfuncs::Floglevel = 1; | |||
zdialog_fetch(zd,"loginputs",nn); | zdialog_fetch(zd,"loginputs",nn); | |||
if (nn == 1) zfuncs::Floglevel = 2; | if (nn == 1) zfuncs::Floglevel = 2; | |||
} | } | |||
if (strstr("dcraw rawtherapee darktable",event)) | if (strmatch(event,"max_threads")) { | |||
// RAW loader selection | // max. working threads 22.35 | |||
zdialog_fetch(zd,"max_threads",NWT); | ||||
NST = NWT; | ||||
// server threads | ||||
} | ||||
if (strstr("dcraw rawtherapee darktable customraw",event)) | ||||
// RAW loader selection | ||||
{ | { | |||
zdialog_fetch(zd,"dcraw",nn); | zdialog_fetch(zd,"dcraw",nn); | |||
if (nn == 1) Frawloader = 1; | if (nn == 1) Frawloader = 1; | |||
zdialog_fetch(zd,"rawtherapee",nn); | zdialog_fetch(zd,"rawtherapee",nn); | |||
if (nn == 1) { | if (nn == 1) { | |||
if (! Frawtherapeecli) { | if (! Frawtherapeecli) { | |||
zmessageACK(Mwin,"rawtherapee-cli (Raw Therapee) is not installed"); | zmessageACK(Mwin,"rawtherapee-cli (Raw Therapee) is not installed"); | |||
zdialog_stuff(zd,"dcraw",1); | zdialog_stuff(zd,"dcraw",1); | |||
zdialog_stuff(zd,"rawtherapee",0); | zdialog_stuff(zd,"rawtherapee",0); | |||
skipping to change at line 2080 | skipping to change at line 2108 | |||
zdialog_fetch(zd,"darktable",nn); | zdialog_fetch(zd,"darktable",nn); | |||
if (nn == 1) { | if (nn == 1) { | |||
if (! Fdarktablecli) { | if (! Fdarktablecli) { | |||
zmessageACK(Mwin,"darktable-cli (Darktable) is not installed"); | zmessageACK(Mwin,"darktable-cli (Darktable) is not installed"); | |||
zdialog_stuff(zd,"dcraw",1); | zdialog_stuff(zd,"dcraw",1); | |||
zdialog_stuff(zd,"darktable",0); | zdialog_stuff(zd,"darktable",0); | |||
Frawloader = 1; | Frawloader = 1; | |||
} | } | |||
else Frawloader = 3; | else Frawloader = 3; | |||
} | } | |||
zdialog_fetch(zd,"customraw",nn); | ||||
// custom RAW file loader command 22.35 | ||||
if (nn == 1) Frawloader = 4; | ||||
} | } | |||
zdialog_fetch(zd,"rawcommand",temp,200); | ||||
// save user RAW loader command | ||||
rawcommand = zstrdup(temp,"settings"); | ||||
if (strmatch(event,"autobright")) // RAW file processing options | if (strmatch(event,"autobright")) // RAW file processing options | |||
{ | { | |||
zdialog_fetch(zd,"autobright",Fautobright); | zdialog_fetch(zd,"autobright",Fautobright); | |||
if (Fautobright) { | if (Fautobright) { | |||
Fmatchthumb = 0; // if selected, deselect alternative | Fmatchthumb = 0; // if selected, deselect alternative | |||
zdialog_stuff(zd,"matchthumb",Fmatchthumb); | zdialog_stuff(zd,"matchthumb",Fmatchthumb); | |||
} | } | |||
} | } | |||
if (strmatch(event,"matchthumb")) | if (strmatch(event,"matchthumb")) | |||
skipping to change at line 2103 | skipping to change at line 2137 | |||
zdialog_fetch(zd,"matchthumb",Fmatchthumb); | zdialog_fetch(zd,"matchthumb",Fmatchthumb); | |||
if (Fmatchthumb) { | if (Fmatchthumb) { | |||
Fautobright = 0; // if selected, deselect alternative | Fautobright = 0; // if selected, deselect alternative | |||
zdialog_stuff(zd,"autobright",Fautobright); | zdialog_stuff(zd,"autobright",Fautobright); | |||
} | } | |||
} | } | |||
if (strmatch(event,"rawtypes")) // RAW file types, .raw .rw2 ... | if (strmatch(event,"rawtypes")) // RAW file types, .raw .rw2 ... | |||
{ | { | |||
zdialog_fetch(zd,"rawtypes",temp,200); | zdialog_fetch(zd,"rawtypes",temp,200); | |||
pp = zstrdup(temp,"params",100); | pp = zstrdup(temp,"settings",100); | |||
for (ii = jj = 0; temp[ii]; ii++) { // insure blanks between types | for (ii = jj = 0; temp[ii]; ii++) { // insure blanks between types | |||
if (temp[ii] == '.' && ii && temp[ii-1] != ' ') pp[jj++] = ' '; // 22.16 | if (temp[ii] == '.' && ii && temp[ii-1] != ' ') pp[jj++] = ' '; // 22.16 | |||
pp[jj++] = temp[ii]; | pp[jj++] = temp[ii]; | |||
} | } | |||
if (pp[jj-1] != ' ') pp[jj++] = ' '; // insure 1 final blank | if (pp[jj-1] != ' ') pp[jj++] = ' '; // insure 1 final blank | |||
pp[jj] = 0; | pp[jj] = 0; | |||
if (RAWfiletypes) zfree(RAWfiletypes); | if (RAWfiletypes) zfree(RAWfiletypes); | |||
RAWfiletypes = pp; | RAWfiletypes = pp; | |||
} | } | |||
if (strmatch(event,"videotypes")) // VIDEO file types, .mp4 .mov ... | if (strmatch(event,"videotypes")) // VIDEO file types, .mp4 .mov ... | |||
{ | { | |||
zdialog_fetch(zd,"videotypes",temp,200); | zdialog_fetch(zd,"videotypes",temp,200); | |||
pp = zstrdup(temp,"params",100); | pp = zstrdup(temp,"settings",100); | |||
for (ii = jj = 0; temp[ii]; ii++) { // insure blanks between types | for (ii = jj = 0; temp[ii]; ii++) { // insure blanks between types | |||
if (temp[ii] == '.' && ii && temp[ii-1] != ' ') pp[jj++] = ' '; // 22.16 | if (temp[ii] == '.' && ii && temp[ii-1] != ' ') pp[jj++] = ' '; // 22.16 | |||
pp[jj++] = temp[ii]; | pp[jj++] = temp[ii]; | |||
} | } | |||
if (pp[jj-1] != ' ') pp[jj++] = ' '; // insure 1 final blank | if (pp[jj-1] != ' ') pp[jj++] = ' '; // insure 1 final blank | |||
pp[jj] = 0; | pp[jj] = 0; | |||
if (VIDEOfiletypes) zfree(VIDEOfiletypes); | if (VIDEOfiletypes) zfree(VIDEOfiletypes); | |||
VIDEOfiletypes = pp; | VIDEOfiletypes = pp; | |||
} | } | |||
if (strmatch(event,"videocomm")) // user-selected video command | if (strmatch(event,"videocomm")) // user-selected video command | |||
{ | { | |||
zdialog_fetch(zd,"videocomm",temp,200); | zdialog_fetch(zd,"videocomm",temp,200); | |||
zstrcopy(video_command,temp,"params"); | zstrcopy(video_command,temp,"settings"); | |||
} | } | |||
return 1; | return 1; | |||
} | } | |||
/******************************************************************************* */ | /******************************************************************************* */ | |||
// keyboard shortcuts | // keyboard shortcuts | |||
namespace KBshortcutnames | namespace KBshortcutnames | |||
{ | { | |||
zdialog *zd; | zdialog *zd; | |||
int Nreserved = 21; // reserved shortcuts (hard coded) | int Nreserved = 21; // reserved shortcuts (hard coded) | |||
cchar *reserved[21] = { | cchar *reserved[21] = { | |||
"+", "=", "-", "Z", "F1", "F2", "F3", "F4", "F10", "F11", | "+", "=", "-", "Z", "F1", "F2", "F3", "F4", "F10", "F11", | |||
"Escape", "Delete", "Left", "Right", "Up", "Down", "First", "Last", | "Escape", "Delete", "Left", "Right", "Up", "Down", "Home", "End", | |||
"Page_Up", "Page_Down", "Open" }; | "Page_Up", "Page_Down", "Open" }; | |||
kbsutab_t kbsutab2[maxkbsu]; // KB shortcuts list during editing | kbsutab_t kbsutab2[maxkbsu]; // KB shortcuts list during editing | |||
int Nkbsu2; | int Nkbsu2; | |||
} | } | |||
// KB shortcuts menu function | // KB shortcuts menu function | |||
void m_KB_shortcuts(GtkWidget *, cchar *) | void m_KB_shortcuts(GtkWidget *, cchar *) | |||
{ | { | |||
skipping to change at line 3173 | skipping to change at line 3207 | |||
int Fallfiles, Fgallery; | int Fallfiles, Fgallery; | |||
} | } | |||
// menu function | // menu function | |||
void m_duplicates(GtkWidget *, const char *) | void m_duplicates(GtkWidget *, const char *) | |||
{ | { | |||
using namespace duplicates_names; | using namespace duplicates_names; | |||
int duplicates_dialog_event(zdialog *zd, cchar *event); | int duplicates_dialog_event(zdialog *zd, cchar *event); | |||
void randomize(); | void duplicates_randomize(); | |||
PIXBUF *pxb; | PIXBUF *pxb; | |||
GError *gerror; | GError *gerror; | |||
uint8 *pixels, *pix1; | uint8 *pixels, *pix1; | |||
uint8 *pixelsii, *pixelsjj, *pixii, *pixjj; | uint8 *pixelsii, *pixelsjj, *pixii, *pixjj; | |||
FILE *fid = 0; | FILE *fid = 0; | |||
zdialog *zd; | zdialog *zd; | |||
int Ndups = 0; // image file and duplicate counts | int Ndups = 0; // image file and duplicate counts | |||
int thumbsize, pixdiff, pixcount; | int thumbsize, pixdiff, pixcount; | |||
int zstat, ii, jj, kk, cc, err, ndup; | int zstat, ii, jj, kk, cc, err, ndup; | |||
skipping to change at line 3215 | skipping to change at line 3249 | |||
zmessageACK(Mwin,"image index disabled"); // no image index | zmessageACK(Mwin,"image index disabled"); // no image index | |||
return; | return; | |||
} | } | |||
if (Fblock("duplicates","block edits")) return; // check pending, block | if (Fblock("duplicates","block edits")) return; // check pending, block | |||
m_viewmode(0,"G"); // gallery view mode | m_viewmode(0,"G"); // gallery view mode | |||
free_resources(); | free_resources(); | |||
// randomize(); 1-shot test function | // duplicates_randomize(); 1-shot test function | |||
/*** | /*** | |||
_______________________________________________ | _______________________________________________ | |||
| Find Duplicate Images | | | Find Duplicate Images | | |||
| | | | | | |||
| (o) All files (o) Current gallery | | | (o) All files (o) Current gallery | | |||
| File count: nnnn | | | File count: nnnn | | |||
| | | | | | |||
| thumbnail size [ 64 ] [calculate] | | | thumbnail size [ 64 ] [calculate] | | |||
| pixel difference [ 2 ] pixel count [ 2 ] | | | pixel difference [ 2 ] pixel count [ 2 ] | | |||
skipping to change at line 3333 | skipping to change at line 3367 | |||
if (! files[ii]) continue; | if (! files[ii]) continue; | |||
Tdata[ii] = (Tdata_t *) zmalloc(sizeof(Tdata_t),"duplicates"); | Tdata[ii] = (Tdata_t *) zmalloc(sizeof(Tdata_t),"duplicates"); | |||
Tdata[ii]->file = files[ii]; // thumbnail file | Tdata[ii]->file = files[ii]; // thumbnail file | |||
files[ii] = 0; | files[ii] = 0; | |||
kk = thumbsize; | kk = thumbsize; | |||
gerror = 0; // read thumbnail >> pixbuf | gerror = 0; // read thumbnail >> pixbuf | |||
pxb = gdk_pixbuf_new_from_file_at_size(Tdata[ii]->file,kk,kk,&gerror); | pxb = gdk_pixbuf_new_from_file_at_size(Tdata[ii]->file,kk,kk,&gerror); | |||
if (! pxb) { | if (! pxb) { | |||
Plog(1,"file: %s \n %s",Tdata[ii]->file,gerror->message); | Plog(0,"file: %s \n %s",Tdata[ii]->file,gerror->message); | |||
zfree(Tdata[ii]->file); | zfree(Tdata[ii]->file); | |||
zfree(Tdata[ii]); | zfree(Tdata[ii]); | |||
Tdata[ii] = 0; | Tdata[ii] = 0; | |||
continue; | continue; | |||
} | } | |||
ww = gdk_pixbuf_get_width(pxb); // pixbuf dimensions | ww = gdk_pixbuf_get_width(pxb); // pixbuf dimensions | |||
hh = gdk_pixbuf_get_height(pxb); | hh = gdk_pixbuf_get_height(pxb); | |||
rs = gdk_pixbuf_get_rowstride(pxb); | rs = gdk_pixbuf_get_rowstride(pxb); | |||
pixels = gdk_pixbuf_get_pixels(pxb); | pixels = gdk_pixbuf_get_pixels(pxb); | |||
skipping to change at line 3608 | skipping to change at line 3642 | |||
} | } | |||
if (! zd->zstat) return 1; // wait for user input | if (! zd->zstat) return 1; // wait for user input | |||
if (zd->zstat != 1) Fkillfunc = 1; // [cancel] or [x] | if (zd->zstat != 1) Fkillfunc = 1; // [cancel] or [x] | |||
return 1; // [proceed] | return 1; // [proceed] | |||
} | } | |||
// Make small random changes to all images. | // Make small random changes to all images. | |||
// Used for testing and benchmarking Find Duplicates. | // Used for testing and benchmarking Find Duplicates. | |||
void randomize() | void duplicates_randomize() | |||
{ | { | |||
using namespace duplicates_names; | using namespace duplicates_names; | |||
char *file; | char *file; | |||
int px, py; | int px, py; | |||
int ii, jj, kk; | int ii, jj, kk; | |||
float *pixel; | float *pixel; | |||
for (ii = 0; ii < Nxxrec; ii++) // loop all files | for (ii = 0; ii < Nxxrec; ii++) // loop all files | |||
{ | { | |||
skipping to change at line 3653 | skipping to change at line 3687 | |||
PXM_free(E0pxm); | PXM_free(E0pxm); | |||
zfree(file); | zfree(file); | |||
} | } | |||
return; | return; | |||
} | } | |||
/******************************************************************************* */ | /******************************************************************************* */ | |||
// Show the last two pixel positions clicked and the distance between. | ||||
namespace measure_image_names | ||||
{ | ||||
zdialog *zd; | ||||
int p1x, p1y, p2x, p2y; | ||||
int dx, dy, dh; | ||||
int Npix; | ||||
} | ||||
void measure_image_mousefunc(); | ||||
// menu function | ||||
void m_measure_image(GtkWidget *, cchar *) | ||||
{ | ||||
using namespace measure_image_names; | ||||
int measure_image_dialog_event(zdialog *zd, cchar *event); | ||||
cchar *mess = "Click image to select pixels"; | ||||
F1_help_topic = "measure image"; | ||||
Plog(1,"m_measure_image \n"); | ||||
if (! curr_file) return; | ||||
// no image file | ||||
m_viewmode(0,"F"); | ||||
// file view mode | ||||
/*** | ||||
______________________________________ | ||||
| Measure Image | | ||||
| | | ||||
| Click image to select pixels | | ||||
| | | ||||
| Pixel A: xxxx xxxx B: xxxx xxxx | | ||||
| Distance X: xxxx Y: xxxx H: xxxx | | ||||
| | | ||||
| [ OK ] | | ||||
|______________________________________| | ||||
***/ | ||||
zd = zdialog_new("Measure Image",Mwin,"OK",null); | ||||
zdialog_add_widget(zd,"hbox","hbmess","dialog",0,"space=3"); | ||||
zdialog_add_widget(zd,"label","labmess","hbmess",mess,"space=5"); | ||||
zdialog_add_widget(zd,"hbox","hbpix","dialog"); | ||||
zdialog_add_widget(zd,"label","labpix","hbpix","Pixel A: 0000 0000 Pixel B: | ||||
0000 0000","space=3"); | ||||
zdialog_add_widget(zd,"hbox","hbdist","dialog"); | ||||
zdialog_add_widget(zd,"label","labdist","hbdist","Distance X: 0000 Y: 0000 | ||||
H: 0000","space=3"); | ||||
zdialog_run(zd,measure_image_dialog_event,"save"); | ||||
// run dialog | ||||
takeMouse(measure_image_mousefunc,dotcursor); | ||||
// connect mouse function | ||||
Npix = 0; | ||||
// no clicked pixel positions yet | ||||
p1x = p1y = p2x = p2y = 0; | ||||
dx = dy = dh = 0; | ||||
return; | ||||
} | ||||
// dialog event and completion function | ||||
int measure_image_dialog_event(zdialog *zd, cchar *event) | ||||
{ | ||||
using namespace measure_image_names; | ||||
if (zd->zstat) { | ||||
// [OK] or [x] | ||||
freeMouse(); | ||||
// disconnect mouse function | ||||
zdialog_free(zd); | ||||
// kill dialog | ||||
erase_toptext(102); | ||||
// clear pixel labels | ||||
Fpaint2(); | ||||
return 1; | ||||
} | ||||
if (strmatch(event,"focus")) | ||||
// toggle mouse capture | ||||
takeMouse(measure_image_mousefunc,dotcursor); | ||||
// connect mouse function | ||||
return 1; | ||||
} | ||||
// mouse function | ||||
void measure_image_mousefunc() | ||||
{ | ||||
using namespace measure_image_names; | ||||
char text[100]; | ||||
if (! LMclick) return; | ||||
// left click | ||||
LMclick = 0; | ||||
if (Npix == 0) { | ||||
// first clicked pixel | ||||
Npix = 1; | ||||
p1x = Mxclick; | ||||
p1y = Myclick; | ||||
add_toptext(102,p1x,p1y,"A","Sans 8"); | ||||
Fpaint2(); | ||||
} | ||||
else if (Npix == 1) { | ||||
// 2nd clicked pixel | ||||
Npix = 2; | ||||
p2x = Mxclick; | ||||
p2y = Myclick; | ||||
} | ||||
else if (Npix == 2) { | ||||
// next clicked pixel | ||||
p1x = p2x; | ||||
// pixel 2 --> pixel 1 | ||||
p1y = p2y; | ||||
p2x = Mxclick; | ||||
// new pixel --> pixel 2 | ||||
p2y = Myclick; | ||||
} | ||||
if (Npix < 2) return; | ||||
erase_toptext(102); | ||||
add_toptext(102,p1x,p1y,"A","Sans 8"); | ||||
add_toptext(102,p2x,p2y,"B","Sans 8"); | ||||
Fpaint2(); | ||||
dx = abs(p1x - p2x); | ||||
dy = abs(p1y - p2y); | ||||
dh = sqrt(dx*dx + dy*dy) + 0.5; | ||||
snprintf(text,100,"Pixel A: %d %d Pixel B: %d %d",p1x,p1y,p2x,p2y); | ||||
zdialog_stuff(zd,"labpix",text); | ||||
snprintf(text,100,"Distance X: %d Y: %d H: %d",dx,dy,dh); | ||||
zdialog_stuff(zd,"labdist",text); | ||||
return; | ||||
} | ||||
/******************************************************************************* | ||||
*/ | ||||
// Show RGB values for 1-9 pixels selected with mouse-clicks. | // Show RGB values for 1-9 pixels selected with mouse-clicks. | |||
// Additional pixel position tracks active mouse position | // Additional pixel position tracks active mouse position | |||
void show_RGB_mousefunc(); | void show_RGB_mousefunc(); | |||
int show_RGB_timefunc(void *); | int show_RGB_timefunc(void *); | |||
zdialog *RGBSzd; | zdialog *RGBSzd; | |||
int RGBSpixel[10][2]; // 0-9 clicked pixels + current mouse | int RGBSpixel[10][2]; // 0-9 clicked pixels + current mouse | |||
int RGBSnpix = 0; // no. clicked pixels, 0-9 | int RGBSnpix = 0; // no. clicked pixels, 0-9 | |||
int RGBSdelta = 0; // abs/delta mode | int RGBSdelta = 0; // abs/delta mode | |||
skipping to change at line 5193 | skipping to change at line 5365 | |||
Plog(1,"m_appimage_files \n"); | Plog(1,"m_appimage_files \n"); | |||
if (! getenv("HERE")) { | if (! getenv("HERE")) { | |||
zmessageACK(Mwin,"not an appimage build"); | zmessageACK(Mwin,"not an appimage build"); | |||
return; | return; | |||
} | } | |||
folder = zgetfile("save location",MWIN,"folder",getenv("HOME"),0); | folder = zgetfile("save location",MWIN,"folder",getenv("HOME"),0); | |||
if (! folder) return; | if (! folder) return; | |||
zshell(0,"cp -R $HERE/usr/share/doc/fotoxx/ %s",folder); | zshell("log ack","cp -R $HERE/usr/share/doc/fotoxx/ %s",folder); | |||
zshell(0,"cp -R $HERE/usr/share/fotoxx/data/ %s",folder); | zshell("log ack","cp -R $HERE/usr/share/fotoxx/data/ %s",folder); | |||
return; | return; | |||
} | } | |||
/******************************************************************************* */ | /******************************************************************************* */ | |||
// uninstall appimage package | // uninstall appimage package | |||
void m_appimage_unstall(GtkWidget *, cchar *) | void m_appimage_unstall(GtkWidget *, cchar *) | |||
{ | { | |||
End of changes. 52 change blocks. | ||||
43 lines changed or deleted | 246 lines changed or added |