Compare commits
26 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
71fc2d43b7 | ||
|
|
56c2ba79fc | ||
|
|
f3d1abf153 | ||
|
|
d8c2c9eb69 | ||
|
|
4028b6cae0 | ||
|
|
860c495002 | ||
|
|
b71e7e3674 | ||
|
|
6f75d2b3e9 | ||
|
|
3bb62c7089 | ||
|
|
bc7e470429 | ||
|
|
92cb91db1b | ||
|
|
2716832118 | ||
|
|
b81f4dd5e3 | ||
|
|
e09bbea607 | ||
|
|
430f154584 | ||
|
|
58b5c72ead | ||
|
|
1a1c5866e0 | ||
|
|
a05668dffc | ||
|
|
551bb174b0 | ||
|
|
afa868fd7b | ||
|
|
619f3830af | ||
|
|
174fc35707 | ||
|
|
292186be44 | ||
|
|
2c0e3b8e0c | ||
|
|
ee4a2d0fe9 | ||
|
|
6a011ed295 |
@@ -1,4 +1,4 @@
|
||||
root = true
|
||||
|
||||
[*.{c,h}]
|
||||
[*.{c,h,rc}]
|
||||
indent_style = tab
|
||||
|
||||
13
.gitignore
vendored
13
.gitignore
vendored
@@ -1,6 +1,7 @@
|
||||
/msys.exe
|
||||
/msys.res
|
||||
/msys.ini
|
||||
/mingw.exe
|
||||
/mingw.res
|
||||
/mingw.ini
|
||||
/*.exe
|
||||
/*.res
|
||||
/*.ini
|
||||
/*.pkg.tar.xz
|
||||
/*.pkg.tar.xz.sig
|
||||
/pkg/
|
||||
/src/
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) <year> <copyright holders>
|
||||
Copyright (c) 2015 David Macek
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
33
Makefile
33
Makefile
@@ -1,22 +1,29 @@
|
||||
PREFIX=
|
||||
|
||||
msys: msys.exe msys.ini mingw.exe mingw.ini
|
||||
all: msys
|
||||
all: msys2.exe msys2.ini mingw32.exe mingw32.ini mingw64.exe mingw64.ini
|
||||
|
||||
.PHONY: all msys
|
||||
.PHONY: all
|
||||
|
||||
msys.ini: launcher.ini
|
||||
msys2.ini: launcher.ini
|
||||
cp -f $^ $@
|
||||
echo MSYSTEM=MSYS>> $@
|
||||
msys.res: launcher.rc msys.ico
|
||||
$(PREFIX)windres -O COFF -o $@ $< -DMSYSTEM=MSYS -DICONFILE=msys.ico
|
||||
msys.exe: launcher.c msys.res
|
||||
$(PREFIX)gcc -std=c11 -Wall -Wextra -Werror -municode -mwindows -o $@ $^ -luuid -lshlwapi -lpsapi
|
||||
msys2.res: launcher.rc msys2.ico
|
||||
$(PREFIX)windres -O COFF -o $@ $< -DMSYSTEM=MSYS -DICONFILE=msys2.ico
|
||||
msys2.exe: launcher.c msys2.res
|
||||
$(PREFIX)gcc -std=c11 -Wall -Wextra -Werror -static -municode -mwindows -o $@ $^
|
||||
|
||||
mingw.ini: launcher.ini
|
||||
mingw32.ini: launcher.ini
|
||||
cp -f $^ $@
|
||||
echo MSYSTEM=MINGW32>> $@
|
||||
mingw.res: launcher.rc mingw.ico
|
||||
$(PREFIX)windres -O COFF -o $@ $< -DMSYSTEM=MINGW32 -DICONFILE=mingw.ico
|
||||
mingw.exe: launcher.c mingw.res
|
||||
$(PREFIX)gcc -std=c11 -Wall -Wextra -Werror -municode -mwindows -o $@ $^ -luuid -lshlwapi -lpsapi
|
||||
mingw32.res: launcher.rc mingw32.ico
|
||||
$(PREFIX)windres -O COFF -o $@ $< -DMSYSTEM=MINGW32 -DICONFILE=mingw32.ico
|
||||
mingw32.exe: launcher.c mingw32.res
|
||||
$(PREFIX)gcc -std=c11 -Wall -Wextra -Werror -static -municode -mwindows -o $@ $^
|
||||
|
||||
mingw64.ini: launcher.ini
|
||||
cp -f $^ $@
|
||||
echo MSYSTEM=MINGW64>> $@
|
||||
mingw64.res: launcher.rc mingw64.ico
|
||||
$(PREFIX)windres -O COFF -o $@ $< -DMSYSTEM=MINGW64 -DICONFILE=mingw64.ico
|
||||
mingw64.exe: launcher.c mingw64.res
|
||||
$(PREFIX)gcc -std=c11 -Wall -Wextra -Werror -static -municode -mwindows -o $@ $^
|
||||
|
||||
36
PKGBUILD
Normal file
36
PKGBUILD
Normal file
@@ -0,0 +1,36 @@
|
||||
_realname="msys2-launcher"
|
||||
pkgname=("${_realname}-git")
|
||||
pkgver=1.0
|
||||
pkgrel=1
|
||||
pkgdesc="Helper for launching MSYS2 shells"
|
||||
arch=('x86_64' 'i686')
|
||||
license=('MIT')
|
||||
backup=({mingw32,mingw64,msys2}.ini)
|
||||
provides=("${_realname}")
|
||||
conflicts=("${_realname}")
|
||||
depends=("mintty>=2.2.1")
|
||||
makedepends=('mingw-w64-cross-gcc')
|
||||
source=(launcher.{c,ini,rc} {macros,version}.h Makefile {mingw32,mingw64,msys2}.ico)
|
||||
sha512sums=('eac22e62609e06a49931f70b12abaf0f1a412a98bcf349a2b6a0738b511d05ed7ce7731d2e30f9510926c3175d3521d0164e25cd70e9b18ba33aeb887deef11e'
|
||||
'5ed8a2e9997d9d2c1e17940292d68542f897e2716b274741d8a3ba7c8f46235c175b7e0a1252a879ba3c79b571504d25de2a8d6b004aedd117d263195bc2b185'
|
||||
'cf257f1f5b7fc69a32c63fe5bf5299db078621850b1e12358654d71da7777a94a0668d657c1834be308db099cad9d48a42fa7877ad58dfdbd576248150913a12'
|
||||
'6019ca0d67375c1261dda0d54d45fc411b02244c51b71d5c57d2613e9edfb4e8f9000754e5c7d632ed0101005c01cd0a98c3961d5b5f51c94d83eceba4296d35'
|
||||
'2e2669db2e8ef54ff6859f4e9a2657f867aef89094f29386da6df6a39931b55927bd16f92a5058fb4aecc5705a2bf3a867172740bc53bca560b98820790ad3c9'
|
||||
'270db9d92b944754cc71523053532473d8a477241725e7aded02dc34d35895a33cf135be7a87692c0f9d2204731e345b8ae82d33f15a1a197e73357552c564e0'
|
||||
'27b9591fa286a15b0eb76a381191f025184d545359285215b9958632a5bce99484de0130296ff4b285e38cec9d88299c09b2ce1fe4b4957b4ef295d31a620817'
|
||||
'b1ecd3def00a023a9e88806ff9bbb1bbd73086fbf7554799eb5fe8adb16bf96ed1a7da375bb2b9f9268fcf08e25dab4414bb4888e1ee6eff4587ee0973374f6f'
|
||||
'7f369b102391eba9ab56e1fb2157f820ecce41434b7232137da32b924b2d53840731e18ef80916703effc6770e862d1fee2986e66c1d03a8c8bb3feef4f08d58')
|
||||
|
||||
pkgver() {
|
||||
local _major=$(cat version.h | grep -F 'VER_MAJOR' | head -1 | sed -e 's/.* //')
|
||||
local _minor=$(cat version.h | grep -F 'VER_MINOR' | head -1 | sed -e 's/.* //')
|
||||
printf "%s.%s.%s.%s" "${_major}" "${_minor}" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
|
||||
}
|
||||
|
||||
build() {
|
||||
make PREFIX=/opt/bin/${CARCH}-w64-mingw32-
|
||||
}
|
||||
|
||||
package() {
|
||||
cp {mingw32,mingw64,msys2}.{exe,ini} "${pkgdir}"
|
||||
}
|
||||
20
README.md
20
README.md
@@ -1,9 +1,23 @@
|
||||
Msys launcher
|
||||
MSYS2 launcher
|
||||
==============
|
||||
|
||||
A helper for launching Msys shells, adapted from the MSYS2 launcher. Features almost blink-less launching and correct taskbar/start pinning.
|
||||
A helper for launching MSYS2 shells. Features blink-less launching and correct taskbar/start pinning.
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
Just `make` and put the executables inside your Msys root.
|
||||
Just `make` and put the .exe and .ini files inside your MSYS2 root. Needs mintty v2.1.6 or newer.
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
All three default launchers are the same (except for embedded icons and descriptions) and are configured by corresponding .ini files. The .ini file has to be in the same directory as the .exe file and have the same filename (except for the `.exe` -> `.ini` change).
|
||||
|
||||
By default, only `MSYSTEM` is set, but options for inheriting `PATH` and tweaking `MSYS` are prepared, as well as `CHERE_INVOKING` for the shell to stay in the current working directory (instead of changing to the home directory).
|
||||
|
||||
The .ini file contains environment variables, each on a separate line, in the usual `VAR=val` format. Lines starting with `#` are ignored. The values are expanded using the current environment (use Windows `%var%` syntax).
|
||||
|
||||
Pinning
|
||||
-------
|
||||
|
||||
As with many other applications, the correct way to pin a shortcut to the taskbar is by right-clicking the button of a running MSYS2 shell (started by this launcher) on the taskbar and choosing "Pin this program to taskbar". Pinning the `.exe` file itself won't create the shortcut correctly. There are tools to diagnose and fix such a situation (7+ Taskbar Tweaker and Win7AppId) in case re-pinning is not preferred.
|
||||
|
||||
135
launcher.c
135
launcher.c
@@ -3,29 +3,17 @@
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#define PSAPI_VERSION 1
|
||||
#include <windows.h>
|
||||
#include <objbase.h>
|
||||
#include <propvarutil.h>
|
||||
#include <shobjidl.h>
|
||||
#include <shellapi.h>
|
||||
#include <propsys.h>
|
||||
#include <propkey.h>
|
||||
#include <processthreadsapi.h>
|
||||
#include <psapi.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <wchar.h>
|
||||
int _CRT_glob = 0;
|
||||
|
||||
#include "macros.h"
|
||||
|
||||
// if any of the properties change, it's best to use a brand new AppID
|
||||
#define APPID_REVISION 9
|
||||
|
||||
struct MainWindow {
|
||||
DWORD pid;
|
||||
HWND handle;
|
||||
};
|
||||
|
||||
static void ShowError(const wchar_t* desc, const wchar_t* err, const long code) {
|
||||
wchar_t msg[1024];
|
||||
|
||||
@@ -154,54 +142,9 @@ static wchar_t* SetEnv(wchar_t* conffile) {
|
||||
return msystem;
|
||||
}
|
||||
|
||||
static bool IsMainWindow(HWND handle) {
|
||||
return GetWindow(handle, GW_OWNER) == (HWND)0 && IsWindowVisible(handle);
|
||||
}
|
||||
|
||||
static BOOL CALLBACK CheckWindow(HWND handle, LPARAM lParam) {
|
||||
struct MainWindow* data = (struct MainWindow*)lParam;
|
||||
DWORD pid = 0;
|
||||
GetWindowThreadProcessId(handle, &pid);
|
||||
if (data->pid != pid || !IsMainWindow(handle)) {
|
||||
return TRUE;
|
||||
}
|
||||
data->handle = handle;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static HWND FindMainWindow(DWORD pid) {
|
||||
struct MainWindow data;
|
||||
data.pid = pid;
|
||||
data.handle = 0;
|
||||
EnumWindows(CheckWindow, (LPARAM)&data);
|
||||
return data.handle;
|
||||
}
|
||||
|
||||
HRESULT SetAppUserModelProperty(IPropertyStore* store, const PROPERTYKEY* key, LPCWSTR value) {
|
||||
PROPVARIANT propVariant;
|
||||
HRESULT hr;
|
||||
|
||||
propVariant.vt = VT_LPWSTR;
|
||||
hr = SHStrDupW(value, &propVariant.pwszVal);
|
||||
if (FAILED(hr)) {
|
||||
return hr;
|
||||
}
|
||||
|
||||
hr = store->lpVtbl->SetValue(store, key, &propVariant);
|
||||
if (FAILED(hr)) {
|
||||
return hr;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int wmain(int argc, wchar_t* argv[]) {
|
||||
PROCESS_INFORMATION child;
|
||||
int code;
|
||||
int delay = 10;
|
||||
HWND window;
|
||||
IPropertyStore* store;
|
||||
HRESULT hr;
|
||||
size_t buflen;
|
||||
wchar_t* buf;
|
||||
wchar_t* tmp;
|
||||
@@ -210,24 +153,6 @@ int wmain(int argc, wchar_t* argv[]) {
|
||||
wchar_t msysdir[PATH_MAX];
|
||||
wchar_t exepath[PATH_MAX];
|
||||
wchar_t confpath[PATH_MAX];
|
||||
wchar_t wdpath[PATH_MAX];
|
||||
const size_t proplen = 100;
|
||||
wchar_t prop[proplen];
|
||||
|
||||
code = GetCurrentDirectory(PATH_MAX, wdpath);
|
||||
if (code == 0 || code > PATH_MAX) {
|
||||
ShowErrno(L"Could not determine working directory");
|
||||
return __LINE__;
|
||||
}
|
||||
|
||||
tmp = wdpath;
|
||||
while (true) {
|
||||
tmp = wcschr(tmp, L'\\');
|
||||
if (tmp == NULL) {
|
||||
break;
|
||||
}
|
||||
*tmp = L'/';
|
||||
}
|
||||
|
||||
code = GetModuleFileName(NULL, exepath, sizeof(exepath) / sizeof(exepath[0]));
|
||||
if (code == 0) {
|
||||
@@ -300,7 +225,7 @@ int wmain(int argc, wchar_t* argv[]) {
|
||||
ShowError(L"Could not allocate memory", L"", 0);
|
||||
return __LINE__;
|
||||
}
|
||||
code = swprintf(buf, buflen, L"%s\\bin\\mintty.exe -i '%s' -- /bin/bash --login -c 'cd \\'%s\\'; exec %s'", msysdir, exepath, wdpath, argc == 1 ? L"/bin/bash -i" : args);
|
||||
code = swprintf(buf, buflen, L"%s\\usr\\bin\\mintty.exe -i '%s' -o 'AppLaunchCmd=%s' -o 'AppID=MSYS2.Shell.%s.%d' -o 'AppName=MSYS2 %s Shell' -t 'MSYS2 %s Shell' --store-taskbar-properties -- %s %s", msysdir, exepath, exepath, msystem, APPID_REVISION, msystem, msystem, argc == 1 ? L"-" : L"/usr/bin/sh -lc '\"$@\"' sh", args);
|
||||
buflen *= 2;
|
||||
}
|
||||
if (code < 0) {
|
||||
@@ -316,61 +241,5 @@ int wmain(int argc, wchar_t* argv[]) {
|
||||
free(buf);
|
||||
buf = NULL;
|
||||
|
||||
while (true) {
|
||||
Sleep(delay);
|
||||
window = FindMainWindow(GetProcessId(child.hProcess));
|
||||
if (!window) {
|
||||
delay *= 2;
|
||||
if (delay > 60000) {
|
||||
return __LINE__;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
hr = SHGetPropertyStoreForWindow(window, &IID_IPropertyStore, (void**)&store);
|
||||
if (FAILED(hr)) {
|
||||
return __LINE__;
|
||||
}
|
||||
|
||||
code = swprintf(prop, proplen, L"Msys.Shell.%s.%d", msystem, APPID_REVISION);
|
||||
if (code < 0) {
|
||||
ShowErrno(L"Could not write to buffer");
|
||||
return __LINE__;
|
||||
}
|
||||
hr = SetAppUserModelProperty(store, &PKEY_AppUserModel_ID, prop);
|
||||
if (FAILED(hr)) {
|
||||
return __LINE__;
|
||||
}
|
||||
|
||||
code = swprintf(prop, proplen, L"Msys %s Shell", msystem);
|
||||
if (code < 0) {
|
||||
ShowErrno(L"Could not write to buffer");
|
||||
return __LINE__;
|
||||
}
|
||||
hr = SetAppUserModelProperty(store, &PKEY_AppUserModel_RelaunchDisplayNameResource, prop);
|
||||
if (FAILED(hr)) {
|
||||
return __LINE__;
|
||||
}
|
||||
|
||||
hr = SetAppUserModelProperty(store, &PKEY_AppUserModel_RelaunchCommand, exepath);
|
||||
if (FAILED(hr)) {
|
||||
return __LINE__;
|
||||
}
|
||||
|
||||
hr = SetAppUserModelProperty(store, &PKEY_AppUserModel_RelaunchIconResource, exepath);
|
||||
if (FAILED(hr)) {
|
||||
return __LINE__;
|
||||
}
|
||||
|
||||
hr = store->lpVtbl->Commit(store);
|
||||
if (FAILED(hr)) {
|
||||
return __LINE__;
|
||||
}
|
||||
|
||||
store->lpVtbl->Release(store);
|
||||
store = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#MSYS=winsymlinks:nativestrict
|
||||
#MSYS=error_start:mingw64/bin/qtcreator.exe|-debug|<process-id>
|
||||
#CHERE_INVOKING=1
|
||||
#PATH=%SystemRoot%\System32;%SystemRoot%;%SystemRoot%\System32\Wbem
|
||||
#MSYS2_PATH_TYPE=inherit
|
||||
|
||||
26
launcher.rc
26
launcher.rc
@@ -4,20 +4,20 @@
|
||||
1 VERSIONINFO
|
||||
FILEVERSION VER_MAJOR,VER_MINOR,0,0
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904E4"
|
||||
BEGIN
|
||||
VALUE "ProductName", "Msys"
|
||||
VALUE "FileDescription", "Msys " STRINGIFY_A(MSYSTEM) " shell launcher"
|
||||
VALUE "FileVersion", STRINGIFY_A(VER_MAJOR) "." STRINGIFY_A(VER_MINOR)
|
||||
END
|
||||
END
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904E4"
|
||||
BEGIN
|
||||
VALUE "ProductName", "MSYS2"
|
||||
VALUE "FileDescription", "MSYS2 " STRINGIFY_A(MSYSTEM) " shell launcher"
|
||||
VALUE "FileVersion", STRINGIFY_A(VER_MAJOR) "." STRINGIFY_A(VER_MINOR)
|
||||
END
|
||||
END
|
||||
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1252
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1252
|
||||
END
|
||||
END
|
||||
|
||||
id ICON STRINGIFY_A(ICONFILE)
|
||||
|
||||
BIN
mingw32.ico
Normal file
BIN
mingw32.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 25 KiB |
BIN
mingw64.ico
Normal file
BIN
mingw64.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 25 KiB |
Reference in New Issue
Block a user