Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Claude Code
.claude/
CLAUDE.md

# Build output
build/

# Release output
release/

# Test files
tests/
Binary file modified AltSnap.dni
Binary file not shown.
Binary file modified Lang/_en_US baseline.txt
Binary file not shown.
Binary file modified Lang/ca_ES.ini
Binary file not shown.
Binary file modified Lang/de_DE.ini
Binary file not shown.
Binary file modified Lang/es_ES.ini
Binary file not shown.
Binary file modified Lang/fi_FI.ini
Binary file not shown.
Binary file modified Lang/fr_FR.ini
Binary file not shown.
Binary file modified Lang/gl_ES.ini
Binary file not shown.
Binary file modified Lang/it_IT.ini
Binary file not shown.
Binary file modified Lang/ja_JP.ini
Binary file not shown.
305 changes: 9 additions & 296 deletions Lang/ko_KR.ini

Large diffs are not rendered by default.

Binary file modified Lang/nb_NO.ini
Binary file not shown.
Binary file modified Lang/nl_NL.ini
Binary file not shown.
Binary file modified Lang/pl_PL.ini
Binary file not shown.
Binary file modified Lang/pt_PR.ini
Binary file not shown.
Binary file modified Lang/ru_RU.ini
Binary file not shown.
Binary file modified Lang/sz_SK.ini
Binary file not shown.
Binary file modified Lang/tr_TR.ini
Binary file not shown.
Binary file modified Lang/uk_UA.ini
Binary file not shown.
Binary file modified Lang/zh_CN.ini
Binary file not shown.
Binary file modified Lang/zh_TW.ini
Binary file not shown.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ WHAT'S NEW

Many new features can be seen in the option dialog box, however some of them are only available through editing the AltSnap.ini file (middle click on tyhe tray icon for this).

## Desktop Peek (inspired by [PeekDesktop](https://github.com/shanselman/PeekDesktop))
Click on an empty area of your desktop wallpaper (or an empty taskbar area) to reveal your desktop — just like macOS Sonoma. All visible windows minimize with a single click; click again or switch to any application to restore them. You can enable this feature under the General tab in the Settings dialog.

# VirusTotal false positive
You will see with the latest builds that there are some alerts, usually from SecureAge APEX and sometimes from other vendors. Those are false positives, and I stopped contacting the APEX team for every release because it is a waste of time I would rather spend on improving the program.
I already reduced the number of false positives significantly, simply by changing build flags and by switching to an older version of the NSIS installer system. This is an indication of the impertinence of some modern antivirus solutions. Chocolatey considers that up to five positives on VirusTotal is not even suspicious.
Expand Down
111 changes: 57 additions & 54 deletions README_ko-KR.md
Original file line number Diff line number Diff line change
@@ -1,54 +1,57 @@
[English](./README.md) | [中文](./README_zh-CN.md) | 한국어
# AltSnap
Stefan Sundin의 AltDrag에서 포크되었습니다.

위키를 확인하세요: https://github.com/RamonUnch/AltSnap/wiki

기존 문서: https://stefansundin.github.io/altdrag/doc/

포크된 코드라서 문서가 100% 정확하지는 않습니다.
좀 더 자세한 사항이 궁금하시면 변경사항(changelog)을 확인바랍니다.

AltSnap은 Alt 키를 누르고 윈도 창의 아무곳이나 클릭하여 창을 이동하고 크기를 조절할 수 있도록 하는 유틸리티입니다.
리눅스에서는 이러한 기능과 동작이 일반적으로 적용되어있고 실제로 윈도우에서도 적용하기 어렵지 않습니다.

이 포크는 풍부한 기능을 유지하면서도 최소한의 버그를 최소화하여, 최신 버전으로 유지하려고 노력하는데 목적이 있습니다.

이 포크는 주로 Windows XP와 Windows 10에서 테스트 되었습니다만 Windows NT 4에서 Windows 11까지의 모든 Windows에서 사용이 가능합니다.

주요 차이점:
코드를 최대한 단순화하기 위해 창을 후크(Hook)하는 방식을 제거하였습니다. 이러한 방식은 드래그를 하는동안 어떠한 창이든 스냅할 수 있도록 하는 장점이 있는 반면에, 모든 응용 프로그램에 dll을 삽입(DLL Injection)해야 했었으므로 명백히 보안상의 위험이 있었습니다. 단순히 이 기능을 위해 상당한 양의 코드가 추가되었으며 동시에 32비트 및 64비트 버전의 프로그램을 모두 실행해야 했기 때문에 코드의 복잡도를 크게 증가시켰습니다.

이 버전은 다른 어플리케이션에 아무것도 삽입(Injection)하지 않습니다. 따라서 32비트 운영체제를 사용하든 64비트 운영체제를 사용하든 걱정할 필요가 없습니다.

이외에 제거된 기능은 "타이핑시 포커스"로, 테스트를 시작하기도 전에 이미 사용할 수 없는 상태였으므로 제거 했습니다.

이러한 변화로 소스코드가 훨신 간결해졌고, 약간의 추가적인 옵션을 넣었습니다. 예를 들면 드래그 하는 동안 투명 윈도우를 투명하게 한다던가, 최대화 액션, 프로세스 일시 중지, AltSnap을 조금 더 세밀하게 제어할 수 있는 블랙리스트 등의 추가 옵션이 추가되었습니다.

마지막으로 기존의 AltDrag에서 발생했던 이상 동작과 버그를 잔뜩 수정했습니다.

새로운 기능

기본적으로 옵션 다이얼로그 창에서 새로운 기능을 만나보실 수 있지만, 일부 기능은 AltSnap.ini 파일을 직접 수정해야만 합니다. (트레이 아이콘을 가운데 클릭해 보세요)

# VirusTotal 오탐
최신 빌드에서는 일반적으로 다른 공급업체의 SecureAge APEX와 마찬가지로 종종 경고가 표시되는 것을 볼 수 있습니다. 이러한 경고는 오탐이며 프로그램 개선에 시간을 낭비하는 것이기 때문에 매 릴리스마다 APEX 팀에 연락하는 것을 중단했습니다. 빌드 플래그를 변경하고 이전 버전의 NSIS 인스톨러 시스템으로 전환하는 것만으로 이미 오탐의 수를 많이 줄였습니다. 이것은 일부 최신 바이러스 백신 솔루션의 부족함을 나타냅니다. Chocolatey에서는 VirusTotal에서 5개정도의 양성 탐지는 전혀 의심운것이 아니라고 간주하고 있습니다.

# 빌드
AltSnap은 gcc로 빌드할 수 있습니다. 제 경우엔 i686용을 빌드할때 Mingw-w64를 사용합니다.

최신 버전을 설치하신 후 (저는 MinGW64 기반의 TDM-gcc 10.3를 사용중입니다):

`> make` i386 Win32 GCC 빌드.

`> make -fMakefiledb` i386 GCC 디버그 빌드.

`> make -fMakefileX64` x86_64 GCC 빌드.

`> make -fMakefileX64db` x86_64 GCC 디버그 빌드.

`> make -fMakefileClang` LLVM Clang을 이용한 i386 빌드.

`> make -fMakefileTCC` tcc(Bellard's thiny c compiler)[https://bellard.org/tcc/]를 이용한 i386 빌드

`mk.bat` 와 `mk64.bat`파일을 사용하실 수도 있습니다. Clang의 경우 저는 LLVM5.0.1과 Mingw-w64의 header 및 lib를 사용합니다. 커맨드라인을 변경해서 `-IPath\to\mingw\include` and `-LPath\to\mingw\lib`를 추가하는 것을 잊지마세요.
[English](./README.md) | [中文](./README_zh-CN.md) | 한국어
# AltSnap
Stefan Sundin의 AltDrag에서 포크되었습니다.

위키를 확인하세요: https://github.com/RamonUnch/AltSnap/wiki

기존 문서: https://stefansundin.github.io/altdrag/doc/

포크된 코드라서 문서가 100% 정확하지는 않습니다.
좀 더 자세한 사항이 궁금하시면 변경사항(changelog)을 확인바랍니다.

AltSnap은 Alt 키를 누르고 윈도 창의 아무곳이나 클릭하여 창을 이동하고 크기를 조절할 수 있도록 하는 유틸리티입니다.
리눅스에서는 이러한 기능과 동작이 일반적으로 적용되어있고 실제로 윈도우에서도 적용하기 어렵지 않습니다.

이 포크는 풍부한 기능을 유지하면서도 최소한의 버그를 최소화하여, 최신 버전으로 유지하려고 노력하는데 목적이 있습니다.

이 포크는 주로 Windows XP와 Windows 10에서 테스트 되었습니다만 Windows NT 4에서 Windows 11까지의 모든 Windows에서 사용이 가능합니다.

주요 차이점:
코드를 최대한 단순화하기 위해 창을 후크(Hook)하는 방식을 제거하였습니다. 이러한 방식은 드래그를 하는동안 어떠한 창이든 스냅할 수 있도록 하는 장점이 있는 반면에, 모든 응용 프로그램에 dll을 삽입(DLL Injection)해야 했었으므로 명백히 보안상의 위험이 있었습니다. 단순히 이 기능을 위해 상당한 양의 코드가 추가되었으며 동시에 32비트 및 64비트 버전의 프로그램을 모두 실행해야 했기 때문에 코드의 복잡도를 크게 증가시켰습니다.

이 버전은 다른 어플리케이션에 아무것도 삽입(Injection)하지 않습니다. 따라서 32비트 운영체제를 사용하든 64비트 운영체제를 사용하든 걱정할 필요가 없습니다.

이외에 제거된 기능은 "타이핑시 포커스"로, 테스트를 시작하기도 전에 이미 사용할 수 없는 상태였으므로 제거 했습니다.

이러한 변화로 소스코드가 훨신 간결해졌고, 약간의 추가적인 옵션을 넣었습니다. 예를 들면 드래그 하는 동안 투명 윈도우를 투명하게 한다던가, 최대화 액션, 프로세스 일시 중지, AltSnap을 조금 더 세밀하게 제어할 수 있는 블랙리스트 등의 추가 옵션이 추가되었습니다.

마지막으로 기존의 AltDrag에서 발생했던 이상 동작과 버그를 잔뜩 수정했습니다.

새로운 기능

기본적으로 옵션 다이얼로그 창에서 새로운 기능을 만나보실 수 있지만, 일부 기능은 AltSnap.ini 파일을 직접 수정해야만 합니다. (트레이 아이콘을 가운데 클릭해 보세요)

## 데스크탑 피크 ([PeekDesktop](https://github.com/shanselman/PeekDesktop) 참고)
바탕 화면의 빈 공간(또는 빈 작업 표시줄 영역)을 클릭하여 macOS Sonoma처럼 바탕 화면을 표시합니다. 한 번 클릭하면 보이는 모든 창이 최소화되고, 다시 클릭하거나 다른 응용 프로그램으로 전환하면 복원됩니다. 설정 대화 상자의 「일반」탭에서 이 기능을 활성화할 수 있습니다.

# VirusTotal 오탐
최신 빌드에서는 일반적으로 다른 공급업체의 SecureAge APEX와 마찬가지로 종종 경고가 표시되는 것을 볼 수 있습니다. 이러한 경고는 오탐이며 프로그램 개선에 시간을 낭비하는 것이기 때문에 매 릴리스마다 APEX 팀에 연락하는 것을 중단했습니다. 빌드 플래그를 변경하고 이전 버전의 NSIS 인스톨러 시스템으로 전환하는 것만으로 이미 오탐의 수를 많이 줄였습니다. 이것은 일부 최신 바이러스 백신 솔루션의 부족함을 나타냅니다. Chocolatey에서는 VirusTotal에서 5개정도의 양성 탐지는 전혀 의심운것이 아니라고 간주하고 있습니다.

# 빌드
AltSnap은 gcc로 빌드할 수 있습니다. 제 경우엔 i686용을 빌드할때 Mingw-w64를 사용합니다.

최신 버전을 설치하신 후 (저는 MinGW64 기반의 TDM-gcc 10.3를 사용중입니다):

`> make` i386 Win32 GCC 빌드.

`> make -fMakefiledb` i386 GCC 디버그 빌드.

`> make -fMakefileX64` x86_64 GCC 빌드.

`> make -fMakefileX64db` x86_64 GCC 디버그 빌드.

`> make -fMakefileClang` LLVM Clang을 이용한 i386 빌드.

`> make -fMakefileTCC` tcc(Bellard's thiny c compiler)[https://bellard.org/tcc/]를 이용한 i386 빌드

`mk.bat` 와 `mk64.bat`파일을 사용하실 수도 있습니다. Clang의 경우 저는 LLVM5.0.1과 Mingw-w64의 header 및 lib를 사용합니다. 커맨드라인을 변경해서 `-IPath\to\mingw\include` and `-LPath\to\mingw\lib`를 추가하는 것을 잊지마세요.
3 changes: 3 additions & 0 deletions README_zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@

在选项对话框中可以看到许多新功能,但其中一些功能只能通过编辑AltSnap.ini文件才能使用(用鼠标中键单击该文件的托盘图标)。

## 桌面快览(参考 [PeekDesktop](https://github.com/shanselman/PeekDesktop) 实现)
点击桌面壁纸的空白区域(或任务栏空白区域)即可显示你的桌面——就像 macOS Sonoma 一样。单击一下,所有可见窗口都会最小化;再次点击或切换到任意应用程序即可恢复。你可以在设置对话框的「通用」选项卡中启用此功能。

# 构建
AltSnap使用gcc构建,对于i686来说,我使用Mingw-w64。
只需要安装最新版本(我使用基于MinGW64的TDM-gcc 10.3)并使用:
Expand Down
46 changes: 45 additions & 1 deletion config.c
Original file line number Diff line number Diff line change
Expand Up @@ -519,6 +519,12 @@ static INT_PTR CALLBACK GeneralPageDialogProc(HWND hwnd, UINT msg, WPARAM wParam
{ IDC_RESIZEALL, T_BOL, 0, TEXT("Advanced"), "ResizeAll", V 1 },
{ IDC_USEZONES, T_BMK, 0, TEXT("Zones"), "UseZones", V 0 },
{ IDC_PIERCINGCLICK, T_BOL, 0, TEXT("Advanced"), "PiercingClick", V 0 },
// [Peek]
{ IDC_PEEK_ENABLED, T_BOL, 0, TEXT("Peek"), "PeekDesktop", V 0 },
{ IDC_PEEK_DBLCLICK, T_BMK, 0, TEXT("Peek"), "PeekFlags", V 0 },
{ IDC_PEEK_TASKBAR, T_BMK, 1, TEXT("Peek"), "PeekFlags", V 0 },
{ IDC_PEEK_GAMINGSUPPRESS,T_BMK, 2, TEXT("Peek"), "PeekFlags", V 0 },
{ IDC_PEEK_RESTOREONAPP, T_BMK, 3, TEXT("Peek"), "PeekFlags", V 0 },
};
#undef V

Expand All @@ -544,7 +550,15 @@ static INT_PTR CALLBACK GeneralPageDialogProc(HWND hwnd, UINT msg, WPARAM wParam
{ IDC_AUTOSTART_BOX, L10NIDX(GeneralAutostartBox) },
{ IDC_AUTOSTART, L10NIDX(GeneralAutostart) },
{ IDC_AUTOSTART_HIDE, L10NIDX(GeneralAutostartHide) },
{ IDC_AUTOSTART_ELEVATE,L10NIDX(GeneralAutostartElevate) }
{ IDC_AUTOSTART_ELEVATE,L10NIDX(GeneralAutostartElevate) },

{ IDC_PEEK_BOX, L10NIDX(PeekBox ) },
{ IDC_PEEK_ENABLED, L10NIDX(PeekEnabled ) },
{ IDC_PEEK_DBLCLICK, L10NIDX(PeekDblClick ) },
{ IDC_PEEK_TASKBAR, L10NIDX(PeekTaskbar ) },
{ IDC_PEEK_GAMINGSUPPRESS, L10NIDX(PeekGamingSuppress ) },
{ IDC_PEEK_RESTOREONAPP, L10NIDX(PeekRestoreOnApp ) },
{ IDC_PEEK_MODE_H, L10NIDX(PeekModeH ) },
};

int updatestrings = 0;
Expand Down Expand Up @@ -581,6 +595,15 @@ static INT_PTR CALLBACK GeneralPageDialogProc(HWND hwnd, UINT msg, WPARAM wParam
EnableDlgItem(hwnd, IDC_SMARTERAERO, IsChecked(IDC_SMARTAERO));
}

if (id == IDC_PEEK_ENABLED) {
EnableDlgItem(hwnd, IDC_PEEK_DBLCLICK, val);
EnableDlgItem(hwnd, IDC_PEEK_TASKBAR, val);
EnableDlgItem(hwnd, IDC_PEEK_GAMINGSUPPRESS, val);
EnableDlgItem(hwnd, IDC_PEEK_RESTOREONAPP, val);
EnableDlgItem(hwnd, IDC_PEEK_MODE_H, val);
EnableDlgItem(hwnd, IDC_PEEK_MODE, val);
}

if (id != IDC_ELEVATE && (event == 0 || event == CBN_SELCHANGE)) {
PropSheet_Changed(g_cfgwnd, hwnd);
have_to_apply = 1;
Expand Down Expand Up @@ -614,6 +637,15 @@ static INT_PTR CALLBACK GeneralPageDialogProc(HWND hwnd, UINT msg, WPARAM wParam
CheckDlgButton(hwnd, IDC_AUTOSTART_ELEVATE, eelevated ? BST_CHECKED : BST_UNCHECKED);
EnableDlgItem(hwnd, IDC_AUTOSTART_HIDE, autostart);
EnableDlgItem(hwnd, IDC_AUTOSTART_ELEVATE, autostart && VISTA);

// Peek: enable/disable sub-controls based on PeekEnabled
EnableDlgItem(hwnd, IDC_PEEK_DBLCLICK, IsChecked(IDC_PEEK_ENABLED));
EnableDlgItem(hwnd, IDC_PEEK_TASKBAR, IsChecked(IDC_PEEK_ENABLED));
EnableDlgItem(hwnd, IDC_PEEK_GAMINGSUPPRESS, IsChecked(IDC_PEEK_ENABLED));
EnableDlgItem(hwnd, IDC_PEEK_RESTOREONAPP, IsChecked(IDC_PEEK_ENABLED));
EnableDlgItem(hwnd, IDC_PEEK_MODE_H, IsChecked(IDC_PEEK_ENABLED));
EnableDlgItem(hwnd, IDC_PEEK_MODE, IsChecked(IDC_PEEK_ENABLED));

if(WIN10) EnableDlgItem(hwnd, IDC_INACTIVESCROLL, IsChecked(IDC_INACTIVESCROLL));
} else if (pnmh->code == PSN_APPLY && have_to_apply) {
// all bool options (checkboxes).
Expand All @@ -626,6 +658,9 @@ static INT_PTR CALLBACK GeneralPageDialogProc(HWND hwnd, UINT msg, WPARAM wParam
val = IsChecked(IDC_RZCENTER_NORM)? 1: IsChecked(IDC_RZCENTER_MOVE)? 2:IsChecked(IDC_RZCENTER_CLOSE)? 3: 0;
WritePrivateProfileString(TEXT("General"), TEXT("ResizeCenter"), Uint2lStr(txt, val), inipath);

val = CB_GetCurSelId(IDC_PEEK_MODE);
WritePrivateProfileString(TEXT("Peek"), TEXT("PeekMode"), Uint2lStr(txt, val), inipath);

// Load selected Language
int i = CB_GetCurSelId(IDC_LANGUAGE);
if (langinfo.it && (size_t)i < langinfo.num && lstrcmpi(l10n->Code, langinfo.it[i].code)) {
Expand Down Expand Up @@ -675,6 +710,14 @@ static INT_PTR CALLBACK GeneralPageDialogProc(HWND hwnd, UINT msg, WPARAM wParam
// Language
control = GetDlgItem(hwnd, IDC_LANGUAGE);
CB_DeleteString(control, langinfo.num);

// PeekMode
control = GetDlgItem(hwnd, IDC_PEEK_MODE);
CB_ResetContent(control);
CB_AddString(control, l10n->PeekMode0);
CB_AddString(control, l10n->PeekMode1);
GetPrivateProfileString(TEXT("Peek"), TEXT("PeekMode"), TEXT("0"), txt, ARR_SZ(txt), inipath);
CB_SetCurSel(control, strtoi(txt));
}
return FALSE;
}
Expand Down Expand Up @@ -1767,6 +1810,7 @@ static INT_PTR CALLBACK AboutPageDialogProc(HWND hwnd, UINT msg, WPARAM wParam,
TCHAR txt[1024]; txt[0] = TEXT('\0');
if (langinfo.it) {
for (size_t i = 0; i < langinfo.num; i++) {
if (!langinfo.it[i].lang_english || !langinfo.it[i].author) continue;
lstrcat_s(txt, ARR_SZ(txt), langinfo.it[i].lang_english);
lstrcat_s(txt, ARR_SZ(txt), TEXT(": "));
lstrcat_s(txt, ARR_SZ(txt), langinfo.it[i].author);
Expand Down
Loading