mirror of
https://github.com/nothings/stb-imv
synced 2024-11-22 05:21:30 +03:00
launch an instance
This commit is contained in:
parent
9b3666adfb
commit
2bfc0ab8d0
79
imv.c
79
imv.c
@ -52,7 +52,8 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int do_show;
|
||||||
|
int delay_time = 4000;
|
||||||
|
|
||||||
|
|
||||||
// all programs get the version number from the same place: version.bat
|
// all programs get the version number from the same place: version.bat
|
||||||
@ -590,6 +591,7 @@ char helptext_right[] =
|
|||||||
"ESC: exit\n"
|
"ESC: exit\n"
|
||||||
"P: change preferences\n"
|
"P: change preferences\n"
|
||||||
"CTRL-C: copy filename to clipboard\n"
|
"CTRL-C: copy filename to clipboard\n"
|
||||||
|
"CTRL-I: launch new viewer instance\n"
|
||||||
;
|
;
|
||||||
|
|
||||||
// draw the help text semi-prettily
|
// draw the help text semi-prettily
|
||||||
@ -775,7 +777,7 @@ typedef struct
|
|||||||
} Resize;
|
} Resize;
|
||||||
|
|
||||||
// threaded image resizer, uses work queue AND current thread
|
// threaded image resizer, uses work queue AND current thread
|
||||||
static void image_resize(Image *dest, Image *src);
|
void image_resize(Image *dest, Image *src);
|
||||||
|
|
||||||
// wrapper for image_resize() to be called via work queue
|
// wrapper for image_resize() to be called via work queue
|
||||||
void * work_resize(void *p)
|
void * work_resize(void *p)
|
||||||
@ -862,8 +864,7 @@ void enqueue_resize(int left, int top, int width, int height)
|
|||||||
// if we have a current image, and that image can satisfy the request (they're
|
// if we have a current image, and that image can satisfy the request (they're
|
||||||
// dragging one side of the image out wider), just immediately update the window
|
// dragging one side of the image out wider), just immediately update the window
|
||||||
qs.w = 0; // clear the queue
|
qs.w = 0; // clear the queue
|
||||||
if (!show_frame)
|
if (!show_frame) left += FRAME, top += FRAME, width -= 2*FRAME, height -= 2*FRAME;
|
||||||
left += FRAME, top += FRAME, width -= 2*FRAME, height -= 2*FRAME;
|
|
||||||
MoveWindow(win, left, top, width, height, TRUE);
|
MoveWindow(win, left, top, width, height, TRUE);
|
||||||
InvalidateRect(win, NULL, FALSE);
|
InvalidateRect(win, NULL, FALSE);
|
||||||
} else {
|
} else {
|
||||||
@ -1473,6 +1474,9 @@ void advance(int dir)
|
|||||||
for (i=0; i < MAX_CACHED_IMAGES; ++i)
|
for (i=0; i < MAX_CACHED_IMAGES; ++i)
|
||||||
if (cache[i].lru < lru_stamp-1)
|
if (cache[i].lru < lru_stamp-1)
|
||||||
cache[i].bail = 1;
|
cache[i].bail = 1;
|
||||||
|
|
||||||
|
if (do_show)
|
||||||
|
SetTimer(win, 0, delay_time, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ctrl-O, or initial command if no filename: run
|
// ctrl-O, or initial command if no filename: run
|
||||||
@ -1524,7 +1528,7 @@ void resize(int step)
|
|||||||
// first characterize the current size relative to the raw size
|
// first characterize the current size relative to the raw size
|
||||||
// we do this by linearly probing possible values for zoom
|
// we do this by linearly probing possible values for zoom
|
||||||
// @TODO: refactor to combine these loops
|
// @TODO: refactor to combine these loops
|
||||||
if (cur->x > source->x + FRAME*2 || cur->y > source->y + FRAME*2) {
|
if (cur->x > x + FRAME*2 || cur->y > y + FRAME*2) {
|
||||||
for(;;) {
|
for(;;) {
|
||||||
s = (float) pow(2, zoom/2.0f + 0.25f);
|
s = (float) pow(2, zoom/2.0f + 0.25f);
|
||||||
x2 = int(x*s);
|
x2 = int(x*s);
|
||||||
@ -1695,7 +1699,6 @@ void mouse(UINT ev, int x, int y)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
case MODE_resize: {
|
case MODE_resize: {
|
||||||
RECT rect;
|
RECT rect;
|
||||||
assert(rx || ry);
|
assert(rx || ry);
|
||||||
@ -2099,6 +2102,12 @@ int WINAPI MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case WM_TIMER: {
|
||||||
|
advance(1);
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
#define MY_SHIFT (1 << 16)
|
#define MY_SHIFT (1 << 16)
|
||||||
#define MY_CTRL (1 << 17)
|
#define MY_CTRL (1 << 17)
|
||||||
#define MY_ALT (1 << 18)
|
#define MY_ALT (1 << 18)
|
||||||
@ -2129,6 +2138,14 @@ int WINAPI MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||||||
InvalidateRect(win, NULL, FALSE);
|
InvalidateRect(win, NULL, FALSE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'S':
|
||||||
|
do_show = !do_show;
|
||||||
|
if (do_show)
|
||||||
|
SetTimer(win,0,delay_time,NULL);
|
||||||
|
else
|
||||||
|
KillTimer(win,0);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -2160,6 +2177,20 @@ int WINAPI MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||||||
InvalidateRect(win, NULL, FALSE);
|
InvalidateRect(win, NULL, FALSE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#ifdef MONO_THUMB
|
||||||
|
case 'T' | MY_CTRL | MY_ALT | MY_SHIFT:
|
||||||
|
{
|
||||||
|
extern Image *make_mono_thumb(Image *src);
|
||||||
|
while (pending_resize.size.w && !pending_resize.image)
|
||||||
|
Sleep(10);
|
||||||
|
source = make_mono_thumb(source);
|
||||||
|
imfree(source_c->image);
|
||||||
|
source_c->image = source;
|
||||||
|
size_to_current(FALSE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
case 'B' | MY_CTRL:
|
case 'B' | MY_CTRL:
|
||||||
extra_border = !extra_border;
|
extra_border = !extra_border;
|
||||||
if (cur) frame(cur);
|
if (cur) frame(cur);
|
||||||
@ -2191,6 +2222,28 @@ int WINAPI MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case 'I' | MY_CTRL: {
|
||||||
|
// not sure which of these is smaller
|
||||||
|
#if 0
|
||||||
|
char buffer[MAX_PATH+1024];
|
||||||
|
PROCESS_INFORMATION pi={0};
|
||||||
|
STARTUPINFO si={0};
|
||||||
|
buffer[0] = '"';
|
||||||
|
GetModuleFileName(NULL, buffer+1, MAX_PATH);
|
||||||
|
strcat(buffer, "\" \"");
|
||||||
|
stb_fullpath(buffer+strlen(buffer), 1020, source_c->filename);
|
||||||
|
strcat(filename, "\"");
|
||||||
|
CreateProcess(NULL, buffer, NULL, NULL, FALSE, DETACHED_PROCESS, NULL, NULL, &si, &pi);
|
||||||
|
#else
|
||||||
|
char buffer[MAX_PATH],filename[1024] = {'\"'};
|
||||||
|
GetModuleFileName(NULL, buffer, sizeof(buffer));
|
||||||
|
stb_fullpath(filename+1, sizeof(filename)-2, source_c->filename);
|
||||||
|
strcat(filename, "\"");
|
||||||
|
_spawnl(_P_NOWAIT, buffer, buffer, filename, NULL);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef PERFTEST
|
#ifdef PERFTEST
|
||||||
case 'D' | MY_CTRL:
|
case 'D' | MY_CTRL:
|
||||||
performance_test();
|
performance_test();
|
||||||
@ -2267,6 +2320,16 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
|
|||||||
|
|
||||||
inst = hInstance;
|
inst = hInstance;
|
||||||
|
|
||||||
|
#ifdef _DEBUG
|
||||||
|
{
|
||||||
|
char buffer[1024];
|
||||||
|
FILE *f = fopen("c:/x/cmdline.txt", "ab");
|
||||||
|
sprintf(buffer, "%s\n\nx\n", lpCmdLine);
|
||||||
|
fwrite(buffer, 1, strlen(buffer), f);
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// determine the number of threads to use in the resizer
|
// determine the number of threads to use in the resizer
|
||||||
resize_threads = stb_min(stb_processor_count(), 16);
|
resize_threads = stb_min(stb_processor_count(), 16);
|
||||||
|
|
||||||
@ -2445,6 +2508,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
|
|||||||
// is the image we're showing the image to resize, and does the size match?
|
// is the image we're showing the image to resize, and does the size match?
|
||||||
if (cur_is_current() && (!cur || (qs.w == cur->x && qs.h >= cur->y) || (qs.h == cur->y && qs.w >= cur->x))) {
|
if (cur_is_current() && (!cur || (qs.w == cur->x && qs.h >= cur->y) || (qs.h == cur->y && qs.w >= cur->x))) {
|
||||||
// no resize necessary, just a variant of the current shape
|
// no resize necessary, just a variant of the current shape
|
||||||
|
if (!show_frame) qs.x += FRAME, qs.y += FRAME, qs.w -= 2*FRAME, qs.h -= 2*FRAME;
|
||||||
MoveWindow(win, qs.x,qs.y,qs.w,qs.h, TRUE);
|
MoveWindow(win, qs.x,qs.y,qs.w,qs.h, TRUE);
|
||||||
InvalidateRect(win, NULL, FALSE);
|
InvalidateRect(win, NULL, FALSE);
|
||||||
} else {
|
} else {
|
||||||
@ -2496,7 +2560,8 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
|
|||||||
}
|
}
|
||||||
|
|
||||||
// resize the window
|
// resize the window
|
||||||
SetWindowPos(hWnd,NULL,pending_resize.size.x, pending_resize.size.y, pending_resize.size.w, pending_resize.size.h, SWP_NOZORDER);
|
SetWindowPos(hWnd,NULL,pending_resize.size.x, pending_resize.size.y, pending_resize.size.w, pending_resize.size.h, SWP_NOZORDER|SWP_NOCOPYBITS);
|
||||||
|
//MoveWindow(hWnd,pending_resize.size.x, pending_resize.size.y, pending_resize.size.w, pending_resize.size.h, FALSE);
|
||||||
|
|
||||||
// clear the resize request info
|
// clear the resize request info
|
||||||
barrier();
|
barrier();
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
|
Version 0.95: Beta 6 ( XXX )
|
||||||
|
* (feature: use 'f' to flip image vertically, in case FreeImage sucks)
|
||||||
|
* feature: ctrl-I launches new viewer instance on current image
|
||||||
|
* bugfix: fix cacheing code to allow refreshing current image after flip etc.
|
||||||
|
* bugfix: clean up repainting when dragging top or left to avoid dragging old data
|
||||||
|
* bugfix: fix out-of-control resize when border is off
|
||||||
|
|
||||||
Version 0.94: Beta 5 (2007-07-15)
|
Version 0.94: Beta 5 (2007-07-15)
|
||||||
* bugfix: changing image resize quality in preferences refreshes on OK
|
* bugfix: changing image resize quality in preferences refreshes on OK
|
||||||
* feature: sort filenames to sort numbers in human-friendly order
|
* feature: sort filenames to sort numbers in human-friendly order
|
||||||
|
@ -44,7 +44,7 @@ RSC=rc.exe
|
|||||||
# PROP Ignore_Export_Lib 0
|
# PROP Ignore_Export_Lib 0
|
||||||
# PROP Target_Dir ""
|
# PROP Target_Dir ""
|
||||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
|
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
|
||||||
# ADD CPP /nologo /G6 /MD /W3 /GX /O2 /Ob0 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /FD /c
|
# ADD CPP /nologo /G6 /MD /W3 /GX /O2 /Ob0 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /FD /c
|
||||||
# SUBTRACT CPP /YX
|
# SUBTRACT CPP /YX
|
||||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||||
@ -71,7 +71,7 @@ LINK32=link.exe
|
|||||||
# PROP Ignore_Export_Lib 0
|
# PROP Ignore_Export_Lib 0
|
||||||
# PROP Target_Dir ""
|
# PROP Target_Dir ""
|
||||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
|
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
|
||||||
# ADD CPP /nologo /G6 /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /FD /GZ /c
|
# ADD CPP /nologo /G6 /MTd /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /FD /GZ /c
|
||||||
# SUBTRACT CPP /YX
|
# SUBTRACT CPP /YX
|
||||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||||
@ -129,6 +129,10 @@ SOURCE=..\imv.ico
|
|||||||
# End Source File
|
# End Source File
|
||||||
# Begin Source File
|
# Begin Source File
|
||||||
|
|
||||||
|
SOURCE=.\mono_thumb.c
|
||||||
|
# End Source File
|
||||||
|
# Begin Source File
|
||||||
|
|
||||||
SOURCE=..\notes.txt
|
SOURCE=..\notes.txt
|
||||||
|
|
||||||
!IF "$(CFG)" == "stb_imv - Win32 Release"
|
!IF "$(CFG)" == "stb_imv - Win32 Release"
|
||||||
|
Loading…
Reference in New Issue
Block a user