mirror of
https://github.com/WerWolv/ImHex.git
synced 2026-03-29 00:10:02 -05:00
Compare commits
702 Commits
v1.35.2
...
feature/mu
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
efe0928fc6 | ||
|
|
b3d208e6e6 | ||
|
|
e8b391c0f6 | ||
|
|
02b5df03ab | ||
|
|
e1580e51cf | ||
|
|
3a7578879f | ||
|
|
ea3d4b41a9 | ||
|
|
e0c2a39ce7 | ||
|
|
1fa27b7f09 | ||
|
|
f980f1dae2 | ||
|
|
b81ad53449 | ||
|
|
a9727171e2 | ||
|
|
a1634fb337 | ||
|
|
94a2f9460e | ||
|
|
18cd39270a | ||
|
|
72c2bca363 | ||
|
|
4c153dc76d | ||
|
|
e63606f6bb | ||
|
|
ed6da7fe14 | ||
|
|
a588c96440 | ||
|
|
4c284b224e | ||
|
|
96afa650d1 | ||
|
|
f17d0d3ae1 | ||
|
|
930d2b4280 | ||
|
|
f67b78bd91 | ||
|
|
540e8ed602 | ||
|
|
99cb51e813 | ||
|
|
db000c4b12 | ||
|
|
0cd557a686 | ||
|
|
6142bf859b | ||
|
|
b6498b5c2d | ||
|
|
c15030e96e | ||
|
|
cd2acd73b4 | ||
|
|
cfe06ea1b6 | ||
|
|
ca5c3e0e94 | ||
|
|
6252fd399a | ||
|
|
de571e2c2a | ||
|
|
0cbd052b91 | ||
|
|
aa3ec3ece8 | ||
|
|
6b11028b72 | ||
|
|
269c3e7398 | ||
|
|
08335041f5 | ||
|
|
d75b9cf942 | ||
|
|
b55c40523f | ||
|
|
99a2dee7a2 | ||
|
|
c94265c77b | ||
|
|
7ddfba1b4c | ||
|
|
9ecdd28eea | ||
|
|
d8b36242f6 | ||
|
|
3f470aabe9 | ||
|
|
1e8dd54b3e | ||
|
|
0a6681ccb7 | ||
|
|
0140e24822 | ||
|
|
9fb38922ea | ||
|
|
7752354598 | ||
|
|
497670c4c3 | ||
|
|
84954cd2f1 | ||
|
|
8b6eab401e | ||
|
|
71c11a5923 | ||
|
|
f345edb252 | ||
|
|
be40fd9563 | ||
|
|
5ee2ebfb4f | ||
|
|
cfa6b706a8 | ||
|
|
42f2a62d62 | ||
|
|
41b6ef930a | ||
|
|
948cbe0a9c | ||
|
|
18669f3230 | ||
|
|
4e9f944204 | ||
|
|
fe18cbaa41 | ||
|
|
ed3712e1b9 | ||
|
|
20dc4f31f0 | ||
|
|
19f9296a40 | ||
|
|
06c019387c | ||
|
|
645b43e9cc | ||
|
|
ed37a3711f | ||
|
|
a3460de9dc | ||
|
|
5084009d62 | ||
|
|
e5c003d726 | ||
|
|
327a02b87d | ||
|
|
e9bf1a9f7a | ||
|
|
0c6fa768ea | ||
|
|
483468a6c7 | ||
|
|
8039ae1b90 | ||
|
|
466b372d41 | ||
|
|
3f6b5203ca | ||
|
|
8d1352ddff | ||
|
|
e6ab2c3b7e | ||
|
|
e603c75bd3 | ||
|
|
4f28f97141 | ||
|
|
d0b32e5224 | ||
|
|
2062a23347 | ||
|
|
8c9236a066 | ||
|
|
2f981ef91e | ||
|
|
6725c170ea | ||
|
|
c8cf6e7c08 | ||
|
|
e0b4acee12 | ||
|
|
803ebe34ed | ||
|
|
e981eff1e6 | ||
|
|
aee7a09b6c | ||
|
|
e74e4e92a0 | ||
|
|
6dba15defd | ||
|
|
fee7a16692 | ||
|
|
141030344b | ||
|
|
4fa9586206 | ||
|
|
fbbc430b7c | ||
|
|
bfc68c4d28 | ||
|
|
53fc018ada | ||
|
|
d45dd45720 | ||
|
|
19a9786bbf | ||
|
|
b8caf41423 | ||
|
|
0b3866a56a | ||
|
|
53a7577416 | ||
|
|
f5515417d6 | ||
|
|
24e7c2f3db | ||
|
|
6e6c5bbc67 | ||
|
|
f4403ff480 | ||
|
|
098da20761 | ||
|
|
ef2373e8c0 | ||
|
|
b2c8ed17d5 | ||
|
|
bb594a459f | ||
|
|
7340a30650 | ||
|
|
403104dda1 | ||
|
|
8334fbb236 | ||
|
|
0a0323ce5d | ||
|
|
726d36ba3d | ||
|
|
8bb1521963 | ||
|
|
9457c1f2b9 | ||
|
|
2b24330f9f | ||
|
|
9329170e59 | ||
|
|
98f3de828a | ||
|
|
3f38f42259 | ||
|
|
058a8cdc15 | ||
|
|
d0c1213ea0 | ||
|
|
30967bac6d | ||
|
|
09c9bcb046 | ||
|
|
93f1f5d076 | ||
|
|
93e5d62782 | ||
|
|
4d7021ece1 | ||
|
|
f976988c75 | ||
|
|
1eee31fdbb | ||
|
|
048c483903 | ||
|
|
b646ece14b | ||
|
|
35e8acd69d | ||
|
|
de4135d1ad | ||
|
|
a44959ce1b | ||
|
|
f4bad0053a | ||
|
|
26af5987a5 | ||
|
|
9cf3250751 | ||
|
|
acc77205bb | ||
|
|
a6b4f62d75 | ||
|
|
69c5d553b5 | ||
|
|
637cdd7084 | ||
|
|
8978e193db | ||
|
|
242b100aa3 | ||
|
|
3a888d48df | ||
|
|
721de39dbb | ||
|
|
07e29f2030 | ||
|
|
c117d9b3e5 | ||
|
|
16eae89151 | ||
|
|
95cb6d8ee6 | ||
|
|
af27c09204 | ||
|
|
5e3532267c | ||
|
|
7c0331df65 | ||
|
|
04ab87cd8e | ||
|
|
91f5e84250 | ||
|
|
b1edd95ebc | ||
|
|
758738da5c | ||
|
|
41c8be275b | ||
|
|
117eb1e2a7 | ||
|
|
3129d6e8fd | ||
|
|
2ba7db184b | ||
|
|
2cb0df4080 | ||
|
|
3adc2c44e6 | ||
|
|
6d3ff64894 | ||
|
|
cf84ad6196 | ||
|
|
6259190ad9 | ||
|
|
181be1a58e | ||
|
|
771e191f28 | ||
|
|
d4d6893eb3 | ||
|
|
9e75562662 | ||
|
|
2b3168163b | ||
|
|
252c06eb12 | ||
|
|
2a51d8169a | ||
|
|
7405c4b411 | ||
|
|
309ae7b619 | ||
|
|
64ef56a0df | ||
|
|
fbfe7b0d25 | ||
|
|
8c7e1a3b2d | ||
|
|
bf249cdafe | ||
|
|
59ba6f50cc | ||
|
|
8d6e7c7d44 | ||
|
|
52934ae166 | ||
|
|
56c4f2aa47 | ||
|
|
a1d8cbd7ba | ||
|
|
63a219a32b | ||
|
|
14fb256a6a | ||
|
|
95df7a23c3 | ||
|
|
bb17690cf5 | ||
|
|
a943b02e43 | ||
|
|
199f78347f | ||
|
|
d3d9a42d57 | ||
|
|
1fa45a8c84 | ||
|
|
0b6316ea23 | ||
|
|
466a843263 | ||
|
|
b6ade8b101 | ||
|
|
ff66b97e90 | ||
|
|
c604ec8fb9 | ||
|
|
7564651dd5 | ||
|
|
cad17ddefd | ||
|
|
25d2f209e5 | ||
|
|
8d660c3ffe | ||
|
|
209055d0b0 | ||
|
|
599b55965a | ||
|
|
69a9af5322 | ||
|
|
0303cd0ad0 | ||
|
|
8eb7e9fb05 | ||
|
|
6a1de5fc4e | ||
|
|
a4af55cb66 | ||
|
|
1e17422f5e | ||
|
|
8abaafab79 | ||
|
|
71e1465524 | ||
|
|
3d2ea3753b | ||
|
|
88530eff8b | ||
|
|
df3decf71b | ||
|
|
565ee4cb2d | ||
|
|
40fc325ba9 | ||
|
|
6aca16102d | ||
|
|
cb11b57ab1 | ||
|
|
d504937d50 | ||
|
|
6bfdb7ca4e | ||
|
|
e1637824c6 | ||
|
|
e36f2f2bcb | ||
|
|
1a54e08f11 | ||
|
|
ecc86ee429 | ||
|
|
185a593bc2 | ||
|
|
4a916ebb89 | ||
|
|
1c305ca762 | ||
|
|
17fff56fa0 | ||
|
|
ec1b1c2b7d | ||
|
|
7bae22f56f | ||
|
|
21e5eeef16 | ||
|
|
bf5eea80f6 | ||
|
|
9f9a6d9827 | ||
|
|
ae622e6d75 | ||
|
|
68fbff631f | ||
|
|
6cdce75095 | ||
|
|
f699e76c56 | ||
|
|
a729329cd4 | ||
|
|
d5020ce9bb | ||
|
|
126868c251 | ||
|
|
b206e9fc95 | ||
|
|
4b6ff68464 | ||
|
|
b23a0febb5 | ||
|
|
05ad547341 | ||
|
|
f10af882a7 | ||
|
|
98f32ebcad | ||
|
|
e2c302836f | ||
|
|
f1d9642cf6 | ||
|
|
5c58e5b545 | ||
|
|
803cb335e1 | ||
|
|
ae4dde8255 | ||
|
|
cb34f68b1b | ||
|
|
96ef983cfb | ||
|
|
d8c3d67dfe | ||
|
|
5de5153663 | ||
|
|
1e747b6831 | ||
|
|
fbe9d16073 | ||
|
|
d02c0073a0 | ||
|
|
1090b9879c | ||
|
|
5a6af976cd | ||
|
|
55e39a5d30 | ||
|
|
c9b1ddfb59 | ||
|
|
f7dd696ffc | ||
|
|
70f210ac5d | ||
|
|
cad1c11f8b | ||
|
|
f7fa305e82 | ||
|
|
f96c51e854 | ||
|
|
c19705d3e5 | ||
|
|
1190511994 | ||
|
|
69ee7ef63c | ||
|
|
fc95e5a9a8 | ||
|
|
6ecc495d43 | ||
|
|
6e861001cf | ||
|
|
c56af08c7e | ||
|
|
e68abefe48 | ||
|
|
fd0635cb82 | ||
|
|
baa3cfb354 | ||
|
|
aea9bab853 | ||
|
|
48de609f53 | ||
|
|
71f4f87288 | ||
|
|
48b202c56b | ||
|
|
d975019a7b | ||
|
|
6009b5013b | ||
|
|
24979d7fbd | ||
|
|
b4bf42e377 | ||
|
|
f94819351a | ||
|
|
8da69c11d9 | ||
|
|
635a825095 | ||
|
|
bbffdbf56f | ||
|
|
1c30533d19 | ||
|
|
dcd80fe6ad | ||
|
|
525ab8d945 | ||
|
|
d8fb3f526a | ||
|
|
a55df1d111 | ||
|
|
2cf32ba38d | ||
|
|
c82907153e | ||
|
|
165403da67 | ||
|
|
0e4d94946e | ||
|
|
9f9c5abf35 | ||
|
|
6a3b10111f | ||
|
|
0a55f4bf83 | ||
|
|
493d66d991 | ||
|
|
268b495a29 | ||
|
|
180f4926f8 | ||
|
|
c853349b78 | ||
|
|
ee555e0da9 | ||
|
|
3dec4cc698 | ||
|
|
d7b2b94cec | ||
|
|
c9e88586aa | ||
|
|
1d641504b1 | ||
|
|
655e068b9b | ||
|
|
67a9f314cc | ||
|
|
ff2b58e8a3 | ||
|
|
a1482cb40e | ||
|
|
89111059f9 | ||
|
|
0ae823716a | ||
|
|
dab3f722e8 | ||
|
|
0dc1af0747 | ||
|
|
021206e052 | ||
|
|
cb09cf3734 | ||
|
|
f0525d6463 | ||
|
|
e22424ffa4 | ||
|
|
6e666c64e8 | ||
|
|
5f5f6ac539 | ||
|
|
3024c79f4f | ||
|
|
ba96d86dc2 | ||
|
|
40ec7195d1 | ||
|
|
f10dfa0c20 | ||
|
|
6a5473f6fe | ||
|
|
f79de6fbe8 | ||
|
|
ec4ee3132b | ||
|
|
1298f2b688 | ||
|
|
534a2f1d28 | ||
|
|
c8e95cf3c3 | ||
|
|
c4918a963c | ||
|
|
bf6f738d2e | ||
|
|
1605904eb1 | ||
|
|
138517f116 | ||
|
|
d4a4cb2e80 | ||
|
|
9a9dc328e3 | ||
|
|
50eea0a4f1 | ||
|
|
528a8b5b46 | ||
|
|
0db0bc53fa | ||
|
|
0297c267e9 | ||
|
|
5af85f24f6 | ||
|
|
5110a7578e | ||
|
|
5af28670f0 | ||
|
|
efa2b781dd | ||
|
|
979f151181 | ||
|
|
6f125f18c3 | ||
|
|
edba7051f0 | ||
|
|
fa1ae8d746 | ||
|
|
a476617432 | ||
|
|
ffac13bfef | ||
|
|
f877bf21ba | ||
|
|
4bc4882b1f | ||
|
|
084c17dc26 | ||
|
|
26c39d6822 | ||
|
|
aefc173227 | ||
|
|
bf44a1cce6 | ||
|
|
a76c6c653d | ||
|
|
f11205bba7 | ||
|
|
72d9c5019c | ||
|
|
58d66e3e97 | ||
|
|
43c88a2fab | ||
|
|
9ce64ec6e1 | ||
|
|
c749d6a7dc | ||
|
|
f3e6d35c98 | ||
|
|
0be539b8a5 | ||
|
|
0454a369e5 | ||
|
|
010025cbfa | ||
|
|
61cae0a9f8 | ||
|
|
9e83d9e68c | ||
|
|
248acd5e26 | ||
|
|
42c1f5601a | ||
|
|
9c1a673047 | ||
|
|
99b90f90ac | ||
|
|
6ead8d8b49 | ||
|
|
9b12232e9f | ||
|
|
c1ed1baaad | ||
|
|
ab34312089 | ||
|
|
a25d92fbb7 | ||
|
|
6005af1595 | ||
|
|
9a4329807a | ||
|
|
8e01da4c12 | ||
|
|
eb8ea520c7 | ||
|
|
512fcd361b | ||
|
|
aad6f6bcbe | ||
|
|
0af21505d7 | ||
|
|
2ae69e8e72 | ||
|
|
9274fac8e1 | ||
|
|
e2f82c60e6 | ||
|
|
bfddf24204 | ||
|
|
382599dcf6 | ||
|
|
5f2c07f2d8 | ||
|
|
914024c0b5 | ||
|
|
c5d3387962 | ||
|
|
7cc99c6fc9 | ||
|
|
a29b502a33 | ||
|
|
20cb74364f | ||
|
|
1c5a50c8d8 | ||
|
|
470523cc86 | ||
|
|
f6bc3d4650 | ||
|
|
41b1228d31 | ||
|
|
2cb4462274 | ||
|
|
810cd40ccd | ||
|
|
f931beb49a | ||
|
|
1c3dfc9b2f | ||
|
|
a1d4545e29 | ||
|
|
8865db2007 | ||
|
|
d2056d9409 | ||
|
|
74e74ddc38 | ||
|
|
5fcb737559 | ||
|
|
9303025427 | ||
|
|
680985fc13 | ||
|
|
5a360eb614 | ||
|
|
4a74bd78fd | ||
|
|
0f53656952 | ||
|
|
9ca40d3651 | ||
|
|
ab12503f62 | ||
|
|
b446d7fd4a | ||
|
|
fd46d85762 | ||
|
|
fa421afb00 | ||
|
|
a79d3e28ca | ||
|
|
fbb4f65735 | ||
|
|
00c62c90f6 | ||
|
|
384aa6e6a9 | ||
|
|
1c755249ec | ||
|
|
2c303b5bf2 | ||
|
|
415e3b4a93 | ||
|
|
8d9b056c8c | ||
|
|
a527a7f0b0 | ||
|
|
d78d955d11 | ||
|
|
9375a60cd9 | ||
|
|
bb99b9a0ef | ||
|
|
313e59d7f9 | ||
|
|
e34e0e62f2 | ||
|
|
212f75f1cb | ||
|
|
a07c79efcb | ||
|
|
89090b25e3 | ||
|
|
721164e562 | ||
|
|
b8ba980a20 | ||
|
|
79ded38434 | ||
|
|
f52db884a9 | ||
|
|
ee4bb33b0a | ||
|
|
caf8fa8e25 | ||
|
|
c46dea4c9e | ||
|
|
002b7b4f87 | ||
|
|
0a6a8c671f | ||
|
|
36014b706d | ||
|
|
df5e01d4eb | ||
|
|
c6f1525f55 | ||
|
|
5511259f2d | ||
|
|
f2ea7ca5d1 | ||
|
|
6184bbeae2 | ||
|
|
21506578f5 | ||
|
|
f39f395393 | ||
|
|
ed0a94659e | ||
|
|
7f75706584 | ||
|
|
3f316e42f2 | ||
|
|
4a331c0331 | ||
|
|
6a28de100c | ||
|
|
992f18b94b | ||
|
|
040a606b39 | ||
|
|
13e079d1b8 | ||
|
|
d9a7f40eb4 | ||
|
|
8d123da847 | ||
|
|
093310a9e5 | ||
|
|
21b315b97e | ||
|
|
c70cc3a6f1 | ||
|
|
1e71d8afc0 | ||
|
|
cb6b74b269 | ||
|
|
a1e399aa1a | ||
|
|
e1dfdd9400 | ||
|
|
6ab2e81f1c | ||
|
|
cf09029847 | ||
|
|
d02e170dac | ||
|
|
2b715bb0de | ||
|
|
2dcaf2c77b | ||
|
|
1b9f4f33de | ||
|
|
3c73f88a52 | ||
|
|
8acdc19be4 | ||
|
|
22252d9044 | ||
|
|
5948a74ad1 | ||
|
|
e46d9d7650 | ||
|
|
813276c907 | ||
|
|
7032473ecf | ||
|
|
807f1fb561 | ||
|
|
296f80ffe5 | ||
|
|
d45e0d1cac | ||
|
|
4b8f9984d5 | ||
|
|
7623610704 | ||
|
|
a7fe384a31 | ||
|
|
485ce887ea | ||
|
|
2a0bb79513 | ||
|
|
21ae88702f | ||
|
|
0ff1bb392c | ||
|
|
01af2f364c | ||
|
|
a639dddd19 | ||
|
|
71ec6c5061 | ||
|
|
8c4c4f5e8b | ||
|
|
2c2d3b2de3 | ||
|
|
caae5c9711 | ||
|
|
72822d03aa | ||
|
|
9de3dd89c5 | ||
|
|
bcb69b9855 | ||
|
|
6d2761f141 | ||
|
|
05c25b6aff | ||
|
|
9be9eb90f6 | ||
|
|
71f2f3a5fc | ||
|
|
862b1d407c | ||
|
|
5da0da48c8 | ||
|
|
3f1a51e350 | ||
|
|
d167e43252 | ||
|
|
fe9eecd031 | ||
|
|
ded8cff415 | ||
|
|
3497716a00 | ||
|
|
c78b4a3343 | ||
|
|
17359be58a | ||
|
|
382a62343d | ||
|
|
7e0f60615b | ||
|
|
e1a49b38a7 | ||
|
|
4333b8c351 | ||
|
|
6464377a89 | ||
|
|
4fcf732814 | ||
|
|
0d4f3e5735 | ||
|
|
1f2e453e20 | ||
|
|
5236c7b468 | ||
|
|
1738e8883f | ||
|
|
cc4563afb0 | ||
|
|
4b3bf2f358 | ||
|
|
80084f5c5a | ||
|
|
6d14b3f6bd | ||
|
|
592f613a61 | ||
|
|
3739bcc40c | ||
|
|
101c7a36fb | ||
|
|
21be959cba | ||
|
|
b3a0ebe7b6 | ||
|
|
96a588bd86 | ||
|
|
866b956680 | ||
|
|
d88252c6fd | ||
|
|
414e7d36a0 | ||
|
|
e0b4931a54 | ||
|
|
a587c5ff74 | ||
|
|
0b2eca3066 | ||
|
|
fa28052958 | ||
|
|
54f5bd1d80 | ||
|
|
4b3bbb4a97 | ||
|
|
187d90e8f2 | ||
|
|
2f60f61c15 | ||
|
|
057543da15 | ||
|
|
3c060cc57a | ||
|
|
928b4c6c4c | ||
|
|
871a0d535c | ||
|
|
87db9def32 | ||
|
|
04763eaeea | ||
|
|
b6c08a1a11 | ||
|
|
811c995047 | ||
|
|
7011df2ced | ||
|
|
a24692b4be | ||
|
|
0e7a32470b | ||
|
|
212d2f9db4 | ||
|
|
0263d3538e | ||
|
|
63c6028522 | ||
|
|
075ece2da7 | ||
|
|
e9fb02285e | ||
|
|
5dfd8c89a3 | ||
|
|
e9f7908afb | ||
|
|
fafce72c01 | ||
|
|
c3d15157ad | ||
|
|
e0712f73c2 | ||
|
|
3dd5b2365a | ||
|
|
b523f55984 | ||
|
|
79b8b77b25 | ||
|
|
c6065808a7 | ||
|
|
d69ae39b6f | ||
|
|
35739d6d0d | ||
|
|
e726fce360 | ||
|
|
0a038fecff | ||
|
|
0184bf9a7d | ||
|
|
60663babc8 | ||
|
|
a7115d4300 | ||
|
|
29558c9910 | ||
|
|
7c1d643f97 | ||
|
|
b2fc80f970 | ||
|
|
efee128c1c | ||
|
|
c3ddd68866 | ||
|
|
3cde4472c8 | ||
|
|
4c38fe261d | ||
|
|
33f7191c0d | ||
|
|
cda9ad3b30 | ||
|
|
1a7bd49361 | ||
|
|
cf2e189049 | ||
|
|
d5f5ba941a | ||
|
|
9a973be7ba | ||
|
|
d8e1284946 | ||
|
|
ce26fe1db7 | ||
|
|
a8ad045248 | ||
|
|
d097f6ada0 | ||
|
|
1b26db40f7 | ||
|
|
602b946fc9 | ||
|
|
48fc1a7a1e | ||
|
|
416889f49d | ||
|
|
5ca3222e5b | ||
|
|
d49d82e982 | ||
|
|
a4d5679219 | ||
|
|
bead103f3d | ||
|
|
e50b6733c4 | ||
|
|
75e5dbaaa4 | ||
|
|
965113c2b4 | ||
|
|
3bddaf509d | ||
|
|
c1c51e0baf | ||
|
|
09b6c2ab5b | ||
|
|
13fd956039 | ||
|
|
b6f0ee90af | ||
|
|
90e11e1c5d | ||
|
|
fc40e8ba70 | ||
|
|
7652b4a5b8 | ||
|
|
fb249767f1 | ||
|
|
d7ed311bcf | ||
|
|
8422965d0b | ||
|
|
7975edade4 | ||
|
|
1e18935513 | ||
|
|
c311b5315f | ||
|
|
26a73e0fba | ||
|
|
07c259c9c1 | ||
|
|
9e1c2d5a2c | ||
|
|
d7fb1b737f | ||
|
|
84c9c69fa3 | ||
|
|
12ca4e29cf | ||
|
|
27b1a5dc98 | ||
|
|
de36cc8445 | ||
|
|
03d344c0a2 | ||
|
|
39f01538c7 | ||
|
|
28c57cf666 | ||
|
|
59d120537d | ||
|
|
66d18e9475 | ||
|
|
1f5e4ceb0c | ||
|
|
0cbc65a52f | ||
|
|
2b0367cca6 | ||
|
|
1f01f480e0 | ||
|
|
7a167962d6 | ||
|
|
dae028d25d | ||
|
|
88e2fa04e7 | ||
|
|
bb0a8047ea | ||
|
|
b652565b57 | ||
|
|
9aaf6f3105 | ||
|
|
c26eccfe28 | ||
|
|
9fd547112d | ||
|
|
14bfc8af72 | ||
|
|
20f3458e37 | ||
|
|
6326e2d141 | ||
|
|
23ca3c1d2d | ||
|
|
0656ab4b88 | ||
|
|
90bb5d187c | ||
|
|
75a62e2bde | ||
|
|
7cd36b80eb | ||
|
|
dd607621d7 | ||
|
|
2595febf14 | ||
|
|
dc058c4cf3 | ||
|
|
25824e1821 | ||
|
|
381c2d52ee | ||
|
|
4020ac9843 | ||
|
|
b3b7a19df4 | ||
|
|
313e3e748f | ||
|
|
09b9f26e6f | ||
|
|
01b9cc64d6 | ||
|
|
97bf1dc850 | ||
|
|
f94794fe3e | ||
|
|
68e528dd3a | ||
|
|
06ab1d34aa | ||
|
|
2f2717e9aa | ||
|
|
88d24c2a03 | ||
|
|
ec2a2a6fbb | ||
|
|
60b81e714b | ||
|
|
2cd8b13c1d | ||
|
|
4afedb5131 | ||
|
|
71880ad2ad | ||
|
|
a30cce4cbc | ||
|
|
08b4f60ead | ||
|
|
11498bd09b | ||
|
|
7384c88ad6 | ||
|
|
6f22d70d59 | ||
|
|
adc279d681 | ||
|
|
f90dc5d619 | ||
|
|
6fd594c1f4 | ||
|
|
b94a4288bf | ||
|
|
cbf415256b | ||
|
|
4b1884944d | ||
|
|
5ff752c9af | ||
|
|
0e331a7cd1 | ||
|
|
10970d170c |
7
.github/workflows/analysis.yml
vendored
7
.github/workflows/analysis.yml
vendored
@@ -8,7 +8,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
codeql:
|
codeql:
|
||||||
name: 🐛 CodeQL
|
name: 🐛 CodeQL
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
permissions:
|
permissions:
|
||||||
actions: read
|
actions: read
|
||||||
contents: read
|
contents: read
|
||||||
@@ -49,7 +49,7 @@ jobs:
|
|||||||
set -x
|
set -x
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
CC=gcc-12 CXX=g++-12 cmake \
|
CC=gcc-14 CXX=g++-14 cmake \
|
||||||
-DCMAKE_BUILD_TYPE=$BUILD_TYPE \
|
-DCMAKE_BUILD_TYPE=$BUILD_TYPE \
|
||||||
-DCMAKE_INSTALL_PREFIX="$PWD/install" \
|
-DCMAKE_INSTALL_PREFIX="$PWD/install" \
|
||||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||||
@@ -57,8 +57,9 @@ jobs:
|
|||||||
-DCMAKE_C_FLAGS="-fuse-ld=lld" \
|
-DCMAKE_C_FLAGS="-fuse-ld=lld" \
|
||||||
-DCMAKE_CXX_FLAGS="-fuse-ld=lld" \
|
-DCMAKE_CXX_FLAGS="-fuse-ld=lld" \
|
||||||
-DIMHEX_PATTERNS_PULL_MASTER=ON \
|
-DIMHEX_PATTERNS_PULL_MASTER=ON \
|
||||||
|
-G Ninja \
|
||||||
..
|
..
|
||||||
make -j 4 install
|
ninja install
|
||||||
|
|
||||||
- name: 🗯️ Perform CodeQL Analysis
|
- name: 🗯️ Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v2
|
uses: github/codeql-action/analyze@v2
|
||||||
482
.github/workflows/build.yml
vendored
482
.github/workflows/build.yml
vendored
@@ -6,6 +6,7 @@ on:
|
|||||||
- 'master'
|
- 'master'
|
||||||
- 'releases/**'
|
- 'releases/**'
|
||||||
- 'tests/**'
|
- 'tests/**'
|
||||||
|
- 'feature/**'
|
||||||
pull_request:
|
pull_request:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
@@ -18,11 +19,18 @@ jobs:
|
|||||||
win:
|
win:
|
||||||
runs-on: windows-2022
|
runs-on: windows-2022
|
||||||
name: 🪟 Windows MINGW64
|
name: 🪟 Windows MINGW64
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
shell: msys2 {0}
|
shell: msys2 {0}
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CCACHE_DIR: "${{ github.workspace }}/.ccache"
|
CCACHE_DIR: "${{ github.workspace }}/.ccache"
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
id-token: write
|
||||||
|
attestations: write
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: 🧰 Checkout
|
- name: 🧰 Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -64,7 +72,7 @@ jobs:
|
|||||||
cd build
|
cd build
|
||||||
|
|
||||||
cmake -G "Ninja" \
|
cmake -G "Ninja" \
|
||||||
-DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} \
|
-DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \
|
||||||
-DCMAKE_INSTALL_PREFIX="$PWD/install" \
|
-DCMAKE_INSTALL_PREFIX="$PWD/install" \
|
||||||
-DIMHEX_GENERATE_PACKAGE=ON \
|
-DIMHEX_GENERATE_PACKAGE=ON \
|
||||||
-DIMHEX_USE_DEFAULT_BUILD_SETTINGS=ON \
|
-DIMHEX_USE_DEFAULT_BUILD_SETTINGS=ON \
|
||||||
@@ -81,11 +89,62 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
cd build
|
cd build
|
||||||
ninja install
|
ninja install
|
||||||
|
|
||||||
|
- name: 🪲 Create PDBs for MSI
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
|
|
||||||
|
mkdir cv2pdb
|
||||||
|
cd cv2pdb
|
||||||
|
wget https://github.com/rainers/cv2pdb/releases/download/v0.52/cv2pdb-0.52.zip
|
||||||
|
unzip cv2pdb-0.52.zip
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
cv2pdb/cv2pdb.exe imhex.exe
|
||||||
|
cv2pdb/cv2pdb.exe imhex-gui.exe
|
||||||
|
cv2pdb/cv2pdb.exe libimhex.dll
|
||||||
|
|
||||||
|
for plugin in plugins/*.hexplug; do
|
||||||
|
cv2pdb/cv2pdb.exe $plugin
|
||||||
|
done
|
||||||
|
|
||||||
|
rm -rf cv2pdb
|
||||||
|
|
||||||
|
- name: 📦 Bundle MSI
|
||||||
|
run: |
|
||||||
|
cd build
|
||||||
cpack
|
cpack
|
||||||
mv ImHex-*.msi ../imhex-${{env.IMHEX_VERSION}}-Windows-x86_64.msi
|
mv ImHex-*.msi ../imhex-${{ env.IMHEX_VERSION }}-Windows-x86_64.msi
|
||||||
|
|
||||||
echo "ImHex checks for the existence of this file to determine if it is running in portable mode. You should not delete this file" > $PWD/install/PORTABLE
|
echo "ImHex checks for the existence of this file to determine if it is running in portable mode. You should not delete this file" > $PWD/install/PORTABLE
|
||||||
|
|
||||||
|
- name: 🪲 Create PDBs for ZIP
|
||||||
|
run: |
|
||||||
|
cd build/install
|
||||||
|
|
||||||
|
mkdir cv2pdb
|
||||||
|
cd cv2pdb
|
||||||
|
wget https://github.com/rainers/cv2pdb/releases/download/v0.52/cv2pdb-0.52.zip
|
||||||
|
unzip cv2pdb-0.52.zip
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
cv2pdb/cv2pdb.exe imhex.exe
|
||||||
|
cv2pdb/cv2pdb.exe imhex-gui.exe
|
||||||
|
cv2pdb/cv2pdb.exe libimhex.dll
|
||||||
|
|
||||||
|
for plugin in plugins/*.hexplug; do
|
||||||
|
cv2pdb/cv2pdb.exe $plugin
|
||||||
|
done
|
||||||
|
|
||||||
|
rm -rf cv2pdb
|
||||||
|
|
||||||
|
- name: 🗝️ Generate build provenance attestations
|
||||||
|
uses: actions/attest-build-provenance@v2
|
||||||
|
if: github.event.pull_request.head.repo.full_name == github.repository
|
||||||
|
with:
|
||||||
|
subject-path: |
|
||||||
|
imhex-*.msi
|
||||||
|
|
||||||
- name: ⬆️ Upload Windows Installer
|
- name: ⬆️ Upload Windows Installer
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
@@ -107,7 +166,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
set -x
|
set -x
|
||||||
echo "NoGPU version Powered by Mesa 3D : https://fdossena.com/?p=mesa%2Findex.frag" > build/install/MESA.md
|
echo "NoGPU version Powered by Mesa 3D : https://fdossena.com/?p=mesa%2Findex.frag" > build/install/MESA.md
|
||||||
curl https://werwolv.net/downloads/mesa/MesaForWindows-x64-latest.7z -L -o mesa.7z
|
curl https://downloads.fdossena.com/geth.php?r=mesa64-latest -L -o mesa.7z
|
||||||
7z e mesa.7z
|
7z e mesa.7z
|
||||||
mv opengl32.dll build/install
|
mv opengl32.dll build/install
|
||||||
|
|
||||||
@@ -119,9 +178,70 @@ jobs:
|
|||||||
path: |
|
path: |
|
||||||
build/install/*
|
build/install/*
|
||||||
|
|
||||||
|
win-plugin-template-test:
|
||||||
|
runs-on: windows-2022
|
||||||
|
name: 🧪 Plugin Template Test
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: msys2 {0}
|
||||||
|
|
||||||
|
needs: win
|
||||||
|
|
||||||
|
env:
|
||||||
|
IMHEX_SDK_PATH: "${{ github.workspace }}/out/sdk"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: 🧰 Checkout ImHex
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
path: imhex
|
||||||
|
|
||||||
|
- name: 🟦 Install msys2
|
||||||
|
uses: msys2/setup-msys2@v2
|
||||||
|
with:
|
||||||
|
msystem: mingw64
|
||||||
|
|
||||||
|
- name: ⬇️ Install dependencies
|
||||||
|
run: |
|
||||||
|
set -x
|
||||||
|
imhex/dist/get_deps_msys2.sh
|
||||||
|
|
||||||
|
- name: 🧰 Checkout ImHex-Plugin-Template
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: WerWolv/ImHex-Plugin-Template
|
||||||
|
submodules: recursive
|
||||||
|
path: template
|
||||||
|
|
||||||
|
- name: ⬇️ Download artifact
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: Windows Portable x86_64
|
||||||
|
path: out
|
||||||
|
|
||||||
|
- name: 🛠️ Build
|
||||||
|
run: |
|
||||||
|
set -x
|
||||||
|
cd template
|
||||||
|
mkdir -p build
|
||||||
|
cd build
|
||||||
|
|
||||||
|
cmake -G "Ninja" \
|
||||||
|
-DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \
|
||||||
|
-DIMHEX_USE_DEFAULT_BUILD_SETTINGS=ON \
|
||||||
|
-DUSE_SYSTEM_CAPSTONE=ON \
|
||||||
|
..
|
||||||
|
|
||||||
|
ninja
|
||||||
|
|
||||||
# MacOS build
|
# MacOS build
|
||||||
macos:
|
macos-x86:
|
||||||
runs-on: macos-12
|
runs-on: macos-13
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
id-token: write
|
||||||
|
attestations: write
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
@@ -132,7 +252,7 @@ jobs:
|
|||||||
- suffix: ""
|
- suffix: ""
|
||||||
custom_glfw: false
|
custom_glfw: false
|
||||||
|
|
||||||
name: 🍎 macOS 12.0${{matrix.suffix}}
|
name: 🍎 macOS 13${{ matrix.suffix }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: 🧰 Checkout
|
- name: 🧰 Checkout
|
||||||
@@ -152,15 +272,19 @@ jobs:
|
|||||||
max-size: 1G
|
max-size: 1G
|
||||||
|
|
||||||
- name: ⬇️ Install dependencies
|
- name: ⬇️ Install dependencies
|
||||||
|
env:
|
||||||
|
# Make brew not display useless errors
|
||||||
|
HOMEBREW_TESTS: 1
|
||||||
run: |
|
run: |
|
||||||
brew reinstall python || brew link --overwrite python || true
|
brew reinstall python --quiet || true
|
||||||
brew bundle --no-lock --file dist/Brewfile
|
brew link --overwrite --quiet python 2>/dev/null || true
|
||||||
|
brew bundle --no-lock --quiet --file dist/macOS/Brewfile || true
|
||||||
rm -rf /usr/local/Cellar/capstone
|
rm -rf /usr/local/Cellar/capstone
|
||||||
|
|
||||||
- name: ⬇️ Install classic glfw
|
- name: ⬇️ Install classic glfw
|
||||||
if: ${{! matrix.custom_glfw}}
|
if: ${{! matrix.custom_glfw }}
|
||||||
run: |
|
run: |
|
||||||
brew install glfw || true
|
brew install --quiet glfw || true
|
||||||
|
|
||||||
- name: ⬇️ Install .NET
|
- name: ⬇️ Install .NET
|
||||||
uses: actions/setup-dotnet@v4
|
uses: actions/setup-dotnet@v4
|
||||||
@@ -168,7 +292,7 @@ jobs:
|
|||||||
dotnet-version: '8.0.100'
|
dotnet-version: '8.0.100'
|
||||||
|
|
||||||
- name: 🧰 Checkout glfw
|
- name: 🧰 Checkout glfw
|
||||||
if: ${{matrix.custom_glfw}}
|
if: ${{ matrix.custom_glfw }}
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
repository: glfw/glfw
|
repository: glfw/glfw
|
||||||
@@ -176,7 +300,7 @@ jobs:
|
|||||||
|
|
||||||
# GLFW custom build (to allow software rendering)
|
# GLFW custom build (to allow software rendering)
|
||||||
- name: ⬇️ Patch and install custom glfw
|
- name: ⬇️ Patch and install custom glfw
|
||||||
if: ${{matrix.custom_glfw}}
|
if: ${{ matrix.custom_glfw }}
|
||||||
run: |
|
run: |
|
||||||
set -x
|
set -x
|
||||||
cd glfw
|
cd glfw
|
||||||
@@ -186,7 +310,7 @@ jobs:
|
|||||||
cd build
|
cd build
|
||||||
|
|
||||||
cmake -G "Ninja" \
|
cmake -G "Ninja" \
|
||||||
-DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} \
|
-DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \
|
||||||
-DBUILD_SHARED_LIBS=ON \
|
-DBUILD_SHARED_LIBS=ON \
|
||||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||||
@@ -201,14 +325,15 @@ jobs:
|
|||||||
set -x
|
set -x
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
CC=$(brew --prefix gcc@12)/bin/gcc-12 \
|
CC=$(brew --prefix llvm)/bin/clang \
|
||||||
CXX=$(brew --prefix gcc@12)/bin/g++-12 \
|
CXX=$(brew --prefix llvm)/bin/clang++ \
|
||||||
OBJC=$(brew --prefix llvm)/bin/clang \
|
OBJC=$(brew --prefix llvm)/bin/clang \
|
||||||
OBJCXX=$(brew --prefix llvm)/bin/clang++ \
|
OBJCXX=$(brew --prefix llvm)/bin/clang++ \
|
||||||
PKG_CONFIG_PATH="$(brew --prefix openssl)/lib/pkgconfig":"$(brew --prefix)/lib/pkgconfig" \
|
PKG_CONFIG_PATH="$(brew --prefix openssl)/lib/pkgconfig":"$(brew --prefix)/lib/pkgconfig" \
|
||||||
cmake -G "Ninja" \
|
cmake -G "Ninja" \
|
||||||
-DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} \
|
-DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \
|
||||||
-DIMHEX_GENERATE_PACKAGE=ON \
|
-DIMHEX_GENERATE_PACKAGE=ON \
|
||||||
|
-DIMHEX_SYSTEM_LIBRARY_PATH="$(brew --prefix llvm)/lib;$(brew --prefix llvm)/lib/unwind;$(brew --prefix llvm)/lib/c++;$(brew --prefix)/lib" \
|
||||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||||
-DCMAKE_OBJC_COMPILER_LAUNCHER=ccache \
|
-DCMAKE_OBJC_COMPILER_LAUNCHER=ccache \
|
||||||
@@ -236,28 +361,48 @@ jobs:
|
|||||||
cd build/install
|
cd build/install
|
||||||
chmod -R 755 ImHex.app/
|
chmod -R 755 ImHex.app/
|
||||||
|
|
||||||
|
- name: 🔫 Kill XProtect
|
||||||
|
run: |
|
||||||
|
# See https://github.com/actions/runner-images/issues/7522
|
||||||
|
echo Killing XProtect...; sudo pkill -9 XProtect >/dev/null || true;
|
||||||
|
echo Waiting for XProtect process...; while pgrep XProtect; do sleep 3; done;
|
||||||
|
|
||||||
- name: 📦 Create DMG
|
- name: 📦 Create DMG
|
||||||
run: |
|
run: |
|
||||||
set -x
|
brew install imagemagick
|
||||||
mkdir bundle
|
git clone https://github.com/sindresorhus/create-dmg
|
||||||
mv build/install/ImHex.app bundle
|
cd create-dmg
|
||||||
cd bundle
|
npm i && npm -g i
|
||||||
ln -s /Applications Applications
|
cd ../build/install
|
||||||
cd ..
|
for i in $(seq 1 10); do
|
||||||
hdiutil create -volname "ImHex" -srcfolder bundle -ov -format UDZO imhex-${{env.IMHEX_VERSION}}-macOS${{matrix.suffix}}-x86_64.dmg
|
create-dmg ImHex.app || true
|
||||||
|
if ls -d *.dmg 1>/dev/null 2>/dev/null; then
|
||||||
|
break;
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
mv *.dmg ../../imhex-${{ env.IMHEX_VERSION }}-macOS${{ matrix.suffix }}-x86_64.dmg
|
||||||
|
|
||||||
|
- name: 🗝️ Generate build provenance attestations
|
||||||
|
uses: actions/attest-build-provenance@v2
|
||||||
|
if: github.event.pull_request.head.repo.full_name == github.repository
|
||||||
|
with:
|
||||||
|
subject-path: |
|
||||||
|
./*.dmg
|
||||||
|
|
||||||
- name: ⬆️ Upload DMG
|
- name: ⬆️ Upload DMG
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
name: macOS DMG${{matrix.suffix}} x86_64
|
name: macOS DMG${{ matrix.suffix }} x86_64
|
||||||
path: ./*.dmg
|
path: ./*.dmg
|
||||||
|
|
||||||
macos-arm64-build:
|
macos-arm64:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
name: 🍎 macOS 12.1 arm64
|
name: 🍎 macOS 13 arm64
|
||||||
|
|
||||||
outputs:
|
outputs:
|
||||||
IMHEX_VERSION: ${{ steps.build.outputs.IMHEX_VERSION }}
|
IMHEX_VERSION: ${{ steps.build.outputs.IMHEX_VERSION }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: 🧰 Checkout
|
- name: 🧰 Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -298,11 +443,17 @@ jobs:
|
|||||||
gh actions-cache delete "build-macos-arm64-cache" --confirm || true
|
gh actions-cache delete "build-macos-arm64-cache" --confirm || true
|
||||||
|
|
||||||
macos-arm64-package:
|
macos-arm64-package:
|
||||||
runs-on: macos-12
|
runs-on: macos-13
|
||||||
name: 🍎 macOS 12.1 arm64 Packaging
|
name: 🍎 macOS 13 arm64 Packaging
|
||||||
needs: macos-arm64-build
|
needs: macos-arm64
|
||||||
|
|
||||||
env:
|
env:
|
||||||
IMHEX_VERSION: ${{ needs.macos-arm64-build.outputs.IMHEX_VERSION }}
|
IMHEX_VERSION: ${{ needs.macos-arm64-build.outputs.IMHEX_VERSION }}
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
id-token: write
|
||||||
|
attestations: write
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: ⬇️ Download artifact
|
- name: ⬇️ Download artifact
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v4
|
||||||
@@ -329,15 +480,33 @@ jobs:
|
|||||||
cd out
|
cd out
|
||||||
chmod -R 755 ImHex.app/
|
chmod -R 755 ImHex.app/
|
||||||
|
|
||||||
|
- name: 🔫 Kill XProtect
|
||||||
|
run: |
|
||||||
|
# See https://github.com/actions/runner-images/issues/7522
|
||||||
|
echo Killing XProtect...; sudo pkill -9 XProtect >/dev/null || true;
|
||||||
|
echo Waiting for XProtect process...; while pgrep XProtect; do sleep 3; done;
|
||||||
|
|
||||||
- name: 📦 Create DMG
|
- name: 📦 Create DMG
|
||||||
run: |
|
run: |
|
||||||
set -x
|
brew install imagemagick
|
||||||
mkdir bundle
|
git clone https://github.com/sindresorhus/create-dmg
|
||||||
mv out/ImHex.app bundle
|
cd create-dmg
|
||||||
cd bundle
|
npm i && npm -g i
|
||||||
ln -s /Applications Applications
|
cd ../out
|
||||||
cd ..
|
for i in $(seq 1 10); do
|
||||||
hdiutil create -volname "ImHex" -srcfolder bundle -ov -format UDZO imhex-${{env.IMHEX_VERSION}}-macOS-arm64.dmg
|
create-dmg ImHex.app || true
|
||||||
|
if ls -d *.dmg 1>/dev/null 2>/dev/null; then
|
||||||
|
break;
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
mv *.dmg ../imhex-${{ env.IMHEX_VERSION }}-macOS${{ matrix.suffix }}-arm64.dmg
|
||||||
|
|
||||||
|
- name: 🗝️ Generate build provenance attestations
|
||||||
|
uses: actions/attest-build-provenance@v2
|
||||||
|
if: github.event.pull_request.head.repo.full_name == github.repository
|
||||||
|
with:
|
||||||
|
subject-path: |
|
||||||
|
./*.dmg
|
||||||
|
|
||||||
- name: ⬆️ Upload DMG
|
- name: ⬆️ Upload DMG
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
@@ -352,16 +521,20 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- release_num: 22.04
|
- release_num: "24.04"
|
||||||
- release_num: 24.04
|
- release_num: "24.10"
|
||||||
|
|
||||||
name: 🐧 Ubuntu ${{ matrix.release_num }}
|
name: 🐧 Ubuntu ${{ matrix.release_num }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
container:
|
container:
|
||||||
image: "ubuntu:${{ matrix.release_num }}"
|
image: "ubuntu:${{ matrix.release_num }}"
|
||||||
options: --privileged
|
options: --privileged
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
id-token: write
|
||||||
|
attestations: write
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: ⬇️ Install setup dependencies
|
- name: ⬇️ Install setup dependencies
|
||||||
run: apt update && apt install -y git curl
|
run: apt update && apt install -y git curl
|
||||||
@@ -374,8 +547,8 @@ jobs:
|
|||||||
- name: 📜 Setup ccache
|
- name: 📜 Setup ccache
|
||||||
uses: hendrikmuhs/ccache-action@v1
|
uses: hendrikmuhs/ccache-action@v1
|
||||||
with:
|
with:
|
||||||
key: Ubuntu-${{matrix.release_num}}-ccache-${{ github.run_id }}
|
key: Ubuntu-${{ matrix.release_num }}-ccache-${{ github.run_id }}
|
||||||
restore-keys: Ubuntu-${{matrix.release_num}}-ccache
|
restore-keys: Ubuntu-${{ matrix.release_num }}-ccache
|
||||||
max-size: 1G
|
max-size: 1G
|
||||||
|
|
||||||
- name: ⬇️ Install dependencies
|
- name: ⬇️ Install dependencies
|
||||||
@@ -396,8 +569,8 @@ jobs:
|
|||||||
git config --global --add safe.directory '*'
|
git config --global --add safe.directory '*'
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
CC=gcc-12 CXX=g++-12 cmake -G "Ninja" \
|
CC=gcc-14 CXX=g++-14 cmake -G "Ninja" \
|
||||||
-DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} \
|
-DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \
|
||||||
-DCMAKE_INSTALL_PREFIX="/usr" \
|
-DCMAKE_INSTALL_PREFIX="/usr" \
|
||||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||||
@@ -419,8 +592,15 @@ jobs:
|
|||||||
- name: 📦 Bundle DEB
|
- name: 📦 Bundle DEB
|
||||||
run: |
|
run: |
|
||||||
cp -r build/DEBIAN build/DebDir
|
cp -r build/DEBIAN build/DebDir
|
||||||
dpkg-deb -Zgzip --build build/DebDir
|
dpkg-deb -Zzstd --build build/DebDir
|
||||||
mv build/DebDir.deb imhex-${{env.IMHEX_VERSION}}-Ubuntu-${{ matrix.release_num }}-x86_64.deb
|
mv build/DebDir.deb imhex-${{ env.IMHEX_VERSION }}-Ubuntu-${{ matrix.release_num }}-x86_64.deb
|
||||||
|
|
||||||
|
- name: 🗝️ Generate build provenance attestations
|
||||||
|
uses: actions/attest-build-provenance@v2
|
||||||
|
if: github.event.pull_request.head.repo.full_name == github.repository
|
||||||
|
with:
|
||||||
|
subject-path: |
|
||||||
|
./*.deb
|
||||||
|
|
||||||
- name: ⬆️ Upload DEB
|
- name: ⬆️ Upload DEB
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
@@ -431,8 +611,26 @@ jobs:
|
|||||||
|
|
||||||
# AppImage build
|
# AppImage build
|
||||||
appimage:
|
appimage:
|
||||||
runs-on: ubuntu-22.04
|
strategy:
|
||||||
name: ⬇️ AppImage
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- architecture: "x86_64"
|
||||||
|
architecture_package: "amd64"
|
||||||
|
architecture_appimage_builder: "x86_64"
|
||||||
|
image: ubuntu-24.04
|
||||||
|
- architecture: "arm64"
|
||||||
|
architecture_package: "arm64"
|
||||||
|
architecture_appimage_builder: "aarch64"
|
||||||
|
image: ubuntu-24.04-arm
|
||||||
|
|
||||||
|
runs-on: ${{ matrix.image }}
|
||||||
|
name: ⬇️ AppImage ${{ matrix.architecture }}
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
id-token: write
|
||||||
|
attestations: write
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: 🧰 Checkout
|
- name: 🧰 Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -454,32 +652,45 @@ jobs:
|
|||||||
|
|
||||||
- name: 🛠️ Build using docker
|
- name: 🛠️ Build using docker
|
||||||
run: |
|
run: |
|
||||||
docker buildx build . -f dist/appimage/Dockerfile --progress=plain --build-arg "BUILD_TYPE=$BUILD_TYPE" \
|
docker buildx build . -f dist/AppImage/Dockerfile --progress=plain --build-arg "BUILD_TYPE=$BUILD_TYPE" \
|
||||||
--build-arg "GIT_COMMIT_HASH=$GITHUB_SHA" --build-arg "GIT_BRANCH=${GITHUB_REF##*/}" --output out
|
--build-arg "GIT_COMMIT_HASH=$GITHUB_SHA" --build-arg "GIT_BRANCH=${GITHUB_REF##*/}" \
|
||||||
|
--build-arg "ARCHITECTURE_PACKAGE=${{ matrix.architecture_package }}" --build-arg "ARCHITECTURE_FILE_NAME=${{ matrix.architecture }}" --build-arg "ARCHITECTURE_APPIMAGE_BUILDER=${{ matrix.architecture_appimage_builder }}" \
|
||||||
|
--output out
|
||||||
|
|
||||||
|
- name: 🗝️ Generate build provenance attestations
|
||||||
|
uses: actions/attest-build-provenance@v2
|
||||||
|
if: github.event.pull_request.head.repo.full_name == github.repository
|
||||||
|
with:
|
||||||
|
subject-path: |
|
||||||
|
out/*.AppImage
|
||||||
|
out/*.AppImage.zsync
|
||||||
|
|
||||||
- name: ⬆️ Upload AppImage
|
- name: ⬆️ Upload AppImage
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
name: Linux AppImage x86_64
|
name: Linux AppImage ${{ matrix.architecture }}
|
||||||
path: 'out/*.AppImage'
|
path: 'out/*.AppImage'
|
||||||
|
|
||||||
- name: ⬆️ Upload AppImage zsync
|
- name: ⬆️ Upload AppImage zsync
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
name: Linux AppImage zsync x86_64
|
name: Linux AppImage zsync ${{ matrix.architecture }}
|
||||||
path: 'out/*.AppImage.zsync'
|
path: 'out/*.AppImage.zsync'
|
||||||
|
|
||||||
# ArchLinux build
|
# ArchLinux build
|
||||||
archlinux-build:
|
archlinux-build:
|
||||||
name: 🐧 ArchLinux
|
name: 🐧 ArchLinux
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
container:
|
container:
|
||||||
image: archlinux:base-devel
|
image: archlinux:base-devel
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
id-token: write
|
||||||
|
attestations: write
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: ⬇️ Update all packages
|
- name: ⬇️ Update all packages
|
||||||
run: |
|
run: |
|
||||||
@@ -517,7 +728,7 @@ jobs:
|
|||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
CC=gcc CXX=g++ cmake -G "Ninja" \
|
CC=gcc CXX=g++ cmake -G "Ninja" \
|
||||||
-DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} \
|
-DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \
|
||||||
-DCMAKE_INSTALL_PREFIX="/usr" \
|
-DCMAKE_INSTALL_PREFIX="/usr" \
|
||||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||||
@@ -542,7 +753,7 @@ jobs:
|
|||||||
- name: ✒️ Prepare PKGBUILD
|
- name: ✒️ Prepare PKGBUILD
|
||||||
run: |
|
run: |
|
||||||
cp dist/Arch/PKGBUILD build
|
cp dist/Arch/PKGBUILD build
|
||||||
sed -i 's/%version%/${{env.IMHEX_VERSION}}/g' build/PKGBUILD
|
sed -i 's/%version%/${{ env.IMHEX_VERSION }}/g' build/PKGBUILD
|
||||||
|
|
||||||
# makepkg doesn't want to run as root, so I had to chmod 777 all over
|
# makepkg doesn't want to run as root, so I had to chmod 777 all over
|
||||||
- name: 📦 Package ArchLinux .pkg.tar.zst
|
- name: 📦 Package ArchLinux .pkg.tar.zst
|
||||||
@@ -552,16 +763,23 @@ jobs:
|
|||||||
|
|
||||||
# the name is a small trick to make makepkg recognize it as the source
|
# the name is a small trick to make makepkg recognize it as the source
|
||||||
# else, it would try to download the file from the release
|
# else, it would try to download the file from the release
|
||||||
tar -cvf imhex-${{env.IMHEX_VERSION}}-ArchLinux-x86_64.pkg.tar.zst -C installDir .
|
tar -cvf imhex-${{ env.IMHEX_VERSION }}-ArchLinux-x86_64.pkg.tar.zst -C installDir .
|
||||||
|
|
||||||
chmod -R 777 .
|
chmod -R 777 .
|
||||||
|
|
||||||
sudo -u nobody makepkg
|
sudo -u nobody makepkg
|
||||||
|
|
||||||
# Replace the old file
|
# Replace the old file
|
||||||
rm imhex-${{env.IMHEX_VERSION}}-ArchLinux-x86_64.pkg.tar.zst
|
rm imhex-${{ env.IMHEX_VERSION }}-ArchLinux-x86_64.pkg.tar.zst
|
||||||
rm *imhex-bin-debug* # rm debug package which is created for some reason
|
rm *imhex-bin-debug* # rm debug package which is created for some reason
|
||||||
mv *.pkg.tar.zst imhex-${{env.IMHEX_VERSION}}-ArchLinux-x86_64.pkg.tar.zst
|
mv *.pkg.tar.zst imhex-${{ env.IMHEX_VERSION }}-ArchLinux-x86_64.pkg.tar.zst
|
||||||
|
|
||||||
|
- name: 🗝️ Generate build provenance attestations
|
||||||
|
uses: actions/attest-build-provenance@v2
|
||||||
|
if: github.event.pull_request.head.repo.full_name == github.repository
|
||||||
|
with:
|
||||||
|
subject-path: |
|
||||||
|
build/imhex-${{ env.IMHEX_VERSION }}-ArchLinux-x86_64.pkg.tar.zst
|
||||||
|
|
||||||
- name: ⬆️ Upload imhex-archlinux.pkg.tar.zst
|
- name: ⬆️ Upload imhex-archlinux.pkg.tar.zst
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
@@ -569,7 +787,7 @@ jobs:
|
|||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
name: ArchLinux .pkg.tar.zst x86_64
|
name: ArchLinux .pkg.tar.zst x86_64
|
||||||
path: |
|
path: |
|
||||||
build/imhex-${{env.IMHEX_VERSION}}-ArchLinux-x86_64.pkg.tar.zst
|
build/imhex-${{ env.IMHEX_VERSION }}-ArchLinux-x86_64.pkg.tar.zst
|
||||||
|
|
||||||
# RPM distro builds
|
# RPM distro builds
|
||||||
rpm-build:
|
rpm-build:
|
||||||
@@ -581,29 +799,46 @@ jobs:
|
|||||||
mock_release: rawhide
|
mock_release: rawhide
|
||||||
release_num: rawhide
|
release_num: rawhide
|
||||||
mock_config: fedora-rawhide
|
mock_config: fedora-rawhide
|
||||||
|
- name: Fedora
|
||||||
|
mock_release: f41
|
||||||
|
release_num: 41
|
||||||
|
mock_config: fedora-41
|
||||||
- name: Fedora
|
- name: Fedora
|
||||||
mock_release: f40
|
mock_release: f40
|
||||||
release_num: 40
|
release_num: 40
|
||||||
mock_config: fedora-40
|
mock_config: fedora-40
|
||||||
- name: Fedora
|
|
||||||
mock_release: f39
|
|
||||||
release_num: 39
|
|
||||||
mock_config: fedora-39
|
|
||||||
- name: RHEL-AlmaLinux
|
- name: RHEL-AlmaLinux
|
||||||
mock_release: epel9
|
mock_release: epel9
|
||||||
release_num: 9
|
release_num: 9
|
||||||
mock_config: "alma+epel-9"
|
mock_config: "alma+epel-9"
|
||||||
|
|
||||||
name: 🐧 ${{ matrix.name }} ${{ matrix.release_num }}
|
name: 🐧 ${{ matrix.name }} ${{ matrix.release_num }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
container:
|
container:
|
||||||
image: "fedora:latest"
|
image: "almalinux:9"
|
||||||
options: --privileged
|
options: --privileged --pid=host --security-opt apparmor=unconfined
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
id-token: write
|
||||||
|
attestations: write
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: ⬇️ Install git-core
|
# This, together with the `--pid=host --security-opt apparmor=unconfined` docker options is required to allow
|
||||||
run: dnf install --disablerepo="*" --enablerepo="fedora" git-core -y
|
# fedpkg to work inside a Docker container running on Ubuntu again.
|
||||||
|
# GitHub seems to have enabled AppArmor on their Ubuntu CI runners which limits Docker in ways that cause
|
||||||
|
# programs inside it to fail.
|
||||||
|
# Without this, fedpkg will throw the unhelpful error message 'Insufficient Rights'
|
||||||
|
# This step uses nsenter to execute commands on the host that disable AppArmor entirely.
|
||||||
|
- name: 🛡️ Disable AppArmor on Host
|
||||||
|
run: |
|
||||||
|
nsenter -t 1 -m -u -n -i sudo systemctl disable --now apparmor.service
|
||||||
|
nsenter -t 1 -m -u -n -i sudo aa-teardown || true
|
||||||
|
nsenter -t 1 -m -u -n -i sudo sysctl --write kernel.apparmor_restrict_unprivileged_unconfined=0
|
||||||
|
nsenter -t 1 -m -u -n -i sudo sysctl --write kernel.apparmor_restrict_unprivileged_userns=0
|
||||||
|
|
||||||
|
- name: ⬇️ Install git-core and EPEL repo
|
||||||
|
run: dnf install git-core epel-release -y
|
||||||
|
|
||||||
- name: 🧰 Checkout
|
- name: 🧰 Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -622,8 +857,8 @@ jobs:
|
|||||||
- name: ⬇️ Update all packages and install dependencies
|
- name: ⬇️ Update all packages and install dependencies
|
||||||
run: |
|
run: |
|
||||||
set -x
|
set -x
|
||||||
dnf upgrade --disablerepo="*" --enablerepo="fedora,updates" -y
|
dnf upgrade -y
|
||||||
dnf install --disablerepo="*" --enablerepo="fedora,updates" -y \
|
dnf install -y \
|
||||||
fedpkg \
|
fedpkg \
|
||||||
ccache
|
ccache
|
||||||
|
|
||||||
@@ -649,16 +884,16 @@ jobs:
|
|||||||
- name: ✒️ Modify spec file
|
- name: ✒️ Modify spec file
|
||||||
run: |
|
run: |
|
||||||
sed -i \
|
sed -i \
|
||||||
-e 's/Version: VERSION$/Version: ${{env.IMHEX_VERSION}}/g' \
|
-e 's/Version: VERSION$/Version: ${{ env.IMHEX_VERSION }}/g' \
|
||||||
-e 's/IMHEX_OFFLINE_BUILD=ON/IMHEX_OFFLINE_BUILD=OFF/g' \
|
-e 's/IMHEX_OFFLINE_BUILD=ON/IMHEX_OFFLINE_BUILD=OFF/g' \
|
||||||
-e '/IMHEX_OFFLINE_BUILD=OFF/a -D IMHEX_PATTERNS_PULL_MASTER=ON \\' \
|
-e '/IMHEX_OFFLINE_BUILD=OFF/a -D IMHEX_PATTERNS_PULL_MASTER=ON \\' \
|
||||||
-e '/BuildRequires: cmake/a BuildRequires: git-core' \
|
-e '/BuildRequires: cmake/a BuildRequires: git-core' \
|
||||||
-e '/%files/a %{_datadir}/%{name}/' \
|
-e '/%files/a %{_datadir}/%{name}/' \
|
||||||
$GITHUB_WORKSPACE/ImHex/dist/rpm/imhex.spec
|
$GITHUB_WORKSPACE/ImHex/dist/rpm/imhex.spec
|
||||||
|
|
||||||
- name: 📜 Fix ccache on EL9
|
- name: 📜 Fix ccache on EL9
|
||||||
if: matrix.mock_release == 'epel9'
|
if: matrix.mock_release == 'epel9'
|
||||||
run: sed -i '/\. \/opt\/rh\/gcc-toolset-12\/enable/a PATH=/usr/lib64/ccache:$PATH' $GITHUB_WORKSPACE/ImHex/dist/rpm/imhex.spec
|
run: sed -i '/\. \/opt\/rh\/gcc-toolset-14\/enable/a PATH=/usr/lib64/ccache:$PATH' $GITHUB_WORKSPACE/ImHex/dist/rpm/imhex.spec
|
||||||
|
|
||||||
- name: 🟩 Copy spec file to build root
|
- name: 🟩 Copy spec file to build root
|
||||||
run: mv $GITHUB_WORKSPACE/ImHex/dist/rpm/imhex.spec $GITHUB_WORKSPACE/imhex.spec
|
run: mv $GITHUB_WORKSPACE/ImHex/dist/rpm/imhex.spec $GITHUB_WORKSPACE/imhex.spec
|
||||||
@@ -680,8 +915,15 @@ jobs:
|
|||||||
|
|
||||||
- name: 🟩 Move and rename finished RPM
|
- name: 🟩 Move and rename finished RPM
|
||||||
run: |
|
run: |
|
||||||
mv $GITHUB_WORKSPACE/results_imhex/${{env.IMHEX_VERSION}}/*/imhex-${{env.IMHEX_VERSION}}-0.*.x86_64.rpm \
|
mv $GITHUB_WORKSPACE/results_imhex/${{ env.IMHEX_VERSION }}/*/imhex-${{ env.IMHEX_VERSION }}-0.*.x86_64.rpm \
|
||||||
$GITHUB_WORKSPACE/imhex-${{env.IMHEX_VERSION}}-${{matrix.name}}-${{matrix.release_num}}-x86_64.rpm
|
$GITHUB_WORKSPACE/imhex-${{ env.IMHEX_VERSION }}-${{ matrix.name }}-${{ matrix.release_num }}-x86_64.rpm
|
||||||
|
|
||||||
|
- name: 🗝️ Generate build provenance attestations
|
||||||
|
uses: actions/attest-build-provenance@v2
|
||||||
|
if: github.event.pull_request.head.repo.full_name == github.repository
|
||||||
|
with:
|
||||||
|
subject-path: |
|
||||||
|
imhex-${{ env.IMHEX_VERSION }}-${{ matrix.name }}-${{ matrix.release_num }}-x86_64.rpm
|
||||||
|
|
||||||
- name: ⬆️ Upload RPM
|
- name: ⬆️ Upload RPM
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
@@ -689,4 +931,86 @@ jobs:
|
|||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
name: ${{ matrix.name }} ${{ matrix.release_num }} RPM x86_64
|
name: ${{ matrix.name }} ${{ matrix.release_num }} RPM x86_64
|
||||||
path: |
|
path: |
|
||||||
imhex-${{env.IMHEX_VERSION}}-${{matrix.name}}-${{matrix.release_num}}-x86_64.rpm
|
imhex-${{ env.IMHEX_VERSION }}-${{ matrix.name }}-${{ matrix.release_num }}-x86_64.rpm
|
||||||
|
|
||||||
|
webassembly-build:
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
name: 🌍 Web
|
||||||
|
permissions:
|
||||||
|
pages: write
|
||||||
|
id-token: write
|
||||||
|
actions: write
|
||||||
|
steps:
|
||||||
|
- name: 🧰 Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
|
- name: 📁 Restore docker /cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: cache
|
||||||
|
key: web-cache-${{ hashFiles('**/CMakeLists.txt') }}
|
||||||
|
|
||||||
|
- name: 🐳 Inject /cache into docker
|
||||||
|
uses: reproducible-containers/buildkit-cache-dance@v2
|
||||||
|
with:
|
||||||
|
cache-source: cache
|
||||||
|
cache-target: /cache
|
||||||
|
|
||||||
|
- name: 🛠️ Build using docker
|
||||||
|
run: |
|
||||||
|
docker buildx build . -f dist/web/Dockerfile --progress=plain --build-arg 'JOBS=4' --output out --target raw
|
||||||
|
|
||||||
|
- name: 🔨 Fix permissions
|
||||||
|
run: |
|
||||||
|
chmod -c -R +rX "out/"
|
||||||
|
|
||||||
|
- name: ⬆️ Upload artifacts
|
||||||
|
uses: actions/upload-pages-artifact@v3
|
||||||
|
with:
|
||||||
|
path: out/
|
||||||
|
|
||||||
|
- name: 🔨 Copy necessary files
|
||||||
|
run: |
|
||||||
|
cp dist/web/serve.py out/start_imhex_web.py
|
||||||
|
|
||||||
|
- name: ⬆️ Upload package
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
if-no-files-found: error
|
||||||
|
name: ImHex Web
|
||||||
|
path: out/*
|
||||||
|
|
||||||
|
# See https://github.com/actions/cache/issues/342#issuecomment-1711054115
|
||||||
|
- name: 🗑️ Delete old cache
|
||||||
|
continue-on-error: true
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
run: |
|
||||||
|
gh extension install actions/gh-actions-cache || true
|
||||||
|
gh actions-cache delete "build-web-cache" --confirm || true
|
||||||
|
|
||||||
|
webassembly-deploy:
|
||||||
|
environment:
|
||||||
|
name: github-pages
|
||||||
|
url: ${{ steps.deployment.outputs.page_url }}
|
||||||
|
permissions:
|
||||||
|
pages: write
|
||||||
|
id-token: write
|
||||||
|
actions: write
|
||||||
|
name: 📃 Deploy to GitHub Pages
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
|
if: ${{ github.ref == 'refs/heads/master' && github.event.repository.fork == false }}
|
||||||
|
needs: webassembly-build
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: 🌍 Deploy WebAssembly Build to GitHub Pages
|
||||||
|
id: deployment
|
||||||
|
uses: actions/deploy-pages@v4
|
||||||
|
|
||||||
|
- name: 🗑️ Delete artifact
|
||||||
|
uses: geekyeggo/delete-artifact@v5
|
||||||
|
with:
|
||||||
|
name: github-pages
|
||||||
|
|||||||
80
.github/workflows/build_web.yml
vendored
80
.github/workflows/build_web.yml
vendored
@@ -1,80 +0,0 @@
|
|||||||
name: Build for the web
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- 'master'
|
|
||||||
- 'releases/**'
|
|
||||||
- 'tests/**'
|
|
||||||
pull_request:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
|
||||||
BUILD_TYPE: Release
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
pages: write
|
|
||||||
id-token: write
|
|
||||||
actions: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-22.04
|
|
||||||
name: 🌍 WebAssembly
|
|
||||||
steps:
|
|
||||||
- name: 🧰 Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
|
|
||||||
- name: 📁 Restore docker /cache
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: cache
|
|
||||||
key: web-cache-${{ hashFiles('**/CMakeLists.txt') }}
|
|
||||||
|
|
||||||
- name: 🐳 Inject /cache into docker
|
|
||||||
uses: reproducible-containers/buildkit-cache-dance@v2
|
|
||||||
with:
|
|
||||||
cache-source: cache
|
|
||||||
cache-target: /cache
|
|
||||||
|
|
||||||
- name: 🛠️ Build using docker
|
|
||||||
run: |
|
|
||||||
docker buildx build . -f dist/web/Dockerfile --progress=plain --build-arg 'JOBS=4' --output out --target raw
|
|
||||||
|
|
||||||
- name: 🔨 Fix permissions
|
|
||||||
run: |
|
|
||||||
chmod -c -R +rX "out/"
|
|
||||||
|
|
||||||
- name: ⬆️ Upload artifacts
|
|
||||||
uses: actions/upload-pages-artifact@v2
|
|
||||||
with:
|
|
||||||
path: out/
|
|
||||||
|
|
||||||
# See https://github.com/actions/cache/issues/342#issuecomment-1711054115
|
|
||||||
- name: 🗑️ Delete old cache
|
|
||||||
continue-on-error: true
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ github.token }}
|
|
||||||
run: |
|
|
||||||
gh extension install actions/gh-actions-cache
|
|
||||||
gh actions-cache delete "build-web-cache" --confirm
|
|
||||||
|
|
||||||
|
|
||||||
deploy:
|
|
||||||
environment:
|
|
||||||
name: github-pages
|
|
||||||
url: ${{ steps.deployment.outputs.page_url }}
|
|
||||||
|
|
||||||
name: 📃 Deploy to GitHub Pages
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
if: ${{ github.ref == 'refs/heads/master' && github.event.repository.fork == false }}
|
|
||||||
needs: build
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: 🌍 Deploy
|
|
||||||
id: deployment
|
|
||||||
uses: actions/deploy-pages@v2
|
|
||||||
9
.github/workflows/release.yml
vendored
9
.github/workflows/release.yml
vendored
@@ -10,7 +10,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release-update-repos:
|
release-update-repos:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04
|
||||||
name: Release Update Repos
|
name: Release Update Repos
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
@@ -63,7 +63,7 @@ jobs:
|
|||||||
token: ${{ secrets.RELEASE_TOKEN }}
|
token: ${{ secrets.RELEASE_TOKEN }}
|
||||||
|
|
||||||
release-upload-artifacts:
|
release-upload-artifacts:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04
|
||||||
name: Release Upload Artifacts
|
name: Release Upload Artifacts
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
@@ -90,7 +90,7 @@ jobs:
|
|||||||
run: tar --exclude-vcs -czvf Full.Sources.tar.gz ImHex
|
run: tar --exclude-vcs -czvf Full.Sources.tar.gz ImHex
|
||||||
|
|
||||||
- name: ⬇️ Download artifacts from latest workflow
|
- name: ⬇️ Download artifacts from latest workflow
|
||||||
uses: dawidd6/action-download-artifact@v3
|
uses: dawidd6/action-download-artifact@v6
|
||||||
with:
|
with:
|
||||||
github_token: ${{secrets.GITHUB_TOKEN}}
|
github_token: ${{secrets.GITHUB_TOKEN}}
|
||||||
workflow: build.yml
|
workflow: build.yml
|
||||||
@@ -117,6 +117,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
mv "Windows Portable x86_64.zip" imhex-${{ env.IMHEX_VERSION }}-Windows-Portable-x86_64.zip
|
mv "Windows Portable x86_64.zip" imhex-${{ env.IMHEX_VERSION }}-Windows-Portable-x86_64.zip
|
||||||
mv "Windows Portable NoGPU x86_64.zip" imhex-${{ env.IMHEX_VERSION }}-Windows-Portable-NoGPU-x86_64.zip
|
mv "Windows Portable NoGPU x86_64.zip" imhex-${{ env.IMHEX_VERSION }}-Windows-Portable-NoGPU-x86_64.zip
|
||||||
|
mv "ImHex Web.zip" imhex-${{ env.IMHEX_VERSION }}-web.zip
|
||||||
|
|
||||||
- name: ⬆️ Upload everything to release
|
- name: ⬆️ Upload everything to release
|
||||||
uses: softprops/action-gh-release@4634c16e79c963813287e889244c50009e7f0981
|
uses: softprops/action-gh-release@4634c16e79c963813287e889244c50009e7f0981
|
||||||
@@ -147,7 +148,7 @@ jobs:
|
|||||||
commit_email: itrooz@protonmail.com
|
commit_email: itrooz@protonmail.com
|
||||||
ssh_private_key: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
|
ssh_private_key: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
|
||||||
commit_message: Bump to version ${{ env.IMHEX_VERSION }}
|
commit_message: Bump to version ${{ env.IMHEX_VERSION }}
|
||||||
ssh_keyscan_types: rsa,dsa,ecdsa,ed25519
|
ssh_keyscan_types: rsa,ecdsa,ed25519
|
||||||
|
|
||||||
release-update-winget:
|
release-update-winget:
|
||||||
name: Release update winget package
|
name: Release update winget package
|
||||||
|
|||||||
30
.github/workflows/stale_issues.yml
vendored
Normal file
30
.github/workflows/stale_issues.yml
vendored
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
name: Close inactive issues
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "30 1 * * 0"
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
close-issues:
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
steps:
|
||||||
|
- uses: actions/stale@v5
|
||||||
|
with:
|
||||||
|
operations-per-run: '200'
|
||||||
|
ascending: true
|
||||||
|
days-before-issue-stale: 334
|
||||||
|
days-before-issue-close: 30
|
||||||
|
stale-issue-label: "stale"
|
||||||
|
stale-issue-message: |
|
||||||
|
This issue is marked stale as it has been open for 11 months without activity.
|
||||||
|
Please try the latest ImHex version. (Avaiable here: https://imhex.download/ for release and https://imhex.download/#nightly for development version)
|
||||||
|
If the issue persists on the latest version, please make a comment on this issue again
|
||||||
|
|
||||||
|
Without response, this issue will be closed in one month.
|
||||||
|
close-issue-message: ""
|
||||||
|
days-before-pr-stale: -1
|
||||||
|
days-before-pr-close: -1
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
38
.github/workflows/tests.yml
vendored
38
.github/workflows/tests.yml
vendored
@@ -6,6 +6,7 @@ on:
|
|||||||
- 'master'
|
- 'master'
|
||||||
- 'releases/**'
|
- 'releases/**'
|
||||||
- 'tests/**'
|
- 'tests/**'
|
||||||
|
- 'feature/**'
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- 'master'
|
- 'master'
|
||||||
@@ -15,7 +16,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
tests:
|
tests:
|
||||||
name: 🧪 Unit Tests
|
name: 🧪 Unit Tests
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
permissions:
|
permissions:
|
||||||
actions: read
|
actions: read
|
||||||
contents: read
|
contents: read
|
||||||
@@ -38,14 +39,13 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
sudo apt update
|
sudo apt update
|
||||||
sudo bash dist/get_deps_debian.sh
|
sudo bash dist/get_deps_debian.sh
|
||||||
sudo apt install gcovr -y
|
|
||||||
|
|
||||||
- name: 🛠️ Build
|
- name: 🛠️ Build
|
||||||
run: |
|
run: |
|
||||||
set -x
|
set -x
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
CC=gcc-12 CXX=g++-12 cmake \
|
CC=gcc-14 CXX=g++-14 cmake \
|
||||||
-DCMAKE_BUILD_TYPE=Debug \
|
-DCMAKE_BUILD_TYPE=Debug \
|
||||||
-DIMHEX_ENABLE_UNIT_TESTS=ON \
|
-DIMHEX_ENABLE_UNIT_TESTS=ON \
|
||||||
-DIMHEX_ENABLE_PLUGIN_TESTS=ON \
|
-DIMHEX_ENABLE_PLUGIN_TESTS=ON \
|
||||||
@@ -54,8 +54,10 @@ jobs:
|
|||||||
-DCMAKE_C_FLAGS="-fuse-ld=lld -fsanitize=address,leak,undefined -fno-sanitize-recover=all --coverage" \
|
-DCMAKE_C_FLAGS="-fuse-ld=lld -fsanitize=address,leak,undefined -fno-sanitize-recover=all --coverage" \
|
||||||
-DCMAKE_CXX_FLAGS="-fuse-ld=lld -fsanitize=address,leak,undefined -fno-sanitize-recover=all --coverage" \
|
-DCMAKE_CXX_FLAGS="-fuse-ld=lld -fsanitize=address,leak,undefined -fno-sanitize-recover=all --coverage" \
|
||||||
-DIMHEX_OFFLINE_BUILD=ON \
|
-DIMHEX_OFFLINE_BUILD=ON \
|
||||||
|
-G Ninja \
|
||||||
..
|
..
|
||||||
make -j4 unit_tests
|
ninja unit_tests
|
||||||
|
ninja imhex_all
|
||||||
|
|
||||||
- name: 🧪 Perform plcli Integration Tests
|
- name: 🧪 Perform plcli Integration Tests
|
||||||
run: |
|
run: |
|
||||||
@@ -68,16 +70,24 @@ jobs:
|
|||||||
ctest --output-on-failure
|
ctest --output-on-failure
|
||||||
|
|
||||||
# Generate report from all gcov .gcda files
|
# Generate report from all gcov .gcda files
|
||||||
- name: 🧪 Generate coverage report
|
#- name: 🧪 Generate coverage report
|
||||||
run: |
|
# run: |
|
||||||
gcovr --gcov-executable /usr/bin/gcov-12 -r . build --xml coverage_report.xml --verbose
|
# sudo apt install python3-pip python3-venv
|
||||||
|
# python3 -m venv venv
|
||||||
- name: Upload coverage reports to Codecov
|
# . venv/bin/activate
|
||||||
uses: codecov/codecov-action@v4
|
# pip3 install gcovr
|
||||||
with:
|
# cd build
|
||||||
fail_ci_if_error: true
|
# gcovr --gcov-executable /usr/bin/gcov-14 --exclude '.*/yara_rules/' --exclude '.*/third_party/' --exclude '.*/external/' --root .. --xml coverage_report.xml --verbose --gcov-ignore-errors all
|
||||||
token: ${{ secrets.CODECOV_TOKEN }}
|
#
|
||||||
file: coverage_report.xml
|
#- name: Upload coverage reports to Codecov
|
||||||
|
# env:
|
||||||
|
# CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
# if: ${{ env.CODECOV_TOKEN }}
|
||||||
|
# uses: codecov/codecov-action@v4
|
||||||
|
# with:
|
||||||
|
# fail_ci_if_error: true
|
||||||
|
# token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
# file: build/coverage_report.xml
|
||||||
|
|
||||||
langs:
|
langs:
|
||||||
name: 🧪 Langs
|
name: 🧪 Langs
|
||||||
|
|||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -6,6 +6,7 @@ cmake-build-*/
|
|||||||
build*/
|
build*/
|
||||||
local/
|
local/
|
||||||
venv/
|
venv/
|
||||||
|
.cache/
|
||||||
|
|
||||||
*.mgc
|
*.mgc
|
||||||
*.kdev4
|
*.kdev4
|
||||||
@@ -13,3 +14,5 @@ imgui.ini
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
CMakeUserPresets.json
|
CMakeUserPresets.json
|
||||||
Brewfile.lock.json
|
Brewfile.lock.json
|
||||||
|
|
||||||
|
.vs/
|
||||||
|
|||||||
5
.gitmodules
vendored
5
.gitmodules
vendored
@@ -43,4 +43,7 @@
|
|||||||
|
|
||||||
[submodule "lib/third_party/HashLibPlus"]
|
[submodule "lib/third_party/HashLibPlus"]
|
||||||
path = lib/third_party/HashLibPlus
|
path = lib/third_party/HashLibPlus
|
||||||
url = https://github.com/WerWolv/HashLibPlus
|
url = https://github.com/WerWolv/HashLibPlus
|
||||||
|
[submodule "lib/external/disassembler"]
|
||||||
|
path = lib/external/disassembler
|
||||||
|
url = https://github.com/WerWolv/Disassembler
|
||||||
|
|||||||
@@ -32,13 +32,14 @@ include("${IMHEX_BASE_FOLDER}/cmake/ide_helpers.cmake")
|
|||||||
# Basic compiler and cmake configurations
|
# Basic compiler and cmake configurations
|
||||||
set(CMAKE_CXX_STANDARD 23)
|
set(CMAKE_CXX_STANDARD 23)
|
||||||
set(CMAKE_INCLUDE_DIRECTORIES_BEFORE ON)
|
set(CMAKE_INCLUDE_DIRECTORIES_BEFORE ON)
|
||||||
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
include("${IMHEX_BASE_FOLDER}/cmake/build_helpers.cmake")
|
include("${IMHEX_BASE_FOLDER}/cmake/build_helpers.cmake")
|
||||||
|
|
||||||
# Setup project
|
# Setup project
|
||||||
loadVersion(IMHEX_VERSION IMHEX_VERSION_PLAIN)
|
loadVersion(IMHEX_VERSION IMHEX_VERSION_PLAIN)
|
||||||
setVariableInParent(IMHEX_VERSION ${IMHEX_VERSION})
|
setVariableInParent(IMHEX_VERSION ${IMHEX_VERSION})
|
||||||
configureCMake()
|
|
||||||
|
|
||||||
|
configureCMake()
|
||||||
project(imhex
|
project(imhex
|
||||||
LANGUAGES C CXX
|
LANGUAGES C CXX
|
||||||
VERSION ${IMHEX_VERSION_PLAIN}
|
VERSION ${IMHEX_VERSION_PLAIN}
|
||||||
@@ -72,16 +73,18 @@ addPluginDirectories()
|
|||||||
|
|
||||||
# Add unit tests
|
# Add unit tests
|
||||||
if (IMHEX_ENABLE_UNIT_TESTS)
|
if (IMHEX_ENABLE_UNIT_TESTS)
|
||||||
enable_testing()
|
if (NOT TARGET unit_tests)
|
||||||
add_subdirectory(tests EXCLUDE_FROM_ALL)
|
enable_testing()
|
||||||
|
add_custom_target(unit_tests)
|
||||||
|
add_subdirectory(tests EXCLUDE_FROM_ALL)
|
||||||
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
# Configure more resources that will be added to the install package
|
# Configure more resources that will be added to the install package
|
||||||
generatePDBs()
|
|
||||||
generateSDKDirectory()
|
generateSDKDirectory()
|
||||||
|
|
||||||
# Handle package generation
|
# Handle package generation
|
||||||
createPackage()
|
createPackage()
|
||||||
|
|
||||||
# Accomodate IDEs with FOLDER support
|
# Accommodate IDEs with FOLDER support
|
||||||
tweakTargetsForIDESupport()
|
tweakTargetsForIDESupport()
|
||||||
|
|||||||
@@ -45,6 +45,19 @@
|
|||||||
|
|
||||||
"IMHEX_IDE_HELPERS_OVERRIDE_XCODE_COMPILER": "ON"
|
"IMHEX_IDE_HELPERS_OVERRIDE_XCODE_COMPILER": "ON"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "vs2022",
|
||||||
|
"displayName": "Visual Studio 2022",
|
||||||
|
"generator": "Visual Studio 17 2022",
|
||||||
|
"binaryDir": "${sourceDir}/build/${presetName}",
|
||||||
|
"architecture": {
|
||||||
|
"strategy": "set",
|
||||||
|
"value": "x64"
|
||||||
|
},
|
||||||
|
"cacheVariables": {
|
||||||
|
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"buildPresets": [
|
"buildPresets": [
|
||||||
|
|||||||
@@ -27,6 +27,11 @@ chmod +x imhex-*.AppImage
|
|||||||
./imhex-*.AppImage
|
./imhex-*.AppImage
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If you're experiencing glib / libgtk assertion failures, you might need to setup your `XDG_DATA_DIRS` env var correctly. In this case, run the following command before executing the AppImage. (See issue [ImHex/#2038](https://github.com/WerWolv/ImHex/issues/2038))
|
||||||
|
```bash
|
||||||
|
export XDG_DATA_DIRS="/usr/local/share:/usr/share"
|
||||||
|
```
|
||||||
|
|
||||||
#### Flatpak
|
#### Flatpak
|
||||||
To install the Flatpak, make sure you have the Flathub repository added to your system. Then simply run the following command:
|
To install the Flatpak, make sure you have the Flathub repository added to your system. Then simply run the following command:
|
||||||
|
|
||||||
|
|||||||
33
README.md
33
README.md
@@ -38,8 +38,8 @@ If you like my work, please consider supporting me on GitHub Sponsors, Patreon o
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||

|

|
||||||

|

|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary><strong>More Screenshots</strong></summary>
|
<summary><strong>More Screenshots</strong></summary>
|
||||||
@@ -314,23 +314,26 @@ To use ImHex, the following minimal system requirements need to be met.
|
|||||||
> ImHex requires a GPU with OpenGL 3.0 support in general.
|
> ImHex requires a GPU with OpenGL 3.0 support in general.
|
||||||
> There are releases available (with the `-NoGPU` suffix) that are software rendered and don't require a GPU, however these can be a lot slower than the GPU accelerated versions.
|
> There are releases available (with the `-NoGPU` suffix) that are software rendered and don't require a GPU, however these can be a lot slower than the GPU accelerated versions.
|
||||||
>
|
>
|
||||||
> If possible at all, make ImHex use the dedicated GPU on your system instead of the integrated one (especially Intel HD GPUs are known to cause issues).
|
> If possible at all, make ImHex use the dedicated GPU on your system instead of the integrated one.
|
||||||
|
> ImHex will usually run fine with integrated GPUs as well but certain Intel HD GPU drivers on Windows are known to cause graphical artifacts.
|
||||||
|
|
||||||
- **OS**:
|
- **OS**:
|
||||||
- **Windows**: Windows 7 or higher (Windows 10/11 recommended)
|
- **Windows**: Windows 7 or higher (Windows 10/11 recommended)
|
||||||
- **macOS**: macOS 12.1 (Monterey) or higher,
|
- **macOS**: macOS 13 (Ventura) or higher,
|
||||||
- Lower versions are supported, but you'll need to compile ImHex yourself
|
- Lower versions should still work too, but you'll need to compile ImHex yourself. The release binaries will NOT work.
|
||||||
|
- The macOS build is not signed and will require you to manually allow them in the Security & Privacy settings.
|
||||||
- **Linux**: "Modern" Linux. The following distributions have official releases available. Other distros are supported through the AppImage and Flatpak releases.
|
- **Linux**: "Modern" Linux. The following distributions have official releases available. Other distros are supported through the AppImage and Flatpak releases.
|
||||||
- Ubuntu 22.04/23.04
|
- Ubuntu and Debian
|
||||||
- Fedora 36/37
|
- Fedora
|
||||||
- RHEL/AlmaLinux 9
|
- RHEL/AlmaLinux
|
||||||
- Arch Linux
|
- Arch Linux
|
||||||
- **CPU**: x86_64 (64 Bit)
|
- Basically any other distro will work as well when compiling ImHex from sources.
|
||||||
|
- **CPU**: Officially supported are x86_64 and ARM64, though any Little Endian 64 bit CPU should work.
|
||||||
- **GPU**: OpenGL 3.0 or higher
|
- **GPU**: OpenGL 3.0 or higher
|
||||||
- Intel HD drivers are really buggy and often cause graphic artifacts
|
- Integrated Intel HD iGPUs are supported, however certain drivers are known to cause various graphical artifacts, especially on Windows. Use at your own risk.
|
||||||
- In case you don't have a GPU available, there are software rendered releases available for Windows and macOS
|
- In case you don't have a GPU available, there are software rendered releases available for Windows and macOS
|
||||||
- **RAM**: 256MB, more may be required for more complicated analysis
|
- **RAM**: ~150MiB, more is required for more complex analysis
|
||||||
- **Storage**: 100MB
|
- **Storage**: 150MiB
|
||||||
|
|
||||||
## Installing
|
## Installing
|
||||||
|
|
||||||
@@ -339,8 +342,10 @@ Information on how to install ImHex can be found in the [Install](/INSTALL.md) g
|
|||||||
## Compiling
|
## Compiling
|
||||||
|
|
||||||
To compile ImHex on any platform, GCC (or Clang) is required with a version that supports C++23 or higher.
|
To compile ImHex on any platform, GCC (or Clang) is required with a version that supports C++23 or higher.
|
||||||
On macOS, Clang is also required to compile some ObjC code.
|
Windows and Linux releases are being built using latest available GCC.
|
||||||
All releases are being built using latest available GCC.
|
MacOS releases are being built using latest available LLVM Clang.
|
||||||
|
|
||||||
|
Important to note is, the MSVC and AppleClang compilers are both **NOT** supported since they're both generally severely outdated and lack features GCC and LLVM Clang have.
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> Many dependencies are bundled into the repository using submodules so make sure to clone it using the `--recurse-submodules` option.
|
> Many dependencies are bundled into the repository using submodules so make sure to clone it using the `--recurse-submodules` option.
|
||||||
|
|||||||
@@ -1,3 +1,73 @@
|
|||||||
|
# Some libraries we use set the BUILD_SHARED_LIBS variable to ON, which causes CMake to
|
||||||
|
# display a warning about options being set using set() instead of option().
|
||||||
|
# Explicitly set the policy to NEW to suppress the warning.
|
||||||
|
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
|
||||||
|
|
||||||
|
set(CMAKE_POLICY_DEFAULT_CMP0063 NEW)
|
||||||
|
|
||||||
|
if (POLICY CMP0177)
|
||||||
|
set(CMAKE_POLICY_DEFAULT_CMP0177 OLD)
|
||||||
|
cmake_policy(SET CMP0177 OLD)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
function(getTarget target type)
|
||||||
|
get_target_property(IMPORTED_TARGET ${target} IMPORTED)
|
||||||
|
if (IMPORTED_TARGET)
|
||||||
|
set(${type} INTERFACE PARENT_SCOPE)
|
||||||
|
else()
|
||||||
|
set(${type} PRIVATE PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(addCFlag)
|
||||||
|
if (ARGC EQUAL 1)
|
||||||
|
add_compile_options($<$<COMPILE_LANGUAGE:C>:${ARGV0}>)
|
||||||
|
elseif (ARGC EQUAL 2)
|
||||||
|
getTarget(${ARGV1} TYPE)
|
||||||
|
target_compile_options(${ARGV1} ${TYPE} $<$<COMPILE_LANGUAGE:C>:${ARGV0}>)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(addCXXFlag)
|
||||||
|
if (ARGC EQUAL 1)
|
||||||
|
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:${ARGV0}>)
|
||||||
|
elseif (ARGC EQUAL 2)
|
||||||
|
getTarget(${ARGV1} TYPE)
|
||||||
|
target_compile_options(${ARGV1} ${TYPE} $<$<COMPILE_LANGUAGE:CXX>:${ARGV0}>)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(addObjCFlag)
|
||||||
|
if (ARGC EQUAL 1)
|
||||||
|
add_compile_options($<$<COMPILE_LANGUAGE:OBJC>:${ARGV0}>)
|
||||||
|
elseif (ARGC EQUAL 2)
|
||||||
|
getTarget(${ARGV1} TYPE)
|
||||||
|
target_compile_options(${ARGV1} ${TYPE} $<$<COMPILE_LANGUAGE:OBJC>:${ARGV0}>)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(addLinkerFlag)
|
||||||
|
if (ARGC EQUAL 1)
|
||||||
|
add_link_options(${ARGV0})
|
||||||
|
elseif (ARGC EQUAL 2)
|
||||||
|
getTarget(${ARGV1} TYPE)
|
||||||
|
target_link_options(${ARGV1} ${TYPE} ${ARGV0})
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(addCCXXFlag)
|
||||||
|
addCFlag(${ARGV0} ${ARGV1})
|
||||||
|
addCXXFlag(${ARGV0} ${ARGV1})
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(addCommonFlag)
|
||||||
|
addCFlag(${ARGV0} ${ARGV1})
|
||||||
|
addCXXFlag(${ARGV0} ${ARGV1})
|
||||||
|
addObjCFlag(${ARGV0} ${ARGV1})
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
set(CMAKE_WARN_DEPRECATED OFF CACHE BOOL "Disable deprecated warnings" FORCE)
|
||||||
|
|
||||||
include(FetchContent)
|
include(FetchContent)
|
||||||
|
|
||||||
if(IMHEX_STRIP_RELEASE)
|
if(IMHEX_STRIP_RELEASE)
|
||||||
@@ -59,7 +129,9 @@ macro(detectOS)
|
|||||||
set(CMAKE_INSTALL_LIBDIR ".")
|
set(CMAKE_INSTALL_LIBDIR ".")
|
||||||
set(PLUGINS_INSTALL_LOCATION "plugins")
|
set(PLUGINS_INSTALL_LOCATION "plugins")
|
||||||
add_compile_definitions(WIN32_LEAN_AND_MEAN)
|
add_compile_definitions(WIN32_LEAN_AND_MEAN)
|
||||||
|
add_compile_definitions(NOMINMAX)
|
||||||
add_compile_definitions(UNICODE)
|
add_compile_definitions(UNICODE)
|
||||||
|
add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
|
||||||
elseif (APPLE)
|
elseif (APPLE)
|
||||||
add_compile_definitions(OS_MACOS)
|
add_compile_definitions(OS_MACOS)
|
||||||
set(CMAKE_INSTALL_BINDIR ".")
|
set(CMAKE_INSTALL_BINDIR ".")
|
||||||
@@ -110,7 +182,7 @@ macro(configurePackingResources)
|
|||||||
set(CPACK_WIX_PRODUCT_ICON "${PROJECT_SOURCE_DIR}/resources/dist/windows/icon.ico")
|
set(CPACK_WIX_PRODUCT_ICON "${PROJECT_SOURCE_DIR}/resources/dist/windows/icon.ico")
|
||||||
set(CPACK_WIX_UI_BANNER "${PROJECT_SOURCE_DIR}/resources/dist/windows/wix_banner.png")
|
set(CPACK_WIX_UI_BANNER "${PROJECT_SOURCE_DIR}/resources/dist/windows/wix_banner.png")
|
||||||
set(CPACK_WIX_UI_DIALOG "${PROJECT_SOURCE_DIR}/resources/dist/windows/wix_dialog.png")
|
set(CPACK_WIX_UI_DIALOG "${PROJECT_SOURCE_DIR}/resources/dist/windows/wix_dialog.png")
|
||||||
set(CPACK_WIX_CULTURES "en-US;de-DE;ja-JP;it-IT;pt-BR;zh-CN;zh-TW")
|
set(CPACK_WIX_CULTURES "en-US;de-DE;ja-JP;it-IT;pt-BR;zh-CN;zh-TW;ru-RU")
|
||||||
set(CPACK_PACKAGE_INSTALL_DIRECTORY "ImHex")
|
set(CPACK_PACKAGE_INSTALL_DIRECTORY "ImHex")
|
||||||
set_property(INSTALL "$<TARGET_FILE_NAME:main>"
|
set_property(INSTALL "$<TARGET_FILE_NAME:main>"
|
||||||
PROPERTY CPACK_START_MENU_SHORTCUTS "ImHex"
|
PROPERTY CPACK_START_MENU_SHORTCUTS "ImHex"
|
||||||
@@ -225,7 +297,8 @@ macro(createPackage)
|
|||||||
|
|
||||||
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE DESTINATION ${CMAKE_INSTALL_PREFIX}/share/licenses/imhex)
|
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE DESTINATION ${CMAKE_INSTALL_PREFIX}/share/licenses/imhex)
|
||||||
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/dist/imhex.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)
|
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/dist/imhex.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)
|
||||||
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/resources/icon.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps RENAME imhex.png)
|
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/dist/imhex.mime.xml DESTINATION ${CMAKE_INSTALL_PREFIX}/share/mime/packages RENAME imhex.xml)
|
||||||
|
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/resources/icon.svg DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps RENAME imhex.svg)
|
||||||
downloadImHexPatternsFiles("./share/imhex")
|
downloadImHexPatternsFiles("./share/imhex")
|
||||||
|
|
||||||
# install AppStream file
|
# install AppStream file
|
||||||
@@ -239,6 +312,7 @@ macro(createPackage)
|
|||||||
|
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
if (IMHEX_GENERATE_PACKAGE)
|
if (IMHEX_GENERATE_PACKAGE)
|
||||||
|
set(EXTRA_BUNDLE_LIBRARY_PATHS ${EXTRA_BUNDLE_LIBRARY_PATHS} "${IMHEX_SYSTEM_LIBRARY_PATH}")
|
||||||
include(PostprocessBundle)
|
include(PostprocessBundle)
|
||||||
|
|
||||||
set_target_properties(libimhex PROPERTIES SOVERSION ${IMHEX_VERSION})
|
set_target_properties(libimhex PROPERTIES SOVERSION ${IMHEX_VERSION})
|
||||||
@@ -307,9 +381,6 @@ endfunction()
|
|||||||
macro(configureCMake)
|
macro(configureCMake)
|
||||||
message(STATUS "Configuring ImHex v${IMHEX_VERSION}")
|
message(STATUS "Configuring ImHex v${IMHEX_VERSION}")
|
||||||
|
|
||||||
# Enable C and C++ languages
|
|
||||||
enable_language(C CXX)
|
|
||||||
|
|
||||||
set(CMAKE_POSITION_INDEPENDENT_CODE ON CACHE BOOL "Enable position independent code for all targets" FORCE)
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON CACHE BOOL "Enable position independent code for all targets" FORCE)
|
||||||
|
|
||||||
# Configure use of recommended build tools
|
# Configure use of recommended build tools
|
||||||
@@ -344,9 +415,9 @@ macro(configureCMake)
|
|||||||
if (LD_LLD_PATH)
|
if (LD_LLD_PATH)
|
||||||
set(CMAKE_LINKER ${LD_LLD_PATH})
|
set(CMAKE_LINKER ${LD_LLD_PATH})
|
||||||
|
|
||||||
if (NOT XCODE)
|
if (NOT XCODE AND NOT MSVC)
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fuse-ld=lld")
|
set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} -fuse-ld=lld)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fuse-ld=lld")
|
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fuse-ld=lld)
|
||||||
endif()
|
endif()
|
||||||
else ()
|
else ()
|
||||||
message(WARNING "lld not found, using default linker!")
|
message(WARNING "lld not found, using default linker!")
|
||||||
@@ -371,18 +442,12 @@ macro(configureCMake)
|
|||||||
message(WARNING "LTO is not supported: ${output_error}")
|
message(WARNING "LTO is not supported: ${output_error}")
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
# Some libraries we use set the BUILD_SHARED_LIBS variable to ON, which causes CMake to
|
|
||||||
# display a warning about options being set using set() instead of option().
|
|
||||||
# Explicitly set the policy to NEW to suppress the warning.
|
|
||||||
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
|
|
||||||
|
|
||||||
set(CMAKE_POLICY_DEFAULT_CMP0063 NEW)
|
|
||||||
|
|
||||||
set(CMAKE_WARN_DEPRECATED OFF CACHE BOOL "Disable deprecated warnings" FORCE)
|
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
function(configureProject)
|
function(configureProject)
|
||||||
|
# Enable C and C++ languages
|
||||||
|
enable_language(C CXX)
|
||||||
|
|
||||||
if (XCODE)
|
if (XCODE)
|
||||||
# Support Xcode's multi configuration paradigm by placing built artifacts into separate directories
|
# Support Xcode's multi configuration paradigm by placing built artifacts into separate directories
|
||||||
set(IMHEX_MAIN_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Configs/$<CONFIG>" PARENT_SCOPE)
|
set(IMHEX_MAIN_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Configs/$<CONFIG>" PARENT_SCOPE)
|
||||||
@@ -432,6 +497,8 @@ function(verifyCompiler)
|
|||||||
message(FATAL_ERROR "ImHex requires GCC 12.0.0 or newer. Please use the latest GCC version.")
|
message(FATAL_ERROR "ImHex requires GCC 12.0.0 or newer. Please use the latest GCC version.")
|
||||||
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "17.0.0")
|
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "17.0.0")
|
||||||
message(FATAL_ERROR "ImHex requires Clang 17.0.0 or newer. Please use the latest Clang version.")
|
message(FATAL_ERROR "ImHex requires Clang 17.0.0 or newer. Please use the latest Clang version.")
|
||||||
|
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||||
|
|
||||||
elseif (NOT (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang"))
|
elseif (NOT (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang"))
|
||||||
message(FATAL_ERROR "ImHex can only be compiled with GCC or Clang. ${CMAKE_CXX_COMPILER_ID} is not supported.")
|
message(FATAL_ERROR "ImHex can only be compiled with GCC or Clang. ${CMAKE_CXX_COMPILER_ID} is not supported.")
|
||||||
endif()
|
endif()
|
||||||
@@ -499,16 +566,16 @@ function(downloadImHexPatternsFiles dest)
|
|||||||
|
|
||||||
# Maybe patterns are cloned to a subdirectory
|
# Maybe patterns are cloned to a subdirectory
|
||||||
if (NOT EXISTS ${imhex_patterns_SOURCE_DIR})
|
if (NOT EXISTS ${imhex_patterns_SOURCE_DIR})
|
||||||
set(imhex_patterns_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ImHex-Patterns")
|
set(imhex_patterns_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ImHex-Patterns")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Or a sibling directory
|
# Or a sibling directory
|
||||||
if (NOT EXISTS ${imhex_patterns_SOURCE_DIR})
|
if (NOT EXISTS ${imhex_patterns_SOURCE_DIR})
|
||||||
set(imhex_patterns_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../ImHex-Patterns")
|
set(imhex_patterns_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../ImHex-Patterns")
|
||||||
endif()
|
endif()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (NOT EXISTS ${imhex_patterns_SOURCE_DIR})
|
if (NOT EXISTS ${imhex_patterns_SOURCE_DIR})
|
||||||
message(WARNING "Failed to locate ImHex-Patterns repository, some resources will be missing during install!")
|
message(WARNING "Failed to locate ImHex-Patterns repository, some resources will be missing during install!")
|
||||||
elseif(XCODE)
|
elseif(XCODE)
|
||||||
# The Xcode build has multiple configurations, which each need a copy of these files
|
# The Xcode build has multiple configurations, which each need a copy of these files
|
||||||
@@ -551,64 +618,95 @@ macro(setupDebugCompressionFlag)
|
|||||||
elseif (COMPRESS_AVAILABLE_COMPILER AND COMPRESS_AVAILABLE_LINKER)
|
elseif (COMPRESS_AVAILABLE_COMPILER AND COMPRESS_AVAILABLE_LINKER)
|
||||||
message("Using default compression for debug info because both compiler and linker support it")
|
message("Using default compression for debug info because both compiler and linker support it")
|
||||||
set(DEBUG_COMPRESSION_FLAG "-gz" CACHE STRING "Cache to use for debug info compression")
|
set(DEBUG_COMPRESSION_FLAG "-gz" CACHE STRING "Cache to use for debug info compression")
|
||||||
|
else()
|
||||||
|
set(DEBUG_COMPRESSION_FLAG "" CACHE STRING "Cache to use for debug info compression")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(IMHEX_COMMON_FLAGS "${IMHEX_COMMON_FLAGS} ${DEBUG_COMPRESSION_FLAG}")
|
addCommonFlag(${DEBUG_COMPRESSION_FLAG})
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
macro(setupCompilerFlags target)
|
macro(setupCompilerFlags target)
|
||||||
# IMHEX_COMMON_FLAGS: flags common for C, C++, Objective C, etc.. compilers
|
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
||||||
|
if (IMHEX_STRICT_WARNINGS)
|
||||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
addCommonFlag("/W4" ${target})
|
||||||
|
addCommonFlag("/wd4242" ${target})
|
||||||
|
addCommonFlag("/wd4244" ${target})
|
||||||
|
addCommonFlag("/wd4267" ${target})
|
||||||
|
addCommonFlag("/wd4996" ${target})
|
||||||
|
addCommonFlag("/wd4127" ${target})
|
||||||
|
endif()
|
||||||
|
elseif (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
||||||
# Define strict compilation flags
|
# Define strict compilation flags
|
||||||
if (IMHEX_STRICT_WARNINGS)
|
if (IMHEX_STRICT_WARNINGS)
|
||||||
set(IMHEX_COMMON_FLAGS "${IMHEX_COMMON_FLAGS} -Wall -Wextra -Wpedantic -Werror")
|
addCommonFlag("-Wall" ${target})
|
||||||
|
addCommonFlag("-Wextra" ${target})
|
||||||
|
addCommonFlag("-Wpedantic" ${target})
|
||||||
|
addCommonFlag("-Werror" ${target})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (UNIX AND NOT APPLE AND CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
if (UNIX AND NOT APPLE AND CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
||||||
set(IMHEX_COMMON_FLAGS "${IMHEX_COMMON_FLAGS} -rdynamic")
|
addCommonFlag("-rdynamic" ${target})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(IMHEX_CXX_FLAGS "-fexceptions -frtti")
|
addCXXFlag("-fexceptions" ${target})
|
||||||
|
addCXXFlag("-frtti" ${target})
|
||||||
|
|
||||||
# Disable some warnings
|
# Disable some warnings
|
||||||
set(IMHEX_C_CXX_FLAGS "-Wno-unknown-warning-option -Wno-array-bounds -Wno-deprecated-declarations -Wno-unknown-pragmas")
|
addCCXXFlag("-Wno-array-bounds" ${target})
|
||||||
|
addCCXXFlag("-Wno-deprecated-declarations" ${target})
|
||||||
|
addCCXXFlag("-Wno-unknown-pragmas" ${target})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
||||||
if (IMHEX_ENABLE_UNITY_BUILD AND WIN32)
|
if (WIN32)
|
||||||
set(IMHEX_COMMON_FLAGS "${IMHEX_COMMON_FLAGS} -Wa,-mbig-obj")
|
addLinkerFlag("-Wa,mbig-obj" ${target})
|
||||||
endif ()
|
endif ()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND APPLE)
|
||||||
|
execute_process(COMMAND brew --prefix llvm OUTPUT_VARIABLE LLVM_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${LLVM_PREFIX}/lib/c++")
|
||||||
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${LLVM_PREFIX}/lib/c++")
|
||||||
|
addCCXXFlag("-Wno-unknown-warning-option" ${target})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
||||||
|
addCommonFlag("/bigobj" ${target})
|
||||||
|
addCFlag("/std:clatest" ${target})
|
||||||
|
addCXXFlag("/std:c++latest" ${target})
|
||||||
|
endif()
|
||||||
|
|
||||||
# Disable some warnings for gcc
|
# Disable some warnings for gcc
|
||||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
||||||
set(IMHEX_C_CXX_FLAGS "${IMHEX_C_CXX_FLAGS} -Wno-restrict -Wno-stringop-overread -Wno-stringop-overflow -Wno-dangling-reference")
|
addCCXXFlag("-Wno-restrict" ${target})
|
||||||
|
addCCXXFlag("-Wno-stringop-overread" ${target})
|
||||||
|
addCCXXFlag("-Wno-stringop-overflow" ${target})
|
||||||
|
addCCXXFlag("-Wno-dangling-reference" ${target})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Define emscripten-specific disabled warnings
|
# Define emscripten-specific disabled warnings
|
||||||
if (EMSCRIPTEN)
|
if (EMSCRIPTEN)
|
||||||
set(IMHEX_C_CXX_FLAGS "${IMHEX_C_CXX_FLAGS} -pthread -Wno-dollar-in-identifier-extension -Wno-pthreads-mem-growth")
|
addCCXXFlag("-pthread" ${target})
|
||||||
|
addCCXXFlag("-Wno-dollar-in-identifier-extension" ${target})
|
||||||
|
addCCXXFlag("-Wno-pthreads-mem-growth" ${target})
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (IMHEX_COMPRESS_DEBUG_INFO)
|
if (IMHEX_COMPRESS_DEBUG_INFO)
|
||||||
setupDebugCompressionFlag()
|
setupDebugCompressionFlag()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Set actual CMake flags
|
|
||||||
set_target_properties(${target} PROPERTIES COMPILE_FLAGS "${IMHEX_COMMON_FLAGS} ${IMHEX_C_CXX_FLAGS}")
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${IMHEX_COMMON_FLAGS} ${IMHEX_C_CXX_FLAGS}")
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${IMHEX_COMMON_FLAGS} ${IMHEX_C_CXX_FLAGS} ${IMHEX_CXX_FLAGS}")
|
|
||||||
set(CMAKE_OBJC_FLAGS "${CMAKE_OBJC_FLAGS} ${IMHEX_COMMON_FLAGS}")
|
|
||||||
|
|
||||||
# Only generate minimal debug information for stacktraces in RelWithDebInfo builds
|
# Only generate minimal debug information for stacktraces in RelWithDebInfo builds
|
||||||
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -g1")
|
if (CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
|
||||||
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -g1")
|
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
|
||||||
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
addCCXXFlag("-g1" ${target})
|
||||||
# Add flags for debug info in inline functions
|
endif()
|
||||||
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -gstatement-frontiers -ginline-points")
|
|
||||||
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -gstatement-frontiers -ginline-points")
|
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||||
|
# Add flags for debug info in inline functions
|
||||||
|
addCCXXFlag("-gstatement-frontiers" ${target})
|
||||||
|
addCCXXFlag("-ginline-points" ${target})
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
@@ -640,6 +738,7 @@ macro(addBundledLibraries)
|
|||||||
set(FPHSA_NAME_MISMATCHED ON CACHE BOOL "")
|
set(FPHSA_NAME_MISMATCHED ON CACHE BOOL "")
|
||||||
|
|
||||||
if(NOT USE_SYSTEM_FMT)
|
if(NOT USE_SYSTEM_FMT)
|
||||||
|
set(FMT_INSTALL OFF CACHE BOOL "Disable install targets for libfmt" FORCE)
|
||||||
add_subdirectory(${THIRD_PARTY_LIBS_FOLDER}/fmt EXCLUDE_FROM_ALL)
|
add_subdirectory(${THIRD_PARTY_LIBS_FOLDER}/fmt EXCLUDE_FROM_ALL)
|
||||||
set(FMT_LIBRARIES fmt::fmt-header-only)
|
set(FMT_LIBRARIES fmt::fmt-header-only)
|
||||||
else()
|
else()
|
||||||
@@ -702,21 +801,20 @@ macro(addBundledLibraries)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (USE_SYSTEM_BOOST)
|
if (USE_SYSTEM_BOOST)
|
||||||
find_package(boost REQUIRED)
|
find_package(Boost REQUIRED)
|
||||||
|
set(BOOST_LIBRARIES Boost::regex)
|
||||||
else()
|
else()
|
||||||
add_subdirectory(${THIRD_PARTY_LIBS_FOLDER}/boost ${CMAKE_CURRENT_BINARY_DIR}/boost EXCLUDE_FROM_ALL)
|
add_subdirectory(${THIRD_PARTY_LIBS_FOLDER}/boost ${CMAKE_CURRENT_BINARY_DIR}/boost EXCLUDE_FROM_ALL)
|
||||||
|
set(BOOST_LIBRARIES boost::regex)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(LIBPL_BUILD_CLI_AS_EXECUTABLE OFF CACHE BOOL "" FORCE)
|
set(LIBPL_BUILD_CLI_AS_EXECUTABLE OFF CACHE BOOL "" FORCE)
|
||||||
set(LIBPL_ENABLE_PRECOMPILED_HEADERS ${IMHEX_ENABLE_PRECOMPILED_HEADERS} CACHE BOOL "" FORCE)
|
set(LIBPL_ENABLE_PRECOMPILED_HEADERS ${IMHEX_ENABLE_PRECOMPILED_HEADERS} CACHE BOOL "" FORCE)
|
||||||
|
|
||||||
if (WIN32)
|
set(LIBPL_SHARED_LIBRARY OFF CACHE BOOL "" FORCE)
|
||||||
set(LIBPL_SHARED_LIBRARY ON CACHE BOOL "" FORCE)
|
|
||||||
else()
|
|
||||||
set(LIBPL_SHARED_LIBRARY OFF CACHE BOOL "" FORCE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_subdirectory(${EXTERNAL_LIBS_FOLDER}/pattern_language EXCLUDE_FROM_ALL)
|
add_subdirectory(${EXTERNAL_LIBS_FOLDER}/pattern_language EXCLUDE_FROM_ALL)
|
||||||
|
add_subdirectory(${EXTERNAL_LIBS_FOLDER}/disassembler EXCLUDE_FROM_ALL)
|
||||||
|
|
||||||
if (LIBPL_SHARED_LIBRARY)
|
if (LIBPL_SHARED_LIBRARY)
|
||||||
install(
|
install(
|
||||||
@@ -773,70 +871,20 @@ function(enableUnityBuild TARGET)
|
|||||||
endif ()
|
endif ()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(generatePDBs)
|
function(setSDKPaths)
|
||||||
if (NOT IMHEX_GENERATE_PDBS)
|
if (WIN32)
|
||||||
return()
|
set(SDK_PATH "./sdk" PARENT_SCOPE)
|
||||||
endif ()
|
elseif (APPLE)
|
||||||
|
set(SDK_PATH "${CMAKE_INSTALL_PREFIX}/${BUNDLE_NAME}/Contents/Resources/sdk" PARENT_SCOPE)
|
||||||
if (NOT WIN32 OR CMAKE_BUILD_TYPE STREQUAL "Debug")
|
else()
|
||||||
return()
|
set(SDK_PATH "share/imhex/sdk" PARENT_SCOPE)
|
||||||
endif ()
|
endif()
|
||||||
|
|
||||||
include(FetchContent)
|
|
||||||
FetchContent_Declare(
|
|
||||||
cv2pdb
|
|
||||||
URL "https://github.com/rainers/cv2pdb/releases/download/v0.52/cv2pdb-0.52.zip"
|
|
||||||
DOWNLOAD_EXTRACT_TIMESTAMP ON
|
|
||||||
)
|
|
||||||
FetchContent_Populate(cv2pdb)
|
|
||||||
|
|
||||||
set(PDBS_TO_GENERATE main main-forwarder libimhex ${PLUGINS})
|
|
||||||
foreach (PDB ${PDBS_TO_GENERATE})
|
|
||||||
if (PDB STREQUAL "main")
|
|
||||||
set(GENERATED_PDB imhex)
|
|
||||||
elseif (PDB STREQUAL "main-forwarder")
|
|
||||||
set(GENERATED_PDB imhex-gui)
|
|
||||||
elseif (PDB STREQUAL "libimhex")
|
|
||||||
set(GENERATED_PDB libimhex)
|
|
||||||
else ()
|
|
||||||
set(GENERATED_PDB plugins/${PDB})
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (IMHEX_REPLACE_DWARF_WITH_PDB)
|
|
||||||
set(PDB_OUTPUT_PATH ${CMAKE_BINARY_DIR}/${GENERATED_PDB})
|
|
||||||
else ()
|
|
||||||
set(PDB_OUTPUT_PATH)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_custom_target(${PDB}_pdb DEPENDS ${CMAKE_BINARY_DIR}/${GENERATED_PDB}.pdb)
|
|
||||||
add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/${GENERATED_PDB}.pdb
|
|
||||||
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
|
||||||
COMMAND
|
|
||||||
(
|
|
||||||
${CMAKE_COMMAND} -E remove -f ${CMAKE_BINARY_DIR}/${GENERATED_PDB}.pdb &&
|
|
||||||
${cv2pdb_SOURCE_DIR}/cv2pdb64.exe $<TARGET_FILE:${PDB}> ${PDB_OUTPUT_PATH} &&
|
|
||||||
${CMAKE_COMMAND} -E remove -f ${CMAKE_BINARY_DIR}/${GENERATED_PDB}
|
|
||||||
) || (exit 0)
|
|
||||||
COMMAND_EXPAND_LISTS)
|
|
||||||
|
|
||||||
install(FILES ${CMAKE_BINARY_DIR}/${GENERATED_PDB}.pdb DESTINATION ".")
|
|
||||||
|
|
||||||
add_dependencies(imhex_all ${PDB}_pdb)
|
|
||||||
endforeach ()
|
|
||||||
|
|
||||||
|
set(SDK_BUILD_PATH "${CMAKE_BINARY_DIR}/sdk" PARENT_SCOPE)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(generateSDKDirectory)
|
function(generateSDKDirectory)
|
||||||
if (WIN32)
|
setSDKPaths()
|
||||||
set(SDK_PATH "./sdk")
|
|
||||||
elseif (APPLE)
|
|
||||||
set(SDK_PATH "${CMAKE_INSTALL_PREFIX}/${BUNDLE_NAME}/Contents/Resources/sdk")
|
|
||||||
else()
|
|
||||||
set(SDK_PATH "share/imhex/sdk")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(SDK_BUILD_PATH "${CMAKE_BINARY_DIR}/sdk")
|
|
||||||
|
|
||||||
install(DIRECTORY ${CMAKE_SOURCE_DIR}/lib/libimhex DESTINATION "${SDK_PATH}/lib" PATTERN "**/source/*" EXCLUDE)
|
install(DIRECTORY ${CMAKE_SOURCE_DIR}/lib/libimhex DESTINATION "${SDK_PATH}/lib" PATTERN "**/source/*" EXCLUDE)
|
||||||
install(DIRECTORY ${CMAKE_SOURCE_DIR}/lib/external DESTINATION "${SDK_PATH}/lib")
|
install(DIRECTORY ${CMAKE_SOURCE_DIR}/lib/external DESTINATION "${SDK_PATH}/lib")
|
||||||
install(DIRECTORY ${CMAKE_SOURCE_DIR}/lib/third_party/imgui DESTINATION "${SDK_PATH}/lib/third_party" PATTERN "**/source/*" EXCLUDE)
|
install(DIRECTORY ${CMAKE_SOURCE_DIR}/lib/third_party/imgui DESTINATION "${SDK_PATH}/lib/third_party" PATTERN "**/source/*" EXCLUDE)
|
||||||
@@ -846,11 +894,20 @@ function(generateSDKDirectory)
|
|||||||
if (NOT USE_SYSTEM_NLOHMANN_JSON)
|
if (NOT USE_SYSTEM_NLOHMANN_JSON)
|
||||||
install(DIRECTORY ${CMAKE_SOURCE_DIR}/lib/third_party/nlohmann_json DESTINATION "${SDK_PATH}/lib/third_party")
|
install(DIRECTORY ${CMAKE_SOURCE_DIR}/lib/third_party/nlohmann_json DESTINATION "${SDK_PATH}/lib/third_party")
|
||||||
endif()
|
endif()
|
||||||
|
if (NOT USE_SYSTEM_BOOST)
|
||||||
|
install(DIRECTORY ${CMAKE_SOURCE_DIR}/lib/third_party/boost DESTINATION "${SDK_PATH}/lib/third_party")
|
||||||
|
endif()
|
||||||
|
|
||||||
install(DIRECTORY ${CMAKE_SOURCE_DIR}/cmake/modules DESTINATION "${SDK_PATH}/cmake")
|
install(DIRECTORY ${CMAKE_SOURCE_DIR}/cmake/modules DESTINATION "${SDK_PATH}/cmake")
|
||||||
install(FILES ${CMAKE_SOURCE_DIR}/cmake/build_helpers.cmake DESTINATION "${SDK_PATH}/cmake")
|
install(FILES ${CMAKE_SOURCE_DIR}/cmake/build_helpers.cmake DESTINATION "${SDK_PATH}/cmake")
|
||||||
install(DIRECTORY ${CMAKE_SOURCE_DIR}/cmake/sdk/ DESTINATION "${SDK_PATH}")
|
install(DIRECTORY ${CMAKE_SOURCE_DIR}/cmake/sdk/ DESTINATION "${SDK_PATH}")
|
||||||
install(TARGETS libimhex ARCHIVE DESTINATION "${SDK_PATH}/lib")
|
install(TARGETS libimhex ARCHIVE DESTINATION "${SDK_PATH}/lib")
|
||||||
|
|
||||||
|
install(DIRECTORY ${CMAKE_SOURCE_DIR}/plugins/ui DESTINATION "${SDK_PATH}/lib" PATTERN "**/source/*" EXCLUDE)
|
||||||
|
install(TARGETS ui ARCHIVE DESTINATION "${SDK_PATH}/lib")
|
||||||
|
|
||||||
|
install(DIRECTORY ${CMAKE_SOURCE_DIR}/plugins/fonts DESTINATION "${SDK_PATH}/lib" PATTERN "**/source/*" EXCLUDE)
|
||||||
|
install(TARGETS fonts ARCHIVE DESTINATION "${SDK_PATH}/lib")
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(addIncludesFromLibrary target library)
|
function(addIncludesFromLibrary target library)
|
||||||
@@ -871,4 +928,4 @@ function(precompileHeaders target includeFolder)
|
|||||||
PUBLIC
|
PUBLIC
|
||||||
"$<$<COMPILE_LANGUAGE:CXX>:${INCLUDES}>"
|
"$<$<COMPILE_LANGUAGE:CXX>:${INCLUDES}>"
|
||||||
)
|
)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|||||||
@@ -89,4 +89,5 @@ if (CoreClrEmbed_INCLUDE_DIR AND CoreClrEmbed_LIBRARY)
|
|||||||
set(CoreClrEmbed_LIBRARIES "${CoreClrEmbed_LIBRARY}" CACHE STRING "CoreClrEmbed libraries" FORCE)
|
set(CoreClrEmbed_LIBRARIES "${CoreClrEmbed_LIBRARY}" CACHE STRING "CoreClrEmbed libraries" FORCE)
|
||||||
set(CoreClrEmbed_SHARED_LIBRARIES "${CoreClrEmbed_SHARED_LIBRARY}" CACHE STRING "CoreClrEmbed shared libraries" FORCE)
|
set(CoreClrEmbed_SHARED_LIBRARIES "${CoreClrEmbed_SHARED_LIBRARY}" CACHE STRING "CoreClrEmbed shared libraries" FORCE)
|
||||||
set(CoreClrEmbed_INCLUDE_DIRS "${CoreClrEmbed_INCLUDE_DIR}" CACHE STRING "CoreClrEmbed include directories" FORCE)
|
set(CoreClrEmbed_INCLUDE_DIRS "${CoreClrEmbed_INCLUDE_DIR}" CACHE STRING "CoreClrEmbed include directories" FORCE)
|
||||||
|
set(CoreClrEmbed_VERSION "${CORECLR_RUNTIME_VERSION_FULL}" CACHE STRING "CoreClrEmbed version" FORCE)
|
||||||
endif()
|
endif()
|
||||||
60
cmake/modules/FindLZ4.cmake
Normal file
60
cmake/modules/FindLZ4.cmake
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
find_path(LZ4_INCLUDE_DIR
|
||||||
|
NAMES lz4.h
|
||||||
|
HINTS "${LZ4_INCLUDEDIR}" "${LZ4_HINTS}/include"
|
||||||
|
PATHS
|
||||||
|
/usr/local/include
|
||||||
|
/usr/include
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(LZ4_LIBRARY
|
||||||
|
NAMES lz4 liblz4
|
||||||
|
HINTS "${LZ4_LIBDIR}" "${LZ4_HINTS}/lib"
|
||||||
|
PATHS
|
||||||
|
/usr/local/lib
|
||||||
|
/usr/lib
|
||||||
|
)
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args( LZ4 DEFAULT_MSG LZ4_LIBRARY LZ4_INCLUDE_DIR )
|
||||||
|
|
||||||
|
if( LZ4_FOUND )
|
||||||
|
include( CheckIncludeFile )
|
||||||
|
include( CMakePushCheckState )
|
||||||
|
|
||||||
|
set( LZ4_INCLUDE_DIRS ${LZ4_INCLUDE_DIR} )
|
||||||
|
set( LZ4_LIBRARIES ${LZ4_LIBRARY} )
|
||||||
|
|
||||||
|
cmake_push_check_state()
|
||||||
|
set( CMAKE_REQUIRED_INCLUDES ${LZ4_INCLUDE_DIRS} )
|
||||||
|
check_include_file( lz4frame.h HAVE_LZ4FRAME_H )
|
||||||
|
cmake_pop_check_state()
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
|
set ( LZ4_DLL_DIR "${LZ4_HINTS}/bin"
|
||||||
|
CACHE PATH "Path to LZ4 DLL"
|
||||||
|
)
|
||||||
|
file( GLOB _lz4_dll RELATIVE "${LZ4_DLL_DIR}"
|
||||||
|
"${LZ4_DLL_DIR}/lz4*.dll"
|
||||||
|
)
|
||||||
|
set ( LZ4_DLL ${_lz4_dll}
|
||||||
|
# We're storing filenames only. Should we use STRING instead?
|
||||||
|
CACHE FILEPATH "LZ4 DLL file name"
|
||||||
|
)
|
||||||
|
file( GLOB _lz4_pdb RELATIVE "${LZ4_DLL_DIR}"
|
||||||
|
"${LZ4_DLL_DIR}/lz4*.pdb"
|
||||||
|
)
|
||||||
|
set ( LZ4_PDB ${_lz4_pdb}
|
||||||
|
CACHE FILEPATH "LZ4 PDB file name"
|
||||||
|
)
|
||||||
|
mark_as_advanced( LZ4_DLL_DIR LZ4_DLL LZ4_PDB )
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
set( LZ4_INCLUDE_DIRS )
|
||||||
|
set( LZ4_LIBRARIES )
|
||||||
|
endif()
|
||||||
|
|
||||||
|
mark_as_advanced( LZ4_LIBRARIES LZ4_INCLUDE_DIRS )
|
||||||
|
|
||||||
|
add_library( LZ4::lz4 INTERFACE IMPORTED )
|
||||||
|
set_property( TARGET LZ4::lz4 PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${LZ4_INCLUDE_DIRS} )
|
||||||
|
set_property( TARGET LZ4::lz4 PROPERTY INTERFACE_LINK_LIBRARIES ${LZ4_LIBRARIES} )
|
||||||
@@ -38,4 +38,8 @@ if (ZSTD_FOUND)
|
|||||||
message(STATUS "Found Zstd: ${ZSTD_LIBRARY}")
|
message(STATUS "Found Zstd: ${ZSTD_LIBRARY}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
mark_as_advanced(ZSTD_INCLUDE_DIR ZSTD_LIBRARY)
|
mark_as_advanced(ZSTD_INCLUDE_DIR ZSTD_LIBRARY)
|
||||||
|
|
||||||
|
add_library(ZSTD::zstd INTERFACE IMPORTED)
|
||||||
|
set_property(TARGET ZSTD::zstd PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${ZSTD_INCLUDE_DIR})
|
||||||
|
set_property(TARGET ZSTD::zstd PROPERTY INTERFACE_LINK_LIBRARIES ${ZSTD_LIBRARY})
|
||||||
@@ -40,7 +40,12 @@ IF(MBEDTLS_FOUND)
|
|||||||
STRING(REGEX REPLACE "^lib" "" MBEDTLS_LIBRARY_FILE ${MBEDTLS_LIBRARY_FILE})
|
STRING(REGEX REPLACE "^lib" "" MBEDTLS_LIBRARY_FILE ${MBEDTLS_LIBRARY_FILE})
|
||||||
STRING(REGEX REPLACE "^lib" "" MBEDX509_LIBRARY_FILE ${MBEDX509_LIBRARY_FILE})
|
STRING(REGEX REPLACE "^lib" "" MBEDX509_LIBRARY_FILE ${MBEDX509_LIBRARY_FILE})
|
||||||
STRING(REGEX REPLACE "^lib" "" MBEDCRYPTO_LIBRARY_FILE ${MBEDCRYPTO_LIBRARY_FILE})
|
STRING(REGEX REPLACE "^lib" "" MBEDCRYPTO_LIBRARY_FILE ${MBEDCRYPTO_LIBRARY_FILE})
|
||||||
SET(MBEDTLS_LIBRARIES "-L${MBEDTLS_LIBRARY_DIR} -l${MBEDTLS_LIBRARY_FILE} -l${MBEDX509_LIBRARY_FILE} -l${MBEDCRYPTO_LIBRARY_FILE}")
|
|
||||||
|
if (MSVC)
|
||||||
|
SET(MBEDTLS_LIBRARIES ${MBEDTLS_LIBRARY_FILE}.lib ${MBEDX509_LIBRARY_FILE}.lib ${MBEDCRYPTO_LIBRARY_FILE}.lib)
|
||||||
|
else()
|
||||||
|
SET(MBEDTLS_LIBRARIES "-L${MBEDTLS_LIBRARY_DIR} -l${MBEDTLS_LIBRARY_FILE} -l${MBEDX509_LIBRARY_FILE} -l${MBEDCRYPTO_LIBRARY_FILE}")
|
||||||
|
endif()
|
||||||
|
|
||||||
IF(NOT MBEDTLS_FIND_QUIETLY)
|
IF(NOT MBEDTLS_FIND_QUIETLY)
|
||||||
MESSAGE(STATUS "Found mbedTLS:")
|
MESSAGE(STATUS "Found mbedTLS:")
|
||||||
@@ -55,9 +60,9 @@ IF(MBEDTLS_FOUND)
|
|||||||
MESSAGE(STATUS " Crypto: ${MBEDCRYPTO_LIBRARY}")
|
MESSAGE(STATUS " Crypto: ${MBEDCRYPTO_LIBRARY}")
|
||||||
ENDIF(NOT MBEDTLS_FIND_QUIETLY)
|
ENDIF(NOT MBEDTLS_FIND_QUIETLY)
|
||||||
ELSE(MBEDTLS_FOUND)
|
ELSE(MBEDTLS_FOUND)
|
||||||
IF(MBEDTLS_FIND_REQUIRED)
|
IF(mbedTLS_FIND_REQUIRED)
|
||||||
MESSAGE(FATAL_ERROR "Could not find mbedTLS")
|
MESSAGE(FATAL_ERROR "Could not find mbedTLS")
|
||||||
ENDIF(MBEDTLS_FIND_REQUIRED)
|
ENDIF(mbedTLS_FIND_REQUIRED)
|
||||||
ENDIF(MBEDTLS_FOUND)
|
ENDIF(MBEDTLS_FOUND)
|
||||||
|
|
||||||
MARK_AS_ADVANCED(
|
MARK_AS_ADVANCED(
|
||||||
@@ -67,4 +72,4 @@ MARK_AS_ADVANCED(
|
|||||||
MBEDTLS_LIBRARY
|
MBEDTLS_LIBRARY
|
||||||
MBEDX509_LIBRARY
|
MBEDX509_LIBRARY
|
||||||
MBEDCRYPTO_LIBRARY
|
MBEDCRYPTO_LIBRARY
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
macro(add_imhex_plugin)
|
macro(add_imhex_plugin)
|
||||||
|
setSDKPaths()
|
||||||
# Parse arguments
|
# Parse arguments
|
||||||
set(options LIBRARY_PLUGIN)
|
set(options LIBRARY_PLUGIN)
|
||||||
set(oneValueArgs NAME IMHEX_VERSION)
|
set(oneValueArgs NAME IMHEX_VERSION)
|
||||||
@@ -28,6 +29,10 @@ macro(add_imhex_plugin)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (IMHEX_PLUGIN_LIBRARY_PLUGIN)
|
||||||
|
install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/" DESTINATION "${SDK_PATH}/lib/plugins/${IMHEX_PLUGIN_NAME}")
|
||||||
|
endif()
|
||||||
|
|
||||||
# Define new project for plugin
|
# Define new project for plugin
|
||||||
project(${IMHEX_PLUGIN_NAME})
|
project(${IMHEX_PLUGIN_NAME})
|
||||||
|
|
||||||
@@ -62,7 +67,11 @@ macro(add_imhex_plugin)
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Set rpath of plugin libraries to the plugins folder
|
# Set rpath of plugin libraries to the plugins folder
|
||||||
if (APPLE)
|
if (WIN32)
|
||||||
|
if (IMHEX_PLUGIN_LIBRARY_PLUGIN)
|
||||||
|
set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
|
||||||
|
endif()
|
||||||
|
elseif (APPLE)
|
||||||
set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES BUILD_RPATH "@executable_path/../Frameworks;@executable_path/plugins")
|
set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES BUILD_RPATH "@executable_path/../Frameworks;@executable_path/plugins")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -72,10 +81,23 @@ macro(add_imhex_plugin)
|
|||||||
add_subdirectory(${IMHEX_BASE_FOLDER}/lib/external/libromfs ${CMAKE_CURRENT_BINARY_DIR}/libromfs)
|
add_subdirectory(${IMHEX_BASE_FOLDER}/lib/external/libromfs ${CMAKE_CURRENT_BINARY_DIR}/libromfs)
|
||||||
target_link_libraries(${IMHEX_PLUGIN_NAME} PRIVATE ${LIBROMFS_LIBRARY})
|
target_link_libraries(${IMHEX_PLUGIN_NAME} PRIVATE ${LIBROMFS_LIBRARY})
|
||||||
|
|
||||||
foreach(feature ${IMHEX_PLUGIN_FEATURES})
|
set(FEATURE_DEFINE_CONTENT)
|
||||||
string(TOUPPER ${feature} feature)
|
|
||||||
add_definitions(-DIMHEX_PLUGIN_${IMHEX_PLUGIN_NAME}_FEATURE_${feature}=0)
|
if (IMHEX_PLUGIN_FEATURES)
|
||||||
endforeach()
|
list(LENGTH IMHEX_PLUGIN_FEATURES IMHEX_FEATURE_COUNT)
|
||||||
|
math(EXPR IMHEX_FEATURE_COUNT "${IMHEX_FEATURE_COUNT} - 1" OUTPUT_FORMAT DECIMAL)
|
||||||
|
foreach(index RANGE 0 ${IMHEX_FEATURE_COUNT} 2)
|
||||||
|
list(SUBLIST IMHEX_PLUGIN_FEATURES ${index} 2 IMHEX_PLUGIN_FEATURE)
|
||||||
|
list(GET IMHEX_PLUGIN_FEATURE 0 feature_define)
|
||||||
|
list(GET IMHEX_PLUGIN_FEATURE 1 feature_description)
|
||||||
|
|
||||||
|
string(TOUPPER ${feature_define} feature_define)
|
||||||
|
add_definitions(-DIMHEX_PLUGIN_${IMHEX_PLUGIN_NAME}_FEATURE_${feature_define}=0)
|
||||||
|
set(FEATURE_DEFINE_CONTENT "${FEATURE_DEFINE_CONTENT}{ \"${feature_description}\", IMHEX_FEATURE_ENABLED(${feature_define}) },")
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
target_compile_options(${IMHEX_PLUGIN_NAME} PRIVATE -DIMHEX_PLUGIN_FEATURES_CONTENT=${FEATURE_DEFINE_CONTENT})
|
||||||
|
|
||||||
# Add the new plugin to the main dependency list so it gets built by default
|
# Add the new plugin to the main dependency list so it gets built by default
|
||||||
if (TARGET imhex_all)
|
if (TARGET imhex_all)
|
||||||
@@ -117,6 +139,10 @@ macro(add_imhex_plugin)
|
|||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
macro(add_romfs_resource input output)
|
macro(add_romfs_resource input output)
|
||||||
|
if (NOT EXISTS ${input})
|
||||||
|
message(WARNING "Resource file ${input} does not exist")
|
||||||
|
endif()
|
||||||
|
|
||||||
configure_file(${input} ${CMAKE_CURRENT_BINARY_DIR}/romfs/${output} COPYONLY)
|
configure_file(${input} ${CMAKE_CURRENT_BINARY_DIR}/romfs/${output} COPYONLY)
|
||||||
|
|
||||||
list(APPEND LIBROMFS_RESOURCE_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/romfs)
|
list(APPEND LIBROMFS_RESOURCE_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/romfs)
|
||||||
@@ -130,4 +156,4 @@ macro (enable_plugin_feature feature)
|
|||||||
|
|
||||||
remove_definitions(-DIMHEX_PLUGIN_${IMHEX_PLUGIN_NAME}_FEATURE_${feature}=0)
|
remove_definitions(-DIMHEX_PLUGIN_${IMHEX_PLUGIN_NAME}_FEATURE_${feature}=0)
|
||||||
add_definitions(-DIMHEX_PLUGIN_${IMHEX_PLUGIN_NAME}_FEATURE_${feature}=1)
|
add_definitions(-DIMHEX_PLUGIN_${IMHEX_PLUGIN_NAME}_FEATURE_${feature}=1)
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|||||||
@@ -29,22 +29,21 @@ add_subdirectory_if_exists(lib/third_party/nlohmann_json)
|
|||||||
set(NLOHMANN_JSON_LIBRARIES nlohmann_json PARENT_SCOPE)
|
set(NLOHMANN_JSON_LIBRARIES nlohmann_json PARENT_SCOPE)
|
||||||
set(NLOHMANN_JSON_LIBRARIES nlohmann_json)
|
set(NLOHMANN_JSON_LIBRARIES nlohmann_json)
|
||||||
|
|
||||||
|
add_subdirectory_if_exists(lib/third_party/boost)
|
||||||
|
set(BOOST_LIBRARIES boost::regex PARENT_SCOPE)
|
||||||
|
set(BOOST_LIBRARIES boost::regex)
|
||||||
|
|
||||||
add_subdirectory(lib/external/libwolv EXCLUDE_FROM_ALL)
|
add_subdirectory(lib/external/libwolv EXCLUDE_FROM_ALL)
|
||||||
|
|
||||||
set(LIBPL_ENABLE_CLI OFF CACHE BOOL "" FORCE)
|
set(LIBPL_ENABLE_CLI OFF CACHE BOOL "" FORCE)
|
||||||
add_subdirectory(lib/external/pattern_language EXCLUDE_FROM_ALL)
|
add_subdirectory(lib/external/pattern_language EXCLUDE_FROM_ALL)
|
||||||
|
|
||||||
find_package(CURL REQUIRED)
|
|
||||||
find_package(mbedTLS 3.4.0 REQUIRED)
|
|
||||||
set(CURL_LIBRARIES ${CURL_LIBRARIES} PARENT_SCOPE)
|
|
||||||
set(MBEDTLS_LIBRARIES ${MBEDTLS_LIBRARIES} PARENT_SCOPE)
|
|
||||||
|
|
||||||
add_subdirectory(lib/libimhex)
|
add_subdirectory(lib/libimhex)
|
||||||
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
set_target_properties(libimhex PROPERTIES
|
set_target_properties(libimhex PROPERTIES
|
||||||
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../libimhex.dll"
|
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../libimhex.dll"
|
||||||
IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/libimhex.dll.a"
|
IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/lib/liblibimhex.dll.a"
|
||||||
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/lib/libimhex/include")
|
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/lib/libimhex/include")
|
||||||
elseif (APPLE)
|
elseif (APPLE)
|
||||||
file(GLOB LIBIMHEX_DYLIB "${CMAKE_CURRENT_SOURCE_DIR}/../../Frameworks/libimhex.*.dylib")
|
file(GLOB LIBIMHEX_DYLIB "${CMAKE_CURRENT_SOURCE_DIR}/../../Frameworks/libimhex.*.dylib")
|
||||||
|
|||||||
@@ -11,31 +11,23 @@ AppDir:
|
|||||||
exec_args: $@
|
exec_args: $@
|
||||||
apt:
|
apt:
|
||||||
arch:
|
arch:
|
||||||
- amd64
|
- "{{ARCHITECTURE_PACKAGE}}"
|
||||||
allow_unauthenticated: true
|
allow_unauthenticated: true
|
||||||
sources:
|
sources:
|
||||||
- sourceline: deb http://us.archive.ubuntu.com/ubuntu/ jammy main restricted
|
- sourceline: 'deb [arch=amd64] http://us.archive.ubuntu.com/ubuntu/ oracular main restricted universe multiverse'
|
||||||
- sourceline: deb http://us.archive.ubuntu.com/ubuntu/ jammy-updates main restricted
|
- sourceline: 'deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ oracular main restricted universe multiverse'
|
||||||
- sourceline: deb http://us.archive.ubuntu.com/ubuntu/ jammy universe
|
|
||||||
- sourceline: deb http://us.archive.ubuntu.com/ubuntu/ jammy-updates universe
|
|
||||||
- sourceline: deb http://us.archive.ubuntu.com/ubuntu/ jammy multiverse
|
|
||||||
- sourceline: deb http://us.archive.ubuntu.com/ubuntu/ jammy-updates multiverse
|
|
||||||
- sourceline: deb http://us.archive.ubuntu.com/ubuntu/ jammy-backports main restricted
|
|
||||||
universe multiverse
|
|
||||||
- sourceline: deb http://security.ubuntu.com/ubuntu jammy-security main restricted
|
|
||||||
- sourceline: deb http://security.ubuntu.com/ubuntu jammy-security universe
|
|
||||||
- sourceline: deb http://security.ubuntu.com/ubuntu jammy-security multiverse
|
|
||||||
include:
|
include:
|
||||||
- librsvg2-common
|
- librsvg2-common
|
||||||
- libbz2-1.0:amd64
|
- libbz2-1.0
|
||||||
- libcap2:amd64
|
- libcap2
|
||||||
- libdbus-1-3:amd64
|
- libdbus-1-3
|
||||||
- libgpg-error0:amd64
|
- libfontconfig1
|
||||||
- liblzma5:amd64
|
- libgpg-error0
|
||||||
- libnss-mdns:amd64
|
- liblzma5
|
||||||
- libpcre3:amd64
|
- libnss-mdns
|
||||||
- libselinux1:amd64
|
- libpcre3
|
||||||
- libtinfo6:amd64
|
- libselinux1
|
||||||
|
- libtinfo6
|
||||||
files:
|
files:
|
||||||
include:
|
include:
|
||||||
- /lib/x86_64-linux-gnu/libLLVM-13.so.1
|
- /lib/x86_64-linux-gnu/libLLVM-13.so.1
|
||||||
@@ -132,6 +124,6 @@ AppDir:
|
|||||||
- usr/share/doc/*/NEWS.*
|
- usr/share/doc/*/NEWS.*
|
||||||
- usr/share/doc/*/TODO.*
|
- usr/share/doc/*/TODO.*
|
||||||
AppImage:
|
AppImage:
|
||||||
arch: x86_64
|
arch: "{{ARCHITECTURE_APPIMAGE_BUILDER}}"
|
||||||
update-information: gh-releases-zsync|WerWolv|ImHex|latest|imhex-*-x86_64.AppImage.zsync
|
update-information: gh-releases-zsync|WerWolv|ImHex|latest|imhex-*-{{ARCHITECTURE_FILE_NAME}}.AppImage.zsync
|
||||||
file_name: imhex-{{VERSION}}-x86_64.AppImage
|
file_name: imhex-{{VERSION}}-{{ARCHITECTURE_FILE_NAME}}.AppImage
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM ubuntu:22.04 as build
|
FROM ubuntu:24.10 as build
|
||||||
|
|
||||||
# Used to invalidate layer cache but not mount cache
|
# Used to invalidate layer cache but not mount cache
|
||||||
# See https://github.com/moby/moby/issues/41715#issuecomment-733976493
|
# See https://github.com/moby/moby/issues/41715#issuecomment-733976493
|
||||||
@@ -14,24 +14,13 @@ apt update
|
|||||||
# general deps
|
# general deps
|
||||||
apt install -y ccache git wget
|
apt install -y ccache git wget
|
||||||
# appimage tools deps
|
# appimage tools deps
|
||||||
apt install -y python3-pip python3-setuptools desktop-file-utils libgdk-pixbuf2.0-dev fuse ninja-build
|
apt install -y python3-pip python3-venv python3-setuptools desktop-file-utils libgdk-pixbuf2.0-dev fuse ninja-build
|
||||||
apt install -y squashfs-tools zsync
|
apt install -y squashfs-tools zsync
|
||||||
|
|
||||||
# imhex deps
|
# imhex deps
|
||||||
/tmp/get_deps_debian.sh
|
/tmp/get_deps_debian.sh
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
RUN --mount=type=cache,target=/cache <<EOF
|
|
||||||
# Download appimage-builder
|
|
||||||
set -xe
|
|
||||||
|
|
||||||
mkdir -p /cache/bin
|
|
||||||
wget -nc https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O /cache/bin/appimagetool || true
|
|
||||||
chmod +x /cache/bin/appimagetool
|
|
||||||
|
|
||||||
pip3 install git+https://github.com/AppImageCrafters/appimage-builder@f38699e
|
|
||||||
EOF
|
|
||||||
|
|
||||||
ENV PATH="/cache/bin/:${PATH}"
|
ENV PATH="/cache/bin/:${PATH}"
|
||||||
|
|
||||||
# Copy Imhex source
|
# Copy Imhex source
|
||||||
@@ -41,13 +30,19 @@ ARG LTO=ON
|
|||||||
ARG BUILD_TYPE=RelWithDebInfo
|
ARG BUILD_TYPE=RelWithDebInfo
|
||||||
ARG GIT_COMMIT_HASH
|
ARG GIT_COMMIT_HASH
|
||||||
ARG GIT_BRANCH
|
ARG GIT_BRANCH
|
||||||
|
ARG ARCHITECTURE_PACKAGE
|
||||||
|
ARG ARCHITECTURE_FILE_NAME
|
||||||
|
ARG ARCHITECTURE_APPIMAGE_BUILDER
|
||||||
WORKDIR /build
|
WORKDIR /build
|
||||||
SHELL ["bash", "-c"] # Ubuntu sh doesnt support string substitution
|
|
||||||
|
# Ubuntu sh doesnt support string substitution
|
||||||
|
SHELL ["bash", "-c"]
|
||||||
|
|
||||||
RUN <<EOF
|
RUN <<EOF
|
||||||
# Prepare ImHex build
|
# Prepare ImHex build
|
||||||
set -xe
|
set -xe
|
||||||
|
|
||||||
CC=gcc-12 CXX=g++-12 cmake -G "Ninja" \
|
CC=gcc-14 CXX=g++-14 cmake -G "Ninja" \
|
||||||
-DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
|
-DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
|
||||||
-DCMAKE_INSTALL_PREFIX="/usr" \
|
-DCMAKE_INSTALL_PREFIX="/usr" \
|
||||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||||
@@ -71,11 +66,23 @@ ccache -s
|
|||||||
EOF
|
EOF
|
||||||
|
|
||||||
RUN <<EOF
|
RUN <<EOF
|
||||||
# Package ImHex as AppImage
|
# Download appimage-builder
|
||||||
set -xe
|
set -xe
|
||||||
|
|
||||||
|
mkdir -p /cache/bin
|
||||||
|
wget -nc https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O /cache/bin/appimagetool || true
|
||||||
|
chmod +x /cache/bin/appimagetool
|
||||||
|
|
||||||
|
python3 -m venv venv
|
||||||
|
. venv/bin/activate
|
||||||
|
pip3 install git+https://github.com/AppImageCrafters/appimage-builder@f38699e
|
||||||
|
|
||||||
|
# Package ImHex as AppImage
|
||||||
export VERSION=$(cat /imhex/VERSION)
|
export VERSION=$(cat /imhex/VERSION)
|
||||||
appimage-builder --recipe /imhex/dist/AppImageBuilder.yml
|
export ARCHITECTURE_PACKAGE=${ARCHITECTURE_PACKAGE}
|
||||||
|
export ARCHITECTURE_FILE_NAME=${ARCHITECTURE_FILE_NAME}
|
||||||
|
export ARCHITECTURE_APPIMAGE_BUILDER=${ARCHITECTURE_APPIMAGE_BUILDER}
|
||||||
|
appimage-builder --recipe /imhex/dist/AppImage/AppImageBuilder.yml
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
FROM scratch
|
FROM scratch
|
||||||
1
dist/Arch/Dockerfile
vendored
1
dist/Arch/Dockerfile
vendored
@@ -13,6 +13,7 @@ RUN pacman -S --needed --noconfirm \
|
|||||||
glfw-x11 \
|
glfw-x11 \
|
||||||
file \
|
file \
|
||||||
mbedtls \
|
mbedtls \
|
||||||
|
fontconfig \
|
||||||
freetype2 \
|
freetype2 \
|
||||||
curl \
|
curl \
|
||||||
dbus \
|
dbus \
|
||||||
|
|||||||
4
dist/Arch/PKGBUILD
vendored
4
dist/Arch/PKGBUILD
vendored
@@ -8,7 +8,7 @@ pkgdesc="A Hex Editor for Reverse Engineers, Programmers and people who value th
|
|||||||
arch=("x86_64")
|
arch=("x86_64")
|
||||||
url="https://github.com/WerWolv/ImHex"
|
url="https://github.com/WerWolv/ImHex"
|
||||||
license=('GPL2')
|
license=('GPL2')
|
||||||
depends=(glfw mbedtls freetype2 libglvnd dbus gtk3 curl fmt yara nlohmann-json zlib bzip2 xz zstd)
|
depends=(glfw mbedtls fontconfig freetype2 libglvnd dbus gtk3 curl fmt yara nlohmann-json zlib bzip2 xz zstd)
|
||||||
makedepends=(git)
|
makedepends=(git)
|
||||||
provides=(imhex)
|
provides=(imhex)
|
||||||
conflicts=(imhex)
|
conflicts=(imhex)
|
||||||
@@ -26,5 +26,5 @@ package() {
|
|||||||
|
|
||||||
install -d "$pkgdir/usr/share/imhex"
|
install -d "$pkgdir/usr/share/imhex"
|
||||||
cp -r "$srcdir/usr/share/imhex/"{constants,encodings,includes,magic,patterns} "$pkgdir/usr/share/imhex"
|
cp -r "$srcdir/usr/share/imhex/"{constants,encodings,includes,magic,patterns} "$pkgdir/usr/share/imhex"
|
||||||
cp -r "$srcdir/usr/share/"{applications,licenses,pixmaps} "$pkgdir/usr/share"
|
cp -r "$srcdir/usr/share/"{applications,licenses,pixmaps,mime} "$pkgdir/usr/share"
|
||||||
}
|
}
|
||||||
|
|||||||
2
dist/DEBIAN/control.in
vendored
2
dist/DEBIAN/control.in
vendored
@@ -4,7 +4,7 @@ Section: editors
|
|||||||
Priority: optional
|
Priority: optional
|
||||||
Architecture: amd64
|
Architecture: amd64
|
||||||
License: GNU GPL-2
|
License: GNU GPL-2
|
||||||
Depends: libglfw3 | libglfw3-wayland, libmagic1, libmbedtls14, libfreetype6, libopengl0, libdbus-1-3, xdg-desktop-portal
|
Depends: libfontconfig1, libglfw3 | libglfw3-wayland, libmagic1, libmbedtls14, libfreetype6, libopengl0, libdbus-1-3, xdg-desktop-portal
|
||||||
Maintainer: WerWolv <hey@werwolv.net>
|
Maintainer: WerWolv <hey@werwolv.net>
|
||||||
Description: ImHex Hex Editor
|
Description: ImHex Hex Editor
|
||||||
A Hex Editor for Reverse Engineers, Programmers and
|
A Hex Editor for Reverse Engineers, Programmers and
|
||||||
|
|||||||
13
dist/ImHex-9999.ebuild
vendored
13
dist/ImHex-9999.ebuild
vendored
@@ -20,13 +20,14 @@ DEPEND=""
|
|||||||
RDEPEND="${DEPEND}
|
RDEPEND="${DEPEND}
|
||||||
media-libs/glfw
|
media-libs/glfw
|
||||||
sys-apps/file
|
sys-apps/file
|
||||||
dev-libs/mbedtls
|
net-libs/mbedtls
|
||||||
dev-cpp/nlohmann_json
|
dev-cpp/nlohmann_json
|
||||||
dbus
|
sys-apps/dbus
|
||||||
xdg-desktop-portal
|
sys-apps/xdg-desktop-portal
|
||||||
sys-libs/zlib
|
sys-libs/zlib
|
||||||
app-arch/bzip2
|
app-arch/bzip2
|
||||||
app-arch/lzma
|
app-arch/lzma
|
||||||
app-arch/zstd
|
app-arch/zstd
|
||||||
|
app-arch/lz4
|
||||||
"
|
"
|
||||||
BDEPEND="${DEPEND}"
|
BDEPEND="${DEPEND}"
|
||||||
|
|||||||
4
dist/compiling/macos.md
vendored
4
dist/compiling/macos.md
vendored
@@ -3,7 +3,7 @@
|
|||||||
On macOS, ImHex is built through regular GCC and LLVM clang.
|
On macOS, ImHex is built through regular GCC and LLVM clang.
|
||||||
|
|
||||||
1. Clone the repo using `git clone https://github.com/WerWolv/ImHex --recurse-submodules`
|
1. Clone the repo using `git clone https://github.com/WerWolv/ImHex --recurse-submodules`
|
||||||
2. Install all the dependencies using `brew bundle --no-lock --file dist/Brewfile`
|
2. Install all the dependencies using `brew bundle --no-lock --file dist/macOS/Brewfile`
|
||||||
3. Build ImHex itself using the following commands:
|
3. Build ImHex itself using the following commands:
|
||||||
```sh
|
```sh
|
||||||
cd ImHex
|
cd ImHex
|
||||||
@@ -19,4 +19,4 @@ cmake -G "Ninja" \
|
|||||||
-DIMHEX_GENERATE_PACKAGE=ON \
|
-DIMHEX_GENERATE_PACKAGE=ON \
|
||||||
..
|
..
|
||||||
ninja install
|
ninja install
|
||||||
```
|
```
|
||||||
|
|||||||
4
dist/get_deps_archlinux.sh
vendored
4
dist/get_deps_archlinux.sh
vendored
@@ -5,6 +5,7 @@ pacman -S $@ --needed \
|
|||||||
gcc \
|
gcc \
|
||||||
lld \
|
lld \
|
||||||
glfw \
|
glfw \
|
||||||
|
fontconfig \
|
||||||
file \
|
file \
|
||||||
mbedtls \
|
mbedtls \
|
||||||
freetype2 \
|
freetype2 \
|
||||||
@@ -18,4 +19,5 @@ pacman -S $@ --needed \
|
|||||||
zlib \
|
zlib \
|
||||||
bzip2 \
|
bzip2 \
|
||||||
xz \
|
xz \
|
||||||
zstd
|
zstd \
|
||||||
|
lz4
|
||||||
|
|||||||
8
dist/get_deps_debian.sh
vendored
8
dist/get_deps_debian.sh
vendored
@@ -8,8 +8,8 @@ fi
|
|||||||
|
|
||||||
apt install -y \
|
apt install -y \
|
||||||
build-essential \
|
build-essential \
|
||||||
gcc-12 \
|
gcc-14 \
|
||||||
g++-12 \
|
g++-14 \
|
||||||
lld \
|
lld \
|
||||||
${PKGCONF:-} \
|
${PKGCONF:-} \
|
||||||
cmake \
|
cmake \
|
||||||
@@ -18,6 +18,7 @@ apt install -y \
|
|||||||
libglm-dev \
|
libglm-dev \
|
||||||
libmagic-dev \
|
libmagic-dev \
|
||||||
libmbedtls-dev \
|
libmbedtls-dev \
|
||||||
|
libfontconfig-dev \
|
||||||
libfreetype-dev \
|
libfreetype-dev \
|
||||||
libdbus-1-dev \
|
libdbus-1-dev \
|
||||||
libcurl4-gnutls-dev \
|
libcurl4-gnutls-dev \
|
||||||
@@ -26,4 +27,5 @@ apt install -y \
|
|||||||
zlib1g-dev \
|
zlib1g-dev \
|
||||||
libbz2-dev \
|
libbz2-dev \
|
||||||
liblzma-dev \
|
liblzma-dev \
|
||||||
libzstd-dev
|
libzstd-dev \
|
||||||
|
liblz4-dev
|
||||||
|
|||||||
4
dist/get_deps_fedora.sh
vendored
4
dist/get_deps_fedora.sh
vendored
@@ -4,6 +4,7 @@ dnf install -y \
|
|||||||
cmake \
|
cmake \
|
||||||
dbus-devel \
|
dbus-devel \
|
||||||
file-devel \
|
file-devel \
|
||||||
|
fontconfig-devel \
|
||||||
freetype-devel \
|
freetype-devel \
|
||||||
libcurl-devel \
|
libcurl-devel \
|
||||||
gcc-c++ \
|
gcc-c++ \
|
||||||
@@ -16,4 +17,5 @@ dnf install -y \
|
|||||||
libzstd-devel \
|
libzstd-devel \
|
||||||
zlib-devel \
|
zlib-devel \
|
||||||
bzip2-devel \
|
bzip2-devel \
|
||||||
xz-devel
|
xz-devel \
|
||||||
|
lz4-devel
|
||||||
5
dist/get_deps_msys2.sh
vendored
5
dist/get_deps_msys2.sh
vendored
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env sh
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
pacman -S --needed --noconfirm pactoys
|
pacman -S --needed --noconfirm pactoys unzip
|
||||||
pacboy -S --needed --noconfirm \
|
pacboy -S --needed --noconfirm \
|
||||||
gcc:p \
|
gcc:p \
|
||||||
lld:p \
|
lld:p \
|
||||||
@@ -17,4 +17,5 @@ pacboy -S --needed --noconfirm \
|
|||||||
zlib:p \
|
zlib:p \
|
||||||
bzip2:p \
|
bzip2:p \
|
||||||
xz:p \
|
xz:p \
|
||||||
zstd:p
|
zstd:p \
|
||||||
|
lz4:p
|
||||||
|
|||||||
8
dist/get_deps_tumbleweed.sh
vendored
8
dist/get_deps_tumbleweed.sh
vendored
@@ -3,8 +3,9 @@
|
|||||||
zypper install \
|
zypper install \
|
||||||
cmake \
|
cmake \
|
||||||
ninja \
|
ninja \
|
||||||
gcc12 \
|
gcc14 \
|
||||||
gcc12-c++ \
|
gcc14-c++ \
|
||||||
|
fontconfig-devel \
|
||||||
freetype2-devel \
|
freetype2-devel \
|
||||||
libcurl-devel \
|
libcurl-devel \
|
||||||
dbus-1-devel \
|
dbus-1-devel \
|
||||||
@@ -16,4 +17,5 @@ zypper install \
|
|||||||
libzstd-devel \
|
libzstd-devel \
|
||||||
zlib-devel \
|
zlib-devel \
|
||||||
bzip3-devel \
|
bzip3-devel \
|
||||||
xz-devel
|
xz-devel \
|
||||||
|
lz4-dev
|
||||||
|
|||||||
7
dist/imhex.desktop
vendored
7
dist/imhex.desktop
vendored
@@ -1,4 +1,5 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
|
Version=1.0
|
||||||
Name=ImHex
|
Name=ImHex
|
||||||
Comment=ImHex Hex Editor
|
Comment=ImHex Hex Editor
|
||||||
GenericName=Hex Editor
|
GenericName=Hex Editor
|
||||||
@@ -9,3 +10,9 @@ StartupNotify=true
|
|||||||
Categories=Development;IDE;
|
Categories=Development;IDE;
|
||||||
StartupWMClass=imhex
|
StartupWMClass=imhex
|
||||||
Keywords=static-analysis;reverse-engineering;disassembler;disassembly;hacking;forensics;hex-editor;cybersecurity;security;binary-analysis;
|
Keywords=static-analysis;reverse-engineering;disassembler;disassembly;hacking;forensics;hex-editor;cybersecurity;security;binary-analysis;
|
||||||
|
MimeType=application/vnd.imhex.proj;
|
||||||
|
Actions=NewFile;
|
||||||
|
|
||||||
|
[Desktop Action NewFile]
|
||||||
|
Exec=imhex --new
|
||||||
|
Name=Create New File
|
||||||
8
dist/imhex.mime.xml
vendored
Normal file
8
dist/imhex.mime.xml
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
|
||||||
|
<mime-type type="application/vnd.imhex.proj">
|
||||||
|
<comment>ImHex Project</comment>
|
||||||
|
<glob pattern="*.hexproj"/>
|
||||||
|
</mime-type>
|
||||||
|
</mime-info>
|
||||||
16
dist/langtool.py
vendored
16
dist/langtool.py
vendored
@@ -129,16 +129,19 @@ def main():
|
|||||||
key in lang_data["translations"]
|
key in lang_data["translations"]
|
||||||
and lang_data["translations"][key] != INVALID_TRANSLATION
|
and lang_data["translations"][key] != INVALID_TRANSLATION
|
||||||
)
|
)
|
||||||
if not has_translation and not (
|
if (
|
||||||
(command == "retranslate" or command == "untranslate")
|
has_translation
|
||||||
and re.compile(args.keys).fullmatch(key)
|
and not (
|
||||||
|
(command == "retranslate" or command == "untranslate")
|
||||||
|
and re.compile(args.keys).fullmatch(key)
|
||||||
|
)
|
||||||
|
and not command == "fmtzh"
|
||||||
):
|
):
|
||||||
continue
|
continue
|
||||||
if command == "check":
|
if command == "check":
|
||||||
print(
|
print(
|
||||||
f"Error: Translation {lang_data['code']} is missing translation for key '{key}'"
|
f"Error: Translation {lang_data['code']} is missing translation for key '{key}'"
|
||||||
)
|
)
|
||||||
exit(2)
|
|
||||||
elif (
|
elif (
|
||||||
command == "translate"
|
command == "translate"
|
||||||
or command == "retranslate"
|
or command == "retranslate"
|
||||||
@@ -148,7 +151,10 @@ def main():
|
|||||||
continue
|
continue
|
||||||
reference_tranlsation = (
|
reference_tranlsation = (
|
||||||
" '%s'" % reference_lang_data["translations"][key]
|
" '%s'" % reference_lang_data["translations"][key]
|
||||||
if reference_lang_data
|
if (
|
||||||
|
reference_lang_data
|
||||||
|
and key in reference_lang_data["translations"]
|
||||||
|
)
|
||||||
else ""
|
else ""
|
||||||
)
|
)
|
||||||
print(
|
print(
|
||||||
|
|||||||
1
dist/Brewfile → dist/macOS/Brewfile
vendored
1
dist/Brewfile → dist/macOS/Brewfile
vendored
@@ -6,7 +6,6 @@ brew "freetype2"
|
|||||||
brew "libmagic"
|
brew "libmagic"
|
||||||
brew "pkg-config"
|
brew "pkg-config"
|
||||||
brew "curl"
|
brew "curl"
|
||||||
brew "gcc@12"
|
|
||||||
brew "llvm"
|
brew "llvm"
|
||||||
brew "glfw"
|
brew "glfw"
|
||||||
brew "ninja"
|
brew "ninja"
|
||||||
23
dist/macOS/arm64.Dockerfile
vendored
23
dist/macOS/arm64.Dockerfile
vendored
@@ -1,10 +1,21 @@
|
|||||||
# This base image is also known as "crosscompile". See arm64.crosscompile.Dockerfile
|
# This base image is also known as "crosscompile". See arm64.crosscompile.Dockerfile
|
||||||
FROM ghcr.io/itrooz/macos-crosscompile:clang17-nosdk as build
|
FROM ghcr.io/itrooz/macos-crosscompile:clang19-nosdk as build
|
||||||
|
|
||||||
ENV MACOSX_DEPLOYMENT_TARGET 12.1
|
ENV MACOSX_DEPLOYMENT_TARGET 13.0
|
||||||
|
|
||||||
# -- DOWNLOADING STUFF
|
# -- DOWNLOADING STUFF
|
||||||
|
|
||||||
|
# Update vcpkg
|
||||||
|
RUN <<EOF
|
||||||
|
cp /vcpkg/triplets/community/arm-osx-mytriplet.cmake /tmp/arm-osx-mytriplet.cmake
|
||||||
|
git -C /vcpkg clean -ffdx
|
||||||
|
git -C /vcpkg checkout origin/master
|
||||||
|
git -C /vcpkg reset --hard
|
||||||
|
git -C /vcpkg pull
|
||||||
|
/vcpkg/bootstrap-vcpkg.sh
|
||||||
|
cp /tmp/arm-osx-mytriplet.cmake /vcpkg/triplets/community/arm-osx-mytriplet.cmake
|
||||||
|
EOF
|
||||||
|
|
||||||
## Install make
|
## Install make
|
||||||
RUN --mount=type=cache,target=/var/lib/apt/lists/ apt update && apt install -y make
|
RUN --mount=type=cache,target=/var/lib/apt/lists/ apt update && apt install -y make
|
||||||
|
|
||||||
@@ -35,7 +46,7 @@ EOF
|
|||||||
|
|
||||||
## Download libmagic
|
## Download libmagic
|
||||||
### Clone libmagic
|
### Clone libmagic
|
||||||
RUN git clone --depth 1 --branch FILE5_45 https://github.com/file/file /mnt/file
|
RUN git clone --depth 1 --branch FILE5_46 https://github.com/file/file /mnt/file
|
||||||
### Download libmagic dependencies
|
### Download libmagic dependencies
|
||||||
RUN --mount=type=cache,target=/var/lib/apt/lists/ apt update && apt install -y libtool autoconf
|
RUN --mount=type=cache,target=/var/lib/apt/lists/ apt update && apt install -y libtool autoconf
|
||||||
|
|
||||||
@@ -118,7 +129,7 @@ if [ "$CUSTOM_GLFW" ]; then
|
|||||||
cd /mnt/glfw
|
cd /mnt/glfw
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
CC=o64-gcc CXX=o64-g++ cmake -G "Ninja" \
|
CC=o64-clang CXX=o64-clang++ cmake -G "Ninja" \
|
||||||
-DCMAKE_BUILD_TYPE=$BUILD_TYPE \
|
-DCMAKE_BUILD_TYPE=$BUILD_TYPE \
|
||||||
-DBUILD_SHARED_LIBS=ON \
|
-DBUILD_SHARED_LIBS=ON \
|
||||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||||
@@ -126,7 +137,7 @@ if [ "$CUSTOM_GLFW" ]; then
|
|||||||
-DCMAKE_OBJC_COMPILER_LAUNCHER=ccache \
|
-DCMAKE_OBJC_COMPILER_LAUNCHER=ccache \
|
||||||
-DCMAKE_OBJCXX_COMPILER_LAUNCHER=ccache \
|
-DCMAKE_OBJCXX_COMPILER_LAUNCHER=ccache \
|
||||||
-DCMAKE_INSTALL_PREFIX=/vcpkg/installed/arm-osx-mytriplet \
|
-DCMAKE_INSTALL_PREFIX=/vcpkg/installed/arm-osx-mytriplet \
|
||||||
-DVCPKG_TARGET_TRIPLET=arm-osx-mytriplet -DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=/osxcross/target/toolchain.cmake -DCMAKE_OSX_SYSROOT=/osxcross/target/SDK/MacOSX14.0.sdk -DCMAKE_OSX_DEPLOYMENT_TARGET=12.1 \
|
-DVCPKG_TARGET_TRIPLET=arm-osx-mytriplet -DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=/osxcross/target/toolchain.cmake -DCMAKE_OSX_SYSROOT=/osxcross/target/SDK/MacOSX14.0.sdk -DCMAKE_OSX_DEPLOYMENT_TARGET=13.0 \
|
||||||
..
|
..
|
||||||
ninja -j $JOBS install
|
ninja -j $JOBS install
|
||||||
|
|
||||||
@@ -148,7 +159,7 @@ RUN --mount=type=cache,target=/cache --mount=type=cache,target=/mnt/ImHex/build/
|
|||||||
`# ccache flags` \
|
`# ccache flags` \
|
||||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_OBJC_COMPILER_LAUNCHER=ccache -DCMAKE_OBJCXX_COMPILER_LAUNCHER=ccache \
|
-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_OBJC_COMPILER_LAUNCHER=ccache -DCMAKE_OBJCXX_COMPILER_LAUNCHER=ccache \
|
||||||
`# MacOS cross-compiling flags` \
|
`# MacOS cross-compiling flags` \
|
||||||
-DVCPKG_TARGET_TRIPLET=arm-osx-mytriplet -DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=/osxcross/target/toolchain.cmake -DCMAKE_OSX_SYSROOT=/osxcross/target/SDK/MacOSX14.0.sdk -DCMAKE_OSX_DEPLOYMENT_TARGET=12.1 \
|
-DVCPKG_TARGET_TRIPLET=arm-osx-mytriplet -DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=/osxcross/target/toolchain.cmake -DCMAKE_OSX_SYSROOT=/osxcross/target/SDK/MacOSX14.0.sdk -DCMAKE_OSX_DEPLOYMENT_TARGET=13.0 \
|
||||||
`# Override compilers for code generators` \
|
`# Override compilers for code generators` \
|
||||||
-DNATIVE_CMAKE_C_COMPILER=/usr/bin/clang -DNATIVE_CMAKE_CXX_COMPILER=/usr/bin/clang++ \
|
-DNATIVE_CMAKE_C_COMPILER=/usr/bin/clang -DNATIVE_CMAKE_CXX_COMPILER=/usr/bin/clang++ \
|
||||||
`# Normal ImHex flags` \
|
`# Normal ImHex flags` \
|
||||||
|
|||||||
15
dist/macOS/arm64.crosscompile.Dockerfile
vendored
15
dist/macOS/arm64.crosscompile.Dockerfile
vendored
@@ -1,4 +1,4 @@
|
|||||||
# This image is is provided for reference, but a (probably more up to date) image should be available at https://github.com/iTrooz/macos-crosscompile
|
# This image is provided for reference, but a (probably more up to date) image should be available at https://github.com/iTrooz/macos-crosscompile
|
||||||
FROM ubuntu:22.04
|
FROM ubuntu:22.04
|
||||||
|
|
||||||
ENV PATH $PATH:/osxcross/target/bin
|
ENV PATH $PATH:/osxcross/target/bin
|
||||||
@@ -68,19 +68,6 @@ RUN --mount=type=cache,target=/cache <<EOF
|
|||||||
|
|
||||||
ccache -s
|
ccache -s
|
||||||
EOF
|
EOF
|
||||||
# Not needed, because we don't use gcc for cross-compiling anymore
|
|
||||||
# ## Install dependencies for gcc-13
|
|
||||||
# RUN apt install -y gcc g++ zlib1g-dev libmpc-dev libmpfr-dev libgmp-dev
|
|
||||||
# ## Build cross-compiler gcc-13
|
|
||||||
# RUN --mount=type=cache,target=/cache <<EOF
|
|
||||||
# set -xe
|
|
||||||
# ccache -zs
|
|
||||||
|
|
||||||
# cd /osxcross
|
|
||||||
# UNATTENDED=1 CC=/usr/lib/ccache/gcc CXX=/usr/lib/ccache/g++ GCC_VERSION=13.2.0 ./build_gcc.sh
|
|
||||||
|
|
||||||
# ccache -s
|
|
||||||
# EOF
|
|
||||||
|
|
||||||
ARG DELETE_SDK=1
|
ARG DELETE_SDK=1
|
||||||
RUN <<EOF
|
RUN <<EOF
|
||||||
|
|||||||
16
dist/rpm/imhex.spec
vendored
16
dist/rpm/imhex.spec
vendored
@@ -16,6 +16,7 @@ BuildRequires: cmake
|
|||||||
BuildRequires: desktop-file-utils
|
BuildRequires: desktop-file-utils
|
||||||
BuildRequires: dbus-devel
|
BuildRequires: dbus-devel
|
||||||
BuildRequires: file-devel
|
BuildRequires: file-devel
|
||||||
|
BuildRequires: fontconfig-devel
|
||||||
BuildRequires: freetype-devel
|
BuildRequires: freetype-devel
|
||||||
BuildRequires: fmt-devel
|
BuildRequires: fmt-devel
|
||||||
BuildRequires: gcc-c++
|
BuildRequires: gcc-c++
|
||||||
@@ -34,7 +35,7 @@ BuildRequires: zlib-devel
|
|||||||
BuildRequires: bzip2-devel
|
BuildRequires: bzip2-devel
|
||||||
BuildRequires: xz-devel
|
BuildRequires: xz-devel
|
||||||
%if 0%{?rhel}
|
%if 0%{?rhel}
|
||||||
BuildRequires: gcc-toolset-12
|
BuildRequires: gcc-toolset-14
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
Provides: bundled(gnulib)
|
Provides: bundled(gnulib)
|
||||||
@@ -70,9 +71,9 @@ rm -rf lib/third_party/{fmt,nlohmann_json,yara}
|
|||||||
|
|
||||||
%build
|
%build
|
||||||
%if 0%{?rhel}
|
%if 0%{?rhel}
|
||||||
. /opt/rh/gcc-toolset-12/enable
|
. /opt/rh/gcc-toolset-14/enable
|
||||||
%set_build_flags
|
%set_build_flags
|
||||||
CXXFLAGS+=" -std=gnu++2b"
|
CXXFLAGS+=" -std=gnu++23"
|
||||||
%endif
|
%endif
|
||||||
%cmake \
|
%cmake \
|
||||||
-D CMAKE_BUILD_TYPE=Release \
|
-D CMAKE_BUILD_TYPE=Release \
|
||||||
@@ -93,9 +94,9 @@ CXXFLAGS+=" -std=gnu++2b"
|
|||||||
|
|
||||||
%check
|
%check
|
||||||
%if 0%{?rhel}
|
%if 0%{?rhel}
|
||||||
. /opt/rh/gcc-toolset-12/enable
|
. /opt/rh/gcc-toolset-14/enable
|
||||||
%set_build_flags
|
%set_build_flags
|
||||||
CXXFLAGS+=" -std=gnu++2b"
|
CXXFLAGS+=" -std=gnu++23"
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
|
||||||
@@ -122,8 +123,11 @@ cp -a lib/third_party/xdgpp/LICENSE %{buildroot
|
|||||||
%doc README.md
|
%doc README.md
|
||||||
%{_bindir}/imhex
|
%{_bindir}/imhex
|
||||||
%{_bindir}/imhex-updater
|
%{_bindir}/imhex-updater
|
||||||
%{_datadir}/pixmaps/%{name}.png
|
%{_datadir}/pixmaps/%{name}.svg
|
||||||
%{_datadir}/applications/%{name}.desktop
|
%{_datadir}/applications/%{name}.desktop
|
||||||
|
%{_datadir}/mime/packages/%{name}.xml
|
||||||
%{_libdir}/libimhex.so*
|
%{_libdir}/libimhex.so*
|
||||||
%{_libdir}/%{name}/
|
%{_libdir}/%{name}/
|
||||||
|
%{_libdir}/*.hexpluglib
|
||||||
|
/usr/lib/debug/%{_libdir}/*.debug
|
||||||
%{_metainfodir}/net.werwolv.%{name}.metainfo.xml
|
%{_metainfodir}/net.werwolv.%{name}.metainfo.xml
|
||||||
16
dist/vcpkg.json
vendored
Normal file
16
dist/vcpkg.json
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "vcpkg",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"builtin-baseline": "7e21420f775f72ae938bdeb5e6068f722088f06a",
|
||||||
|
"dependencies": [
|
||||||
|
"libmagic",
|
||||||
|
"freetype",
|
||||||
|
"mbedtls",
|
||||||
|
"zlib",
|
||||||
|
"bzip2",
|
||||||
|
"liblzma",
|
||||||
|
"zstd",
|
||||||
|
"glfw3",
|
||||||
|
"curl"
|
||||||
|
]
|
||||||
|
}
|
||||||
17
dist/web/Dockerfile
vendored
17
dist/web/Dockerfile
vendored
@@ -1,11 +1,11 @@
|
|||||||
FROM emscripten/emsdk:3.1.51 as build
|
FROM emscripten/emsdk:3.1.51 AS build
|
||||||
|
|
||||||
# Used to invalidate layer cache but not mount cache
|
# Used to invalidate layer cache but not mount cache
|
||||||
# See https://github.com/moby/moby/issues/41715#issuecomment-733976493
|
# See https://github.com/moby/moby/issues/41715#issuecomment-733976493
|
||||||
ARG UNIQUEKEY 1
|
ARG UNIQUEKEY 1
|
||||||
|
|
||||||
RUN apt update
|
RUN apt update
|
||||||
RUN apt install -y git ccache autoconf automake libtool cmake pkg-config
|
RUN apt install -y git ccache autoconf automake libtool cmake pkg-config ninja-build
|
||||||
|
|
||||||
RUN <<EOF
|
RUN <<EOF
|
||||||
# Install vcpkg
|
# Install vcpkg
|
||||||
@@ -13,6 +13,7 @@ RUN <<EOF
|
|||||||
set -xe
|
set -xe
|
||||||
|
|
||||||
git clone https://github.com/microsoft/vcpkg /vcpkg
|
git clone https://github.com/microsoft/vcpkg /vcpkg
|
||||||
|
git -C /vcpkg pull
|
||||||
/vcpkg/bootstrap-vcpkg.sh
|
/vcpkg/bootstrap-vcpkg.sh
|
||||||
sed -i 's/vcpkg_install_make(${EXTRA_ARGS})/vcpkg_install_make(${EXTRA_ARGS} SUBPATH src)/g' /vcpkg/ports/libmagic/portfile.cmake
|
sed -i 's/vcpkg_install_make(${EXTRA_ARGS})/vcpkg_install_make(${EXTRA_ARGS} SUBPATH src)/g' /vcpkg/ports/libmagic/portfile.cmake
|
||||||
EOF
|
EOF
|
||||||
@@ -27,7 +28,7 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
|
|||||||
' >> /emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake
|
' >> /emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
ENV VCPKG_DEFAULT_BINARY_CACHE /cache/vcpkg
|
ENV VCPKG_DEFAULT_BINARY_CACHE=/cache/vcpkg
|
||||||
RUN --mount=type=cache,target=/cache <<EOF
|
RUN --mount=type=cache,target=/cache <<EOF
|
||||||
# Install dependencies with vcpkg
|
# Install dependencies with vcpkg
|
||||||
set -xe
|
set -xe
|
||||||
@@ -45,7 +46,7 @@ EOF
|
|||||||
|
|
||||||
# Build ImHex
|
# Build ImHex
|
||||||
ARG JOBS=4
|
ARG JOBS=4
|
||||||
ENV CCACHE_DIR /cache/ccache
|
ENV CCACHE_DIR=/cache/ccache
|
||||||
|
|
||||||
RUN mkdir /build
|
RUN mkdir /build
|
||||||
WORKDIR /build
|
WORKDIR /build
|
||||||
@@ -56,6 +57,7 @@ set -xe
|
|||||||
ccache -zs
|
ccache -zs
|
||||||
|
|
||||||
cmake /imhex \
|
cmake /imhex \
|
||||||
|
-G "Ninja" \
|
||||||
-DIMHEX_OFFLINE_BUILD=ON \
|
-DIMHEX_OFFLINE_BUILD=ON \
|
||||||
-DIMHEX_STATIC_LINK_PLUGINS=ON \
|
-DIMHEX_STATIC_LINK_PLUGINS=ON \
|
||||||
-DIMHEX_EXCLUDE_PLUGINS="script_loader" \
|
-DIMHEX_EXCLUDE_PLUGINS="script_loader" \
|
||||||
@@ -66,9 +68,10 @@ cmake /imhex
|
|||||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||||
-DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake \
|
-DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake \
|
||||||
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake \
|
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake \
|
||||||
|
-DLIBROMFS_COMPRESS_RESOURCES=OFF \
|
||||||
-DCMAKE_BUILD_TYPE=Release
|
-DCMAKE_BUILD_TYPE=Release
|
||||||
|
|
||||||
make -j $JOBS
|
ninja -j $JOBS
|
||||||
|
|
||||||
cp /imhex/dist/web/source/* /build
|
cp /imhex/dist/web/source/* /build
|
||||||
ccache -s
|
ccache -s
|
||||||
@@ -78,7 +81,7 @@ EOF
|
|||||||
# See https://stackoverflow.com/questions/41701849/cannot-modify-accept-encoding-with-fetch https://github.com/AnthumChris/fetch-progress-indicators/issues/13
|
# See https://stackoverflow.com/questions/41701849/cannot-modify-accept-encoding-with-fetch https://github.com/AnthumChris/fetch-progress-indicators/issues/13
|
||||||
RUN du -b /build/imhex.wasm | cut -f1 > imhex.wasm.size
|
RUN du -b /build/imhex.wasm | cut -f1 > imhex.wasm.size
|
||||||
|
|
||||||
FROM scratch as raw
|
FROM scratch AS raw
|
||||||
COPY --from=build [ \
|
COPY --from=build [ \
|
||||||
# ImHex \
|
# ImHex \
|
||||||
"/build/imhex.wasm", \
|
"/build/imhex.wasm", \
|
||||||
@@ -92,7 +95,7 @@ COPY --from=build [ \
|
|||||||
"/build/wasm-config.js", \
|
"/build/wasm-config.js", \
|
||||||
"/build/enable-threads.js", \
|
"/build/enable-threads.js", \
|
||||||
"/build/favicon.ico", \
|
"/build/favicon.ico", \
|
||||||
"/build/icon.png", \
|
"/build/icon.svg", \
|
||||||
"/build/manifest.json", \
|
"/build/manifest.json", \
|
||||||
"/build/robots.txt", \
|
"/build/robots.txt", \
|
||||||
"/build/sitemap.xml", \
|
"/build/sitemap.xml", \
|
||||||
|
|||||||
BIN
dist/web/source/favicon.ico
vendored
BIN
dist/web/source/favicon.ico
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 122 KiB After Width: | Height: | Size: 162 KiB |
BIN
dist/web/source/icon.png
vendored
BIN
dist/web/source/icon.png
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 157 KiB |
11
dist/web/source/icon.svg
vendored
Normal file
11
dist/web/source/icon.svg
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" version="1">
|
||||||
|
<rect style="opacity:0.2" width="55" height="10" x="5" y="-60" rx="1.41" transform="rotate(90)"/>
|
||||||
|
<rect style="fill:#2b50a1" width="55" height="10" x="4" y="-60" rx="1.41" transform="rotate(90)"/>
|
||||||
|
<rect style="fill:#2b50a1" width="55" height="10" x="4" y="-14" rx="1.41" transform="rotate(90)"/>
|
||||||
|
<rect style="fill:#2b50a1" width="55" height="10" x="4" y="-33" rx="1.41" transform="rotate(90)"/>
|
||||||
|
<path style="opacity:0.2" d="M 5.3808594,5 C 4.6158118,5 4,5.6158118 4,6.3808594 V 13.619141 C 4,14.384188 4.6158118,15 5.3808594,15 H 31.619141 C 32.384188,15 33,14.384188 33,13.619141 V 6.3808594 C 33,5.6158118 32.384188,5 31.619141,5 Z M 40.400391,5 C 39.624791,5 39,5.6247906 39,6.4003906 V 13.599609 C 39,14.375209 39.624791,15 40.400391,15 H 58.599609 C 59.375209,15 60,14.375209 60,13.599609 V 6.4003906 C 60,5.6247906 59.375209,5 58.599609,5 Z M 5.3808594,50 C 4.6158118,50 4,50.615812 4,51.380859 v 7.238282 C 4,59.384188 4.6158118,60 5.3808594,60 H 31.619141 C 32.384188,60 33,59.384188 33,58.619141 V 51.380859 C 33,50.615812 32.384188,50 31.619141,50 Z"/>
|
||||||
|
<rect style="fill:#3a6be0" width="29" height="10" x="4" y="4" rx="1.381"/>
|
||||||
|
<rect style="fill:#3a6be0" width="21" height="10" x="39" y="4" rx="1.4"/>
|
||||||
|
<rect style="fill:#3a6be0" width="29" height="10" x="4" y="49" rx="1.381"/>
|
||||||
|
<path style="fill:#ffffff;opacity:0.1" d="M 5.3808594 4 C 4.6158118 4 4 4.6158118 4 5.3808594 L 4 6.3808594 C 4 5.6158118 4.6158118 5 5.3808594 5 L 31.619141 5 C 32.384188 5 33 5.6158118 33 6.3808594 L 33 5.3808594 C 33 4.6158118 32.384188 4 31.619141 4 L 5.3808594 4 z M 40.400391 4 C 39.624791 4 39 4.6247906 39 5.4003906 L 39 6.4003906 C 39 5.6247906 39.624791 5 40.400391 5 L 58.599609 5 C 59.375209 5 60 5.6247906 60 6.4003906 L 60 5.4003906 C 60 4.6247906 59.375209 4 58.599609 4 L 40.400391 4 z M 5.3808594 49 C 4.6158118 49 4 49.615812 4 50.380859 L 4 51.380859 C 4 50.615812 4.6158118 50 5.3808594 50 L 31.619141 50 C 32.384188 50 33 50.615812 33 51.380859 L 33 50.380859 C 33 49.615812 32.384188 49 31.619141 49 L 5.3808594 49 z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.1 KiB |
6
dist/web/source/index.html
vendored
6
dist/web/source/index.html
vendored
@@ -11,7 +11,7 @@
|
|||||||
<meta name="title" content="ImHex">
|
<meta name="title" content="ImHex">
|
||||||
<meta name="description" content="Free and extremely powerful Online Hex Editor for your Web Browser. ImHex is a free and open source Hex Editor for Reverse Engineers and Developers and Data Analysts.">
|
<meta name="description" content="Free and extremely powerful Online Hex Editor for your Web Browser. ImHex is a free and open source Hex Editor for Reverse Engineers and Developers and Data Analysts.">
|
||||||
<link rel="icon" type="image/x-icon" href="favicon.ico">
|
<link rel="icon" type="image/x-icon" href="favicon.ico">
|
||||||
<link rel="apple-touch-icon" href="icon.png">
|
<link rel="apple-touch-icon" href="icon.svg">
|
||||||
|
|
||||||
<!-- Open Graph / Facebook -->
|
<!-- Open Graph / Facebook -->
|
||||||
<meta property="og:type" content="website">
|
<meta property="og:type" content="website">
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
"founder": "WerWolv",
|
"founder": "WerWolv",
|
||||||
"slogan": "A Hex Editor for Reverse Engineers, Programmers and people who value their retinas when working at 3 AM.",
|
"slogan": "A Hex Editor for Reverse Engineers, Programmers and people who value their retinas when working at 3 AM.",
|
||||||
"url": "https://imhex.werwolv.net",
|
"url": "https://imhex.werwolv.net",
|
||||||
"logo": "https://imhex.werwolv.net/assets/logos/logo.png"
|
"logo": "https://imhex.werwolv.net/assets/logos/logo.svg"
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@
|
|||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="loading" class="centered">
|
<div id="loading" class="centered">
|
||||||
<img src="https://raw.githubusercontent.com/WerWolv/ImHex/master/plugins/builtin/romfs/assets/dark/banner.png" id="logo" alt="ImHex Logo">
|
<img src="https://raw.githubusercontent.com/WerWolv/ImHex/master/plugins/builtin/romfs/assets/dark/banner.svg" id="logo" alt="ImHex Logo">
|
||||||
<h1>A Hex Editor for Reverse Engineers, Programmers and people who value their retinas when working at 3 AM.</h1>
|
<h1>A Hex Editor for Reverse Engineers, Programmers and people who value their retinas when working at 3 AM.</h1>
|
||||||
<h2>Available both natively and on the web</h2>
|
<h2>Available both natively and on the web</h2>
|
||||||
<h5>ImHex runs directly in your web browser with the help of Emscripten and WebAssembly.</h5>
|
<h5>ImHex runs directly in your web browser with the help of Emscripten and WebAssembly.</h5>
|
||||||
|
|||||||
4
dist/web/source/manifest.json
vendored
4
dist/web/source/manifest.json
vendored
@@ -10,8 +10,8 @@
|
|||||||
],
|
],
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "icon.png",
|
"src": "icon.svg",
|
||||||
"type": "image/png",
|
"type": "image/svg",
|
||||||
"sizes": "640x640"
|
"sizes": "640x640"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
5
dist/web/source/sitemap.xml
vendored
5
dist/web/source/sitemap.xml
vendored
@@ -57,6 +57,11 @@
|
|||||||
<loc>https://web.imhex.werwolv.net?lang=it-IT</loc>
|
<loc>https://web.imhex.werwolv.net?lang=it-IT</loc>
|
||||||
<lastmod>2024-01-02T11:44:00+00:00</lastmod>
|
<lastmod>2024-01-02T11:44:00+00:00</lastmod>
|
||||||
</url>
|
</url>
|
||||||
|
<url>
|
||||||
|
<title>Русский</title>
|
||||||
|
<loc>https://web.imhex.werwolv.net?lang=ru-RU</loc>
|
||||||
|
<lastmod>2024-01-02T11:44:00+00:00</lastmod>
|
||||||
|
</url>
|
||||||
|
|
||||||
|
|
||||||
</urlset>
|
</urlset>
|
||||||
13
dist/web/source/style.css
vendored
13
dist/web/source/style.css
vendored
@@ -137,7 +137,7 @@ a:hover {
|
|||||||
|
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--progress: 25%;
|
--progress: 0%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.progress-bar-container {
|
.progress-bar-container {
|
||||||
@@ -174,4 +174,15 @@ a:hover {
|
|||||||
.progress-moved .progress-bar {
|
.progress-moved .progress-bar {
|
||||||
width: var(--progress);
|
width: var(--progress);
|
||||||
background-color: #3864cb;
|
background-color: #3864cb;
|
||||||
|
}
|
||||||
|
|
||||||
|
#logo {
|
||||||
|
height: 25%;
|
||||||
|
margin-top: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.canvas-fixed {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
}
|
}
|
||||||
142
dist/web/source/wasm-config.js
vendored
142
dist/web/source/wasm-config.js
vendored
@@ -100,7 +100,77 @@ var notWorkingTimer = setTimeout(() => {
|
|||||||
|
|
||||||
var Module = {
|
var Module = {
|
||||||
preRun: [],
|
preRun: [],
|
||||||
postRun: [],
|
postRun: function() {
|
||||||
|
// Patch the emscripten GLFW module to send mouse and touch events in the right order
|
||||||
|
// For ImGui interactions to correctly work with touch input, MousePos events need
|
||||||
|
// to be processed first and then MouseButton events in the next frame. By default,
|
||||||
|
// GLFW does the exact opposite, which causes buttons to require two taps to register
|
||||||
|
// and windows get "stuck" to the cursor when dragged or resized
|
||||||
|
GLFW.onMousemove = event => {
|
||||||
|
if (event.type === "touchmove") {
|
||||||
|
event.preventDefault();
|
||||||
|
let primaryChanged = false;
|
||||||
|
for (let i of event.changedTouches) {
|
||||||
|
if (GLFW.primaryTouchId === i.identifier) {
|
||||||
|
Browser.setMouseCoords(i.pageX, i.pageY);
|
||||||
|
primaryChanged = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!primaryChanged) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Browser.calculateMouseEvent(event);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
GLFW.onMouseButtonChanged = (event, status) => {
|
||||||
|
if (!GLFW.active) return;
|
||||||
|
if (event.target != Module["canvas"]) return;
|
||||||
|
const isTouchType = event.type === "touchstart" || event.type === "touchend" || event.type === "touchcancel";
|
||||||
|
let eventButton = 0;
|
||||||
|
if (isTouchType) {
|
||||||
|
event.preventDefault();
|
||||||
|
let primaryChanged = false;
|
||||||
|
if (GLFW.primaryTouchId === null && event.type === "touchstart" && event.targetTouches.length > 0) {
|
||||||
|
const chosenTouch = event.targetTouches[0];
|
||||||
|
GLFW.primaryTouchId = chosenTouch.identifier;
|
||||||
|
Browser.setMouseCoords(chosenTouch.pageX, chosenTouch.pageY);
|
||||||
|
primaryChanged = true;
|
||||||
|
} else if (event.type === "touchend" || event.type === "touchcancel") {
|
||||||
|
for (let i of event.changedTouches) {
|
||||||
|
if (GLFW.primaryTouchId === i.identifier) {
|
||||||
|
GLFW.primaryTouchId = null;
|
||||||
|
primaryChanged = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!primaryChanged) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Browser.calculateMouseEvent(event);
|
||||||
|
eventButton = GLFW.DOMToGLFWMouseButton(event);
|
||||||
|
}
|
||||||
|
if (status == 1) {
|
||||||
|
GLFW.active.buttons |= (1 << eventButton);
|
||||||
|
try {
|
||||||
|
event.target.setCapture();
|
||||||
|
} catch (e) {}
|
||||||
|
} else {
|
||||||
|
GLFW.active.buttons &= ~(1 << eventButton);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GLFW.active.cursorPosFunc) {
|
||||||
|
getWasmTableEntry(GLFW.active.cursorPosFunc)(GLFW.active.id, Browser.mouseX, Browser.mouseY);
|
||||||
|
}
|
||||||
|
if (GLFW.active.mouseButtonFunc) {
|
||||||
|
getWasmTableEntry(GLFW.active.mouseButtonFunc)(GLFW.active.id, eventButton, status, GLFW.getModBits(GLFW.active));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
},
|
||||||
onRuntimeInitialized: function() {
|
onRuntimeInitialized: function() {
|
||||||
// Triggered when the wasm module is loaded and ready to use.
|
// Triggered when the wasm module is loaded and ready to use.
|
||||||
document.getElementById("loading").style.display = "none"
|
document.getElementById("loading").style.display = "none"
|
||||||
@@ -111,13 +181,55 @@ var Module = {
|
|||||||
print: (function() { })(),
|
print: (function() { })(),
|
||||||
printErr: function(text) { },
|
printErr: function(text) { },
|
||||||
canvas: (function() {
|
canvas: (function() {
|
||||||
let canvas = document.getElementById('canvas');
|
const canvas = document.getElementById('canvas');
|
||||||
// As a default initial behavior, pop up an alert when webgl context is lost. To make your
|
canvas.addEventListener("webglcontextlost", function(e) {
|
||||||
// application robust, you may want to override this behavior before shipping!
|
alert('WebGL context lost, please reload the page');
|
||||||
// See http://www.khronos.org/registry/webgl/specs/latest/1.0/#5.15.2
|
e.preventDefault();
|
||||||
canvas.addEventListener("webglcontextlost", function(e) { alert('WebGL context lost. You will need to reload the page.'); e.preventDefault(); }, false);
|
}, false);
|
||||||
|
|
||||||
return canvas;
|
// Turn long touches into right-clicks
|
||||||
|
let timer = null;
|
||||||
|
canvas.addEventListener('touchstart', event => {
|
||||||
|
timer = setTimeout(() => {
|
||||||
|
let eventArgs = {
|
||||||
|
bubbles: true,
|
||||||
|
cancelable: true,
|
||||||
|
view: window,
|
||||||
|
screenX: event.touches[0].screenX,
|
||||||
|
screenY: event.touches[0].screenY,
|
||||||
|
clientX: event.touches[0].clientX,
|
||||||
|
clientY: event.touches[0].clientY,
|
||||||
|
button: 2,
|
||||||
|
buttons: 2,
|
||||||
|
relatedTarget: event.target,
|
||||||
|
region: event.region
|
||||||
|
}
|
||||||
|
|
||||||
|
canvas.dispatchEvent(new MouseEvent('mousedown', eventArgs));
|
||||||
|
canvas.dispatchEvent(new MouseEvent('mouseup', eventArgs));
|
||||||
|
}, 400);
|
||||||
|
});
|
||||||
|
|
||||||
|
canvas.addEventListener('touchend', event => {
|
||||||
|
if (timer) {
|
||||||
|
clearTimeout(timer);
|
||||||
|
timer = null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (typeof WebGL2RenderingContext !== 'undefined') {
|
||||||
|
let gl = canvas.getContext('webgl2', { stencil: true });
|
||||||
|
if (!gl) {
|
||||||
|
console.error('WebGL 2 not available, falling back to WebGL');
|
||||||
|
gl = canvas.getContext('webgl', { stencil: true });
|
||||||
|
}
|
||||||
|
if (!gl) {
|
||||||
|
alert('WebGL not available with stencil buffer');
|
||||||
|
}
|
||||||
|
return canvas;
|
||||||
|
} else {
|
||||||
|
alert('WebGL 2 not supported by this browser');
|
||||||
|
}
|
||||||
})(),
|
})(),
|
||||||
setStatus: function(text) { },
|
setStatus: function(text) { },
|
||||||
totalDependencies: 0,
|
totalDependencies: 0,
|
||||||
@@ -144,14 +256,16 @@ if (urlParams.has("lang")) {
|
|||||||
window.addEventListener('resize', js_resizeCanvas, false);
|
window.addEventListener('resize', js_resizeCanvas, false);
|
||||||
function js_resizeCanvas() {
|
function js_resizeCanvas() {
|
||||||
let canvas = document.getElementById('canvas');
|
let canvas = document.getElementById('canvas');
|
||||||
|
|
||||||
|
canvas.top = document.documentElement.clientTop;
|
||||||
|
canvas.left = document.documentElement.clientLeft;
|
||||||
canvas.width = Math.min(document.documentElement.clientWidth, window.innerWidth || 0);
|
canvas.width = Math.min(document.documentElement.clientWidth, window.innerWidth || 0);
|
||||||
canvas.height = Math.min(document.documentElement.clientHeight, window.innerHeight || 0);
|
canvas.height = Math.min(document.documentElement.clientHeight, window.innerHeight || 0);
|
||||||
|
}
|
||||||
|
|
||||||
canvas.classList.add("canvas_full_screen")
|
// Prevent some default browser shortcuts from preventing ImHex ones to work
|
||||||
|
document.addEventListener('keydown', e => {
|
||||||
if (GLFW.active && GLFW.active.windowPosFunc) {
|
if (e.ctrlKey) {
|
||||||
getWasmTableEntry(GLFW.active.windowPosFunc)(GLFW.active.id, GLFW.active.x, GLFW.active.y);
|
if (e.which == 83) e.preventDefault();
|
||||||
}
|
}
|
||||||
|
})
|
||||||
GLFW.onWindowSizeChanged();
|
|
||||||
}
|
|
||||||
1
lib/external/disassembler
vendored
Submodule
1
lib/external/disassembler
vendored
Submodule
Submodule lib/external/disassembler added at bc4a5d9975
2
lib/external/libromfs
vendored
2
lib/external/libromfs
vendored
Submodule lib/external/libromfs updated: 03adcfdde0...4f42f099b2
2
lib/external/libwolv
vendored
2
lib/external/libwolv
vendored
Submodule lib/external/libwolv updated: 0e3ba3aa6f...75c6693441
2
lib/external/pattern_language
vendored
2
lib/external/pattern_language
vendored
Submodule lib/external/pattern_language updated: c09d987099...bc002793b0
@@ -22,6 +22,9 @@ set(LIBIMHEX_SOURCES
|
|||||||
source/data_processor/link.cpp
|
source/data_processor/link.cpp
|
||||||
source/data_processor/node.cpp
|
source/data_processor/node.cpp
|
||||||
|
|
||||||
|
source/project/project.cpp
|
||||||
|
source/project/project_manager.cpp
|
||||||
|
|
||||||
source/helpers/utils.cpp
|
source/helpers/utils.cpp
|
||||||
source/helpers/utils_linux.cpp
|
source/helpers/utils_linux.cpp
|
||||||
source/helpers/fs.cpp
|
source/helpers/fs.cpp
|
||||||
@@ -38,6 +41,8 @@ set(LIBIMHEX_SOURCES
|
|||||||
source/helpers/debugging.cpp
|
source/helpers/debugging.cpp
|
||||||
source/helpers/default_paths.cpp
|
source/helpers/default_paths.cpp
|
||||||
source/helpers/imgui_hooks.cpp
|
source/helpers/imgui_hooks.cpp
|
||||||
|
source/helpers/semantic_version.cpp
|
||||||
|
source/helpers/keys.cpp
|
||||||
|
|
||||||
source/test/tests.cpp
|
source/test/tests.cpp
|
||||||
|
|
||||||
@@ -49,6 +54,7 @@ set(LIBIMHEX_SOURCES
|
|||||||
source/ui/view.cpp
|
source/ui/view.cpp
|
||||||
source/ui/popup.cpp
|
source/ui/popup.cpp
|
||||||
source/ui/toast.cpp
|
source/ui/toast.cpp
|
||||||
|
source/ui/banner.cpp
|
||||||
|
|
||||||
source/subcommands/subcommands.cpp
|
source/subcommands/subcommands.cpp
|
||||||
)
|
)
|
||||||
@@ -120,31 +126,41 @@ setupCompilerFlags(libimhex)
|
|||||||
include(GenerateExportHeader)
|
include(GenerateExportHeader)
|
||||||
generate_export_header(libimhex)
|
generate_export_header(libimhex)
|
||||||
|
|
||||||
target_include_directories(libimhex ${LIBIMHEX_LIBRARY_TYPE} include ${XDGPP_INCLUDE_DIRS} ${MBEDTLS_INCLUDE_DIR} ${MAGIC_INCLUDE_DIRS} ${LLVM_INCLUDE_DIRS} ${FMT_INCLUDE_DIRS} ${LIBBACKTRACE_INCLUDE_DIRS})
|
target_include_directories(libimhex ${LIBIMHEX_LIBRARY_TYPE} include ${XDGPP_INCLUDE_DIRS} ${LLVM_INCLUDE_DIRS} ${FMT_INCLUDE_DIRS})
|
||||||
target_link_directories(libimhex ${LIBIMHEX_LIBRARY_TYPE} ${MBEDTLS_LIBRARY_DIR} ${MAGIC_LIBRARY_DIRS})
|
|
||||||
|
|
||||||
if (NOT EMSCRIPTEN)
|
|
||||||
# curl is only used in non-emscripten builds
|
|
||||||
target_link_libraries(libimhex ${LIBIMHEX_LIBRARY_TYPE} CURL::libcurl)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
if (NOT IMHEX_EXTERNAL_PLUGIN_BUILD)
|
if (NOT IMHEX_EXTERNAL_PLUGIN_BUILD)
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
set_target_properties(libimhex PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
|
set_target_properties(libimhex PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
|
||||||
target_link_options(libimhex PRIVATE -Wl,--export-all-symbols)
|
if (NOT MSVC)
|
||||||
|
target_link_options(libimhex PRIVATE -Wl,--export-all-symbols)
|
||||||
|
endif()
|
||||||
|
target_link_libraries(libimhex PRIVATE Netapi32.lib)
|
||||||
|
target_compile_definitions(libimhex PRIVATE EXPORT_SYMBOLS=1)
|
||||||
elseif (APPLE)
|
elseif (APPLE)
|
||||||
find_library(FOUNDATION NAMES Foundation)
|
find_library(FOUNDATION NAMES Foundation)
|
||||||
target_link_libraries(libimhex PUBLIC ${FOUNDATION})
|
target_link_libraries(libimhex PUBLIC ${FOUNDATION})
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
target_link_libraries(libimhex PRIVATE microtar libwolv ${NFD_LIBRARIES} magic dl ${JTHREAD_LIBRARIES})
|
target_link_libraries(libimhex PRIVATE libpl microtar ${NFD_LIBRARIES} magic)
|
||||||
target_link_libraries(libimhex PUBLIC libpl ${IMGUI_LIBRARIES})
|
target_link_libraries(libimhex PUBLIC libwolv libpl_includes libpl-gen ${IMGUI_LIBRARIES} ${JTHREAD_LIBRARIES})
|
||||||
|
|
||||||
|
if (NOT WIN32)
|
||||||
|
target_link_libraries(libimhex PRIVATE dl)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT EMSCRIPTEN)
|
||||||
|
# curl is only used in non-emscripten builds
|
||||||
|
target_link_libraries(libimhex ${LIBIMHEX_LIBRARY_TYPE} CURL::libcurl)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
target_include_directories(libimhex ${LIBIMHEX_LIBRARY_TYPE} ${MBEDTLS_INCLUDE_DIR} ${LIBBACKTRACE_INCLUDE_DIRS} ${MAGIC_INCLUDE_DIRS})
|
||||||
|
target_link_libraries(libimhex ${LIBIMHEX_LIBRARY_TYPE} ${MBEDTLS_LIBRARIES})
|
||||||
|
target_link_directories(libimhex ${LIBIMHEX_LIBRARY_TYPE} ${MBEDTLS_LIBRARY_DIR} ${MAGIC_LIBRARY_DIRS})
|
||||||
|
|
||||||
precompileHeaders(libimhex "${CMAKE_CURRENT_SOURCE_DIR}/include")
|
precompileHeaders(libimhex "${CMAKE_CURRENT_SOURCE_DIR}/include")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_link_libraries(libimhex ${LIBIMHEX_LIBRARY_TYPE} ${NLOHMANN_JSON_LIBRARIES} imgui_all_includes ${MBEDTLS_LIBRARIES} ${FMT_LIBRARIES} ${LUNASVG_LIBRARIES} boost::regex)
|
target_link_libraries(libimhex ${LIBIMHEX_LIBRARY_TYPE} ${NLOHMANN_JSON_LIBRARIES} imgui_all_includes ${FMT_LIBRARIES} ${LUNASVG_LIBRARIES} ${BOOST_LIBRARIES})
|
||||||
|
|
||||||
set_property(TARGET libimhex PROPERTY INTERPROCEDURAL_OPTIMIZATION FALSE)
|
set_property(TARGET libimhex PROPERTY INTERPROCEDURAL_OPTIMIZATION FALSE)
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <hex/helpers/types.hpp>
|
#include <hex/helpers/types.hpp>
|
||||||
#include <hex/helpers/intrinsics.hpp>
|
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
#include <imgui.h>
|
#include <imgui.h>
|
||||||
#include <hex/ui/imgui_imhex_extensions.h>
|
#include <hex/ui/imgui_imhex_extensions.h>
|
||||||
#include <hex/api/localization_manager.hpp>
|
#include <hex/api/localization_manager.hpp>
|
||||||
|
#include <hex/helpers/auto_reset.hpp>
|
||||||
|
|
||||||
namespace hex {
|
namespace hex {
|
||||||
|
|
||||||
@@ -295,6 +296,7 @@ namespace hex {
|
|||||||
};
|
};
|
||||||
|
|
||||||
class AchievementManager {
|
class AchievementManager {
|
||||||
|
static bool s_initialized;
|
||||||
public:
|
public:
|
||||||
AchievementManager() = delete;
|
AchievementManager() = delete;
|
||||||
|
|
||||||
@@ -360,7 +362,7 @@ namespace hex {
|
|||||||
* @brief Returns all registered achievements
|
* @brief Returns all registered achievements
|
||||||
* @return All achievements
|
* @return All achievements
|
||||||
*/
|
*/
|
||||||
static const std::unordered_map<std::string, std::unordered_map<std::string, std::unique_ptr<Achievement>>>& getAchievements();
|
static const std::unordered_map<UnlocalizedString, std::unordered_map<UnlocalizedString, std::unique_ptr<Achievement>>>& getAchievements();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Returns all achievement start nodes
|
* @brief Returns all achievement start nodes
|
||||||
@@ -368,14 +370,14 @@ namespace hex {
|
|||||||
* @param rebuild Whether to rebuild the list of start nodes
|
* @param rebuild Whether to rebuild the list of start nodes
|
||||||
* @return All achievement start nodes
|
* @return All achievement start nodes
|
||||||
*/
|
*/
|
||||||
static const std::unordered_map<std::string, std::vector<AchievementNode*>>& getAchievementStartNodes(bool rebuild = true);
|
static const std::unordered_map<UnlocalizedString, std::vector<AchievementNode*>>& getAchievementStartNodes(bool rebuild = true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Returns all achievement nodes
|
* @brief Returns all achievement nodes
|
||||||
* @param rebuild Whether to rebuild the list of nodes
|
* @param rebuild Whether to rebuild the list of nodes
|
||||||
* @return All achievement nodes
|
* @return All achievement nodes
|
||||||
*/
|
*/
|
||||||
static const std::unordered_map<std::string, std::list<AchievementNode>>& getAchievementNodes(bool rebuild = true);
|
static const std::unordered_map<UnlocalizedString, std::list<AchievementNode>>& getAchievementNodes(bool rebuild = true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Loads the progress of all achievements from the achievements save file
|
* @brief Loads the progress of all achievements from the achievements save file
|
||||||
@@ -404,4 +406,4 @@ namespace hex {
|
|||||||
static Achievement& addAchievementImpl(std::unique_ptr<Achievement> &&newAchievement);
|
static Achievement& addAchievementImpl(std::unique_ptr<Achievement> &&newAchievement);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,10 +2,10 @@
|
|||||||
|
|
||||||
#include <hex.hpp>
|
#include <hex.hpp>
|
||||||
#include <hex/api/localization_manager.hpp>
|
#include <hex/api/localization_manager.hpp>
|
||||||
|
#include <hex/api/shortcut_manager.hpp>
|
||||||
#include <hex/helpers/concepts.hpp>
|
#include <hex/helpers/concepts.hpp>
|
||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <map>
|
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <span>
|
#include <span>
|
||||||
#include <string>
|
#include <string>
|
||||||
@@ -20,11 +20,11 @@ using ImGuiDataType = int;
|
|||||||
using ImGuiInputTextFlags = int;
|
using ImGuiInputTextFlags = int;
|
||||||
struct ImColor;
|
struct ImColor;
|
||||||
enum ImGuiCustomCol : int;
|
enum ImGuiCustomCol : int;
|
||||||
|
typedef int ImGuiColorEditFlags;
|
||||||
|
|
||||||
namespace hex {
|
namespace hex {
|
||||||
|
|
||||||
class View;
|
class View;
|
||||||
class Shortcut;
|
|
||||||
class Task;
|
class Task;
|
||||||
|
|
||||||
namespace dp {
|
namespace dp {
|
||||||
@@ -44,7 +44,6 @@ namespace hex {
|
|||||||
plugins when needed.
|
plugins when needed.
|
||||||
*/
|
*/
|
||||||
namespace ContentRegistry {
|
namespace ContentRegistry {
|
||||||
|
|
||||||
/* Settings Registry. Allows adding of new entries into the ImHex preferences window. */
|
/* Settings Registry. Allows adding of new entries into the ImHex preferences window. */
|
||||||
namespace Settings {
|
namespace Settings {
|
||||||
|
|
||||||
@@ -178,7 +177,7 @@ namespace hex {
|
|||||||
|
|
||||||
class SliderDataSize : public Widget {
|
class SliderDataSize : public Widget {
|
||||||
public:
|
public:
|
||||||
SliderDataSize(u64 defaultValue, u64 min, u64 max) : m_value(defaultValue), m_min(min), m_max(max) { }
|
SliderDataSize(u64 defaultValue, u64 min, u64 max, u64 stepSize) : m_value(defaultValue), m_min(min), m_max(max), m_stepSize(stepSize) { }
|
||||||
bool draw(const std::string &name) override;
|
bool draw(const std::string &name) override;
|
||||||
|
|
||||||
void load(const nlohmann::json &data) override;
|
void load(const nlohmann::json &data) override;
|
||||||
@@ -189,11 +188,12 @@ namespace hex {
|
|||||||
protected:
|
protected:
|
||||||
u64 m_value;
|
u64 m_value;
|
||||||
u64 m_min, m_max;
|
u64 m_min, m_max;
|
||||||
|
u64 m_stepSize;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ColorPicker : public Widget {
|
class ColorPicker : public Widget {
|
||||||
public:
|
public:
|
||||||
explicit ColorPicker(ImColor defaultColor);
|
explicit ColorPicker(ImColor defaultColor, ImGuiColorEditFlags flags = 0);
|
||||||
|
|
||||||
bool draw(const std::string &name) override;
|
bool draw(const std::string &name) override;
|
||||||
|
|
||||||
@@ -203,12 +203,14 @@ namespace hex {
|
|||||||
[[nodiscard]] ImColor getColor() const;
|
[[nodiscard]] ImColor getColor() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::array<float, 4> m_value{};
|
std::array<float, 4> m_value = {}, m_defaultValue = {};
|
||||||
|
ImGuiColorEditFlags m_flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
class DropDown : public Widget {
|
class DropDown : public Widget {
|
||||||
public:
|
public:
|
||||||
explicit DropDown(const std::vector<std::string> &items, const std::vector<nlohmann::json> &settingsValues, const nlohmann::json &defaultItem) : m_items(items), m_settingsValues(settingsValues), m_defaultItem(defaultItem) { }
|
explicit DropDown(const std::vector<std::string> &items, const std::vector<nlohmann::json> &settingsValues, const nlohmann::json &defaultItem) : m_items(items.begin(), items.end()), m_settingsValues(settingsValues), m_defaultItem(defaultItem) { }
|
||||||
|
explicit DropDown(const std::vector<UnlocalizedString> &items, const std::vector<nlohmann::json> &settingsValues, const nlohmann::json &defaultItem) : m_items(items), m_settingsValues(settingsValues), m_defaultItem(defaultItem) { }
|
||||||
|
|
||||||
bool draw(const std::string &name) override;
|
bool draw(const std::string &name) override;
|
||||||
|
|
||||||
@@ -219,7 +221,7 @@ namespace hex {
|
|||||||
const nlohmann::json& getValue() const;
|
const nlohmann::json& getValue() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::vector<std::string> m_items;
|
std::vector<UnlocalizedString> m_items;
|
||||||
std::vector<nlohmann::json> m_settingsValues;
|
std::vector<nlohmann::json> m_settingsValues;
|
||||||
nlohmann::json m_defaultItem;
|
nlohmann::json m_defaultItem;
|
||||||
|
|
||||||
@@ -326,7 +328,7 @@ namespace hex {
|
|||||||
result = defaultValue;
|
result = defaultValue;
|
||||||
|
|
||||||
return result.get<T>();
|
return result.get<T>();
|
||||||
} catch (const nlohmann::json::exception &e) {
|
} catch (const nlohmann::json::exception &) {
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -381,7 +383,7 @@ namespace hex {
|
|||||||
};
|
};
|
||||||
|
|
||||||
using DisplayCallback = std::function<std::string(std::string)>;
|
using DisplayCallback = std::function<std::string(std::string)>;
|
||||||
using ExecuteCallback = std::function<void(std::string)>;
|
using ExecuteCallback = std::function<std::optional<std::string>(std::string)>;
|
||||||
using QueryCallback = std::function<std::vector<QueryResult>(std::string)>;
|
using QueryCallback = std::function<std::vector<QueryResult>(std::string)>;
|
||||||
|
|
||||||
struct Entry {
|
struct Entry {
|
||||||
@@ -417,7 +419,7 @@ namespace hex {
|
|||||||
const std::string &command,
|
const std::string &command,
|
||||||
const UnlocalizedString &unlocalizedDescription,
|
const UnlocalizedString &unlocalizedDescription,
|
||||||
const impl::DisplayCallback &displayCallback,
|
const impl::DisplayCallback &displayCallback,
|
||||||
const impl::ExecuteCallback &executeCallback = [](auto) {});
|
const impl::ExecuteCallback &executeCallback = [](auto) { return std::nullopt; });
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Adds a new command handler to the command palette
|
* @brief Adds a new command handler to the command palette
|
||||||
@@ -438,7 +440,7 @@ namespace hex {
|
|||||||
|
|
||||||
namespace impl {
|
namespace impl {
|
||||||
|
|
||||||
using VisualizerFunctionCallback = std::function<void(pl::ptrn::Pattern&, pl::ptrn::IIterable&, bool, std::span<const pl::core::Token::Literal>)>;
|
using VisualizerFunctionCallback = std::function<void(pl::ptrn::Pattern&, bool, std::span<const pl::core::Token::Literal>)>;
|
||||||
|
|
||||||
struct FunctionDefinition {
|
struct FunctionDefinition {
|
||||||
pl::api::Namespace ns;
|
pl::api::Namespace ns;
|
||||||
@@ -450,6 +452,14 @@ namespace hex {
|
|||||||
bool dangerous;
|
bool dangerous;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct TypeDefinition {
|
||||||
|
pl::api::Namespace ns;
|
||||||
|
std::string name;
|
||||||
|
|
||||||
|
pl::api::FunctionParameterCount parameterCount;
|
||||||
|
pl::api::TypeCallback callback;
|
||||||
|
};
|
||||||
|
|
||||||
struct Visualizer {
|
struct Visualizer {
|
||||||
pl::api::FunctionParameterCount parameterCount;
|
pl::api::FunctionParameterCount parameterCount;
|
||||||
VisualizerFunctionCallback callback;
|
VisualizerFunctionCallback callback;
|
||||||
@@ -459,6 +469,7 @@ namespace hex {
|
|||||||
const std::map<std::string, Visualizer>& getInlineVisualizers();
|
const std::map<std::string, Visualizer>& getInlineVisualizers();
|
||||||
const std::map<std::string, pl::api::PragmaHandler>& getPragmas();
|
const std::map<std::string, pl::api::PragmaHandler>& getPragmas();
|
||||||
const std::vector<FunctionDefinition>& getFunctions();
|
const std::vector<FunctionDefinition>& getFunctions();
|
||||||
|
const std::vector<TypeDefinition>& getTypes();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -517,6 +528,20 @@ namespace hex {
|
|||||||
const pl::api::FunctionCallback &func
|
const pl::api::FunctionCallback &func
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Adds a new type to the pattern language
|
||||||
|
* @param ns The namespace of the type
|
||||||
|
* @param name The name of the type
|
||||||
|
* @param parameterCount The amount of non-type template parameters the type takes
|
||||||
|
* @param func The type callback
|
||||||
|
*/
|
||||||
|
void addType(
|
||||||
|
const pl::api::Namespace &ns,
|
||||||
|
const std::string &name,
|
||||||
|
pl::api::FunctionParameterCount parameterCount,
|
||||||
|
const pl::api::TypeCallback &func
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Adds a new visualizer to the pattern language
|
* @brief Adds a new visualizer to the pattern language
|
||||||
* @note Visualizers are extensions to the [[hex::visualize]] attribute, used to visualize data
|
* @note Visualizers are extensions to the [[hex::visualize]] attribute, used to visualize data
|
||||||
@@ -551,7 +576,7 @@ namespace hex {
|
|||||||
namespace impl {
|
namespace impl {
|
||||||
|
|
||||||
void add(std::unique_ptr<View> &&view);
|
void add(std::unique_ptr<View> &&view);
|
||||||
const std::map<std::string, std::unique_ptr<View>>& getEntries();
|
const std::map<UnlocalizedString, std::unique_ptr<View>>& getEntries();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -572,6 +597,12 @@ namespace hex {
|
|||||||
* @return The view if it exists, nullptr otherwise
|
* @return The view if it exists, nullptr otherwise
|
||||||
*/
|
*/
|
||||||
View* getViewByName(const UnlocalizedString &unlocalizedName);
|
View* getViewByName(const UnlocalizedString &unlocalizedName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets the currently focused view
|
||||||
|
* @return The view that is focused right now. nullptr if none is focused
|
||||||
|
*/
|
||||||
|
View* getFocusedView();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Tools Registry. Allows adding new entries to the tools window */
|
/* Tools Registry. Allows adding new entries to the tools window */
|
||||||
@@ -601,8 +632,7 @@ namespace hex {
|
|||||||
/* Data Inspector Registry. Allows adding of new types to the data inspector */
|
/* Data Inspector Registry. Allows adding of new types to the data inspector */
|
||||||
namespace DataInspector {
|
namespace DataInspector {
|
||||||
|
|
||||||
enum class NumberDisplayStyle
|
enum class NumberDisplayStyle : u8 {
|
||||||
{
|
|
||||||
Decimal,
|
Decimal,
|
||||||
Hexadecimal,
|
Hexadecimal,
|
||||||
Octal
|
Octal
|
||||||
@@ -656,6 +686,13 @@ namespace hex {
|
|||||||
std::optional<impl::EditingFunction> editingFunction = std::nullopt
|
std::optional<impl::EditingFunction> editingFunction = std::nullopt
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Allows adding new menu items to data inspector row context menus. Call this function inside the
|
||||||
|
* draw function of the data inspector row definition.
|
||||||
|
* @param function Callback that will draw menu items
|
||||||
|
*/
|
||||||
|
void drawMenuItems(const std::function<void()> &function);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Data Processor Node Registry. Allows adding new processor nodes to be used in the data processor */
|
/* Data Processor Node Registry. Allows adding new processor nodes to be used in the data processor */
|
||||||
@@ -690,7 +727,7 @@ namespace hex {
|
|||||||
add(impl::Entry {
|
add(impl::Entry {
|
||||||
unlocalizedCategory,
|
unlocalizedCategory,
|
||||||
unlocalizedName,
|
unlocalizedName,
|
||||||
[=, ...args = std::forward<Args>(args)] mutable {
|
[=, ...args = std::forward<Args>(args)]() mutable {
|
||||||
auto node = std::make_unique<T>(std::forward<Args>(args)...);
|
auto node = std::make_unique<T>(std::forward<Args>(args)...);
|
||||||
node->setUnlocalizedName(unlocalizedName);
|
node->setUnlocalizedName(unlocalizedName);
|
||||||
return node;
|
return node;
|
||||||
@@ -748,7 +785,7 @@ namespace hex {
|
|||||||
struct MenuItem {
|
struct MenuItem {
|
||||||
std::vector<UnlocalizedString> unlocalizedNames;
|
std::vector<UnlocalizedString> unlocalizedNames;
|
||||||
Icon icon;
|
Icon icon;
|
||||||
std::unique_ptr<Shortcut> shortcut;
|
Shortcut shortcut;
|
||||||
View *view;
|
View *view;
|
||||||
MenuCallback callback;
|
MenuCallback callback;
|
||||||
EnabledCallback enabledCallback;
|
EnabledCallback enabledCallback;
|
||||||
@@ -971,7 +1008,7 @@ namespace hex {
|
|||||||
void add(bool addToList = true) {
|
void add(bool addToList = true) {
|
||||||
auto typeName = T().getTypeName();
|
auto typeName = T().getTypeName();
|
||||||
|
|
||||||
impl::add(typeName, [] -> std::unique_ptr<prv::Provider> {
|
impl::add(typeName, []() -> std::unique_ptr<prv::Provider> {
|
||||||
return std::make_unique<T>();
|
return std::make_unique<T>();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -986,7 +1023,7 @@ namespace hex {
|
|||||||
|
|
||||||
namespace impl {
|
namespace impl {
|
||||||
|
|
||||||
using Callback = std::function<std::string(prv::Provider *provider, u64 address, size_t size)>;
|
using Callback = std::function<std::string(prv::Provider *provider, u64 address, size_t size, bool preview)>;
|
||||||
struct ExportMenuEntry {
|
struct ExportMenuEntry {
|
||||||
UnlocalizedString unlocalizedName;
|
UnlocalizedString unlocalizedName;
|
||||||
Callback callback;
|
Callback callback;
|
||||||
@@ -994,7 +1031,7 @@ namespace hex {
|
|||||||
|
|
||||||
struct FindOccurrence {
|
struct FindOccurrence {
|
||||||
Region region;
|
Region region;
|
||||||
enum class DecodeType { ASCII, Binary, UTF16, Unsigned, Signed, Float, Double } decodeType;
|
enum class DecodeType { ASCII, UTF8, Binary, UTF16, Unsigned, Signed, Float, Double } decodeType;
|
||||||
std::endian endian = std::endian::native;
|
std::endian endian = std::endian::native;
|
||||||
bool selected;
|
bool selected;
|
||||||
};
|
};
|
||||||
@@ -1079,9 +1116,9 @@ namespace hex {
|
|||||||
|
|
||||||
[[nodiscard]] const UnlocalizedString& getUnlocalizedName() const { return m_unlocalizedName; }
|
[[nodiscard]] const UnlocalizedString& getUnlocalizedName() const { return m_unlocalizedName; }
|
||||||
|
|
||||||
protected:
|
[[nodiscard]] static int DefaultTextInputFlags();
|
||||||
const static int TextInputFlags;
|
|
||||||
|
|
||||||
|
protected:
|
||||||
bool drawDefaultScalarEditingTextBox(u64 address, const char *format, ImGuiDataType dataType, u8 *data, ImGuiInputTextFlags flags) const;
|
bool drawDefaultScalarEditingTextBox(u64 address, const char *format, ImGuiDataType dataType, u8 *data, ImGuiInputTextFlags flags) const;
|
||||||
bool drawDefaultTextEditingTextBox(u64 address, std::string &data, ImGuiInputTextFlags flags) const;
|
bool drawDefaultTextEditingTextBox(u64 address, std::string &data, ImGuiInputTextFlags flags) const;
|
||||||
|
|
||||||
@@ -1273,7 +1310,7 @@ namespace hex {
|
|||||||
void stopServices();
|
void stopServices();
|
||||||
}
|
}
|
||||||
|
|
||||||
void registerService(const UnlocalizedString &unlocalizedName, const impl::Callback &callback);
|
void registerService(const UnlocalizedString &unlocalizedString, const impl::Callback &callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Network Communication Interface Registry. Allows adding new communication interface endpoints */
|
/* Network Communication Interface Registry. Allows adding new communication interface endpoints */
|
||||||
@@ -1332,6 +1369,7 @@ namespace hex {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Data Information Registry. Allows adding new analyzers to the data information view */
|
||||||
namespace DataInformation {
|
namespace DataInformation {
|
||||||
|
|
||||||
class InformationSection {
|
class InformationSection {
|
||||||
@@ -1398,6 +1436,54 @@ namespace hex {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Disassembler Registry. Allows adding new disassembler architectures */
|
||||||
|
namespace Disassembler {
|
||||||
|
|
||||||
|
struct Instruction {
|
||||||
|
u64 address;
|
||||||
|
u64 offset;
|
||||||
|
size_t size;
|
||||||
|
std::string bytes;
|
||||||
|
std::string mnemonic;
|
||||||
|
std::string operators;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Architecture {
|
||||||
|
public:
|
||||||
|
explicit Architecture(std::string name) : m_name(std::move(name)) {}
|
||||||
|
virtual ~Architecture() = default;
|
||||||
|
|
||||||
|
virtual bool start() = 0;
|
||||||
|
virtual void end() = 0;
|
||||||
|
|
||||||
|
virtual std::optional<Instruction> disassemble(u64 imageBaseAddress, u64 instructionLoadAddress, u64 instructionDataAddress, std::span<const u8> code) = 0;
|
||||||
|
virtual void drawSettings() = 0;
|
||||||
|
|
||||||
|
[[nodiscard]] const std::string& getName() const { return m_name; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string m_name;
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace impl {
|
||||||
|
|
||||||
|
using CreatorFunction = std::function<std::unique_ptr<Architecture>()>;
|
||||||
|
|
||||||
|
void addArchitectureCreator(CreatorFunction function);
|
||||||
|
|
||||||
|
const std::map<std::string, CreatorFunction>& getArchitectures();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template<std::derived_from<Architecture> T>
|
||||||
|
void add(auto && ...args) {
|
||||||
|
impl::addArchitectureCreator([...args = std::move(args)] {
|
||||||
|
return std::make_unique<T>(args...);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,15 +31,6 @@
|
|||||||
#define EVENT_DEF_NO_LOG(event_name, ...) EVENT_DEF_IMPL(event_name, #event_name, false, __VA_ARGS__)
|
#define EVENT_DEF_NO_LOG(event_name, ...) EVENT_DEF_IMPL(event_name, #event_name, false, __VA_ARGS__)
|
||||||
|
|
||||||
|
|
||||||
/* Forward declarations */
|
|
||||||
struct GLFWwindow;
|
|
||||||
namespace hex {
|
|
||||||
class Achievement;
|
|
||||||
class View;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace pl::ptrn { class Pattern; }
|
|
||||||
|
|
||||||
namespace hex {
|
namespace hex {
|
||||||
|
|
||||||
namespace impl {
|
namespace impl {
|
||||||
@@ -99,7 +90,8 @@ namespace hex {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The EventManager allows subscribing to and posting events to different parts of the program.
|
* @brief The EventManager allows subscribing to and posting events to different parts of the program.
|
||||||
* To create a new event, use the EVENT_DEF macro. This will create a new event type with the given name and parameters
|
* To create a new event, use the EVENT_DEF macro. This will create a new event type with the given name and parameters.
|
||||||
|
* Events should be created in an `events_*.hpp` category file under the `events` folder, and never directly here.
|
||||||
*/
|
*/
|
||||||
class EventManager {
|
class EventManager {
|
||||||
public:
|
public:
|
||||||
@@ -129,15 +121,9 @@ namespace hex {
|
|||||||
static void subscribe(void *token, typename E::Callback function) {
|
static void subscribe(void *token, typename E::Callback function) {
|
||||||
std::scoped_lock lock(getEventMutex());
|
std::scoped_lock lock(getEventMutex());
|
||||||
|
|
||||||
if (getTokenStore().contains(token)) {
|
if (isAlreadyRegistered(token, E::Id)) {
|
||||||
auto&& [begin, end] = getTokenStore().equal_range(token);
|
log::fatal("The token '{}' has already registered the same event ('{}')", token, wolv::type::getTypeName<E>());
|
||||||
const auto eventRegistered = std::any_of(begin, end, [&](auto &item) {
|
return;
|
||||||
return item.second->first == E::Id;
|
|
||||||
});
|
|
||||||
if (eventRegistered) {
|
|
||||||
log::fatal("The token '{}' has already registered the same event ('{}')", token, wolv::type::getTypeName<E>());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getTokenStore().insert({ token, subscribe<E>(function) });
|
getTokenStore().insert({ token, subscribe<E>(function) });
|
||||||
@@ -162,16 +148,7 @@ namespace hex {
|
|||||||
static void unsubscribe(void *token) noexcept {
|
static void unsubscribe(void *token) noexcept {
|
||||||
std::scoped_lock lock(getEventMutex());
|
std::scoped_lock lock(getEventMutex());
|
||||||
|
|
||||||
auto &tokenStore = getTokenStore();
|
unsubscribe(token, E::Id);
|
||||||
auto iter = std::find_if(tokenStore.begin(), tokenStore.end(), [&](auto &item) {
|
|
||||||
return item.first == token && item.second->first == E::Id;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (iter != tokenStore.end()) {
|
|
||||||
getEvents().erase(iter->second);
|
|
||||||
tokenStore.erase(iter);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -209,118 +186,9 @@ namespace hex {
|
|||||||
static std::multimap<void *, EventList::iterator>& getTokenStore();
|
static std::multimap<void *, EventList::iterator>& getTokenStore();
|
||||||
static EventList& getEvents();
|
static EventList& getEvents();
|
||||||
static std::recursive_mutex& getEventMutex();
|
static std::recursive_mutex& getEventMutex();
|
||||||
|
|
||||||
|
static bool isAlreadyRegistered(void *token, impl::EventId id);
|
||||||
|
static void unsubscribe(void *token, impl::EventId id);
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Default Events */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Called when Imhex finished startup, and will enter the main window rendering loop
|
|
||||||
*/
|
|
||||||
EVENT_DEF(EventImHexStartupFinished);
|
|
||||||
|
|
||||||
EVENT_DEF(EventFileLoaded, std::fs::path);
|
|
||||||
EVENT_DEF(EventDataChanged, prv::Provider *);
|
|
||||||
EVENT_DEF(EventHighlightingChanged);
|
|
||||||
EVENT_DEF(EventWindowClosing, GLFWwindow *);
|
|
||||||
EVENT_DEF(EventRegionSelected, ImHexApi::HexEditor::ProviderRegion);
|
|
||||||
EVENT_DEF(EventAbnormalTermination, int);
|
|
||||||
EVENT_DEF(EventThemeChanged);
|
|
||||||
EVENT_DEF(EventOSThemeChanged);
|
|
||||||
EVENT_DEF(EventWindowFocused, bool);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Called when the provider is created.
|
|
||||||
* This event is responsible for (optionally) initializing the provider and calling EventProviderOpened
|
|
||||||
* (although the event can also be called manually without problem)
|
|
||||||
*/
|
|
||||||
EVENT_DEF(EventProviderCreated, prv::Provider *);
|
|
||||||
EVENT_DEF(EventProviderChanged, prv::Provider *, prv::Provider *);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Called as a continuation of EventProviderCreated
|
|
||||||
* this event is normally called immediately after EventProviderCreated successfully initialized the provider.
|
|
||||||
* If no initialization (Provider::skipLoadInterface() has been set), this event should be called manually
|
|
||||||
* If skipLoadInterface failed, this event is not called
|
|
||||||
*
|
|
||||||
* @note this is not related to Provider::open()
|
|
||||||
*/
|
|
||||||
EVENT_DEF(EventProviderOpened, prv::Provider *);
|
|
||||||
EVENT_DEF(EventProviderClosing, prv::Provider *, bool *);
|
|
||||||
EVENT_DEF(EventProviderClosed, prv::Provider *);
|
|
||||||
EVENT_DEF(EventProviderDeleted, prv::Provider *);
|
|
||||||
EVENT_DEF(EventProviderSaved, prv::Provider *);
|
|
||||||
EVENT_DEF(EventWindowInitialized);
|
|
||||||
EVENT_DEF(EventWindowDeinitializing, GLFWwindow *);
|
|
||||||
EVENT_DEF(EventBookmarkCreated, ImHexApi::Bookmarks::Entry&);
|
|
||||||
EVENT_DEF(EventPatchCreated, u64, u8, u8);
|
|
||||||
EVENT_DEF(EventPatternEvaluating);
|
|
||||||
EVENT_DEF(EventPatternExecuted, const std::string&);
|
|
||||||
EVENT_DEF(EventPatternEditorChanged, const std::string&);
|
|
||||||
EVENT_DEF(EventStoreContentDownloaded, const std::fs::path&);
|
|
||||||
EVENT_DEF(EventStoreContentRemoved, const std::fs::path&);
|
|
||||||
EVENT_DEF(EventImHexClosing);
|
|
||||||
EVENT_DEF(EventAchievementUnlocked, const Achievement&);
|
|
||||||
EVENT_DEF(EventSearchBoxClicked, u32);
|
|
||||||
EVENT_DEF(EventViewOpened, View*);
|
|
||||||
EVENT_DEF(EventFirstLaunch);
|
|
||||||
|
|
||||||
EVENT_DEF(EventFileDragged, bool);
|
|
||||||
EVENT_DEF(EventFileDropped, std::fs::path);
|
|
||||||
|
|
||||||
EVENT_DEF(EventProviderDataModified, prv::Provider *, u64, u64, const u8*);
|
|
||||||
EVENT_DEF(EventProviderDataInserted, prv::Provider *, u64, u64);
|
|
||||||
EVENT_DEF(EventProviderDataRemoved, prv::Provider *, u64, u64);
|
|
||||||
EVENT_DEF(EventProviderDirtied, prv::Provider *);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Called when a project has been loaded
|
|
||||||
*/
|
|
||||||
EVENT_DEF(EventProjectOpened);
|
|
||||||
|
|
||||||
EVENT_DEF_NO_LOG(EventFrameBegin);
|
|
||||||
EVENT_DEF_NO_LOG(EventFrameEnd);
|
|
||||||
EVENT_DEF_NO_LOG(EventSetTaskBarIconState, u32, u32, u32);
|
|
||||||
EVENT_DEF_NO_LOG(EventImGuiElementRendered, ImGuiID, const std::array<float, 4>&);
|
|
||||||
|
|
||||||
EVENT_DEF(RequestAddInitTask, std::string, bool, std::function<bool()>);
|
|
||||||
EVENT_DEF(RequestAddExitTask, std::string, std::function<bool()>);
|
|
||||||
EVENT_DEF(RequestOpenWindow, std::string);
|
|
||||||
EVENT_DEF(RequestHexEditorSelectionChange, Region);
|
|
||||||
EVENT_DEF(RequestPatternEditorSelectionChange, u32, u32);
|
|
||||||
EVENT_DEF(RequestJumpToPattern, const pl::ptrn::Pattern*);
|
|
||||||
EVENT_DEF(RequestAddBookmark, Region, std::string, std::string, color_t, u64*);
|
|
||||||
EVENT_DEF(RequestRemoveBookmark, u64);
|
|
||||||
EVENT_DEF(RequestSetPatternLanguageCode, std::string);
|
|
||||||
EVENT_DEF(RequestRunPatternCode);
|
|
||||||
EVENT_DEF(RequestLoadPatternLanguageFile, std::fs::path);
|
|
||||||
EVENT_DEF(RequestSavePatternLanguageFile, std::fs::path);
|
|
||||||
EVENT_DEF(RequestUpdateWindowTitle);
|
|
||||||
EVENT_DEF(RequestCloseImHex, bool);
|
|
||||||
EVENT_DEF(RequestRestartImHex);
|
|
||||||
EVENT_DEF(RequestOpenFile, std::fs::path);
|
|
||||||
EVENT_DEF(RequestChangeTheme, std::string);
|
|
||||||
EVENT_DEF(RequestOpenPopup, std::string);
|
|
||||||
EVENT_DEF(RequestAddVirtualFile, std::fs::path, std::vector<u8>, Region);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Creates a provider from it's unlocalized name, and add it to the provider list
|
|
||||||
*/
|
|
||||||
EVENT_DEF(RequestCreateProvider, std::string, bool, bool, hex::prv::Provider **);
|
|
||||||
EVENT_DEF(RequestInitThemeHandlers);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Send an event to the main Imhex instance
|
|
||||||
*/
|
|
||||||
EVENT_DEF(SendMessageToMainInstance, const std::string, const std::vector<u8>&);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Move the data from all PerProvider instances from one provider to another.
|
|
||||||
* The 'from' provider should not have any per provider data after this, and should be immediately deleted
|
|
||||||
*/
|
|
||||||
EVENT_DEF(MovePerProviderData, prv::Provider *, prv::Provider *);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called when ImHex managed to catch an error in a general try/catch to prevent/recover from a crash
|
|
||||||
*/
|
|
||||||
EVENT_DEF(EventCrashRecovered, const std::exception &);
|
|
||||||
}
|
}
|
||||||
120
lib/libimhex/include/hex/api/events/events_gui.hpp
Normal file
120
lib/libimhex/include/hex/api/events/events_gui.hpp
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <hex/api/event_manager.hpp>
|
||||||
|
|
||||||
|
/* Forward declarations */
|
||||||
|
struct GLFWwindow;
|
||||||
|
namespace hex { class View; }
|
||||||
|
|
||||||
|
/* GUI events definitions */
|
||||||
|
namespace hex {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals a newly opened window
|
||||||
|
*
|
||||||
|
* This event is sent when the window has just been opened and docked by the Window manager.
|
||||||
|
*
|
||||||
|
* FIXME: In the event that a newly created window is already docked, this will not be sent.
|
||||||
|
*
|
||||||
|
* FIXME: This is currently only used for the introduction tutorial.
|
||||||
|
* If the event's only purpose is this, maybe rename it?
|
||||||
|
*
|
||||||
|
* @param view the new view reference
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventViewOpened, View*);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals a change in the DPI scale.
|
||||||
|
*
|
||||||
|
* This event is called once at startup to signal native scale definition (by passing the same value twice).
|
||||||
|
* On Windows OS, this event can also be posted if the window DPI has been changed.
|
||||||
|
*
|
||||||
|
* @param oldScale the old scale
|
||||||
|
* @param newScale the current scale that's now in use
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventDPIChanged, float, float);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals the focus of the ImHex main window.
|
||||||
|
*
|
||||||
|
* This is directly tied as a GLFW window focus callback, and will be called accordingly when GLFW detects
|
||||||
|
* a change in focus.
|
||||||
|
*
|
||||||
|
* @param isFocused true if the window is focused
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventWindowFocused, bool);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals a window being closed.
|
||||||
|
*
|
||||||
|
* Allows reactive clean up of running tasks, and prevents ImHex from closing
|
||||||
|
* by displaying an exit confirmation popup.
|
||||||
|
*
|
||||||
|
* @param window The window reference
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventWindowClosing, GLFWwindow*);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Informs that the main window is initialized
|
||||||
|
*
|
||||||
|
* On Windows OS, it is used to initialize system theme, if ImHex's theme is following it.
|
||||||
|
*
|
||||||
|
* FIXME: Change event name to reflect Theme detection, if it's only used for that purpose?
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventWindowInitialized);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Informs that the main window is deinitializing
|
||||||
|
*
|
||||||
|
* Allows for lifecycle cleanup before ImHex shutdown.
|
||||||
|
*
|
||||||
|
* @param window The window reference
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventWindowDeinitializing, GLFWwindow*);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals a theme change in the host OS
|
||||||
|
*
|
||||||
|
* Allows ImHex to react to OS theme changes dynamically during execution.
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventOSThemeChanged);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* silent (no-logging) GUI events definitions */
|
||||||
|
namespace hex {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals the start of a new ImGui frame
|
||||||
|
*/
|
||||||
|
EVENT_DEF_NO_LOG(EventFrameBegin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals the end of an ImGui frame
|
||||||
|
*/
|
||||||
|
EVENT_DEF_NO_LOG(EventFrameEnd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Windows OS: Sets the taskbar icon state
|
||||||
|
*
|
||||||
|
* This event is used on Windows OS to display progress through the taskbar icon (the famous "green loading bar"
|
||||||
|
* in the taskbar).
|
||||||
|
*
|
||||||
|
* @param progressState the progress state (converted from the TaskProgressState enum)
|
||||||
|
* @param progressType the type of progress (converted from the TaskProgressType enum)
|
||||||
|
* @param percentage actual progress percentage (expected from 0 to 100)
|
||||||
|
*
|
||||||
|
* @see hex::ImHexApi::System::TaskProgressState
|
||||||
|
* @see hex::ImHexApi::System::TaskProgressType
|
||||||
|
*/
|
||||||
|
EVENT_DEF_NO_LOG(EventSetTaskBarIconState, u32, u32, u32);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Informs of an ImGui element being rendered
|
||||||
|
*
|
||||||
|
* @param elementId the element's ID
|
||||||
|
* @param boundingBox the bounding box (composed of 4 floats)
|
||||||
|
*/
|
||||||
|
EVENT_DEF_NO_LOG(EventImGuiElementRendered, ImGuiID, const std::array<float, 4>&);
|
||||||
|
|
||||||
|
}
|
||||||
158
lib/libimhex/include/hex/api/events/events_interaction.hpp
Normal file
158
lib/libimhex/include/hex/api/events/events_interaction.hpp
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <hex/api/event_manager.hpp>
|
||||||
|
#include <hex/helpers/patches.hpp>
|
||||||
|
|
||||||
|
/* Forward declarations */
|
||||||
|
namespace hex { class Achievement; }
|
||||||
|
|
||||||
|
/* Interaction events definitions */
|
||||||
|
namespace hex {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals a file was loaded
|
||||||
|
*
|
||||||
|
* FIXME: this event is unused and should be scrapped.
|
||||||
|
*
|
||||||
|
* @param path the loaded file's path
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventFileLoaded, std::fs::path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals a change in the current data
|
||||||
|
*
|
||||||
|
* Enables provider reaction to data change, especially the data inspector.
|
||||||
|
*
|
||||||
|
* This is caused by the following:
|
||||||
|
* - an explicit provider reload, requested by the user (Ctrl+R)
|
||||||
|
* - any user action that results in the creation of an "undo" stack action (generally a data modification)
|
||||||
|
*
|
||||||
|
* @param provider the Provider subject to the data change
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventDataChanged, prv::Provider *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals a change in highlighting
|
||||||
|
*
|
||||||
|
* The event's only purpose is for the Hex editor to clear highlights when receiving this event.
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventHighlightingChanged);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Informs of a provider region being selected
|
||||||
|
*
|
||||||
|
* This is very generally used to signal user actions that select a specific region within the provider.
|
||||||
|
* It is also used to pass on regions when the provider changes.
|
||||||
|
*
|
||||||
|
* @param providerRegion the provider-aware region being selected
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventRegionSelected, ImHexApi::HexEditor::ProviderRegion);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals a theme change
|
||||||
|
*
|
||||||
|
* On Windows OS, this is used to reflect the theme color onto the window frame.
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventThemeChanged);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals that a bookmark was created
|
||||||
|
*
|
||||||
|
* For now, this event's only purpose is to unlock an achievement.
|
||||||
|
*
|
||||||
|
* @param entry the new bookmark
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventBookmarkCreated, ImHexApi::Bookmarks::Entry&);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called upon creation of an IPS patch.
|
||||||
|
* As for now, the event only serves a purpose for the achievement unlock.
|
||||||
|
*
|
||||||
|
* @param data the pointer to the patch content's start
|
||||||
|
* @param size the patch data size
|
||||||
|
* @param kind the patch's kind
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventPatchCreated, const u8*, u64, const PatchKind);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals the beginning of evaluation of the current pattern
|
||||||
|
*
|
||||||
|
* This allows resetting the drawer view for the pattern data while we wait for the execution completion.
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventPatternEvaluating);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals the completion of the pattern evaluation
|
||||||
|
*
|
||||||
|
* This causes another reset in the drawer view, to refresh the table displayed to the user.
|
||||||
|
*
|
||||||
|
* @param code the execution's status code
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventPatternExecuted, const std::string&);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Denotes when pattern editor has changed
|
||||||
|
*
|
||||||
|
* FIXME: this event is unused and should be scrapped.
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventPatternEditorChanged, const std::string&);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals that a Content Store item was downloaded
|
||||||
|
*
|
||||||
|
* FIXME: this event is unused and should be scrapped.
|
||||||
|
*
|
||||||
|
* @param path the item's path on the filesystem
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventStoreContentDownloaded, const std::fs::path&);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals the removal of a Content Store item
|
||||||
|
*
|
||||||
|
* Note: at the time of the event firing, the item has already been removed from the filesystem.
|
||||||
|
*
|
||||||
|
* FIXME: this event is unused and should be scrapped.
|
||||||
|
*
|
||||||
|
* @param path the item's old file path where it used to be in the filesystem
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventStoreContentRemoved, const std::fs::path&);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals the unlocking of an achievement
|
||||||
|
*
|
||||||
|
* This is used by the achievement manager to refresh the achievement display, as well as store progress to
|
||||||
|
* the appropriate storage file.
|
||||||
|
*
|
||||||
|
* @param achievement the achievement that was unlocked
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventAchievementUnlocked, const Achievement&);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals a click on the search box
|
||||||
|
*
|
||||||
|
* As there are different behaviours depending on the click (left or right) done by the user,
|
||||||
|
* this allows the consequences of said click to be registered in their own components.
|
||||||
|
*
|
||||||
|
* @param button the ImGuiMouseButton's value
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventSearchBoxClicked, u32);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Updates on whether a file is being dragged into ImHex
|
||||||
|
*
|
||||||
|
* Allows ImGUi to display a file dragging information on screen when a file is being dragged.
|
||||||
|
*
|
||||||
|
* @param isFileDragged true if a file is being dragged
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventFileDragged, bool);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Triggers loading when a file is dropped
|
||||||
|
*
|
||||||
|
* The event fires when a file is dropped into ImHex, which passes it to file handlers to load it.
|
||||||
|
*
|
||||||
|
* @param path the dropped file's path
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventFileDropped, std::fs::path);
|
||||||
|
|
||||||
|
}
|
||||||
78
lib/libimhex/include/hex/api/events/events_lifecycle.hpp
Normal file
78
lib/libimhex/include/hex/api/events/events_lifecycle.hpp
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <hex/api/event_manager.hpp>
|
||||||
|
|
||||||
|
/* Lifecycle events definitions */
|
||||||
|
namespace hex {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called when Imhex finished startup, and will enter the main window rendering loop
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventImHexStartupFinished);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called when ImHex is closing, to trigger the last shutdown hooks
|
||||||
|
*
|
||||||
|
* This is the last event to fire before complete graceful shutdown.
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventImHexClosing);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals that it's ImHex first launch ever
|
||||||
|
*
|
||||||
|
* This event allows for the launch of the ImHex tutorial (also called Out of Box experience).
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventFirstLaunch);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FIXME: this event is unused and should be scrapped.
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventAnySettingChanged);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Ensures correct plugin cleanup on crash
|
||||||
|
*
|
||||||
|
* This event is fired when catching an unexpected error that cannot be recovered and
|
||||||
|
* which forces Imhex to close immediately.
|
||||||
|
*
|
||||||
|
* Subscribing to this event ensures that the plugin can correctly clean up any mission-critical tasks
|
||||||
|
* before forceful shutdown.
|
||||||
|
*
|
||||||
|
* @param signal the POSIX signal code
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventAbnormalTermination, int);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Informs of the ImHex versions (and difference, if any)
|
||||||
|
*
|
||||||
|
* Called on every startup to inform subscribers of the two versions picked up:
|
||||||
|
* - the version of the previous launch, gathered from the settings file
|
||||||
|
* - the current version, gathered directly from C++ code
|
||||||
|
*
|
||||||
|
* In most cases, and unless ImHex was updated, the two parameters will be the same.
|
||||||
|
*
|
||||||
|
* FIXME: Maybe rename the event to signal a startup information, instead of the misleading
|
||||||
|
* title that the event could be fired when ImHex detects that it was updated since last launch?
|
||||||
|
*
|
||||||
|
* @param previousLaunchVersion ImHex's version during the previous launch
|
||||||
|
* @param currentVersion ImHex's current version for this startup
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventImHexUpdated, SemanticVersion, SemanticVersion);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called when ImHex managed to catch an error in a general try/catch to prevent/recover from a crash
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventCrashRecovered, const std::exception &);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called when a project has been loaded
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventProjectOpened);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called when a native message was received from another ImHex instance
|
||||||
|
* @param rawData Raw bytes received from other instance
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventNativeMessageReceived, std::vector<u8>);
|
||||||
|
|
||||||
|
}
|
||||||
113
lib/libimhex/include/hex/api/events/events_provider.hpp
Normal file
113
lib/libimhex/include/hex/api/events/events_provider.hpp
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <hex.hpp>
|
||||||
|
#include <hex/api/event_manager.hpp>
|
||||||
|
|
||||||
|
/* Provider events definitions */
|
||||||
|
namespace hex {
|
||||||
|
/**
|
||||||
|
* @brief Called when the provider is created.
|
||||||
|
* This event is responsible for (optionally) initializing the provider and calling EventProviderOpened
|
||||||
|
* (although the event can also be called manually without problem)
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventProviderCreated, prv::Provider *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called as a continuation of EventProviderCreated
|
||||||
|
* this event is normally called immediately after EventProviderCreated successfully initialized the provider.
|
||||||
|
* If no initialization (Provider::skipLoadInterface() has been set), this event should be called manually
|
||||||
|
* If skipLoadInterface failed, this event is not called
|
||||||
|
*
|
||||||
|
* @note this is not related to Provider::open()
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventProviderOpened, prv::Provider *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals a change in provider (in-place)
|
||||||
|
*
|
||||||
|
* Note: if the provider was deleted, the new ("current") provider will be `nullptr`
|
||||||
|
*
|
||||||
|
* @param oldProvider the old provider
|
||||||
|
* @param currentProvider the current provider
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventProviderChanged, prv::Provider *, prv::Provider *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals that a provider was saved
|
||||||
|
*
|
||||||
|
* @param provider the saved provider
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventProviderSaved, prv::Provider *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals a provider is closing
|
||||||
|
*
|
||||||
|
* FIXME: as for now, this behaves as a request more than an event. Also, the boolean is always set to true,
|
||||||
|
* and serves no purpose. This should be moved into the Provider requests section and declared accordingly.
|
||||||
|
*
|
||||||
|
* @param provider the closing provider
|
||||||
|
* @param shouldClose whether the provider should close
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventProviderClosing, prv::Provider *, bool *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals that a provider was closed
|
||||||
|
*
|
||||||
|
* As this is a closure information broadcast, the provider should generally not be accessed, as it could
|
||||||
|
* result in problems.
|
||||||
|
*
|
||||||
|
* @param provider the now-closed provider
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventProviderClosed, prv::Provider *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals that a provider is being deleted
|
||||||
|
*
|
||||||
|
* Provider's data should not be accessed.
|
||||||
|
*
|
||||||
|
* @param provider the provider
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventProviderDeleted, prv::Provider *);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Provider data events definitions */
|
||||||
|
namespace hex {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals the dirtying of a provider
|
||||||
|
*
|
||||||
|
* Any data modification that occurs in a provider dirties it, until its state is either saved or restored.
|
||||||
|
* This event signals that fact to subscribers so additional code can be executed for certain cases.
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventProviderDirtied, prv::Provider *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals an insertion of new data into a provider
|
||||||
|
*
|
||||||
|
* @param provider the provider
|
||||||
|
* @param offset the start of the insertion
|
||||||
|
* @param size the new data's size
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventProviderDataInserted, prv::Provider *, u64, u64);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals a modification in the provider's data
|
||||||
|
*
|
||||||
|
* @param provider the provider
|
||||||
|
* @param offset the data modification's offset (start address)
|
||||||
|
* @param size the buffer's size
|
||||||
|
* @param buffer the modified data written at this address
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventProviderDataModified, prv::Provider *, u64, u64, const u8*);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Signals a removal of some of the provider's data
|
||||||
|
*
|
||||||
|
* @param provider the provider
|
||||||
|
* @param offset the deletion offset (start address)
|
||||||
|
* @param size the deleted data's size
|
||||||
|
*/
|
||||||
|
EVENT_DEF(EventProviderDataRemoved, prv::Provider *, u64, u64);
|
||||||
|
|
||||||
|
}
|
||||||
37
lib/libimhex/include/hex/api/events/requests_gui.hpp
Normal file
37
lib/libimhex/include/hex/api/events/requests_gui.hpp
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <hex/api/event_manager.hpp>
|
||||||
|
|
||||||
|
/* GUI requests definitions */
|
||||||
|
namespace hex {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Requests the opening of a new window.
|
||||||
|
*
|
||||||
|
* @param name the window's name
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestOpenWindow, std::string);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Centralized request to update ImHex's main window title
|
||||||
|
*
|
||||||
|
* This request can be called to make ImHex refresh its main window title, taking into account a new project
|
||||||
|
* or file opened/closed.
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestUpdateWindowTitle);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Requests a theme type (light or dark) change
|
||||||
|
*
|
||||||
|
* @param themeType either `Light` or `Dark`
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestChangeTheme, std::string);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Requests the opening of a popup
|
||||||
|
*
|
||||||
|
* @param name the popup's name
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestOpenPopup, std::string);
|
||||||
|
|
||||||
|
}
|
||||||
116
lib/libimhex/include/hex/api/events/requests_interaction.hpp
Normal file
116
lib/libimhex/include/hex/api/events/requests_interaction.hpp
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <hex.hpp>
|
||||||
|
#include <hex/api/event_manager.hpp>
|
||||||
|
|
||||||
|
/* Forward declarations */
|
||||||
|
namespace pl::ptrn { class Pattern; }
|
||||||
|
|
||||||
|
/* Interaction requests definitions */
|
||||||
|
namespace hex {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Requests a selection change in the Hex editor
|
||||||
|
*
|
||||||
|
* This request is handled by the Hex editor, which proceeds to check if the selection is valid.
|
||||||
|
* If it is invalid, the Hex editor fires the `EventRegionSelected` event with nullptr region info.
|
||||||
|
*
|
||||||
|
* @param region the region that should be selected
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestHexEditorSelectionChange, ImHexApi::HexEditor::ProviderRegion);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Requests the Pattern editor to move selection
|
||||||
|
*
|
||||||
|
* Requests the Pattern editor to move the cursor's position to reflect the user's click or movement.
|
||||||
|
*
|
||||||
|
* @param line the target line
|
||||||
|
* @param column the target column
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestPatternEditorSelectionChange, u32, u32);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Requests a jump to a given pattern
|
||||||
|
*
|
||||||
|
* This request is fired by the Hex editor when the user asks to jump to the pattern.
|
||||||
|
* It is then caught and reflected by the Pattern data component.
|
||||||
|
*
|
||||||
|
* @param pattern the pattern to jump to
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestJumpToPattern, const pl::ptrn::Pattern*);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Requests to add a bookmark
|
||||||
|
*
|
||||||
|
* @param region the region to be bookmarked
|
||||||
|
* @param name the bookmark's name
|
||||||
|
* @param comment a comment
|
||||||
|
* @param color the color
|
||||||
|
* @param id the bookmark's unique ID
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestAddBookmark, Region, std::string, std::string, color_t, u64*);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Requests a bookmark removal
|
||||||
|
*
|
||||||
|
* @param id the bookmark's unique ID
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestRemoveBookmark, u64);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Request the Pattern editor to set its code
|
||||||
|
*
|
||||||
|
* This request allows the rest of ImHex to interface with the Pattern editor component, by setting its code.
|
||||||
|
* This allows for `.hexpat` file loading, and more.
|
||||||
|
*
|
||||||
|
* @param code the code's string
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestSetPatternLanguageCode, std::string);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Requests the Pattern editor to run the current code
|
||||||
|
*
|
||||||
|
* This is only ever used in the introduction tutorial.
|
||||||
|
*
|
||||||
|
* FIXME: the name is misleading, as for now this activates the pattern's auto-evaluation rather than a
|
||||||
|
* one-off execution
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestRunPatternCode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Request to load a pattern language file
|
||||||
|
*
|
||||||
|
* FIXME: this request is unused, as now another component is responsible for pattern file loading.
|
||||||
|
* This request should be scrapped.
|
||||||
|
*
|
||||||
|
* @param path the pattern file's path
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestLoadPatternLanguageFile, std::fs::path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Request to save a pattern language file
|
||||||
|
*
|
||||||
|
* FIXME: this request is unused, as now another component is responsible for pattern file saving.
|
||||||
|
* This request should be scrapped.
|
||||||
|
*
|
||||||
|
* @param path the pattern file's path
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestSavePatternLanguageFile, std::fs::path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Requests ImHex to open and process a file
|
||||||
|
*
|
||||||
|
* @param path the file's path
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestOpenFile, std::fs::path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Adds a virtual file in the Pattern editor
|
||||||
|
*
|
||||||
|
* @param path the file's path
|
||||||
|
* @param data the file's data
|
||||||
|
* @param region the impacted region
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestAddVirtualFile, std::fs::path, std::vector<u8>, Region);
|
||||||
|
|
||||||
|
}
|
||||||
84
lib/libimhex/include/hex/api/events/requests_lifecycle.hpp
Normal file
84
lib/libimhex/include/hex/api/events/requests_lifecycle.hpp
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <hex.hpp>
|
||||||
|
#include <hex/api/event_manager.hpp>
|
||||||
|
|
||||||
|
/* Lifecycle requests definitions */
|
||||||
|
namespace hex {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Emit a request to add an initialization task to the list
|
||||||
|
*
|
||||||
|
* These tasks will be executed at startup.
|
||||||
|
*
|
||||||
|
* @param name Name of the init task
|
||||||
|
* @param isAsync Whether the task is asynchronous (true if yes)
|
||||||
|
* @param callbackFunction The function to call to execute the task
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestAddInitTask, std::string, bool, std::function<bool()>);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Emit a request to add an exit task to the list
|
||||||
|
*
|
||||||
|
* These tasks will be executed during the exit phase.
|
||||||
|
*
|
||||||
|
* FIXME: request is unused and should be scrapped.
|
||||||
|
*
|
||||||
|
* @param name Name of the exit task
|
||||||
|
* @param callbackFunction The function to call to execute the task
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestAddExitTask, std::string, std::function<bool()>);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Requests ImHex's graceful shutdown
|
||||||
|
*
|
||||||
|
* If there are no questions (bool set to true), ImHex closes immediately.
|
||||||
|
* If set to false, there is a procedure run to prompt a confirmation to the user.
|
||||||
|
*
|
||||||
|
* @param noQuestions true if no questions
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestCloseImHex, bool);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Requests ImHex's restart
|
||||||
|
*
|
||||||
|
* This event is necessary for ImHex to restart in the main loop for native and web platforms,
|
||||||
|
* as ImHex cannot simply close and re-open.
|
||||||
|
*
|
||||||
|
* This event serves no purpose on Linux, Windows and macOS platforms.
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestRestartImHex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Requests the initialization of theme handlers
|
||||||
|
*
|
||||||
|
* This is called during ImGui bootstrapping, and should not be called at any other time.
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestInitThemeHandlers);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Requests version and first-startup checks
|
||||||
|
*
|
||||||
|
* This request is called during ImHex's startup, and allows ImHex to check if it was updated since last launch.
|
||||||
|
* It also ensures newcomers (that open ImHex for the first time) are greeted with the tutorial.
|
||||||
|
*
|
||||||
|
* FIXME: the name is misleading, as this request does not effectively start any migration. It only executes
|
||||||
|
* checks about ImHex's version. The name should be changed to reflect this behaviour.
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestStartMigration);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Send a subcommand to the main Imhex instance
|
||||||
|
*
|
||||||
|
* This request is called to send a subcommand to the main ImHex instance.
|
||||||
|
* This subcommand will then be executed by a handler when ImHex finishing initializing
|
||||||
|
* (`EventImHexStartupFinished`).
|
||||||
|
*
|
||||||
|
* FIXME: change the name so that it is prefixed with "Request" like every other request.
|
||||||
|
*
|
||||||
|
* @param name the subcommand's name
|
||||||
|
* @param data the subcommand's data
|
||||||
|
*/
|
||||||
|
EVENT_DEF(SendMessageToMainInstance, const std::string, const std::vector<u8>&);
|
||||||
|
|
||||||
|
}
|
||||||
22
lib/libimhex/include/hex/api/events/requests_provider.hpp
Normal file
22
lib/libimhex/include/hex/api/events/requests_provider.hpp
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <hex/api/event_manager.hpp>
|
||||||
|
|
||||||
|
/* Provider requests definitions */
|
||||||
|
namespace hex {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Creates a provider from its unlocalized name, and add it to the provider list
|
||||||
|
*/
|
||||||
|
EVENT_DEF(RequestCreateProvider, std::string, bool, bool, hex::prv::Provider **);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Move the data from all PerProvider instances from one provider to another
|
||||||
|
*
|
||||||
|
* The 'from' provider should not have any per provider data after this, and should be immediately deleted
|
||||||
|
*
|
||||||
|
* FIXME: rename with the "Request" prefix to apply standard naming convention.
|
||||||
|
*/
|
||||||
|
EVENT_DEF(MovePerProviderData, prv::Provider *, prv::Provider *);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
#include <hex.hpp>
|
#include <hex.hpp>
|
||||||
#include <hex/api/localization_manager.hpp>
|
#include <hex/api/localization_manager.hpp>
|
||||||
|
#include <hex/helpers/semantic_version.hpp>
|
||||||
|
#include <hex/helpers/fs.hpp>
|
||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
@@ -10,8 +12,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <set>
|
#include <set>
|
||||||
|
#include <memory>
|
||||||
#include <wolv/io/fs.hpp>
|
|
||||||
|
|
||||||
using ImGuiID = unsigned int;
|
using ImGuiID = unsigned int;
|
||||||
struct ImVec2;
|
struct ImVec2;
|
||||||
@@ -75,7 +76,7 @@ namespace hex {
|
|||||||
namespace impl {
|
namespace impl {
|
||||||
|
|
||||||
using HighlightingFunction = std::function<std::optional<color_t>(u64, const u8*, size_t, bool)>;
|
using HighlightingFunction = std::function<std::optional<color_t>(u64, const u8*, size_t, bool)>;
|
||||||
using HoveringFunction = std::function<bool(const prv::Provider *, u64, const u8*, size_t)>;
|
using HoveringFunction = std::function<std::set<Region>(const prv::Provider *, u64, size_t)>;
|
||||||
|
|
||||||
const std::map<u32, Highlighting>& getBackgroundHighlights();
|
const std::map<u32, Highlighting>& getBackgroundHighlights();
|
||||||
const std::map<u32, HighlightingFunction>& getBackgroundHighlightingFunctions();
|
const std::map<u32, HighlightingFunction>& getBackgroundHighlightingFunctions();
|
||||||
@@ -443,6 +444,8 @@ namespace hex {
|
|||||||
bool isWindowResizable();
|
bool isWindowResizable();
|
||||||
|
|
||||||
void addAutoResetObject(hex::impl::AutoResetBase *object);
|
void addAutoResetObject(hex::impl::AutoResetBase *object);
|
||||||
|
void removeAutoResetObject(hex::impl::AutoResetBase *object);
|
||||||
|
|
||||||
void cleanup();
|
void cleanup();
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -492,6 +495,7 @@ namespace hex {
|
|||||||
*/
|
*/
|
||||||
float getNativeScale();
|
float getNativeScale();
|
||||||
|
|
||||||
|
float getBackingScaleFactor();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Gets the current main window position
|
* @brief Gets the current main window position
|
||||||
@@ -580,6 +584,14 @@ namespace hex {
|
|||||||
*/
|
*/
|
||||||
const std::string& getGLRenderer();
|
const std::string& getGLRenderer();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Checks if ImHex is being run in a "Corporate Environment"
|
||||||
|
* This function simply checks for common telltale signs such as if the machine is joined a
|
||||||
|
* domain. It's not super accurate, but it's still useful for statistics
|
||||||
|
* @return True if it is
|
||||||
|
*/
|
||||||
|
bool isCorporateEnvironment();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Checks if ImHex is running in portable mode
|
* @brief Checks if ImHex is running in portable mode
|
||||||
* @return Whether ImHex is running in portable mode
|
* @return Whether ImHex is running in portable mode
|
||||||
@@ -618,7 +630,7 @@ namespace hex {
|
|||||||
* @brief Gets the current ImHex version
|
* @brief Gets the current ImHex version
|
||||||
* @return ImHex version
|
* @return ImHex version
|
||||||
*/
|
*/
|
||||||
std::string getImHexVersion(bool withBuildType = true);
|
SemanticVersion getImHexVersion();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Gets the current git commit hash
|
* @brief Gets the current git commit hash
|
||||||
@@ -695,6 +707,13 @@ namespace hex {
|
|||||||
*/
|
*/
|
||||||
void* getLibImHexModuleHandle();
|
void* getLibImHexModuleHandle();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a new migration routine that will be executed when upgrading from a lower version than specified in migrationVersion
|
||||||
|
* @param migrationVersion Upgrade point version
|
||||||
|
* @param function Function to run
|
||||||
|
*/
|
||||||
|
void addMigrationRoutine(SemanticVersion migrationVersion, std::function<void()> function);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -736,11 +755,8 @@ namespace hex {
|
|||||||
|
|
||||||
const std::vector<Font>& getFonts();
|
const std::vector<Font>& getFonts();
|
||||||
|
|
||||||
void setCustomFontPath(const std::fs::path &path);
|
std::map<UnlocalizedString, ImFont*>& getFontDefinitions();
|
||||||
void setFontSize(float size);
|
|
||||||
void setFontAtlas(ImFontAtlas *fontAtlas);
|
|
||||||
|
|
||||||
void setFonts(ImFont *bold, ImFont *italic);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GlyphRange glyph(const char *glyph);
|
GlyphRange glyph(const char *glyph);
|
||||||
@@ -753,26 +769,8 @@ namespace hex {
|
|||||||
|
|
||||||
constexpr static float DefaultFontSize = 13.0;
|
constexpr static float DefaultFontSize = 13.0;
|
||||||
|
|
||||||
ImFont* Bold();
|
void registerFont(const UnlocalizedString &fontName);
|
||||||
ImFont* Italic();
|
ImFont* getFont(const UnlocalizedString &fontName);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Gets the current custom font path
|
|
||||||
* @return The current custom font path
|
|
||||||
*/
|
|
||||||
const std::filesystem::path& getCustomFontPath();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Gets the current font size
|
|
||||||
* @return The current font size
|
|
||||||
*/
|
|
||||||
float getFontSize();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Gets the current font atlas
|
|
||||||
* @return Current font atlas
|
|
||||||
*/
|
|
||||||
ImFontAtlas* getFontAtlas();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <hex.hpp>
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/core.h>
|
||||||
|
#include <wolv/types/static_string.hpp>
|
||||||
|
|
||||||
namespace hex {
|
namespace hex {
|
||||||
|
|
||||||
@@ -22,24 +25,30 @@ namespace hex {
|
|||||||
};
|
};
|
||||||
|
|
||||||
namespace impl {
|
namespace impl {
|
||||||
|
|
||||||
void setFallbackLanguage(const std::string &language);
|
void setFallbackLanguage(const std::string &language);
|
||||||
void resetLanguageStrings();
|
void resetLanguageStrings();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void loadLanguage(const std::string &language);
|
void loadLanguage(std::string language);
|
||||||
std::string getLocalizedString(const std::string &unlocalizedString, const std::string &language = "");
|
std::string getLocalizedString(const std::string &unlocalizedString, const std::string &language = "");
|
||||||
|
|
||||||
[[nodiscard]] const std::map<std::string, std::string> &getSupportedLanguages();
|
[[nodiscard]] const std::map<std::string, std::string> &getSupportedLanguages();
|
||||||
[[nodiscard]] const std::string &getFallbackLanguage();
|
[[nodiscard]] const std::string &getFallbackLanguage();
|
||||||
[[nodiscard]] const std::string &getSelectedLanguage();
|
[[nodiscard]] const std::string &getSelectedLanguage();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct UnlocalizedString;
|
struct UnlocalizedString;
|
||||||
|
|
||||||
|
class LangConst;
|
||||||
|
|
||||||
class Lang {
|
class Lang {
|
||||||
public:
|
public:
|
||||||
explicit Lang(const char *unlocalizedString);
|
explicit Lang(const char *unlocalizedString);
|
||||||
explicit Lang(const std::string &unlocalizedString);
|
explicit Lang(const std::string &unlocalizedString);
|
||||||
|
explicit(false) Lang(const LangConst &localizedString);
|
||||||
explicit Lang(const UnlocalizedString &unlocalizedString);
|
explicit Lang(const UnlocalizedString &unlocalizedString);
|
||||||
explicit Lang(std::string_view unlocalizedString);
|
explicit Lang(std::string_view unlocalizedString);
|
||||||
|
|
||||||
@@ -47,31 +56,54 @@ namespace hex {
|
|||||||
[[nodiscard]] operator std::string_view() const;
|
[[nodiscard]] operator std::string_view() const;
|
||||||
[[nodiscard]] operator const char *() const;
|
[[nodiscard]] operator const char *() const;
|
||||||
|
|
||||||
[[nodiscard]] const std::string &get() const;
|
const char* get() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
std::size_t m_entryHash;
|
||||||
std::string m_unlocalizedString;
|
std::string m_unlocalizedString;
|
||||||
};
|
};
|
||||||
|
|
||||||
[[nodiscard]] std::string operator+(const std::string &&left, const Lang &&right);
|
class LangConst {
|
||||||
[[nodiscard]] std::string operator+(const Lang &&left, const std::string &&right);
|
public:
|
||||||
[[nodiscard]] std::string operator+(const std::string_view &&left, const Lang &&right);
|
[[nodiscard]] operator std::string() const;
|
||||||
[[nodiscard]] std::string operator+(const Lang &&left, const std::string_view &&right);
|
[[nodiscard]] operator std::string_view() const;
|
||||||
[[nodiscard]] std::string operator+(const char *left, const Lang &&right);
|
[[nodiscard]] operator const char *() const;
|
||||||
[[nodiscard]] std::string operator+(const Lang &&left, const char *right);
|
|
||||||
[[nodiscard]] std::string operator+(const Lang &&left, const Lang &&right);
|
|
||||||
|
|
||||||
[[nodiscard]] inline Lang operator""_lang(const char *string, size_t) {
|
const char* get() const;
|
||||||
return Lang(string);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
constexpr static size_t hash(std::string_view string) {
|
||||||
|
constexpr u64 p = 131;
|
||||||
|
constexpr u64 m = std::numeric_limits<std::uint32_t>::max() - 4;
|
||||||
|
u64 total = 0;
|
||||||
|
u64 currentMultiplier = 1;
|
||||||
|
|
||||||
|
for (char c : string) {
|
||||||
|
total = (total + currentMultiplier * c) % m;
|
||||||
|
currentMultiplier = (currentMultiplier * p) % m;
|
||||||
|
}
|
||||||
|
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
constexpr explicit LangConst(std::size_t hash, const char *unlocalizedString) : m_entryHash(hash), m_unlocalizedString(unlocalizedString) {}
|
||||||
|
|
||||||
|
template<wolv::type::StaticString>
|
||||||
|
friend consteval LangConst operator""_lang();
|
||||||
|
friend class Lang;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::size_t m_entryHash;
|
||||||
|
const char *m_unlocalizedString = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
struct UnlocalizedString {
|
struct UnlocalizedString {
|
||||||
public:
|
public:
|
||||||
UnlocalizedString() = default;
|
UnlocalizedString() = default;
|
||||||
UnlocalizedString(auto && arg) : m_unlocalizedString(std::forward<decltype(arg)>(arg)) {
|
|
||||||
static_assert(!std::same_as<std::remove_cvref_t<decltype(arg)>, Lang>, "Expected a unlocalized name, got a localized one!");
|
UnlocalizedString(const std::string &string) : m_unlocalizedString(string) { }
|
||||||
}
|
UnlocalizedString(const char *string) : m_unlocalizedString(string) { }
|
||||||
|
UnlocalizedString(const Lang& arg) = delete;
|
||||||
|
|
||||||
[[nodiscard]] operator std::string() const {
|
[[nodiscard]] operator std::string() const {
|
||||||
return m_unlocalizedString;
|
return m_unlocalizedString;
|
||||||
@@ -102,12 +134,24 @@ namespace hex {
|
|||||||
std::string m_unlocalizedString;
|
std::string m_unlocalizedString;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<wolv::type::StaticString String>
|
||||||
|
[[nodiscard]] consteval LangConst operator""_lang() {
|
||||||
|
return LangConst(LangConst::hash(String.value.data()), String.value.data());
|
||||||
|
}
|
||||||
|
|
||||||
|
// {fmt} formatter for hex::Lang and hex::LangConst
|
||||||
|
inline auto format_as(const hex::Lang &entry) {
|
||||||
|
return entry.get();
|
||||||
|
}
|
||||||
|
inline auto format_as(const hex::LangConst &entry) {
|
||||||
|
return entry.get();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
struct fmt::formatter<hex::Lang> : fmt::formatter<std::string_view> {
|
struct std::hash<hex::UnlocalizedString> {
|
||||||
template<typename FormatContext>
|
std::size_t operator()(const hex::UnlocalizedString &string) const noexcept {
|
||||||
auto format(const hex::Lang &entry, FormatContext &ctx) {
|
return std::hash<std::string>{}(string.get());
|
||||||
return fmt::formatter<std::string_view>::format(entry.get(), ctx);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -15,11 +15,17 @@ struct ImGuiContext;
|
|||||||
namespace hex {
|
namespace hex {
|
||||||
|
|
||||||
struct SubCommand {
|
struct SubCommand {
|
||||||
|
enum class Type : u8 {
|
||||||
|
Option,
|
||||||
|
SubCommand
|
||||||
|
};
|
||||||
|
|
||||||
std::string commandLong;
|
std::string commandLong;
|
||||||
std::string commandShort;
|
std::string commandShort;
|
||||||
|
|
||||||
std::string commandDescription;
|
std::string commandDescription;
|
||||||
std::function<void(const std::vector<std::string>&)> callback;
|
std::function<void(const std::vector<std::string>&)> callback;
|
||||||
|
Type type = Type::Option;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Feature {
|
struct Feature {
|
||||||
|
|||||||
@@ -2,142 +2,31 @@
|
|||||||
|
|
||||||
#include <hex.hpp>
|
#include <hex.hpp>
|
||||||
#include <hex/api/localization_manager.hpp>
|
#include <hex/api/localization_manager.hpp>
|
||||||
|
#include <hex/helpers/keys.hpp>
|
||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <memory>
|
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include <GLFW/glfw3.h>
|
|
||||||
|
|
||||||
struct ImGuiWindow;
|
struct ImGuiWindow;
|
||||||
|
|
||||||
|
struct KeyEquivalent {
|
||||||
|
bool valid;
|
||||||
|
bool ctrl, opt, cmd, shift;
|
||||||
|
int key;
|
||||||
|
};
|
||||||
|
|
||||||
namespace hex {
|
namespace hex {
|
||||||
|
|
||||||
class View;
|
class View;
|
||||||
|
|
||||||
enum class Keys {
|
|
||||||
Space = GLFW_KEY_SPACE,
|
|
||||||
Apostrophe = GLFW_KEY_APOSTROPHE,
|
|
||||||
Comma = GLFW_KEY_COMMA,
|
|
||||||
Minus = GLFW_KEY_MINUS,
|
|
||||||
Period = GLFW_KEY_PERIOD,
|
|
||||||
Slash = GLFW_KEY_SLASH,
|
|
||||||
Num0 = GLFW_KEY_0,
|
|
||||||
Num1 = GLFW_KEY_1,
|
|
||||||
Num2 = GLFW_KEY_2,
|
|
||||||
Num3 = GLFW_KEY_3,
|
|
||||||
Num4 = GLFW_KEY_4,
|
|
||||||
Num5 = GLFW_KEY_5,
|
|
||||||
Num6 = GLFW_KEY_6,
|
|
||||||
Num7 = GLFW_KEY_7,
|
|
||||||
Num8 = GLFW_KEY_8,
|
|
||||||
Num9 = GLFW_KEY_9,
|
|
||||||
Semicolon = GLFW_KEY_SEMICOLON,
|
|
||||||
Equals = GLFW_KEY_EQUAL,
|
|
||||||
A = GLFW_KEY_A,
|
|
||||||
B = GLFW_KEY_B,
|
|
||||||
C = GLFW_KEY_C,
|
|
||||||
D = GLFW_KEY_D,
|
|
||||||
E = GLFW_KEY_E,
|
|
||||||
F = GLFW_KEY_F,
|
|
||||||
G = GLFW_KEY_G,
|
|
||||||
H = GLFW_KEY_H,
|
|
||||||
I = GLFW_KEY_I,
|
|
||||||
J = GLFW_KEY_J,
|
|
||||||
K = GLFW_KEY_K,
|
|
||||||
L = GLFW_KEY_L,
|
|
||||||
M = GLFW_KEY_M,
|
|
||||||
N = GLFW_KEY_N,
|
|
||||||
O = GLFW_KEY_O,
|
|
||||||
P = GLFW_KEY_P,
|
|
||||||
Q = GLFW_KEY_Q,
|
|
||||||
R = GLFW_KEY_R,
|
|
||||||
S = GLFW_KEY_S,
|
|
||||||
T = GLFW_KEY_T,
|
|
||||||
U = GLFW_KEY_U,
|
|
||||||
V = GLFW_KEY_V,
|
|
||||||
W = GLFW_KEY_W,
|
|
||||||
X = GLFW_KEY_X,
|
|
||||||
Y = GLFW_KEY_Y,
|
|
||||||
Z = GLFW_KEY_Z,
|
|
||||||
LeftBracket = GLFW_KEY_LEFT_BRACKET,
|
|
||||||
Backslash = GLFW_KEY_BACKSLASH,
|
|
||||||
RightBracket = GLFW_KEY_RIGHT_BRACKET,
|
|
||||||
GraveAccent = GLFW_KEY_GRAVE_ACCENT,
|
|
||||||
World1 = GLFW_KEY_WORLD_1,
|
|
||||||
World2 = GLFW_KEY_WORLD_2,
|
|
||||||
Escape = GLFW_KEY_ESCAPE,
|
|
||||||
Enter = GLFW_KEY_ENTER,
|
|
||||||
Tab = GLFW_KEY_TAB,
|
|
||||||
Backspace = GLFW_KEY_BACKSPACE,
|
|
||||||
Insert = GLFW_KEY_INSERT,
|
|
||||||
Delete = GLFW_KEY_DELETE,
|
|
||||||
Right = GLFW_KEY_RIGHT,
|
|
||||||
Left = GLFW_KEY_LEFT,
|
|
||||||
Down = GLFW_KEY_DOWN,
|
|
||||||
Up = GLFW_KEY_UP,
|
|
||||||
PageUp = GLFW_KEY_PAGE_UP,
|
|
||||||
PageDown = GLFW_KEY_PAGE_DOWN,
|
|
||||||
Home = GLFW_KEY_HOME,
|
|
||||||
End = GLFW_KEY_END,
|
|
||||||
CapsLock = GLFW_KEY_CAPS_LOCK,
|
|
||||||
ScrollLock = GLFW_KEY_SCROLL_LOCK,
|
|
||||||
NumLock = GLFW_KEY_NUM_LOCK,
|
|
||||||
PrintScreen = GLFW_KEY_PRINT_SCREEN,
|
|
||||||
Pause = GLFW_KEY_PAUSE,
|
|
||||||
F1 = GLFW_KEY_F1,
|
|
||||||
F2 = GLFW_KEY_F2,
|
|
||||||
F3 = GLFW_KEY_F3,
|
|
||||||
F4 = GLFW_KEY_F4,
|
|
||||||
F5 = GLFW_KEY_F5,
|
|
||||||
F6 = GLFW_KEY_F6,
|
|
||||||
F7 = GLFW_KEY_F7,
|
|
||||||
F8 = GLFW_KEY_F8,
|
|
||||||
F9 = GLFW_KEY_F9,
|
|
||||||
F10 = GLFW_KEY_F10,
|
|
||||||
F11 = GLFW_KEY_F11,
|
|
||||||
F12 = GLFW_KEY_F12,
|
|
||||||
F13 = GLFW_KEY_F13,
|
|
||||||
F14 = GLFW_KEY_F14,
|
|
||||||
F15 = GLFW_KEY_F15,
|
|
||||||
F16 = GLFW_KEY_F16,
|
|
||||||
F17 = GLFW_KEY_F17,
|
|
||||||
F18 = GLFW_KEY_F18,
|
|
||||||
F19 = GLFW_KEY_F19,
|
|
||||||
F20 = GLFW_KEY_F20,
|
|
||||||
F21 = GLFW_KEY_F21,
|
|
||||||
F22 = GLFW_KEY_F22,
|
|
||||||
F23 = GLFW_KEY_F23,
|
|
||||||
F24 = GLFW_KEY_F24,
|
|
||||||
F25 = GLFW_KEY_F25,
|
|
||||||
KeyPad0 = GLFW_KEY_KP_0,
|
|
||||||
KeyPad1 = GLFW_KEY_KP_1,
|
|
||||||
KeyPad2 = GLFW_KEY_KP_2,
|
|
||||||
KeyPad3 = GLFW_KEY_KP_3,
|
|
||||||
KeyPad4 = GLFW_KEY_KP_4,
|
|
||||||
KeyPad5 = GLFW_KEY_KP_5,
|
|
||||||
KeyPad6 = GLFW_KEY_KP_6,
|
|
||||||
KeyPad7 = GLFW_KEY_KP_7,
|
|
||||||
KeyPad8 = GLFW_KEY_KP_8,
|
|
||||||
KeyPad9 = GLFW_KEY_KP_9,
|
|
||||||
KeyPadDecimal = GLFW_KEY_KP_DECIMAL,
|
|
||||||
KeyPadDivide = GLFW_KEY_KP_DIVIDE,
|
|
||||||
KeyPadMultiply = GLFW_KEY_KP_MULTIPLY,
|
|
||||||
KeyPadSubtract = GLFW_KEY_KP_SUBTRACT,
|
|
||||||
KeyPadAdd = GLFW_KEY_KP_ADD,
|
|
||||||
KeyPadEnter = GLFW_KEY_KP_ENTER,
|
|
||||||
KeyPadEqual = GLFW_KEY_KP_EQUAL,
|
|
||||||
Menu = GLFW_KEY_MENU,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class Key {
|
class Key {
|
||||||
public:
|
public:
|
||||||
constexpr Key() = default;
|
constexpr Key() = default;
|
||||||
constexpr Key(Keys key) : m_key(static_cast<u32>(key)) { }
|
constexpr Key(Keys key) : m_key(static_cast<u32>(key)) { }
|
||||||
|
|
||||||
|
bool operator==(const Key &) const = default;
|
||||||
auto operator<=>(const Key &) const = default;
|
auto operator<=>(const Key &) const = default;
|
||||||
|
|
||||||
[[nodiscard]] constexpr u32 getKeyCode() const { return m_key; }
|
[[nodiscard]] constexpr u32 getKeyCode() const { return m_key; }
|
||||||
@@ -152,224 +41,32 @@ namespace hex {
|
|||||||
constexpr static auto SUPER = Key(static_cast<Keys>(0x0800'0000));
|
constexpr static auto SUPER = Key(static_cast<Keys>(0x0800'0000));
|
||||||
constexpr static auto CurrentView = Key(static_cast<Keys>(0x1000'0000));
|
constexpr static auto CurrentView = Key(static_cast<Keys>(0x1000'0000));
|
||||||
constexpr static auto AllowWhileTyping = Key(static_cast<Keys>(0x2000'0000));
|
constexpr static auto AllowWhileTyping = Key(static_cast<Keys>(0x2000'0000));
|
||||||
|
constexpr static auto CTRLCMD = Key(static_cast<Keys>(0x4000'0000));
|
||||||
#if defined (OS_MACOS)
|
|
||||||
constexpr static auto CTRLCMD = SUPER;
|
|
||||||
#else
|
|
||||||
constexpr static auto CTRLCMD = CTRL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class Shortcut {
|
class Shortcut {
|
||||||
public:
|
public:
|
||||||
Shortcut() = default;
|
Shortcut() = default;
|
||||||
Shortcut(Keys key) : m_keys({ key }) { }
|
Shortcut(Keys key);
|
||||||
explicit Shortcut(std::set<Key> keys) : m_keys(std::move(keys)) { }
|
explicit Shortcut(std::set<Key> keys);
|
||||||
Shortcut(const Shortcut &other) = default;
|
Shortcut(const Shortcut &other) = default;
|
||||||
Shortcut(Shortcut &&) noexcept = default;
|
Shortcut(Shortcut &&) noexcept = default;
|
||||||
|
|
||||||
Shortcut& operator=(const Shortcut &other) = default;
|
constexpr static auto None = Keys(0);
|
||||||
|
|
||||||
|
Shortcut& operator=(const Shortcut &other) = default;
|
||||||
Shortcut& operator=(Shortcut &&) noexcept = default;
|
Shortcut& operator=(Shortcut &&) noexcept = default;
|
||||||
|
|
||||||
constexpr static inline auto None = Keys(0);
|
Shortcut operator+(const Key &other) const;
|
||||||
|
Shortcut &operator+=(const Key &other);
|
||||||
|
bool operator<(const Shortcut &other) const;
|
||||||
|
bool operator==(const Shortcut &other) const;
|
||||||
|
|
||||||
Shortcut operator+(const Key &other) const {
|
bool isLocal() const;
|
||||||
Shortcut result = *this;
|
std::string toString() const;
|
||||||
result.m_keys.insert(other);
|
KeyEquivalent toKeyEquivalent() const;
|
||||||
|
const std::set<Key>& getKeys() const;
|
||||||
return result;
|
bool has(Key key) const;
|
||||||
}
|
bool matches(const Shortcut &other) const;
|
||||||
|
|
||||||
Shortcut &operator+=(const Key &other) {
|
|
||||||
m_keys.insert(other);
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator<(const Shortcut &other) const {
|
|
||||||
return m_keys < other.m_keys;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const Shortcut &other) const {
|
|
||||||
auto thisKeys = m_keys;
|
|
||||||
auto otherKeys = other.m_keys;
|
|
||||||
|
|
||||||
thisKeys.erase(CurrentView);
|
|
||||||
thisKeys.erase(AllowWhileTyping);
|
|
||||||
otherKeys.erase(CurrentView);
|
|
||||||
otherKeys.erase(AllowWhileTyping);
|
|
||||||
|
|
||||||
return thisKeys == otherKeys;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isLocal() const {
|
|
||||||
return m_keys.contains(CurrentView);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string toString() const {
|
|
||||||
std::string result;
|
|
||||||
|
|
||||||
#if defined(OS_MACOS)
|
|
||||||
constexpr static auto CTRL_NAME = "CTRL";
|
|
||||||
constexpr static auto ALT_NAME = "OPT";
|
|
||||||
constexpr static auto SHIFT_NAME = "SHIFT";
|
|
||||||
constexpr static auto SUPER_NAME = "CMD";
|
|
||||||
#else
|
|
||||||
constexpr static auto CTRL_NAME = "CTRL";
|
|
||||||
constexpr static auto ALT_NAME = "ALT";
|
|
||||||
constexpr static auto SHIFT_NAME = "SHIFT";
|
|
||||||
constexpr static auto SUPER_NAME = "SUPER";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
constexpr static auto Concatination = " + ";
|
|
||||||
|
|
||||||
auto keys = m_keys;
|
|
||||||
if (keys.erase(CTRL) > 0) {
|
|
||||||
result += CTRL_NAME;
|
|
||||||
result += Concatination;
|
|
||||||
}
|
|
||||||
if (keys.erase(ALT) > 0) {
|
|
||||||
result += ALT_NAME;
|
|
||||||
result += Concatination;
|
|
||||||
}
|
|
||||||
if (keys.erase(SHIFT) > 0) {
|
|
||||||
result += SHIFT_NAME;
|
|
||||||
result += Concatination;
|
|
||||||
}
|
|
||||||
if (keys.erase(SUPER) > 0) {
|
|
||||||
result += SUPER_NAME;
|
|
||||||
result += Concatination;
|
|
||||||
}
|
|
||||||
keys.erase(CurrentView);
|
|
||||||
|
|
||||||
for (const auto &key : keys) {
|
|
||||||
switch (Keys(key.getKeyCode())) {
|
|
||||||
case Keys::Space: result += "SPACE"; break;
|
|
||||||
case Keys::Apostrophe: result += "'"; break;
|
|
||||||
case Keys::Comma: result += ","; break;
|
|
||||||
case Keys::Minus: result += "-"; break;
|
|
||||||
case Keys::Period: result += "."; break;
|
|
||||||
case Keys::Slash: result += "/"; break;
|
|
||||||
case Keys::Num0: result += "0"; break;
|
|
||||||
case Keys::Num1: result += "1"; break;
|
|
||||||
case Keys::Num2: result += "2"; break;
|
|
||||||
case Keys::Num3: result += "3"; break;
|
|
||||||
case Keys::Num4: result += "4"; break;
|
|
||||||
case Keys::Num5: result += "5"; break;
|
|
||||||
case Keys::Num6: result += "6"; break;
|
|
||||||
case Keys::Num7: result += "7"; break;
|
|
||||||
case Keys::Num8: result += "8"; break;
|
|
||||||
case Keys::Num9: result += "9"; break;
|
|
||||||
case Keys::Semicolon: result += ";"; break;
|
|
||||||
case Keys::Equals: result += "="; break;
|
|
||||||
case Keys::A: result += "A"; break;
|
|
||||||
case Keys::B: result += "B"; break;
|
|
||||||
case Keys::C: result += "C"; break;
|
|
||||||
case Keys::D: result += "D"; break;
|
|
||||||
case Keys::E: result += "E"; break;
|
|
||||||
case Keys::F: result += "F"; break;
|
|
||||||
case Keys::G: result += "G"; break;
|
|
||||||
case Keys::H: result += "H"; break;
|
|
||||||
case Keys::I: result += "I"; break;
|
|
||||||
case Keys::J: result += "J"; break;
|
|
||||||
case Keys::K: result += "K"; break;
|
|
||||||
case Keys::L: result += "L"; break;
|
|
||||||
case Keys::M: result += "M"; break;
|
|
||||||
case Keys::N: result += "N"; break;
|
|
||||||
case Keys::O: result += "O"; break;
|
|
||||||
case Keys::P: result += "P"; break;
|
|
||||||
case Keys::Q: result += "Q"; break;
|
|
||||||
case Keys::R: result += "R"; break;
|
|
||||||
case Keys::S: result += "S"; break;
|
|
||||||
case Keys::T: result += "T"; break;
|
|
||||||
case Keys::U: result += "U"; break;
|
|
||||||
case Keys::V: result += "V"; break;
|
|
||||||
case Keys::W: result += "W"; break;
|
|
||||||
case Keys::X: result += "X"; break;
|
|
||||||
case Keys::Y: result += "Y"; break;
|
|
||||||
case Keys::Z: result += "Z"; break;
|
|
||||||
case Keys::LeftBracket: result += "["; break;
|
|
||||||
case Keys::Backslash: result += "\\"; break;
|
|
||||||
case Keys::RightBracket: result += "]"; break;
|
|
||||||
case Keys::GraveAccent: result += "`"; break;
|
|
||||||
case Keys::World1: result += "WORLD1"; break;
|
|
||||||
case Keys::World2: result += "WORLD2"; break;
|
|
||||||
case Keys::Escape: result += "ESC"; break;
|
|
||||||
case Keys::Enter: result += "ENTER"; break;
|
|
||||||
case Keys::Tab: result += "TAB"; break;
|
|
||||||
case Keys::Backspace: result += "BACKSPACE"; break;
|
|
||||||
case Keys::Insert: result += "INSERT"; break;
|
|
||||||
case Keys::Delete: result += "DELETE"; break;
|
|
||||||
case Keys::Right: result += "RIGHT"; break;
|
|
||||||
case Keys::Left: result += "LEFT"; break;
|
|
||||||
case Keys::Down: result += "DOWN"; break;
|
|
||||||
case Keys::Up: result += "UP"; break;
|
|
||||||
case Keys::PageUp: result += "PAGEUP"; break;
|
|
||||||
case Keys::PageDown: result += "PAGEDOWN"; break;
|
|
||||||
case Keys::Home: result += "HOME"; break;
|
|
||||||
case Keys::End: result += "END"; break;
|
|
||||||
case Keys::CapsLock: result += "CAPSLOCK"; break;
|
|
||||||
case Keys::ScrollLock: result += "SCROLLLOCK"; break;
|
|
||||||
case Keys::NumLock: result += "NUMLOCK"; break;
|
|
||||||
case Keys::PrintScreen: result += "PRINTSCREEN"; break;
|
|
||||||
case Keys::Pause: result += "PAUSE"; break;
|
|
||||||
case Keys::F1: result += "F1"; break;
|
|
||||||
case Keys::F2: result += "F2"; break;
|
|
||||||
case Keys::F3: result += "F3"; break;
|
|
||||||
case Keys::F4: result += "F4"; break;
|
|
||||||
case Keys::F5: result += "F5"; break;
|
|
||||||
case Keys::F6: result += "F6"; break;
|
|
||||||
case Keys::F7: result += "F7"; break;
|
|
||||||
case Keys::F8: result += "F8"; break;
|
|
||||||
case Keys::F9: result += "F9"; break;
|
|
||||||
case Keys::F10: result += "F10"; break;
|
|
||||||
case Keys::F11: result += "F11"; break;
|
|
||||||
case Keys::F12: result += "F12"; break;
|
|
||||||
case Keys::F13: result += "F13"; break;
|
|
||||||
case Keys::F14: result += "F14"; break;
|
|
||||||
case Keys::F15: result += "F15"; break;
|
|
||||||
case Keys::F16: result += "F16"; break;
|
|
||||||
case Keys::F17: result += "F17"; break;
|
|
||||||
case Keys::F18: result += "F18"; break;
|
|
||||||
case Keys::F19: result += "F19"; break;
|
|
||||||
case Keys::F20: result += "F20"; break;
|
|
||||||
case Keys::F21: result += "F21"; break;
|
|
||||||
case Keys::F22: result += "F22"; break;
|
|
||||||
case Keys::F23: result += "F23"; break;
|
|
||||||
case Keys::F24: result += "F24"; break;
|
|
||||||
case Keys::F25: result += "F25"; break;
|
|
||||||
case Keys::KeyPad0: result += "KP0"; break;
|
|
||||||
case Keys::KeyPad1: result += "KP1"; break;
|
|
||||||
case Keys::KeyPad2: result += "KP2"; break;
|
|
||||||
case Keys::KeyPad3: result += "KP3"; break;
|
|
||||||
case Keys::KeyPad4: result += "KP4"; break;
|
|
||||||
case Keys::KeyPad5: result += "KP5"; break;
|
|
||||||
case Keys::KeyPad6: result += "KP6"; break;
|
|
||||||
case Keys::KeyPad7: result += "KP7"; break;
|
|
||||||
case Keys::KeyPad8: result += "KP8"; break;
|
|
||||||
case Keys::KeyPad9: result += "KP9"; break;
|
|
||||||
case Keys::KeyPadDecimal: result += "KPDECIMAL"; break;
|
|
||||||
case Keys::KeyPadDivide: result += "KPDIVIDE"; break;
|
|
||||||
case Keys::KeyPadMultiply: result += "KPMULTIPLY"; break;
|
|
||||||
case Keys::KeyPadSubtract: result += "KPSUBTRACT"; break;
|
|
||||||
case Keys::KeyPadAdd: result += "KPADD"; break;
|
|
||||||
case Keys::KeyPadEnter: result += "KPENTER"; break;
|
|
||||||
case Keys::KeyPadEqual: result += "KPEQUAL"; break;
|
|
||||||
case Keys::Menu: result += "MENU"; break;
|
|
||||||
default:
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
result += " + ";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result.ends_with(" + "))
|
|
||||||
result = result.substr(0, result.size() - 3);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
const std::set<Key>& getKeys() const { return m_keys; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend Shortcut operator+(const Key &lhs, const Key &rhs);
|
friend Shortcut operator+(const Key &lhs, const Key &rhs);
|
||||||
@@ -377,12 +74,7 @@ namespace hex {
|
|||||||
std::set<Key> m_keys;
|
std::set<Key> m_keys;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline Shortcut operator+(const Key &lhs, const Key &rhs) {
|
Shortcut operator+(const Key &lhs, const Key &rhs);
|
||||||
Shortcut result;
|
|
||||||
result.m_keys = { lhs, rhs };
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The ShortcutManager handles global and view-specific shortcuts.
|
* @brief The ShortcutManager handles global and view-specific shortcuts.
|
||||||
@@ -391,10 +83,12 @@ namespace hex {
|
|||||||
class ShortcutManager {
|
class ShortcutManager {
|
||||||
public:
|
public:
|
||||||
using Callback = std::function<void()>;
|
using Callback = std::function<void()>;
|
||||||
|
using EnabledCallback = std::function<bool()>;
|
||||||
struct ShortcutEntry {
|
struct ShortcutEntry {
|
||||||
Shortcut shortcut;
|
Shortcut shortcut;
|
||||||
UnlocalizedString unlocalizedName;
|
std::vector<UnlocalizedString> unlocalizedName;
|
||||||
Callback callback;
|
Callback callback;
|
||||||
|
EnabledCallback enabledCallback;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -402,8 +96,10 @@ namespace hex {
|
|||||||
* @param shortcut The shortcut to add.
|
* @param shortcut The shortcut to add.
|
||||||
* @param unlocalizedName The unlocalized name of the shortcut
|
* @param unlocalizedName The unlocalized name of the shortcut
|
||||||
* @param callback The callback to call when the shortcut is triggered.
|
* @param callback The callback to call when the shortcut is triggered.
|
||||||
|
* @param enabledCallback Callback that's called to check if this shortcut is enabled
|
||||||
*/
|
*/
|
||||||
static void addGlobalShortcut(const Shortcut &shortcut, const UnlocalizedString &unlocalizedName, const Callback &callback);
|
static void addGlobalShortcut(const Shortcut &shortcut, const std::vector<UnlocalizedString> &unlocalizedName, const Callback &callback, const EnabledCallback &enabledCallback = []{ return true; });
|
||||||
|
static void addGlobalShortcut(const Shortcut &shortcut, const UnlocalizedString &unlocalizedName, const Callback &callback, const EnabledCallback &enabledCallback = []{ return true; });
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Add a view-specific shortcut. View-specific shortcuts can only be triggered when the specified view is focused.
|
* @brief Add a view-specific shortcut. View-specific shortcuts can only be triggered when the specified view is focused.
|
||||||
@@ -411,8 +107,10 @@ namespace hex {
|
|||||||
* @param shortcut The shortcut to add.
|
* @param shortcut The shortcut to add.
|
||||||
* @param unlocalizedName The unlocalized name of the shortcut
|
* @param unlocalizedName The unlocalized name of the shortcut
|
||||||
* @param callback The callback to call when the shortcut is triggered.
|
* @param callback The callback to call when the shortcut is triggered.
|
||||||
|
* @param enabledCallback Callback that's called to check if this shortcut is enabled
|
||||||
*/
|
*/
|
||||||
static void addShortcut(View *view, const Shortcut &shortcut, const UnlocalizedString &unlocalizedName, const Callback &callback);
|
static void addShortcut(View *view, const Shortcut &shortcut, const std::vector<UnlocalizedString> &unlocalizedName, const Callback &callback, const EnabledCallback &enabledCallback = []{ return true; });
|
||||||
|
static void addShortcut(View *view, const Shortcut &shortcut, const UnlocalizedString &unlocalizedName, const Callback &callback, const EnabledCallback &enabledCallback = []{ return true; });
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -437,6 +135,14 @@ namespace hex {
|
|||||||
*/
|
*/
|
||||||
static void processGlobals(bool ctrl, bool alt, bool shift, bool super, u32 keyCode);
|
static void processGlobals(bool ctrl, bool alt, bool shift, bool super, u32 keyCode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Runs the callback of a shortcut as if it was pressed on the keyboard
|
||||||
|
* @param shortcut Shortcut to run
|
||||||
|
* @param view View the shortcut belongs to or nullptr to run a global shortcut
|
||||||
|
* @return True if a callback was executed, false if not
|
||||||
|
*/
|
||||||
|
static bool runShortcut(const Shortcut &shortcut, const View *view = nullptr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Clear all shortcuts
|
* @brief Clear all shortcuts
|
||||||
*/
|
*/
|
||||||
@@ -445,12 +151,17 @@ namespace hex {
|
|||||||
static void resumeShortcuts();
|
static void resumeShortcuts();
|
||||||
static void pauseShortcuts();
|
static void pauseShortcuts();
|
||||||
|
|
||||||
|
static void enableMacOSMode();
|
||||||
|
|
||||||
|
[[nodiscard]] static std::optional<UnlocalizedString> getLastActivatedMenu();
|
||||||
|
static void resetLastActivatedMenu();
|
||||||
|
|
||||||
[[nodiscard]] static std::optional<Shortcut> getPreviousShortcut();
|
[[nodiscard]] static std::optional<Shortcut> getPreviousShortcut();
|
||||||
|
|
||||||
[[nodiscard]] static std::vector<ShortcutEntry> getGlobalShortcuts();
|
[[nodiscard]] static std::vector<ShortcutEntry> getGlobalShortcuts();
|
||||||
[[nodiscard]] static std::vector<ShortcutEntry> getViewShortcuts(const View *view);
|
[[nodiscard]] static std::vector<ShortcutEntry> getViewShortcuts(const View *view);
|
||||||
|
|
||||||
[[nodiscard]] static bool updateShortcut(const Shortcut &oldShortcut, const Shortcut &newShortcut, View *view = nullptr);
|
[[nodiscard]] static bool updateShortcut(const Shortcut &oldShortcut, Shortcut newShortcut, View *view = nullptr);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -22,7 +22,7 @@ namespace hex {
|
|||||||
class Task {
|
class Task {
|
||||||
public:
|
public:
|
||||||
Task() = default;
|
Task() = default;
|
||||||
Task(UnlocalizedString unlocalizedName, u64 maxValue, bool background, std::function<void(Task &)> function);
|
Task(const UnlocalizedString &unlocalizedName, u64 maxValue, bool background, bool blocking, std::function<void(Task &)> function);
|
||||||
|
|
||||||
Task(const Task&) = delete;
|
Task(const Task&) = delete;
|
||||||
Task(Task &&other) noexcept;
|
Task(Task &&other) noexcept;
|
||||||
@@ -57,6 +57,7 @@ namespace hex {
|
|||||||
void setInterruptCallback(std::function<void()> callback);
|
void setInterruptCallback(std::function<void()> callback);
|
||||||
|
|
||||||
[[nodiscard]] bool isBackgroundTask() const;
|
[[nodiscard]] bool isBackgroundTask() const;
|
||||||
|
[[nodiscard]] bool isBlocking() const;
|
||||||
[[nodiscard]] bool isFinished() const;
|
[[nodiscard]] bool isFinished() const;
|
||||||
[[nodiscard]] bool hadException() const;
|
[[nodiscard]] bool hadException() const;
|
||||||
[[nodiscard]] bool wasInterrupted() const;
|
[[nodiscard]] bool wasInterrupted() const;
|
||||||
@@ -84,6 +85,7 @@ namespace hex {
|
|||||||
|
|
||||||
std::atomic<bool> m_shouldInterrupt = false;
|
std::atomic<bool> m_shouldInterrupt = false;
|
||||||
std::atomic<bool> m_background = true;
|
std::atomic<bool> m_background = true;
|
||||||
|
std::atomic<bool> m_blocking = false;
|
||||||
|
|
||||||
std::atomic<bool> m_interrupted = false;
|
std::atomic<bool> m_interrupted = false;
|
||||||
std::atomic<bool> m_finished = false;
|
std::atomic<bool> m_finished = false;
|
||||||
@@ -130,20 +132,55 @@ namespace hex {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Creates a new asynchronous task that gets displayed in the Task Manager in the footer
|
* @brief Creates a new asynchronous task that gets displayed in the Task Manager in the footer
|
||||||
* @param name Name of the task
|
* @param unlocalizedName Name of the task
|
||||||
* @param maxValue Maximum value of the task
|
* @param maxValue Maximum value of the task
|
||||||
* @param function Function to be executed
|
* @param function Function to be executed
|
||||||
* @return A TaskHolder holding a weak reference to the task
|
* @return A TaskHolder holding a weak reference to the task
|
||||||
*/
|
*/
|
||||||
static TaskHolder createTask(std::string name, u64 maxValue, std::function<void(Task &)> function);
|
static TaskHolder createTask(const UnlocalizedString &unlocalizedName, u64 maxValue, std::function<void(Task &)> function);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Creates a new asynchronous task that gets displayed in the Task Manager in the footer
|
||||||
|
* @param unlocalizedName Name of the task
|
||||||
|
* @param maxValue Maximum value of the task
|
||||||
|
* @param function Function to be executed
|
||||||
|
* @return A TaskHolder holding a weak reference to the task
|
||||||
|
*/
|
||||||
|
static TaskHolder createTask(const UnlocalizedString &unlocalizedName, u64 maxValue, std::function<void()> function);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Creates a new asynchronous task that does not get displayed in the Task Manager
|
* @brief Creates a new asynchronous task that does not get displayed in the Task Manager
|
||||||
* @param name Name of the task
|
* @param unlocalizedName Name of the task
|
||||||
* @param function Function to be executed
|
* @param function Function to be executed
|
||||||
* @return A TaskHolder holding a weak reference to the task
|
* @return A TaskHolder holding a weak reference to the task
|
||||||
*/
|
*/
|
||||||
static TaskHolder createBackgroundTask(std::string name, std::function<void(Task &)> function);
|
static TaskHolder createBackgroundTask(const UnlocalizedString &unlocalizedName, std::function<void(Task &)> function);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Creates a new asynchronous task that does not get displayed in the Task Manager
|
||||||
|
* @param unlocalizedName Name of the task
|
||||||
|
* @param function Function to be executed
|
||||||
|
* @return A TaskHolder holding a weak reference to the task
|
||||||
|
*/
|
||||||
|
static TaskHolder createBackgroundTask(const UnlocalizedString &unlocalizedName, std::function<void()> function);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Creates a new asynchronous task that shows a blocking modal window
|
||||||
|
* @param unlocalizedName Name of the task
|
||||||
|
* @param maxValue Maximum value of the task
|
||||||
|
* @param function Function to be executed
|
||||||
|
* @return A TaskHolder holding a weak reference to the task
|
||||||
|
*/
|
||||||
|
static TaskHolder createBlockingTask(const UnlocalizedString &unlocalizedName, u64 maxValue, std::function<void(Task &)> function);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Creates a new asynchronous task that shows a blocking modal window
|
||||||
|
* @param unlocalizedName Name of the task
|
||||||
|
* @param maxValue Maximum value of the task
|
||||||
|
* @param function Function to be executed
|
||||||
|
* @return A TaskHolder holding a weak reference to the task
|
||||||
|
*/
|
||||||
|
static TaskHolder createBlockingTask(const UnlocalizedString &unlocalizedName, u64 maxValue, std::function<void()> function);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Creates a new synchronous task that will execute the given function at the start of the next frame
|
* @brief Creates a new synchronous task that will execute the given function at the start of the next frame
|
||||||
@@ -185,12 +222,13 @@ namespace hex {
|
|||||||
|
|
||||||
static size_t getRunningTaskCount();
|
static size_t getRunningTaskCount();
|
||||||
static size_t getRunningBackgroundTaskCount();
|
static size_t getRunningBackgroundTaskCount();
|
||||||
|
static size_t getRunningBlockingTaskCount();
|
||||||
|
|
||||||
static const std::list<std::shared_ptr<Task>>& getRunningTasks();
|
static const std::list<std::shared_ptr<Task>>& getRunningTasks();
|
||||||
static void runDeferredCalls();
|
static void runDeferredCalls();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static TaskHolder createTask(std::string name, u64 maxValue, bool background, std::function<void(Task &)> function);
|
static TaskHolder createTask(const UnlocalizedString &unlocalizedName, u64 maxValue, bool background, bool blocking, std::function<void(Task &)> function);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -56,6 +56,7 @@ namespace hex {
|
|||||||
*/
|
*/
|
||||||
static void addStyleHandler(const std::string &name, const StyleMap &styleMap);
|
static void addStyleHandler(const std::string &name, const StyleMap &styleMap);
|
||||||
|
|
||||||
|
static void reapplyCurrentTheme();
|
||||||
|
|
||||||
static std::vector<std::string> getThemeNames();
|
static std::vector<std::string> getThemeNames();
|
||||||
static const std::string &getImageTheme();
|
static const std::string &getImageTheme();
|
||||||
@@ -66,6 +67,7 @@ namespace hex {
|
|||||||
|
|
||||||
static void reset();
|
static void reset();
|
||||||
|
|
||||||
|
static void setAccentColor(const ImColor &color);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
struct ThemeHandler {
|
struct ThemeHandler {
|
||||||
@@ -81,6 +83,7 @@ namespace hex {
|
|||||||
static const std::map<std::string, ThemeHandler>& getThemeHandlers();
|
static const std::map<std::string, ThemeHandler>& getThemeHandlers();
|
||||||
static const std::map<std::string, StyleHandler>& getStyleHandlers();
|
static const std::map<std::string, StyleHandler>& getStyleHandlers();
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ThemeManager() = default;
|
ThemeManager() = default;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -151,6 +151,9 @@ namespace hex {
|
|||||||
static void addInteractiveHelpText(std::initializer_list<std::variant<Lang, std::string, int>> &&ids, UnlocalizedString unlocalizedString);
|
static void addInteractiveHelpText(std::initializer_list<std::variant<Lang, std::string, int>> &&ids, UnlocalizedString unlocalizedString);
|
||||||
static void addInteractiveHelpLink(std::initializer_list<std::variant<Lang, std::string, int>> &&ids, std::string link);
|
static void addInteractiveHelpLink(std::initializer_list<std::variant<Lang, std::string, int>> &&ids, std::string link);
|
||||||
|
|
||||||
|
static void setLastItemInteractiveHelpPopup(std::function<void()> callback);
|
||||||
|
static void setLastItemInteractiveHelpLink(std::string link);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Draws the tutorial
|
* @brief Draws the tutorial
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ namespace hex {
|
|||||||
|
|
||||||
static void removeWorkspace(const std::string &name);
|
static void removeWorkspace(const std::string &name);
|
||||||
|
|
||||||
static const auto& getWorkspaces() { return *s_workspaces; }
|
static const std::map<std::string, Workspace>& getWorkspaces();
|
||||||
static const auto& getCurrentWorkspace() { return s_currentWorkspace; }
|
static const std::map<std::string, Workspace>::iterator& getCurrentWorkspace();
|
||||||
|
|
||||||
static void reset();
|
static void reset();
|
||||||
static void reload();
|
static void reload();
|
||||||
@@ -34,9 +34,6 @@ namespace hex {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
WorkspaceManager() = default;
|
WorkspaceManager() = default;
|
||||||
|
|
||||||
static AutoReset<std::map<std::string, Workspace>> s_workspaces;
|
|
||||||
static decltype(s_workspaces)::Type::iterator s_currentWorkspace, s_previousWorkspace, s_workspaceToRemove;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -3,7 +3,6 @@
|
|||||||
#include <hex.hpp>
|
#include <hex.hpp>
|
||||||
#include <hex/api/localization_manager.hpp>
|
#include <hex/api/localization_manager.hpp>
|
||||||
|
|
||||||
#include <hex/helpers/intrinsics.hpp>
|
|
||||||
#include <hex/data_processor/attribute.hpp>
|
#include <hex/data_processor/attribute.hpp>
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
@@ -12,6 +11,7 @@
|
|||||||
|
|
||||||
#include <nlohmann/json_fwd.hpp>
|
#include <nlohmann/json_fwd.hpp>
|
||||||
#include <imgui.h>
|
#include <imgui.h>
|
||||||
|
#include <hex/providers/provider_data.hpp>
|
||||||
|
|
||||||
namespace hex::prv {
|
namespace hex::prv {
|
||||||
class Provider;
|
class Provider;
|
||||||
@@ -42,11 +42,12 @@ namespace hex::dp {
|
|||||||
m_overlay = overlay;
|
m_overlay = overlay;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void drawNode() { }
|
void draw();
|
||||||
virtual void process() = 0;
|
virtual void process() = 0;
|
||||||
|
virtual void reset() { }
|
||||||
|
|
||||||
virtual void store(nlohmann::json &j) const { hex::unused(j); }
|
virtual void store(nlohmann::json &j) const { std::ignore = j; }
|
||||||
virtual void load(const nlohmann::json &j) { hex::unused(j); }
|
virtual void load(const nlohmann::json &j) { std::ignore = j; }
|
||||||
|
|
||||||
struct NodeError {
|
struct NodeError {
|
||||||
Node *node;
|
Node *node;
|
||||||
@@ -80,6 +81,11 @@ namespace hex::dp {
|
|||||||
void setIntegerOnOutput(u32 index, i128 integer);
|
void setIntegerOnOutput(u32 index, i128 integer);
|
||||||
void setFloatOnOutput(u32 index, double floatingPoint);
|
void setFloatOnOutput(u32 index, double floatingPoint);
|
||||||
|
|
||||||
|
static void interrupt();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void drawNode() { }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int m_id;
|
int m_id;
|
||||||
UnlocalizedString m_unlocalizedTitle, m_unlocalizedName;
|
UnlocalizedString m_unlocalizedTitle, m_unlocalizedName;
|
||||||
@@ -90,45 +96,16 @@ namespace hex::dp {
|
|||||||
|
|
||||||
static int s_idCounter;
|
static int s_idCounter;
|
||||||
|
|
||||||
Attribute& getAttribute(u32 index) {
|
Attribute& getAttribute(u32 index);
|
||||||
if (index >= this->getAttributes().size())
|
Attribute *getConnectedInputAttribute(u32 index);
|
||||||
throw std::runtime_error("Attribute index out of bounds!");
|
void markInputProcessed(u32 index);
|
||||||
|
void unmarkInputProcessed(u32 index);
|
||||||
return this->getAttributes()[index];
|
|
||||||
}
|
|
||||||
|
|
||||||
Attribute *getConnectedInputAttribute(u32 index) {
|
|
||||||
const auto &connectedAttribute = this->getAttribute(index).getConnectedAttributes();
|
|
||||||
|
|
||||||
if (connectedAttribute.empty())
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
return connectedAttribute.begin()->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
void markInputProcessed(u32 index) {
|
|
||||||
const auto &[iter, inserted] = m_processedInputs.insert(index);
|
|
||||||
if (!inserted)
|
|
||||||
throwNodeError("Recursion detected!");
|
|
||||||
}
|
|
||||||
|
|
||||||
void unmarkInputProcessed(u32 index) {
|
|
||||||
m_processedInputs.erase(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
[[noreturn]] void throwNodeError(const std::string &message) {
|
[[noreturn]] void throwNodeError(const std::string &message);
|
||||||
throw NodeError { this, message };
|
|
||||||
}
|
|
||||||
|
|
||||||
void setOverlayData(u64 address, const std::vector<u8> &data);
|
void setOverlayData(u64 address, const std::vector<u8> &data);
|
||||||
|
void setAttributes(std::vector<Attribute> attributes);
|
||||||
void setAttributes(std::vector<Attribute> attributes) {
|
|
||||||
m_attributes = std::move(attributes);
|
|
||||||
|
|
||||||
for (auto &attr : m_attributes)
|
|
||||||
attr.setParentNode(this);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <hex/api/event_manager.hpp>
|
|
||||||
#include <hex/api/imhex_api.hpp>
|
#include <hex/api/imhex_api.hpp>
|
||||||
|
|
||||||
namespace hex {
|
namespace hex {
|
||||||
@@ -24,6 +23,20 @@ namespace hex {
|
|||||||
ImHexApi::System::impl::addAutoResetObject(this);
|
ImHexApi::System::impl::addAutoResetObject(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AutoReset(const T &value) : AutoReset() {
|
||||||
|
m_value = value;
|
||||||
|
m_valid = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
AutoReset(T &&value) noexcept : AutoReset() {
|
||||||
|
m_value = std::move(value);
|
||||||
|
m_valid = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
~AutoReset() {
|
||||||
|
ImHexApi::System::impl::removeAutoResetObject(this);
|
||||||
|
}
|
||||||
|
|
||||||
T* operator->() {
|
T* operator->() {
|
||||||
return &m_value;
|
return &m_value;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,10 +2,15 @@
|
|||||||
|
|
||||||
#include <hex.hpp>
|
#include <hex.hpp>
|
||||||
|
|
||||||
|
#include <wolv/utils/expected.hpp>
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#define CRYPTO_ERROR_INVALID_KEY_LENGTH (-1)
|
||||||
|
#define CRYPTO_ERROR_INVALID_MODE (-2)
|
||||||
|
|
||||||
namespace hex::prv {
|
namespace hex::prv {
|
||||||
class Provider;
|
class Provider;
|
||||||
}
|
}
|
||||||
@@ -60,5 +65,5 @@ namespace hex::crypt {
|
|||||||
Key256Bits = 2
|
Key256Bits = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<u8> aesDecrypt(AESMode mode, KeyLength keyLength, const std::vector<u8> &key, std::array<u8, 8> nonce, std::array<u8, 8> iv, const std::vector<u8> &input);
|
wolv::util::Expected<std::vector<u8>, int> aesDecrypt(AESMode mode, KeyLength keyLength, const std::vector<u8> &key, std::array<u8, 8> nonce, std::array<u8, 8> iv, const std::vector<u8> &input);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,4 +44,7 @@ namespace hex::dbg {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool debugModeEnabled();
|
||||||
|
void setDebugModeEnabled(bool enabled);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <hex/helpers/fs.hpp>
|
#include <hex/helpers/fs.hpp>
|
||||||
|
|
||||||
|
#include <array>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace hex::paths {
|
namespace hex::paths {
|
||||||
@@ -82,8 +83,9 @@ namespace hex::paths {
|
|||||||
const static inline impl::DataPath Nodes("scripts/nodes");
|
const static inline impl::DataPath Nodes("scripts/nodes");
|
||||||
const static inline impl::DataPath Layouts("layouts");
|
const static inline impl::DataPath Layouts("layouts");
|
||||||
const static inline impl::DataPath Workspaces("workspaces");
|
const static inline impl::DataPath Workspaces("workspaces");
|
||||||
|
const static inline impl::DataPath Disassemblers("disassemblers");
|
||||||
|
|
||||||
constexpr static inline std::array<const impl::DefaultPath*, 20> All = {
|
constexpr static inline std::array<const impl::DefaultPath*, 21> All = {
|
||||||
&Config,
|
&Config,
|
||||||
&Recent,
|
&Recent,
|
||||||
|
|
||||||
@@ -106,6 +108,7 @@ namespace hex::paths {
|
|||||||
&Nodes,
|
&Nodes,
|
||||||
&Layouts,
|
&Layouts,
|
||||||
&Workspaces,
|
&Workspaces,
|
||||||
|
&Disassemblers
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
#include <fmt/format.h>
|
#include <fmt/core.h>
|
||||||
|
#include <fmt/ranges.h>
|
||||||
|
#include <fmt/ostream.h>
|
||||||
|
|
||||||
namespace hex {
|
namespace hex {
|
||||||
|
|
||||||
|
|||||||
@@ -12,10 +12,6 @@
|
|||||||
|
|
||||||
#if defined(OS_WEB)
|
#if defined(OS_WEB)
|
||||||
#include <emscripten/fetch.h>
|
#include <emscripten/fetch.h>
|
||||||
|
|
||||||
using curl_off_t = long;
|
|
||||||
#else
|
|
||||||
#include <curl/curl.h>
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef void CURL;
|
typedef void CURL;
|
||||||
@@ -121,18 +117,18 @@ namespace hex {
|
|||||||
|
|
||||||
static std::string urlDecode(const std::string &input);
|
static std::string urlDecode(const std::string &input);
|
||||||
|
|
||||||
protected:
|
void setProgress(float progress) { m_progress = progress; }
|
||||||
void setDefaultConfig();
|
bool isCanceled() const { return m_canceled; }
|
||||||
|
|
||||||
|
static size_t writeToVector(void *contents, size_t size, size_t nmemb, void *userdata);
|
||||||
|
static size_t writeToFile(void *contents, size_t size, size_t nmemb, void *userdata);
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
Result<T> executeImpl(std::vector<u8> &data);
|
Result<T> executeImpl(std::vector<u8> &data);
|
||||||
|
|
||||||
static size_t writeToVector(void *contents, size_t size, size_t nmemb, void *userdata);
|
|
||||||
static size_t writeToFile(void *contents, size_t size, size_t nmemb, void *userdata);
|
|
||||||
static int progressCallback(void *contents, curl_off_t dlTotal, curl_off_t dlNow, curl_off_t ulTotal, curl_off_t ulNow);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void checkProxyErrors();
|
static void checkProxyErrors();
|
||||||
|
void setDefaultConfig();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
#if defined(OS_WEB)
|
#if defined(OS_WEB)
|
||||||
|
|||||||
@@ -25,13 +25,16 @@
|
|||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
std::future<HttpRequest::Result<T>> HttpRequest::uploadFile(const std::fs::path &path, const std::string &mimeName) {
|
std::future<HttpRequest::Result<T>> HttpRequest::uploadFile(const std::fs::path &path, const std::string &mimeName) {
|
||||||
hex::unused(path, mimeName);
|
std::ignore = path;
|
||||||
|
std::ignore = mimeName;
|
||||||
throw std::logic_error("Not implemented");
|
throw std::logic_error("Not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
std::future<HttpRequest::Result<T>> HttpRequest::uploadFile(std::vector<u8> data, const std::string &mimeName, const std::fs::path &fileName) {
|
std::future<HttpRequest::Result<T>> HttpRequest::uploadFile(std::vector<u8> data, const std::string &mimeName, const std::fs::path &fileName) {
|
||||||
hex::unused(data, mimeName, fileName);
|
std::ignore = data;
|
||||||
|
std::ignore = mimeName;
|
||||||
|
std::ignore = fileName;
|
||||||
throw std::logic_error("Not implemented");
|
throw std::logic_error("Not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <future>
|
#include <future>
|
||||||
|
|
||||||
#include <curl/curl.h>
|
|
||||||
|
|
||||||
#include <hex/helpers/logger.hpp>
|
#include <hex/helpers/logger.hpp>
|
||||||
#include <hex/helpers/fmt.hpp>
|
#include <hex/helpers/fmt.hpp>
|
||||||
|
|
||||||
@@ -14,14 +12,26 @@
|
|||||||
|
|
||||||
namespace hex {
|
namespace hex {
|
||||||
|
|
||||||
|
namespace impl {
|
||||||
|
|
||||||
|
void setWriteFunctions(CURL *curl, wolv::io::File &file);
|
||||||
|
void setWriteFunctions(CURL *curl, std::vector<u8> &data);
|
||||||
|
void setupFileUpload(CURL *curl, wolv::io::File &file, const std::string &fileName, const std::string &mimeName);
|
||||||
|
void setupFileUpload(CURL *curl, const std::vector<u8> &data, const std::fs::path &fileName, const std::string &mimeName);
|
||||||
|
int executeCurl(CURL *curl, const std::string &url, const std::string &method, const std::string &body, std::map<std::string, std::string> &headers);
|
||||||
|
long getStatusCode(CURL *curl);
|
||||||
|
std::string getStatusText(int result);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
std::future<HttpRequest::Result<T>> HttpRequest::downloadFile(const std::fs::path &path) {
|
std::future<HttpRequest::Result<T>> HttpRequest::downloadFile(const std::fs::path &path) {
|
||||||
return std::async(std::launch::async, [this, path] {
|
return std::async(std::launch::async, [this, path] {
|
||||||
std::vector<u8> response;
|
std::vector<u8> response;
|
||||||
|
|
||||||
wolv::io::File file(path, wolv::io::File::Mode::Create);
|
wolv::io::File file(path, wolv::io::File::Mode::Create);
|
||||||
curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, writeToFile);
|
impl::setWriteFunctions(m_curl, file);
|
||||||
curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &file);
|
|
||||||
|
|
||||||
return this->executeImpl<T>(response);
|
return this->executeImpl<T>(response);
|
||||||
});
|
});
|
||||||
@@ -31,40 +41,12 @@
|
|||||||
std::future<HttpRequest::Result<T>> HttpRequest::uploadFile(const std::fs::path &path, const std::string &mimeName) {
|
std::future<HttpRequest::Result<T>> HttpRequest::uploadFile(const std::fs::path &path, const std::string &mimeName) {
|
||||||
return std::async(std::launch::async, [this, path, mimeName]{
|
return std::async(std::launch::async, [this, path, mimeName]{
|
||||||
auto fileName = wolv::util::toUTF8String(path.filename());
|
auto fileName = wolv::util::toUTF8String(path.filename());
|
||||||
|
|
||||||
curl_mime *mime = curl_mime_init(m_curl);
|
|
||||||
curl_mimepart *part = curl_mime_addpart(mime);
|
|
||||||
|
|
||||||
wolv::io::File file(path, wolv::io::File::Mode::Read);
|
wolv::io::File file(path, wolv::io::File::Mode::Read);
|
||||||
|
|
||||||
curl_mime_data_cb(part, file.getSize(),
|
impl::setupFileUpload(m_curl, file, fileName, mimeName);
|
||||||
[](char *buffer, size_t size, size_t nitems, void *arg) -> size_t {
|
|
||||||
auto handle = static_cast<FILE*>(arg);
|
|
||||||
|
|
||||||
return fread(buffer, size, nitems, handle);
|
|
||||||
},
|
|
||||||
[](void *arg, curl_off_t offset, int origin) -> int {
|
|
||||||
auto handle = static_cast<FILE*>(arg);
|
|
||||||
|
|
||||||
if (fseek(handle, offset, origin) != 0)
|
|
||||||
return CURL_SEEKFUNC_CANTSEEK;
|
|
||||||
else
|
|
||||||
return CURL_SEEKFUNC_OK;
|
|
||||||
},
|
|
||||||
[](void *arg) {
|
|
||||||
auto handle = static_cast<FILE*>(arg);
|
|
||||||
|
|
||||||
fclose(handle);
|
|
||||||
},
|
|
||||||
file.getHandle());
|
|
||||||
curl_mime_filename(part, fileName.c_str());
|
|
||||||
curl_mime_name(part, mimeName.c_str());
|
|
||||||
|
|
||||||
curl_easy_setopt(m_curl, CURLOPT_MIMEPOST, mime);
|
|
||||||
|
|
||||||
std::vector<u8> responseData;
|
std::vector<u8> responseData;
|
||||||
curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, writeToVector);
|
impl::setWriteFunctions(m_curl, responseData);
|
||||||
curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &responseData);
|
|
||||||
|
|
||||||
return this->executeImpl<T>(responseData);
|
return this->executeImpl<T>(responseData);
|
||||||
});
|
});
|
||||||
@@ -73,19 +55,10 @@
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
std::future<HttpRequest::Result<T>> HttpRequest::uploadFile(std::vector<u8> data, const std::string &mimeName, const std::fs::path &fileName) {
|
std::future<HttpRequest::Result<T>> HttpRequest::uploadFile(std::vector<u8> data, const std::string &mimeName, const std::fs::path &fileName) {
|
||||||
return std::async(std::launch::async, [this, data = std::move(data), mimeName, fileName]{
|
return std::async(std::launch::async, [this, data = std::move(data), mimeName, fileName]{
|
||||||
curl_mime *mime = curl_mime_init(m_curl);
|
impl::setupFileUpload(m_curl, data, fileName, mimeName);
|
||||||
curl_mimepart *part = curl_mime_addpart(mime);
|
|
||||||
|
|
||||||
curl_mime_data(part, reinterpret_cast<const char *>(data.data()), data.size());
|
|
||||||
auto fileNameStr = wolv::util::toUTF8String(fileName.filename());
|
|
||||||
curl_mime_filename(part, fileNameStr.c_str());
|
|
||||||
curl_mime_name(part, mimeName.c_str());
|
|
||||||
|
|
||||||
curl_easy_setopt(m_curl, CURLOPT_MIMEPOST, mime);
|
|
||||||
|
|
||||||
std::vector<u8> responseData;
|
std::vector<u8> responseData;
|
||||||
curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, writeToVector);
|
impl::setWriteFunctions(m_curl, responseData);
|
||||||
curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &responseData);
|
|
||||||
|
|
||||||
return this->executeImpl<T>(responseData);
|
return this->executeImpl<T>(responseData);
|
||||||
});
|
});
|
||||||
@@ -96,8 +69,7 @@
|
|||||||
return std::async(std::launch::async, [this] {
|
return std::async(std::launch::async, [this] {
|
||||||
|
|
||||||
std::vector<u8> responseData;
|
std::vector<u8> responseData;
|
||||||
curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, writeToVector);
|
impl::setWriteFunctions(m_curl, responseData);
|
||||||
curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &responseData);
|
|
||||||
|
|
||||||
return this->executeImpl<T>(responseData);
|
return this->executeImpl<T>(responseData);
|
||||||
});
|
});
|
||||||
@@ -105,43 +77,16 @@
|
|||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
HttpRequest::Result<T> HttpRequest::executeImpl(std::vector<u8> &data) {
|
HttpRequest::Result<T> HttpRequest::executeImpl(std::vector<u8> &data) {
|
||||||
curl_easy_setopt(m_curl, CURLOPT_URL, m_url.c_str());
|
|
||||||
curl_easy_setopt(m_curl, CURLOPT_CUSTOMREQUEST, m_method.c_str());
|
|
||||||
|
|
||||||
setDefaultConfig();
|
setDefaultConfig();
|
||||||
|
|
||||||
if (!m_body.empty()) {
|
std::scoped_lock lock(m_transmissionMutex);
|
||||||
curl_easy_setopt(m_curl, CURLOPT_POSTFIELDS, m_body.c_str());
|
|
||||||
|
if (auto result = impl::executeCurl(m_curl, m_url, m_method, m_body, m_headers); result != 0) {
|
||||||
|
log::error("Http request '{0} {1}' failed with error {2}: '{3}'", m_method, m_url, u32(result), impl::getStatusText(result));
|
||||||
|
checkProxyErrors();
|
||||||
}
|
}
|
||||||
|
|
||||||
curl_slist *headers = nullptr;
|
return Result<T>(impl::getStatusCode(m_curl), { data.begin(), data.end() });
|
||||||
headers = curl_slist_append(headers, "Cache-Control: no-cache");
|
|
||||||
ON_SCOPE_EXIT { curl_slist_free_all(headers); };
|
|
||||||
|
|
||||||
for (auto &[key, value] : m_headers) {
|
|
||||||
std::string header = hex::format("{}: {}", key, value);
|
|
||||||
headers = curl_slist_append(headers, header.c_str());
|
|
||||||
}
|
|
||||||
curl_easy_setopt(m_curl, CURLOPT_HTTPHEADER, headers);
|
|
||||||
|
|
||||||
{
|
|
||||||
std::scoped_lock lock(m_transmissionMutex);
|
|
||||||
|
|
||||||
auto result = curl_easy_perform(m_curl);
|
|
||||||
if (result != CURLE_OK){
|
|
||||||
char *url = nullptr;
|
|
||||||
curl_easy_getinfo(m_curl, CURLINFO_EFFECTIVE_URL, &url);
|
|
||||||
log::error("Http request '{0} {1}' failed with error {2}: '{3}'", m_method, url, u32(result), curl_easy_strerror(result));
|
|
||||||
checkProxyErrors();
|
|
||||||
|
|
||||||
return { };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
long statusCode = 0;
|
|
||||||
curl_easy_getinfo(m_curl, CURLINFO_RESPONSE_CODE, &statusCode);
|
|
||||||
|
|
||||||
return Result<T>(statusCode, { data.begin(), data.end() });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
namespace hex {
|
|
||||||
|
|
||||||
void unused(auto && ... x) {
|
|
||||||
((void)x, ...);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
124
lib/libimhex/include/hex/helpers/keys.hpp
Normal file
124
lib/libimhex/include/hex/helpers/keys.hpp
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
enum class Keys {
|
||||||
|
#else
|
||||||
|
enum Keys {
|
||||||
|
#endif
|
||||||
|
Invalid,
|
||||||
|
Space,
|
||||||
|
Apostrophe,
|
||||||
|
Comma,
|
||||||
|
Minus,
|
||||||
|
Period,
|
||||||
|
Slash,
|
||||||
|
Num0,
|
||||||
|
Num1,
|
||||||
|
Num2,
|
||||||
|
Num3,
|
||||||
|
Num4,
|
||||||
|
Num5,
|
||||||
|
Num6,
|
||||||
|
Num7,
|
||||||
|
Num8,
|
||||||
|
Num9,
|
||||||
|
Semicolon,
|
||||||
|
Equals,
|
||||||
|
A,
|
||||||
|
B,
|
||||||
|
C,
|
||||||
|
D,
|
||||||
|
E,
|
||||||
|
F,
|
||||||
|
G,
|
||||||
|
H,
|
||||||
|
I,
|
||||||
|
J,
|
||||||
|
K,
|
||||||
|
L,
|
||||||
|
M,
|
||||||
|
N,
|
||||||
|
O,
|
||||||
|
P,
|
||||||
|
Q,
|
||||||
|
R,
|
||||||
|
S,
|
||||||
|
T,
|
||||||
|
U,
|
||||||
|
V,
|
||||||
|
W,
|
||||||
|
X,
|
||||||
|
Y,
|
||||||
|
Z,
|
||||||
|
LeftBracket,
|
||||||
|
Backslash,
|
||||||
|
RightBracket,
|
||||||
|
GraveAccent,
|
||||||
|
World1,
|
||||||
|
World2,
|
||||||
|
Escape,
|
||||||
|
Enter,
|
||||||
|
Tab,
|
||||||
|
Backspace,
|
||||||
|
Insert,
|
||||||
|
Delete,
|
||||||
|
Right,
|
||||||
|
Left,
|
||||||
|
Down,
|
||||||
|
Up,
|
||||||
|
PageUp,
|
||||||
|
PageDown,
|
||||||
|
Home,
|
||||||
|
End,
|
||||||
|
CapsLock,
|
||||||
|
ScrollLock,
|
||||||
|
NumLock,
|
||||||
|
PrintScreen,
|
||||||
|
Pause,
|
||||||
|
F1,
|
||||||
|
F2,
|
||||||
|
F3,
|
||||||
|
F4,
|
||||||
|
F5,
|
||||||
|
F6,
|
||||||
|
F7,
|
||||||
|
F8,
|
||||||
|
F9,
|
||||||
|
F10,
|
||||||
|
F11,
|
||||||
|
F12,
|
||||||
|
F13,
|
||||||
|
F14,
|
||||||
|
F15,
|
||||||
|
F16,
|
||||||
|
F17,
|
||||||
|
F18,
|
||||||
|
F19,
|
||||||
|
F20,
|
||||||
|
F21,
|
||||||
|
F22,
|
||||||
|
F23,
|
||||||
|
F24,
|
||||||
|
F25,
|
||||||
|
KeyPad0,
|
||||||
|
KeyPad1,
|
||||||
|
KeyPad2,
|
||||||
|
KeyPad3,
|
||||||
|
KeyPad4,
|
||||||
|
KeyPad5,
|
||||||
|
KeyPad6,
|
||||||
|
KeyPad7,
|
||||||
|
KeyPad8,
|
||||||
|
KeyPad9,
|
||||||
|
KeyPadDecimal,
|
||||||
|
KeyPadDivide,
|
||||||
|
KeyPadMultiply,
|
||||||
|
KeyPadSubtract,
|
||||||
|
KeyPadAdd,
|
||||||
|
KeyPadEnter,
|
||||||
|
KeyPadEqual,
|
||||||
|
Menu
|
||||||
|
};
|
||||||
|
|
||||||
|
enum Keys scanCodeToKey(int scanCode);
|
||||||
|
int keyToScanCode(enum Keys key);
|
||||||
@@ -9,9 +9,9 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <span>
|
#include <span>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <numbers>
|
||||||
|
|
||||||
#include <opengl_support.h>
|
#include <opengl_support.h>
|
||||||
#include <GLFW/glfw3.h>
|
|
||||||
#include "imgui.h"
|
#include "imgui.h"
|
||||||
|
|
||||||
namespace hex::gl {
|
namespace hex::gl {
|
||||||
@@ -188,43 +188,43 @@ namespace hex::gl {
|
|||||||
|
|
||||||
|
|
||||||
T &getElement(int row,int col) {
|
T &getElement(int row,int col) {
|
||||||
return this->mat[row*Columns+col];
|
return this->mat[row * Columns+col];
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<T,Rows> getColumn(int col) {
|
Vector<T,Rows> getColumn(int col) {
|
||||||
Vector<T,Rows> result;
|
Vector<T,Rows> result;
|
||||||
for (size_t i = 0; i < Rows; i++)
|
for (size_t i = 0; i < Rows; i++)
|
||||||
result[i] = this->mat[i*Columns+col];
|
result[i] = this->mat[i * Columns + col];
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<T,Columns> getRow(int row) {
|
Vector<T,Columns> getRow(int row) {
|
||||||
Vector<T,Columns> result;
|
Vector<T,Columns> result;
|
||||||
for (size_t i = 0; i < Columns; i++)
|
for (size_t i = 0; i < Columns; i++)
|
||||||
result[i] = this->mat[row*Columns+i];
|
result[i] = this->mat[row * Columns+i];
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateRow(int row, Vector<T,Columns> values) {
|
void updateRow(int row, Vector<T,Columns> values) {
|
||||||
for (size_t i = 0; i < Columns; i++)
|
for (size_t i = 0; i < Columns; i++)
|
||||||
this->mat[row*Columns+i] = values[i];
|
this->mat[row * Columns + i] = values[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateColumn(int col, Vector<T,Rows> values) {
|
void updateColumn(int col, Vector<T,Rows> values) {
|
||||||
for (size_t i = 0; i < Rows; i++)
|
for (size_t i = 0; i < Rows; i++)
|
||||||
this->mat[i*Columns+col] = values[i];
|
this->mat[i * Columns + col] = values[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateElement( int row,int col, T value) {
|
void updateElement(int row, int col, T value) {
|
||||||
this->mat[row*Columns + col] = value;
|
this->mat[row * Columns + col] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
T &operator()( const int &row,const int &col) {
|
T &operator()(const unsigned &row, const unsigned &col) {
|
||||||
return this->mat[row*Columns + col];
|
return this->mat[row * Columns + col];
|
||||||
}
|
}
|
||||||
|
|
||||||
const T &operator()(const unsigned& row,const unsigned& col ) const {
|
const T &operator()(const unsigned &row, const unsigned &col) const {
|
||||||
return this->mat[row*Columns + col];
|
return this->mat[row * Columns + col];
|
||||||
}
|
}
|
||||||
|
|
||||||
Matrix& operator=(const Matrix& A) {
|
Matrix& operator=(const Matrix& A) {
|
||||||
@@ -242,7 +242,7 @@ namespace hex::gl {
|
|||||||
|
|
||||||
for (size_t i = 0; i < Rows; i++)
|
for (size_t i = 0; i < Rows; i++)
|
||||||
for (size_t j = 0; j < Columns; j++)
|
for (size_t j = 0; j < Columns; j++)
|
||||||
result(i, j) = this->mat[i*Columns+j] + A(i, j);
|
result(i, j) = this->mat[i * Columns + j] + A(i, j);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -251,7 +251,7 @@ namespace hex::gl {
|
|||||||
|
|
||||||
for (size_t i = 0; i < Rows; i++)
|
for (size_t i = 0; i < Rows; i++)
|
||||||
for (size_t j = 0; j < Columns; j++)
|
for (size_t j = 0; j < Columns; j++)
|
||||||
result(i, j) = this->mat[i*Columns+j] - A(i, j);
|
result(i, j) = this->mat[i * Columns + j] - A(i, j);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -268,7 +268,7 @@ namespace hex::gl {
|
|||||||
Matrix t(0);
|
Matrix t(0);
|
||||||
for (size_t i = 0; i < Columns; i++)
|
for (size_t i = 0; i < Columns; i++)
|
||||||
for (size_t j = 0; j < Rows; j++)
|
for (size_t j = 0; j < Rows; j++)
|
||||||
t.updateElement(i, j, this->mat[j*Rows+i]);
|
t.updateElement(i, j, this->mat[j * Rows + i]);
|
||||||
|
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
@@ -400,8 +400,8 @@ namespace hex::gl {
|
|||||||
|
|
||||||
T Sx, Cx, Sy, Cy, Sz, Cz;
|
T Sx, Cx, Sy, Cy, Sz, Cz;
|
||||||
Vector<T,3> angles = ypr;
|
Vector<T,3> angles = ypr;
|
||||||
if(!radians)
|
if (!radians)
|
||||||
angles *= M_PI/180;
|
angles *= std::numbers::pi_v<T> / 180;
|
||||||
|
|
||||||
Sx = -sin(angles[0]); Cx = cos(angles[0]);
|
Sx = -sin(angles[0]); Cx = cos(angles[0]);
|
||||||
Sy = -sin(angles[1]); Cy = cos(angles[1]);
|
Sy = -sin(angles[1]); Cy = cos(angles[1]);
|
||||||
@@ -524,7 +524,7 @@ namespace hex::gl {
|
|||||||
Vector<T,3> rotationVector3 = {{rotationVector[0], rotationVector[1], rotationVector[2]}};
|
Vector<T,3> rotationVector3 = {{rotationVector[0], rotationVector[1], rotationVector[2]}};
|
||||||
T theta = rotationVector3.magnitude();
|
T theta = rotationVector3.magnitude();
|
||||||
if (!radians)
|
if (!radians)
|
||||||
theta *= M_PI / 180;
|
theta *= std::numbers::pi / 180;
|
||||||
Vector<T,3> axis = rotationVector3;
|
Vector<T,3> axis = rotationVector3;
|
||||||
if (theta != 0)
|
if (theta != 0)
|
||||||
axis = axis.normalize();
|
axis = axis.normalize();
|
||||||
@@ -807,16 +807,18 @@ namespace hex::gl {
|
|||||||
void bind() const;
|
void bind() const;
|
||||||
void unbind() const;
|
void unbind() const;
|
||||||
|
|
||||||
|
bool isValid() const { return m_program != 0; }
|
||||||
|
|
||||||
void setUniform(std::string_view name, const int &value);
|
void setUniform(std::string_view name, const int &value);
|
||||||
void setUniform(std::string_view name, const float &value);
|
void setUniform(std::string_view name, const float &value);
|
||||||
|
|
||||||
template<size_t N>
|
template<size_t N>
|
||||||
void setUniform(std::string_view name, const Vector<float, N> &value) {
|
void setUniform(std::string_view name, const Vector<float, N> &value) {
|
||||||
if (N == 2)
|
if constexpr (N == 2)
|
||||||
glUniform2f(getUniformLocation(name), value[0], value[1]);
|
glUniform2f(getUniformLocation(name), value[0], value[1]);
|
||||||
else if (N == 3)
|
else if constexpr (N == 3)
|
||||||
glUniform3f(getUniformLocation(name), value[0], value[1], value[2]);
|
glUniform3f(getUniformLocation(name), value[0], value[1], value[2]);
|
||||||
else if (N == 4)
|
else if constexpr (N == 4)
|
||||||
glUniform4f(getUniformLocation(name), value[0], value[1], value[2],value[3]);
|
glUniform4f(getUniformLocation(name), value[0], value[1], value[2],value[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,11 @@ namespace hex {
|
|||||||
MissingEOF
|
MissingEOF
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class PatchKind {
|
||||||
|
IPS,
|
||||||
|
IPS32
|
||||||
|
};
|
||||||
|
|
||||||
class Patches {
|
class Patches {
|
||||||
public:
|
public:
|
||||||
Patches() = default;
|
Patches() = default;
|
||||||
|
|||||||
36
lib/libimhex/include/hex/helpers/semantic_version.hpp
Normal file
36
lib/libimhex/include/hex/helpers/semantic_version.hpp
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <hex.hpp>
|
||||||
|
|
||||||
|
#include <compare>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace hex {
|
||||||
|
|
||||||
|
class SemanticVersion {
|
||||||
|
public:
|
||||||
|
SemanticVersion() = default;
|
||||||
|
SemanticVersion(std::string version);
|
||||||
|
SemanticVersion(std::string_view version);
|
||||||
|
SemanticVersion(const char *version);
|
||||||
|
|
||||||
|
std::strong_ordering operator<=>(const SemanticVersion &) const;
|
||||||
|
bool operator==(const SemanticVersion &other) const;
|
||||||
|
|
||||||
|
u32 major() const;
|
||||||
|
u32 minor() const;
|
||||||
|
u32 patch() const;
|
||||||
|
bool nightly() const;
|
||||||
|
const std::string& buildType() const;
|
||||||
|
|
||||||
|
bool isValid() const;
|
||||||
|
|
||||||
|
std::string get(bool withBuildType = true) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<std::string> m_parts;
|
||||||
|
std::string m_buildType;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
@@ -29,7 +29,7 @@ namespace hex {
|
|||||||
void close();
|
void close();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief get the error string explaining the error that occured when opening the file.
|
* @brief get the error string explaining the error that occurred when opening the file.
|
||||||
* This error is a combination of the tar error and the native file open error
|
* This error is a combination of the tar error and the native file open error
|
||||||
*/
|
*/
|
||||||
std::string getOpenErrorString() const;
|
std::string getOpenErrorString() const;
|
||||||
@@ -59,4 +59,4 @@ namespace hex {
|
|||||||
int m_fileOpenErrno = 0;
|
int m_fileOpenErrno = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,18 +4,12 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
#include <concepts>
|
#include <concepts>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
using u8 = std::uint8_t;
|
#include <wolv/types.hpp>
|
||||||
using u16 = std::uint16_t;
|
|
||||||
using u32 = std::uint32_t;
|
|
||||||
using u64 = std::uint64_t;
|
|
||||||
using u128 = __uint128_t;
|
|
||||||
|
|
||||||
using i8 = std::int8_t;
|
using namespace wolv::unsigned_integers;
|
||||||
using i16 = std::int16_t;
|
using namespace wolv::signed_integers;
|
||||||
using i32 = std::int32_t;
|
|
||||||
using i64 = std::int64_t;
|
|
||||||
using i128 = __int128_t;
|
|
||||||
|
|
||||||
using color_t = u32;
|
using color_t = u32;
|
||||||
|
|
||||||
@@ -61,6 +55,10 @@ namespace hex {
|
|||||||
constexpr static Region Invalid() {
|
constexpr static Region Invalid() {
|
||||||
return { 0, 0 };
|
return { 0, 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
constexpr bool operator<(const Region &other) const {
|
||||||
|
return this->address < other.address;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
#include <hex/helpers/utils_linux.hpp>
|
#include <hex/helpers/utils_linux.hpp>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct ImVec2;
|
#include <imgui.h>
|
||||||
|
|
||||||
namespace hex {
|
namespace hex {
|
||||||
|
|
||||||
@@ -34,6 +34,29 @@ namespace hex {
|
|||||||
class Provider;
|
class Provider;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
[[nodiscard]] std::vector<std::vector<T>> sampleChannels(const std::vector<T> &data, size_t count, size_t channels) {
|
||||||
|
if (channels == 0) return {};
|
||||||
|
size_t signalLength = std::max<double>(1.0, double(data.size()) / channels);
|
||||||
|
|
||||||
|
size_t stride = std::max(1.0, double(signalLength) / count);
|
||||||
|
|
||||||
|
std::vector<std::vector<T>> result;
|
||||||
|
result.resize(channels);
|
||||||
|
for (size_t i = 0; i < channels; i++) {
|
||||||
|
result[i].reserve(count);
|
||||||
|
}
|
||||||
|
result.reserve(count);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < data.size(); i += stride) {
|
||||||
|
for (size_t j = 0; j < channels; j++) {
|
||||||
|
result[j].push_back(data[i + j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
[[nodiscard]] std::vector<T> sampleData(const std::vector<T> &data, size_t count) {
|
[[nodiscard]] std::vector<T> sampleData(const std::vector<T> &data, size_t count) {
|
||||||
size_t stride = std::max(1.0, double(data.size()) / count);
|
size_t stride = std::max(1.0, double(data.size()) / count);
|
||||||
@@ -86,13 +109,13 @@ namespace hex {
|
|||||||
[[nodiscard]] std::wstring utf8ToUtf16(const std::string& utf8);
|
[[nodiscard]] std::wstring utf8ToUtf16(const std::string& utf8);
|
||||||
[[nodiscard]] std::string utf16ToUtf8(const std::wstring& utf16);
|
[[nodiscard]] std::string utf16ToUtf8(const std::wstring& utf16);
|
||||||
|
|
||||||
[[nodiscard]] constexpr u64 extract(u8 from, u8 to, const std::unsigned_integral auto &value) {
|
[[nodiscard]] constexpr u64 extract(u8 from, u8 to, const auto &value) {
|
||||||
if (from < to) std::swap(from, to);
|
if (from < to) std::swap(from, to);
|
||||||
|
|
||||||
using ValueType = std::remove_cvref_t<decltype(value)>;
|
using ValueType = std::remove_cvref_t<decltype(value)>;
|
||||||
ValueType mask = (std::numeric_limits<ValueType>::max() >> (((sizeof(value) * 8) - 1) - (from - to))) << to;
|
ValueType mask = (std::numeric_limits<ValueType>::max() >> (((sizeof(value) * 8) - 1) - (from - to))) << to;
|
||||||
|
|
||||||
return (value & mask) >> to;
|
return u64((value & mask) >> to);
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] inline u64 extract(u32 from, u32 to, const std::vector<u8> &bytes) {
|
[[nodiscard]] inline u64 extract(u32 from, u32 to, const std::vector<u8> &bytes) {
|
||||||
@@ -255,20 +278,20 @@ namespace hex {
|
|||||||
|
|
||||||
std::string result;
|
std::string result;
|
||||||
for (i16 bit = hex::bit_width(number) - 1; bit >= 0; bit -= 1)
|
for (i16 bit = hex::bit_width(number) - 1; bit >= 0; bit -= 1)
|
||||||
result += (number & (0b1 << bit)) == 0 ? '0' : '1';
|
result += (number & (0b1LLU << bit)) == 0 ? '0' : '1';
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] float float16ToFloat32(u16 float16);
|
[[nodiscard]] float float16ToFloat32(u16 float16);
|
||||||
|
|
||||||
[[nodiscard]] inline bool equalsIgnoreCase(const std::string &left, const std::string &right) {
|
[[nodiscard]] inline bool equalsIgnoreCase(std::string_view left, std::string_view right) {
|
||||||
return std::equal(left.begin(), left.end(), right.begin(), right.end(), [](char a, char b) {
|
return std::equal(left.begin(), left.end(), right.begin(), right.end(), [](char a, char b) {
|
||||||
return tolower(a) == tolower(b);
|
return tolower(a) == tolower(b);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] inline bool containsIgnoreCase(const std::string &a, const std::string &b) {
|
[[nodiscard]] inline bool containsIgnoreCase(std::string_view a, std::string_view b) {
|
||||||
auto iter = std::search(a.begin(), a.end(), b.begin(), b.end(), [](char ch1, char ch2) {
|
auto iter = std::search(a.begin(), a.end(), b.begin(), b.end(), [](char ch1, char ch2) {
|
||||||
return std::toupper(ch1) == std::toupper(ch2);
|
return std::toupper(ch1) == std::toupper(ch2);
|
||||||
});
|
});
|
||||||
@@ -317,4 +340,6 @@ namespace hex {
|
|||||||
*/
|
*/
|
||||||
[[nodiscard]] void* getContainingModule(void* symbol);
|
[[nodiscard]] void* getContainingModule(void* symbol);
|
||||||
|
|
||||||
|
[[nodiscard]] std::optional<ImColor> blendColors(const std::optional<ImColor> &a, const std::optional<ImColor> &b);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <hex/helpers/keys.hpp>
|
||||||
|
|
||||||
#if defined(OS_MACOS)
|
#if defined(OS_MACOS)
|
||||||
|
|
||||||
struct GLFWwindow;
|
struct GLFWwindow;
|
||||||
@@ -17,8 +19,15 @@
|
|||||||
void enumerateFontsMacos();
|
void enumerateFontsMacos();
|
||||||
|
|
||||||
void macosHandleTitlebarDoubleClickGesture(GLFWwindow *window);
|
void macosHandleTitlebarDoubleClickGesture(GLFWwindow *window);
|
||||||
|
void macosSetWindowMovable(GLFWwindow *window, bool movable);
|
||||||
bool macosIsWindowBeingResizedByUser(GLFWwindow *window);
|
bool macosIsWindowBeingResizedByUser(GLFWwindow *window);
|
||||||
void macosMarkContentEdited(GLFWwindow *window, bool edited = true);
|
void macosMarkContentEdited(GLFWwindow *window, bool edited = true);
|
||||||
|
|
||||||
|
void macosGetKey(Keys key, int *output);
|
||||||
|
|
||||||
|
bool macosIsMainInstance();
|
||||||
|
void macosSendMessageToMainInstance(const unsigned char *data, size_t size);
|
||||||
|
void macosInstallEventListener();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -13,6 +13,13 @@
|
|||||||
#include <wolv/utils/preproc.hpp>
|
#include <wolv/utils/preproc.hpp>
|
||||||
#include <wolv/utils/guards.hpp>
|
#include <wolv/utils/guards.hpp>
|
||||||
|
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#include <windows.h>
|
||||||
|
#define PLUGIN_ENTRY_POINT extern "C" BOOL WINAPI DllMain(HINSTANCE, DWORD, LPVOID) { return TRUE; }
|
||||||
|
#else
|
||||||
|
#define PLUGIN_ENTRY_POINT
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
struct PluginFunctionHelperInstantiation {};
|
struct PluginFunctionHelperInstantiation {};
|
||||||
}
|
}
|
||||||
@@ -37,28 +44,51 @@ void* PluginSubCommandsFunctionHelper<T>::getSubCommands() {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[maybe_unused]] static auto& getFeaturesImpl() {
|
||||||
|
static std::vector<hex::Feature> features;
|
||||||
|
return features;
|
||||||
|
}
|
||||||
|
|
||||||
#if defined (IMHEX_STATIC_LINK_PLUGINS)
|
#if defined (IMHEX_STATIC_LINK_PLUGINS)
|
||||||
#define IMHEX_PLUGIN_VISIBILITY_PREFIX static
|
#define IMHEX_PLUGIN_VISIBILITY_PREFIX static
|
||||||
#else
|
#else
|
||||||
#define IMHEX_PLUGIN_VISIBILITY_PREFIX extern "C" [[gnu::visibility("default")]]
|
#if defined(_MSC_VER)
|
||||||
|
#define IMHEX_PLUGIN_VISIBILITY_PREFIX extern "C" __declspec(dllexport)
|
||||||
|
#else
|
||||||
|
#define IMHEX_PLUGIN_VISIBILITY_PREFIX extern "C" [[gnu::visibility("default")]]
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define IMHEX_FEATURE_ENABLED(feature) WOLV_TOKEN_CONCAT(WOLV_TOKEN_CONCAT(WOLV_TOKEN_CONCAT(IMHEX_PLUGIN_, IMHEX_PLUGIN_NAME), _FEATURE_), feature)
|
||||||
|
#define IMHEX_DEFINE_PLUGIN_FEATURES() IMHEX_DEFINE_PLUGIN_FEATURES_IMPL()
|
||||||
|
#define IMHEX_DEFINE_PLUGIN_FEATURES_IMPL() \
|
||||||
|
template<> \
|
||||||
|
struct PluginFeatureFunctionHelper<PluginFunctionHelperInstantiation> { \
|
||||||
|
static void* getFeatures(); \
|
||||||
|
}; \
|
||||||
|
void* PluginFeatureFunctionHelper<PluginFunctionHelperInstantiation>::getFeatures() { \
|
||||||
|
return &getFeaturesImpl(); \
|
||||||
|
} \
|
||||||
|
static auto initFeatures = [] { getFeaturesImpl() = std::vector<hex::Feature>({ IMHEX_PLUGIN_FEATURES_CONTENT }); return 0; }()
|
||||||
|
|
||||||
|
#define IMHEX_PLUGIN_FEATURES ::getFeaturesImpl()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This macro is used to define all the required entry points for a plugin.
|
* This macro is used to define all the required entry points for a plugin.
|
||||||
* Name, Author and Description will be displayed in the in the plugin list on the Welcome screen.
|
* Name, Author and Description will be displayed in the plugin list on the Welcome screen.
|
||||||
*/
|
*/
|
||||||
#define IMHEX_PLUGIN_SETUP(name, author, description) IMHEX_PLUGIN_SETUP_IMPL(name, author, description)
|
#define IMHEX_PLUGIN_SETUP(name, author, description) IMHEX_PLUGIN_SETUP_IMPL(name, author, description)
|
||||||
#define IMHEX_LIBRARY_SETUP(name) IMHEX_LIBRARY_SETUP_IMPL(name)
|
#define IMHEX_LIBRARY_SETUP(name) IMHEX_LIBRARY_SETUP_IMPL(name)
|
||||||
|
|
||||||
#define IMHEX_LIBRARY_SETUP_IMPL(name) \
|
#define IMHEX_LIBRARY_SETUP_IMPL(name) \
|
||||||
namespace { static struct EXIT_HANDLER { ~EXIT_HANDLER() { hex::log::debug("Unloaded library '{}'", name); } } HANDLER; } \
|
namespace { static struct EXIT_HANDLER { ~EXIT_HANDLER() { hex::log::info("Unloaded library '{}'", name); } } HANDLER; } \
|
||||||
IMHEX_PLUGIN_VISIBILITY_PREFIX void WOLV_TOKEN_CONCAT(initializeLibrary_, IMHEX_PLUGIN_NAME)(); \
|
IMHEX_PLUGIN_VISIBILITY_PREFIX void WOLV_TOKEN_CONCAT(initializeLibrary_, IMHEX_PLUGIN_NAME)(); \
|
||||||
IMHEX_PLUGIN_VISIBILITY_PREFIX const char *WOLV_TOKEN_CONCAT(getLibraryName_, IMHEX_PLUGIN_NAME)() { return name; } \
|
IMHEX_PLUGIN_VISIBILITY_PREFIX const char *WOLV_TOKEN_CONCAT(getLibraryName_, IMHEX_PLUGIN_NAME)() { return name; } \
|
||||||
IMHEX_PLUGIN_VISIBILITY_PREFIX void WOLV_TOKEN_CONCAT(setImGuiContext_, IMHEX_PLUGIN_NAME)(ImGuiContext *ctx) { \
|
IMHEX_PLUGIN_VISIBILITY_PREFIX void WOLV_TOKEN_CONCAT(setImGuiContext_, IMHEX_PLUGIN_NAME)(ImGuiContext *ctx) { \
|
||||||
ImGui::SetCurrentContext(ctx); \
|
ImGui::SetCurrentContext(ctx); \
|
||||||
GImGui = ctx; \
|
GImGui = ctx; \
|
||||||
} \
|
} \
|
||||||
extern "C" [[gnu::visibility("default")]] void WOLV_TOKEN_CONCAT(forceLinkPlugin_, IMHEX_PLUGIN_NAME)() { \
|
extern "C" void WOLV_TOKEN_CONCAT(forceLinkPlugin_, IMHEX_PLUGIN_NAME)() { \
|
||||||
hex::PluginManager::addPlugin(name, hex::PluginFunctions { \
|
hex::PluginManager::addPlugin(name, hex::PluginFunctions { \
|
||||||
nullptr, \
|
nullptr, \
|
||||||
WOLV_TOKEN_CONCAT(initializeLibrary_, IMHEX_PLUGIN_NAME), \
|
WOLV_TOKEN_CONCAT(initializeLibrary_, IMHEX_PLUGIN_NAME), \
|
||||||
@@ -73,6 +103,7 @@ void* PluginSubCommandsFunctionHelper<T>::getSubCommands() {
|
|||||||
nullptr \
|
nullptr \
|
||||||
}); \
|
}); \
|
||||||
} \
|
} \
|
||||||
|
PLUGIN_ENTRY_POINT \
|
||||||
IMHEX_PLUGIN_VISIBILITY_PREFIX void WOLV_TOKEN_CONCAT(initializeLibrary_, IMHEX_PLUGIN_NAME)()
|
IMHEX_PLUGIN_VISIBILITY_PREFIX void WOLV_TOKEN_CONCAT(initializeLibrary_, IMHEX_PLUGIN_NAME)()
|
||||||
|
|
||||||
#define IMHEX_PLUGIN_SETUP_IMPL(name, author, description) \
|
#define IMHEX_PLUGIN_SETUP_IMPL(name, author, description) \
|
||||||
@@ -85,6 +116,7 @@ void* PluginSubCommandsFunctionHelper<T>::getSubCommands() {
|
|||||||
ImGui::SetCurrentContext(ctx); \
|
ImGui::SetCurrentContext(ctx); \
|
||||||
GImGui = ctx; \
|
GImGui = ctx; \
|
||||||
} \
|
} \
|
||||||
|
IMHEX_DEFINE_PLUGIN_FEATURES(); \
|
||||||
IMHEX_PLUGIN_VISIBILITY_PREFIX void* getFeatures() { \
|
IMHEX_PLUGIN_VISIBILITY_PREFIX void* getFeatures() { \
|
||||||
return PluginFeatureFunctionHelper<PluginFunctionHelperInstantiation>::getFeatures(); \
|
return PluginFeatureFunctionHelper<PluginFunctionHelperInstantiation>::getFeatures(); \
|
||||||
} \
|
} \
|
||||||
@@ -92,7 +124,7 @@ void* PluginSubCommandsFunctionHelper<T>::getSubCommands() {
|
|||||||
return PluginSubCommandsFunctionHelper<PluginFunctionHelperInstantiation>::getSubCommands(); \
|
return PluginSubCommandsFunctionHelper<PluginFunctionHelperInstantiation>::getSubCommands(); \
|
||||||
} \
|
} \
|
||||||
IMHEX_PLUGIN_VISIBILITY_PREFIX void initializePlugin(); \
|
IMHEX_PLUGIN_VISIBILITY_PREFIX void initializePlugin(); \
|
||||||
extern "C" [[gnu::visibility("default")]] void WOLV_TOKEN_CONCAT(forceLinkPlugin_, IMHEX_PLUGIN_NAME)() { \
|
extern "C" void WOLV_TOKEN_CONCAT(forceLinkPlugin_, IMHEX_PLUGIN_NAME)() { \
|
||||||
hex::PluginManager::addPlugin(name, hex::PluginFunctions { \
|
hex::PluginManager::addPlugin(name, hex::PluginFunctions { \
|
||||||
initializePlugin, \
|
initializePlugin, \
|
||||||
nullptr, \
|
nullptr, \
|
||||||
@@ -107,6 +139,7 @@ void* PluginSubCommandsFunctionHelper<T>::getSubCommands() {
|
|||||||
getFeatures \
|
getFeatures \
|
||||||
}); \
|
}); \
|
||||||
} \
|
} \
|
||||||
|
PLUGIN_ENTRY_POINT \
|
||||||
IMHEX_PLUGIN_VISIBILITY_PREFIX void initializePlugin()
|
IMHEX_PLUGIN_VISIBILITY_PREFIX void initializePlugin()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -129,18 +162,3 @@ void* PluginSubCommandsFunctionHelper<T>::getSubCommands() {
|
|||||||
return &g_subCommands; \
|
return &g_subCommands; \
|
||||||
} \
|
} \
|
||||||
std::vector<hex::SubCommand> g_subCommands
|
std::vector<hex::SubCommand> g_subCommands
|
||||||
|
|
||||||
#define IMHEX_FEATURE_ENABLED(feature) WOLV_TOKEN_CONCAT(WOLV_TOKEN_CONCAT(WOLV_TOKEN_CONCAT(IMHEX_PLUGIN_, IMHEX_PLUGIN_NAME), _FEATURE_), feature)
|
|
||||||
#define IMHEX_DEFINE_PLUGIN_FEATURES() IMHEX_DEFINE_PLUGIN_FEATURES_IMPL()
|
|
||||||
#define IMHEX_DEFINE_PLUGIN_FEATURES_IMPL() \
|
|
||||||
extern std::vector<hex::Feature> g_features; \
|
|
||||||
template<> \
|
|
||||||
struct PluginFeatureFunctionHelper<PluginFunctionHelperInstantiation> { \
|
|
||||||
static void* getFeatures(); \
|
|
||||||
}; \
|
|
||||||
void* PluginFeatureFunctionHelper<PluginFunctionHelperInstantiation>::getFeatures() { \
|
|
||||||
return &g_features; \
|
|
||||||
} \
|
|
||||||
std::vector<hex::Feature> g_features
|
|
||||||
|
|
||||||
#define IMHEX_PLUGIN_FEATURES g_features
|
|
||||||
|
|||||||
57
lib/libimhex/include/hex/project/project.hpp
Normal file
57
lib/libimhex/include/hex/project/project.hpp
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <hex.hpp>
|
||||||
|
#include <hex/api/localization_manager.hpp>
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <list>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace hex::proj {
|
||||||
|
|
||||||
|
class Content {
|
||||||
|
public:
|
||||||
|
explicit Content(UnlocalizedString type, std::string name)
|
||||||
|
: m_type(std::move(type)), m_name(std::move(name)) { }
|
||||||
|
|
||||||
|
void setData(std::string data) { m_data = std::move(data); }
|
||||||
|
const std::string& getData() const { return m_data; }
|
||||||
|
|
||||||
|
const std::string& getName() const { return m_name; }
|
||||||
|
void setName(std::string name) { m_name = std::move(name); }
|
||||||
|
|
||||||
|
const UnlocalizedString& getType() const { return m_type; }
|
||||||
|
|
||||||
|
bool isOpen() const { return m_open; }
|
||||||
|
void setOpen(bool open) { m_open = open; }
|
||||||
|
|
||||||
|
bool isEmpty() const { return m_data.empty(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
UnlocalizedString m_type;
|
||||||
|
std::string m_name;
|
||||||
|
std::string m_data;
|
||||||
|
bool m_open = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Project {
|
||||||
|
public:
|
||||||
|
explicit Project(std::string name) : m_name(std::move(name)) {}
|
||||||
|
Project(const Project &) = delete;
|
||||||
|
Project(Project &&) = delete;
|
||||||
|
~Project();
|
||||||
|
|
||||||
|
Project &operator=(const Project &) = delete;
|
||||||
|
Project &operator=(Project &&) = delete;
|
||||||
|
|
||||||
|
const std::string &getName() const { return m_name; }
|
||||||
|
|
||||||
|
void addContent(UnlocalizedString type);
|
||||||
|
const std::list<std::unique_ptr<Content>>& getContents() const { return m_contents; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string m_name;
|
||||||
|
std::list<std::unique_ptr<Content>> m_contents;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
43
lib/libimhex/include/hex/project/project_manager.hpp
Normal file
43
lib/libimhex/include/hex/project/project_manager.hpp
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <hex.hpp>
|
||||||
|
#include <hex/project/project.hpp>
|
||||||
|
|
||||||
|
#include <list>
|
||||||
|
#include <string>
|
||||||
|
#include <filesystem>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
namespace hex::proj {
|
||||||
|
|
||||||
|
class ProjectManager {
|
||||||
|
ProjectManager() = default;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static void createProject(std::string name);
|
||||||
|
static void loadProject(const std::filesystem::path &path);
|
||||||
|
static void removeProject(const Project &project);
|
||||||
|
|
||||||
|
using LoadFunction = std::function<void(const Content&)>;
|
||||||
|
using StoreFunction = std::function<void(Content&)>;
|
||||||
|
|
||||||
|
struct ContentHandler {
|
||||||
|
UnlocalizedString type;
|
||||||
|
bool allowMultiple = false;
|
||||||
|
LoadFunction load;
|
||||||
|
StoreFunction store;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void registerContentHandler(ContentHandler handler);
|
||||||
|
static const std::list<ContentHandler>& getContentHandlers();
|
||||||
|
static const ContentHandler* getContentHandler(const UnlocalizedString &typeName);
|
||||||
|
|
||||||
|
static const std::list<std::unique_ptr<Project>> &getProjects();
|
||||||
|
|
||||||
|
static void storeContent(Content &content);
|
||||||
|
static void loadContent(Content &content);
|
||||||
|
|
||||||
|
static Content* getLoadedContent(const UnlocalizedString &type);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
@@ -38,7 +38,7 @@ namespace hex::prv {
|
|||||||
|
|
||||||
[[nodiscard]] std::string getName() const override { return m_name; }
|
[[nodiscard]] std::string getName() const override { return m_name; }
|
||||||
|
|
||||||
[[nodiscard]] std::string getTypeName() const override { return "MemoryProvider"; }
|
[[nodiscard]] UnlocalizedString getTypeName() const override { return "MemoryProvider"; }
|
||||||
private:
|
private:
|
||||||
void renameFile();
|
void renameFile();
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ namespace hex::prv {
|
|||||||
|
|
||||||
struct MenuEntry {
|
struct MenuEntry {
|
||||||
std::string name;
|
std::string name;
|
||||||
|
const char *icon;
|
||||||
std::function<void()> callback;
|
std::function<void()> callback;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -113,7 +114,7 @@ namespace hex::prv {
|
|||||||
* @param size number of bytes to read
|
* @param size number of bytes to read
|
||||||
* @param overlays apply overlays and patches is true. Same as readRaw() if false
|
* @param overlays apply overlays and patches is true. Same as readRaw() if false
|
||||||
*/
|
*/
|
||||||
void read(u64 offset, void *buffer, size_t size, bool overlays = true);
|
virtual void read(u64 offset, void *buffer, size_t size, bool overlays = true);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Write data to the patches of this provider. Will not directly modify provider.
|
* @brief Write data to the patches of this provider. Will not directly modify provider.
|
||||||
@@ -121,7 +122,7 @@ namespace hex::prv {
|
|||||||
* @param buffer buffer to take data to write from
|
* @param buffer buffer to take data to write from
|
||||||
* @param size number of bytes to write
|
* @param size number of bytes to write
|
||||||
*/
|
*/
|
||||||
void write(u64 offset, const void *buffer, size_t size);
|
virtual void write(u64 offset, const void *buffer, size_t size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Read data from this provider, without applying overlays and patches
|
* @brief Read data from this provider, without applying overlays and patches
|
||||||
@@ -151,7 +152,7 @@ namespace hex::prv {
|
|||||||
* like "hex.builtin.provider.mem_file" or "hex.builtin.provider.file"
|
* like "hex.builtin.provider.mem_file" or "hex.builtin.provider.file"
|
||||||
* @return The provider's type name
|
* @return The provider's type name
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] virtual std::string getTypeName() const = 0;
|
[[nodiscard]] virtual UnlocalizedString getTypeName() const = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Gets a human readable representation of the current provider
|
* @brief Gets a human readable representation of the current provider
|
||||||
@@ -165,7 +166,7 @@ namespace hex::prv {
|
|||||||
void insert(u64 offset, u64 size);
|
void insert(u64 offset, u64 size);
|
||||||
void remove(u64 offset, u64 size);
|
void remove(u64 offset, u64 size);
|
||||||
|
|
||||||
virtual void resizeRaw(u64 newSize) { hex::unused(newSize); }
|
virtual void resizeRaw(u64 newSize) { std::ignore = newSize; }
|
||||||
virtual void insertRaw(u64 offset, u64 size);
|
virtual void insertRaw(u64 offset, u64 size);
|
||||||
virtual void removeRaw(u64 offset, u64 size);
|
virtual void removeRaw(u64 offset, u64 size);
|
||||||
|
|
||||||
@@ -193,11 +194,11 @@ namespace hex::prv {
|
|||||||
[[nodiscard]] virtual std::vector<Description> getDataDescription() const;
|
[[nodiscard]] virtual std::vector<Description> getDataDescription() const;
|
||||||
[[nodiscard]] virtual std::variant<std::string, i128> queryInformation(const std::string &category, const std::string &argument);
|
[[nodiscard]] virtual std::variant<std::string, i128> queryInformation(const std::string &category, const std::string &argument);
|
||||||
|
|
||||||
void undo();
|
virtual void undo();
|
||||||
void redo();
|
virtual void redo();
|
||||||
|
|
||||||
[[nodiscard]] bool canUndo() const;
|
[[nodiscard]] virtual bool canUndo() const;
|
||||||
[[nodiscard]] bool canRedo() const;
|
[[nodiscard]] virtual bool canRedo() const;
|
||||||
|
|
||||||
[[nodiscard]] virtual bool hasFilePicker() const;
|
[[nodiscard]] virtual bool hasFilePicker() const;
|
||||||
virtual bool handleFilePicker();
|
virtual bool handleFilePicker();
|
||||||
@@ -231,7 +232,7 @@ namespace hex::prv {
|
|||||||
return m_undoRedoStack.add<T>(std::forward<decltype(args)...>(args)...);
|
return m_undoRedoStack.add<T>(std::forward<decltype(args)...>(args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] undo::Stack& getUndoStack() { return m_undoRedoStack; }
|
[[nodiscard]] virtual undo::Stack& getUndoStack() { return m_undoRedoStack; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
u32 m_currPage = 0;
|
u32 m_currPage = 0;
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <hex/api/imhex_api.hpp>
|
#include <hex/api/imhex_api.hpp>
|
||||||
#include <hex/api/event_manager.hpp>
|
#include <hex/api/events/events_provider.hpp>
|
||||||
|
#include <hex/api/events/events_lifecycle.hpp>
|
||||||
|
#include <hex/api/events/requests_provider.hpp>
|
||||||
|
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <ranges>
|
#include <ranges>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#include <hex.hpp>
|
#include <hex.hpp>
|
||||||
#include <hex/api/localization_manager.hpp>
|
#include <hex/api/localization_manager.hpp>
|
||||||
#include <hex/api/event_manager.hpp>
|
#include <hex/api/events/events_interaction.hpp>
|
||||||
|
|
||||||
#include <hex/providers/undo_redo/operations/operation.hpp>
|
#include <hex/providers/undo_redo/operations/operation.hpp>
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ namespace hex::test {
|
|||||||
return m_data->size();
|
return m_data->size();
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] std::string getTypeName() const override { return "hex.test.provider.test"; }
|
[[nodiscard]] UnlocalizedString getTypeName() const override { return "hex.test.provider.test"; }
|
||||||
|
|
||||||
bool open() override { return true; }
|
bool open() override { return true; }
|
||||||
void close() override { }
|
void close() override { }
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user