mirror of
https://github.com/WerWolv/ImHex.git
synced 2026-03-28 15:57:03 -05:00
Compare commits
756 Commits
feature/cl
...
v1.38.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
76cf877115 | ||
|
|
8e4ccef52f | ||
|
|
b78a1024c1 | ||
|
|
fbae871d65 | ||
|
|
1a9fa0875b | ||
|
|
96232c2d80 | ||
|
|
6405c75242 | ||
|
|
5a853569e6 | ||
|
|
ea9d965ffe | ||
|
|
8b84c47b73 | ||
|
|
a3cd6e6a40 | ||
|
|
2f707afa67 | ||
|
|
765c8f4fe2 | ||
|
|
4120e10a95 | ||
|
|
67ec26b22a | ||
|
|
937ca4a327 | ||
|
|
96587415f6 | ||
|
|
b2f062cf10 | ||
|
|
91ef40ec99 | ||
|
|
684a9b3009 | ||
|
|
51d773cf14 | ||
|
|
cae063985a | ||
|
|
798bd25202 | ||
|
|
11df253fd3 | ||
|
|
a44278b1fe | ||
|
|
cd7705664d | ||
|
|
23e484c468 | ||
|
|
c4c8c46c11 | ||
|
|
f633c3f33a | ||
|
|
b8bcb815c8 | ||
|
|
81826df897 | ||
|
|
f6b2251205 | ||
|
|
1a7fefbc22 | ||
|
|
fdc1434cc6 | ||
|
|
230568f681 | ||
|
|
48c869fc89 | ||
|
|
4222904be9 | ||
|
|
20b4630faa | ||
|
|
6ddf2bb9fd | ||
|
|
77f049f0aa | ||
|
|
588412543c | ||
|
|
9939007fcf | ||
|
|
119f6f78b9 | ||
|
|
e2e397f188 | ||
|
|
60e2c32ae0 | ||
|
|
febd46ec58 | ||
|
|
bb9a0517fe | ||
|
|
e03d3d9f36 | ||
|
|
08daaec380 | ||
|
|
5a9f44e696 | ||
|
|
c95cbc5933 | ||
|
|
516a2f119e | ||
|
|
99e81b53af | ||
|
|
8bce2b072c | ||
|
|
539a00ae5d | ||
|
|
38075a1438 | ||
|
|
2c82d561c0 | ||
|
|
48e72a88c2 | ||
|
|
95c9168e25 | ||
|
|
64cbc16f78 | ||
|
|
b5f63e899c | ||
|
|
0a994d61b3 | ||
|
|
a8237326ad | ||
|
|
1253d68256 | ||
|
|
c944750f4d | ||
|
|
fb21f11554 | ||
|
|
d8e54e535b | ||
|
|
59afa06bf4 | ||
|
|
358f961f50 | ||
|
|
fc1b30eef2 | ||
|
|
596564ec48 | ||
|
|
a652b95816 | ||
|
|
0e3ce90db7 | ||
|
|
a3f31da365 | ||
|
|
27518cc584 | ||
|
|
3bcce0a243 | ||
|
|
83650c908d | ||
|
|
afa297bb53 | ||
|
|
00986d0ea8 | ||
|
|
633914316a | ||
|
|
205bb81a0a | ||
|
|
60a69e3a54 | ||
|
|
5c629494da | ||
|
|
95f010395c | ||
|
|
d575d0f724 | ||
|
|
bdbdb46005 | ||
|
|
efc28a3177 | ||
|
|
5d50653495 | ||
|
|
24c55beb9c | ||
|
|
04547ad6af | ||
|
|
d2951d06b2 | ||
|
|
926910bf6e | ||
|
|
6652750044 | ||
|
|
ab3853eb9d | ||
|
|
4f4af83699 | ||
|
|
df3200f936 | ||
|
|
7374a06faa | ||
|
|
22b13f5ba6 | ||
|
|
031301e1bb | ||
|
|
3ad508c6fc | ||
|
|
c3421aef8c | ||
|
|
f2e8d402dd | ||
|
|
ab54acb176 | ||
|
|
7585e191d0 | ||
|
|
a4f6795a44 | ||
|
|
3529bce009 | ||
|
|
bc3afbb271 | ||
|
|
a0d0621725 | ||
|
|
c2d70dbd50 | ||
|
|
e2fdd91956 | ||
|
|
2a84534ced | ||
|
|
94b53592d9 | ||
|
|
09006588fc | ||
|
|
9d5cdaeb33 | ||
|
|
d4df465633 | ||
|
|
da0c1674a6 | ||
|
|
18aa11117a | ||
|
|
ed32439645 | ||
|
|
5c890e710e | ||
|
|
d15b7862b8 | ||
|
|
0e5136196a | ||
|
|
46fdbd5bc0 | ||
|
|
da755ec75b | ||
|
|
d610f787b9 | ||
|
|
1ab1f7ada0 | ||
|
|
56cb1f2747 | ||
|
|
413c6b5116 | ||
|
|
f4753a5bd8 | ||
|
|
980438008c | ||
|
|
8f57dd86af | ||
|
|
a2ce89af32 | ||
|
|
67008288e2 | ||
|
|
4caa0ce570 | ||
|
|
4e2dcef7d7 | ||
|
|
f47a248768 | ||
|
|
862462c5bb | ||
|
|
375471160f | ||
|
|
4000e7c886 | ||
|
|
48095671c3 | ||
|
|
c96b47f345 | ||
|
|
b250172bb5 | ||
|
|
257b248f34 | ||
|
|
a8fe63ee93 | ||
|
|
d359a21a66 | ||
|
|
e5cdf22753 | ||
|
|
c33d53b728 | ||
|
|
e5829a316b | ||
|
|
569bf474bd | ||
|
|
06ecd5d571 | ||
|
|
9ae233a41c | ||
|
|
989f7f7678 | ||
|
|
a75947e611 | ||
|
|
1d4233514f | ||
|
|
fa780e9706 | ||
|
|
cba93e87eb | ||
|
|
f3a2fe5b0d | ||
|
|
ebee8ff0a6 | ||
|
|
34971162cb | ||
|
|
58eec483c9 | ||
|
|
c57f071f0c | ||
|
|
b30e2bcfa4 | ||
|
|
b56c3c5a46 | ||
|
|
120c4202b4 | ||
|
|
1f257290ab | ||
|
|
4d585d17de | ||
|
|
2c7da65242 | ||
|
|
95ff52b025 | ||
|
|
b1e2185966 | ||
|
|
5d77402211 | ||
|
|
f762cc2906 | ||
|
|
7ca2e558c9 | ||
|
|
e388d0c5e8 | ||
|
|
05f8d9302d | ||
|
|
8f277f00a4 | ||
|
|
59f9da59e2 | ||
|
|
8d4415fe15 | ||
|
|
fd54b2b803 | ||
|
|
ba6953fda4 | ||
|
|
c0f667ce20 | ||
|
|
c93c15563a | ||
|
|
d0340c13dc | ||
|
|
c6caa1d067 | ||
|
|
2f0efa1197 | ||
|
|
a76eae2c11 | ||
|
|
b82c1f051c | ||
|
|
1b6a150624 | ||
|
|
265360229f | ||
|
|
98e9729267 | ||
|
|
cfe16ee2c5 | ||
|
|
c9f856b219 | ||
|
|
3c167c3306 | ||
|
|
fedbce6f9e | ||
|
|
28be4cea97 | ||
|
|
05fb2bfd23 | ||
|
|
3905335c53 | ||
|
|
4dc3f9e033 | ||
|
|
07a6a9b7d4 | ||
|
|
fac7dff77f | ||
|
|
60c7ced335 | ||
|
|
8f981e7707 | ||
|
|
725cc10a92 | ||
|
|
d3896ccfda | ||
|
|
de3e532a5c | ||
|
|
98369600c3 | ||
|
|
d9aaef29d2 | ||
|
|
48f4410a2a | ||
|
|
ca0b232ada | ||
|
|
75efe39298 | ||
|
|
84342f7a7b | ||
|
|
67efea6444 | ||
|
|
f08b182bf2 | ||
|
|
3c83a62aef | ||
|
|
821db4d2a1 | ||
|
|
3c661842a2 | ||
|
|
920578003e | ||
|
|
22aadcc1ae | ||
|
|
efc65479c6 | ||
|
|
dcbba9cbfc | ||
|
|
6169078c04 | ||
|
|
955f48f532 | ||
|
|
d7a830ca95 | ||
|
|
96b27645d6 | ||
|
|
8b6346ae41 | ||
|
|
c1619820c7 | ||
|
|
88ccb0e075 | ||
|
|
12564dd78f | ||
|
|
b0c4db7a64 | ||
|
|
310ca6c6dc | ||
|
|
32e3a4e74f | ||
|
|
be66e3fe79 | ||
|
|
d794734f1d | ||
|
|
8661b6551d | ||
|
|
a0326c4371 | ||
|
|
b039bc14c6 | ||
|
|
d08853df8c | ||
|
|
d8dd287cdf | ||
|
|
d62b64c27a | ||
|
|
52952652de | ||
|
|
790c19a1cd | ||
|
|
9659381378 | ||
|
|
4598fc098d | ||
|
|
2f6fde1e61 | ||
|
|
16dc199431 | ||
|
|
715e970d99 | ||
|
|
53535ab9be | ||
|
|
24f9df90b8 | ||
|
|
4cfdbb8095 | ||
|
|
fe4cb8575f | ||
|
|
06ac7eb85f | ||
|
|
0e14ff5a3d | ||
|
|
c65015fcc7 | ||
|
|
c8caf6124e | ||
|
|
76bb0e420d | ||
|
|
d2c1b2a31b | ||
|
|
e30f073809 | ||
|
|
e1079d751a | ||
|
|
a9d45d837f | ||
|
|
bcbe5eb105 | ||
|
|
6ab1f8e4e2 | ||
|
|
90f26d53d3 | ||
|
|
281921d1de | ||
|
|
9135153dc9 | ||
|
|
c70b505b3a | ||
|
|
cde9dc37e5 | ||
|
|
ab1e5eb359 | ||
|
|
aec9f7a145 | ||
|
|
bf08ed563a | ||
|
|
ff70518882 | ||
|
|
72364db768 | ||
|
|
92fa72eac7 | ||
|
|
9e2c1de0f5 | ||
|
|
57ac73b9d4 | ||
|
|
2757c577e4 | ||
|
|
704af30421 | ||
|
|
1e8a005d0e | ||
|
|
8a04d2f477 | ||
|
|
a7c37bfb93 | ||
|
|
d1801ea438 | ||
|
|
f6f856cd56 | ||
|
|
8515cd43fa | ||
|
|
8a4cdbb371 | ||
|
|
7fef133505 | ||
|
|
5f206a33e2 | ||
|
|
228385ceaa | ||
|
|
bd9e9a7dcf | ||
|
|
abffb8c138 | ||
|
|
e353802e9f | ||
|
|
130055af22 | ||
|
|
db573840b0 | ||
|
|
e0fccacc32 | ||
|
|
18890f47b6 | ||
|
|
204cc1ccb3 | ||
|
|
a063eb96c6 | ||
|
|
145c8ff804 | ||
|
|
f0d2f94aef | ||
|
|
0c12cb683a | ||
|
|
56b5d026df | ||
|
|
40ccbd0d86 | ||
|
|
c1a14cb4d4 | ||
|
|
df2448e121 | ||
|
|
ca323c392b | ||
|
|
395dd37d33 | ||
|
|
e91689a715 | ||
|
|
861988f8dc | ||
|
|
f26f1298cf | ||
|
|
66efcf91d3 | ||
|
|
0178ba014a | ||
|
|
254bd88e6b | ||
|
|
3808b78487 | ||
|
|
a80c35aa94 | ||
|
|
d0f51d0462 | ||
|
|
013fa85c1c | ||
|
|
fcda856198 | ||
|
|
e385487a6b | ||
|
|
f8fa029ee3 | ||
|
|
d1a0f8ec97 | ||
|
|
d02e147dc3 | ||
|
|
5c481d4247 | ||
|
|
f4cbdde8f6 | ||
|
|
0ac09fc57b | ||
|
|
99c28c93b4 | ||
|
|
0e800723f5 | ||
|
|
fc2ed47676 | ||
|
|
5c2309bcf7 | ||
|
|
ba71a300ec | ||
|
|
393451eed5 | ||
|
|
b0b20bcb9b | ||
|
|
8e8c553da4 | ||
|
|
c83173098c | ||
|
|
16c52f4008 | ||
|
|
d207d98a82 | ||
|
|
5a1f3d40a7 | ||
|
|
a667a1b6a9 | ||
|
|
cfe3c5b6df | ||
|
|
b49e2eeac4 | ||
|
|
d012ad08f8 | ||
|
|
b83f3d6cbf | ||
|
|
a8be74ebb7 | ||
|
|
b5bf9f1486 | ||
|
|
b3d07b4573 | ||
|
|
b602fcc485 | ||
|
|
0908d040fa | ||
|
|
530bd6dac4 | ||
|
|
441dcea705 | ||
|
|
c5e0951def | ||
|
|
4bea8f4c65 | ||
|
|
7f5ae41d8a | ||
|
|
35a357f1a8 | ||
|
|
8b384ef1f9 | ||
|
|
7588a84e86 | ||
|
|
d8f8e61a11 | ||
|
|
3c9aa97f6c | ||
|
|
6c28adbd24 | ||
|
|
cf5b9da45e | ||
|
|
01f24d2f2f | ||
|
|
592eea1bfd | ||
|
|
16a4a67886 | ||
|
|
dd3b6a47d2 | ||
|
|
fa8102f93d | ||
|
|
ef3678bfaf | ||
|
|
599b339e5d | ||
|
|
682aae1497 | ||
|
|
4ade751caf | ||
|
|
9f24b35b1f | ||
|
|
769087d139 | ||
|
|
3b1f32d68d | ||
|
|
4fc1f0491e | ||
|
|
89b94ebbf9 | ||
|
|
5666baf2bc | ||
|
|
9d05f487e6 | ||
|
|
8b72ea81c0 | ||
|
|
23085372a1 | ||
|
|
1761033cee | ||
|
|
48af5eb10a | ||
|
|
d2233af8a0 | ||
|
|
a411d489c1 | ||
|
|
3b48f537f1 | ||
|
|
7755e95db0 | ||
|
|
ac66f80a0d | ||
|
|
13111e2940 | ||
|
|
d0af46b175 | ||
|
|
18e6a5d6d2 | ||
|
|
1f1d127822 | ||
|
|
8a0639ced2 | ||
|
|
762eacb7c8 | ||
|
|
0ebe4150ae | ||
|
|
e8f799d010 | ||
|
|
926cddd69f | ||
|
|
ec2a01dfae | ||
|
|
f921742dcc | ||
|
|
ce0c97e6d5 | ||
|
|
1c54e7e38b | ||
|
|
9928439f4f | ||
|
|
3ed7834945 | ||
|
|
5853cb5ad5 | ||
|
|
1b476e235b | ||
|
|
ef8f5c67bd | ||
|
|
0664937c1e | ||
|
|
aada2c1fe6 | ||
|
|
870bce2bf8 | ||
|
|
908d879a1e | ||
|
|
5147d8ab63 | ||
|
|
8a1531fc71 | ||
|
|
09918041f8 | ||
|
|
165d00dad3 | ||
|
|
fa99069951 | ||
|
|
babd9584a6 | ||
|
|
20df023137 | ||
|
|
fbde2942de | ||
|
|
d920718b44 | ||
|
|
4ca429e389 | ||
|
|
49c56e28b4 | ||
|
|
3ec4f086ec | ||
|
|
3cb5dd226c | ||
|
|
6a1aa2c13e | ||
|
|
4b73e1a184 | ||
|
|
5fa9aaa6a6 | ||
|
|
63711f652f | ||
|
|
d07b4417d7 | ||
|
|
95ae5a26ed | ||
|
|
d8ad23630a | ||
|
|
c03d9301e2 | ||
|
|
6ec6851a8a | ||
|
|
a7d3a916cc | ||
|
|
e1d1c4acca | ||
|
|
bd17e0edc1 | ||
|
|
6e88d08c17 | ||
|
|
278babe7f2 | ||
|
|
b23f33ab6c | ||
|
|
50b25882cd | ||
|
|
28bfceab6c | ||
|
|
6febe9982b | ||
|
|
b5a3a8b4c2 | ||
|
|
25c8f4b588 | ||
|
|
09b2e20a3d | ||
|
|
e9d95c78f6 | ||
|
|
ad2a36676c | ||
|
|
43da36a957 | ||
|
|
71e9f7b239 | ||
|
|
b566d31f28 | ||
|
|
c4d167f8d4 | ||
|
|
50f1fe2b2d | ||
|
|
75e73ddcd9 | ||
|
|
3616c3ad7b | ||
|
|
23d673f920 | ||
|
|
8c9f3fa569 | ||
|
|
80003a4843 | ||
|
|
12785c00bd | ||
|
|
8f94b46149 | ||
|
|
73a59fe5c1 | ||
|
|
5028b354cc | ||
|
|
3e98d0a0f8 | ||
|
|
902c8dcd8d | ||
|
|
66e407549e | ||
|
|
0870ab4d3c | ||
|
|
6be0eeff72 | ||
|
|
9246d040ad | ||
|
|
549866bfd9 | ||
|
|
d81f0668a1 | ||
|
|
6b4fef806c | ||
|
|
4e5b2675a0 | ||
|
|
f3d9f224b7 | ||
|
|
ae8a12fa27 | ||
|
|
de7d549fc6 | ||
|
|
d925c8216d | ||
|
|
e6f46747b6 | ||
|
|
c30830a8ff | ||
|
|
45b08b6010 | ||
|
|
c88fc43032 | ||
|
|
08a08c2b3a | ||
|
|
411e971ba7 | ||
|
|
dbc5819bc4 | ||
|
|
93a71120d4 | ||
|
|
d683c04519 | ||
|
|
a403980976 | ||
|
|
5c3dfa08b2 | ||
|
|
fd2d50508b | ||
|
|
14ee688629 | ||
|
|
9e4557d90d | ||
|
|
d9810982ad | ||
|
|
282d950423 | ||
|
|
cd5b16cce5 | ||
|
|
cc1ac95af6 | ||
|
|
b14fa24836 | ||
|
|
59c6d3090b | ||
|
|
1e809214b2 | ||
|
|
56ec07e316 | ||
|
|
ce66f3a98a | ||
|
|
5d180bdbfb | ||
|
|
d922dbe04c | ||
|
|
1fc6ec28c2 | ||
|
|
ec6ff1d7d5 | ||
|
|
ad87f005fe | ||
|
|
df1e97af0a | ||
|
|
82ceb2e11f | ||
|
|
9698232f69 | ||
|
|
b1867aac92 | ||
|
|
09bc5b92f6 | ||
|
|
725462b222 | ||
|
|
a9faba5cec | ||
|
|
5a318da8ca | ||
|
|
5bc8366749 | ||
|
|
6200036014 | ||
|
|
38b891bd62 | ||
|
|
a22c606e42 | ||
|
|
dc0473e48d | ||
|
|
71f5373ea8 | ||
|
|
bd4ce72800 | ||
|
|
d39d33de32 | ||
|
|
7c07f70afd | ||
|
|
de67d5942b | ||
|
|
f358069cc1 | ||
|
|
cf87294a8c | ||
|
|
40b48f6460 | ||
|
|
31322bcc76 | ||
|
|
abe13d9ff9 | ||
|
|
064b21a264 | ||
|
|
5be6297bac | ||
|
|
dda32ef0f9 | ||
|
|
9cff9043ee | ||
|
|
d429424f67 | ||
|
|
750f91dbbc | ||
|
|
c0ee243d64 | ||
|
|
e05825b9f4 | ||
|
|
018c61890c | ||
|
|
263c5f6830 | ||
|
|
a27b10f69a | ||
|
|
3cf7622707 | ||
|
|
327195573e | ||
|
|
baebfe96ba | ||
|
|
5b06702dee | ||
|
|
95465e2fc3 | ||
|
|
388f5354a1 | ||
|
|
c3cd4edbf9 | ||
|
|
b9c36cfd2f | ||
|
|
b3deeb29b3 | ||
|
|
136cabedb4 | ||
|
|
9fc9eb1425 | ||
|
|
71a39ff2fd | ||
|
|
3d01b78ba0 | ||
|
|
452e7d7c5f | ||
|
|
1a8e09d549 | ||
|
|
ea072296cf | ||
|
|
56d1e2670e | ||
|
|
bc953592f0 | ||
|
|
b2f188fa4b | ||
|
|
7575f85bdf | ||
|
|
685a2e3cf2 | ||
|
|
2db85ced59 | ||
|
|
693a0f2516 | ||
|
|
b81328ac1a | ||
|
|
2440acda07 | ||
|
|
29354f0bcb | ||
|
|
a9eb7b2d25 | ||
|
|
05a06fe7a3 | ||
|
|
f73866b86e | ||
|
|
1e18abc598 | ||
|
|
a2c4aefced | ||
|
|
bb6ea5f1e5 | ||
|
|
0e855e10db | ||
|
|
1594c712a8 | ||
|
|
7b6d5d2686 | ||
|
|
44f12587f3 | ||
|
|
fd8bdbdc90 | ||
|
|
9557041c3a | ||
|
|
1804caba02 | ||
|
|
c1f0d60f49 | ||
|
|
83d92dde35 | ||
|
|
ac98e4e0b5 | ||
|
|
5c99974202 | ||
|
|
280dea23d0 | ||
|
|
6fcc3e8cb3 | ||
|
|
ec9461741c | ||
|
|
896e05331c | ||
|
|
4c930b190e | ||
|
|
6ab3353a15 | ||
|
|
a31760eecb | ||
|
|
4c89a79dc3 | ||
|
|
2c3d8d4c0b | ||
|
|
e71e026da0 | ||
|
|
f239b0c6d7 | ||
|
|
8a7f232198 | ||
|
|
a3c71b3955 | ||
|
|
46b13b6606 | ||
|
|
a40c420b70 | ||
|
|
8470334d6d | ||
|
|
f42ae97f14 | ||
|
|
c7b2f26bd5 | ||
|
|
ec424ac16e | ||
|
|
72501edc9a | ||
|
|
9554889964 | ||
|
|
7ff1e72093 | ||
|
|
3d3674d405 | ||
|
|
d08152a824 | ||
|
|
12087b51cb | ||
|
|
66ec1de625 | ||
|
|
7f09d61eb8 | ||
|
|
f5c24cee67 | ||
|
|
2abedbe4ad | ||
|
|
80eb72c5f9 | ||
|
|
88da6c10e0 | ||
|
|
49771766e7 | ||
|
|
9b20092428 | ||
|
|
e3551b3045 | ||
|
|
68d7e99a80 | ||
|
|
a8d61ed534 | ||
|
|
a67788ac52 | ||
|
|
bc644e324a | ||
|
|
8782be593d | ||
|
|
2998cc0fd7 | ||
|
|
e85216d9a6 | ||
|
|
e22923a980 | ||
|
|
be6a90675b | ||
|
|
94527345b9 | ||
|
|
c1545b57c9 | ||
|
|
8f3d07ea69 | ||
|
|
68804a357d | ||
|
|
78a449d6d3 | ||
|
|
366c631e26 | ||
|
|
da8be3ec3c | ||
|
|
820b833bbc | ||
|
|
574c039cc8 | ||
|
|
e0180b718f | ||
|
|
ca82fafac5 | ||
|
|
a9ce71c481 | ||
|
|
2e200a2ab8 | ||
|
|
0e720a1e02 | ||
|
|
601b13cf42 | ||
|
|
f6860015eb | ||
|
|
99a9752ee9 | ||
|
|
518ada6dae | ||
|
|
3c1c9c13d8 | ||
|
|
baa4e82b92 | ||
|
|
116f5a57eb | ||
|
|
4c8c383378 | ||
|
|
e5e867db22 | ||
|
|
2b72d08e39 | ||
|
|
32adb99f3d | ||
|
|
799175c94e | ||
|
|
e79116499e | ||
|
|
e1a91d179a | ||
|
|
e0910cd2f4 | ||
|
|
295c751b60 | ||
|
|
851f7b4b8c | ||
|
|
9b3a157b41 | ||
|
|
8f2638be30 | ||
|
|
0634b41092 | ||
|
|
2ce5acb8d3 | ||
|
|
48980a1e0c | ||
|
|
b68d0704e7 | ||
|
|
af7eaae399 | ||
|
|
a3eb057215 | ||
|
|
59695dcad6 | ||
|
|
aa6e461340 | ||
|
|
737d71ee13 | ||
|
|
2b7fe26bf1 | ||
|
|
8593bf5f55 | ||
|
|
7bfc3f44c9 | ||
|
|
b9f79833b6 | ||
|
|
9bed8f792a | ||
|
|
e18d583a00 | ||
|
|
244f7b55ee | ||
|
|
ee6d72562b | ||
|
|
90c2667028 | ||
|
|
9c6926a1fb | ||
|
|
22c9d77909 | ||
|
|
55b3b3a188 | ||
|
|
c93e5ba183 | ||
|
|
5df8ec78aa | ||
|
|
cc6590d780 | ||
|
|
9ce18d1a42 | ||
|
|
9ff8d42143 | ||
|
|
1ff838daa7 | ||
|
|
17ab429a8c | ||
|
|
5df50ef380 | ||
|
|
8da007af6c | ||
|
|
f053b94f68 | ||
|
|
d02ea09529 | ||
|
|
79333593bf | ||
|
|
c635bca43d | ||
|
|
de62a4c71e | ||
|
|
24732b304b | ||
|
|
5744ad588f | ||
|
|
5ea021d57a | ||
|
|
38c5868029 | ||
|
|
4725bf7271 | ||
|
|
de9efe6c4d | ||
|
|
88ce3a2490 | ||
|
|
2c47e1a135 | ||
|
|
7454221b3b | ||
|
|
fcc4709ed9 | ||
|
|
aeb77559a7 | ||
|
|
9acaf33410 | ||
|
|
e13b679650 | ||
|
|
4146047cdb | ||
|
|
18e02fbf5c | ||
|
|
b94519362c | ||
|
|
1e59a82c59 | ||
|
|
d570ab04b8 | ||
|
|
830be0b0d3 | ||
|
|
1570f379df | ||
|
|
e7714df79f | ||
|
|
bdc108d021 | ||
|
|
a89fb542b0 | ||
|
|
26de4c11e1 | ||
|
|
01d0f03fdd | ||
|
|
58d0d09eae | ||
|
|
e7a2729d36 | ||
|
|
5782236379 | ||
|
|
88de5f6be4 | ||
|
|
4520637aed | ||
|
|
aa8235c279 | ||
|
|
2432462ff3 | ||
|
|
8c59684c14 | ||
|
|
82c318f91d | ||
|
|
3c16adf169 | ||
|
|
2ab54baa2c | ||
|
|
da2aa85a8a | ||
|
|
e58ce527c6 | ||
|
|
d1840a2184 | ||
|
|
fa62a675dc | ||
|
|
1aa52c634f | ||
|
|
cfc364e4f1 | ||
|
|
f2b6af8bdc | ||
|
|
c71411a527 | ||
|
|
42256a5c2f | ||
|
|
f589d898ac | ||
|
|
af70234519 | ||
|
|
df58afe1a1 | ||
|
|
6c8d87520c | ||
|
|
9d0ea9f6c0 | ||
|
|
053f7655c3 | ||
|
|
288f8ee42f | ||
|
|
2a8dd0873b | ||
|
|
bd8b3f8a29 | ||
|
|
57c89b4481 | ||
|
|
a4ced46628 | ||
|
|
0d2ea2f8c0 | ||
|
|
4245cd2ad9 | ||
|
|
6f42c4b3b3 | ||
|
|
4c20ceb94e | ||
|
|
df3b85765d | ||
|
|
2b352c6d7a | ||
|
|
92832d7e14 | ||
|
|
10957dbbb9 | ||
|
|
88eecf6624 | ||
|
|
755a53f821 | ||
|
|
ea4d71b26c | ||
|
|
a4c0d38c53 | ||
|
|
58228e0af4 | ||
|
|
1d69d8fb6a | ||
|
|
3445d09390 | ||
|
|
78b3d3d001 | ||
|
|
d8f0120698 | ||
|
|
3e25bceb0c | ||
|
|
1ca40481bb |
137
.clang-tidy
137
.clang-tidy
@@ -1,69 +1,68 @@
|
||||
# Generated from CLion Inspection settings
|
||||
---
|
||||
Checks: '-*,
|
||||
mpi-*,
|
||||
bugprone-*,
|
||||
-bugprone-signal-handler,
|
||||
-bugprone-narrowing-conversions,
|
||||
-bugprone-redundant-branch-condition,
|
||||
-bugprone-exception-escape,
|
||||
-bugprone-shared-ptr-array-mismatch,
|
||||
-bugprone-implicit-widening-of-multiplication-result,
|
||||
-bugprone-signed-char-misuse,
|
||||
-bugprone-unhandled-exception-at-new,
|
||||
-bugprone-infinite-loop,
|
||||
-bugprone-easily-swappable-parameters,
|
||||
cert-err52-cpp,
|
||||
cert-err60-cpp,
|
||||
cert-err34-c,
|
||||
cert-str34-c,
|
||||
cert-dcl21-cpp,
|
||||
cert-msc50-cpp,
|
||||
cert-msc51-cpp,
|
||||
cert-dcl58-cpp,
|
||||
cert-flp30-c,
|
||||
cppcoreguidelines-avoid-const-or-ref-data-members,
|
||||
cppcoreguidelines-pro-type-member-init,
|
||||
cppcoreguidelines-slicing,
|
||||
cppcoreguidelines-interfaces-global-init,
|
||||
cppcoreguidelines-pro-type-static-cast-downcast,
|
||||
cppcoreguidelines-narrowing-conversions,
|
||||
google-default-arguments,
|
||||
google-runtime-operator,
|
||||
google-explicit-constructor,
|
||||
hicpp-multiway-paths-covered,
|
||||
hicpp-exception-baseclass,
|
||||
misc-*,
|
||||
-misc-definitions-in-headers,
|
||||
-misc-unused-parameters,
|
||||
-misc-unused-alias-decls,
|
||||
-misc-use-anonymous-namespace,
|
||||
-misc-misleading-identifier,
|
||||
-misc-confusable-identifiers,
|
||||
-misc-misleading-bidirectional,
|
||||
-misc-static-assert,
|
||||
-misc-no-recursion,
|
||||
-misc-const-correctness,
|
||||
modernize-*,
|
||||
-modernize-use-trailing-return-type,
|
||||
openmp-use-default-none,
|
||||
performance-*,
|
||||
-performance-no-int-to-ptr,
|
||||
portability-*,
|
||||
-portability-restrict-system-includes,
|
||||
readability-*,
|
||||
-readability-redundant-preprocessor,
|
||||
-readability-named-parameter,
|
||||
-readability-function-size,
|
||||
-readability-use-anyofallof,
|
||||
-readability-identifier-length,
|
||||
-readability-magic-numbers,
|
||||
-readability-braces-around-statements,
|
||||
-readability-suspicious-call-argument,
|
||||
-readability-isolate-declaration,
|
||||
-readability-else-after-return,
|
||||
-readability-redundant-access-specifiers,
|
||||
-readability-function-cognitive-complexity,
|
||||
-readability-identifier-naming,
|
||||
*-include-cleaner,
|
||||
-readability-qualified-auto'
|
||||
Checks:
|
||||
- -*
|
||||
- mpi-*
|
||||
- bugprone-*
|
||||
- -bugprone-signal-handler
|
||||
- -bugprone-narrowing-conversions
|
||||
- -bugprone-redundant-branch-condition
|
||||
- -bugprone-exception-escape
|
||||
- -bugprone-shared-ptr-array-mismatch
|
||||
- -bugprone-implicit-widening-of-multiplication-result
|
||||
- -bugprone-signed-char-misuse
|
||||
- -bugprone-unhandled-exception-at-new
|
||||
- -bugprone-infinite-loop
|
||||
- -bugprone-easily-swappable-parameters
|
||||
- cert-err52-cpp
|
||||
- cert-err60-cpp
|
||||
- cert-err34-c
|
||||
- cert-str34-c
|
||||
- cert-dcl21-cpp
|
||||
- cert-msc50-cpp
|
||||
- cert-msc51-cpp
|
||||
- cert-dcl58-cpp
|
||||
- cert-flp30-c
|
||||
- cppcoreguidelines-avoid-const-or-ref-data-members
|
||||
- cppcoreguidelines-pro-type-member-init
|
||||
- cppcoreguidelines-slicing
|
||||
- cppcoreguidelines-interfaces-global-init
|
||||
- cppcoreguidelines-pro-type-static-cast-downcast
|
||||
- cppcoreguidelines-narrowing-conversions
|
||||
- google-default-arguments
|
||||
- google-runtime-operator
|
||||
- google-explicit-constructor
|
||||
- hicpp-multiway-paths-covered
|
||||
- hicpp-exception-baseclass
|
||||
- misc-*
|
||||
- -misc-definitions-in-headers
|
||||
- -misc-unused-parameters
|
||||
- -misc-unused-alias-decls
|
||||
- -misc-use-anonymous-namespace
|
||||
- -misc-misleading-identifier
|
||||
- -misc-confusable-identifiers
|
||||
- -misc-misleading-bidirectional
|
||||
- -misc-static-assert
|
||||
- -misc-no-recursion
|
||||
- -misc-const-correctness
|
||||
- modernize-*
|
||||
- -modernize-use-trailing-return-type
|
||||
- openmp-use-default-none
|
||||
- performance-*
|
||||
- -performance-no-int-to-ptr
|
||||
- portability-*
|
||||
- -portability-restrict-system-includes
|
||||
- readability-*
|
||||
- -readability-redundant-preprocessor
|
||||
- -readability-named-parameter
|
||||
- -readability-function-size
|
||||
- -readability-use-anyofallof
|
||||
- -readability-identifier-length
|
||||
- -readability-magic-numbers
|
||||
- -readability-braces-around-statements
|
||||
- -readability-suspicious-call-argument
|
||||
- -readability-isolate-declaration
|
||||
- -readability-else-after-return
|
||||
- -readability-redundant-access-specifiers
|
||||
- -readability-function-cognitive-complexity
|
||||
- -readability-identifier-naming
|
||||
- '*-include-cleaner'
|
||||
- -readability-qualified-auto
|
||||
|
||||
1
.gdbinit
1
.gdbinit
@@ -7,6 +7,7 @@ skip -rfu ^ImGui::
|
||||
|
||||
# Trigger breakpoint when execution reaches triggerSafeShutdown()
|
||||
break triggerSafeShutdown
|
||||
break __glibcxx_assert_fail
|
||||
|
||||
# Print backtrace after execution jumped to an invalid address
|
||||
define fixbt
|
||||
|
||||
19
.github/workflows/analysis.yml
vendored
19
.github/workflows/analysis.yml
vendored
@@ -49,15 +49,16 @@ jobs:
|
||||
set -x
|
||||
mkdir -p build
|
||||
cd build
|
||||
CC=gcc-14 CXX=g++-14 cmake \
|
||||
-DCMAKE_BUILD_TYPE=$BUILD_TYPE \
|
||||
-DCMAKE_INSTALL_PREFIX="$PWD/install" \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_C_FLAGS="-fuse-ld=lld" \
|
||||
-DCMAKE_CXX_FLAGS="-fuse-ld=lld" \
|
||||
-DIMHEX_PATTERNS_PULL_MASTER=ON \
|
||||
-G Ninja \
|
||||
CC=gcc-14 CXX=g++-14 cmake \
|
||||
-DCMAKE_BUILD_TYPE=$BUILD_TYPE \
|
||||
-DCMAKE_INSTALL_PREFIX="$PWD/install" \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_C_FLAGS="-fuse-ld=lld" \
|
||||
-DCMAKE_CXX_FLAGS="-fuse-ld=lld" \
|
||||
-DIMHEX_PATTERNS_PULL_MASTER=ON \
|
||||
-DIMHEX_EXCLUDE_PLUGINS="script_loader" \
|
||||
-G Ninja \
|
||||
..
|
||||
ninja install
|
||||
|
||||
|
||||
365
.github/workflows/build.yml
vendored
365
.github/workflows/build.yml
vendored
@@ -1,5 +1,9 @@
|
||||
name: Build
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
@@ -17,8 +21,19 @@ jobs:
|
||||
|
||||
# Windows MINGW build
|
||||
win_mingw:
|
||||
runs-on: windows-2022
|
||||
name: 🪟 Windows MINGW64
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- architecture_name: "x86_64"
|
||||
msystem: "mingw64"
|
||||
runner_os: "windows-2025"
|
||||
- architecture_name: "arm64"
|
||||
msystem: "clangarm64"
|
||||
runner_os: "windows-11-arm"
|
||||
|
||||
runs-on: ${{ matrix.runner_os }}
|
||||
name: 🪟 Windows MSYS2 ${{ matrix.architecture_name }}
|
||||
|
||||
defaults:
|
||||
run:
|
||||
@@ -38,7 +53,7 @@ jobs:
|
||||
submodules: recursive
|
||||
|
||||
- name: 📜 Setup ccache
|
||||
uses: hendrikmuhs/ccache-action@v1
|
||||
uses: hendrikmuhs/ccache-action@main
|
||||
id: cache-ccache
|
||||
with:
|
||||
key: ${{ runner.os }}-mingw-ccache-${{ github.run_id }}
|
||||
@@ -48,7 +63,7 @@ jobs:
|
||||
- name: 🟦 Install msys2
|
||||
uses: msys2/setup-msys2@v2
|
||||
with:
|
||||
msystem: mingw64
|
||||
msystem: ${{ matrix.msystem }}
|
||||
|
||||
- name: ⬇️ Install dependencies
|
||||
run: |
|
||||
@@ -71,18 +86,20 @@ jobs:
|
||||
mkdir -p build
|
||||
cd build
|
||||
|
||||
cmake -G "Ninja" \
|
||||
-DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \
|
||||
-DCMAKE_INSTALL_PREFIX="$PWD/install" \
|
||||
-DIMHEX_GENERATE_PACKAGE=ON \
|
||||
-DIMHEX_USE_DEFAULT_BUILD_SETTINGS=ON \
|
||||
-DIMHEX_PATTERNS_PULL_MASTER=ON \
|
||||
-DIMHEX_COMMIT_HASH_LONG="${GITHUB_SHA}" \
|
||||
-DIMHEX_COMMIT_BRANCH="${GITHUB_REF##*/}" \
|
||||
-DUSE_SYSTEM_CAPSTONE=ON \
|
||||
-DIMHEX_GENERATE_PDBS=ON \
|
||||
-DIMHEX_REPLACE_DWARF_WITH_PDB=ON \
|
||||
-DDOTNET_EXECUTABLE="C:/Program Files/dotnet/dotnet.exe" \
|
||||
cmake -G "Ninja" \
|
||||
-DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \
|
||||
-DCMAKE_INSTALL_PREFIX="$PWD/install" \
|
||||
-DIMHEX_GENERATE_PACKAGE=ON \
|
||||
-DIMHEX_USE_DEFAULT_BUILD_SETTINGS=ON \
|
||||
-DIMHEX_PATTERNS_PULL_MASTER=ON \
|
||||
-DIMHEX_COMMIT_HASH_LONG="${GITHUB_SHA}" \
|
||||
-DIMHEX_COMMIT_BRANCH="${GITHUB_REF##*/}" \
|
||||
-DUSE_SYSTEM_CAPSTONE=ON \
|
||||
-DUSE_SYSTEM_MD4C=ON \
|
||||
-DIMHEX_GENERATE_PDBS=ON \
|
||||
-DIMHEX_REPLACE_DWARF_WITH_PDB=ON \
|
||||
-DDOTNET_EXECUTABLE="C:/Program Files/dotnet/dotnet.exe" \
|
||||
-DCPACK_WIX_ROOT="$(echo "$USERPROFILE" | tr '\\' '/')/.dotnet/tools" \
|
||||
..
|
||||
|
||||
- name: 🛠️ Build
|
||||
@@ -90,6 +107,11 @@ jobs:
|
||||
cd build
|
||||
ninja install
|
||||
|
||||
- name: 🕯️ Install WiX Toolkit
|
||||
run: |
|
||||
"C:/Program Files/dotnet/dotnet.exe" tool install --global wix
|
||||
"$(echo "$USERPROFILE" | tr '\\' '/')/.dotnet/tools/wix" extension add -g WixToolset.UI.wixext
|
||||
|
||||
- name: 🪲 Create PDBs for MSI
|
||||
run: |
|
||||
cd build
|
||||
@@ -114,7 +136,7 @@ jobs:
|
||||
run: |
|
||||
cd build
|
||||
cpack
|
||||
mv ImHex-*.msi ../imhex-${{ env.IMHEX_VERSION }}-Windows-x86_64.msi
|
||||
mv ImHex-*.msi ../imhex-${{ env.IMHEX_VERSION }}-Windows-${{ matrix.architecture_name }}.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
|
||||
|
||||
@@ -147,9 +169,10 @@ jobs:
|
||||
|
||||
- name: ⬆️ Upload Windows Installer
|
||||
uses: actions/upload-artifact@v4
|
||||
id: upload-installer
|
||||
with:
|
||||
if-no-files-found: error
|
||||
name: Windows Installer x86_64
|
||||
name: Windows Installer ${{ matrix.architecture_name }}
|
||||
path: |
|
||||
imhex-*.msi
|
||||
|
||||
@@ -157,30 +180,43 @@ jobs:
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
if-no-files-found: error
|
||||
name: Windows Portable x86_64
|
||||
name: Windows Portable ${{ matrix.architecture_name }}
|
||||
path: |
|
||||
build/install/*
|
||||
|
||||
- name: ⬇️ Download Mesa3D for NoGPU version
|
||||
if: ${{ matrix.architecture_name == 'x86_64' }}
|
||||
shell: bash
|
||||
run: |
|
||||
set -x
|
||||
echo "NoGPU version Powered by Mesa 3D : https://fdossena.com/?p=mesa%2Findex.frag" > build/install/MESA.md
|
||||
curl https://downloads.fdossena.com/geth.php?r=mesa64-latest -L -o mesa.7z
|
||||
curl --connect-timeout 30 --retry 5 --retry-delay 0 --retry-max-time 30 https://downloads.fdossena.com/geth.php?r=mesa64-latest -L -o mesa.7z
|
||||
7z e mesa.7z
|
||||
mv opengl32.dll build/install
|
||||
|
||||
- name: ⬆️ Upload NoGPU Portable ZIP
|
||||
if: ${{ matrix.architecture_name == 'x86_64' }}
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
if-no-files-found: error
|
||||
name: Windows Portable NoGPU x86_64
|
||||
name: Windows Portable NoGPU ${{ matrix.architecture_name }}
|
||||
path: |
|
||||
build/install/*
|
||||
|
||||
win_msvc:
|
||||
runs-on: windows-2022
|
||||
name: 🪟 Windows MSVC
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- architecture_name: "x86_64"
|
||||
vs_arch: "amd64"
|
||||
runner_os: "windows-2025"
|
||||
- architecture_name: "arm64"
|
||||
vs_arch: "amd64_arm64"
|
||||
runner_os: "windows-11-arm"
|
||||
|
||||
runs-on: ${{ matrix.runner_os }}
|
||||
name: 🪟 Windows MSVC ${{ matrix.architecture_name }}
|
||||
|
||||
env:
|
||||
CCACHE_DIR: "${{ github.workspace }}/.ccache"
|
||||
@@ -198,23 +234,24 @@ jobs:
|
||||
- name: 🫧 Setup Visual Studio Dev Environment
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
with:
|
||||
arch: amd64
|
||||
arch: ${{ matrix.vs_arch }}
|
||||
|
||||
- name: 📜 Setup ccache
|
||||
uses: hendrikmuhs/ccache-action@v1
|
||||
uses: hendrikmuhs/ccache-action@main
|
||||
id: cache-ccache
|
||||
with:
|
||||
key: ${{ runner.os }}-msvc-ccache-${{ github.run_id }}
|
||||
restore-keys: ${{ runner.os }}-msvc-ccache
|
||||
key: ${{ runner.os }}-msvc-${{ matrix.vs_arch }}-ccache-${{ github.run_id }}
|
||||
restore-keys: ${{ runner.os }}-msvc-${{ matrix.vs_arch }}-ccache
|
||||
max-size: 1G
|
||||
|
||||
- name: 📦 Install vcpkg
|
||||
uses: friendlyanon/setup-vcpkg@v1
|
||||
with: { committish: 7e21420f775f72ae938bdeb5e6068f722088f06a }
|
||||
with: { committish: ef7dbf94b9198bc58f45951adcf1f041fcbc5ea0 }
|
||||
|
||||
- name: ⬇️ Install dependencies
|
||||
run: |
|
||||
cp dist/vcpkg.json vcpkg.json
|
||||
vcpkg install
|
||||
|
||||
- name: ⬇️ Install CMake and Ninja
|
||||
uses: lukka/get-cmake@latest
|
||||
@@ -236,21 +273,51 @@ jobs:
|
||||
cmake -G "Ninja" -B build `
|
||||
--preset vs2022 `
|
||||
-DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake" `
|
||||
-DCMAKE_C_COMPILER="$($(Get-Command cl.exe).Path)" `
|
||||
-DCMAKE_CXX_COMPILER="$($(Get-Command cl.exe).Path)" `
|
||||
-DCMAKE_C_COMPILER="$($(Get-Command cl.exe).Path)" `
|
||||
-DCMAKE_CXX_COMPILER="$($(Get-Command cl.exe).Path)" `
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache `
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache `
|
||||
-DCMAKE_INSTALL_PREFIX="$(Join-Path $PWD 'install')" `
|
||||
-DIMHEX_GENERATE_PACKAGE=ON `
|
||||
-DCMAKE_BUILD_TYPE="$env:BUILD_TYPE" `
|
||||
-DIMHEX_PATTERNS_PULL_MASTER=ON `
|
||||
-DIMHEX_COMMIT_HASH_LONG="$env:GITHUB_SHA" `
|
||||
-DIMHEX_COMMIT_BRANCH="$($env:GITHUB_REF -replace '.*/', '')" `
|
||||
-DDOTNET_EXECUTABLE="C:/Program Files/dotnet/dotnet.exe" `
|
||||
-DCPACK_WIX_ROOT="$($env:USERPROFILE -replace '\\','/')/.dotnet/tools" `
|
||||
.
|
||||
|
||||
- name: 🛠️ Build
|
||||
run: |
|
||||
cd build
|
||||
ninja
|
||||
ninja install
|
||||
|
||||
- name: 🕯️ Install WiX Toolkit
|
||||
run: |
|
||||
& "C:/Program Files/dotnet/dotnet.exe" tool install --global wix
|
||||
& "$($env:USERPROFILE -replace '\\','/')/.dotnet/tools/wix" extension add -g WixToolset.UI.wixext
|
||||
|
||||
- name: 📦 Bundle MSI
|
||||
run: |
|
||||
cd build
|
||||
cpack
|
||||
mv ImHex-*.msi ../imhex-${{ env.IMHEX_VERSION }}-Windows-MSVC-${{ matrix.architecture_name }}.msi
|
||||
|
||||
- name: 🗝️ Generate build provenance attestations
|
||||
uses: actions/attest-build-provenance@v2
|
||||
if: ${{ github.event.repository.fork == false && github.event_name != 'pull_request' }}
|
||||
with:
|
||||
subject-path: |
|
||||
imhex-*.msi
|
||||
|
||||
- name: ⬆️ Upload Windows Installer
|
||||
uses: actions/upload-artifact@v4
|
||||
if: false # The MSVC builds should not really be used, they're still packaged for testing’s sake though
|
||||
with:
|
||||
if-no-files-found: error
|
||||
name: Windows Installer MSVC ${{ matrix.architecture_name }}
|
||||
path: |
|
||||
imhex-*.msi
|
||||
|
||||
win-plugin-template-test:
|
||||
runs-on: windows-2022
|
||||
@@ -305,13 +372,19 @@ jobs:
|
||||
-DCMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \
|
||||
-DIMHEX_USE_DEFAULT_BUILD_SETTINGS=ON \
|
||||
-DUSE_SYSTEM_CAPSTONE=ON \
|
||||
-DUSE_SYSTEM_MD4C=ON \
|
||||
..
|
||||
|
||||
ninja
|
||||
|
||||
- name: 🧪 Test if plugin can be loaded
|
||||
run: |
|
||||
export WORKSPACE=$(echo "${{ github.workspace }}" | tr '\\' '/')
|
||||
${WORKSPACE}/out/imhex.exe --validate-plugin ${WORKSPACE}/template/build/example_plugin.hexplug
|
||||
|
||||
# MacOS build
|
||||
macos-x86:
|
||||
runs-on: macos-13
|
||||
runs-on: macos-15-intel
|
||||
|
||||
permissions:
|
||||
id-token: write
|
||||
@@ -321,12 +394,14 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- suffix: "-NoGPU"
|
||||
- file_suffix: "-NoGPU"
|
||||
name_suffix: "NoGPU"
|
||||
custom_glfw: true
|
||||
- suffix: ""
|
||||
- file_suffix: ""
|
||||
name_suffix: ""
|
||||
custom_glfw: false
|
||||
|
||||
name: 🍎 macOS 13${{ matrix.suffix }}
|
||||
name: 🍎 macOS 15 x86_64 ${{ matrix.name_suffix }}
|
||||
|
||||
steps:
|
||||
- name: 🧰 Checkout
|
||||
@@ -341,8 +416,8 @@ jobs:
|
||||
- name: 📜 Setup ccache
|
||||
uses: hendrikmuhs/ccache-action@v1
|
||||
with:
|
||||
key: ${{ runner.os }}${{ matrix.suffix }}-ccache-${{ github.run_id }}
|
||||
restore-keys: ${{ runner.os }}${{ matrix.suffix }}-ccache
|
||||
key: ${{ runner.os }}${{ matrix.file_suffix }}-ccache-${{ github.run_id }}
|
||||
restore-keys: ${{ runner.os }}${{ matrix.file_suffix }}-ccache
|
||||
max-size: 1G
|
||||
|
||||
- name: Set Xcode version
|
||||
@@ -457,7 +532,7 @@ jobs:
|
||||
break;
|
||||
fi
|
||||
done
|
||||
mv *.dmg ../../imhex-${{ env.IMHEX_VERSION }}-macOS${{ matrix.suffix }}-x86_64.dmg
|
||||
mv *.dmg ../../imhex-${{ env.IMHEX_VERSION }}-macOS${{ matrix.file_suffix }}-x86_64.dmg
|
||||
|
||||
- name: 🗝️ Generate build provenance attestations
|
||||
uses: actions/attest-build-provenance@v2
|
||||
@@ -470,12 +545,12 @@ jobs:
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
if-no-files-found: error
|
||||
name: macOS DMG${{ matrix.suffix }} x86_64
|
||||
name: macOS DMG ${{ matrix.name_suffix }} x86_64
|
||||
path: ./*.dmg
|
||||
|
||||
macos-arm64:
|
||||
runs-on: ubuntu-24.04
|
||||
name: 🍎 macOS 13 arm64
|
||||
name: 🍎 macOS 15 arm64
|
||||
|
||||
outputs:
|
||||
IMHEX_VERSION: ${{ steps.build.outputs.IMHEX_VERSION }}
|
||||
@@ -490,7 +565,8 @@ jobs:
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: cache
|
||||
key: build-macos-arm64-cache
|
||||
key: macos-arm64-cache-${{ github.run_id }}
|
||||
restore-keys: macos-arm64-cache
|
||||
|
||||
- name: 🐳 Inject /cache into docker
|
||||
uses: reproducible-containers/buildkit-cache-dance@v2
|
||||
@@ -518,11 +594,11 @@ jobs:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
gh extension install actions/gh-actions-cache
|
||||
gh actions-cache delete "build-macos-arm64-cache" --confirm || true
|
||||
gh cache delete "macos-arm64-cache" --confirm || true
|
||||
|
||||
macos-arm64-package:
|
||||
runs-on: macos-13
|
||||
name: 🍎 macOS 13 arm64 Packaging
|
||||
runs-on: macos-15-intel
|
||||
name: 🍎 macOS 15 arm64 Packaging
|
||||
needs: macos-arm64
|
||||
|
||||
env:
|
||||
@@ -577,7 +653,7 @@ jobs:
|
||||
break;
|
||||
fi
|
||||
done
|
||||
mv *.dmg ../imhex-${{ env.IMHEX_VERSION }}-macOS${{ matrix.suffix }}-arm64.dmg
|
||||
mv *.dmg ../imhex-${{ env.IMHEX_VERSION }}-macOS${{ matrix.file_suffix }}-arm64.dmg
|
||||
|
||||
- name: 🗝️ Generate build provenance attestations
|
||||
uses: actions/attest-build-provenance@v2
|
||||
@@ -600,7 +676,6 @@ jobs:
|
||||
matrix:
|
||||
include:
|
||||
- release_num: "24.04"
|
||||
- release_num: "24.10"
|
||||
- release_num: "25.04"
|
||||
|
||||
name: 🐧 Ubuntu ${{ matrix.release_num }}
|
||||
@@ -815,6 +890,7 @@ jobs:
|
||||
-DUSE_SYSTEM_YARA=ON \
|
||||
-DUSE_SYSTEM_NLOHMANN_JSON=ON \
|
||||
-DUSE_SYSTEM_CAPSTONE=OFF \
|
||||
-DUSE_SYSTEM_MD4C=ON \
|
||||
-DIMHEX_PATTERNS_PULL_MASTER=ON \
|
||||
-DIMHEX_COMMIT_HASH_LONG="${GITHUB_SHA}" \
|
||||
-DIMHEX_COMMIT_BRANCH="${GITHUB_REF##*/}" \
|
||||
@@ -875,19 +951,18 @@ jobs:
|
||||
matrix:
|
||||
include:
|
||||
- name: Fedora
|
||||
mock_release: rawhide
|
||||
release_num: rawhide
|
||||
mock_config: fedora-rawhide
|
||||
- name: Fedora
|
||||
mock_release: f42
|
||||
release_num: 43
|
||||
mock_config: fedora-43
|
||||
- name: Fedora
|
||||
release_num: 42
|
||||
mock_config: fedora-42
|
||||
- name: Fedora
|
||||
mock_release: f41
|
||||
release_num: 41
|
||||
mock_config: fedora-41
|
||||
- name: RHEL-AlmaLinux
|
||||
mock_release: epel9
|
||||
release_num: 9
|
||||
mock_config: "alma+epel-9"
|
||||
|
||||
@@ -895,7 +970,7 @@ jobs:
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
container:
|
||||
image: "almalinux:9"
|
||||
image: "almalinux:10"
|
||||
options: --privileged --pid=host --security-opt apparmor=unconfined
|
||||
|
||||
permissions:
|
||||
@@ -904,10 +979,10 @@ jobs:
|
||||
|
||||
steps:
|
||||
# This, together with the `--pid=host --security-opt apparmor=unconfined` docker options is required to allow
|
||||
# fedpkg to work inside a Docker container running on Ubuntu again.
|
||||
# mock 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'
|
||||
# Without this, mock 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: |
|
||||
@@ -926,19 +1001,19 @@ jobs:
|
||||
submodules: recursive
|
||||
|
||||
- name: 📜 Setup DNF Cache
|
||||
if: false # Disabled for now since it fills up the cache very quickly
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: /var/cache/dnf
|
||||
key: ${{ matrix.mock_release }}-dnf-${{ github.run_id }}
|
||||
restore-keys: |
|
||||
${{ matrix.mock_release }}-dnf
|
||||
key: dnf-ccache-${{ matrix.mock_config }}-${{ github.run_id }}
|
||||
restore-keys: dnf-ccache-${{ matrix.mock_config }}
|
||||
|
||||
- name: ⬇️ Update all packages and install dependencies
|
||||
run: |
|
||||
set -x
|
||||
dnf upgrade -y
|
||||
dnf install -y \
|
||||
fedpkg \
|
||||
mock \
|
||||
ccache
|
||||
|
||||
- name: ⬇️ Install .NET
|
||||
@@ -949,8 +1024,8 @@ jobs:
|
||||
- name: 📜 Setup ccache
|
||||
uses: hendrikmuhs/ccache-action@v1
|
||||
with:
|
||||
key: ${{ matrix.mock_release }}-rpm-${{ github.run_id }}
|
||||
restore-keys: ${{ matrix.mock_release }}-rpm
|
||||
key: ${{ matrix.mock_config }}-rpm-${{ github.run_id }}
|
||||
restore-keys: ${{ matrix.mock_config }}-rpm
|
||||
max-size: 1G
|
||||
|
||||
- name: 📜 Set version variable
|
||||
@@ -967,34 +1042,33 @@ jobs:
|
||||
-e 's/IMHEX_OFFLINE_BUILD=ON/IMHEX_OFFLINE_BUILD=OFF/g' \
|
||||
-e '/IMHEX_OFFLINE_BUILD=OFF/a -D IMHEX_PATTERNS_PULL_MASTER=ON \\' \
|
||||
-e '/BuildRequires: cmake/a BuildRequires: git-core' \
|
||||
-e '/%files/a %{_datadir}/%{name}/' \
|
||||
-e '/%files/a %{_datadir}/imhex/' \
|
||||
$GITHUB_WORKSPACE/ImHex/dist/rpm/imhex.spec
|
||||
|
||||
- name: 📜 Fix ccache on EL9
|
||||
if: matrix.mock_release == 'epel9'
|
||||
if: matrix.mock_config == 'alma+epel-9'
|
||||
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
|
||||
run: mv $GITHUB_WORKSPACE/ImHex/dist/rpm/imhex.spec $GITHUB_WORKSPACE/imhex.spec
|
||||
|
||||
- name: 📜 Enable ccache for mock
|
||||
run: |
|
||||
cat <<EOT > $GITHUB_WORKSPACE/mock.cfg
|
||||
include('${{ matrix.mock_config }}-x86_64.cfg')
|
||||
config_opts['plugin_conf']['ccache_enable'] = True
|
||||
config_opts['plugin_conf']['ccache_opts']['max_cache_size'] = '1G'
|
||||
config_opts['plugin_conf']['ccache_opts']['compress'] = True
|
||||
config_opts['plugin_conf']['ccache_opts']['dir'] = "$GITHUB_WORKSPACE/.ccache"
|
||||
EOT
|
||||
|
||||
# Fedora cmake build (in imhex.spec)
|
||||
- name: 📦 Build RPM
|
||||
run: |
|
||||
fedpkg --path $GITHUB_WORKSPACE --release ${{ matrix.mock_release }} mockbuild --enable-network -N --root $GITHUB_WORKSPACE/mock.cfg extra_args -- -v
|
||||
mock -r ${{ matrix.mock_config }}-x86_64 \
|
||||
--define 'debug_package %{nil}' \
|
||||
--enable-network -N -v \
|
||||
--enable-plugin=ccache \
|
||||
--plugin-option=ccache:compress=True \
|
||||
--plugin-option=ccache:max_cache_size=200M \
|
||||
--plugin-option=ccache:dir=$GITHUB_WORKSPACE/.ccache \
|
||||
--spec $GITHUB_WORKSPACE/imhex.spec \
|
||||
--sources $GITHUB_WORKSPACE \
|
||||
--resultdir $GITHUB_WORKSPACE/results
|
||||
|
||||
- name: 🟩 Move and rename finished RPM
|
||||
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 }}-0.*.x86_64.rpm \
|
||||
$GITHUB_WORKSPACE/imhex-${{ env.IMHEX_VERSION }}-${{ matrix.name }}-${{ matrix.release_num }}-x86_64.rpm
|
||||
|
||||
- name: 🗝️ Generate build provenance attestations
|
||||
@@ -1012,6 +1086,146 @@ jobs:
|
||||
path: |
|
||||
imhex-${{ env.IMHEX_VERSION }}-${{ matrix.name }}-${{ matrix.release_num }}-x86_64.rpm
|
||||
|
||||
snap-build:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- architecture: "x86_64"
|
||||
image: ubuntu-24.04
|
||||
- architecture: "arm64"
|
||||
image: ubuntu-24.04-arm
|
||||
name: 🐧 Snap ${{ matrix.architecture }}
|
||||
runs-on: ${{ matrix.image }}
|
||||
|
||||
permissions:
|
||||
id-token: write
|
||||
attestations: write
|
||||
steps:
|
||||
- name: ⬇️ Install setup dependencies
|
||||
run: |
|
||||
sudo apt update && sudo apt install -y git curl snapd ccache
|
||||
|
||||
for i in $(seq 1 5); do
|
||||
if sudo snap install snapcraft --classic; then
|
||||
break;
|
||||
fi
|
||||
echo "Retrying snap install..."
|
||||
sleep 10
|
||||
done
|
||||
|
||||
- name: 🧰 Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: 📜 Set version variable
|
||||
run: |
|
||||
export IMHEX_VERSION=$(cat VERSION)
|
||||
echo "IMHEX_VERSION=$IMHEX_VERSION" >> $GITHUB_ENV
|
||||
|
||||
if [[ "$IMHEX_VERSION" == *.WIP ]]; then
|
||||
echo "IMHEX_VERSION_STRING=$IMHEX_VERSION-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV
|
||||
else
|
||||
echo "IMHEX_VERSION_STRING=$IMHEX_VERSION" >> $GITHUB_ENV
|
||||
fi
|
||||
echo "CCACHE=ccache" >> $GITHUB_ENV
|
||||
|
||||
- name: 📜 Move snap directory to root
|
||||
run: |
|
||||
mkdir -p ./snap
|
||||
envsubst '${IMHEX_VERSION_STRING},${CCACHE}' < ./dist/snap/snapcraft.yaml > ./snap/snapcraft.yaml
|
||||
|
||||
- name: 📜 Setup ccache
|
||||
uses: hendrikmuhs/ccache-action@v1
|
||||
with:
|
||||
key: ${{ matrix.architecture }}-snap-${{ github.run_id }}
|
||||
restore-keys: ${{ matrix.architecture }}-snap
|
||||
max-size: 1G
|
||||
|
||||
- name: 🛠️ Build
|
||||
run: |
|
||||
sudo snapcraft --destructive-mode
|
||||
|
||||
- name: 🟩 Rename Snap
|
||||
run: |
|
||||
mv *.snap imhex-${{ env.IMHEX_VERSION }}-${{ matrix.architecture }}.snap
|
||||
|
||||
- name: 🗝️ Generate build provenance attestations
|
||||
uses: actions/attest-build-provenance@v2
|
||||
if: ${{ github.event.repository.fork == false && github.event_name != 'pull_request' }}
|
||||
with:
|
||||
subject-path: |
|
||||
*.snap
|
||||
|
||||
- name: ⬆️ Upload Snap
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
if-no-files-found: error
|
||||
name: Snap ${{ matrix.architecture }}
|
||||
path: |
|
||||
*.snap
|
||||
|
||||
flatpak-build:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- architecture: "x86_64"
|
||||
flatpak_arch: "x86_64"
|
||||
image: ubuntu-24.04
|
||||
- architecture: "arm64"
|
||||
flatpak_arch: "aarch64"
|
||||
image: ubuntu-24.04-arm
|
||||
name: 🐧 Flatpak ${{ matrix.architecture }}
|
||||
runs-on: ${{ matrix.image }}
|
||||
|
||||
permissions:
|
||||
id-token: write
|
||||
attestations: write
|
||||
|
||||
steps:
|
||||
- name: ⬇️ Install setup dependencies
|
||||
run: |
|
||||
sudo apt update && sudo apt install -y git curl flatpak-builder
|
||||
sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
|
||||
sudo flatpak remote-modify --enable flathub
|
||||
sudo flatpak install --noninteractive --system flathub org.freedesktop.Platform//24.08 org.freedesktop.Sdk//24.08
|
||||
|
||||
- name: 🧰 Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: 📜 Set version variable
|
||||
run: |
|
||||
echo "IMHEX_VERSION=`cat VERSION`" >> $GITHUB_ENV
|
||||
|
||||
- name: 🛠️ Build
|
||||
uses: flatpak/flatpak-github-actions/flatpak-builder@v6
|
||||
with:
|
||||
bundle: imhex-${{ env.IMHEX_VERSION }}-${{ matrix.architecture }}.flatpak
|
||||
manifest-path: dist/flatpak/net.werwolv.ImHex.yaml
|
||||
cache-key: flatpak-builder-${{ matrix.architecture }}
|
||||
arch: ${{ matrix.flatpak_arch }}
|
||||
upload-artifact: false
|
||||
|
||||
|
||||
- name: 🗝️ Generate build provenance attestations
|
||||
uses: actions/attest-build-provenance@v2
|
||||
if: ${{ github.event.repository.fork == false && github.event_name != 'pull_request' }}
|
||||
with:
|
||||
subject-path: |
|
||||
imhex-${{ env.IMHEX_VERSION }}-${{ matrix.architecture }}.flatpak
|
||||
|
||||
- name: ⬆️ Upload Flatpak
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
if-no-files-found: error
|
||||
name: Flatpak ${{ matrix.architecture }}
|
||||
path: |
|
||||
imhex-${{ env.IMHEX_VERSION }}-${{ matrix.architecture }}.flatpak
|
||||
|
||||
webassembly-build:
|
||||
runs-on: ubuntu-24.04
|
||||
name: 🌍 Web
|
||||
@@ -1029,7 +1243,8 @@ jobs:
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: cache
|
||||
key: web-cache-${{ hashFiles('**/CMakeLists.txt') }}
|
||||
key: webassembly-ccache-${{ github.run_id }}
|
||||
restore-keys: webassembly-ccache
|
||||
|
||||
- name: 🐳 Inject /cache into docker
|
||||
uses: reproducible-containers/buildkit-cache-dance@v2
|
||||
@@ -1043,12 +1258,14 @@ jobs:
|
||||
docker buildx build . -f dist/web/Dockerfile --progress=plain --build-arg 'JOBS=4' --output out/nightly --target raw
|
||||
|
||||
- name: ⬇️ Download Release
|
||||
if: ${{ github.event.repository.fork == false }}
|
||||
uses: robinraju/release-downloader@v1
|
||||
with:
|
||||
latest: true
|
||||
fileName: 'imhex-*-Web.zip'
|
||||
|
||||
- name: 🔨 Fix permissions
|
||||
if: ${{ github.event.repository.fork == false }}
|
||||
run: |
|
||||
unzip imhex-*-Web.zip -d out
|
||||
chmod -c -R +rX "out/"
|
||||
|
||||
165
.github/workflows/nightly_release.yml
vendored
Normal file
165
.github/workflows/nightly_release.yml
vendored
Normal file
@@ -0,0 +1,165 @@
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
name: Nightly Release
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
nightly-release:
|
||||
runs-on: ubuntu-24.04
|
||||
name: 🌃 Update Nightly Release
|
||||
steps:
|
||||
- name: 🧰 Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
path: ImHex
|
||||
fetch-depth: 0
|
||||
fetch-tags: true
|
||||
|
||||
- name: 🌃 Check for new commits
|
||||
id: check_commits
|
||||
run: |
|
||||
cd ImHex
|
||||
git config --global --add safe.directory $(pwd)
|
||||
if [ -z "$(git log nightly..HEAD --oneline)" ]; then
|
||||
echo "No new commits since last nightly. Exiting."
|
||||
echo "::set-output name=should_run::false"
|
||||
else
|
||||
echo "::set-output name=should_run::true"
|
||||
fi
|
||||
|
||||
- name: 📜 Set version variable
|
||||
if: ${{ steps.check_commits.outputs.should_run == 'true' }}
|
||||
run: |
|
||||
project_version=`cat ImHex/VERSION`
|
||||
echo "IMHEX_VERSION=$project_version" >> $GITHUB_ENV
|
||||
|
||||
- name: ⬇️ Download artifacts from latest workflow
|
||||
uses: dawidd6/action-download-artifact@v6
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
workflow: build.yml
|
||||
branch: ${{ github.event.release.target_commitish }}
|
||||
workflow_conclusion: success
|
||||
skip_unpack: true
|
||||
|
||||
- name: 🗜️ Unzip files when needed
|
||||
if: ${{ steps.check_commits.outputs.should_run == 'true' }}
|
||||
run: |
|
||||
set -x
|
||||
for zipfile in ./*.zip
|
||||
do
|
||||
if [ `zipinfo -1 "$zipfile" | wc -l` -eq 1 ];
|
||||
then
|
||||
echo "unzipping $zipfile"
|
||||
unzip "$zipfile"
|
||||
rm "$zipfile"
|
||||
else
|
||||
echo "keeping $zipfile zipped"
|
||||
fi
|
||||
done
|
||||
|
||||
- name: 🟩 Rename artifacts when needed
|
||||
if: ${{ steps.check_commits.outputs.should_run == 'true' }}
|
||||
run: |
|
||||
mv "Windows Portable x86_64.zip" imhex-${{ env.IMHEX_VERSION }}-Windows-Portable-x86_64.zip
|
||||
mv "Windows Portable arm64.zip" imhex-${{ env.IMHEX_VERSION }}-Windows-Portable-arm64.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
|
||||
rm artifact.tar || true
|
||||
|
||||
- name: 📖 Generate Release Notes
|
||||
if: ${{ steps.check_commits.outputs.should_run == 'true' }}
|
||||
id: release_notes
|
||||
continue-on-error: true
|
||||
run: |
|
||||
cd ImHex
|
||||
echo "## Nightly ${GITHUB_SHA::7} Changelog" > changelog.md
|
||||
git fetch --tags --recurse-submodules=no
|
||||
git log nightly..origin/master --oneline --no-merges --pretty=format:'* %s' >> changelog.md
|
||||
|
||||
- name: ⬆️ Upload Unsigned x86_64 Windows Installer
|
||||
if: false
|
||||
uses: actions/upload-artifact@v4
|
||||
id: upload-installer-x86_64
|
||||
with:
|
||||
if-no-files-found: error
|
||||
name: Windows Installer ${{ matrix.architecture_name }}
|
||||
path: |
|
||||
imhex-*-x86_64.msi
|
||||
|
||||
- name: ⬆️ Upload Unsigned ARM64 Windows Installer
|
||||
if: false
|
||||
uses: actions/upload-artifact@v4
|
||||
id: upload-installer-arm64
|
||||
with:
|
||||
if-no-files-found: error
|
||||
name: Windows Installer ${{ matrix.architecture_name }}
|
||||
path: |
|
||||
imhex-*-arm64.msi
|
||||
|
||||
- name: 🗑️ Delete unsigned installers
|
||||
if: false
|
||||
run: |
|
||||
rm imhex-*.msi
|
||||
|
||||
- name: 🗝️ Sign Installer
|
||||
if: false
|
||||
uses: signpath/github-action-submit-signing-request@v1
|
||||
with:
|
||||
api-token: '${{ secrets.SIGNPATH_API_TOKEN }}'
|
||||
organization-id: 'f605a0e8-86cd-411c-bb6f-e05025afcc33'
|
||||
project-slug: 'ImHex'
|
||||
signing-policy-slug: 'release-signing'
|
||||
github-artifact-id: '${{ steps.upload-installer.outputs.artifact-id }}'
|
||||
wait-for-completion: true
|
||||
output-artifact-directory: '.'
|
||||
|
||||
- name: 📦 Update Pre-Release
|
||||
if: ${{ steps.check_commits.outputs.should_run == 'true' }}
|
||||
run: |
|
||||
set -e
|
||||
|
||||
cd ImHex
|
||||
|
||||
# Move nightly tag to latest commit
|
||||
git tag -f nightly origin/master
|
||||
git push origin nightly --force
|
||||
|
||||
# Auth for GitHub CLI
|
||||
echo "${{ github.token }}" | gh auth login --with-token
|
||||
|
||||
# Delete existing assets
|
||||
for asset in $(gh release view nightly --json assets --jq '.assets[].name'); do
|
||||
gh release delete-asset nightly "$asset" --yes
|
||||
done
|
||||
|
||||
# Update release notes
|
||||
gh release edit nightly --notes-file changelog.md
|
||||
|
||||
# Upload new assets
|
||||
gh release upload nightly ../*.* --clobber
|
||||
|
||||
- name: ⬆️ Publish x86_64 Snap package
|
||||
if: ${{ steps.check_commits.outputs.should_run == 'true' }}
|
||||
continue-on-error: true
|
||||
uses: snapcore/action-publish@v1
|
||||
env:
|
||||
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_STORE_LOGIN }}
|
||||
with:
|
||||
snap: imhex-${{ env.IMHEX_VERSION }}-x86_64.snap
|
||||
release: edge
|
||||
|
||||
- name: ⬆️ Publish arm64 Snap package
|
||||
if: ${{ steps.check_commits.outputs.should_run == 'true' }}
|
||||
continue-on-error: true
|
||||
uses: snapcore/action-publish@v1
|
||||
env:
|
||||
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_STORE_LOGIN }}
|
||||
with:
|
||||
snap: imhex-${{ env.IMHEX_VERSION }}-arm64.snap
|
||||
release: edge
|
||||
124
.github/workflows/release.yml
vendored
124
.github/workflows/release.yml
vendored
@@ -7,6 +7,12 @@ on:
|
||||
release:
|
||||
types: [published]
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
commit_hash:
|
||||
type: string
|
||||
description: 'The commit hash to build (defaults to the latest commit on the default branch)'
|
||||
required: false
|
||||
default: ''
|
||||
|
||||
jobs:
|
||||
release-update-repos:
|
||||
@@ -25,7 +31,7 @@ jobs:
|
||||
project_version=`cat ImHex/VERSION`
|
||||
tag_version="${{github.event.release.tag_name}}"
|
||||
tag_version="${tag_version:1}"
|
||||
if [ "$project_version" != "$tag_version" ]; then
|
||||
if [ "$project_version" != "$tag_version" ] && [ ! -z "$tag_version" ]; then
|
||||
echo "::warning::$project_version and $tag_version are not the same ! Refusing to populate release"
|
||||
exit 1
|
||||
fi
|
||||
@@ -41,6 +47,7 @@ jobs:
|
||||
tag: ImHex-v${{ env.IMHEX_VERSION }}
|
||||
repo: PatternLanguage
|
||||
token: ${{ secrets.RELEASE_TOKEN }}
|
||||
skipIfReleaseExists: true
|
||||
|
||||
- name: 🎫 Create ImHex-Patterns release
|
||||
uses: ncipollo/release-action@v1
|
||||
@@ -51,6 +58,7 @@ jobs:
|
||||
tag: ImHex-v${{ env.IMHEX_VERSION }}
|
||||
repo: ImHex-Patterns
|
||||
token: ${{ secrets.RELEASE_TOKEN }}
|
||||
skipIfReleaseExists: true
|
||||
|
||||
- name: 🎫 Create imhex-download-sdk release
|
||||
uses: ncipollo/release-action@v1
|
||||
@@ -61,11 +69,13 @@ jobs:
|
||||
tag: v${{ env.IMHEX_VERSION }}
|
||||
repo: imhex-download-sdk
|
||||
token: ${{ secrets.RELEASE_TOKEN }}
|
||||
skipIfReleaseExists: true
|
||||
|
||||
release-upload-artifacts:
|
||||
runs-on: ubuntu-24.04
|
||||
name: Release Upload Artifacts
|
||||
|
||||
outputs:
|
||||
IMHEX_VERSION: ${{ steps.verify_version.outputs.IMHEX_VERSION }}
|
||||
steps:
|
||||
- name: 🧰 Checkout
|
||||
uses: actions/checkout@v4
|
||||
@@ -74,17 +84,19 @@ jobs:
|
||||
submodules: recursive
|
||||
|
||||
- name: 📜 Verify version and set version variable
|
||||
id: verify_version
|
||||
run: |
|
||||
set -x
|
||||
project_version=`cat ImHex/VERSION`
|
||||
tag_version="${{github.event.release.tag_name}}"
|
||||
tag_version="${tag_version:1}"
|
||||
if [ "$project_version" != "$tag_version" ]; then
|
||||
if [ "$project_version" != "$tag_version" ] && [ ! -z "$tag_version" ]; then
|
||||
echo "::warning::$project_version and $tag_version are not the same ! Refusing to populate release"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "IMHEX_VERSION=$project_version" >> $GITHUB_ENV
|
||||
echo "IMHEX_VERSION=$project_version" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: 🗜️ Create tarball from sources with dependencies
|
||||
run: tar --exclude-vcs -czvf Full.Sources.tar.gz ImHex
|
||||
@@ -92,11 +104,12 @@ jobs:
|
||||
- name: ⬇️ Download artifacts from latest workflow
|
||||
uses: dawidd6/action-download-artifact@v6
|
||||
with:
|
||||
github_token: ${{secrets.GITHUB_TOKEN}}
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
workflow: build.yml
|
||||
branch: ${{ github.event.release.target_commitish }}
|
||||
workflow_conclusion: success
|
||||
skip_unpack: true
|
||||
commit: ${{ github.event.inputs.commit_hash }}
|
||||
|
||||
- name: 🗜️ Unzip files when needed
|
||||
run: |
|
||||
@@ -115,24 +128,82 @@ jobs:
|
||||
|
||||
- name: 🟩 Rename artifacts when needed
|
||||
run: |
|
||||
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 "ImHex Web.zip" imhex-${{ env.IMHEX_VERSION }}-Web.zip
|
||||
rm artifact.tar
|
||||
mv "Windows Portable x86_64.zip" imhex-${{ env.IMHEX_VERSION }}-Windows-Portable-x86_64.zip || true
|
||||
mv "Windows Portable arm64.zip" imhex-${{ env.IMHEX_VERSION }}-Windows-Portable-arm64.zip || true
|
||||
mv "Windows Portable NoGPU x86_64.zip" imhex-${{ env.IMHEX_VERSION }}-Windows-Portable-NoGPU-x86_64.zip || true
|
||||
mv "ImHex Web.zip" imhex-${{ env.IMHEX_VERSION }}-Web.zip || true
|
||||
rm artifact.tar || true
|
||||
|
||||
- name: ⬆️ Upload Unsigned x86_64 Windows Installer
|
||||
uses: actions/upload-artifact@v4
|
||||
id: upload-installer-x86_64
|
||||
with:
|
||||
if-no-files-found: error
|
||||
name: Windows Installer x86_64
|
||||
path: |
|
||||
imhex-*-x86_64.msi
|
||||
|
||||
- name: ⬆️ Upload Unsigned ARM64 Windows Installer
|
||||
if: false
|
||||
uses: actions/upload-artifact@v4
|
||||
id: upload-installer-arm64
|
||||
with:
|
||||
if-no-files-found: error
|
||||
name: Windows Installer ARM64
|
||||
path: |
|
||||
imhex-*-arm64.msi
|
||||
|
||||
- name: 🗑️ Delete unsigned installers
|
||||
run: |
|
||||
rm imhex-*-x86_64.msi
|
||||
|
||||
- name: 🗝️ Sign x86_64 Installer
|
||||
uses: signpath/github-action-submit-signing-request@v1
|
||||
with:
|
||||
api-token: '${{ secrets.SIGNPATH_API_TOKEN }}'
|
||||
organization-id: 'f605a0e8-86cd-411c-bb6f-e05025afcc33'
|
||||
project-slug: 'ImHex'
|
||||
signing-policy-slug: 'release-signing'
|
||||
github-artifact-id: '${{ steps.upload-installer-x86_64.outputs.artifact-id }}'
|
||||
wait-for-completion: true
|
||||
output-artifact-directory: '.'
|
||||
|
||||
- name: 🗝️ Sign ARM64 Installer
|
||||
if: false
|
||||
uses: signpath/github-action-submit-signing-request@v1
|
||||
with:
|
||||
api-token: '${{ secrets.SIGNPATH_API_TOKEN }}'
|
||||
organization-id: 'f605a0e8-86cd-411c-bb6f-e05025afcc33'
|
||||
project-slug: 'ImHex'
|
||||
signing-policy-slug: 'release-signing'
|
||||
github-artifact-id: '${{ steps.upload-installer-arm64.outputs.artifact-id }}'
|
||||
wait-for-completion: true
|
||||
output-artifact-directory: '.'
|
||||
|
||||
- name: ⬆️ Upload everything to release
|
||||
uses: softprops/action-gh-release@4634c16e79c963813287e889244c50009e7f0981
|
||||
with:
|
||||
files: '*'
|
||||
|
||||
release-update-aur:
|
||||
name: Release update AUR package
|
||||
needs: release-upload-artifacts
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: ⬇️ Download artifacts
|
||||
run: |
|
||||
tagname=${GITHUB_REF#refs/tags/}
|
||||
version=${tagname#v}
|
||||
wget https://github.com/WerWolv/ImHex/releases/download/${tagname}/imhex-${version}-ArchLinux-x86_64.pkg.tar.zst
|
||||
|
||||
- name: ✒️ Prepare PKGBUILD
|
||||
run: |
|
||||
set -x
|
||||
cp ImHex/dist/Arch/PKGBUILD .
|
||||
|
||||
hash=`md5sum imhex-${{ env.IMHEX_VERSION }}-ArchLinux-x86_64.pkg.tar.zst | cut -d ' ' -f 1`
|
||||
hash=`md5sum imhex-${{ needs.release-upload-artifacts.outputs.IMHEX_VERSION }}-ArchLinux-x86_64.pkg.tar.zst | cut -d ' ' -f 1`
|
||||
|
||||
sed -i 's/%version%/${{ env.IMHEX_VERSION }}/g' PKGBUILD
|
||||
sed -i 's/%version%/${{ needs.release-upload-artifacts.outputs.IMHEX_VERSION }}/g' PKGBUILD
|
||||
sed -i "s/(SKIP)/($hash)/g" PKGBUILD
|
||||
|
||||
- name: ⬆️ Publish AUR package
|
||||
@@ -148,7 +219,7 @@ jobs:
|
||||
commit_username: iTrooz
|
||||
commit_email: itrooz@protonmail.com
|
||||
ssh_private_key: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
|
||||
commit_message: Bump to version ${{ env.IMHEX_VERSION }}
|
||||
commit_message: Bump to version ${{ needs.release-upload-artifacts.outputs.IMHEX_VERSION }}
|
||||
ssh_keyscan_types: rsa,ecdsa,ed25519
|
||||
|
||||
release-update-winget:
|
||||
@@ -160,6 +231,7 @@ jobs:
|
||||
shell: pwsh
|
||||
run: |
|
||||
iwr https://aka.ms/wingetcreate/latest -OutFile wingetcreate.exe
|
||||
|
||||
- name: ⬆️ Update winget manifest
|
||||
shell: pwsh
|
||||
env:
|
||||
@@ -173,3 +245,33 @@ jobs:
|
||||
if ($version -notmatch "-") {
|
||||
.\wingetcreate.exe submit .\manifests\w\WerWolv\ImHex\${version}\ --token $env:WINGET_GITHUB_TOKEN
|
||||
}
|
||||
|
||||
release-update-snapstore:
|
||||
name: Release update snapstore package
|
||||
needs: release-upload-artifacts
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- name: ⬇️ Download artifacts
|
||||
run: |
|
||||
tagname=${GITHUB_REF#refs/tags/}
|
||||
version=${tagname#v}
|
||||
wget https://github.com/WerWolv/ImHex/releases/download/${tagname}/imhex-${version}-x86_64.snap
|
||||
wget https://github.com/WerWolv/ImHex/releases/download/${tagname}/imhex-${version}-arm64.snap
|
||||
|
||||
- name: ⬆️ Publish x86_64 Snap package
|
||||
continue-on-error: true
|
||||
uses: snapcore/action-publish@v1
|
||||
env:
|
||||
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_STORE_LOGIN }}
|
||||
with:
|
||||
snap: imhex-${{ needs.release-upload-artifacts.outputs.IMHEX_VERSION }}-x86_64.snap
|
||||
release: stable
|
||||
|
||||
- name: ⬆️ Publish arm64 Snap package
|
||||
continue-on-error: true
|
||||
uses: snapcore/action-publish@v1
|
||||
env:
|
||||
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_STORE_LOGIN }}
|
||||
with:
|
||||
snap: imhex-${{ needs.release-upload-artifacts.outputs.IMHEX_VERSION }}-arm64.snap
|
||||
release: stable
|
||||
1
.github/workflows/stale_issues.yml
vendored
1
.github/workflows/stale_issues.yml
vendored
@@ -6,6 +6,7 @@ on:
|
||||
|
||||
jobs:
|
||||
close-issues:
|
||||
if: false # Disabled for now until I actually have time to take care of all these issues
|
||||
runs-on: ubuntu-24.04
|
||||
permissions:
|
||||
issues: write
|
||||
|
||||
25
.gitignore
vendored
25
.gitignore
vendored
@@ -1,14 +1,18 @@
|
||||
.vscode/
|
||||
.idea/
|
||||
.kdev4/
|
||||
/.vscode/
|
||||
/.idea/
|
||||
/.kdev4/
|
||||
/.vs/
|
||||
.venv/
|
||||
|
||||
cmake-build-*/
|
||||
build*/
|
||||
local/
|
||||
venv/
|
||||
.cache/
|
||||
install/
|
||||
out/
|
||||
/cmake-build-*/
|
||||
/build*/
|
||||
/local/
|
||||
/venv/
|
||||
/.cache/
|
||||
/install/
|
||||
/out/
|
||||
|
||||
/dist/ImHex.run.xml
|
||||
|
||||
*.mgc
|
||||
*.kdev4
|
||||
@@ -17,5 +21,4 @@ imgui.ini
|
||||
CMakeUserPresets.json
|
||||
Brewfile.lock.json
|
||||
|
||||
.vs/
|
||||
vcpkg.json
|
||||
|
||||
9
.gitmodules
vendored
9
.gitmodules
vendored
@@ -18,13 +18,9 @@
|
||||
path = lib/third_party/capstone
|
||||
url = https://github.com/capstone-engine/capstone
|
||||
ignore = dirty
|
||||
[submodule "lib/third_party/jthread/jthread"]
|
||||
path = lib/third_party/jthread/jthread
|
||||
url = https://github.com/josuttis/jthread
|
||||
ignore = dirty
|
||||
[submodule "lib/third_party/edlib"]
|
||||
path = lib/third_party/edlib
|
||||
url = https://github.com/blawrence-ont/edlib
|
||||
url = https://github.com/Martinsos/edlib
|
||||
ignore = dirty
|
||||
[submodule "lib/third_party/lunasvg"]
|
||||
path = lib/third_party/lunasvg
|
||||
@@ -47,3 +43,6 @@
|
||||
[submodule "lib/external/disassembler"]
|
||||
path = lib/external/disassembler
|
||||
url = https://github.com/WerWolv/Disassembler
|
||||
[submodule "lib/third_party/md4c"]
|
||||
path = lib/third_party/md4c
|
||||
url = https://github.com/mity/md4c
|
||||
@@ -1,28 +1,38 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
cmake_minimum_required(VERSION 3.25)
|
||||
|
||||
# Options
|
||||
option(IMHEX_PLUGINS_IN_SHARE "Put the plugins in share/imhex/plugins instead of lib[..]/imhex/plugins (Linux only)" OFF)
|
||||
## General
|
||||
option(IMHEX_STRIP_RELEASE "Strip the release builds" ON )
|
||||
option(IMHEX_OFFLINE_BUILD "Enable offline build" OFF)
|
||||
option(IMHEX_IGNORE_BAD_CLONE "Disable the bad clone prevention checks" OFF)
|
||||
option(IMHEX_PATTERNS_PULL_MASTER "Download latest files from master branch of the ImHex-Patterns repo" OFF)
|
||||
option(IMHEX_IGNORE_BAD_COMPILER "Allow compiling with an unsupported compiler" OFF)
|
||||
option(IMHEX_USE_GTK_FILE_PICKER "Use GTK file picker instead of xdg-desktop-portals (Linux only)" OFF)
|
||||
option(IMHEX_DISABLE_STACKTRACE "Disables support for printing stack traces" OFF)
|
||||
option(IMHEX_BUNDLE_DOTNET "Bundle .NET runtime" ON )
|
||||
option(IMHEX_ENABLE_LTO "Enables Link Time Optimizations if possible" OFF)
|
||||
option(IMHEX_USE_DEFAULT_BUILD_SETTINGS "Use default build settings" OFF)
|
||||
option(IMHEX_STRICT_WARNINGS "Enable most available warnings and treat them as errors" ON )
|
||||
option(IMHEX_STATIC_LINK_PLUGINS "Statically link all plugins into the main executable" OFF)
|
||||
option(IMHEX_BUILD_HARDENING "Enable hardening flags for build" ON )
|
||||
option(IMHEX_GENERATE_PACKAGE "Specify if a native package should be built. (Windows and MacOS only)" OFF)
|
||||
option(IMHEX_ENABLE_UNITY_BUILD "Enables building ImHex as a unity build." OFF)
|
||||
option(IMHEX_ENABLE_PRECOMPILED_HEADERS "Enable precompiled headers" OFF)
|
||||
option(IMHEX_ENABLE_CXX_MODULES "Enable C++20 Module compilation. Testing only!" OFF)
|
||||
option(IMHEX_ENABLE_CPPCHECK "Enable cppcheck static analysis" OFF)
|
||||
option(IMHEX_BUNDLE_PLUGIN_SDK "Enable bundling of Plugin SDK into install package" ON )
|
||||
## Testing
|
||||
option(IMHEX_ENABLE_UNIT_TESTS "Enable building unit tests" ON )
|
||||
option(IMHEX_ENABLE_IMGUI_TEST_ENGINE "Enable the ImGui Test Engine" OFF)
|
||||
option(IMHEX_ENABLE_STD_ASSERTS "Enable debug asserts in the C++ std library. (Breaks Plugin ABI!)" OFF)
|
||||
## Debug info
|
||||
option(IMHEX_COMPRESS_DEBUG_INFO "Compress debug information" ON )
|
||||
option(IMHEX_GENERATE_PDBS "Enable generating PDB files in non-debug builds (Windows only)" OFF)
|
||||
option(IMHEX_REPLACE_DWARF_WITH_PDB "Remove DWARF information from binaries when generating PDBS (Windows only)" OFF)
|
||||
option(IMHEX_ENABLE_STD_ASSERTS "Enable debug asserts in the C++ std library. (Breaks Plugin ABI!)" OFF)
|
||||
option(IMHEX_ENABLE_UNIT_TESTS "Enable building unit tests" OFF)
|
||||
option(IMHEX_ENABLE_PRECOMPILED_HEADERS "Enable precompiled headers" OFF)
|
||||
option(IMHEX_COMPRESS_DEBUG_INFO "Compress debug information" ON )
|
||||
option(IMHEX_ENABLE_CXX_MODULES "Enable C++20 Module compilation. Testing only!" OFF)
|
||||
option(IMHEX_STRICT_WARNINGS "Enable most available warnings and treat them as errors" ON )
|
||||
option(IMHEX_DISABLE_STACKTRACE "Disables support for printing stack traces" OFF)
|
||||
## Plugins
|
||||
option(IMHEX_STATIC_LINK_PLUGINS "Statically link all plugins into the main executable" OFF)
|
||||
option(IMHEX_ENABLE_PLUGIN_TESTS "Enable building plugin tests" ON )
|
||||
option(IMHEX_INCLUDE_PLUGINS "Semicolon-separated list of plugins to include in the build (empty = build all)" "" )
|
||||
option(IMHEX_EXCLUDE_PLUGINS "Semicolon-separated list of plugins to exclude from the build" "" )
|
||||
|
||||
set(IMHEX_BASE_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
set(CMAKE_MODULE_PATH "${IMHEX_BASE_FOLDER}/cmake/modules")
|
||||
@@ -42,7 +52,7 @@ loadVersion(IMHEX_VERSION IMHEX_VERSION_PLAIN)
|
||||
setVariableInParent(IMHEX_VERSION ${IMHEX_VERSION})
|
||||
|
||||
configureCMake()
|
||||
project(imhex
|
||||
project(ImHex
|
||||
LANGUAGES C CXX
|
||||
VERSION ${IMHEX_VERSION_PLAIN}
|
||||
DESCRIPTION "The ImHex Hex Editor"
|
||||
@@ -84,7 +94,9 @@ if (IMHEX_ENABLE_UNIT_TESTS)
|
||||
endif ()
|
||||
|
||||
# Configure more resources that will be added to the install package
|
||||
generateSDKDirectory()
|
||||
if (IMHEX_BUNDLE_PLUGIN_SDK)
|
||||
generateSDKDirectory()
|
||||
endif()
|
||||
|
||||
# Handle package generation
|
||||
createPackage()
|
||||
|
||||
@@ -52,9 +52,23 @@
|
||||
"generator": "Ninja",
|
||||
"binaryDir": "${sourceDir}/build/${presetName}",
|
||||
"cacheVariables": {
|
||||
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake"
|
||||
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
|
||||
"VCPKG_MANIFEST_DIR": "${sourceDir}/dist"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "vs2022-x86",
|
||||
"displayName": "Visual Studio 2022 x86",
|
||||
"generator": "Ninja",
|
||||
"binaryDir": "${sourceDir}/build/${presetName}",
|
||||
"cacheVariables": {
|
||||
"CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
|
||||
"VCPKG_MANIFEST_DIR": "${sourceDir}/dist"
|
||||
},
|
||||
"environment": {
|
||||
"VSCMD_ARG_TGT_ARCH": "x86"
|
||||
}
|
||||
}
|
||||
],
|
||||
"buildPresets": [
|
||||
{
|
||||
|
||||
@@ -10,9 +10,7 @@ This document is a guide for developers who want to contribute to ImHex in any w
|
||||
|
||||
If you'd like to add new features, the best way to start is by joining our Discord and telling us about your idea. We can then discuss the best way to implement it and how it should be integrated into ImHex or if it should be done in a separate plugin.
|
||||
|
||||
There are standalone plugin templates that use ImHex as a submodule. You can find them here:
|
||||
- https://github.com/WerWolv/ImHex-Cpp-Plugin-Template
|
||||
- https://github.com/WerWolv/ImHex-Rust-Plugin-Template
|
||||
There are standalone plugin templates that use ImHex as a submodule. You can find them located in the README's [Plugin Development](README.md#plugin-development) section.
|
||||
|
||||
### Adding a new language
|
||||
|
||||
@@ -32,18 +30,18 @@ ImHex is written in C++ and usually uses the latest compiler and standard librar
|
||||
### Structure
|
||||
|
||||
- `main`: Contains the main application code
|
||||
- Important to understand here is that the main ImHex application is basically just an empty shell.
|
||||
- Important to understand here is that the main ImHex application is basically just an empty shell.
|
||||
- All it does is create a Window and a OpenGL context using GLFW, load all available plugins, properly configure ImGui and render it to the screen.
|
||||
- Everything else is done inside of plugins. ImHex comes with a few plugins by default, most notably the `builtin` plugin which contains the majority of the application code.
|
||||
- In most cases, this code doesn't need to be modified. Most features should be self-contained inside a plugin.
|
||||
- `lib`
|
||||
- `libimhex`: Contains all helper utilities as well as various APIs for plugins to interact with ImHex.
|
||||
- The library's main purpose is for Dependency Inversion. The ImHex main application as well as libimhex do not know about the existence of plugins at build time. Plugins and the main application instead link against libimhex and use it as a common API to interact with each other.
|
||||
- Since libimhex is a doesn't know about the existence of plugins, it cannot depend on any of them. This includes localizations and things that get registered by plugins after launch.
|
||||
- Since libimhex itself doesn't know about the existence of plugins, it cannot depend on any of them. This includes localizations and things that get registered by plugins after launch.
|
||||
- Even if the builtin plugin is technically always available, it is still a plugin and should be treated that way.
|
||||
- All important APIs can be found in the `hex/api` include directory and are documented in the respective header file.
|
||||
- `external`: All libraries that need custom patches or aren't typically available in package managers go into here.
|
||||
- If you'd like to add new features to the Pattern language, please make a PR to https://github.com/WerWolv/PatternLanguage instead. ImHex usually depends on the latest commit of the master branch of this repo.
|
||||
- If you'd like to add new features to the Pattern language, please make a PR to https://github.com/WerWolv/PatternLanguage instead. ImHex usually depends on the latest commit of the master branch of this repo.
|
||||
- `plugins`
|
||||
- `builtin`: The builtin plugin. Contains the majority of the application code.
|
||||
- It's the heart of ImHex's functionality. It contains most of the default views, providers, etc. so if you want to add new functionality to ImHex, this is the place to start.
|
||||
|
||||
12
INSTALL.md
12
INSTALL.md
@@ -27,16 +27,18 @@ chmod +x 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
|
||||
To install the Flatpak, make sure you have the Flathub repository added to your system. Then simply run the following command:
|
||||
|
||||
```bash
|
||||
flatpak install flathub net.werwolv.ImHex
|
||||
# or install the file directly
|
||||
flatpak install ./imhex-*.flatpak
|
||||
```
|
||||
|
||||
#### Snap
|
||||
```bash
|
||||
snap install ./imhex-*.snap
|
||||
```
|
||||
|
||||
#### Ubuntu DEB Package
|
||||
|
||||
8
PRIVACY.md
Normal file
8
PRIVACY.md
Normal file
@@ -0,0 +1,8 @@
|
||||
# Privacy Policy
|
||||
|
||||
ImHex collects **anonymous** user statistics based on the user's preferences which are set on first launch and can be opted in or out at any moment through the settings interface.
|
||||
These statistics contain basic system information such as: ImHex Version, System Architecture, OS, OS Version or Linux Distro version of the GPU in use. This information is linked to a randomly generated ID which cannot be used to identify a specific user.
|
||||
|
||||
Additionally, we allow uploading of anonymized crash log files in case of an error. These are never uploaded automatically but only after explicit consent by the user. This decision is not saved so logs can be uploaded on a per-error basis.
|
||||
|
||||
Information collected may be analyzed by members of our development team and will never be shared with third parties outside of the team. We may occasionally share general usage statistics publically in a summarized manner (For example a graph stating 70% of users are using a specific OS). We will never share information about individual users, even if they are anonymous.
|
||||
62
README.md
62
README.md
@@ -37,6 +37,15 @@ If you like my work, please consider supporting me on GitHub Sponsors, Patreon o
|
||||
<a href="https://werwolv.net/donate"><img src="https://werwolv.net/assets/paypal_banner.png" alt="PayPal donate button" /></a>
|
||||
</p>
|
||||
|
||||
### Notable Sponsors
|
||||
| | |
|
||||
|:---------------------------------------------------------------------------------------------------:|-----------------------------------------------------------------------------------|
|
||||
| [](https://www.jetbrains.com) | JetBrains, providing us with free All Products Pack licenses for development |
|
||||
| [](https://signpath.io/) | SignPath, providing us with free Code Signing Certificates for our Windows builds |
|
||||
| [](https://aws.amazon.com) | Amazon, providing us with free AWS Cloud Credits for our CI |
|
||||
|
||||
Would you like to appear here as well? Contact us at [imhex@werwolv.net](mailto:imhex@werwolv.net)!
|
||||
|
||||
## Screenshots
|
||||

|
||||

|
||||
@@ -107,6 +116,7 @@ If you like my work, please consider supporting me on GitHub Sponsors, Patreon o
|
||||
- Base64 files
|
||||
- IPS and IPS32 patches
|
||||
- Markdown reports
|
||||
- Binary arrays for various programming languages
|
||||
</details>
|
||||
<details>
|
||||
<summary><strong>Data Inspector</strong></summary>
|
||||
@@ -140,8 +150,13 @@ If you like my work, please consider supporting me on GitHub Sponsors, Patreon o
|
||||
- GDB Server
|
||||
- Access the RAM of a running process or embedded devices through GDB
|
||||
- Intel Hex and Motorola SREC data
|
||||
- Base64 encoded data
|
||||
- UDP Packets
|
||||
- Support for displaying raw data received over UDP
|
||||
- Process Memory
|
||||
- Inspect the entire address space of a running process
|
||||
- Remote Files over SSH with SFTP
|
||||
- Support for loading files from remote servers using SSH and SFTP
|
||||
</details>
|
||||
<details>
|
||||
<summary><strong>Data searching</strong></summary>
|
||||
@@ -212,6 +227,7 @@ If you like my work, please consider supporting me on GitHub Sponsors, Patreon o
|
||||
- WebAssembly
|
||||
- MOS65XX
|
||||
- Berkeley Packet Filter
|
||||
- Support for writing custom disassemblers for your own architectures
|
||||
</details>
|
||||
<details>
|
||||
<summary><strong>Bookmarks</strong></summary>
|
||||
@@ -261,6 +277,7 @@ If you like my work, please consider supporting me on GitHub Sponsors, Patreon o
|
||||
- Division by invariant multiplication calculator
|
||||
- TCP Client/Server
|
||||
- Euclidean algorithm calculator
|
||||
- HTTP Requests
|
||||
</details>
|
||||
<details>
|
||||
<summary><strong>Built-in Content updater</strong></summary>
|
||||
@@ -319,21 +336,23 @@ To use ImHex, the following minimal system requirements need to be met.
|
||||
|
||||
- **OS**:
|
||||
- **Windows**: Windows 7 or higher (Windows 10/11 recommended)
|
||||
- **macOS**: macOS 13 (Ventura) or higher,
|
||||
- Lower versions should still work too, but you'll need to compile ImHex yourself. The release binaries will NOT work.
|
||||
- **macOS**: macOS 15 (Sequoia) or higher,
|
||||
- Lower versions should still work too, but you'll need to compile ImHex yourself. The release binaries will NOT work due to GitHub not having any macOS 15 or lower CI runners available.
|
||||
- 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, Flatpak and Snap releases.
|
||||
- Ubuntu and Debian
|
||||
- Fedora
|
||||
- RHEL/AlmaLinux
|
||||
- Arch Linux
|
||||
- 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.
|
||||
- **FreeBSD**: Tested on FreeBSD 14.3
|
||||
- Other versions will most likely work too but are untested
|
||||
- **CPU**: Officially supported are x86, AMD64 and ARM64, though any Little Endian CPU should work.
|
||||
- **GPU**: OpenGL 3.0 or higher
|
||||
- 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
|
||||
- **RAM**: ~150MiB, more is required for more complex analysis
|
||||
- **Storage**: 150MiB
|
||||
- **RAM**: ~50MiB, more is required for more complex analysis
|
||||
- **Storage**: ~100MiB
|
||||
|
||||
## Installing
|
||||
|
||||
@@ -356,9 +375,20 @@ For more information, check out the [Compiling](/dist/compiling) guide.
|
||||
## Contributing
|
||||
See [Contributing](/CONTRIBUTING.md)
|
||||
|
||||
## Plugin development
|
||||
|
||||
## Plugin development
|
||||
To develop plugins for ImHex, use the following template project to get started. You then have access to the entirety of libimhex as well as the ImHex API and the Content Registry to interact with ImHex or to add new content.
|
||||
To build a plugin, you will need to use our SDK
|
||||
|
||||
### Getting the SDK locally
|
||||
You can build the SDK by compiling ImHex like this:
|
||||
- `cmake -G Ninja -DIMHEX_BUNDLE_PLUGIN_SDK=ON -B build`
|
||||
- `cd build`
|
||||
- `DESTDIR=install ninja install`
|
||||
The SDK will then be available at `install/usr/local/share/imhex/sdk`. You will need to set the variable `IMHEX_SDK_PATH` to that (absolute) path.
|
||||
|
||||
### Getting the SDK in a Github Actions CI
|
||||
You can use [this action](https://github.com/WerWolv/imhex-download-sdk) to automatically download the SDK to your Github Runner
|
||||
- [ImHex Plugin Template](https://github.com/WerWolv/ImHex-Plugin-Template)
|
||||
|
||||
|
||||
@@ -366,9 +396,10 @@ To develop plugins for ImHex, use the following template project to get started.
|
||||
|
||||
### Contributors
|
||||
|
||||
- [AxCut](https://github.com/paxcut) for a gigantic amount of contributions to the Pattern Text Editor and tons of other parts of ImHex
|
||||
- [iTrooz](https://github.com/iTrooz) for getting ImHex onto the Web as well as hundreds of contributions in every part of the project
|
||||
- [jumanji144](https://github.com/jumanji144) for huge contributions to the Pattern Language and ImHex's infrastructure
|
||||
- [Mary](https://github.com/marysaka) for her immense help porting ImHex to MacOS and help during development
|
||||
- [Mary](https://github.com/marysaka) for her immense help porting ImHex to macOS and help during development
|
||||
- [Roblabla](https://github.com/Roblabla) for adding MSI Installer support to ImHex
|
||||
- [Mailaender](https://github.com/Mailaender) for getting ImHex onto Flathub
|
||||
- Everybody else who has reported issues on Discord or GitHub that I had great conversations with :)
|
||||
@@ -399,3 +430,18 @@ Notable exceptions to this are the following parts which are under the LGPLv2.1
|
||||
- **/plugins/ui**: The UI plugin library that contains some common UI elements that can be used by other plugins
|
||||
|
||||
The reason for this is to allow for proprietary plugins to be developed for ImHex.
|
||||
|
||||
### Code Signing Policy
|
||||
|
||||
Free code signing provided by [SignPath.io](https://about.signpath.io/),
|
||||
certificate by [SignPath Foundation](https://signpath.org/).
|
||||
|
||||
This program will not transfer any information to other networked systems
|
||||
unless specifically requested by the user or the person installing or
|
||||
operating it.
|
||||
|
||||
#### People with direct push access
|
||||
- [WerWolv](https://github.com/WerWolv)
|
||||
- [iTrooz](https://github.com/iTrooz)
|
||||
- [jumanji144](https://github.com/jumanji144)
|
||||
- [AxCut](https://github.com/paxcut)
|
||||
|
||||
0
changelog.md
Normal file
0
changelog.md
Normal file
@@ -4,6 +4,7 @@
|
||||
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
|
||||
|
||||
set(CMAKE_POLICY_DEFAULT_CMP0063 NEW)
|
||||
set(CMAKE_POLICY_DEFAULT_CMP0141 NEW)
|
||||
|
||||
if (POLICY CMP0177)
|
||||
set(CMAKE_POLICY_DEFAULT_CMP0177 OLD)
|
||||
@@ -66,6 +67,32 @@ function(addCommonFlag)
|
||||
addObjCFlag(${ARGV0} ${ARGV1})
|
||||
endfunction()
|
||||
|
||||
function(addCppCheck target)
|
||||
if (NOT IMHEX_ENABLE_CPPCHECK)
|
||||
return()
|
||||
endif()
|
||||
|
||||
find_program(cppcheck_exe NAMES cppcheck REQUIRED)
|
||||
if (NOT cppcheck_exe)
|
||||
return()
|
||||
endif()
|
||||
|
||||
set(target_build_dir $<TARGET_FILE_DIR:${target}>)
|
||||
set(cppcheck_opts
|
||||
--enable=all
|
||||
--inline-suppr
|
||||
--quiet
|
||||
--std=c++23
|
||||
--check-level=exhaustive
|
||||
--error-exitcode=10
|
||||
--suppressions-list=${CMAKE_SOURCE_DIR}/dist/cppcheck.supp
|
||||
--checkers-report=${target_build_dir}/cppcheck-report.txt
|
||||
)
|
||||
set_target_properties(${target} PROPERTIES
|
||||
CXX_CPPCHECK "${cppcheck_exe};${cppcheck_opts}"
|
||||
)
|
||||
endfunction()
|
||||
|
||||
set(CMAKE_WARN_DEPRECATED OFF CACHE BOOL "Disable deprecated warnings" FORCE)
|
||||
|
||||
include(FetchContent)
|
||||
@@ -148,15 +175,11 @@ macro(detectOS)
|
||||
endif()
|
||||
include(GNUInstallDirs)
|
||||
|
||||
if(IMHEX_PLUGINS_IN_SHARE)
|
||||
set(PLUGINS_INSTALL_LOCATION "share/imhex/plugins")
|
||||
else()
|
||||
set(PLUGINS_INSTALL_LOCATION "${CMAKE_INSTALL_LIBDIR}/imhex/plugins")
|
||||
set(PLUGINS_INSTALL_LOCATION "${CMAKE_INSTALL_LIBDIR}/imhex/plugins")
|
||||
|
||||
# Add System plugin location for plugins to be loaded from
|
||||
# IMPORTANT: This does not work for Sandboxed or portable builds such as the Flatpak or AppImage release
|
||||
add_compile_definitions(SYSTEM_PLUGINS_LOCATION="${CMAKE_INSTALL_FULL_LIBDIR}/imhex")
|
||||
endif()
|
||||
# Add System plugin location for plugins to be loaded from
|
||||
# IMPORTANT: This does not work for Sandboxed or portable builds such as the Flatpak or AppImage release
|
||||
add_compile_definitions(SYSTEM_PLUGINS_LOCATION="${CMAKE_INSTALL_FULL_LIBDIR}/imhex")
|
||||
|
||||
else ()
|
||||
message(FATAL_ERROR "Unknown / unsupported system!")
|
||||
@@ -178,11 +201,14 @@ macro(configurePackingResources)
|
||||
set(CPACK_GENERATOR "WIX")
|
||||
set(CPACK_PACKAGE_NAME "ImHex")
|
||||
set(CPACK_PACKAGE_VENDOR "WerWolv")
|
||||
set(CPACK_WIX_VERSION 4)
|
||||
set(CPACK_WIX_UPGRADE_GUID "05000E99-9659-42FD-A1CF-05C554B39285")
|
||||
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_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;ru-RU")
|
||||
set(CPACK_WIX_PATCH_FILE "${PROJECT_SOURCE_DIR}/resources/dist/windows/wix_patch.xml")
|
||||
|
||||
set(CPACK_PACKAGE_INSTALL_DIRECTORY "ImHex")
|
||||
set_property(INSTALL "$<TARGET_FILE_NAME:main>"
|
||||
PROPERTY CPACK_START_MENU_SHORTCUTS "ImHex"
|
||||
@@ -261,6 +287,17 @@ macro(createPackage)
|
||||
list(APPEND PLUGIN_TARGET_FILES "$<TARGET_FILE:${plugin}>")
|
||||
endforeach ()
|
||||
|
||||
if (DEFINED VCPKG_TARGET_TRIPLET)
|
||||
set(VCPKG_DEPS_FOLDER "")
|
||||
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
set(VCPKG_DEPS_FOLDER "${CMAKE_BINARY_DIR}/vcpkg_installed/${VCPKG_TARGET_TRIPLET}/debug/bin")
|
||||
else()
|
||||
set(VCPKG_DEPS_FOLDER "${CMAKE_BINARY_DIR}/vcpkg_installed/${VCPKG_TARGET_TRIPLET}/bin")
|
||||
endif()
|
||||
|
||||
install(CODE "set(VCPKG_DEPS_FOLDER \"${VCPKG_DEPS_FOLDER}\")")
|
||||
endif()
|
||||
|
||||
# Grab all dynamically linked dependencies.
|
||||
install(CODE "set(CMAKE_INSTALL_BINDIR \"${CMAKE_INSTALL_BINDIR}\")")
|
||||
install(CODE "set(PLUGIN_TARGET_FILES \"${PLUGIN_TARGET_FILES}\")")
|
||||
@@ -274,10 +311,15 @@ macro(createPackage)
|
||||
POST_EXCLUDE_REGEXES ".*system32/.*\\.dll"
|
||||
)
|
||||
|
||||
if(_c_deps_FILENAMES)
|
||||
if(_c_deps_FILENAMES AND _c_deps AND NOT (_c_deps STREQUAL ""))
|
||||
message(WARNING "Conflicting dependencies for library: \"${_c_deps}\"!")
|
||||
endif()
|
||||
|
||||
if (DEFINED VCPKG_DEPS_FOLDER)
|
||||
file(GLOB VCPKG_DEPS "${VCPKG_DEPS_FOLDER}/*.dll")
|
||||
list(APPEND _r_deps ${VCPKG_DEPS})
|
||||
endif()
|
||||
|
||||
foreach(_file ${_r_deps})
|
||||
file(INSTALL
|
||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}"
|
||||
@@ -288,26 +330,20 @@ macro(createPackage)
|
||||
endforeach()
|
||||
]])
|
||||
|
||||
downloadImHexPatternsFiles("./")
|
||||
downloadImHexPatternsFiles(".")
|
||||
elseif(UNIX AND NOT APPLE)
|
||||
|
||||
set_target_properties(libimhex PROPERTIES SOVERSION ${IMHEX_VERSION})
|
||||
|
||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/dist/DEBIAN/control.in ${CMAKE_BINARY_DIR}/DEBIAN/control)
|
||||
configure_file(${IMHEX_BASE_FOLDER}/dist/DEBIAN/control.in ${CMAKE_BINARY_DIR}/DEBIAN/control)
|
||||
|
||||
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.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)
|
||||
install(FILES ${IMHEX_BASE_FOLDER}/LICENSE DESTINATION ${CMAKE_INSTALL_PREFIX}/share/licenses/imhex)
|
||||
install(FILES ${IMHEX_BASE_FOLDER}/dist/imhex.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)
|
||||
install(FILES ${IMHEX_BASE_FOLDER}/dist/imhex.mime.xml DESTINATION ${CMAKE_INSTALL_PREFIX}/share/mime/packages RENAME imhex.xml)
|
||||
install(FILES ${IMHEX_BASE_FOLDER}/resources/icon.svg DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps RENAME imhex.svg)
|
||||
downloadImHexPatternsFiles("./share/imhex")
|
||||
|
||||
# install AppStream file
|
||||
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/dist/net.werwolv.imhex.metainfo.xml DESTINATION ${CMAKE_INSTALL_PREFIX}/share/metainfo)
|
||||
|
||||
# install symlink for the old standard name
|
||||
file(CREATE_LINK net.werwolv.imhex.metainfo.xml ${CMAKE_CURRENT_BINARY_DIR}/net.werwolv.imhex.appdata.xml SYMBOLIC)
|
||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/net.werwolv.imhex.appdata.xml DESTINATION ${CMAKE_INSTALL_PREFIX}/share/metainfo)
|
||||
|
||||
install(FILES ${IMHEX_BASE_FOLDER}/dist/net.werwolv.ImHex.metainfo.xml DESTINATION ${CMAKE_INSTALL_PREFIX}/share/metainfo)
|
||||
endif()
|
||||
|
||||
if (APPLE)
|
||||
@@ -321,6 +357,7 @@ macro(createPackage)
|
||||
|
||||
# Fix rpath
|
||||
install(CODE "execute_process(COMMAND ${CMAKE_INSTALL_NAME_TOOL} -add_rpath \"@executable_path/../Frameworks/\" $<TARGET_FILE:main>)")
|
||||
install(CODE "execute_process(COMMAND ${CMAKE_INSTALL_NAME_TOOL} -add_rpath \"@executable_path/../Frameworks/\" $<TARGET_FILE:updater>)")
|
||||
|
||||
add_custom_target(build-time-make-plugins-directory ALL COMMAND ${CMAKE_COMMAND} -E make_directory "${IMHEX_BUNDLE_PATH}/Contents/MacOS/plugins")
|
||||
add_custom_target(build-time-make-resources-directory ALL COMMAND ${CMAKE_COMMAND} -E make_directory "${IMHEX_BUNDLE_PATH}/Contents/Resources")
|
||||
@@ -329,7 +366,16 @@ macro(createPackage)
|
||||
|
||||
install(FILES ${IMHEX_ICON} DESTINATION "${CMAKE_INSTALL_PREFIX}/${BUNDLE_NAME}/Contents/Resources")
|
||||
install(TARGETS main BUNDLE DESTINATION ".")
|
||||
install(TARGETS updater BUNDLE DESTINATION ".")
|
||||
install(TARGETS updater DESTINATION "${CMAKE_INSTALL_PREFIX}/${BUNDLE_NAME}/Contents/MacOS")
|
||||
install(
|
||||
FILES ${IMHEX_BASE_FOLDER}/dist/cli/imhex.sh
|
||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/${BUNDLE_NAME}/Contents/MacOS/cli"
|
||||
RENAME imhex
|
||||
PERMISSIONS
|
||||
OWNER_READ OWNER_WRITE OWNER_EXECUTE
|
||||
GROUP_READ GROUP_EXECUTE
|
||||
WORLD_READ WORLD_EXECUTE
|
||||
)
|
||||
|
||||
# Update library references to make the bundle portable
|
||||
postprocess_bundle(imhex_all main)
|
||||
@@ -360,6 +406,28 @@ macro(createPackage)
|
||||
if (TARGET main-forwarder)
|
||||
install(TARGETS main-forwarder BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR})
|
||||
endif()
|
||||
|
||||
if (WIN32)
|
||||
install(
|
||||
FILES ${IMHEX_BASE_FOLDER}/dist/cli/imhex.bat
|
||||
DESTINATION ${CMAKE_INSTALL_BINDIR}/cli
|
||||
RENAME imhex.bat
|
||||
PERMISSIONS
|
||||
OWNER_READ OWNER_WRITE OWNER_EXECUTE
|
||||
GROUP_READ GROUP_EXECUTE
|
||||
WORLD_READ WORLD_EXECUTE
|
||||
)
|
||||
else()
|
||||
install(
|
||||
FILES ${IMHEX_BASE_FOLDER}/dist/cli/imhex.sh
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/imhex
|
||||
RENAME imhex
|
||||
PERMISSIONS
|
||||
OWNER_READ OWNER_WRITE OWNER_EXECUTE
|
||||
GROUP_READ GROUP_EXECUTE
|
||||
WORLD_READ WORLD_EXECUTE
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (IMHEX_GENERATE_PACKAGE)
|
||||
@@ -388,6 +456,8 @@ macro(configureCMake)
|
||||
|
||||
set(CMAKE_POSITION_INDEPENDENT_CODE ON CACHE BOOL "Enable position independent code for all targets" FORCE)
|
||||
|
||||
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<$<CONFIG:Debug,RelWithDebInfo>:Embedded>")
|
||||
|
||||
# Configure use of recommended build tools
|
||||
if (IMHEX_USE_DEFAULT_BUILD_SETTINGS)
|
||||
message(STATUS "Configuring CMake to use recommended build tools...")
|
||||
@@ -421,8 +491,8 @@ macro(configureCMake)
|
||||
set(CMAKE_LINKER ${LD_LLD_PATH})
|
||||
|
||||
if (NOT XCODE AND NOT MSVC)
|
||||
set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} -fuse-ld=lld)
|
||||
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fuse-ld=lld)
|
||||
add_link_options("-fuse-ld=lld")
|
||||
add_link_options("-fuse-ld=lld")
|
||||
endif()
|
||||
else ()
|
||||
message(WARNING "lld not found, using default linker!")
|
||||
@@ -434,19 +504,6 @@ macro(configureCMake)
|
||||
message(WARNING "ninja not found, using default generator!")
|
||||
endif ()
|
||||
endif()
|
||||
|
||||
# Enable LTO if desired and supported
|
||||
if (IMHEX_ENABLE_LTO)
|
||||
include(CheckIPOSupported)
|
||||
|
||||
check_ipo_supported(RESULT result OUTPUT output_error)
|
||||
if (result)
|
||||
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
|
||||
message(STATUS "LTO enabled!")
|
||||
else ()
|
||||
message(WARNING "LTO is not supported: ${output_error}")
|
||||
endif ()
|
||||
endif ()
|
||||
endmacro()
|
||||
|
||||
function(configureProject)
|
||||
@@ -459,6 +516,19 @@ function(configureProject)
|
||||
else()
|
||||
set(IMHEX_MAIN_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}" PARENT_SCOPE)
|
||||
endif()
|
||||
|
||||
# Enable LTO if desired and supported
|
||||
if (IMHEX_ENABLE_LTO)
|
||||
include(CheckIPOSupported)
|
||||
|
||||
check_ipo_supported(RESULT result OUTPUT output_error)
|
||||
if (result OR WIN32)
|
||||
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION $<$<CONFIG:Release,RelWithDebInfo,MinSizeRel>:ON>)
|
||||
message(STATUS "LTO enabled!")
|
||||
else ()
|
||||
message(WARNING "LTO is not supported: ${output_error}")
|
||||
endif ()
|
||||
endif ()
|
||||
endfunction()
|
||||
|
||||
macro(setDefaultBuiltTypeIfUnset)
|
||||
@@ -476,6 +546,10 @@ function(loadVersion version plain_version)
|
||||
string(REPLACE ".WIP" "" read_version_plain ${read_version})
|
||||
set(${version} ${read_version} PARENT_SCOPE)
|
||||
set(${plain_version} ${read_version_plain} PARENT_SCOPE)
|
||||
|
||||
if (read_version MATCHES ".+\.WIP")
|
||||
set(IMHEX_PATTERNS_PULL_MASTER ON PARENT_SCOPE)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(detectBadClone)
|
||||
@@ -485,6 +559,9 @@ function(detectBadClone)
|
||||
|
||||
file (GLOB EXTERNAL_DIRS "lib/external/*" "lib/third_party/*")
|
||||
foreach (EXTERNAL_DIR ${EXTERNAL_DIRS})
|
||||
if(NOT IS_DIRECTORY "${EXTERNAL_DIR}")
|
||||
continue()
|
||||
endif()
|
||||
file(GLOB_RECURSE RESULT "${EXTERNAL_DIR}/*")
|
||||
list(LENGTH RESULT ENTRY_COUNT)
|
||||
if(ENTRY_COUNT LESS_EQUAL 1)
|
||||
@@ -512,7 +589,9 @@ endfunction()
|
||||
macro(detectBundledPlugins)
|
||||
file(GLOB PLUGINS_DIRS "plugins/*")
|
||||
|
||||
if (NOT DEFINED IMHEX_INCLUDE_PLUGINS)
|
||||
if (IMHEX_INCLUDE_PLUGINS)
|
||||
set(PLUGINS ${IMHEX_INCLUDE_PLUGINS})
|
||||
else()
|
||||
foreach(PLUGIN_DIR ${PLUGINS_DIRS})
|
||||
if (EXISTS "${PLUGIN_DIR}/CMakeLists.txt")
|
||||
get_filename_component(PLUGIN_NAME ${PLUGIN_DIR} NAME)
|
||||
@@ -521,8 +600,6 @@ macro(detectBundledPlugins)
|
||||
endif ()
|
||||
endif()
|
||||
endforeach()
|
||||
else()
|
||||
set(PLUGINS ${IMHEX_INCLUDE_PLUGINS})
|
||||
endif()
|
||||
|
||||
foreach(PLUGIN_NAME ${PLUGINS})
|
||||
@@ -533,9 +610,13 @@ macro(detectBundledPlugins)
|
||||
message(FATAL_ERROR "No bundled plugins enabled")
|
||||
endif()
|
||||
|
||||
if (NOT ("builtin" IN_LIST PLUGINS))
|
||||
message(FATAL_ERROR "The 'builtin' plugin is required for ImHex to work!")
|
||||
endif ()
|
||||
set(REQUIRED_PLUGINS builtin fonts ui)
|
||||
foreach(PLUGIN ${REQUIRED_PLUGINS})
|
||||
list(FIND PLUGINS ${PLUGIN} PLUGIN_INDEX)
|
||||
if (PLUGIN_INDEX EQUAL -1)
|
||||
message(FATAL_ERROR "Required plugin '${PLUGIN}' is not enabled!")
|
||||
endif()
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
macro(setVariableInParent variable value)
|
||||
@@ -556,16 +637,21 @@ function(downloadImHexPatternsFiles dest)
|
||||
set(PATTERNS_BRANCH ImHex-v${IMHEX_VERSION})
|
||||
endif ()
|
||||
|
||||
FetchContent_Declare(
|
||||
imhex_patterns
|
||||
GIT_REPOSITORY https://github.com/WerWolv/ImHex-Patterns.git
|
||||
GIT_TAG origin/master
|
||||
)
|
||||
|
||||
message(STATUS "Downloading ImHex-Patterns repo branch ${PATTERNS_BRANCH}...")
|
||||
FetchContent_MakeAvailable(imhex_patterns)
|
||||
message(STATUS "Finished downloading ImHex-Patterns")
|
||||
|
||||
set(imhex_patterns_SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/ImHex-Patterns")
|
||||
install(CODE "set(PATTERNS_BRANCH \"${PATTERNS_BRANCH}\")")
|
||||
install(CODE "set(imhex_patterns_SOURCE_DIR \"${imhex_patterns_SOURCE_DIR}\")")
|
||||
install(CODE [[
|
||||
message(STATUS "Downloading ImHex patterns from branch '${PATTERNS_BRANCH}'...")
|
||||
if (NOT EXISTS "${imhex_patterns_SOURCE_DIR}")
|
||||
file(MAKE_DIRECTORY "${imhex_patterns_SOURCE_DIR}")
|
||||
|
||||
execute_process(
|
||||
COMMAND
|
||||
git clone --recurse-submodules --branch ${PATTERNS_BRANCH} https://github.com/WerWolv/ImHex-Patterns.git "${imhex_patterns_SOURCE_DIR}"
|
||||
COMMAND_ERROR_IS_FATAL ANY
|
||||
)
|
||||
endif()
|
||||
]])
|
||||
else ()
|
||||
set(imhex_patterns_SOURCE_DIR "")
|
||||
|
||||
@@ -580,28 +666,32 @@ function(downloadImHexPatternsFiles dest)
|
||||
endif()
|
||||
endif ()
|
||||
|
||||
if (NOT EXISTS ${imhex_patterns_SOURCE_DIR})
|
||||
message(WARNING "Failed to locate ImHex-Patterns repository, some resources will be missing during install!")
|
||||
elseif(XCODE)
|
||||
# The Xcode build has multiple configurations, which each need a copy of these files
|
||||
file(GLOB_RECURSE sourceFilePaths LIST_DIRECTORIES NO CONFIGURE_DEPENDS RELATIVE "${imhex_patterns_SOURCE_DIR}"
|
||||
"${imhex_patterns_SOURCE_DIR}/constants/*"
|
||||
"${imhex_patterns_SOURCE_DIR}/encodings/*"
|
||||
"${imhex_patterns_SOURCE_DIR}/includes/*"
|
||||
"${imhex_patterns_SOURCE_DIR}/patterns/*"
|
||||
"${imhex_patterns_SOURCE_DIR}/magic/*"
|
||||
"${imhex_patterns_SOURCE_DIR}/nodes/*"
|
||||
)
|
||||
list(FILTER sourceFilePaths EXCLUDE REGEX "_schema.json$")
|
||||
install(CODE "set(imhex_patterns_SOURCE_DIR \"${imhex_patterns_SOURCE_DIR}\")")
|
||||
|
||||
foreach(relativePath IN LISTS sourceFilePaths)
|
||||
file(GENERATE OUTPUT "${dest}/${relativePath}" INPUT "${imhex_patterns_SOURCE_DIR}/${relativePath}")
|
||||
endforeach()
|
||||
if(XCODE)
|
||||
install(CODE [[
|
||||
# The Xcode build has multiple configurations, which each need a copy of these files
|
||||
file(GLOB_RECURSE sourceFilePaths LIST_DIRECTORIES NO CONFIGURE_DEPENDS RELATIVE "${imhex_patterns_SOURCE_DIR}"
|
||||
"${imhex_patterns_SOURCE_DIR}/constants/*"
|
||||
"${imhex_patterns_SOURCE_DIR}/encodings/*"
|
||||
"${imhex_patterns_SOURCE_DIR}/includes/*"
|
||||
"${imhex_patterns_SOURCE_DIR}/patterns/*"
|
||||
"${imhex_patterns_SOURCE_DIR}/magic/*"
|
||||
"${imhex_patterns_SOURCE_DIR}/nodes/*"
|
||||
)
|
||||
list(FILTER sourceFilePaths EXCLUDE REGEX "_schema.json$")
|
||||
|
||||
foreach(relativePath IN LISTS sourceFilePaths)
|
||||
file(GENERATE OUTPUT "${dest}/${relativePath}" INPUT "${imhex_patterns_SOURCE_DIR}/${relativePath}")
|
||||
endforeach()
|
||||
]])
|
||||
else()
|
||||
set(PATTERNS_FOLDERS_TO_INSTALL constants encodings includes patterns magic nodes)
|
||||
foreach (FOLDER ${PATTERNS_FOLDERS_TO_INSTALL})
|
||||
install(DIRECTORY "${imhex_patterns_SOURCE_DIR}/${FOLDER}" DESTINATION "${dest}" PATTERN "**/_schema.json" EXCLUDE)
|
||||
endforeach ()
|
||||
if (NOT (imhex_patterns_SOURCE_DIR STREQUAL ""))
|
||||
set(PATTERNS_FOLDERS_TO_INSTALL constants encodings includes patterns magic nodes)
|
||||
foreach (FOLDER ${PATTERNS_FOLDERS_TO_INSTALL})
|
||||
install(DIRECTORY "${imhex_patterns_SOURCE_DIR}/${FOLDER}" DESTINATION "${dest}" PATTERN "**/_schema.json" EXCLUDE)
|
||||
endforeach ()
|
||||
endif()
|
||||
endif ()
|
||||
|
||||
endfunction()
|
||||
@@ -670,12 +760,14 @@ macro(setupCompilerFlags target)
|
||||
addCXXFlag("-Wno-include-angled-in-module-purview" ${target})
|
||||
|
||||
# Enable hardening flags
|
||||
if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
addCommonFlag("-U_FORTIFY_SOURCE" ${target})
|
||||
addCommonFlag("-D_FORTIFY_SOURCE=3" ${target})
|
||||
if (IMHEX_BUILD_HARDENING)
|
||||
if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
addCommonFlag("-U_FORTIFY_SOURCE" ${target})
|
||||
addCommonFlag("-D_FORTIFY_SOURCE=3" ${target})
|
||||
|
||||
if (NOT EMSCRIPTEN)
|
||||
addCommonFlag("-fstack-protector-strong" ${target})
|
||||
if (NOT EMSCRIPTEN)
|
||||
addCommonFlag("-fstack-protector-strong" ${target})
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -688,15 +780,19 @@ macro(setupCompilerFlags target)
|
||||
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})
|
||||
|
||||
# On macOS, when using clang from Homebrew, properly setup the libc++ library path so
|
||||
# it's using the one from Homebrew instead of the system one.
|
||||
execute_process(COMMAND brew --prefix llvm OUTPUT_VARIABLE LLVM_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||
if (NOT LLVM_PREFIX STREQUAL "" AND ${CMAKE_CXX_COMPILER} STREQUAL "${LLVM_PREFIX}/bin/clang++")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${LLVM_PREFIX}/lib/c++")
|
||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -L${LLVM_PREFIX}/lib/c++")
|
||||
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -L${LLVM_PREFIX}/lib/c++")
|
||||
endif()
|
||||
|
||||
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
add_compile_definitions(_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG)
|
||||
else()
|
||||
add_compile_definitions(_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -753,11 +849,16 @@ macro(setUninstallTarget)
|
||||
endmacro()
|
||||
|
||||
macro(addBundledLibraries)
|
||||
# Make sure the build is using vcpkg on Windows and Emscripten, otherwise none of these dependencies will be found
|
||||
if (MSVC OR EMSCRIPTEN)
|
||||
if (NOT (CMAKE_TOOLCHAIN_FILE MATCHES "vcpkg"))
|
||||
message(AUTHOR_WARNING "Your current environment probably needs to be setup to use vcpkg, otherwise none of the dependencies will be found!")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(EXTERNAL_LIBS_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}/lib/external")
|
||||
set(THIRD_PARTY_LIBS_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}/lib/third_party")
|
||||
|
||||
set(BUILD_SHARED_LIBS OFF)
|
||||
add_subdirectory(${THIRD_PARTY_LIBS_FOLDER}/imgui)
|
||||
|
||||
add_subdirectory(${THIRD_PARTY_LIBS_FOLDER}/microtar EXCLUDE_FROM_ALL)
|
||||
|
||||
@@ -811,24 +912,23 @@ macro(addBundledLibraries)
|
||||
set(LUNASVG_LIBRARIES lunasvg::lunasvg)
|
||||
endif()
|
||||
|
||||
if (NOT USE_SYSTEM_MD4C)
|
||||
set(BUILD_MD2HTML_EXECUTABLE OFF CACHE BOOL "Disable md2html executable" FORCE)
|
||||
add_subdirectory(${THIRD_PARTY_LIBS_FOLDER}/md4c EXCLUDE_FROM_ALL)
|
||||
add_library(md4c_lib INTERFACE)
|
||||
add_library(md4c::md4c ALIAS md4c_lib)
|
||||
target_include_directories(md4c_lib INTERFACE ${THIRD_PARTY_LIBS_FOLDER}/md4c/src)
|
||||
target_link_libraries(md4c_lib INTERFACE md4c)
|
||||
else()
|
||||
find_package(md4c REQUIRED)
|
||||
endif()
|
||||
|
||||
if (NOT USE_SYSTEM_LLVM)
|
||||
add_subdirectory(${THIRD_PARTY_LIBS_FOLDER}/llvm-demangle EXCLUDE_FROM_ALL)
|
||||
else()
|
||||
find_package(LLVM REQUIRED Demangle)
|
||||
endif()
|
||||
|
||||
if (NOT USE_SYSTEM_JTHREAD)
|
||||
add_subdirectory(${THIRD_PARTY_LIBS_FOLDER}/jthread EXCLUDE_FROM_ALL)
|
||||
set(JTHREAD_LIBRARIES jthread)
|
||||
else()
|
||||
find_path(JOSUTTIS_JTHREAD_INCLUDE_DIRS "condition_variable_any2.hpp")
|
||||
include_directories(${JOSUTTIS_JTHREAD_INCLUDE_DIRS})
|
||||
|
||||
add_library(jthread INTERFACE)
|
||||
target_include_directories(jthread INTERFACE ${JOSUTTIS_JTHREAD_INCLUDE_DIRS})
|
||||
set(JTHREAD_LIBRARIES jthread)
|
||||
endif()
|
||||
|
||||
if (USE_SYSTEM_BOOST)
|
||||
find_package(Boost REQUIRED CONFIG COMPONENTS regex)
|
||||
set(BOOST_LIBRARIES Boost::regex)
|
||||
@@ -845,6 +945,8 @@ macro(addBundledLibraries)
|
||||
add_subdirectory(${EXTERNAL_LIBS_FOLDER}/pattern_language EXCLUDE_FROM_ALL)
|
||||
add_subdirectory(${EXTERNAL_LIBS_FOLDER}/disassembler EXCLUDE_FROM_ALL)
|
||||
|
||||
add_subdirectory(${THIRD_PARTY_LIBS_FOLDER}/imgui)
|
||||
|
||||
if (LIBPL_SHARED_LIBRARY)
|
||||
install(
|
||||
TARGETS
|
||||
@@ -934,8 +1036,9 @@ function(precompileHeaders target includeFolder)
|
||||
endif()
|
||||
|
||||
file(GLOB_RECURSE TARGET_INCLUDES "${includeFolder}/**/*.hpp")
|
||||
file(GLOB_RECURSE LIBIMHEX_INCLUDES "${CMAKE_SOURCE_DIR}/lib/libimhex/include/**/*.hpp")
|
||||
set(SYSTEM_INCLUDES "<algorithm>;<array>;<atomic>;<chrono>;<cmath>;<cstddef>;<cstdint>;<cstdio>;<cstdlib>;<cstring>;<exception>;<filesystem>;<functional>;<iterator>;<limits>;<list>;<map>;<memory>;<optional>;<ranges>;<set>;<stdexcept>;<string>;<string_view>;<thread>;<tuple>;<type_traits>;<unordered_map>;<unordered_set>;<utility>;<variant>;<vector>")
|
||||
set(INCLUDES "${SYSTEM_INCLUDES};${TARGET_INCLUDES}")
|
||||
set(INCLUDES "${SYSTEM_INCLUDES};${TARGET_INCLUDES};${LIBIMHEX_INCLUDES}")
|
||||
string(REPLACE ">" "$<ANGLE-R>" INCLUDES "${INCLUDES}")
|
||||
target_precompile_headers(${target}
|
||||
PUBLIC
|
||||
|
||||
15
cmake/modules/Findlibssh2.cmake
Normal file
15
cmake/modules/Findlibssh2.cmake
Normal file
@@ -0,0 +1,15 @@
|
||||
find_path(LIBSSH2_INCLUDE_DIR libssh2.h)
|
||||
|
||||
find_library(LIBSSH2_LIBRARY NAMES ssh2 libssh2)
|
||||
|
||||
if(LIBSSH2_INCLUDE_DIR)
|
||||
file(STRINGS "${LIBSSH2_INCLUDE_DIR}/libssh2.h" libssh2_version_str REGEX "^#define[\t ]+LIBSSH2_VERSION[\t ]+\"(.*)\"")
|
||||
string(REGEX REPLACE "^.*\"([^\"]+)\"" "\\1" LIBSSH2_VERSION "${libssh2_version_str}")
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(LibSSH2
|
||||
REQUIRED_VARS LIBSSH2_LIBRARY LIBSSH2_INCLUDE_DIR
|
||||
VERSION_VAR LIBSSH2_VERSION)
|
||||
|
||||
mark_as_advanced(LIBSSH2_INCLUDE_DIR LIBSSH2_LIBRARY)
|
||||
@@ -26,8 +26,9 @@ SET(MBEDTLS_FIND_QUIETLY TRUE)
|
||||
FIND_LIBRARY(MBEDTLS_LIBRARY NAMES mbedtls libmbedtls libmbedx509)
|
||||
FIND_LIBRARY(MBEDX509_LIBRARY NAMES mbedx509 libmbedx509)
|
||||
FIND_LIBRARY(MBEDCRYPTO_LIBRARY NAMES mbedcrypto libmbedcrypto)
|
||||
FIND_LIBRARY(TFPSACRYPTO_LIBRARY NAMES libtfpsacrypto tfpsacrypto)
|
||||
|
||||
IF(MBEDTLS_INCLUDE_DIR AND MBEDTLS_LIBRARY AND MBEDX509_LIBRARY AND MBEDCRYPTO_LIBRARY)
|
||||
IF(MBEDTLS_INCLUDE_DIR AND MBEDTLS_LIBRARY AND MBEDX509_LIBRARY AND (MBEDCRYPTO_LIBRARY OR TFPSACRYPTO_LIBRARY))
|
||||
SET(MBEDTLS_FOUND TRUE)
|
||||
ENDIF()
|
||||
|
||||
@@ -37,14 +38,24 @@ IF(MBEDTLS_FOUND)
|
||||
GET_FILENAME_COMPONENT(MBEDTLS_LIBRARY_FILE ${MBEDTLS_LIBRARY} NAME_WE)
|
||||
GET_FILENAME_COMPONENT(MBEDX509_LIBRARY_FILE ${MBEDX509_LIBRARY} NAME_WE)
|
||||
GET_FILENAME_COMPONENT(MBEDCRYPTO_LIBRARY_FILE ${MBEDCRYPTO_LIBRARY} NAME_WE)
|
||||
GET_FILENAME_COMPONENT(TFPSACRYPTO_LIBRARY_FILE ${TFPSACRYPTO_LIBRARY} NAME_WE)
|
||||
STRING(REGEX REPLACE "^lib" "" MBEDTLS_LIBRARY_FILE ${MBEDTLS_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" "" TFPSACRYPTO_LIBRARY_FILE ${TFPSACRYPTO_LIBRARY_FILE})
|
||||
|
||||
if (TFPSACRYPTO_LIBRARY)
|
||||
SET(MBEDTLS_CRYPTO_LIBRARY_FILE ${TFPSACRYPTO_LIBRARY_FILE})
|
||||
elseif (MBEDCRYPTO_LIBRARY)
|
||||
SET(MBEDTLS_CRYPTO_LIBRARY_FILE ${MBEDCRYPTO_LIBRARY_FILE})
|
||||
else ()
|
||||
MESSAGE(FATAL_ERROR "Could not find mbedTLS Crypto library")
|
||||
endif()
|
||||
|
||||
if (MSVC)
|
||||
SET(MBEDTLS_LIBRARIES ${MBEDTLS_LIBRARY_FILE}.lib ${MBEDX509_LIBRARY_FILE}.lib ${MBEDCRYPTO_LIBRARY_FILE}.lib)
|
||||
SET(MBEDTLS_LIBRARIES ${MBEDTLS_LIBRARY_FILE}.lib ${MBEDX509_LIBRARY_FILE}.lib ${MBEDTLS_CRYPTO_LIBRARY_FILE}.lib)
|
||||
else()
|
||||
SET(MBEDTLS_LIBRARIES "-L${MBEDTLS_LIBRARY_DIR} -l${MBEDTLS_LIBRARY_FILE} -l${MBEDX509_LIBRARY_FILE} -l${MBEDCRYPTO_LIBRARY_FILE}")
|
||||
SET(MBEDTLS_LIBRARIES "-L${MBEDTLS_LIBRARY_DIR} -l${MBEDTLS_LIBRARY_FILE} -l${MBEDX509_LIBRARY_FILE} -l${MBEDTLS_CRYPTO_LIBRARY_FILE}")
|
||||
endif()
|
||||
|
||||
IF(NOT MBEDTLS_FIND_QUIETLY)
|
||||
|
||||
@@ -36,105 +36,125 @@ macro(add_imhex_plugin)
|
||||
# Define new project for plugin
|
||||
project(${IMHEX_PLUGIN_NAME})
|
||||
|
||||
# Create a new shared library for the plugin source code
|
||||
add_library(${IMHEX_PLUGIN_NAME} ${IMHEX_PLUGIN_LIBRARY_TYPE} ${IMHEX_PLUGIN_SOURCES})
|
||||
if (IMHEX_PLUGIN_IMPORTED)
|
||||
add_library(${IMHEX_PLUGIN_NAME} SHARED IMPORTED GLOBAL)
|
||||
|
||||
# Add include directories and link libraries
|
||||
target_include_directories(${IMHEX_PLUGIN_NAME} PUBLIC ${IMHEX_PLUGIN_INCLUDES})
|
||||
target_link_libraries(${IMHEX_PLUGIN_NAME} PUBLIC ${IMHEX_PLUGIN_LIBRARIES})
|
||||
target_link_libraries(${IMHEX_PLUGIN_NAME} PRIVATE libimhex ${FMT_LIBRARIES} imgui_all_includes libwolv)
|
||||
addIncludesFromLibrary(${IMHEX_PLUGIN_NAME} libpl)
|
||||
addIncludesFromLibrary(${IMHEX_PLUGIN_NAME} libpl-gen)
|
||||
|
||||
precompileHeaders(${IMHEX_PLUGIN_NAME} "${CMAKE_CURRENT_SOURCE_DIR}/include")
|
||||
|
||||
# Add IMHEX_PROJECT_NAME and IMHEX_VERSION define
|
||||
target_compile_definitions(${IMHEX_PLUGIN_NAME} PRIVATE IMHEX_PROJECT_NAME="${IMHEX_PLUGIN_NAME}")
|
||||
target_compile_definitions(${IMHEX_PLUGIN_NAME} PRIVATE IMHEX_VERSION="${IMHEX_VERSION_STRING}")
|
||||
target_compile_definitions(${IMHEX_PLUGIN_NAME} PRIVATE IMHEX_PLUGIN_NAME=${IMHEX_PLUGIN_NAME})
|
||||
|
||||
# Enable required compiler flags
|
||||
enableUnityBuild(${IMHEX_PLUGIN_NAME})
|
||||
setupCompilerFlags(${IMHEX_PLUGIN_NAME})
|
||||
|
||||
# Configure build properties
|
||||
set_target_properties(${IMHEX_PLUGIN_NAME}
|
||||
PROPERTIES
|
||||
RUNTIME_OUTPUT_DIRECTORY "${IMHEX_MAIN_OUTPUT_DIRECTORY}/plugins"
|
||||
CXX_STANDARD 23
|
||||
PREFIX ""
|
||||
SUFFIX ${IMHEX_PLUGIN_SUFFIX}
|
||||
)
|
||||
|
||||
# Set rpath of plugin libraries to the plugins folder
|
||||
if (WIN32)
|
||||
if (IMHEX_PLUGIN_LIBRARY_PLUGIN)
|
||||
set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
|
||||
if (WIN32)
|
||||
set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES
|
||||
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/${IMHEX_PLUGIN_NAME}${IMHEX_PLUGIN_SUFFIX}"
|
||||
IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/../lib${IMHEX_PLUGIN_NAME}.dll.a"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/include/include")
|
||||
elseif (APPLE)
|
||||
set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES
|
||||
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../../../../MacOS/plugins/${IMHEX_PLUGIN_NAME}${IMHEX_PLUGIN_SUFFIX}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/include/include")
|
||||
else()
|
||||
set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES
|
||||
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/${IMHEX_PLUGIN_NAME}${IMHEX_PLUGIN_SUFFIX}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/include/include")
|
||||
endif()
|
||||
elseif (APPLE)
|
||||
set_target_properties(${IMHEX_PLUGIN_NAME} PROPERTIES BUILD_RPATH "@executable_path/../Frameworks;@executable_path/plugins")
|
||||
endif()
|
||||
else()
|
||||
# Create a new shared library for the plugin source code
|
||||
add_library(${IMHEX_PLUGIN_NAME} ${IMHEX_PLUGIN_LIBRARY_TYPE} ${IMHEX_PLUGIN_SOURCES})
|
||||
|
||||
# Setup a romfs for the plugin
|
||||
list(APPEND LIBROMFS_RESOURCE_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/romfs)
|
||||
set(LIBROMFS_PROJECT_NAME ${IMHEX_PLUGIN_NAME})
|
||||
add_subdirectory(${IMHEX_BASE_FOLDER}/lib/external/libromfs ${CMAKE_CURRENT_BINARY_DIR}/libromfs)
|
||||
target_link_libraries(${IMHEX_PLUGIN_NAME} PRIVATE ${LIBROMFS_LIBRARY})
|
||||
# Add include directories and link libraries
|
||||
target_include_directories(${IMHEX_PLUGIN_NAME} PUBLIC ${IMHEX_PLUGIN_INCLUDES})
|
||||
target_link_libraries(${IMHEX_PLUGIN_NAME} PUBLIC ${IMHEX_PLUGIN_LIBRARIES})
|
||||
target_link_libraries(${IMHEX_PLUGIN_NAME} PRIVATE libimhex ${FMT_LIBRARIES} imgui_all_includes libwolv)
|
||||
addIncludesFromLibrary(${IMHEX_PLUGIN_NAME} libpl)
|
||||
addIncludesFromLibrary(${IMHEX_PLUGIN_NAME} libpl-gen)
|
||||
|
||||
set(FEATURE_DEFINE_CONTENT)
|
||||
precompileHeaders(${IMHEX_PLUGIN_NAME} "${CMAKE_CURRENT_SOURCE_DIR}/include")
|
||||
|
||||
if (IMHEX_PLUGIN_FEATURES)
|
||||
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)
|
||||
# Add IMHEX_PROJECT_NAME and IMHEX_VERSION define
|
||||
target_compile_definitions(${IMHEX_PLUGIN_NAME} PRIVATE IMHEX_PROJECT_NAME="${IMHEX_PLUGIN_NAME}")
|
||||
target_compile_definitions(${IMHEX_PLUGIN_NAME} PRIVATE IMHEX_VERSION="${IMHEX_VERSION_STRING}")
|
||||
target_compile_definitions(${IMHEX_PLUGIN_NAME} PRIVATE IMHEX_PLUGIN_NAME=${IMHEX_PLUGIN_NAME})
|
||||
|
||||
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()
|
||||
# Enable required compiler flags
|
||||
enableUnityBuild(${IMHEX_PLUGIN_NAME})
|
||||
setupCompilerFlags(${IMHEX_PLUGIN_NAME})
|
||||
addCppCheck(${IMHEX_PLUGIN_NAME})
|
||||
|
||||
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
|
||||
if (TARGET imhex_all)
|
||||
add_dependencies(imhex_all ${IMHEX_PLUGIN_NAME})
|
||||
endif()
|
||||
|
||||
if (IMHEX_EXTERNAL_PLUGIN_BUILD)
|
||||
install(TARGETS ${IMHEX_PLUGIN_NAME} DESTINATION ".")
|
||||
endif()
|
||||
|
||||
# Fix rpath
|
||||
if (APPLE)
|
||||
set_target_properties(
|
||||
${IMHEX_PLUGIN_NAME}
|
||||
# Configure build properties
|
||||
set_target_properties(${IMHEX_PLUGIN_NAME}
|
||||
PROPERTIES
|
||||
INSTALL_RPATH "@executable_path/../Frameworks;@executable_path/plugins"
|
||||
RUNTIME_OUTPUT_DIRECTORY "${IMHEX_MAIN_OUTPUT_DIRECTORY}/plugins"
|
||||
CXX_STANDARD 23
|
||||
PREFIX ""
|
||||
SUFFIX ${IMHEX_PLUGIN_SUFFIX}
|
||||
)
|
||||
elseif (UNIX)
|
||||
set(PLUGIN_RPATH "")
|
||||
list(APPEND PLUGIN_RPATH "$ORIGIN")
|
||||
|
||||
if (IMHEX_PLUGIN_ADD_INSTALL_PREFIX_TO_RPATH)
|
||||
list(APPEND PLUGIN_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
|
||||
# Set rpath of plugin libraries to the plugins folder
|
||||
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")
|
||||
endif()
|
||||
|
||||
set_target_properties(
|
||||
${IMHEX_PLUGIN_NAME}
|
||||
PROPERTIES
|
||||
# Setup a romfs for the plugin
|
||||
list(APPEND LIBROMFS_RESOURCE_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/romfs)
|
||||
set(LIBROMFS_PROJECT_NAME ${IMHEX_PLUGIN_NAME})
|
||||
add_subdirectory(${IMHEX_BASE_FOLDER}/lib/external/libromfs ${CMAKE_CURRENT_BINARY_DIR}/libromfs)
|
||||
target_link_libraries(${IMHEX_PLUGIN_NAME} PRIVATE ${LIBROMFS_LIBRARY})
|
||||
|
||||
set(FEATURE_DEFINE_CONTENT)
|
||||
|
||||
if (IMHEX_PLUGIN_FEATURES)
|
||||
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
|
||||
if (TARGET imhex_all)
|
||||
add_dependencies(imhex_all ${IMHEX_PLUGIN_NAME})
|
||||
endif()
|
||||
|
||||
if (IMHEX_EXTERNAL_PLUGIN_BUILD)
|
||||
install(TARGETS ${IMHEX_PLUGIN_NAME} DESTINATION ".")
|
||||
endif()
|
||||
|
||||
# Fix rpath
|
||||
if (APPLE)
|
||||
set_target_properties(
|
||||
${IMHEX_PLUGIN_NAME}
|
||||
PROPERTIES
|
||||
INSTALL_RPATH "@executable_path/../Frameworks;@executable_path/plugins"
|
||||
)
|
||||
elseif (UNIX)
|
||||
set(PLUGIN_RPATH "")
|
||||
list(APPEND PLUGIN_RPATH "$ORIGIN")
|
||||
|
||||
if (IMHEX_PLUGIN_ADD_INSTALL_PREFIX_TO_RPATH)
|
||||
list(APPEND PLUGIN_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
|
||||
endif()
|
||||
|
||||
set_target_properties(
|
||||
${IMHEX_PLUGIN_NAME}
|
||||
PROPERTIES
|
||||
INSTALL_RPATH_USE_ORIGIN ON
|
||||
INSTALL_RPATH "${PLUGIN_RPATH}"
|
||||
)
|
||||
endif()
|
||||
)
|
||||
endif()
|
||||
|
||||
if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/tests/CMakeLists.txt AND IMHEX_ENABLE_UNIT_TESTS AND IMHEX_ENABLE_PLUGIN_TESTS)
|
||||
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/tests)
|
||||
target_link_libraries(${IMHEX_PLUGIN_NAME} PUBLIC ${IMHEX_PLUGIN_NAME}_tests)
|
||||
target_compile_definitions(${IMHEX_PLUGIN_NAME}_tests PRIVATE IMHEX_PROJECT_NAME="${IMHEX_PLUGIN_NAME}-tests")
|
||||
if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/tests/CMakeLists.txt AND IMHEX_ENABLE_UNIT_TESTS AND IMHEX_ENABLE_PLUGIN_TESTS)
|
||||
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/tests)
|
||||
target_link_libraries(${IMHEX_PLUGIN_NAME} PUBLIC ${IMHEX_PLUGIN_NAME}_tests)
|
||||
target_compile_definitions(${IMHEX_PLUGIN_NAME}_tests PRIVATE IMHEX_PROJECT_NAME="${IMHEX_PLUGIN_NAME}-tests")
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
|
||||
@@ -38,8 +38,14 @@ add_subdirectory(lib/external/libwolv EXCLUDE_FROM_ALL)
|
||||
set(LIBPL_ENABLE_CLI OFF CACHE BOOL "" FORCE)
|
||||
add_subdirectory(lib/external/pattern_language EXCLUDE_FROM_ALL)
|
||||
|
||||
set(IMHEX_PLUGIN_IMPORTED ON)
|
||||
|
||||
add_subdirectory(lib/libimhex)
|
||||
add_subdirectory(lib/trace)
|
||||
add_subdirectory(lib/fonts)
|
||||
add_subdirectory(lib/ui)
|
||||
|
||||
set(IMHEX_PLUGIN_IMPORTED OFF)
|
||||
|
||||
if (WIN32)
|
||||
set_target_properties(libimhex PROPERTIES
|
||||
@@ -59,9 +65,9 @@ elseif (APPLE)
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/lib/trace/include")
|
||||
else()
|
||||
set_target_properties(libimhex PROPERTIES
|
||||
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../libimhex.so"
|
||||
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../../../lib/libimhex.so"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/lib/libimhex/include")
|
||||
set_target_properties(tracing PROPERTIES
|
||||
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../libtracing.a"
|
||||
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/lib/libtracing.a"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/lib/trace/include")
|
||||
endif()
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include <hex/plugin.hpp>
|
||||
|
||||
// Browse through the headers in lib/libimhex/include/hex/api/ to see what you can do with the API.
|
||||
// Most important ones are <hex/api/imhex_api.hpp> and <hex/api/content_registry.hpp>
|
||||
// Most important ones are the things under imhex_api and content_registry
|
||||
|
||||
// This is the main entry point of your plugin. The code in the body of this construct will be executed
|
||||
// when ImHex starts up and loads the plugin.
|
||||
|
||||
195
dist/AppImage/AppImageBuilder.yml
vendored
195
dist/AppImage/AppImageBuilder.yml
vendored
@@ -11,12 +11,16 @@ AppDir:
|
||||
exec_args: $@
|
||||
apt:
|
||||
arch:
|
||||
- all
|
||||
- "{{ARCHITECTURE_PACKAGE}}"
|
||||
allow_unauthenticated: true
|
||||
sources:
|
||||
- sourceline: 'deb [arch=amd64] http://us.archive.ubuntu.com/ubuntu/ oracular main restricted universe multiverse'
|
||||
- sourceline: 'deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports/ oracular main restricted universe multiverse'
|
||||
- sourceline: 'deb [arch=amd64] https://us.archive.ubuntu.com/ubuntu/ noble main restricted universe multiverse'
|
||||
- sourceline: 'deb [arch=arm64] https://ports.ubuntu.com/ubuntu-ports/ noble main restricted universe multiverse'
|
||||
include:
|
||||
- libgdk-pixbuf2.0-0
|
||||
- libgdk-pixbuf2.0-common
|
||||
- shared-mime-info
|
||||
- librsvg2-common
|
||||
- libbz2-1.0
|
||||
- libcap2
|
||||
@@ -28,102 +32,115 @@ AppDir:
|
||||
- libpcre3
|
||||
- libselinux1
|
||||
- libtinfo6
|
||||
- libmd4c-dev
|
||||
- libmd4c-html0-dev
|
||||
files:
|
||||
include:
|
||||
- /lib/x86_64-linux-gnu/libLLVM-13.so.1
|
||||
- /lib/x86_64-linux-gnu/libOpenGL.so.0
|
||||
- /lib/x86_64-linux-gnu/libX11.so.6
|
||||
- /lib/x86_64-linux-gnu/libXau.so.6
|
||||
- /lib/x86_64-linux-gnu/libXcomposite.so.1
|
||||
- /lib/x86_64-linux-gnu/libXcursor.so.1
|
||||
- /lib/x86_64-linux-gnu/libXdamage.so.1
|
||||
- /lib/x86_64-linux-gnu/libXdmcp.so.6
|
||||
- /lib/x86_64-linux-gnu/libXext.so.6
|
||||
- /lib/x86_64-linux-gnu/libXfixes.so.3
|
||||
- /lib/x86_64-linux-gnu/libXi.so.6
|
||||
- /lib/x86_64-linux-gnu/libXinerama.so.1
|
||||
- /lib/x86_64-linux-gnu/libXrandr.so.2
|
||||
- /lib/x86_64-linux-gnu/libXrender.so.1
|
||||
- /lib/x86_64-linux-gnu/libXxf86vm.so.1
|
||||
- /lib/x86_64-linux-gnu/libatk-1.0.so.0
|
||||
- /lib/x86_64-linux-gnu/libatk-bridge-2.0.so.0
|
||||
- /lib/x86_64-linux-gnu/libatspi.so.0
|
||||
- /lib/x86_64-linux-gnu/libblkid.so.1
|
||||
- /lib/x86_64-linux-gnu/libbrotlicommon.so.1
|
||||
- /lib/x86_64-linux-gnu/libbrotlidec.so.1
|
||||
- /lib/x86_64-linux-gnu/libbsd.so.0
|
||||
- /lib/x86_64-linux-gnu/libcairo-gobject.so.2
|
||||
- /lib/x86_64-linux-gnu/libcairo.so.2
|
||||
- /lib/x86_64-linux-gnu/libcurl-gnutls.so.4
|
||||
- /lib/x86_64-linux-gnu/libdatrie.so.1
|
||||
- /lib/x86_64-linux-gnu/libedit.so.2
|
||||
- /lib/x86_64-linux-gnu/libelf.so.1
|
||||
- /lib/x86_64-linux-gnu/libepoxy.so.0
|
||||
- /lib/x86_64-linux-gnu/libffi.so.8
|
||||
- /lib/x86_64-linux-gnu/libfontconfig.so.1
|
||||
- /lib/x86_64-linux-gnu/libfreetype.so.6
|
||||
- /lib/x86_64-linux-gnu/libfribidi.so.0
|
||||
- /lib/x86_64-linux-gnu/libgcrypt.so.20
|
||||
- /lib/x86_64-linux-gnu/libgdk-3.so.0
|
||||
- /lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0
|
||||
- /lib/x86_64-linux-gnu/libgio-2.0.so.0
|
||||
- /lib/x86_64-linux-gnu/libglfw.so.3
|
||||
- /lib/x86_64-linux-gnu/libglib-2.0.so.0
|
||||
- /lib/x86_64-linux-gnu/libgmodule-2.0.so.0
|
||||
- /lib/x86_64-linux-gnu/libgmp.so.10
|
||||
- /lib/x86_64-linux-gnu/libgnutls.so.30
|
||||
- /lib/x86_64-linux-gnu/libgobject-2.0.so.0
|
||||
- /lib/x86_64-linux-gnu/libgraphite2.so.3
|
||||
- /lib/x86_64-linux-gnu/libharfbuzz.so.0
|
||||
- /lib/x86_64-linux-gnu/libhogweed.so.6
|
||||
- /lib/x86_64-linux-gnu/libicudata.so.70
|
||||
- /lib/x86_64-linux-gnu/libicuuc.so.70
|
||||
- /lib/x86_64-linux-gnu/libidn2.so.0
|
||||
- /lib/x86_64-linux-gnu/libjpeg.so.8
|
||||
- /lib/x86_64-linux-gnu/liblber-2.5.so.0
|
||||
- /lib/x86_64-linux-gnu/libldap-2.5.so.0
|
||||
- /lib/x86_64-linux-gnu/liblz4.so.1
|
||||
- /lib/x86_64-linux-gnu/libmagic.so.1
|
||||
- /lib/x86_64-linux-gnu/libmbedcrypto.so.7
|
||||
- /lib/x86_64-linux-gnu/libmbedtls.so.14
|
||||
- /lib/x86_64-linux-gnu/libmbedx509.so.1
|
||||
- /lib/x86_64-linux-gnu/libmd.so.0
|
||||
- /lib/x86_64-linux-gnu/libmount.so.1
|
||||
- /lib/x86_64-linux-gnu/libnettle.so.8
|
||||
- /lib/x86_64-linux-gnu/libp11-kit.so.0
|
||||
- /lib/x86_64-linux-gnu/libpango-1.0.so.0
|
||||
- /lib/x86_64-linux-gnu/libpangocairo-1.0.so.0
|
||||
- /lib/x86_64-linux-gnu/libpangoft2-1.0.so.0
|
||||
- /lib/x86_64-linux-gnu/libpcre2-8.so.0
|
||||
- /lib/x86_64-linux-gnu/libpixman-1.so.0
|
||||
- /lib/x86_64-linux-gnu/libpng16.so.16
|
||||
- /lib/x86_64-linux-gnu/libsasl2.so.2
|
||||
- /lib/x86_64-linux-gnu/libsensors.so.5
|
||||
- /lib/x86_64-linux-gnu/libstdc++.so.6
|
||||
- /lib/x86_64-linux-gnu/libsystemd.so.0
|
||||
- /lib/x86_64-linux-gnu/libtasn1.so.6
|
||||
- /lib/x86_64-linux-gnu/libthai.so.0
|
||||
- /lib/x86_64-linux-gnu/libunistring.so.2
|
||||
- /lib/x86_64-linux-gnu/libuuid.so.1
|
||||
- /lib/x86_64-linux-gnu/libvulkan.so.1
|
||||
- /lib/x86_64-linux-gnu/libwayland-client.so.0
|
||||
- /lib/x86_64-linux-gnu/libwayland-cursor.so.0
|
||||
- /lib/x86_64-linux-gnu/libwayland-egl.so.1
|
||||
- /lib/x86_64-linux-gnu/libxcb-dri2.so.0
|
||||
- /lib/x86_64-linux-gnu/libxcb-dri3.so.0
|
||||
- /lib/x86_64-linux-gnu/libxcb-present.so.0
|
||||
- /lib/x86_64-linux-gnu/libxcb-sync.so.1
|
||||
- /lib/x86_64-linux-gnu/libxkbcommon.so.0
|
||||
- /lib/x86_64-linux-gnu/libxml2.so.2
|
||||
- /lib/x86_64-linux-gnu/libxshmfence.so.1
|
||||
- /lib/x86_64-linux-gnu/libzstd.so.1
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libLLVM-13.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libOpenGL.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libX11.so.6"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXau.so.6"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXcomposite.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXcursor.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXdamage.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXdmcp.so.6"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXext.so.6"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXfixes.so.3"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXi.so.6"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXinerama.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXrandr.so.2"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXrender.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libXxf86vm.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libatk-1.0.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libatk-bridge-2.0.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libatspi.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libblkid.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libbrotlicommon.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libbrotlidec.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libbsd.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libcairo-gobject.so.2"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libcairo.so.2"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libcurl-gnutls.so.4"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libdatrie.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libedit.so.2"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libelf.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libepoxy.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libffi.so.8"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libfontconfig.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libfreetype.so.6"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libfribidi.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libgcrypt.so.20"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libgdk-3.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libgdk_pixbuf-2.0.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libgio-2.0.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libglfw.so.3"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libglib-2.0.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libgmodule-2.0.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libgmp.so.10"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libgnutls.so.30"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libgobject-2.0.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libgraphite2.so.3"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libharfbuzz.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libhogweed.so.6"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libicudata.so.70"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libicuuc.so.70"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libidn2.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libjpeg.so.8"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/liblber-2.5.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libldap-2.5.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/liblz4.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libmagic.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libmbedcrypto.so.7"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libmbedtls.so.14"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libmbedx509.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libmd.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libmount.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libnettle.so.8"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libp11-kit.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libpango-1.0.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libpangocairo-1.0.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libpangoft2-1.0.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libpcre2-8.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libpixman-1.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libpng16.so.16"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libsasl2.so.2"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libsensors.so.5"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libstdc++.so.6"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libsystemd.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libtasn1.so.6"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libthai.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libunistring.so.2"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libuuid.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libvulkan.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libwayland-client.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libwayland-cursor.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libwayland-egl.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libxcb-dri2.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libxcb-dri3.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libxcb-present.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libxcb-sync.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libxkbcommon.so.0"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libxml2.so.2"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libxshmfence.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libzstd.so.1"
|
||||
- "/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/libmd4c.so"
|
||||
exclude:
|
||||
- usr/share/man
|
||||
- usr/share/doc/*/README.*
|
||||
- usr/share/doc/*/changelog.*
|
||||
- usr/share/doc/*/NEWS.*
|
||||
- usr/share/doc/*/TODO.*
|
||||
|
||||
runtime:
|
||||
env:
|
||||
APPDIR_LIBRARY_PATH: '$APPDIR/usr/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu:$APPDIR/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu:$APPDIR/usr/lib:$APPDIR/usr/lib/{{ARCHITECTURE_APPIMAGE_BUILDER}}-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders'
|
||||
GTK_EXE_PREFIX: $APPDIR/usr
|
||||
GTK_DATA_PREFIX: $APPDIR
|
||||
XDG_DATA_DIRS: '/usr/local/share:/usr/share:$APPDIR/usr/share:$XDG_DATA_DIRS:$APPDIR/usr/local/share:$APPDIR/usr/local/lib:$APPDIR/usr/local/share'
|
||||
XDG_CONFIG_DIRS: '$XDG_CONFIG_DIRS:$APPDIR/usr/local/share'
|
||||
|
||||
AppImage:
|
||||
arch: "{{ARCHITECTURE_APPIMAGE_BUILDER}}"
|
||||
comp: zstd
|
||||
update-information: gh-releases-zsync|WerWolv|ImHex|latest|imhex-*-{{ARCHITECTURE_FILE_NAME}}.AppImage.zsync
|
||||
file_name: imhex-{{VERSION}}-{{ARCHITECTURE_FILE_NAME}}.AppImage
|
||||
|
||||
34
dist/AppImage/Dockerfile
vendored
34
dist/AppImage/Dockerfile
vendored
@@ -1,4 +1,4 @@
|
||||
FROM ubuntu:24.10 as build
|
||||
FROM ubuntu:24.04 as build
|
||||
|
||||
# Used to invalidate layer cache but not mount cache
|
||||
# See https://github.com/moby/moby/issues/41715#issuecomment-733976493
|
||||
@@ -30,9 +30,9 @@ ARG LTO=ON
|
||||
ARG BUILD_TYPE=RelWithDebInfo
|
||||
ARG GIT_COMMIT_HASH
|
||||
ARG GIT_BRANCH
|
||||
ARG ARCHITECTURE_PACKAGE
|
||||
ARG ARCHITECTURE_FILE_NAME
|
||||
ARG ARCHITECTURE_APPIMAGE_BUILDER
|
||||
ARG ARCHITECTURE_PACKAGE=x86_64
|
||||
ARG ARCHITECTURE_FILE_NAME=amd64
|
||||
ARG ARCHITECTURE_APPIMAGE_BUILDER=x86_64
|
||||
WORKDIR /build
|
||||
|
||||
# Ubuntu sh doesnt support string substitution
|
||||
@@ -42,16 +42,18 @@ RUN <<EOF
|
||||
# Prepare ImHex build
|
||||
set -xe
|
||||
|
||||
CC=gcc-14 CXX=g++-14 cmake -G "Ninja" \
|
||||
-DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
|
||||
-DCMAKE_INSTALL_PREFIX="/usr" \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||
-DIMHEX_PATTERNS_PULL_MASTER=ON \
|
||||
-DIMHEX_COMMIT_HASH_LONG="${GIT_COMMIT_HASH}" \
|
||||
-DIMHEX_COMMIT_BRANCH="${GIT_BRANCH}" \
|
||||
-DIMHEX_ENABLE_LTO=${LTO} \
|
||||
-DIMHEX_PLUGINS_IN_SHARE=ON \
|
||||
CC=gcc-14 CXX=g++-14 cmake -G "Ninja" \
|
||||
-DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
|
||||
-DCMAKE_INSTALL_PREFIX="/usr" \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||
-DIMHEX_PATTERNS_PULL_MASTER=ON \
|
||||
-DIMHEX_COMMIT_HASH_LONG="${GIT_COMMIT_HASH}" \
|
||||
-DIMHEX_COMMIT_BRANCH="${GIT_BRANCH}" \
|
||||
-DIMHEX_ENABLE_LTO=${LTO} \
|
||||
-DIMHEX_BUNDLE_PLUGIN_SDK=OFF \
|
||||
`# To prevent using a libdir with an architecture-specific name` \
|
||||
-DCMAKE_INSTALL_LIBDIR="lib" \
|
||||
/imhex
|
||||
EOF
|
||||
|
||||
@@ -70,12 +72,12 @@ RUN <<EOF
|
||||
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
|
||||
wget -nc https://github.com/AppImage/appimagetool/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
|
||||
pip3 install git+https://github.com/AppImageCrafters/appimage-builder@e995e8e
|
||||
|
||||
# Package ImHex as AppImage
|
||||
export VERSION=$(cat /imhex/VERSION)
|
||||
|
||||
4
dist/Arch/Dockerfile
vendored
4
dist/Arch/Dockerfile
vendored
@@ -17,7 +17,9 @@ RUN pacman -S --needed --noconfirm \
|
||||
freetype2 \
|
||||
curl \
|
||||
dbus \
|
||||
xdg-desktop-portal
|
||||
xdg-desktop-portal \
|
||||
libssh2 \
|
||||
md4c
|
||||
|
||||
# Clone ImHex
|
||||
RUN git clone https://github.com/WerWolv/ImHex --recurse-submodules /root/ImHex
|
||||
|
||||
2
dist/Arch/PKGBUILD
vendored
2
dist/Arch/PKGBUILD
vendored
@@ -8,7 +8,7 @@ pkgdesc="A Hex Editor for Reverse Engineers, Programmers and people who value th
|
||||
arch=("x86_64")
|
||||
url="https://github.com/WerWolv/ImHex"
|
||||
license=('GPL2')
|
||||
depends=(glfw mbedtls fontconfig freetype2 libglvnd dbus gtk3 curl fmt yara zlib bzip2 xz zstd)
|
||||
depends=(glfw mbedtls fontconfig freetype2 libglvnd dbus gtk3 curl fmt yara zlib bzip2 xz zstd libssh2)
|
||||
makedepends=(git nlohmann-json)
|
||||
provides=(imhex)
|
||||
conflicts=(imhex)
|
||||
|
||||
2
dist/DEBIAN/control.in
vendored
2
dist/DEBIAN/control.in
vendored
@@ -4,7 +4,7 @@ Section: editors
|
||||
Priority: optional
|
||||
Architecture: amd64
|
||||
License: GNU GPL-2
|
||||
Depends: libfontconfig1, 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, libssh2-1, libmd4c0
|
||||
Maintainer: WerWolv <hey@werwolv.net>
|
||||
Description: ImHex Hex Editor
|
||||
A Hex Editor for Reverse Engineers, Programmers and
|
||||
|
||||
2
dist/ImHex-9999.ebuild
vendored
2
dist/ImHex-9999.ebuild
vendored
@@ -28,6 +28,8 @@ RDEPEND="${DEPEND}
|
||||
app-arch/lzma
|
||||
app-arch/zstd
|
||||
app-arch/lz4
|
||||
net-libs/libssh2
|
||||
dev-libs/md4c
|
||||
"
|
||||
BDEPEND="${DEPEND}
|
||||
dev-cpp/nlohmann_json
|
||||
|
||||
13
dist/ImHex.run.xml
vendored
Normal file
13
dist/ImHex.run.xml
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="ImHex" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" WORKING_DIR="file://$CMakeCurrentBuildDir$" PASS_PARENT_ENVS_2="true" PROJECT_NAME="ImHex" TARGET_NAME="imhex_all" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="ImHex" RUN_TARGET_NAME="main">
|
||||
<envs>
|
||||
<env name="NO_DEBUG_BANNER" value="1" />
|
||||
</envs>
|
||||
<method v="2">
|
||||
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration default="false" name="CMake Debug" type="CMakeListConfigurationType" factoryName="CMakeListConfigurationFactory">
|
||||
<method v="2" />
|
||||
</configuration>
|
||||
</component>
|
||||
3
dist/cli/imhex.bat
vendored
Normal file
3
dist/cli/imhex.bat
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
@echo off
|
||||
|
||||
start "" "%~dp0..\imhex.exe" %*
|
||||
5
dist/cli/imhex.sh
vendored
Normal file
5
dist/cli/imhex.sh
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
script_path=$(readlink -f "$0")
|
||||
script_dir=$(dirname "${script_path}")
|
||||
"${script_dir}/../imhex" "$@" > /dev/null 2>&1 &
|
||||
20
dist/cppcheck.supp
vendored
Normal file
20
dist/cppcheck.supp
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
missingIncludeSystem
|
||||
constParameter
|
||||
unusedFunction
|
||||
preprocessorErrorDirective
|
||||
checkersReport
|
||||
noExplicitConstructor
|
||||
unmatchedSuppression
|
||||
useInitializationList
|
||||
useStlAlgorithm
|
||||
knownConditionTrueFalse
|
||||
internalAstError
|
||||
unsignedPositive
|
||||
variableScope
|
||||
unusedPrivateFunction
|
||||
constParameterCallback
|
||||
|
||||
*:*/lib/third_party/*
|
||||
*:*/external/pattern_language/external/*
|
||||
*:*/external/disassembler/external/*
|
||||
*:*/lib/libimhex/source/ui/imgui_imhex_extensions.cpp
|
||||
54
dist/flake.nix
vendored
Normal file
54
dist/flake.nix
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
{
|
||||
description = "ImHex";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
};
|
||||
|
||||
outputs = { self, nixpkgs }:
|
||||
let
|
||||
supportedSystems = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" "x86_64-darwin" ];
|
||||
forAllSystems = f: nixpkgs.lib.genAttrs supportedSystems (system: f system);
|
||||
in {
|
||||
devShells = forAllSystems (system:
|
||||
let
|
||||
pkgs = import nixpkgs { inherit system; };
|
||||
in
|
||||
{
|
||||
default = pkgs.mkShell {
|
||||
buildInputs = [
|
||||
pkgs.cmake
|
||||
pkgs.clang
|
||||
pkgs.lld
|
||||
|
||||
pkgs.nghttp3
|
||||
pkgs.pkg-config
|
||||
pkgs.glfw
|
||||
pkgs.fontconfig
|
||||
pkgs.file
|
||||
pkgs.mbedtls
|
||||
pkgs.freetype
|
||||
pkgs.dbus
|
||||
pkgs.gtk3
|
||||
pkgs.curl
|
||||
pkgs.fmt
|
||||
pkgs.yara
|
||||
pkgs.nlohmann_json
|
||||
pkgs.ninja
|
||||
pkgs.zlib
|
||||
pkgs.bzip2
|
||||
pkgs.xz
|
||||
pkgs.zstd
|
||||
pkgs.lz4
|
||||
pkgs.libssh2
|
||||
pkgs.md4c
|
||||
];
|
||||
|
||||
shellHook = ''
|
||||
export CC=${pkgs.clang}/bin/clang
|
||||
export CXX=${pkgs.clang}/bin/clang++
|
||||
'';
|
||||
};
|
||||
});
|
||||
};
|
||||
}
|
||||
139
dist/flatpak/net.werwolv.ImHex.yaml
vendored
Normal file
139
dist/flatpak/net.werwolv.ImHex.yaml
vendored
Normal file
@@ -0,0 +1,139 @@
|
||||
app-id: net.werwolv.ImHex
|
||||
runtime: org.freedesktop.Platform
|
||||
runtime-version: '24.08'
|
||||
sdk: org.freedesktop.Sdk
|
||||
command: imhex
|
||||
rename-desktop-file: imhex.desktop
|
||||
|
||||
finish-args:
|
||||
- --share=ipc
|
||||
- --share=network
|
||||
- --socket=wayland
|
||||
- --socket=fallback-x11
|
||||
- --filesystem=host
|
||||
- --device=dri
|
||||
|
||||
modules:
|
||||
- name: glfw
|
||||
buildsystem: cmake-ninja
|
||||
builddir: true
|
||||
config-opts:
|
||||
- -DBUILD_SHARED_LIBS=ON
|
||||
- -DGLFW_BUILD_EXAMPLES=OFF
|
||||
- -DGLFW_BUILD_TESTS=OFF
|
||||
- -DGLFW_BUILD_DOCS=OFF
|
||||
sources:
|
||||
- type: archive
|
||||
url: https://github.com/glfw/glfw/releases/download/3.4/glfw-3.4.zip
|
||||
sha256: b5ec004b2712fd08e8861dc271428f048775200a2df719ccf575143ba749a3e9
|
||||
cleanup:
|
||||
- /include
|
||||
- /lib/pkgconfig
|
||||
- /lib/pkgconfig
|
||||
- /lib64/pkgconfig
|
||||
- /lib/cmake
|
||||
- /lib64/cmake
|
||||
|
||||
- name: mbedtls
|
||||
buildsystem: cmake-ninja
|
||||
config-opts:
|
||||
- -DCMAKE_C_FLAGS=-fPIC
|
||||
- -DENABLE_TESTING=OFF
|
||||
- -DENABLE_PROGRAMS=OFF
|
||||
sources:
|
||||
- type: archive
|
||||
url: https://github.com/ARMmbed/mbedtls/archive/refs/tags/v3.4.0.tar.gz
|
||||
sha256: 1b899f355022e8d02c4d313196a0a16af86c5a692456fa99d302915b8cf0320a
|
||||
cleanup:
|
||||
- /include
|
||||
- /lib/pkgconfig
|
||||
- /lib64/pkgconfig
|
||||
- /lib/cmake
|
||||
- /lib64/cmake
|
||||
|
||||
- name: fmt
|
||||
buildsystem: cmake-ninja
|
||||
config-opts:
|
||||
- -DBUILD_SHARED_LIBS=ON
|
||||
- -DFMT_TEST=OFF
|
||||
sources:
|
||||
- type: archive
|
||||
url: https://github.com/fmtlib/fmt/releases/download/10.0.0/fmt-10.0.0.zip
|
||||
sha256: 4943cb165f3f587f26da834d3056ee8733c397e024145ca7d2a8a96bb71ac281
|
||||
cleanup:
|
||||
- /include
|
||||
- /lib/pkgconfig
|
||||
- /lib64/pkgconfig
|
||||
- /lib/cmake
|
||||
- /lib64/cmake
|
||||
|
||||
- name: yara
|
||||
buildsystem: autotools
|
||||
sources:
|
||||
- type: git
|
||||
url: https://github.com/VirusTotal/yara.git
|
||||
tag: v4.3.1
|
||||
commit: a6f6ce1d6d74a03c396660db25765f2a794d9e30
|
||||
cleanup:
|
||||
- /include
|
||||
- /lib/pkgconfig
|
||||
- /lib64/pkgconfig
|
||||
- /lib/cmake
|
||||
- /lib64/cmake
|
||||
|
||||
- name: libssh2
|
||||
buildsystem: cmake-ninja
|
||||
config-opts:
|
||||
- -DBUILD_SHARED_LIBS=ON
|
||||
- -DENABLE_ZLIB_COMPRESSION=OFF
|
||||
- -DENABLE_MANUAL=OFF
|
||||
- -DENABLE_EXAMPLES=OFF
|
||||
- -DENABLE_TESTING=OFF
|
||||
sources:
|
||||
- type: git
|
||||
url: https://github.com/libssh2/libssh2.git
|
||||
tag: libssh2-1.11.1
|
||||
cleanup:
|
||||
- /include
|
||||
- /lib/pkgconfig
|
||||
- /lib64/pkgconfig
|
||||
- /lib/cmake
|
||||
- /lib64/cmake
|
||||
|
||||
- name: md4c
|
||||
buildsystem: cmake-ninja
|
||||
config-opts:
|
||||
- -DBUILD_SHARED_LIBS=ON
|
||||
- -DMD4C_BUILD_TESTS=OFF
|
||||
- -DMD4C_BUILD_EXAMPLES=OFF
|
||||
- -DMD4C_BUILD_DOCS=OFF
|
||||
sources:
|
||||
- type: git
|
||||
url: https://github.com/mity/md4c.git
|
||||
tag: release-0.5.2
|
||||
|
||||
- name: imhex
|
||||
buildsystem: cmake-ninja
|
||||
builddir: true
|
||||
config-opts:
|
||||
- -DUSE_SYSTEM_CURL=ON
|
||||
- -DUSE_SYSTEM_FMT=ON
|
||||
- -DUSE_SYSTEM_YARA=ON
|
||||
- -DIMHEX_OFFLINE_BUILD=ON
|
||||
- -DIMHEX_BUNDLE_PLUGIN_SDK=OFF
|
||||
- -DCMAKE_INSTALL_LIBDIR=lib
|
||||
- -DCMAKE_INSTALL_RPATH='$ORIGIN/../lib:$ORIGIN/../lib64'
|
||||
sources:
|
||||
- type: dir
|
||||
path: ../..
|
||||
- type: git
|
||||
url: https://github.com/WerWolv/ImHex-Patterns.git
|
||||
tag: master
|
||||
dest: ImHex-Patterns
|
||||
x-checker-data:
|
||||
type: git
|
||||
tag-pattern: ^ImHex-v([\d.]+)$
|
||||
post-install:
|
||||
- mkdir -p ${FLATPAK_DEST}/share/icons/hicolor/scalable/apps
|
||||
- cp ${FLATPAK_DEST}/share/pixmaps/imhex.svg ${FLATPAK_DEST}/share/icons/hicolor/scalable/apps/${FLATPAK_ID}.svg
|
||||
- desktop-file-edit --set-key="Icon" --set-value="${FLATPAK_ID}" "${FLATPAK_DEST}/share/applications/imhex.desktop"
|
||||
69
dist/fonts/move_private_use_area.py
vendored
Normal file
69
dist/fonts/move_private_use_area.py
vendored
Normal file
@@ -0,0 +1,69 @@
|
||||
from fontTools.ttLib import TTFont
|
||||
from fontTools.ttLib.tables._c_m_a_p import CmapSubtable
|
||||
import argparse
|
||||
|
||||
# Default PUAs
|
||||
SOURCE_PUA_START = 0xEA00
|
||||
SOURCE_PUA_END = 0x100F2
|
||||
TARGET_PUA_START = 0xF0000
|
||||
|
||||
def move_pua_glyphs(input_font_path, output_font_path):
|
||||
font = TTFont(input_font_path)
|
||||
|
||||
cmap_table = font['cmap']
|
||||
glyph_set = font.getGlyphSet()
|
||||
|
||||
# Track moved glyphs
|
||||
moved = 0
|
||||
new_mapping = {}
|
||||
|
||||
# Collect original mappings in the PUA
|
||||
for cmap in cmap_table.tables:
|
||||
if cmap.isUnicode():
|
||||
for codepoint, glyph_name in cmap.cmap.items():
|
||||
if SOURCE_PUA_START <= codepoint <= SOURCE_PUA_END:
|
||||
offset = codepoint - SOURCE_PUA_START
|
||||
new_codepoint = TARGET_PUA_START + offset
|
||||
new_mapping[new_codepoint] = glyph_name
|
||||
moved += 1
|
||||
|
||||
if moved == 0:
|
||||
print("No glyphs found in the source Private Use Area.")
|
||||
return
|
||||
|
||||
# Remove old PUA entries from existing cmap subtables
|
||||
for cmap in cmap_table.tables:
|
||||
if cmap.isUnicode():
|
||||
cmap.cmap = {
|
||||
cp: gn for cp, gn in cmap.cmap.items()
|
||||
if not (SOURCE_PUA_START <= cp <= SOURCE_PUA_END)
|
||||
}
|
||||
|
||||
# Create or update a format 12 cmap subtable
|
||||
found_format12 = False
|
||||
for cmap in cmap_table.tables:
|
||||
if cmap.format == 12 and cmap.platformID == 3 and cmap.platEncID in (10, 1):
|
||||
cmap.cmap.update(new_mapping)
|
||||
found_format12 = True
|
||||
break
|
||||
|
||||
if not found_format12:
|
||||
# Create a new format 12 subtable
|
||||
cmap12 = CmapSubtable.newSubtable(12)
|
||||
cmap12.platformID = 3
|
||||
cmap12.platEncID = 10 # UCS-4
|
||||
cmap12.language = 0
|
||||
cmap12.cmap = new_mapping
|
||||
cmap_table.tables.append(cmap12)
|
||||
|
||||
print(f"Moved {moved} glyphs from U+{SOURCE_PUA_START:X}–U+{SOURCE_PUA_END:X} to U+{TARGET_PUA_START:X}+")
|
||||
font.save(output_font_path)
|
||||
print(f"Saved modified font to {output_font_path}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Move PUA glyphs in a TTF file to another Unicode range.")
|
||||
parser.add_argument("input", help="Input TTF file path")
|
||||
parser.add_argument("output", help="Output TTF file path")
|
||||
|
||||
args = parser.parse_args()
|
||||
move_pua_glyphs(args.input, args.output)
|
||||
60
dist/fonts/ttf_to_header_file.py
vendored
Normal file
60
dist/fonts/ttf_to_header_file.py
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
import argparse
|
||||
from fontTools.ttLib import TTFont
|
||||
import os
|
||||
|
||||
def unicode_to_utf8_escape(codepoint):
|
||||
return ''.join([f'\\x{b:02x}' for b in chr(codepoint).encode('utf-8')])
|
||||
|
||||
def format_macro_name(prefix, glyph_name):
|
||||
# Convert names like 'repo-forked' -> 'ICON_VS_REPO_FORKED'
|
||||
return "ICON_" + prefix + "_" + glyph_name.upper().replace('-', '_')
|
||||
|
||||
def generate_font_header(font_path, output_path, font_macro_name, font_file_macro):
|
||||
font = TTFont(font_path)
|
||||
|
||||
# Use cmap to get Unicode to glyph mapping
|
||||
codepoint_to_names = {}
|
||||
for table in font["cmap"].tables:
|
||||
if table.isUnicode():
|
||||
for codepoint, glyph_name in table.cmap.items():
|
||||
codepoint_to_names.setdefault(codepoint, []).append(glyph_name)
|
||||
|
||||
if not codepoint_to_names:
|
||||
print("No Unicode-mapped glyphs found in the font.")
|
||||
return
|
||||
|
||||
# Remove any glyph that is lower than 0xFF
|
||||
codepoint_to_names = {cp: names for cp, names in codepoint_to_names.items() if cp >= 0xFF}
|
||||
|
||||
min_cp = min(codepoint_to_names)
|
||||
max_cp = max(codepoint_to_names)
|
||||
|
||||
with open(output_path, "w", encoding="utf-8") as out:
|
||||
out.write("#pragma once\n\n")
|
||||
out.write(f'#define FONT_ICON_FILE_NAME_{font_macro_name} "{font_file_macro}"\n\n')
|
||||
out.write(f"#define ICON_MIN_{font_macro_name} 0x{min_cp:04x}\n")
|
||||
out.write(f"#define ICON_MAX_16_{font_macro_name} 0x{max_cp:04x}\n")
|
||||
out.write(f"#define ICON_MAX_{font_macro_name} 0x{max_cp:04x}\n")
|
||||
|
||||
written = set()
|
||||
for codepoint in sorted(codepoint_to_names):
|
||||
utf8 = unicode_to_utf8_escape(codepoint)
|
||||
comment = f"// U+{codepoint:04X}"
|
||||
glyph_names = sorted(set(codepoint_to_names[codepoint]))
|
||||
for i, glyph_name in enumerate(glyph_names):
|
||||
macro = format_macro_name(font_macro_name, glyph_name)
|
||||
if macro in written:
|
||||
continue
|
||||
out.write(f"#define {macro} \"{utf8}\"\t{comment}\n")
|
||||
written.add(macro)
|
||||
|
||||
print(f"Header generated at {output_path}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Generate C header file from TTF glyphs.")
|
||||
parser.add_argument("font", help="Input .ttf font file")
|
||||
parser.add_argument("output", help="Output .h file")
|
||||
parser.add_argument("macro_name", help="Macro prefix")
|
||||
args = parser.parse_args()
|
||||
|
||||
generate_font_header(args.font, args.output, args.macro_name, os.path.basename(args.font))
|
||||
4
dist/get_deps_archlinux.sh
vendored
4
dist/get_deps_archlinux.sh
vendored
@@ -20,4 +20,6 @@ pacman -S $@ --needed \
|
||||
bzip2 \
|
||||
xz \
|
||||
zstd \
|
||||
lz4
|
||||
lz4 \
|
||||
libssh2 \
|
||||
md4c
|
||||
|
||||
5
dist/get_deps_debian.sh
vendored
5
dist/get_deps_debian.sh
vendored
@@ -28,4 +28,7 @@ apt install -y \
|
||||
libbz2-dev \
|
||||
liblzma-dev \
|
||||
libzstd-dev \
|
||||
liblz4-dev
|
||||
liblz4-dev \
|
||||
libssh2-1-dev \
|
||||
libmd4c-dev \
|
||||
libmd4c-html0-dev
|
||||
|
||||
3
dist/get_deps_fedora.sh
vendored
3
dist/get_deps_fedora.sh
vendored
@@ -18,4 +18,5 @@ dnf install -y \
|
||||
zlib-devel \
|
||||
bzip2-devel \
|
||||
xz-devel \
|
||||
lz4-devel
|
||||
lz4-devel \
|
||||
libssh2-devel
|
||||
|
||||
38
dist/get_deps_msys2.sh
vendored
38
dist/get_deps_msys2.sh
vendored
@@ -1,21 +1,23 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
pacman -S --needed --noconfirm pactoys unzip
|
||||
pacman -S --needed --noconfirm pactoys unzip git
|
||||
pacboy -S --needed --noconfirm \
|
||||
gcc:p \
|
||||
lld:p \
|
||||
cmake:p \
|
||||
ccache:p \
|
||||
glfw:p \
|
||||
file:p \
|
||||
curl-winssl:p \
|
||||
mbedtls:p \
|
||||
freetype:p \
|
||||
dlfcn:p \
|
||||
ninja:p \
|
||||
capstone:p \
|
||||
zlib:p \
|
||||
bzip2:p \
|
||||
xz:p \
|
||||
zstd:p \
|
||||
lz4:p
|
||||
gcc:p \
|
||||
lld:p \
|
||||
cmake:p \
|
||||
ccache:p \
|
||||
glfw:p \
|
||||
file:p \
|
||||
curl-winssl:p \
|
||||
mbedtls:p \
|
||||
freetype:p \
|
||||
dlfcn:p \
|
||||
ninja:p \
|
||||
capstone:p \
|
||||
zlib:p \
|
||||
bzip2:p \
|
||||
xz:p \
|
||||
zstd:p \
|
||||
lz4:p \
|
||||
libssh2-wincng:p \
|
||||
md4c:p
|
||||
|
||||
4
dist/get_deps_tumbleweed.sh
vendored
4
dist/get_deps_tumbleweed.sh
vendored
@@ -18,4 +18,6 @@ zypper install \
|
||||
zlib-devel \
|
||||
bzip3-devel \
|
||||
xz-devel \
|
||||
lz4-dev
|
||||
lz4-dev \
|
||||
libssh2-devel \
|
||||
md4c-devel
|
||||
|
||||
47
dist/langtool.py
vendored
47
dist/langtool.py
vendored
@@ -92,18 +92,7 @@ def main():
|
||||
|
||||
with lang_file_path.open("w", encoding="utf-8") as new_lang_file:
|
||||
new_lang_data = {
|
||||
"code": lang,
|
||||
"language": (
|
||||
exist_lang_data["language"]
|
||||
if exist_lang_data
|
||||
else input("Enter language name: ")
|
||||
),
|
||||
"country": (
|
||||
exist_lang_data["country"]
|
||||
if exist_lang_data
|
||||
else input("Enter country name: ")
|
||||
),
|
||||
"translations": {},
|
||||
|
||||
}
|
||||
json.dump(new_lang_data, new_lang_file, indent=4, ensure_ascii=False)
|
||||
|
||||
@@ -124,10 +113,10 @@ def main():
|
||||
with lang_file_path.open("r+", encoding="utf-8") as target_lang_file:
|
||||
lang_data = json.load(target_lang_file)
|
||||
|
||||
for key, value in default_lang_data["translations"].items():
|
||||
for key, value in default_lang_data.items():
|
||||
has_translation = (
|
||||
key in lang_data["translations"]
|
||||
and lang_data["translations"][key] != INVALID_TRANSLATION
|
||||
key in lang_data
|
||||
and lang_data[key] != INVALID_TRANSLATION
|
||||
)
|
||||
if (
|
||||
has_translation
|
||||
@@ -140,7 +129,7 @@ def main():
|
||||
continue
|
||||
if command == "check":
|
||||
print(
|
||||
f"Error: Translation {lang_data['code']} is missing translation for key '{key}'"
|
||||
f"Error: Translation {lang_file_path} is missing translation for key '{key}'"
|
||||
)
|
||||
elif (
|
||||
command == "translate"
|
||||
@@ -150,45 +139,45 @@ def main():
|
||||
if command == "untranslate" and not has_translation:
|
||||
continue
|
||||
reference_tranlsation = (
|
||||
" '%s'" % reference_lang_data["translations"][key]
|
||||
" '%s'" % reference_lang_data[key]
|
||||
if (
|
||||
reference_lang_data
|
||||
and key in reference_lang_data["translations"]
|
||||
and key in reference_lang_data
|
||||
)
|
||||
else ""
|
||||
)
|
||||
print(
|
||||
f"\033[1m'{key}' '{value}'{reference_tranlsation}\033[0m => {lang_data['language']}",
|
||||
f"\033[1m'{key}' '{value}'{reference_tranlsation}\033[0m => ",
|
||||
end="",
|
||||
)
|
||||
if has_translation:
|
||||
translation = lang_data["translations"][key]
|
||||
translation = lang_data[key]
|
||||
print(f" <= \033[1m'{translation}'\033[0m")
|
||||
print() # for a new line
|
||||
if command == "untranslate":
|
||||
lang_data["translations"][key] = INVALID_TRANSLATION
|
||||
lang_data[key] = INVALID_TRANSLATION
|
||||
continue
|
||||
try:
|
||||
new_value = input("=> ")
|
||||
lang_data["translations"][key] = new_value
|
||||
lang_data[key] = new_value
|
||||
except KeyboardInterrupt:
|
||||
break
|
||||
elif command == "update" or command == "create":
|
||||
lang_data["translations"][key] = INVALID_TRANSLATION
|
||||
lang_data[key] = INVALID_TRANSLATION
|
||||
elif command == "fmtzh":
|
||||
if has_translation:
|
||||
lang_data["translations"][key] = fmtzh(
|
||||
lang_data["translations"][key]
|
||||
lang_data[key] = fmtzh(
|
||||
lang_data[key]
|
||||
)
|
||||
|
||||
keys_to_remove = []
|
||||
for key, value in lang_data["translations"].items():
|
||||
if key not in default_lang_data["translations"]:
|
||||
for key, value in lang_data.items():
|
||||
if key not in default_lang_data:
|
||||
keys_to_remove.append(key)
|
||||
for key in keys_to_remove:
|
||||
lang_data["translations"].pop(key)
|
||||
lang_data.pop(key)
|
||||
print(
|
||||
f"Removed unused key '{key}' from translation '{lang_data['code']}'"
|
||||
f"Removed unused key '{key}' from translation '{lang_file_path}'"
|
||||
)
|
||||
|
||||
target_lang_file.seek(0)
|
||||
|
||||
4
dist/macOS/Brewfile
vendored
4
dist/macOS/Brewfile
vendored
@@ -12,4 +12,6 @@ brew "ninja"
|
||||
brew "zlib"
|
||||
brew "xz"
|
||||
brew "bzip2"
|
||||
brew "zstd"
|
||||
brew "zstd"
|
||||
brew "libssh2"
|
||||
brew "md4c"
|
||||
27
dist/macOS/arm64.Dockerfile
vendored
27
dist/macOS/arm64.Dockerfile
vendored
@@ -1,5 +1,5 @@
|
||||
# This base image is also known as "crosscompile". See arm64.crosscompile.Dockerfile
|
||||
FROM ghcr.io/itrooz/macos-crosscompile:clang19-nosdk as build
|
||||
FROM ghcr.io/werwolv/macos-crosscompile:4c4af2d1a6a102fab93cc9cd660280c2ec9d72af as build
|
||||
|
||||
ENV MACOSX_DEPLOYMENT_TARGET 13.0
|
||||
|
||||
@@ -17,13 +17,13 @@ cp /tmp/arm-osx-mytriplet.cmake /vcpkg/triplets/community/arm-osx-mytriplet.cmak
|
||||
EOF
|
||||
|
||||
## 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 cmake
|
||||
|
||||
## fix environment
|
||||
### add install_name_tool for cmake command that won't have the right env set (see PostprocessBundle.cmake function postprocess_bundle())
|
||||
RUN cp /osxcross/build/cctools-port/cctools/misc/install_name_tool /usr/bin/install_name_tool
|
||||
### a cmake thing wants 'otool' and not '' apparently
|
||||
RUN cp /osxcross/target/bin/aarch64-apple-darwin23-otool /usr/bin/otool
|
||||
RUN cp /osxcross/target/bin/aarch64-apple-darwin24-otool /usr/bin/otool
|
||||
|
||||
## Clone glfw
|
||||
RUN <<EOF
|
||||
@@ -36,10 +36,10 @@ EOF
|
||||
RUN --mount=type=cache,target=/cache <<EOF
|
||||
## Download SDK is missing (it may have been removed from the image)
|
||||
set -xe
|
||||
if [ ! -d /osxcross/target/SDK/MacOSX14.0.sdk ]; then
|
||||
wget https://github.com/joseluisq/macosx-sdks/releases/download/14.0/MacOSX14.0.sdk.tar.xz -O /cache/MacOSX14.0.sdk.tar.xz -nc || true
|
||||
if [ ! -d /osxcross/target/SDK/MacOSX15.0.sdk ]; then
|
||||
wget https://github.com/joseluisq/macosx-sdks/releases/download/15.0/MacOSX15.0.sdk.tar.xz -O /cache/MacOSX15.0.sdk.tar.xz -nc || true
|
||||
mkdir -p /osxcross/target/SDK
|
||||
tar -C /osxcross/target/SDK -xf /cache/MacOSX14.0.sdk.tar.xz
|
||||
tar -C /osxcross/target/SDK -xf /cache/MacOSX15.0.sdk.tar.xz
|
||||
fi
|
||||
EOF
|
||||
|
||||
@@ -67,6 +67,8 @@ vcpkg install --triplet=arm-osx-mytriplet zlib
|
||||
vcpkg install --triplet=arm-osx-mytriplet bzip2
|
||||
vcpkg install --triplet=arm-osx-mytriplet liblzma
|
||||
vcpkg install --triplet=arm-osx-mytriplet zstd
|
||||
vcpkg install --triplet=arm-osx-mytriplet openssl
|
||||
vcpkg install --triplet=arm-osx-mytriplet libssh2
|
||||
EOF
|
||||
|
||||
## Install glfw3 dep
|
||||
@@ -99,7 +101,7 @@ RUN --mount=type=cache,target=/cache <<EOF
|
||||
make -j $JOBS install
|
||||
|
||||
# Now, we cross-compile it and install it in the libraries folder
|
||||
CC=/osxcross/target/bin/aarch64-apple-darwin23-clang CXX=/osxcross/target/bin/aarch64-apple-darwin23-clang++ ./configure --prefix /vcpkg/installed/arm-osx-mytriplet --host $OSXCROSS_HOST
|
||||
CC=/osxcross/target/bin/aarch64-apple-darwin24-clang CXX=/osxcross/target/bin/aarch64-apple-darwin24-clang++ ./configure --prefix /vcpkg/installed/arm-osx-mytriplet --host $OSXCROSS_HOST
|
||||
make -j $JOBS
|
||||
make install
|
||||
|
||||
@@ -137,7 +139,7 @@ if [ "$CUSTOM_GLFW" ]; then
|
||||
-DCMAKE_OBJC_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_OBJCXX_COMPILER_LAUNCHER=ccache \
|
||||
-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=13.0 \
|
||||
-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.3 \
|
||||
..
|
||||
ninja -j $JOBS install
|
||||
|
||||
@@ -148,24 +150,23 @@ EOF
|
||||
# Build ImHex
|
||||
## Copy ImHex
|
||||
COPY --from=imhex / /mnt/ImHex
|
||||
## Patch ImHex with hacks
|
||||
# COPY toolchain.cmake.2 /osxcross/target/toolchain.cmake
|
||||
# Configure ImHex build
|
||||
## Configure ImHex build
|
||||
RUN --mount=type=cache,target=/cache --mount=type=cache,target=/mnt/ImHex/build/_deps \
|
||||
cd /mnt/ImHex && \
|
||||
# compilers
|
||||
CC=o64-clang CXX=o64-clang++ OBJC=/osxcross/target/bin/aarch64-apple-darwin23-clang OBJCXX=/osxcross/target/bin/aarch64-apple-darwin23-clang++ \
|
||||
CC=o64-clang CXX=o64-clang++ OBJC=/osxcross/target/bin/aarch64-apple-darwin24-clang OBJCXX=/osxcross/target/bin/aarch64-apple-darwin24-clang++ \
|
||||
cmake -G "Ninja" \
|
||||
`# ccache flags` \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_OBJC_COMPILER_LAUNCHER=ccache -DCMAKE_OBJCXX_COMPILER_LAUNCHER=ccache \
|
||||
`# 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=13.0 \
|
||||
-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.3 \
|
||||
`# Override compilers for code generators` \
|
||||
-DNATIVE_CMAKE_C_COMPILER=/usr/bin/clang -DNATIVE_CMAKE_CXX_COMPILER=/usr/bin/clang++ \
|
||||
`# Normal ImHex flags` \
|
||||
-DIMHEX_GENERATE_PACKAGE=ON -DCMAKE_BUILD_TYPE=$BUILD_TYPE \
|
||||
`# other flags` \
|
||||
-DIMHEX_STRICT_WARNINGS=OFF \
|
||||
-DIMHEX_PATTERNS_PULL_MASTER=ON \
|
||||
-DCMAKE_INSTALL_PREFIX=/mnt/ImHex/build/install \
|
||||
-B build
|
||||
## Build ImHex
|
||||
|
||||
4
dist/macOS/arm64.crosscompile.Dockerfile
vendored
4
dist/macOS/arm64.crosscompile.Dockerfile
vendored
@@ -4,9 +4,9 @@ FROM ubuntu:22.04
|
||||
ENV PATH $PATH:/osxcross/target/bin
|
||||
ENV LD_LIBRARY_PATH /osxcross/target/lib
|
||||
ENV OSXCROSS_SDK /osxcross/target/SDK/MacOSX14.0.sdk
|
||||
ENV OSXCROSS_TARGET darwin23
|
||||
ENV OSXCROSS_TARGET darwin24
|
||||
ENV OSXCROSS_TARGET_DIR /osxcross/target
|
||||
ENV OSXCROSS_HOST aarch64-apple-darwin23
|
||||
ENV OSXCROSS_HOST aarch64-apple-darwin24
|
||||
|
||||
# -- DOWNLOADING STUFF
|
||||
|
||||
|
||||
4
dist/msys2/PKGBUILD
vendored
4
dist/msys2/PKGBUILD
vendored
@@ -20,7 +20,9 @@ makedepends=("${MINGW_PACKAGE_PREFIX}-gcc"
|
||||
"${MINGW_PACKAGE_PREFIX}-zlib"
|
||||
"${MINGW_PACKAGE_PREFIX}-bzip2"
|
||||
"${MINGW_PACKAGE_PREFIX}-xz"
|
||||
"${MINGW_PACKAGE_PREFIX}-zstd")
|
||||
"${MINGW_PACKAGE_PREFIX}-zstd"
|
||||
"${MINGW_PACKAGE_PREFIX}-libssh2-wincng"
|
||||
"${MINGW_PACKAGE_PREFIX}-md4c")
|
||||
|
||||
source=()
|
||||
sha256sums=()
|
||||
|
||||
71
dist/net.werwolv.ImHex.metainfo.xml
vendored
Normal file
71
dist/net.werwolv.ImHex.metainfo.xml
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<component type="desktop">
|
||||
<id>net.werwolv.ImHex</id>
|
||||
<name>ImHex</name>
|
||||
<summary>Modern REing Hex Editor</summary>
|
||||
<description>
|
||||
<p>
|
||||
ImHex is a modern Hex Editor for Reverse Engineers, Developers, Malware Analysists and Hackers who value
|
||||
their retinas when working at 3 AM once again.
|
||||
</p>
|
||||
<p>
|
||||
Features:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Featureful hex view</li>
|
||||
<li>Custom C++-like pattern language for parsing and highlighting a file's content</li>
|
||||
<li>Data importing and exporting</li>
|
||||
<li>Data inspector allowing interpretation of data as many different types</li>
|
||||
<li>Huge file support with fast and efficient loading</li>
|
||||
<li>Strings search</li>
|
||||
<li>File hashing support</li>
|
||||
<li>Disassembler supporting many different architectures: ARM, x86, PowerPC, MIPS, and more</li>
|
||||
<li>Bookmarks</li>
|
||||
<li>Data analyzer</li>
|
||||
<li>
|
||||
Helpful tools such as an Itanium and MSVC demangler, ASCII table, Regex
|
||||
replacer, mathematical expression evaluator (calculator), hexadecimal
|
||||
color picker and many more
|
||||
</li>
|
||||
<li>Doesn't burn out your retinas when used in late-night sessions</li>
|
||||
</ul>
|
||||
</description>
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<project_license>GPL-2.0-only</project_license>
|
||||
<developer id="net.werwolv">
|
||||
<name>WerWolv</name>
|
||||
</developer>
|
||||
<url type="homepage">https://imhex.werwolv.net</url>
|
||||
<url type="bugtracker">https://github.com/WerWolv/ImHex/issues</url>
|
||||
<url type="help">https://docs.werwolv.net/imhex</url>
|
||||
<url type="donation">https://github.com/sponsors/WerWolv</url>
|
||||
<url type="contact">https://imhex.werwolv.net/discord</url>
|
||||
<url type="vcs-browser">https://github.com/WerWolv/ImHex</url>
|
||||
<url type="contribute">https://github.com/WerWolv/ImHex/blob/master/CONTRIBUTING.md</url>
|
||||
<launchable type="desktop-id">imhex.desktop</launchable>
|
||||
<screenshots>
|
||||
<screenshot type="default" width="1920" height="1017">
|
||||
<image type="source">https://raw.githubusercontent.com/flathub/net.werwolv.ImHex/master/screenshots/screenshot1.png</image>
|
||||
<caption>Using a pattern to parse and highlight different sections of an ELF executable file</caption>
|
||||
</screenshot>
|
||||
<screenshot type="default" width="1920" height="1017">
|
||||
<image type="source">https://raw.githubusercontent.com/flathub/net.werwolv.ImHex/master/screenshots/screenshot2.png</image>
|
||||
<caption>Managing bookmarks, diffing two files and decrypting a region of data using the data preprocessor</caption>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
<content_rating type="oars-1.1"/>
|
||||
<branding>
|
||||
<color type="primary" scheme_preference="light">#babec9</color>
|
||||
<color type="primary" scheme_preference="dark">#0f0f0f</color>
|
||||
</branding>
|
||||
<releases>
|
||||
<release version="1.0.0" date="2025-01-01">
|
||||
<description></description>
|
||||
</release>
|
||||
</releases>
|
||||
<update_contact>hey@werwolv.net</update_contact>
|
||||
<recommends>
|
||||
<control>keyboard</control>
|
||||
<control>pointing</control>
|
||||
</recommends>
|
||||
</component>
|
||||
22
dist/net.werwolv.ImHex.yaml
vendored
22
dist/net.werwolv.ImHex.yaml
vendored
@@ -1,22 +0,0 @@
|
||||
app-id: net.werwolv.ImHex
|
||||
runtime: org.freedesktop.Platform
|
||||
runtime-version: '20.08'
|
||||
default-branch: stable
|
||||
sdk: org.freedesktop.Sdk
|
||||
command: imhex
|
||||
|
||||
finish-args:
|
||||
- --share=ipc
|
||||
- --socket=x11
|
||||
- --filesystem=host
|
||||
- --device=all
|
||||
|
||||
modules:
|
||||
- name: imhex
|
||||
buildsystem: cmake
|
||||
config-opts:
|
||||
- -DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
|
||||
sources:
|
||||
- type: git
|
||||
url: https://github.com/WerWolv/ImHex.git
|
||||
34
dist/net.werwolv.imhex.metainfo.xml
vendored
34
dist/net.werwolv.imhex.metainfo.xml
vendored
@@ -1,34 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<component type="desktop-application">
|
||||
<id>imhex</id>
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<project_license>GPL-2.0</project_license>
|
||||
<name>ImHex</name>
|
||||
<developer_name>WerWolv</developer_name>
|
||||
<update_contact>hey@werwolv.net</update_contact>
|
||||
<summary>A Hex Editor for Reverse Engineers, Programmers and people who value their retinas when working at 3 AM</summary>
|
||||
<description>
|
||||
<p>ImHex is a feature-rich Hex Editor aimed towards Reverse Engineers working with foreign data formats, malware, executables and raw memory.
|
||||
Besides all the features a common Hex Editor has, ImHex also features a custom scripting language used to declare and dissect data structures, support for running YARA rules, a node-based graphical data pre-processor and support for various data sources such as files, raw disks or GDB Servers.</p>
|
||||
</description>
|
||||
<launchable type="desktop-id">imhex.desktop</launchable>
|
||||
<url type="homepage">https://imhex.werwolv.net</url>
|
||||
<screenshots>
|
||||
<screenshot type="default">
|
||||
<image>https://user-images.githubusercontent.com/10835354/139717326-8044769d-527b-4d88-8adf-2d4ecafdca1f.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<image>https://user-images.githubusercontent.com/10835354/139717323-1f8c9d52-f7eb-4f43-9f11-097ac728ed6c.png</image>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
|
||||
<provides>
|
||||
<id>imhex.desktop</id>
|
||||
</provides>
|
||||
|
||||
<categories>
|
||||
<category>Development</category>
|
||||
</categories>
|
||||
|
||||
|
||||
</component>
|
||||
116
dist/rpm/imhex.spec
vendored
116
dist/rpm/imhex.spec
vendored
@@ -6,7 +6,7 @@ Release: 0%{?dist}
|
||||
Summary: A hex editor for reverse engineers and programmers
|
||||
|
||||
License: GPL-2.0-only AND Zlib AND MIT AND Apache-2.0
|
||||
# imhex is gplv2. capstone is custom. nativefiledialog is Zlib.
|
||||
# imhex is gplv2. capstone is custom.
|
||||
# see license dir for full breakdown
|
||||
URL: https://imhex.werwolv.net/
|
||||
# We need the archive with deps bundled
|
||||
@@ -16,7 +16,6 @@ BuildRequires: cmake
|
||||
BuildRequires: desktop-file-utils
|
||||
BuildRequires: dbus-devel
|
||||
BuildRequires: file-devel
|
||||
BuildRequires: fontconfig-devel
|
||||
BuildRequires: freetype-devel
|
||||
BuildRequires: fmt-devel
|
||||
BuildRequires: gcc-c++
|
||||
@@ -25,32 +24,41 @@ BuildRequires: libglvnd-devel
|
||||
BuildRequires: glfw-devel
|
||||
BuildRequires: json-devel
|
||||
BuildRequires: libcurl-devel
|
||||
BuildRequires: llvm-devel
|
||||
BuildRequires: mbedtls-devel
|
||||
BuildRequires: yara-devel
|
||||
BuildRequires: nativefiledialog-extended-devel
|
||||
BuildRequires: dotnet-sdk-8.0
|
||||
BuildRequires: libarchive-devel
|
||||
BuildRequires: libzstd-devel
|
||||
BuildRequires: zlib-devel
|
||||
BuildRequires: bzip2-devel
|
||||
BuildRequires: xz-devel
|
||||
%if 0%{?rhel}
|
||||
BuildRequires: llvm-devel
|
||||
BuildRequires: mbedtls-devel
|
||||
BuildRequires: yara-devel
|
||||
BuildRequires: nativefiledialog-extended-devel
|
||||
BuildRequires: lz4-devel
|
||||
BuildRequires: libssh2-devel
|
||||
%if 0%{?rhel} == 9
|
||||
BuildRequires: gcc-toolset-14
|
||||
%endif
|
||||
%if 0%{?fedora} || 0%{?rhel} > 9
|
||||
BuildRequires: capstone-devel
|
||||
%endif
|
||||
BuildRequires: lunasvg-devel
|
||||
|
||||
|
||||
Provides: bundled(gnulib)
|
||||
Provides: bundled(capstone) = 5.0-rc2
|
||||
Provides: bundled(imgui)
|
||||
%if 0%{?rhel} == 10
|
||||
Provides: bundled(capstone) = 5.0.1
|
||||
%endif
|
||||
Provides: bundled(imgui) = 1.90.8
|
||||
Provides: bundled(libromfs)
|
||||
Provides: bundled(microtar)
|
||||
Provides: bundled(libpl) = %{version}
|
||||
Provides: bundled(xdgpp)
|
||||
# working on packaging this, bundling for now as to now delay updates
|
||||
Provides: bundled(miniaudio) = 0.11.11
|
||||
|
||||
# ftbfs on these arches. armv7hl might compile when capstone 5.x
|
||||
# is released upstream and we can build against it
|
||||
# [7:02 PM] WerWolv: We're not supporting 32 bit anyways soooo
|
||||
# [11:38 AM] WerWolv: Officially supported are x86_64 and aarch64
|
||||
ExclusiveArch: x86_64 %{arm64} ppc64le
|
||||
|
||||
ExclusiveArch: x86_64 %{arm64}
|
||||
|
||||
%description
|
||||
ImHex is a Hex Editor, a tool to display, decode and analyze binary data to
|
||||
@@ -64,16 +72,33 @@ displayed, a disassembler, diffing support, bookmarks and much much more. At the
|
||||
same time ImHex is completely free and open source under the GPLv2 language.
|
||||
|
||||
|
||||
%package devel
|
||||
Summary: Development files for %{name}
|
||||
License: GPL-2.0-only
|
||||
%description devel
|
||||
%{summary}
|
||||
|
||||
|
||||
%prep
|
||||
%autosetup -n ImHex
|
||||
%autosetup -n ImHex -p1
|
||||
# remove bundled libs we aren't using
|
||||
rm -rf lib/third_party/{fmt,nlohmann_json,yara}
|
||||
rm -rf lib/third_party/{curl,fmt,llvm,nlohmann_json,yara}
|
||||
%if 0%{?fedora} || 0%{?rhel} > 9
|
||||
rm -rf lib/third_party/capstone
|
||||
%endif
|
||||
|
||||
# rhel 9 doesn't support all of the new appstream metainfo tags
|
||||
%if 0%{?rhel} && 0%{?rhel} < 10
|
||||
sed -i -e '/url type="vcs-browser"/d' \
|
||||
-e '/url type="contribute"/d' \
|
||||
dist/net.werwolv.ImHex.metainfo.xml
|
||||
%endif
|
||||
|
||||
%build
|
||||
%if 0%{?rhel}
|
||||
%if 0%{?rhel} == 9
|
||||
. /opt/rh/gcc-toolset-14/enable
|
||||
%set_build_flags
|
||||
CXXFLAGS+=" -std=gnu++23"
|
||||
CXXFLAGS+=" -std=gnu++2b"
|
||||
%endif
|
||||
%cmake \
|
||||
-D CMAKE_BUILD_TYPE=Release \
|
||||
@@ -81,23 +106,31 @@ CXXFLAGS+=" -std=gnu++23"
|
||||
-D IMHEX_OFFLINE_BUILD=ON \
|
||||
-D USE_SYSTEM_NLOHMANN_JSON=ON \
|
||||
-D USE_SYSTEM_FMT=ON \
|
||||
-D USE_SYSTEM_CURL=ON \
|
||||
-D USE_SYSTEM_LLVM=ON \
|
||||
-D USE_SYSTEM_MD4C=OFF \
|
||||
%if 0%{?fedora} || 0%{?rhel} > 9
|
||||
-D USE_SYSTEM_CAPSTONE=ON \
|
||||
%endif
|
||||
-D USE_SYSTEM_LUNASVG=ON \
|
||||
-D USE_SYSTEM_YARA=ON \
|
||||
-D USE_SYSTEM_NFD=ON \
|
||||
-D IMHEX_USE_GTK_FILE_PICKER=ON \
|
||||
-D IMHEX_BUNDLE_DOTNET=OFF \
|
||||
# when capstone >= 5.x is released we should be able to build against \
|
||||
# system libs of it \
|
||||
# -D USE_SYSTEM_CAPSTONE=ON
|
||||
-D IMHEX_ENABLE_UNIT_TESTS=ON \
|
||||
%if 0%{?rhel}
|
||||
-D IMHEX_BUILD_HARDENING=OFF
|
||||
%endif
|
||||
# disable built-in build hardening because it is already
|
||||
# done in rhel buildroots. adding the flags again from
|
||||
# upstream generates build errors
|
||||
|
||||
%cmake_build
|
||||
|
||||
|
||||
%check
|
||||
%if 0%{?rhel}
|
||||
. /opt/rh/gcc-toolset-14/enable
|
||||
%set_build_flags
|
||||
CXXFLAGS+=" -std=gnu++23"
|
||||
%endif
|
||||
# build binaries required for tests
|
||||
%cmake_build --target unit_tests
|
||||
%ctest --exclude-regex '(Helpers/StoreAPI|Helpers/TipsAPI|Helpers/ContentAPI)'
|
||||
# Helpers/*API exclude tests that require network access
|
||||
|
||||
|
||||
%install
|
||||
@@ -105,15 +138,15 @@ CXXFLAGS+=" -std=gnu++23"
|
||||
desktop-file-validate %{buildroot}%{_datadir}/applications/%{name}.desktop
|
||||
|
||||
# this is a symlink for the old appdata name that we don't need
|
||||
rm -f %{buildroot}%{_metainfodir}/net.werwolv.%{name}.appdata.xml
|
||||
rm -f %{buildroot}%{_metainfodir}/net.werwolv.ImHex.appdata.xml
|
||||
|
||||
# AppData
|
||||
appstream-util validate-relax --nonet %{buildroot}%{_metainfodir}/net.werwolv.%{name}.metainfo.xml
|
||||
appstream-util validate-relax --nonet %{buildroot}%{_metainfodir}/net.werwolv.ImHex.metainfo.xml
|
||||
|
||||
# install licenses
|
||||
cp -a lib/third_party/nativefiledialog/LICENSE %{buildroot}%{_datadir}/licenses/%{name}/nativefiledialog-LICENSE
|
||||
cp -a lib/third_party/capstone/LICENSE.TXT %{buildroot}%{_datadir}/licenses/%{name}/capstone-LICENSE
|
||||
cp -a lib/third_party/capstone/suite/regress/LICENSE %{buildroot}%{_datadir}/licenses/%{name}/capstone-regress-LICENSE
|
||||
%if 0%{?rhel} == 9
|
||||
cp -a lib/third_party/capstone/LICENSES/LICENSE.TXT %{buildroot}%{_datadir}/licenses/%{name}/capstone-LICENSE
|
||||
%endif
|
||||
cp -a lib/third_party/microtar/LICENSE %{buildroot}%{_datadir}/licenses/%{name}/microtar-LICENSE
|
||||
cp -a lib/third_party/xdgpp/LICENSE %{buildroot}%{_datadir}/licenses/%{name}/xdgpp-LICENSE
|
||||
|
||||
@@ -122,11 +155,16 @@ cp -a lib/third_party/xdgpp/LICENSE %{buildroot
|
||||
%license %{_datadir}/licenses/%{name}/
|
||||
%doc README.md
|
||||
%{_bindir}/imhex
|
||||
%{_bindir}/imhex-updater
|
||||
%{_datadir}/pixmaps/%{name}.svg
|
||||
%{_datadir}/imhex/imhex
|
||||
%{_datadir}/pixmaps/%{name}.*
|
||||
%{_datadir}/applications/%{name}.desktop
|
||||
%{_datadir}/mime/packages/%{name}.xml
|
||||
%{_libdir}/libimhex.so*
|
||||
%{_libdir}/libimhex.so.*
|
||||
%{_libdir}/%{name}/
|
||||
/usr/lib/debug/%{_libdir}/*.debug
|
||||
%{_metainfodir}/net.werwolv.%{name}.metainfo.xml
|
||||
%{_metainfodir}/net.werwolv.ImHex.metainfo.xml
|
||||
%exclude %{_bindir}/imhex-updater
|
||||
%{_datadir}/mime/packages/%{name}.xml
|
||||
|
||||
|
||||
%files devel
|
||||
%{_libdir}/libimhex.so
|
||||
%{_datadir}/%{name}/sdk/
|
||||
|
||||
92
dist/snap/snapcraft.yaml
vendored
Normal file
92
dist/snap/snapcraft.yaml
vendored
Normal file
@@ -0,0 +1,92 @@
|
||||
name: imhex
|
||||
title: ImHex
|
||||
base: core24
|
||||
version: ${IMHEX_VERSION_STRING}
|
||||
summary: Hex editor for reverse engineering
|
||||
description: ImHex is a hex editor for reverse engineering, reverse engineering, and analyzing binary files. It provides a powerful and flexible interface for working with binary data, including features like pattern matching, scripting, and a customizable user interface.
|
||||
grade: stable
|
||||
confinement: classic
|
||||
contact: https://github.com/WerWolv/ImHex/discussions
|
||||
issues: https://github.com/WerWolv/ImHex/issues
|
||||
source-code: https://github.com/WerWolv/ImHex
|
||||
website: https://imhex.werwolv.net
|
||||
donation: https://github.com/sponsors/WerWolv
|
||||
license: GPL-2.0-only
|
||||
icon: resources/icon.svg
|
||||
adopt-info: imhex
|
||||
|
||||
platforms:
|
||||
amd64:
|
||||
arm64:
|
||||
|
||||
apps:
|
||||
imhex:
|
||||
command: usr/local/bin/imhex
|
||||
desktop: usr/local/share/applications/imhex.desktop
|
||||
environment:
|
||||
LD_LIBRARY_PATH: '$SNAP/usr/local/lib:$SNAP/usr/local/lib/imhex:$SNAP/usr/lib/x86_64-linux-gnu:$SNAP/usr/lib/aarch64-linux-gnu:$LD_LIBRARY_PATH'
|
||||
XDG_DATA_DIRS: '$XDG_DATA_DIRS:$SNAP/usr/local/share:$SNAP/usr/local/lib:$SNAP/usr/local/share'
|
||||
XDG_CONFIG_DIRS: '$XDG_CONFIG_DIRS:$SNAP/usr/local/share'
|
||||
XDG_DATA_HOME: '$XDG_DATA_HOME:$SNAP_DATA'
|
||||
|
||||
parts:
|
||||
imhex:
|
||||
plugin: cmake
|
||||
source: .
|
||||
build-environment:
|
||||
- CC: /usr/bin/gcc-14
|
||||
- CXX: /usr/bin/g++-14
|
||||
cmake-parameters:
|
||||
- -DCMAKE_BUILD_TYPE=Release
|
||||
- -DCMAKE_C_COMPILER_LAUNCHER=${CCACHE}
|
||||
- -DCMAKE_CXX_COMPILER_LAUNCHER=${CCACHE}
|
||||
- -DIMHEX_PATTERNS_PULL_MASTER=ON
|
||||
- -DIMHEX_BUNDLE_PLUGIN_SDK=OFF
|
||||
cmake-generator: Ninja
|
||||
build-packages:
|
||||
- cmake
|
||||
- ninja-build
|
||||
- gcc-14
|
||||
- g++-14
|
||||
- git
|
||||
- pkg-config
|
||||
- libglfw3-dev
|
||||
- libmagic-dev
|
||||
- libmbedtls-dev
|
||||
- libfontconfig-dev
|
||||
- libfreetype-dev
|
||||
- libdbus-1-dev
|
||||
- libcurl4-gnutls-dev
|
||||
- libgtk-3-dev
|
||||
- zlib1g-dev
|
||||
- libbz2-dev
|
||||
- liblzma-dev
|
||||
- libzstd-dev
|
||||
- liblz4-dev
|
||||
- libssh2-1-dev
|
||||
- libmd4c-dev
|
||||
- libmd4c-html0-dev
|
||||
stage-packages:
|
||||
- libglfw3
|
||||
- libmagic1
|
||||
- libmbedtls14
|
||||
- libfontconfig1
|
||||
- libfreetype6
|
||||
- libdbus-1-3
|
||||
- libcurl4-gnutls-dev
|
||||
- libgtk-3-0
|
||||
- zlib1g
|
||||
- libbz2-1.0
|
||||
- liblzma5
|
||||
- libzstd1
|
||||
- liblz4-1
|
||||
- libssh2-1
|
||||
prime:
|
||||
- -usr/include/*
|
||||
- -usr/local/include/*
|
||||
- -usr/lib/**/*.a
|
||||
- -usr/local/lib/**/*.a
|
||||
- -usr/lib/**/*.la
|
||||
- -usr/local/lib/**/*.la
|
||||
- -usr/share/doc/*
|
||||
- -usr/share/man/*
|
||||
4
dist/vcpkg.json
vendored
4
dist/vcpkg.json
vendored
@@ -11,6 +11,8 @@
|
||||
"liblzma",
|
||||
"zstd",
|
||||
"glfw3",
|
||||
"curl"
|
||||
"curl",
|
||||
"libssh2",
|
||||
"md4c"
|
||||
]
|
||||
}
|
||||
21
dist/web/Dockerfile
vendored
21
dist/web/Dockerfile
vendored
@@ -1,24 +1,24 @@
|
||||
FROM emscripten/emsdk:4.0.8 AS build
|
||||
FROM emscripten/emsdk:4.0.21 AS build
|
||||
|
||||
# Used to invalidate layer cache but not mount cache
|
||||
# See https://github.com/moby/moby/issues/41715#issuecomment-733976493
|
||||
ARG UNIQUEKEY 1
|
||||
ARG UNIQUEKEY=1
|
||||
|
||||
RUN apt update
|
||||
RUN apt install -y git ccache autoconf automake libtool cmake pkg-config ninja-build
|
||||
RUN apt install -y git ccache autoconf automake libtool pkg-config ninja-build
|
||||
|
||||
RUN <<EOF
|
||||
# Install vcpkg
|
||||
# Note: we are a patch on the libmagic port
|
||||
set -xe
|
||||
|
||||
git clone https://github.com/microsoft/vcpkg /vcpkg
|
||||
git -C /vcpkg pull
|
||||
git clone --depth 1 https://github.com/microsoft/vcpkg /vcpkg
|
||||
/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
|
||||
EOF
|
||||
|
||||
# Patch vcpkg build instructions to add -pthread
|
||||
# Patch vcpkg build instructions to add -pthread flag
|
||||
# Even dependencies must be built with -pthread to be able to use USE_PTHREADS=1
|
||||
RUN <<EOF
|
||||
set -xe
|
||||
|
||||
@@ -50,17 +50,18 @@ ENV CCACHE_DIR=/cache/ccache
|
||||
|
||||
RUN mkdir /build
|
||||
WORKDIR /build
|
||||
ARG BUILD_TYPE=Release
|
||||
RUN --mount=type=cache,target=/cache \
|
||||
--mount=type=bind,source=.,target=/imhex <<EOF
|
||||
|
||||
set -xe
|
||||
ccache -zs
|
||||
|
||||
cmake /imhex \
|
||||
/vcpkg/downloads/tools/cmake-*/cmake-*/bin/cmake /imhex \
|
||||
-G "Ninja" \
|
||||
-DIMHEX_OFFLINE_BUILD=ON \
|
||||
-DIMHEX_STATIC_LINK_PLUGINS=ON \
|
||||
-DIMHEX_EXCLUDE_PLUGINS="script_loader" \
|
||||
-DIMHEX_EXCLUDE_PLUGINS="script_loader;remote" \
|
||||
-DIMHEX_COMPRESS_DEBUG_INFO=OFF \
|
||||
-DNATIVE_CMAKE_C_COMPILER=gcc \
|
||||
-DNATIVE_CMAKE_CXX_COMPILER=g++ \
|
||||
@@ -69,7 +70,8 @@ cmake /imhex
|
||||
-DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake \
|
||||
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake \
|
||||
-DLIBROMFS_COMPRESS_RESOURCES=OFF \
|
||||
-DCMAKE_BUILD_TYPE=Release
|
||||
-DIMHEX_ENABLE_PLUGIN_TESTS=OFF \
|
||||
-DCMAKE_BUILD_TYPE=${BUILD_TYPE}
|
||||
|
||||
ninja -j $JOBS
|
||||
|
||||
@@ -105,3 +107,4 @@ COPY --from=build [ \
|
||||
|
||||
FROM nginx
|
||||
COPY --from=raw . /usr/share/nginx/html
|
||||
RUN chmod -R 755 /usr/share/nginx/html
|
||||
|
||||
1
dist/web/compose.yml
vendored
1
dist/web/compose.yml
vendored
@@ -1,5 +1,4 @@
|
||||
# docker compose -f dist/web/compose.yml up --build
|
||||
version: '3'
|
||||
services:
|
||||
imhex_web:
|
||||
image: imhex_web:latest
|
||||
|
||||
4
dist/web/source/wasm-config.js
vendored
4
dist/web/source/wasm-config.js
vendored
@@ -251,6 +251,10 @@ const urlParams = new URLSearchParams(queryString);
|
||||
if (urlParams.has("lang")) {
|
||||
Module["arguments"].push("--language");
|
||||
Module["arguments"].push(urlParams.get("lang"));
|
||||
} else if (urlParams.has("save-editor")) {
|
||||
Module["arguments"].push("--save-editor");
|
||||
Module["arguments"].push("gist");
|
||||
Module["arguments"].push(urlParams.get("save-editor"));
|
||||
}
|
||||
|
||||
window.addEventListener('resize', js_resizeCanvas, false);
|
||||
|
||||
2
lib/external/libromfs
vendored
2
lib/external/libromfs
vendored
Submodule lib/external/libromfs updated: 4f42f099b2...fa444f2995
2
lib/external/libwolv
vendored
2
lib/external/libwolv
vendored
Submodule lib/external/libwolv updated: a50a748ce7...c9108712ba
2
lib/external/pattern_language
vendored
2
lib/external/pattern_language
vendored
Submodule lib/external/pattern_language updated: 7a741cef11...fb6ea061f7
@@ -40,12 +40,14 @@ set(LIBIMHEX_SOURCES
|
||||
source/helpers/imgui_hooks.cpp
|
||||
source/helpers/semantic_version.cpp
|
||||
source/helpers/keys.cpp
|
||||
source/helpers/freetype.cpp
|
||||
source/helpers/udp_server.cpp
|
||||
source/helpers/scaling.cpp
|
||||
source/helpers/binary_pattern.cpp
|
||||
|
||||
source/test/tests.cpp
|
||||
|
||||
source/providers/provider.cpp
|
||||
source/providers/cached_provider.cpp
|
||||
source/providers/memory_provider.cpp
|
||||
source/providers/undo/stack.cpp
|
||||
|
||||
@@ -59,15 +61,6 @@ set(LIBIMHEX_SOURCES
|
||||
)
|
||||
|
||||
if (APPLE)
|
||||
set(OSX_SDK_PATH /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.sdk)
|
||||
if (NOT CMAKE_OSX_SYSROOT)
|
||||
if (IS_DIRECTORY ${OSX_SDK_PATH})
|
||||
set(CMAKE_OSX_SYSROOT ${OSX_SDK_PATH})
|
||||
else ()
|
||||
message(WARNING "CMAKE_OSX_SYSROOT not set and macOS SDK not found! Using default one.")
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
set(LIBIMHEX_SOURCES ${LIBIMHEX_SOURCES}
|
||||
source/helpers/utils_macos.m
|
||||
source/helpers/macos_menu.m
|
||||
@@ -97,6 +90,8 @@ else()
|
||||
target_compile_definitions(libimhex PRIVATE IMHEX_PROJECT_NAME="${PROJECT_NAME}")
|
||||
endif()
|
||||
|
||||
addCppCheck(libimhex)
|
||||
|
||||
|
||||
if (DEFINED IMHEX_COMMIT_HASH_LONG AND DEFINED IMHEX_COMMIT_BRANCH)
|
||||
set(GIT_COMMIT_HASH_LONG "${IMHEX_COMMIT_HASH_LONG}")
|
||||
@@ -131,6 +126,9 @@ endif ()
|
||||
|
||||
addDefineToSource(source/api/imhex_api.cpp "IMHEX_VERSION=\"${IMHEX_VERSION_STRING}\"")
|
||||
|
||||
string(TIMESTAMP IMHEX_BUILD_DATE UTC)
|
||||
addDefineToSource(source/api/imhex_api.cpp "IMHEX_BUILD_DATE=\"${IMHEX_BUILD_DATE}\"")
|
||||
|
||||
enableUnityBuild(libimhex)
|
||||
setupCompilerFlags(libimhex)
|
||||
|
||||
@@ -149,12 +147,17 @@ if (NOT IMHEX_EXTERNAL_PLUGIN_BUILD)
|
||||
target_compile_definitions(libimhex PRIVATE EXPORT_SYMBOLS=1)
|
||||
elseif (APPLE)
|
||||
find_library(FOUNDATION NAMES Foundation)
|
||||
target_link_libraries(libimhex PUBLIC ${FOUNDATION})
|
||||
find_library(USERNOTIFICATIONS NAMES UserNotifications)
|
||||
target_link_libraries(libimhex PUBLIC ${FOUNDATION} ${USERNOTIFICATIONS})
|
||||
endif ()
|
||||
|
||||
target_link_libraries(libimhex PRIVATE libpl microtar ${NFD_LIBRARIES} magic)
|
||||
target_link_libraries(libimhex PUBLIC libwolv libpl_includes libpl-gen ${IMGUI_LIBRARIES} ${JTHREAD_LIBRARIES})
|
||||
|
||||
if (IMHEX_ENABLE_IMGUI_TEST_ENGINE)
|
||||
target_link_libraries(libimhex PUBLIC imgui_test_engine)
|
||||
endif()
|
||||
|
||||
if (NOT WIN32)
|
||||
target_link_libraries(libimhex PRIVATE dl)
|
||||
endif()
|
||||
|
||||
@@ -39,9 +39,16 @@ module;
|
||||
export module hex;
|
||||
|
||||
#define HEX_MODULE_EXPORT
|
||||
|
||||
#include <hex/api/imhex_api/bookmarks.hpp>
|
||||
#include <hex/api/imhex_api/hex_editor.hpp>
|
||||
#include <hex/api/imhex_api/fonts.hpp>
|
||||
#include <hex/api/imhex_api/messaging.hpp>
|
||||
#include <hex/api/imhex_api/provider.hpp>
|
||||
#include <hex/api/imhex_api/system.hpp>
|
||||
|
||||
#include <hex/api/task_manager.hpp>
|
||||
#include <hex/api/achievement_manager.hpp>
|
||||
#include <hex/api/imhex_api.hpp>
|
||||
#include <hex/api/layout_manager.hpp>
|
||||
#include <hex/api/localization_manager.hpp>
|
||||
#include <hex/api/plugin_manager.hpp>
|
||||
|
||||
@@ -311,11 +311,15 @@ EXPORT_MODULE namespace hex {
|
||||
}
|
||||
|
||||
[[nodiscard]] bool isUnlockable() const {
|
||||
return std::all_of(this->parents.begin(), this->parents.end(), [](auto &parent) { return parent->achievement->isUnlocked(); });
|
||||
return std::ranges::all_of(this->parents, [](const auto &parent) {
|
||||
return parent->achievement->isUnlocked();
|
||||
});
|
||||
}
|
||||
|
||||
[[nodiscard]] bool isVisible() const {
|
||||
return std::all_of(this->visibilityParents.begin(), this->visibilityParents.end(), [](auto &parent) { return parent->achievement->isUnlocked(); });
|
||||
return std::ranges::all_of(this->visibilityParents, [](const auto &parent) {
|
||||
return parent->achievement->isUnlocked();
|
||||
});
|
||||
}
|
||||
|
||||
[[nodiscard]] bool isUnlocked() const {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,22 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <functional>
|
||||
#include <hex/api/localization_manager.hpp>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
/* Background Service Registry. Allows adding new background services */
|
||||
namespace ContentRegistry::BackgroundServices {
|
||||
|
||||
namespace impl {
|
||||
using Callback = std::function<void()>;
|
||||
|
||||
void stopServices();
|
||||
}
|
||||
|
||||
void registerService(const UnlocalizedString &unlocalizedString, const impl::Callback &callback);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <hex/api/localization_manager.hpp>
|
||||
|
||||
#include <string>
|
||||
#include <functional>
|
||||
#include <optional>
|
||||
#include <vector>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
/* Command Palette Command Registry. Allows adding of new commands to the command palette */
|
||||
namespace ContentRegistry::CommandPalette {
|
||||
|
||||
enum class Type : u32 {
|
||||
SymbolCommand,
|
||||
KeywordCommand
|
||||
};
|
||||
|
||||
namespace impl {
|
||||
|
||||
using QueryResultCallback = std::function<void(std::string)>;
|
||||
|
||||
struct QueryResult {
|
||||
std::string name;
|
||||
QueryResultCallback callback;
|
||||
};
|
||||
|
||||
using ContentDisplayCallback = std::function<void()>;
|
||||
using DisplayCallback = std::function<std::string(std::string)>;
|
||||
using ExecuteCallback = std::function<std::optional<std::string>(std::string)>;
|
||||
using QueryCallback = std::function<std::vector<QueryResult>(std::string)>;
|
||||
|
||||
struct Entry {
|
||||
Type type;
|
||||
std::string command;
|
||||
UnlocalizedString unlocalizedDescription;
|
||||
DisplayCallback displayCallback;
|
||||
ExecuteCallback executeCallback;
|
||||
};
|
||||
|
||||
struct Handler {
|
||||
Type type;
|
||||
std::string command;
|
||||
QueryCallback queryCallback;
|
||||
DisplayCallback displayCallback;
|
||||
};
|
||||
|
||||
struct ContentDisplay {
|
||||
bool showSearchBox;
|
||||
ContentDisplayCallback callback;
|
||||
};
|
||||
|
||||
const std::vector<Entry>& getEntries();
|
||||
const std::vector<Handler>& getHandlers();
|
||||
|
||||
std::optional<ContentDisplay>& getDisplayedContent();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds a new command to the command palette
|
||||
* @param type The type of the command
|
||||
* @param command The command to add
|
||||
* @param unlocalizedDescription The description of the command
|
||||
* @param displayCallback The callback that will be called when the command is displayed in the command palette
|
||||
* @param executeCallback The callback that will be called when the command is executed
|
||||
*/
|
||||
void add(
|
||||
Type type,
|
||||
const std::string &command,
|
||||
const UnlocalizedString &unlocalizedDescription,
|
||||
const impl::DisplayCallback &displayCallback,
|
||||
const impl::ExecuteCallback &executeCallback = [](auto) { return std::nullopt; });
|
||||
|
||||
/**
|
||||
* @brief Adds a new command handler to the command palette
|
||||
* @param type The type of the command
|
||||
* @param command The command to add
|
||||
* @param queryCallback The callback that will be called when the command palette wants to load the name and callback items
|
||||
* @param displayCallback The callback that will be called when the command is displayed in the command palette
|
||||
*/
|
||||
void addHandler(
|
||||
Type type,
|
||||
const std::string &command,
|
||||
const impl::QueryCallback &queryCallback,
|
||||
const impl::DisplayCallback &displayCallback);
|
||||
|
||||
/**
|
||||
* @brief Specify UI content that will be displayed inside the command palette
|
||||
* @param displayCallback Display callback that will be called to display the content
|
||||
*/
|
||||
void setDisplayedContent(const impl::ContentDisplayCallback &displayCallback);
|
||||
|
||||
/**
|
||||
* @brief Opens the command palette window, displaying a user defined interface
|
||||
* @param displayCallback Display callback that will be called to display the content
|
||||
*/
|
||||
void openWithContent(const impl::ContentDisplayCallback &displayCallback);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <nlohmann/json_fwd.hpp>
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
/* Network Communication Interface Registry. Allows adding new communication interface endpoints */
|
||||
namespace ContentRegistry::CommunicationInterface {
|
||||
|
||||
namespace impl {
|
||||
using NetworkCallback = std::function<nlohmann::json(const nlohmann::json &)>;
|
||||
|
||||
const std::map<std::string, NetworkCallback>& getNetworkEndpoints();
|
||||
}
|
||||
|
||||
void registerNetworkEndpoint(const std::string &endpoint, const impl::NetworkCallback &callback);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <hex/api/localization_manager.hpp>
|
||||
|
||||
#include <string>
|
||||
#include <functional>
|
||||
#include <vector>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
#if !defined(HEX_MODULE_EXPORT)
|
||||
namespace prv { class Provider; }
|
||||
#endif
|
||||
|
||||
/* Data Formatter Registry. Allows adding formatters that are used in the Copy-As menu for example */
|
||||
namespace ContentRegistry::DataFormatter {
|
||||
|
||||
namespace impl {
|
||||
|
||||
using Callback = std::function<std::string(prv::Provider *provider, u64 address, size_t size, bool preview)>;
|
||||
struct ExportMenuEntry {
|
||||
UnlocalizedString unlocalizedName;
|
||||
Callback callback;
|
||||
};
|
||||
|
||||
struct FindOccurrence {
|
||||
Region region;
|
||||
std::endian endian = std::endian::native;
|
||||
enum class DecodeType : u8 { ASCII, UTF8, Binary, UTF16, Unsigned, Signed, Float, Double } decodeType;
|
||||
bool selected;
|
||||
std::string string;
|
||||
};
|
||||
|
||||
using FindExporterCallback = std::function<std::vector<u8>(const std::vector<FindOccurrence>&, std::function<std::string(FindOccurrence)>)>;
|
||||
struct FindExporterEntry {
|
||||
UnlocalizedString unlocalizedName;
|
||||
std::string fileExtension;
|
||||
FindExporterCallback callback;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Retrieves a list of all registered data formatters used by the 'File -> Export' menu
|
||||
*/
|
||||
const std::vector<ExportMenuEntry>& getExportMenuEntries();
|
||||
|
||||
/**
|
||||
* @brief Retrieves a list of all registered data formatters used in the Results section of the 'Find' view
|
||||
*/
|
||||
const std::vector<FindExporterEntry>& getFindExporterEntries();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Adds a new data formatter
|
||||
* @param unlocalizedName The unlocalized name of the formatter
|
||||
* @param callback The function to call to format the data
|
||||
*/
|
||||
void addExportMenuEntry(const UnlocalizedString &unlocalizedName, const impl::Callback &callback);
|
||||
|
||||
/**
|
||||
* @brief Adds a new data exporter for Find results
|
||||
* @param unlocalizedName The unlocalized name of the formatter
|
||||
* @param fileExtension The file extension to use for the exported file
|
||||
* @param callback The function to call to format the data
|
||||
*/
|
||||
void addFindExportFormatter(const UnlocalizedString &unlocalizedName, const std::string &fileExtension, const impl::FindExporterCallback &callback);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <hex/api/task_manager.hpp>
|
||||
#include <hex/api/localization_manager.hpp>
|
||||
|
||||
#include <nlohmann/json_fwd.hpp>
|
||||
|
||||
#include <atomic>
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
#if !defined(HEX_MODULE_EXPORT)
|
||||
namespace prv { class Provider; }
|
||||
#endif
|
||||
|
||||
/* Data Information Registry. Allows adding new analyzers to the data information view */
|
||||
namespace ContentRegistry::DataInformation {
|
||||
|
||||
class InformationSection {
|
||||
public:
|
||||
InformationSection(const UnlocalizedString &unlocalizedName, const UnlocalizedString &unlocalizedDescription = "", bool hasSettings = false)
|
||||
: m_unlocalizedName(unlocalizedName), m_unlocalizedDescription(unlocalizedDescription),
|
||||
m_hasSettings(hasSettings) { }
|
||||
virtual ~InformationSection() = default;
|
||||
|
||||
[[nodiscard]] const UnlocalizedString& getUnlocalizedName() const { return m_unlocalizedName; }
|
||||
[[nodiscard]] const UnlocalizedString& getUnlocalizedDescription() const { return m_unlocalizedDescription; }
|
||||
|
||||
virtual void process(Task &task, prv::Provider *provider, Region region) = 0;
|
||||
virtual void reset() = 0;
|
||||
|
||||
virtual void drawSettings() { }
|
||||
virtual void drawContent() = 0;
|
||||
|
||||
[[nodiscard]] bool isValid() const { return m_valid; }
|
||||
void markValid(bool valid = true) { m_valid = valid; }
|
||||
|
||||
[[nodiscard]] bool isEnabled() const { return m_enabled; }
|
||||
void setEnabled(bool enabled) { m_enabled = enabled; }
|
||||
|
||||
[[nodiscard]] bool isAnalyzing() const { return m_analyzing; }
|
||||
void setAnalyzing(bool analyzing) { m_analyzing = analyzing; }
|
||||
|
||||
virtual void load(const nlohmann::json &data);
|
||||
[[nodiscard]] virtual nlohmann::json store();
|
||||
|
||||
[[nodiscard]] bool hasSettings() const { return m_hasSettings; }
|
||||
|
||||
private:
|
||||
UnlocalizedString m_unlocalizedName, m_unlocalizedDescription;
|
||||
bool m_hasSettings;
|
||||
|
||||
std::atomic<bool> m_analyzing = false;
|
||||
std::atomic<bool> m_valid = false;
|
||||
std::atomic<bool> m_enabled = true;
|
||||
};
|
||||
|
||||
namespace impl {
|
||||
|
||||
using CreateCallback = std::function<std::unique_ptr<InformationSection>()>;
|
||||
|
||||
const std::vector<CreateCallback>& getInformationSectionConstructors();
|
||||
void addInformationSectionCreator(const CreateCallback &callback);
|
||||
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void addInformationSection(auto && ...args) {
|
||||
impl::addInformationSectionCreator([args...] {
|
||||
return std::make_unique<T>(std::forward<decltype(args)>(args)...);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <hex/api/localization_manager.hpp>
|
||||
|
||||
#include <functional>
|
||||
#include <optional>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
/* Data Inspector Registry. Allows adding of new types to the data inspector */
|
||||
namespace ContentRegistry::DataInspector {
|
||||
|
||||
enum class NumberDisplayStyle : u8 {
|
||||
Decimal,
|
||||
Hexadecimal,
|
||||
Octal
|
||||
};
|
||||
|
||||
namespace impl {
|
||||
|
||||
using DisplayFunction = std::function<std::string()>;
|
||||
using EditingFunction = std::function<std::vector<u8>(std::string, std::endian)>;
|
||||
using GeneratorFunction = std::function<DisplayFunction(const std::vector<u8> &, std::endian, NumberDisplayStyle)>;
|
||||
|
||||
struct Entry {
|
||||
UnlocalizedString unlocalizedName;
|
||||
size_t requiredSize;
|
||||
size_t maxSize;
|
||||
GeneratorFunction generatorFunction;
|
||||
std::optional<EditingFunction> editingFunction;
|
||||
};
|
||||
|
||||
const std::vector<Entry>& getEntries();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds a new entry to the data inspector
|
||||
* @param unlocalizedName The unlocalized name of the entry
|
||||
* @param requiredSize The minimum required number of bytes available for the entry to appear
|
||||
* @param displayGeneratorFunction The function that will be called to generate the display function
|
||||
* @param editingFunction The function that will be called to edit the data
|
||||
*/
|
||||
void add(
|
||||
const UnlocalizedString &unlocalizedName,
|
||||
size_t requiredSize,
|
||||
impl::GeneratorFunction displayGeneratorFunction,
|
||||
std::optional<impl::EditingFunction> editingFunction = std::nullopt
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Adds a new entry to the data inspector
|
||||
* @param unlocalizedName The unlocalized name of the entry
|
||||
* @param requiredSize The minimum required number of bytes available for the entry to appear
|
||||
* @param maxSize The maximum number of bytes to read from the data
|
||||
* @param displayGeneratorFunction The function that will be called to generate the display function
|
||||
* @param editingFunction The function that will be called to edit the data
|
||||
*/
|
||||
void add(
|
||||
const UnlocalizedString &unlocalizedName,
|
||||
size_t requiredSize,
|
||||
size_t maxSize,
|
||||
impl::GeneratorFunction displayGeneratorFunction,
|
||||
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);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <hex/api/localization_manager.hpp>
|
||||
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
#if !defined(HEX_MODULE_EXPORT)
|
||||
namespace dp { class Node; }
|
||||
#endif
|
||||
|
||||
/* Data Processor Node Registry. Allows adding new processor nodes to be used in the data processor */
|
||||
namespace ContentRegistry::DataProcessor {
|
||||
|
||||
namespace impl {
|
||||
|
||||
using CreatorFunction = std::function<std::unique_ptr<dp::Node>()>;
|
||||
|
||||
struct Entry {
|
||||
UnlocalizedString unlocalizedCategory;
|
||||
UnlocalizedString unlocalizedName;
|
||||
CreatorFunction creatorFunction;
|
||||
};
|
||||
|
||||
void add(const Entry &entry);
|
||||
|
||||
const std::vector<Entry>& getEntries();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Adds a new node to the data processor
|
||||
* @tparam T The custom node class that extends dp::Node
|
||||
* @tparam Args Arguments types
|
||||
* @param unlocalizedCategory The unlocalized category name of the node
|
||||
* @param unlocalizedName The unlocalized name of the node
|
||||
* @param args Arguments passed to the constructor of the node
|
||||
*/
|
||||
template<std::derived_from<dp::Node> T, typename... Args>
|
||||
void add(const UnlocalizedString &unlocalizedCategory, const UnlocalizedString &unlocalizedName, Args &&...args) {
|
||||
add(impl::Entry {
|
||||
unlocalizedCategory,
|
||||
unlocalizedName,
|
||||
[unlocalizedName, ...args = std::forward<Args>(args)]() mutable {
|
||||
auto node = std::make_unique<T>(std::forward<Args>(args)...);
|
||||
node->setUnlocalizedName(unlocalizedName);
|
||||
return node;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds a separator to the data processor right click menu
|
||||
*/
|
||||
void addSeparator();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
68
lib/libimhex/include/hex/api/content_registry/diffing.hpp
Normal file
68
lib/libimhex/include/hex/api/content_registry/diffing.hpp
Normal file
@@ -0,0 +1,68 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <hex/api/localization_manager.hpp>
|
||||
#include <wolv/container/interval_tree.hpp>
|
||||
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
#if !defined(HEX_MODULE_EXPORT)
|
||||
namespace prv { class Provider; }
|
||||
#endif
|
||||
|
||||
/* Diffing Registry. Allows adding new diffing algorithms */
|
||||
namespace ContentRegistry::Diffing {
|
||||
|
||||
enum class DifferenceType : u8 {
|
||||
Match = 0,
|
||||
Insertion = 1,
|
||||
Deletion = 2,
|
||||
Mismatch = 3
|
||||
};
|
||||
|
||||
using DiffTree = wolv::container::IntervalTree<DifferenceType>;
|
||||
|
||||
class Algorithm {
|
||||
public:
|
||||
explicit Algorithm(UnlocalizedString unlocalizedName, UnlocalizedString unlocalizedDescription)
|
||||
: m_unlocalizedName(std::move(unlocalizedName)),
|
||||
m_unlocalizedDescription(std::move(unlocalizedDescription)) { }
|
||||
|
||||
virtual ~Algorithm() = default;
|
||||
|
||||
virtual std::vector<DiffTree> analyze(prv::Provider *providerA, prv::Provider *providerB) const = 0;
|
||||
virtual void drawSettings() { }
|
||||
|
||||
const UnlocalizedString& getUnlocalizedName() const { return m_unlocalizedName; }
|
||||
const UnlocalizedString& getUnlocalizedDescription() const { return m_unlocalizedDescription; }
|
||||
|
||||
private:
|
||||
UnlocalizedString m_unlocalizedName, m_unlocalizedDescription;
|
||||
};
|
||||
|
||||
namespace impl {
|
||||
|
||||
const std::vector<std::unique_ptr<Algorithm>>& getAlgorithms();
|
||||
|
||||
void addAlgorithm(std::unique_ptr<Algorithm> &&hash);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds a new hash
|
||||
* @tparam T The hash type that extends hex::Hash
|
||||
* @param args The arguments to pass to the constructor of the hash
|
||||
*/
|
||||
template<typename T, typename ... Args>
|
||||
void addAlgorithm(Args && ... args) {
|
||||
impl::addAlgorithm(std::make_unique<T>(std::forward<Args>(args)...));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <hex/api/localization_manager.hpp>
|
||||
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <functional>
|
||||
#include <optional>
|
||||
#include <span>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
/* Disassembler Registry. Allows adding new disassembler architectures */
|
||||
namespace ContentRegistry::Disassemblers {
|
||||
|
||||
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...);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <hex/api/localization_manager.hpp>
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
/* Experiments Registry. Allows adding new experiments */
|
||||
namespace ContentRegistry::Experiments {
|
||||
|
||||
namespace impl {
|
||||
|
||||
struct Experiment {
|
||||
UnlocalizedString unlocalizedName, unlocalizedDescription;
|
||||
bool enabled;
|
||||
};
|
||||
|
||||
const std::map<std::string, Experiment>& getExperiments();
|
||||
}
|
||||
|
||||
void addExperiment(
|
||||
const std::string &experimentName,
|
||||
const UnlocalizedString &unlocalizedName,
|
||||
const UnlocalizedString &unlocalizedDescription = ""
|
||||
);
|
||||
|
||||
void enableExperiement(const std::string &experimentName, bool enabled);
|
||||
|
||||
[[nodiscard]] bool isExperimentEnabled(const std::string &experimentName);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <hex/helpers/fs.hpp>
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <functional>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
/* File Handler Registry. Allows adding handlers for opening files specific file types */
|
||||
namespace ContentRegistry::FileTypeHandler {
|
||||
|
||||
namespace impl {
|
||||
|
||||
using Callback = std::function<bool(std::fs::path)>;
|
||||
struct Entry {
|
||||
std::vector<std::string> extensions;
|
||||
Callback callback;
|
||||
};
|
||||
|
||||
const std::vector<Entry>& getEntries();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds a new file handler
|
||||
* @param extensions The file extensions to handle
|
||||
* @param callback The function to call to handle the file
|
||||
*/
|
||||
void add(const std::vector<std::string> &extensions, const impl::Callback &callback);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
91
lib/libimhex/include/hex/api/content_registry/hashes.hpp
Normal file
91
lib/libimhex/include/hex/api/content_registry/hashes.hpp
Normal file
@@ -0,0 +1,91 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <hex/api/localization_manager.hpp>
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <memory>
|
||||
#include <functional>
|
||||
|
||||
#include <nlohmann/json_fwd.hpp>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
#if !defined(HEX_MODULE_EXPORT)
|
||||
namespace prv { class Provider; }
|
||||
#endif
|
||||
|
||||
/* Hash Registry. Allows adding new hashes to the Hash view */
|
||||
namespace ContentRegistry::Hashes {
|
||||
|
||||
class Hash {
|
||||
public:
|
||||
explicit Hash(UnlocalizedString unlocalizedName) : m_unlocalizedName(std::move(unlocalizedName)) {}
|
||||
virtual ~Hash() = default;
|
||||
|
||||
class Function {
|
||||
public:
|
||||
using Callback = std::function<std::vector<u8>(const Region&, prv::Provider *)>;
|
||||
|
||||
Function(Hash *type, std::string name, Callback callback)
|
||||
: m_type(type), m_name(std::move(name)), m_callback(std::move(callback)) {
|
||||
|
||||
}
|
||||
|
||||
[[nodiscard]] Hash *getType() { return m_type; }
|
||||
[[nodiscard]] const Hash *getType() const { return m_type; }
|
||||
[[nodiscard]] const std::string& getName() const { return m_name; }
|
||||
|
||||
std::vector<u8> get(const Region& region, prv::Provider *provider) const {
|
||||
return m_callback(region, provider);
|
||||
}
|
||||
|
||||
private:
|
||||
Hash *m_type;
|
||||
std::string m_name;
|
||||
Callback m_callback;
|
||||
};
|
||||
|
||||
virtual void draw() { }
|
||||
[[nodiscard]] virtual Function create(std::string name) = 0;
|
||||
|
||||
[[nodiscard]] virtual nlohmann::json store() const = 0;
|
||||
virtual void load(const nlohmann::json &json) = 0;
|
||||
|
||||
[[nodiscard]] const UnlocalizedString& getUnlocalizedName() const {
|
||||
return m_unlocalizedName;
|
||||
}
|
||||
|
||||
protected:
|
||||
[[nodiscard]] Function create(const std::string &name, const Function::Callback &callback) {
|
||||
return { this, name, callback };
|
||||
}
|
||||
|
||||
private:
|
||||
UnlocalizedString m_unlocalizedName;
|
||||
};
|
||||
|
||||
namespace impl {
|
||||
|
||||
const std::vector<std::unique_ptr<Hash>>& getHashes();
|
||||
|
||||
void add(std::unique_ptr<Hash> &&hash);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Adds a new hash
|
||||
* @tparam T The hash type that extends hex::Hash
|
||||
* @param args The arguments to pass to the constructor of the hash
|
||||
*/
|
||||
template<typename T, typename ... Args>
|
||||
void add(Args && ... args) {
|
||||
impl::add(std::make_unique<T>(std::forward<Args>(args)...));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
91
lib/libimhex/include/hex/api/content_registry/hex_editor.hpp
Normal file
91
lib/libimhex/include/hex/api/content_registry/hex_editor.hpp
Normal file
@@ -0,0 +1,91 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <imgui.h>
|
||||
|
||||
#include <hex/api/localization_manager.hpp>
|
||||
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <span>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
/* Hex Editor Registry. Allows adding new functionality to the hex editor */
|
||||
namespace ContentRegistry::HexEditor {
|
||||
|
||||
class DataVisualizer {
|
||||
public:
|
||||
DataVisualizer(UnlocalizedString unlocalizedName, u16 bytesPerCell, u16 maxCharsPerCell)
|
||||
: m_unlocalizedName(std::move(unlocalizedName)),
|
||||
m_bytesPerCell(bytesPerCell),
|
||||
m_maxCharsPerCell(maxCharsPerCell) { }
|
||||
|
||||
virtual ~DataVisualizer() = default;
|
||||
|
||||
virtual void draw(u64 address, const u8 *data, size_t size, bool upperCase) = 0;
|
||||
virtual bool drawEditing(u64 address, u8 *data, size_t size, bool upperCase, bool startedEditing) = 0;
|
||||
|
||||
[[nodiscard]] u16 getBytesPerCell() const { return m_bytesPerCell; }
|
||||
[[nodiscard]] u16 getMaxCharsPerCell() const { return m_maxCharsPerCell; }
|
||||
|
||||
[[nodiscard]] const UnlocalizedString& getUnlocalizedName() const { return m_unlocalizedName; }
|
||||
|
||||
[[nodiscard]] static int DefaultTextInputFlags();
|
||||
|
||||
protected:
|
||||
bool drawDefaultScalarEditingTextBox(u64 address, const char *format, ImGuiDataType dataType, u8 *data, ImGuiInputTextFlags flags) const;
|
||||
bool drawDefaultTextEditingTextBox(u64 address, std::string &data, ImGuiInputTextFlags flags) const;
|
||||
|
||||
private:
|
||||
UnlocalizedString m_unlocalizedName;
|
||||
u16 m_bytesPerCell;
|
||||
u16 m_maxCharsPerCell;
|
||||
};
|
||||
|
||||
struct MiniMapVisualizer {
|
||||
using Callback = std::function<void(u64, std::span<const u8>, std::vector<ImColor>&)>;
|
||||
|
||||
UnlocalizedString unlocalizedName;
|
||||
Callback callback;
|
||||
};
|
||||
|
||||
namespace impl {
|
||||
|
||||
void addDataVisualizer(std::shared_ptr<DataVisualizer> &&visualizer);
|
||||
|
||||
const std::vector<std::shared_ptr<DataVisualizer>>& getVisualizers();
|
||||
const std::vector<std::shared_ptr<MiniMapVisualizer>>& getMiniMapVisualizers();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds a new cell data visualizer
|
||||
* @tparam T The data visualizer type that extends hex::DataVisualizer
|
||||
* @param args The arguments to pass to the constructor of the data visualizer
|
||||
*/
|
||||
template<std::derived_from<DataVisualizer> T, typename... Args>
|
||||
void addDataVisualizer(Args &&...args) {
|
||||
return impl::addDataVisualizer(std::make_shared<T>(std::forward<Args>(args)...));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets a data visualizer by its unlocalized name
|
||||
* @param unlocalizedName Unlocalized name of the data visualizer
|
||||
* @return The data visualizer, or nullptr if it doesn't exist
|
||||
*/
|
||||
std::shared_ptr<DataVisualizer> getVisualizerByName(const UnlocalizedString &unlocalizedName);
|
||||
|
||||
/**
|
||||
* @brief Adds a new minimap visualizer
|
||||
* @param unlocalizedName Unlocalized name of the minimap visualizer
|
||||
* @param callback The callback that will be called to get the color of a line
|
||||
*/
|
||||
void addMiniMapVisualizer(UnlocalizedString unlocalizedName, MiniMapVisualizer::Callback callback);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,155 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <pl/pattern_language.hpp>
|
||||
|
||||
#include <functional>
|
||||
#include <span>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <mutex>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
#if !defined(HEX_MODULE_EXPORT)
|
||||
namespace prv { class Provider; }
|
||||
#endif
|
||||
|
||||
/* Pattern Language Function Registry. Allows adding of new functions that may be used inside the pattern language */
|
||||
namespace ContentRegistry::PatternLanguage {
|
||||
|
||||
namespace impl {
|
||||
|
||||
using VisualizerFunctionCallback = std::function<void(pl::ptrn::Pattern&, bool, std::span<const pl::core::Token::Literal>)>;
|
||||
|
||||
struct FunctionDefinition {
|
||||
pl::api::Namespace ns;
|
||||
std::string name;
|
||||
|
||||
pl::api::FunctionParameterCount parameterCount;
|
||||
pl::api::FunctionCallback callback;
|
||||
|
||||
bool dangerous;
|
||||
};
|
||||
|
||||
struct TypeDefinition {
|
||||
pl::api::Namespace ns;
|
||||
std::string name;
|
||||
|
||||
pl::api::FunctionParameterCount parameterCount;
|
||||
pl::api::TypeCallback callback;
|
||||
};
|
||||
|
||||
struct Visualizer {
|
||||
pl::api::FunctionParameterCount parameterCount;
|
||||
VisualizerFunctionCallback callback;
|
||||
};
|
||||
|
||||
const std::map<std::string, Visualizer>& getVisualizers();
|
||||
const std::map<std::string, Visualizer>& getInlineVisualizers();
|
||||
const std::map<std::string, pl::api::PragmaHandler>& getPragmas();
|
||||
const std::vector<FunctionDefinition>& getFunctions();
|
||||
const std::vector<TypeDefinition>& getTypes();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Provides access to the current provider's pattern language runtime
|
||||
* @return Runtime
|
||||
*/
|
||||
pl::PatternLanguage& getRuntime();
|
||||
|
||||
/**
|
||||
* @brief Provides access to the current provider's pattern language runtime's lock
|
||||
* @return Lock
|
||||
*/
|
||||
std::mutex& getRuntimeLock();
|
||||
|
||||
/**
|
||||
* @brief Configures the pattern language runtime using ImHex's default settings
|
||||
* @param runtime The pattern language runtime to configure
|
||||
* @param provider The provider to use for data access
|
||||
*/
|
||||
void configureRuntime(pl::PatternLanguage &runtime, prv::Provider *provider);
|
||||
|
||||
/**
|
||||
* @brief Adds a new pragma to the pattern language
|
||||
* @param name The name of the pragma
|
||||
* @param handler The handler that will be called when the pragma is encountered
|
||||
*/
|
||||
void addPragma(const std::string &name, const pl::api::PragmaHandler &handler);
|
||||
|
||||
/**
|
||||
* @brief Adds a new function to the pattern language
|
||||
* @param ns The namespace of the function
|
||||
* @param name The name of the function
|
||||
* @param parameterCount The amount of parameters the function takes
|
||||
* @param func The function callback
|
||||
*/
|
||||
void addFunction(
|
||||
const pl::api::Namespace &ns,
|
||||
const std::string &name,
|
||||
pl::api::FunctionParameterCount parameterCount,
|
||||
const pl::api::FunctionCallback &func
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Adds a new dangerous function to the pattern language
|
||||
* @note Dangerous functions are functions that require the user to explicitly allow them to be used
|
||||
* @param ns The namespace of the function
|
||||
* @param name The name of the function
|
||||
* @param parameterCount The amount of parameters the function takes
|
||||
* @param func The function callback
|
||||
*/
|
||||
void addDangerousFunction(
|
||||
const pl::api::Namespace &ns,
|
||||
const std::string &name,
|
||||
pl::api::FunctionParameterCount parameterCount,
|
||||
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
|
||||
* @note Visualizers are extensions to the [[hex::visualize]] attribute, used to visualize data
|
||||
* @param name The name of the visualizer
|
||||
* @param function The function callback
|
||||
* @param parameterCount The amount of parameters the function takes
|
||||
*/
|
||||
void addVisualizer(
|
||||
const std::string &name,
|
||||
const impl::VisualizerFunctionCallback &function,
|
||||
pl::api::FunctionParameterCount parameterCount
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Adds a new inline visualizer to the pattern language
|
||||
* @note Inline visualizers are extensions to the [[hex::inline_visualize]] attribute, used to visualize data
|
||||
* @param name The name of the visualizer
|
||||
* @param function The function callback
|
||||
* @param parameterCount The amount of parameters the function takes
|
||||
*/
|
||||
void addInlineVisualizer(
|
||||
const std::string &name,
|
||||
const impl::VisualizerFunctionCallback &function,
|
||||
pl::api::FunctionParameterCount parameterCount
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
54
lib/libimhex/include/hex/api/content_registry/provider.hpp
Normal file
54
lib/libimhex/include/hex/api/content_registry/provider.hpp
Normal file
@@ -0,0 +1,54 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <hex/api/localization_manager.hpp>
|
||||
#include <hex/providers/provider.hpp>
|
||||
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
/* Provider Registry. Allows adding new data providers to be created from the UI */
|
||||
namespace ContentRegistry::Provider {
|
||||
|
||||
namespace impl {
|
||||
|
||||
void addProviderName(const UnlocalizedString &unlocalizedName, const char *icon);
|
||||
|
||||
using ProviderCreationFunction = std::function<std::shared_ptr<prv::Provider>()>;
|
||||
void add(const std::string &typeName, ProviderCreationFunction creationFunction);
|
||||
|
||||
struct Entry {
|
||||
UnlocalizedString unlocalizedName;
|
||||
const char *icon;
|
||||
};
|
||||
|
||||
const std::vector<Entry>& getEntries();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds a new provider to the list of providers
|
||||
* @tparam T The provider type that extends hex::prv::Provider
|
||||
* @param addToList Whether to display the provider in the Other Providers list in the welcome screen and File menu
|
||||
*/
|
||||
template<std::derived_from<prv::Provider> T>
|
||||
void add(bool addToList = true) {
|
||||
const T provider;
|
||||
auto typeName = provider.getTypeName();
|
||||
|
||||
impl::add(typeName, []() -> std::unique_ptr<prv::Provider> {
|
||||
return std::make_unique<T>();
|
||||
});
|
||||
|
||||
if (addToList)
|
||||
impl::addProviderName(typeName, provider.getIcon());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
34
lib/libimhex/include/hex/api/content_registry/reports.hpp
Normal file
34
lib/libimhex/include/hex/api/content_registry/reports.hpp
Normal file
@@ -0,0 +1,34 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <functional>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
#if !defined(HEX_MODULE_EXPORT)
|
||||
namespace prv { class Provider; }
|
||||
#endif
|
||||
|
||||
/* Reports Registry. Allows adding new sections to exported reports */
|
||||
namespace ContentRegistry::Reports {
|
||||
|
||||
namespace impl {
|
||||
|
||||
using Callback = std::function<std::string(prv::Provider*)>;
|
||||
|
||||
struct ReportGenerator {
|
||||
Callback callback;
|
||||
};
|
||||
|
||||
const std::vector<ReportGenerator>& getGenerators();
|
||||
|
||||
}
|
||||
|
||||
void addReportProvider(impl::Callback callback);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
345
lib/libimhex/include/hex/api/content_registry/settings.hpp
Normal file
345
lib/libimhex/include/hex/api/content_registry/settings.hpp
Normal file
@@ -0,0 +1,345 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <hex/api/localization_manager.hpp>
|
||||
#include <hex/helpers/fs.hpp>
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
#include <functional>
|
||||
#include <optional>
|
||||
|
||||
#include <nlohmann/json.hpp>
|
||||
#include <imgui.h>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
/* Settings Registry. Allows adding of new entries into the ImHex preferences window. */
|
||||
namespace ContentRegistry::Settings {
|
||||
|
||||
namespace Widgets {
|
||||
|
||||
class Widget {
|
||||
public:
|
||||
virtual ~Widget() = default;
|
||||
|
||||
virtual bool draw(const std::string &name) = 0;
|
||||
|
||||
virtual void load(const nlohmann::json &data) = 0;
|
||||
virtual nlohmann::json store() = 0;
|
||||
|
||||
class Interface {
|
||||
public:
|
||||
friend class Widget;
|
||||
|
||||
Interface& requiresRestart() {
|
||||
m_requiresRestart = true;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
Interface& setEnabledCallback(std::function<bool()> callback) {
|
||||
m_enabledCallback = std::move(callback);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
Interface& setChangedCallback(std::function<void(Widget&)> callback) {
|
||||
m_changedCallback = std::move(callback);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
Interface& setTooltip(const std::string &tooltip) {
|
||||
m_tooltip = tooltip;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
Widget& getWidget() const {
|
||||
return *m_widget;
|
||||
}
|
||||
|
||||
private:
|
||||
explicit Interface(Widget *widget) : m_widget(widget) {}
|
||||
Widget *m_widget;
|
||||
|
||||
bool m_requiresRestart = false;
|
||||
std::function<bool()> m_enabledCallback;
|
||||
std::function<void(Widget&)> m_changedCallback;
|
||||
std::optional<UnlocalizedString> m_tooltip;
|
||||
};
|
||||
|
||||
[[nodiscard]]
|
||||
bool doesRequireRestart() const {
|
||||
return m_interface.m_requiresRestart;
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
bool isEnabled() const {
|
||||
return !m_interface.m_enabledCallback || m_interface.m_enabledCallback();
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
const std::optional<UnlocalizedString>& getTooltip() const {
|
||||
return m_interface.m_tooltip;
|
||||
}
|
||||
|
||||
void onChanged() {
|
||||
if (m_interface.m_changedCallback)
|
||||
m_interface.m_changedCallback(*this);
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
Interface& getInterface() {
|
||||
return m_interface;
|
||||
}
|
||||
|
||||
private:
|
||||
Interface m_interface = Interface(this);
|
||||
};
|
||||
|
||||
class Checkbox : public Widget {
|
||||
public:
|
||||
explicit Checkbox(bool defaultValue) : m_value(defaultValue) { }
|
||||
|
||||
bool draw(const std::string &name) override;
|
||||
|
||||
void load(const nlohmann::json &data) override;
|
||||
nlohmann::json store() override;
|
||||
|
||||
[[nodiscard]] bool isChecked() const { return m_value; }
|
||||
|
||||
protected:
|
||||
bool m_value;
|
||||
};
|
||||
|
||||
class SliderInteger : public Widget {
|
||||
public:
|
||||
SliderInteger(i32 defaultValue, i32 min, i32 max) : m_value(defaultValue), m_min(min), m_max(max) { }
|
||||
bool draw(const std::string &name) override;
|
||||
|
||||
void load(const nlohmann::json &data) override;
|
||||
nlohmann::json store() override;
|
||||
|
||||
[[nodiscard]] i32 getValue() const { return m_value; }
|
||||
|
||||
protected:
|
||||
int m_value;
|
||||
i32 m_min, m_max;
|
||||
};
|
||||
|
||||
class SliderFloat : public Widget {
|
||||
public:
|
||||
SliderFloat(float defaultValue, float min, float max) : m_value(defaultValue), m_min(min), m_max(max) { }
|
||||
bool draw(const std::string &name) override;
|
||||
|
||||
void load(const nlohmann::json &data) override;
|
||||
nlohmann::json store() override;
|
||||
|
||||
[[nodiscard]] float getValue() const { return m_value; }
|
||||
|
||||
protected:
|
||||
float m_value;
|
||||
float m_min, m_max;
|
||||
};
|
||||
|
||||
class SliderDataSize : public Widget {
|
||||
public:
|
||||
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;
|
||||
|
||||
void load(const nlohmann::json &data) override;
|
||||
nlohmann::json store() override;
|
||||
|
||||
[[nodiscard]] i32 getValue() const { return m_value; }
|
||||
|
||||
protected:
|
||||
u64 m_value;
|
||||
u64 m_min, m_max;
|
||||
u64 m_stepSize;
|
||||
};
|
||||
|
||||
class ColorPicker : public Widget {
|
||||
public:
|
||||
explicit ColorPicker(ImColor defaultColor, ImGuiColorEditFlags flags = 0);
|
||||
|
||||
bool draw(const std::string &name) override;
|
||||
|
||||
void load(const nlohmann::json &data) override;
|
||||
nlohmann::json store() override;
|
||||
|
||||
[[nodiscard]] ImColor getColor() const;
|
||||
|
||||
protected:
|
||||
std::array<float, 4> m_value = {}, m_defaultValue = {};
|
||||
ImGuiColorEditFlags m_flags;
|
||||
};
|
||||
|
||||
class DropDown : public Widget {
|
||||
public:
|
||||
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;
|
||||
|
||||
void load(const nlohmann::json &data) override;
|
||||
nlohmann::json store() override;
|
||||
|
||||
[[nodiscard]]
|
||||
const nlohmann::json& getValue() const;
|
||||
|
||||
protected:
|
||||
std::vector<UnlocalizedString> m_items;
|
||||
std::vector<nlohmann::json> m_settingsValues;
|
||||
nlohmann::json m_defaultItem;
|
||||
|
||||
int m_value = -1;
|
||||
};
|
||||
|
||||
class TextBox : public Widget {
|
||||
public:
|
||||
explicit TextBox(std::string defaultValue) : m_value(std::move(defaultValue)) { }
|
||||
|
||||
bool draw(const std::string &name) override;
|
||||
|
||||
void load(const nlohmann::json &data) override;
|
||||
nlohmann::json store() override;
|
||||
|
||||
[[nodiscard]]
|
||||
const std::string& getValue() const { return m_value; }
|
||||
|
||||
protected:
|
||||
std::string m_value;
|
||||
};
|
||||
|
||||
class FilePicker : public Widget {
|
||||
public:
|
||||
bool draw(const std::string &name) override;
|
||||
|
||||
void load(const nlohmann::json &data) override;
|
||||
nlohmann::json store() override;
|
||||
|
||||
[[nodiscard]] const std::fs::path& getPath() const {
|
||||
return m_path;
|
||||
}
|
||||
|
||||
protected:
|
||||
std::fs::path m_path;
|
||||
};
|
||||
|
||||
class Label : public Widget {
|
||||
public:
|
||||
bool draw(const std::string &name) override;
|
||||
|
||||
void load(const nlohmann::json &) override {}
|
||||
nlohmann::json store() override { return {}; }
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
namespace impl {
|
||||
|
||||
struct Entry {
|
||||
UnlocalizedString unlocalizedName;
|
||||
std::unique_ptr<Widgets::Widget> widget;
|
||||
};
|
||||
|
||||
struct SubCategory {
|
||||
UnlocalizedString unlocalizedName;
|
||||
std::vector<Entry> entries;
|
||||
};
|
||||
|
||||
struct Category {
|
||||
UnlocalizedString unlocalizedName;
|
||||
UnlocalizedString unlocalizedDescription;
|
||||
std::vector<SubCategory> subCategories;
|
||||
};
|
||||
|
||||
void load();
|
||||
void store();
|
||||
void clear();
|
||||
|
||||
const std::vector<Category>& getSettings();
|
||||
nlohmann::json& getSetting(const UnlocalizedString &unlocalizedCategory, const UnlocalizedString &unlocalizedName, const nlohmann::json &defaultValue);
|
||||
const nlohmann::json& getSettingsData();
|
||||
|
||||
Widgets::Widget* add(const UnlocalizedString &unlocalizedCategory, const UnlocalizedString &unlocalizedSubCategory, const UnlocalizedString &unlocalizedName, std::unique_ptr<Widgets::Widget> &&widget);
|
||||
|
||||
void printSettingReadError(const UnlocalizedString &unlocalizedCategory, const UnlocalizedString &unlocalizedName, const nlohmann::json::exception &e);
|
||||
|
||||
void runOnChangeHandlers(const UnlocalizedString &unlocalizedCategory, const UnlocalizedString &unlocalizedName, const nlohmann::json &value);
|
||||
}
|
||||
|
||||
template<std::derived_from<Widgets::Widget> T>
|
||||
Widgets::Widget::Interface& add(const UnlocalizedString &unlocalizedCategory, const UnlocalizedString &unlocalizedSubCategory, const UnlocalizedString &unlocalizedName, auto && ... args) {
|
||||
return impl::add(
|
||||
unlocalizedCategory,
|
||||
unlocalizedSubCategory,
|
||||
unlocalizedName,
|
||||
std::make_unique<T>(std::forward<decltype(args)>(args)...)
|
||||
)->getInterface();
|
||||
}
|
||||
|
||||
void setCategoryDescription(const UnlocalizedString &unlocalizedCategory, const UnlocalizedString &unlocalizedDescription);
|
||||
|
||||
class SettingsValue {
|
||||
public:
|
||||
SettingsValue(nlohmann::json value) : m_value(std::move(value)) {}
|
||||
|
||||
template<typename T>
|
||||
T get(std::common_type_t<T> defaultValue) const {
|
||||
try {
|
||||
auto result = m_value;
|
||||
if (result.is_number() && std::same_as<T, bool>)
|
||||
result = m_value.get<int>() != 0;
|
||||
if (m_value.is_null())
|
||||
result = defaultValue;
|
||||
|
||||
return result.get<T>();
|
||||
} catch (const nlohmann::json::exception &) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
private:
|
||||
nlohmann::json m_value;
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
[[nodiscard]] T read(const UnlocalizedString &unlocalizedCategory, const UnlocalizedString &unlocalizedName, const std::common_type_t<T> &defaultValue) {
|
||||
auto setting = impl::getSetting(unlocalizedCategory, unlocalizedName, defaultValue);
|
||||
|
||||
try {
|
||||
if (setting.is_number() && std::same_as<T, bool>)
|
||||
setting = setting.template get<int>() != 0;
|
||||
if (setting.is_null())
|
||||
setting = defaultValue;
|
||||
|
||||
return setting.template get<T>();
|
||||
} catch (const nlohmann::json::exception &e) {
|
||||
impl::printSettingReadError(unlocalizedCategory, unlocalizedName, e);
|
||||
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void write(const UnlocalizedString &unlocalizedCategory, const UnlocalizedString &unlocalizedName, const std::common_type_t<T> &value) {
|
||||
impl::getSetting(unlocalizedCategory, unlocalizedName, value) = value;
|
||||
impl::runOnChangeHandlers(unlocalizedCategory, unlocalizedName, value);
|
||||
|
||||
impl::store();
|
||||
}
|
||||
|
||||
using OnChangeCallback = std::function<void(const SettingsValue &)>;
|
||||
u64 onChange(const UnlocalizedString &unlocalizedCategory, const UnlocalizedString &unlocalizedName, const OnChangeCallback &callback);
|
||||
|
||||
using OnSaveCallback = std::function<void()>;
|
||||
u64 onSave(const OnSaveCallback &callback);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
37
lib/libimhex/include/hex/api/content_registry/tools.hpp
Normal file
37
lib/libimhex/include/hex/api/content_registry/tools.hpp
Normal file
@@ -0,0 +1,37 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <hex/api/localization_manager.hpp>
|
||||
|
||||
#include <functional>
|
||||
#include <vector>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
/* Tools Registry. Allows adding new entries to the tools window */
|
||||
namespace ContentRegistry::Tools {
|
||||
|
||||
namespace impl {
|
||||
|
||||
using Callback = std::function<void()>;
|
||||
|
||||
struct Entry {
|
||||
UnlocalizedString unlocalizedName;
|
||||
const char *icon;
|
||||
Callback function;
|
||||
};
|
||||
|
||||
const std::vector<Entry>& getEntries();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds a new tool to the tools window
|
||||
* @param unlocalizedName The unlocalized name of the tool
|
||||
* @param function The function that will be called to draw the tool
|
||||
*/
|
||||
void add(const UnlocalizedString &unlocalizedName, const char *icon, const impl::Callback &function);
|
||||
}
|
||||
|
||||
}
|
||||
291
lib/libimhex/include/hex/api/content_registry/user_interface.hpp
Normal file
291
lib/libimhex/include/hex/api/content_registry/user_interface.hpp
Normal file
@@ -0,0 +1,291 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <hex/api/shortcut_manager.hpp>
|
||||
#include <hex/ui/imgui_imhex_extensions.h>
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <functional>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
/* User Interface Registry. Allows adding new items to various interfaces */
|
||||
namespace ContentRegistry::UserInterface {
|
||||
|
||||
struct Icon {
|
||||
Icon(const char *glyph, ImGuiCustomCol color = ImGuiCustomCol(0x00)) : glyph(glyph), color(color) {}
|
||||
|
||||
std::string glyph;
|
||||
ImGuiCustomCol color;
|
||||
};
|
||||
|
||||
namespace impl {
|
||||
|
||||
using DrawCallback = std::function<void()>;
|
||||
using MenuCallback = std::function<void()>;
|
||||
using EnabledCallback = std::function<bool()>;
|
||||
using SelectedCallback = std::function<bool()>;
|
||||
using ClickCallback = std::function<void()>;
|
||||
using ToggleCallback = std::function<void(bool)>;
|
||||
|
||||
struct MainMenuItem {
|
||||
UnlocalizedString unlocalizedName;
|
||||
};
|
||||
|
||||
struct MenuItem {
|
||||
std::vector<UnlocalizedString> unlocalizedNames;
|
||||
Icon icon;
|
||||
Shortcut shortcut;
|
||||
View *view;
|
||||
MenuCallback callback;
|
||||
EnabledCallback enabledCallback;
|
||||
SelectedCallback selectedCallback;
|
||||
i32 toolbarIndex;
|
||||
};
|
||||
|
||||
struct SidebarItem {
|
||||
std::string icon;
|
||||
DrawCallback callback;
|
||||
EnabledCallback enabledCallback;
|
||||
};
|
||||
|
||||
struct TitleBarButton {
|
||||
std::string icon;
|
||||
ImGuiCustomCol color;
|
||||
UnlocalizedString unlocalizedTooltip;
|
||||
ClickCallback callback;
|
||||
};
|
||||
|
||||
struct WelcomeScreenQuickSettingsToggle {
|
||||
std::string onIcon, offIcon;
|
||||
UnlocalizedString unlocalizedTooltip;
|
||||
ToggleCallback callback;
|
||||
mutable bool state;
|
||||
};
|
||||
|
||||
constexpr static auto SeparatorValue = "$SEPARATOR$";
|
||||
constexpr static auto SubMenuValue = "$SUBMENU$";
|
||||
|
||||
const std::multimap<u32, MainMenuItem>& getMainMenuItems();
|
||||
|
||||
const std::multimap<u32, MenuItem>& getMenuItems();
|
||||
const std::vector<MenuItem*>& getToolbarMenuItems();
|
||||
std::multimap<u32, MenuItem>& getMenuItemsMutable();
|
||||
|
||||
const std::vector<DrawCallback>& getWelcomeScreenEntries();
|
||||
const std::vector<DrawCallback>& getFooterItems();
|
||||
const std::vector<DrawCallback>& getToolbarItems();
|
||||
const std::vector<SidebarItem>& getSidebarItems();
|
||||
const std::vector<TitleBarButton>& getTitlebarButtons();
|
||||
const std::vector<WelcomeScreenQuickSettingsToggle>& getWelcomeScreenQuickSettingsToggles();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds a new top-level main menu entry
|
||||
* @param unlocalizedName The unlocalized name of the entry
|
||||
* @param priority The priority of the entry. Lower values are displayed first
|
||||
*/
|
||||
void registerMainMenuItem(const UnlocalizedString &unlocalizedName, u32 priority);
|
||||
|
||||
/**
|
||||
* @brief Adds a new main menu entry
|
||||
* @param unlocalizedMainMenuNames The unlocalized names of the main menu entries
|
||||
* @param icon The icon to use for the entry
|
||||
* @param priority The priority of the entry. Lower values are displayed first
|
||||
* @param shortcut The shortcut to use for the entry
|
||||
* @param function The function to call when the entry is clicked
|
||||
* @param enabledCallback The function to call to determine if the entry is enabled
|
||||
* @param view The view to use for the entry. If nullptr, the shortcut will work globally
|
||||
*/
|
||||
void addMenuItem(
|
||||
const std::vector<UnlocalizedString> &unlocalizedMainMenuNames,
|
||||
const Icon &icon,
|
||||
u32 priority,
|
||||
const Shortcut &shortcut,
|
||||
const impl::MenuCallback &function,
|
||||
const impl::EnabledCallback& enabledCallback, View *view
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Adds a new main menu entry
|
||||
* @param unlocalizedMainMenuNames The unlocalized names of the main menu entries
|
||||
* @param icon The icon to use for the entry
|
||||
* @param priority The priority of the entry. Lower values are displayed first
|
||||
* @param shortcut The shortcut to use for the entry
|
||||
* @param function The function to call when the entry is clicked
|
||||
* @param enabledCallback The function to call to determine if the entry is enabled
|
||||
* @param selectedCallback The function to call to determine if the entry is selected
|
||||
* @param view The view to use for the entry. If nullptr, the shortcut will work globally
|
||||
*/
|
||||
void addMenuItem(
|
||||
const std::vector<UnlocalizedString> &unlocalizedMainMenuNames,
|
||||
const Icon &icon,
|
||||
u32 priority,
|
||||
Shortcut shortcut,
|
||||
const impl::MenuCallback &function,
|
||||
const impl::EnabledCallback& enabledCallback = []{ return true; },
|
||||
const impl::SelectedCallback &selectedCallback = []{ return false; },
|
||||
View *view = nullptr
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Adds a new main menu entry
|
||||
* @param unlocalizedMainMenuNames The unlocalized names of the main menu entries
|
||||
* @param priority The priority of the entry. Lower values are displayed first
|
||||
* @param shortcut The shortcut to use for the entry
|
||||
* @param function The function to call when the entry is clicked
|
||||
* @param enabledCallback The function to call to determine if the entry is enabled
|
||||
* @param selectedCallback The function to call to determine if the entry is selected
|
||||
* @param view The view to use for the entry. If nullptr, the shortcut will work globally
|
||||
*/
|
||||
void addMenuItem(
|
||||
const std::vector<UnlocalizedString> &unlocalizedMainMenuNames,
|
||||
u32 priority,
|
||||
const Shortcut &shortcut,
|
||||
const impl::MenuCallback &function,
|
||||
const impl::EnabledCallback& enabledCallback = []{ return true; },
|
||||
const impl::SelectedCallback &selectedCallback = []{ return false; },
|
||||
View *view = nullptr
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Adds a new main menu sub-menu entry
|
||||
* @param unlocalizedMainMenuNames The unlocalized names of the main menu entries
|
||||
* @param priority The priority of the entry. Lower values are displayed first
|
||||
* @param function The function to call when the entry is clicked
|
||||
* @param enabledCallback The function to call to determine if the entry is enabled
|
||||
* @param view The view to use for the entry. If nullptr, the item will always be visible
|
||||
* @param showOnWelcomeScreen If this entry should be shown on the welcome screen
|
||||
*/
|
||||
void addMenuItemSubMenu(
|
||||
std::vector<UnlocalizedString> unlocalizedMainMenuNames,
|
||||
u32 priority,
|
||||
const impl::MenuCallback &function,
|
||||
const impl::EnabledCallback& enabledCallback = []{ return true; },
|
||||
View *view = nullptr,
|
||||
bool showOnWelcomeScreen = false
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Adds a new main menu sub-menu entry
|
||||
* @param unlocalizedMainMenuNames The unlocalized names of the main menu entries
|
||||
* @param icon The icon to use for the entry
|
||||
* @param priority The priority of the entry. Lower values are displayed first
|
||||
* @param function The function to call when the entry is clicked
|
||||
* @param enabledCallback The function to call to determine if the entry is enabled
|
||||
* @param view The view to use for the entry. If nullptr, the item will always be visible
|
||||
* @param showOnWelcomeScreen If this entry should be shown on the welcome screen
|
||||
*/
|
||||
void addMenuItemSubMenu(
|
||||
std::vector<UnlocalizedString> unlocalizedMainMenuNames,
|
||||
const char *icon,
|
||||
u32 priority,
|
||||
const impl::MenuCallback &function,
|
||||
const impl::EnabledCallback& enabledCallback = []{ return true; },
|
||||
View *view = nullptr,
|
||||
bool showOnWelcomeScreen = false
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Adds a new main menu separator
|
||||
* @param unlocalizedMainMenuNames The unlocalized names of the main menu entries
|
||||
* @param priority The priority of the entry. Lower values are displayed first
|
||||
* @param view The view to use for the entry. If nullptr, the item will always be visible
|
||||
*/
|
||||
void addMenuItemSeparator(std::vector<UnlocalizedString> unlocalizedMainMenuNames, u32 priority, View *view = nullptr);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Adds a new welcome screen entry
|
||||
* @param function The function to call to draw the entry
|
||||
*/
|
||||
void addWelcomeScreenEntry(const impl::DrawCallback &function);
|
||||
|
||||
/**
|
||||
* @brief Adds a new footer item
|
||||
* @param function The function to call to draw the item
|
||||
*/
|
||||
void addFooterItem(const impl::DrawCallback &function);
|
||||
|
||||
/**
|
||||
* @brief Adds a new toolbar item
|
||||
* @param function The function to call to draw the item
|
||||
*/
|
||||
void addToolbarItem(const impl::DrawCallback &function);
|
||||
|
||||
/**
|
||||
* @brief Adds a menu item to the toolbar
|
||||
* @param unlocalizedName Unlocalized name of the menu item
|
||||
* @param color Color of the toolbar icon
|
||||
*/
|
||||
void addMenuItemToToolbar(const UnlocalizedString &unlocalizedName, ImGuiCustomCol color);
|
||||
|
||||
/**
|
||||
* @brief Reconstructs the toolbar items list after they have been modified
|
||||
*/
|
||||
void updateToolbarItems();
|
||||
|
||||
/**
|
||||
* @brief Adds a new sidebar item
|
||||
* @param icon The icon to use for the item
|
||||
* @param function The function to call to draw the item
|
||||
* @param enabledCallback The function
|
||||
*/
|
||||
void addSidebarItem(
|
||||
const std::string &icon,
|
||||
const impl::DrawCallback &function,
|
||||
const impl::EnabledCallback &enabledCallback = []{ return true; }
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Adds a new title bar button
|
||||
* @param icon The icon to use for the button
|
||||
* @param color The color of the icon
|
||||
* @param unlocalizedTooltip The unlocalized tooltip to use for the button
|
||||
* @param function The function to call when the button is clicked
|
||||
*/
|
||||
void addTitleBarButton(
|
||||
const std::string &icon,
|
||||
ImGuiCustomCol color,
|
||||
const UnlocalizedString &unlocalizedTooltip,
|
||||
const impl::ClickCallback &function
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Adds a new welcome screen quick settings toggle
|
||||
* @param icon The icon to use for the button
|
||||
* @param unlocalizedTooltip The unlocalized tooltip to use for the button
|
||||
* @param defaultState The default state of the toggle
|
||||
* @param function The function to call when the button is clicked
|
||||
*/
|
||||
void addWelcomeScreenQuickSettingsToggle(
|
||||
const std::string &icon,
|
||||
const UnlocalizedString &unlocalizedTooltip,
|
||||
bool defaultState,
|
||||
const impl::ToggleCallback &function
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Adds a new welcome screen quick settings toggle
|
||||
* @param onIcon The icon to use for the button when it's on
|
||||
* @param offIcon The icon to use for the button when it's off
|
||||
* @param unlocalizedTooltip The unlocalized tooltip to use for the button
|
||||
* @param defaultState The default state of the toggle
|
||||
* @param function The function to call when the button is clicked
|
||||
*/
|
||||
void addWelcomeScreenQuickSettingsToggle(
|
||||
const std::string &onIcon,
|
||||
const std::string &offIcon,
|
||||
const UnlocalizedString &unlocalizedTooltip,
|
||||
bool defaultState,
|
||||
const impl::ToggleCallback &function
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
63
lib/libimhex/include/hex/api/content_registry/views.hpp
Normal file
63
lib/libimhex/include/hex/api/content_registry/views.hpp
Normal file
@@ -0,0 +1,63 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <hex/api/localization_manager.hpp>
|
||||
#include <hex/ui/view.hpp>
|
||||
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <functional>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
/* View Registry. Allows adding of new windows */
|
||||
namespace ContentRegistry::Views {
|
||||
|
||||
namespace impl {
|
||||
|
||||
void add(std::unique_ptr<View> &&view);
|
||||
void setFullScreenView(std::unique_ptr<View> &&view);
|
||||
|
||||
const std::map<UnlocalizedString, std::unique_ptr<View>>& getEntries();
|
||||
const std::unique_ptr<View>& getFullScreenView();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds a new view to ImHex
|
||||
* @tparam T The custom view class that extends View
|
||||
* @tparam Args Arguments types
|
||||
* @param args Arguments passed to the constructor of the view
|
||||
*/
|
||||
template<std::derived_from<View> T, typename... Args>
|
||||
void add(Args &&...args) {
|
||||
return impl::add(std::make_unique<T>(std::forward<Args>(args)...));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets a view as a full-screen view. This will cause the view to take up the entire ImHex window
|
||||
* @tparam T The custom view class that extends View
|
||||
* @tparam Args Arguments types
|
||||
* @param args Arguments passed to the constructor of the view
|
||||
*/
|
||||
template<std::derived_from<View> T, typename... Args>
|
||||
void setFullScreenView(Args &&...args) {
|
||||
return impl::setFullScreenView(std::make_unique<T>(std::forward<Args>(args)...));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets a view by its unlocalized name
|
||||
* @param unlocalizedName The unlocalized name of the view
|
||||
* @return The view if it exists, nullptr otherwise
|
||||
*/
|
||||
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();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -9,7 +9,6 @@
|
||||
#include <map>
|
||||
#include <string_view>
|
||||
|
||||
#include <hex/api/imhex_api.hpp>
|
||||
#include <hex/helpers/logger.hpp>
|
||||
|
||||
#include <wolv/types/type_name.hpp>
|
||||
@@ -90,13 +89,17 @@ EXPORT_MODULE namespace hex {
|
||||
explicit Event(Callback func) noexcept : m_func(std::move(func)) { }
|
||||
|
||||
template<typename E>
|
||||
void call(Params... params) const {
|
||||
try {
|
||||
m_func(params...);
|
||||
} catch (const std::exception &e) {
|
||||
log::error("An exception occurred while handling event {}: {}", wolv::type::getTypeName<E>(), e.what());
|
||||
throw;
|
||||
}
|
||||
void call(auto&& ... params) const {
|
||||
#if defined(DEBUG)
|
||||
m_func(std::forward<decltype(params)>(params)...);
|
||||
#else
|
||||
try {
|
||||
m_func(std::forward<decltype(params)>(params)...);
|
||||
} catch (const std::exception &e) {
|
||||
log::error("An exception occurred while handling event {}: {}", wolv::type::getTypeName<E>(), e.what());
|
||||
throw;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -125,8 +128,8 @@ EXPORT_MODULE namespace hex {
|
||||
* @return Token to unsubscribe from the event
|
||||
*/
|
||||
template<impl::EventType E>
|
||||
static EventList::iterator subscribe(typename E::Callback function) {
|
||||
std::scoped_lock lock(getEventMutex());
|
||||
static EventList::iterator subscribe(E::Callback function) {
|
||||
std::lock_guard lock(getEventMutex());
|
||||
|
||||
auto &events = getEvents();
|
||||
return events.insert({ E::Id, std::make_unique<E>(function) });
|
||||
@@ -139,15 +142,15 @@ EXPORT_MODULE namespace hex {
|
||||
* @param function Function to call when the event is posted
|
||||
*/
|
||||
template<impl::EventType E>
|
||||
static void subscribe(void *token, typename E::Callback function) {
|
||||
std::scoped_lock lock(getEventMutex());
|
||||
static void subscribe(void *token, E::Callback function) {
|
||||
std::lock_guard lock(getEventMutex());
|
||||
|
||||
if (isAlreadyRegistered(token, E::Id)) {
|
||||
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>(std::move(function)) });
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -155,7 +158,7 @@ EXPORT_MODULE namespace hex {
|
||||
* @param token Token returned by subscribe
|
||||
*/
|
||||
static void unsubscribe(const EventList::iterator &token) noexcept {
|
||||
std::scoped_lock lock(getEventMutex());
|
||||
std::lock_guard lock(getEventMutex());
|
||||
|
||||
getEvents().erase(token);
|
||||
}
|
||||
@@ -167,7 +170,7 @@ EXPORT_MODULE namespace hex {
|
||||
*/
|
||||
template<impl::EventType E>
|
||||
static void unsubscribe(void *token) noexcept {
|
||||
std::scoped_lock lock(getEventMutex());
|
||||
std::lock_guard lock(getEventMutex());
|
||||
|
||||
unsubscribe(token, E::Id);
|
||||
}
|
||||
@@ -179,9 +182,9 @@ EXPORT_MODULE namespace hex {
|
||||
*/
|
||||
template<impl::EventType E>
|
||||
static void post(auto && ...args) {
|
||||
std::scoped_lock lock(getEventMutex());
|
||||
std::lock_guard lock(getEventMutex());
|
||||
|
||||
auto [begin, end] = getEvents().equal_range(E::Id);
|
||||
const auto &[begin, end] = getEvents().equal_range(E::Id);
|
||||
for (auto it = begin; it != end; ++it) {
|
||||
const auto &[id, event] = *it;
|
||||
(*static_cast<E *const>(event.get())).template call<E>(std::forward<decltype(args)>(args)...);
|
||||
@@ -197,7 +200,7 @@ EXPORT_MODULE namespace hex {
|
||||
* @brief Unsubscribe all subscribers from all events
|
||||
*/
|
||||
static void clear() noexcept {
|
||||
std::scoped_lock lock(getEventMutex());
|
||||
std::lock_guard lock(getEventMutex());
|
||||
|
||||
getEvents().clear();
|
||||
getTokenStore().clear();
|
||||
|
||||
@@ -4,17 +4,15 @@
|
||||
|
||||
/* Forward declarations */
|
||||
struct GLFWwindow;
|
||||
using ImGuiID = unsigned int;
|
||||
namespace hex { class View; }
|
||||
|
||||
/* GUI events definitions */
|
||||
namespace hex {
|
||||
|
||||
/**
|
||||
* @brief Signals a newly opened window
|
||||
* @brief Signals a newly opened view
|
||||
*
|
||||
* 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.
|
||||
* This event is sent when the view has just been opened by the Window manager.
|
||||
*
|
||||
* FIXME: This is currently only used for the introduction tutorial.
|
||||
* If the event's only purpose is this, maybe rename it?
|
||||
@@ -23,6 +21,15 @@ namespace hex {
|
||||
*/
|
||||
EVENT_DEF(EventViewOpened, View*);
|
||||
|
||||
/**
|
||||
* @brief Signals a newly closed view
|
||||
*
|
||||
* This event is sent when the view has just been closed.
|
||||
*
|
||||
* @param view the closed view reference
|
||||
*/
|
||||
EVENT_DEF(EventViewClosed, View*);
|
||||
|
||||
/**
|
||||
* @brief Signals a change in the DPI scale.
|
||||
*
|
||||
@@ -54,15 +61,6 @@ namespace hex {
|
||||
*/
|
||||
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
|
||||
*
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex/api/imhex_api/bookmarks.hpp>
|
||||
#include <hex/api/imhex_api/hex_editor.hpp>
|
||||
#include <hex/api/event_manager.hpp>
|
||||
#include <hex/helpers/patches.hpp>
|
||||
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex/api/event_manager.hpp>
|
||||
#include <hex/helpers/semantic_version.hpp>
|
||||
|
||||
struct ImGuiTestEngine;
|
||||
|
||||
/* Lifecycle events definitions */
|
||||
namespace hex {
|
||||
@@ -10,6 +13,13 @@ namespace hex {
|
||||
*/
|
||||
EVENT_DEF(EventImHexStartupFinished);
|
||||
|
||||
/**
|
||||
* @brief Called when the user presses the close button on the main window
|
||||
*
|
||||
* This is currently only used and implemented on macOS
|
||||
*/
|
||||
EVENT_DEF(EventCloseButtonPressed);
|
||||
|
||||
/**
|
||||
* @brief Called when ImHex is closing, to trigger the last shutdown hooks
|
||||
*
|
||||
@@ -69,10 +79,21 @@ namespace hex {
|
||||
*/
|
||||
EVENT_DEF(EventProjectOpened);
|
||||
|
||||
/**
|
||||
* @brief Called when a project is saved/saved as
|
||||
*/
|
||||
EVENT_DEF(EventProjectSaved);
|
||||
|
||||
/**
|
||||
* @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>);
|
||||
|
||||
/**
|
||||
* @brief Called when ImGui is initialized to register tests
|
||||
* @param testEngine Pointer to the ImGui Test Engine Context
|
||||
*/
|
||||
EVENT_DEF(EventRegisterImGuiTests, ImGuiTestEngine*);
|
||||
|
||||
}
|
||||
@@ -5,12 +5,17 @@
|
||||
|
||||
/* Provider events definitions */
|
||||
namespace hex {
|
||||
|
||||
namespace prv {
|
||||
class Provider;
|
||||
}
|
||||
|
||||
/**
|
||||
* @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(EventProviderCreated, std::shared_ptr<prv::Provider>);
|
||||
|
||||
/**
|
||||
* @brief Called as a continuation of EventProviderCreated
|
||||
|
||||
@@ -34,4 +34,11 @@ namespace hex {
|
||||
*/
|
||||
EVENT_DEF(RequestOpenPopup, std::string);
|
||||
|
||||
/**
|
||||
* @brief Requests updating of the active post-processing shader
|
||||
*
|
||||
* @param vertexShader the vertex shader source code
|
||||
* @param fragmentShader the fragment shader source code
|
||||
*/
|
||||
EVENT_DEF(RequestSetPostProcessingShader, std::string, std::string);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
#include <hex/api/imhex_api/hex_editor.hpp>
|
||||
#include <hex/api/event_manager.hpp>
|
||||
|
||||
/* Forward declarations */
|
||||
@@ -70,32 +71,8 @@ namespace hex {
|
||||
/**
|
||||
* @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);
|
||||
EVENT_DEF(RequestTriggerPatternEvaluation);
|
||||
|
||||
/**
|
||||
* @brief Requests ImHex to open and process a file
|
||||
@@ -113,4 +90,9 @@ namespace hex {
|
||||
*/
|
||||
EVENT_DEF(RequestAddVirtualFile, std::fs::path, std::vector<u8>, Region);
|
||||
|
||||
/**
|
||||
* @brief Requests the command palette to be opened
|
||||
*/
|
||||
EVENT_DEF(RequestOpenCommandPalette);
|
||||
|
||||
}
|
||||
|
||||
@@ -56,17 +56,6 @@ namespace hex {
|
||||
*/
|
||||
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
|
||||
*
|
||||
|
||||
@@ -8,7 +8,12 @@ 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 **);
|
||||
EVENT_DEF(RequestCreateProvider, std::string, bool, bool, std::shared_ptr<hex::prv::Provider> *);
|
||||
|
||||
/**
|
||||
* @brief Used internally when opening a provider through the API
|
||||
*/
|
||||
EVENT_DEF(RequestOpenProvider, std::shared_ptr<prv::Provider>);
|
||||
|
||||
/**
|
||||
* @brief Move the data from all PerProvider instances from one provider to another
|
||||
|
||||
@@ -1,790 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
#include <hex/api/localization_manager.hpp>
|
||||
#include <hex/helpers/semantic_version.hpp>
|
||||
#include <hex/helpers/utils.hpp>
|
||||
#include <hex/helpers/fs.hpp>
|
||||
|
||||
#include <functional>
|
||||
#include <optional>
|
||||
#include <span>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <memory>
|
||||
#include "imgui_internal.h"
|
||||
|
||||
#if !defined(HEX_MODULE_EXPORT)
|
||||
using ImGuiID = unsigned int;
|
||||
struct ImVec2;
|
||||
struct ImFontAtlas;
|
||||
struct ImFont;
|
||||
#endif
|
||||
struct GLFWwindow;
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
#if !defined(HEX_MODULE_EXPORT)
|
||||
namespace impl {
|
||||
class AutoResetBase;
|
||||
}
|
||||
|
||||
namespace prv {
|
||||
class Provider;
|
||||
}
|
||||
#endif
|
||||
|
||||
namespace ImHexApi {
|
||||
|
||||
/* Functions to query information from the Hex Editor and interact with it */
|
||||
namespace HexEditor {
|
||||
|
||||
using TooltipFunction = std::function<void(u64, const u8*, size_t)>;
|
||||
|
||||
class Highlighting {
|
||||
public:
|
||||
Highlighting() = default;
|
||||
Highlighting(Region region, color_t color);
|
||||
|
||||
[[nodiscard]] const Region& getRegion() const { return m_region; }
|
||||
[[nodiscard]] const color_t& getColor() const { return m_color; }
|
||||
|
||||
private:
|
||||
Region m_region = {};
|
||||
color_t m_color = 0x00;
|
||||
};
|
||||
|
||||
class Tooltip {
|
||||
public:
|
||||
Tooltip() = default;
|
||||
Tooltip(Region region, std::string value, color_t color);
|
||||
|
||||
[[nodiscard]] const Region& getRegion() const { return m_region; }
|
||||
[[nodiscard]] const color_t& getColor() const { return m_color; }
|
||||
[[nodiscard]] const std::string& getValue() const { return m_value; }
|
||||
|
||||
private:
|
||||
Region m_region = {};
|
||||
std::string m_value;
|
||||
color_t m_color = 0x00;
|
||||
};
|
||||
|
||||
struct ProviderRegion : Region {
|
||||
prv::Provider *provider;
|
||||
|
||||
[[nodiscard]] prv::Provider *getProvider() const { return this->provider; }
|
||||
|
||||
[[nodiscard]] Region getRegion() const { return { this->address, this->size }; }
|
||||
};
|
||||
|
||||
namespace impl {
|
||||
|
||||
using HighlightingFunction = std::function<std::optional<color_t>(u64, const u8*, size_t, bool)>;
|
||||
using HoveringFunction = std::function<std::set<Region>(const prv::Provider *, u64, size_t)>;
|
||||
|
||||
const std::map<u32, Highlighting>& getBackgroundHighlights();
|
||||
const std::map<u32, HighlightingFunction>& getBackgroundHighlightingFunctions();
|
||||
const std::map<u32, Highlighting>& getForegroundHighlights();
|
||||
const std::map<u32, HighlightingFunction>& getForegroundHighlightingFunctions();
|
||||
const std::map<u32, HoveringFunction>& getHoveringFunctions();
|
||||
const std::map<u32, Tooltip>& getTooltips();
|
||||
const std::map<u32, TooltipFunction>& getTooltipFunctions();
|
||||
|
||||
void setCurrentSelection(const std::optional<ProviderRegion> ®ion);
|
||||
void setHoveredRegion(const prv::Provider *provider, const Region ®ion);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds a background color highlighting to the Hex Editor
|
||||
* @param region The region to highlight
|
||||
* @param color The color to use for the highlighting
|
||||
* @return Unique ID used to remove the highlighting again later
|
||||
*/
|
||||
u32 addBackgroundHighlight(const Region ®ion, color_t color);
|
||||
|
||||
/**
|
||||
* @brief Removes a background color highlighting from the Hex Editor
|
||||
* @param id The ID of the highlighting to remove
|
||||
*/
|
||||
void removeBackgroundHighlight(u32 id);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Adds a foreground color highlighting to the Hex Editor
|
||||
* @param region The region to highlight
|
||||
* @param color The color to use for the highlighting
|
||||
* @return Unique ID used to remove the highlighting again later
|
||||
*/
|
||||
u32 addForegroundHighlight(const Region ®ion, color_t color);
|
||||
|
||||
/**
|
||||
* @brief Removes a foreground color highlighting from the Hex Editor
|
||||
* @param id The ID of the highlighting to remove
|
||||
*/
|
||||
void removeForegroundHighlight(u32 id);
|
||||
|
||||
/**
|
||||
* @brief Adds a hover tooltip to the Hex Editor
|
||||
* @param region The region to add the tooltip to
|
||||
* @param value Text to display in the tooltip
|
||||
* @param color The color of the tooltip
|
||||
* @return Unique ID used to remove the tooltip again later
|
||||
*/
|
||||
u32 addTooltip(Region region, std::string value, color_t color);
|
||||
|
||||
/**
|
||||
* @brief Removes a hover tooltip from the Hex Editor
|
||||
* @param id The ID of the tooltip to remove
|
||||
*/
|
||||
void removeTooltip(u32 id);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Adds a background color highlighting to the Hex Editor using a callback function
|
||||
* @param function Function that draws the highlighting based on the hovered region
|
||||
* @return Unique ID used to remove the highlighting again later
|
||||
*/
|
||||
u32 addTooltipProvider(TooltipFunction function);
|
||||
|
||||
/**
|
||||
* @brief Removes a background color highlighting from the Hex Editor
|
||||
* @param id The ID of the highlighting to remove
|
||||
*/
|
||||
void removeTooltipProvider(u32 id);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Adds a background color highlighting to the Hex Editor using a callback function
|
||||
* @param function Function that draws the highlighting based on the hovered region
|
||||
* @return Unique ID used to remove the highlighting again later
|
||||
*/
|
||||
u32 addBackgroundHighlightingProvider(const impl::HighlightingFunction &function);
|
||||
|
||||
/**
|
||||
* @brief Removes a background color highlighting from the Hex Editor
|
||||
* @param id The ID of the highlighting to remove
|
||||
*/
|
||||
void removeBackgroundHighlightingProvider(u32 id);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Adds a foreground color highlighting to the Hex Editor using a callback function
|
||||
* @param function Function that draws the highlighting based on the hovered region
|
||||
* @return Unique ID used to remove the highlighting again later
|
||||
*/
|
||||
u32 addForegroundHighlightingProvider(const impl::HighlightingFunction &function);
|
||||
|
||||
/**
|
||||
* @brief Removes a foreground color highlighting from the Hex Editor
|
||||
* @param id The ID of the highlighting to remove
|
||||
*/
|
||||
void removeForegroundHighlightingProvider(u32 id);
|
||||
|
||||
/**
|
||||
* @brief Adds a hovering provider to the Hex Editor using a callback function
|
||||
* @param function Function that draws the highlighting based on the hovered region
|
||||
* @return Unique ID used to remove the highlighting again later
|
||||
*/
|
||||
u32 addHoverHighlightProvider(const impl::HoveringFunction &function);
|
||||
|
||||
/**
|
||||
* @brief Removes a hovering color highlighting from the Hex Editor
|
||||
* @param id The ID of the highlighting to remove
|
||||
*/
|
||||
void removeHoverHighlightProvider(u32 id);
|
||||
|
||||
/**
|
||||
* @brief Checks if there's a valid selection in the Hex Editor right now
|
||||
*/
|
||||
bool isSelectionValid();
|
||||
|
||||
/**
|
||||
* @brief Clears the current selection in the Hex Editor
|
||||
*/
|
||||
void clearSelection();
|
||||
|
||||
/**
|
||||
* @brief Gets the current selection in the Hex Editor
|
||||
* @return The current selection
|
||||
*/
|
||||
std::optional<ProviderRegion> getSelection();
|
||||
|
||||
/**
|
||||
* @brief Sets the current selection in the Hex Editor
|
||||
* @param region The region to select
|
||||
* @param provider The provider to select the region in
|
||||
*/
|
||||
void setSelection(const Region ®ion, prv::Provider *provider = nullptr);
|
||||
|
||||
/**
|
||||
* @brief Sets the current selection in the Hex Editor
|
||||
* @param region The region to select
|
||||
*/
|
||||
void setSelection(const ProviderRegion ®ion);
|
||||
|
||||
/**
|
||||
* @brief Sets the current selection in the Hex Editor
|
||||
* @param address The address to select
|
||||
* @param size The size of the selection
|
||||
* @param provider The provider to select the region in
|
||||
*/
|
||||
void setSelection(u64 address, size_t size, prv::Provider *provider = nullptr);
|
||||
|
||||
/**
|
||||
* @brief Adds a virtual file to the list in the Hex Editor
|
||||
* @param path The path of the file
|
||||
* @param data The data of the file
|
||||
* @param region The location of the file in the Hex Editor if available
|
||||
*/
|
||||
void addVirtualFile(const std::fs::path &path, std::vector<u8> data, Region region = Region::Invalid());
|
||||
|
||||
/**
|
||||
* @brief Gets the currently hovered cell region in the Hex Editor
|
||||
* @return
|
||||
*/
|
||||
const std::optional<Region>& getHoveredRegion(const prv::Provider *provider);
|
||||
|
||||
}
|
||||
|
||||
/* Functions to interact with Bookmarks */
|
||||
namespace Bookmarks {
|
||||
|
||||
struct Entry {
|
||||
Region region;
|
||||
|
||||
std::string name;
|
||||
std::string comment;
|
||||
u32 color;
|
||||
bool locked;
|
||||
u64 id;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Adds a new bookmark
|
||||
* @param address The address of the bookmark
|
||||
* @param size The size of the bookmark
|
||||
* @param name The name of the bookmark
|
||||
* @param comment The comment of the bookmark
|
||||
* @param color The color of the bookmark or 0x00 for the default color
|
||||
* @return Bookmark ID
|
||||
*/
|
||||
u64 add(u64 address, size_t size, const std::string &name, const std::string &comment, color_t color = 0x00000000);
|
||||
|
||||
/**
|
||||
* @brief Adds a new bookmark
|
||||
* @param region The region of the bookmark
|
||||
* @param name The name of the bookmark
|
||||
* @param comment The comment of the bookmark
|
||||
* @param color The color of the bookmark or 0x00 for the default color
|
||||
* @return Bookmark ID
|
||||
*/
|
||||
u64 add(Region region, const std::string &name, const std::string &comment, color_t color = 0x00000000);
|
||||
|
||||
/**
|
||||
* @brief Removes a bookmark
|
||||
* @param id The ID of the bookmark to remove
|
||||
*/
|
||||
void remove(u64 id);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper methods about the providers
|
||||
* @note the "current provider" or "currently selected provider" refers to the currently selected provider in the UI;
|
||||
* the provider the user is actually editing.
|
||||
*/
|
||||
namespace Provider {
|
||||
|
||||
namespace impl {
|
||||
|
||||
void resetClosingProvider();
|
||||
std::set<prv::Provider*> getClosingProviders();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets the currently selected data provider
|
||||
* @return The currently selected data provider, or nullptr is there is none
|
||||
*/
|
||||
prv::Provider *get();
|
||||
|
||||
/**
|
||||
* @brief Gets a list of all currently loaded data providers
|
||||
* @return The currently loaded data providers
|
||||
*/
|
||||
std::vector<prv::Provider*> getProviders();
|
||||
|
||||
/**
|
||||
* @brief Sets the currently selected data provider
|
||||
* @param index Index of the provider to select
|
||||
*/
|
||||
void setCurrentProvider(i64 index);
|
||||
|
||||
/**
|
||||
* @brief Sets the currently selected data provider
|
||||
* @param provider The provider to select
|
||||
*/
|
||||
void setCurrentProvider(NonNull<prv::Provider*> provider);
|
||||
|
||||
/**
|
||||
* @brief Gets the index of the currently selected data provider
|
||||
* @return Index of the selected provider
|
||||
*/
|
||||
i64 getCurrentProviderIndex();
|
||||
|
||||
/**
|
||||
* @brief Checks whether the currently selected data provider is valid
|
||||
* @return Whether the currently selected data provider is valid
|
||||
*/
|
||||
bool isValid();
|
||||
|
||||
|
||||
/**
|
||||
* @brief Marks the **currently selected** data provider as dirty
|
||||
*/
|
||||
void markDirty();
|
||||
|
||||
/**
|
||||
* @brief Marks **all data providers** as clean
|
||||
*/
|
||||
void resetDirty();
|
||||
|
||||
/**
|
||||
* @brief Checks whether **any of the data providers** is dirty
|
||||
* @return Whether any data provider is dirty
|
||||
*/
|
||||
bool isDirty();
|
||||
|
||||
|
||||
/**
|
||||
* @brief Adds a newly created provider to the list of providers, and mark it as the selected one.
|
||||
* @param provider The provider to add
|
||||
* @param skipLoadInterface Whether to skip the provider's loading interface (see property documentation)
|
||||
* @param select Whether to select the provider after adding it
|
||||
*/
|
||||
void add(std::unique_ptr<prv::Provider> &&provider, bool skipLoadInterface = false, bool select = true);
|
||||
|
||||
/**
|
||||
* @brief Creates a new provider and adds it to the list of providers
|
||||
* @tparam T The type of the provider to create
|
||||
* @param args Arguments to pass to the provider's constructor
|
||||
*/
|
||||
template<std::derived_from<prv::Provider> T>
|
||||
void add(auto &&...args) {
|
||||
add(std::make_unique<T>(std::forward<decltype(args)>(args)...));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Removes a provider from the list of providers
|
||||
* @param provider The provider to remove
|
||||
* @param noQuestions Whether to skip asking the user for confirmation
|
||||
*/
|
||||
void remove(prv::Provider *provider, bool noQuestions = false);
|
||||
|
||||
/**
|
||||
* @brief Creates a new provider using its unlocalized name and add it to the list of providers
|
||||
* @param unlocalizedName The unlocalized name of the provider to create
|
||||
* @param skipLoadInterface Whether to skip the provider's loading interface (see property documentation)
|
||||
* @param select Whether to select the provider after adding it
|
||||
*/
|
||||
prv::Provider* createProvider(
|
||||
const UnlocalizedString &unlocalizedName,
|
||||
bool skipLoadInterface = false,
|
||||
bool select = true
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
/* Functions to interact with various ImHex system settings */
|
||||
namespace System {
|
||||
|
||||
struct ProgramArguments {
|
||||
int argc;
|
||||
char **argv;
|
||||
char **envp;
|
||||
};
|
||||
|
||||
struct InitialWindowProperties {
|
||||
i32 x, y;
|
||||
u32 width, height;
|
||||
bool maximized;
|
||||
};
|
||||
|
||||
enum class TaskProgressState {
|
||||
Reset,
|
||||
Progress,
|
||||
Flash
|
||||
};
|
||||
|
||||
enum class TaskProgressType {
|
||||
Normal,
|
||||
Warning,
|
||||
Error
|
||||
};
|
||||
|
||||
namespace impl {
|
||||
|
||||
void setMainInstanceStatus(bool status);
|
||||
|
||||
void setMainWindowPosition(i32 x, i32 y);
|
||||
void setMainWindowSize(u32 width, u32 height);
|
||||
void setMainDockSpaceId(ImGuiID id);
|
||||
void setMainWindowHandle(GLFWwindow *window);
|
||||
|
||||
void setGlobalScale(float scale);
|
||||
void setNativeScale(float scale);
|
||||
|
||||
void setBorderlessWindowMode(bool enabled);
|
||||
void setMultiWindowMode(bool enabled);
|
||||
void setInitialWindowProperties(InitialWindowProperties properties);
|
||||
|
||||
void setGPUVendor(const std::string &vendor);
|
||||
void setGLRenderer(const std::string &renderer);
|
||||
|
||||
void addInitArgument(const std::string &key, const std::string &value = { });
|
||||
|
||||
void setLastFrameTime(double time);
|
||||
|
||||
bool isWindowResizable();
|
||||
|
||||
void addAutoResetObject(hex::impl::AutoResetBase *object);
|
||||
void removeAutoResetObject(hex::impl::AutoResetBase *object);
|
||||
|
||||
void cleanup();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Closes ImHex
|
||||
* @param noQuestions Whether to skip asking the user for confirmation
|
||||
*/
|
||||
void closeImHex(bool noQuestions = false);
|
||||
|
||||
/**
|
||||
* @brief Restarts ImHex
|
||||
*/
|
||||
void restartImHex();
|
||||
|
||||
/**
|
||||
* @brief Sets the progress bar in the task bar
|
||||
* @param state The state of the progress bar
|
||||
* @param type The type of the progress bar progress
|
||||
* @param progress The progress of the progress bar
|
||||
*/
|
||||
void setTaskBarProgress(TaskProgressState state, TaskProgressType type, u32 progress);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Gets the current target FPS
|
||||
* @return The current target FPS
|
||||
*/
|
||||
float getTargetFPS();
|
||||
|
||||
/**
|
||||
* @brief Sets the target FPS
|
||||
* @param fps The target FPS
|
||||
*/
|
||||
void setTargetFPS(float fps);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Gets the current global scale
|
||||
* @return The current global scale
|
||||
*/
|
||||
float getGlobalScale();
|
||||
|
||||
/**
|
||||
* @brief Gets the current native scale
|
||||
* @return The current native scale
|
||||
*/
|
||||
float getNativeScale();
|
||||
|
||||
float getBackingScaleFactor();
|
||||
|
||||
/**
|
||||
* @brief Gets the current main window position
|
||||
* @return Position of the main window
|
||||
*/
|
||||
ImVec2 getMainWindowPosition();
|
||||
|
||||
/**
|
||||
* @brief Gets the current main window size
|
||||
* @return Size of the main window
|
||||
*/
|
||||
ImVec2 getMainWindowSize();
|
||||
|
||||
/**
|
||||
* @brief Gets the current main dock space ID
|
||||
* @return ID of the main dock space
|
||||
*/
|
||||
ImGuiID getMainDockSpaceId();
|
||||
|
||||
/**
|
||||
* @brief Gets the main window's GLFW window handle
|
||||
* @return GLFW window handle
|
||||
*/
|
||||
GLFWwindow* getMainWindowHandle();
|
||||
|
||||
/**
|
||||
* @brief Checks if borderless window mode is enabled currently
|
||||
* @return Whether borderless window mode is enabled
|
||||
*/
|
||||
bool isBorderlessWindowModeEnabled();
|
||||
|
||||
/**
|
||||
* @brief Checks if multi-window mode is enabled currently
|
||||
* @return Whether multi-window mode is enabled
|
||||
*/
|
||||
bool isMutliWindowModeEnabled();
|
||||
|
||||
/**
|
||||
* @brief Gets the init arguments passed to ImHex from the splash screen
|
||||
* @return Init arguments
|
||||
*/
|
||||
const std::map<std::string, std::string>& getInitArguments();
|
||||
|
||||
/**
|
||||
* @brief Gets a init arguments passed to ImHex from the splash screen
|
||||
* @param key The key of the init argument
|
||||
* @return Init argument
|
||||
*/
|
||||
std::string getInitArgument(const std::string &key);
|
||||
|
||||
/**
|
||||
* @brief Sets if ImHex should follow the system theme
|
||||
* @param enabled Whether to follow the system theme
|
||||
*/
|
||||
void enableSystemThemeDetection(bool enabled);
|
||||
|
||||
/**
|
||||
* @brief Checks if ImHex follows the system theme
|
||||
* @return Whether ImHex follows the system theme
|
||||
*/
|
||||
bool usesSystemThemeDetection();
|
||||
|
||||
|
||||
/**
|
||||
* @brief Gets the currently set additional folder paths
|
||||
* @return The currently set additional folder paths
|
||||
*/
|
||||
const std::vector<std::filesystem::path>& getAdditionalFolderPaths();
|
||||
|
||||
/**
|
||||
* @brief Sets the additional folder paths
|
||||
* @param paths The additional folder paths
|
||||
*/
|
||||
void setAdditionalFolderPaths(const std::vector<std::filesystem::path> &paths);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Gets the current GPU vendor
|
||||
* @return The current GPU vendor
|
||||
*/
|
||||
const std::string& getGPUVendor();
|
||||
|
||||
/**
|
||||
* @brief Gets the current GPU vendor
|
||||
* @return The current GPU vendor
|
||||
*/
|
||||
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
|
||||
* @return Whether ImHex is running in portable mode
|
||||
*/
|
||||
bool isPortableVersion();
|
||||
|
||||
/**
|
||||
* @brief Gets the current Operating System name
|
||||
* @return Operating System name
|
||||
*/
|
||||
std::string getOSName();
|
||||
|
||||
/**
|
||||
* @brief Gets the current Operating System version
|
||||
* @return Operating System version
|
||||
*/
|
||||
std::string getOSVersion();
|
||||
|
||||
/**
|
||||
* @brief Gets the current CPU architecture
|
||||
* @return CPU architecture
|
||||
*/
|
||||
std::string getArchitecture();
|
||||
|
||||
|
||||
struct LinuxDistro {
|
||||
std::string name;
|
||||
std::string version;
|
||||
};
|
||||
/**
|
||||
* @brief Gets information related to the Linux distribution, if running on Linux
|
||||
*/
|
||||
std::optional<LinuxDistro> getLinuxDistro();
|
||||
|
||||
/**
|
||||
* @brief Gets the current ImHex version
|
||||
* @return ImHex version
|
||||
*/
|
||||
SemanticVersion getImHexVersion();
|
||||
|
||||
/**
|
||||
* @brief Gets the current git commit hash
|
||||
* @param longHash Whether to return the full hash or the shortened version
|
||||
* @return Git commit hash
|
||||
*/
|
||||
std::string getCommitHash(bool longHash = false);
|
||||
|
||||
/**
|
||||
* @brief Gets the current git commit branch
|
||||
* @return Git commit branch
|
||||
*/
|
||||
std::string getCommitBranch();
|
||||
|
||||
/**
|
||||
* @brief Checks if ImHex was built in debug mode
|
||||
* @return True if ImHex was built in debug mode, false otherwise
|
||||
*/
|
||||
bool isDebugBuild();
|
||||
|
||||
/**
|
||||
* @brief Checks if this version of ImHex is a nightly build
|
||||
* @return True if this version is a nightly, false if it's a release
|
||||
*/
|
||||
bool isNightlyBuild();
|
||||
|
||||
enum class UpdateType {
|
||||
Stable,
|
||||
Nightly
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Triggers the update process
|
||||
* @param updateType The update channel
|
||||
* @return If the update process was successfully started
|
||||
*/
|
||||
bool updateImHex(UpdateType updateType);
|
||||
|
||||
/**
|
||||
* @brief Add a new startup task that will be run while ImHex's splash screen is shown
|
||||
* @param name Name to be shown in the UI
|
||||
* @param async Whether to run the task asynchronously
|
||||
* @param function The function to run
|
||||
*/
|
||||
void addStartupTask(const std::string &name, bool async, const std::function<bool()> &function);
|
||||
|
||||
/**
|
||||
* @brief Gets the time the previous frame took
|
||||
* @return Previous frame time
|
||||
*/
|
||||
double getLastFrameTime();
|
||||
|
||||
/**
|
||||
* @brief Sets the window resizable
|
||||
* @param resizable Whether the window should be resizable
|
||||
*/
|
||||
void setWindowResizable(bool resizable);
|
||||
|
||||
/**
|
||||
* @brief Checks if this window is the main instance of ImHex
|
||||
* @return True if this is the main instance, false if another instance is already running
|
||||
*/
|
||||
bool isMainInstance();
|
||||
|
||||
/**
|
||||
* @brief Gets the initial window properties
|
||||
* @return Initial window properties
|
||||
*/
|
||||
std::optional<InitialWindowProperties> getInitialWindowProperties();
|
||||
|
||||
/**
|
||||
* @brief Gets the module handle of libimhex
|
||||
* @return Module handle
|
||||
*/
|
||||
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);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Cross-instance messaging system
|
||||
* This allows you to send messages to the "main" instance of ImHex running, from any other instance
|
||||
*/
|
||||
namespace Messaging {
|
||||
|
||||
namespace impl {
|
||||
|
||||
using MessagingHandler = std::function<void(const std::vector<u8> &)>;
|
||||
|
||||
const std::map<std::string, MessagingHandler>& getHandlers();
|
||||
void runHandler(const std::string &eventName, const std::vector<u8> &args);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Register the handler for this specific event name
|
||||
*/
|
||||
void registerHandler(const std::string &eventName, const impl::MessagingHandler &handler);
|
||||
}
|
||||
|
||||
namespace Fonts {
|
||||
|
||||
struct GlyphRange { u16 begin, end; };
|
||||
struct Offset { float x, y; };
|
||||
|
||||
struct Font {
|
||||
std::string name;
|
||||
std::vector<u8> fontData;
|
||||
std::vector<GlyphRange> glyphRanges;
|
||||
Offset offset;
|
||||
u32 flags;
|
||||
std::optional<bool> scalable;
|
||||
std::optional<u32> defaultSize;
|
||||
};
|
||||
|
||||
namespace impl {
|
||||
|
||||
const std::vector<Font>& getFonts();
|
||||
|
||||
std::map<UnlocalizedString, ImFont*>& getFontDefinitions();
|
||||
|
||||
}
|
||||
|
||||
GlyphRange glyph(const char *glyph);
|
||||
GlyphRange glyph(u32 codepoint);
|
||||
GlyphRange range(const char *glyphBegin, const char *glyphEnd);
|
||||
GlyphRange range(u32 codepointBegin, u32 codepointEnd);
|
||||
|
||||
void loadFont(const std::fs::path &path, const std::vector<GlyphRange> &glyphRanges = {}, Offset offset = {}, u32 flags = 0, std::optional<bool> scalable = std::nullopt, std::optional<u32> defaultSize = std::nullopt);
|
||||
void loadFont(const std::string &name, const std::span<const u8> &data, const std::vector<GlyphRange> &glyphRanges = {}, Offset offset = {}, u32 flags = 0, std::optional<bool> scalable = std::nullopt, std::optional<u32> defaultSize = std::nullopt);
|
||||
|
||||
constexpr float DefaultFontSize = 13.0;
|
||||
|
||||
void registerFont(const UnlocalizedString &fontName);
|
||||
ImFont* getFont(const UnlocalizedString &fontName);
|
||||
|
||||
float getDpi();
|
||||
float pixelsToPoints(float pixels);
|
||||
float pointsToPixels(float points);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
52
lib/libimhex/include/hex/api/imhex_api/bookmarks.hpp
Normal file
52
lib/libimhex/include/hex/api/imhex_api/bookmarks.hpp
Normal file
@@ -0,0 +1,52 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <string>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
/* Functions to interact with Bookmarks */
|
||||
namespace ImHexApi::Bookmarks {
|
||||
|
||||
struct Entry {
|
||||
Region region;
|
||||
|
||||
std::string name;
|
||||
std::string comment;
|
||||
u32 color;
|
||||
bool locked;
|
||||
u64 id;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Adds a new bookmark
|
||||
* @param address The address of the bookmark
|
||||
* @param size The size of the bookmark
|
||||
* @param name The name of the bookmark
|
||||
* @param comment The comment of the bookmark
|
||||
* @param color The color of the bookmark or 0x00 for the default color
|
||||
* @return Bookmark ID
|
||||
*/
|
||||
u64 add(u64 address, size_t size, const std::string &name, const std::string &comment, color_t color = 0x00000000);
|
||||
|
||||
/**
|
||||
* @brief Adds a new bookmark
|
||||
* @param region The region of the bookmark
|
||||
* @param name The name of the bookmark
|
||||
* @param comment The comment of the bookmark
|
||||
* @param color The color of the bookmark or 0x00 for the default color
|
||||
* @return Bookmark ID
|
||||
*/
|
||||
u64 add(Region region, const std::string &name, const std::string &comment, color_t color = 0x00000000);
|
||||
|
||||
/**
|
||||
* @brief Removes a bookmark
|
||||
* @param id The ID of the bookmark to remove
|
||||
*/
|
||||
void remove(u64 id);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
77
lib/libimhex/include/hex/api/imhex_api/fonts.hpp
Normal file
77
lib/libimhex/include/hex/api/imhex_api/fonts.hpp
Normal file
@@ -0,0 +1,77 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <hex/api/localization_manager.hpp>
|
||||
|
||||
#include <span>
|
||||
#include <optional>
|
||||
#include <vector>
|
||||
|
||||
#if !defined(HEX_MODULE_EXPORT)
|
||||
struct ImFont;
|
||||
#endif
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
/* Functions for adding new font types */
|
||||
namespace ImHexApi::Fonts {
|
||||
|
||||
struct Offset { float x, y; };
|
||||
|
||||
struct MergeFont {
|
||||
std::string name;
|
||||
std::span<const u8> fontData;
|
||||
Offset offset;
|
||||
std::optional<float> fontSizeMultiplier;
|
||||
};
|
||||
|
||||
class Font {
|
||||
public:
|
||||
explicit Font(UnlocalizedString fontName);
|
||||
|
||||
void push(float size = 0.0F) const;
|
||||
void pushBold(float size = 0.0F) const;
|
||||
void pushItalic(float size = 0.0F) const;
|
||||
|
||||
void pop() const;
|
||||
|
||||
[[nodiscard]] operator ImFont*() const;
|
||||
[[nodiscard]] const UnlocalizedString& getUnlocalizedName() const { return m_fontName; }
|
||||
|
||||
private:
|
||||
void push(float size, ImFont *font) const;
|
||||
|
||||
private:
|
||||
UnlocalizedString m_fontName;
|
||||
};
|
||||
|
||||
struct FontDefinition {
|
||||
ImFont* regular;
|
||||
ImFont* bold;
|
||||
ImFont* italic;
|
||||
};
|
||||
|
||||
namespace impl {
|
||||
|
||||
const std::vector<MergeFont>& getMergeFonts();
|
||||
std::map<UnlocalizedString, FontDefinition>& getFontDefinitions();
|
||||
|
||||
}
|
||||
|
||||
void registerMergeFont(const std::string &name, const std::span<const u8> &data, Offset offset = {}, std::optional<float> fontSizeMultiplier = std::nullopt);
|
||||
|
||||
void registerFont(const Font& font);
|
||||
FontDefinition getFont(const UnlocalizedString &fontName);
|
||||
|
||||
void setDefaultFont(const Font& font);
|
||||
const Font& getDefaultFont();
|
||||
|
||||
float getDpi();
|
||||
float pixelsToPoints(float pixels);
|
||||
float pointsToPixels(float points);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
228
lib/libimhex/include/hex/api/imhex_api/hex_editor.hpp
Normal file
228
lib/libimhex/include/hex/api/imhex_api/hex_editor.hpp
Normal file
@@ -0,0 +1,228 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <functional>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <optional>
|
||||
#include <set>
|
||||
#include <vector>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
#if !defined(HEX_MODULE_EXPORT)
|
||||
namespace prv { class Provider; }
|
||||
#endif
|
||||
|
||||
/* Functions to query information from the Hex Editor and interact with it */
|
||||
namespace ImHexApi::HexEditor {
|
||||
|
||||
using TooltipFunction = std::function<void(u64, const u8*, size_t)>;
|
||||
|
||||
class Highlighting {
|
||||
public:
|
||||
Highlighting() = default;
|
||||
Highlighting(Region region, color_t color);
|
||||
|
||||
[[nodiscard]] const Region& getRegion() const { return m_region; }
|
||||
[[nodiscard]] const color_t& getColor() const { return m_color; }
|
||||
|
||||
private:
|
||||
Region m_region = {};
|
||||
color_t m_color = 0x00;
|
||||
};
|
||||
|
||||
class Tooltip {
|
||||
public:
|
||||
Tooltip() = default;
|
||||
Tooltip(Region region, std::string value, color_t color);
|
||||
|
||||
[[nodiscard]] const Region& getRegion() const { return m_region; }
|
||||
[[nodiscard]] const color_t& getColor() const { return m_color; }
|
||||
[[nodiscard]] const std::string& getValue() const { return m_value; }
|
||||
|
||||
private:
|
||||
Region m_region = {};
|
||||
std::string m_value;
|
||||
color_t m_color = 0x00;
|
||||
};
|
||||
|
||||
struct ProviderRegion : Region {
|
||||
prv::Provider *provider;
|
||||
|
||||
[[nodiscard]] prv::Provider *getProvider() const { return this->provider; }
|
||||
|
||||
[[nodiscard]] Region getRegion() const { return { this->address, this->size }; }
|
||||
};
|
||||
|
||||
namespace impl {
|
||||
|
||||
using HighlightingFunction = std::function<std::optional<color_t>(u64, const u8*, size_t, bool)>;
|
||||
using HoveringFunction = std::function<std::set<Region>(const prv::Provider *, u64, size_t)>;
|
||||
|
||||
const std::map<u32, Highlighting>& getBackgroundHighlights();
|
||||
const std::map<u32, HighlightingFunction>& getBackgroundHighlightingFunctions();
|
||||
const std::map<u32, Highlighting>& getForegroundHighlights();
|
||||
const std::map<u32, HighlightingFunction>& getForegroundHighlightingFunctions();
|
||||
const std::map<u32, HoveringFunction>& getHoveringFunctions();
|
||||
const std::map<u32, Tooltip>& getTooltips();
|
||||
const std::map<u32, TooltipFunction>& getTooltipFunctions();
|
||||
|
||||
void setCurrentSelection(const std::optional<ProviderRegion> ®ion);
|
||||
void setHoveredRegion(const prv::Provider *provider, const Region ®ion);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds a background color highlighting to the Hex Editor
|
||||
* @param region The region to highlight
|
||||
* @param color The color to use for the highlighting
|
||||
* @return Unique ID used to remove the highlighting again later
|
||||
*/
|
||||
u32 addBackgroundHighlight(const Region ®ion, color_t color);
|
||||
|
||||
/**
|
||||
* @brief Removes a background color highlighting from the Hex Editor
|
||||
* @param id The ID of the highlighting to remove
|
||||
*/
|
||||
void removeBackgroundHighlight(u32 id);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Adds a foreground color highlighting to the Hex Editor
|
||||
* @param region The region to highlight
|
||||
* @param color The color to use for the highlighting
|
||||
* @return Unique ID used to remove the highlighting again later
|
||||
*/
|
||||
u32 addForegroundHighlight(const Region ®ion, color_t color);
|
||||
|
||||
/**
|
||||
* @brief Removes a foreground color highlighting from the Hex Editor
|
||||
* @param id The ID of the highlighting to remove
|
||||
*/
|
||||
void removeForegroundHighlight(u32 id);
|
||||
|
||||
/**
|
||||
* @brief Adds a hover tooltip to the Hex Editor
|
||||
* @param region The region to add the tooltip to
|
||||
* @param value Text to display in the tooltip
|
||||
* @param color The color of the tooltip
|
||||
* @return Unique ID used to remove the tooltip again later
|
||||
*/
|
||||
u32 addTooltip(Region region, std::string value, color_t color);
|
||||
|
||||
/**
|
||||
* @brief Removes a hover tooltip from the Hex Editor
|
||||
* @param id The ID of the tooltip to remove
|
||||
*/
|
||||
void removeTooltip(u32 id);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Adds a background color highlighting to the Hex Editor using a callback function
|
||||
* @param function Function that draws the highlighting based on the hovered region
|
||||
* @return Unique ID used to remove the highlighting again later
|
||||
*/
|
||||
u32 addTooltipProvider(TooltipFunction function);
|
||||
|
||||
/**
|
||||
* @brief Removes a background color highlighting from the Hex Editor
|
||||
* @param id The ID of the highlighting to remove
|
||||
*/
|
||||
void removeTooltipProvider(u32 id);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Adds a background color highlighting to the Hex Editor using a callback function
|
||||
* @param function Function that draws the highlighting based on the hovered region
|
||||
* @return Unique ID used to remove the highlighting again later
|
||||
*/
|
||||
u32 addBackgroundHighlightingProvider(const impl::HighlightingFunction &function);
|
||||
|
||||
/**
|
||||
* @brief Removes a background color highlighting from the Hex Editor
|
||||
* @param id The ID of the highlighting to remove
|
||||
*/
|
||||
void removeBackgroundHighlightingProvider(u32 id);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Adds a foreground color highlighting to the Hex Editor using a callback function
|
||||
* @param function Function that draws the highlighting based on the hovered region
|
||||
* @return Unique ID used to remove the highlighting again later
|
||||
*/
|
||||
u32 addForegroundHighlightingProvider(const impl::HighlightingFunction &function);
|
||||
|
||||
/**
|
||||
* @brief Removes a foreground color highlighting from the Hex Editor
|
||||
* @param id The ID of the highlighting to remove
|
||||
*/
|
||||
void removeForegroundHighlightingProvider(u32 id);
|
||||
|
||||
/**
|
||||
* @brief Adds a hovering provider to the Hex Editor using a callback function
|
||||
* @param function Function that draws the highlighting based on the hovered region
|
||||
* @return Unique ID used to remove the highlighting again later
|
||||
*/
|
||||
u32 addHoverHighlightProvider(const impl::HoveringFunction &function);
|
||||
|
||||
/**
|
||||
* @brief Removes a hovering color highlighting from the Hex Editor
|
||||
* @param id The ID of the highlighting to remove
|
||||
*/
|
||||
void removeHoverHighlightProvider(u32 id);
|
||||
|
||||
/**
|
||||
* @brief Checks if there's a valid selection in the Hex Editor right now
|
||||
*/
|
||||
bool isSelectionValid();
|
||||
|
||||
/**
|
||||
* @brief Clears the current selection in the Hex Editor
|
||||
*/
|
||||
void clearSelection();
|
||||
|
||||
/**
|
||||
* @brief Gets the current selection in the Hex Editor
|
||||
* @return The current selection
|
||||
*/
|
||||
std::optional<ProviderRegion> getSelection();
|
||||
|
||||
/**
|
||||
* @brief Sets the current selection in the Hex Editor
|
||||
* @param region The region to select
|
||||
* @param provider The provider to select the region in
|
||||
*/
|
||||
void setSelection(const Region ®ion, prv::Provider *provider = nullptr);
|
||||
|
||||
/**
|
||||
* @brief Sets the current selection in the Hex Editor
|
||||
* @param region The region to select
|
||||
*/
|
||||
void setSelection(const ProviderRegion ®ion);
|
||||
|
||||
/**
|
||||
* @brief Sets the current selection in the Hex Editor
|
||||
* @param address The address to select
|
||||
* @param size The size of the selection
|
||||
* @param provider The provider to select the region in
|
||||
*/
|
||||
void setSelection(u64 address, size_t size, prv::Provider *provider = nullptr);
|
||||
|
||||
/**
|
||||
* @brief Adds a virtual file to the list in the Hex Editor
|
||||
* @param path The path of the file
|
||||
* @param data The data of the file
|
||||
* @param region The location of the file in the Hex Editor if available
|
||||
*/
|
||||
void addVirtualFile(const std::string &path, std::vector<u8> data, Region region = Region::Invalid());
|
||||
|
||||
/**
|
||||
* @brief Gets the currently hovered cell region in the Hex Editor
|
||||
* @return
|
||||
*/
|
||||
const std::optional<Region>& getHoveredRegion(const prv::Provider *provider);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
33
lib/libimhex/include/hex/api/imhex_api/messaging.hpp
Normal file
33
lib/libimhex/include/hex/api/imhex_api/messaging.hpp
Normal file
@@ -0,0 +1,33 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <functional>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
/**
|
||||
* Cross-instance messaging system
|
||||
* This allows you to send messages to the "main" instance of ImHex running, from any other instance
|
||||
*/
|
||||
namespace ImHexApi::Messaging {
|
||||
|
||||
namespace impl {
|
||||
|
||||
using MessagingHandler = std::function<void(const std::vector<u8> &)>;
|
||||
|
||||
const std::map<std::string, MessagingHandler>& getHandlers();
|
||||
void runHandler(const std::string &eventName, const std::vector<u8> &args);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Register the handler for this specific event name
|
||||
*/
|
||||
void registerHandler(const std::string &eventName, const impl::MessagingHandler &handler);
|
||||
}
|
||||
|
||||
}
|
||||
128
lib/libimhex/include/hex/api/imhex_api/provider.hpp
Normal file
128
lib/libimhex/include/hex/api/imhex_api/provider.hpp
Normal file
@@ -0,0 +1,128 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <hex/api/localization_manager.hpp>
|
||||
#include <hex/providers/provider.hpp>
|
||||
|
||||
#include <set>
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
#include <concepts>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
/**
|
||||
* Helper methods about the providers
|
||||
* @note the "current provider" or "currently selected provider" refers to the currently selected provider in the UI;
|
||||
* the provider the user is actually editing.
|
||||
*/
|
||||
namespace ImHexApi::Provider {
|
||||
|
||||
namespace impl {
|
||||
|
||||
void resetClosingProvider();
|
||||
std::set<prv::Provider*> getClosingProviders();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Gets the currently selected data provider
|
||||
* @return The currently selected data provider, or nullptr is there is none
|
||||
*/
|
||||
prv::Provider *get();
|
||||
|
||||
/**
|
||||
* @brief Gets a list of all currently loaded data providers
|
||||
* @return The currently loaded data providers
|
||||
*/
|
||||
std::vector<prv::Provider*> getProviders();
|
||||
|
||||
/**
|
||||
* @brief Sets the currently selected data provider
|
||||
* @param index Index of the provider to select
|
||||
*/
|
||||
void setCurrentProvider(i64 index);
|
||||
|
||||
/**
|
||||
* @brief Sets the currently selected data provider
|
||||
* @param provider The provider to select
|
||||
*/
|
||||
void setCurrentProvider(NonNull<prv::Provider*> provider);
|
||||
|
||||
/**
|
||||
* @brief Gets the index of the currently selected data provider
|
||||
* @return Index of the selected provider
|
||||
*/
|
||||
i64 getCurrentProviderIndex();
|
||||
|
||||
/**
|
||||
* @brief Checks whether the currently selected data provider is valid
|
||||
* @return Whether the currently selected data provider is valid
|
||||
*/
|
||||
bool isValid();
|
||||
|
||||
|
||||
/**
|
||||
* @brief Marks the **currently selected** data provider as dirty
|
||||
*/
|
||||
void markDirty();
|
||||
|
||||
/**
|
||||
* @brief Marks **all data providers** as clean
|
||||
*/
|
||||
void resetDirty();
|
||||
|
||||
/**
|
||||
* @brief Checks whether **any of the data providers** is dirty
|
||||
* @return Whether any data provider is dirty
|
||||
*/
|
||||
bool isDirty();
|
||||
|
||||
|
||||
/**
|
||||
* @brief Adds a newly created provider to the list of providers, and mark it as the selected one.
|
||||
* @param provider The provider to add
|
||||
* @param skipLoadInterface Whether to skip the provider's loading interface (see property documentation)
|
||||
* @param select Whether to select the provider after adding it
|
||||
*/
|
||||
void add(std::shared_ptr<prv::Provider> &&provider, bool skipLoadInterface = false, bool select = true);
|
||||
|
||||
/**
|
||||
* @brief Creates a new provider and adds it to the list of providers
|
||||
* @tparam T The type of the provider to create
|
||||
* @param args Arguments to pass to the provider's constructor
|
||||
*/
|
||||
template<std::derived_from<prv::Provider> T>
|
||||
void add(auto &&...args) {
|
||||
add(std::make_unique<T>(std::forward<decltype(args)>(args)...));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Removes a provider from the list of providers
|
||||
* @param provider The provider to remove
|
||||
* @param noQuestions Whether to skip asking the user for confirmation
|
||||
*/
|
||||
void remove(prv::Provider *provider, bool noQuestions = false);
|
||||
|
||||
/**
|
||||
* @brief Creates a new provider using its unlocalized name and add it to the list of providers
|
||||
* @param unlocalizedName The unlocalized name of the provider to create
|
||||
* @param skipLoadInterface Whether to skip the provider's loading interface (see property documentation)
|
||||
* @param select Whether to select the provider after adding it
|
||||
*/
|
||||
std::shared_ptr<prv::Provider> createProvider(
|
||||
const UnlocalizedString &unlocalizedName,
|
||||
bool skipLoadInterface = false,
|
||||
bool select = true
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Opens a provider, making its data available to ImHex and handling any error that may occur
|
||||
* @param provider The provider to open
|
||||
*/
|
||||
void openProvider(std::shared_ptr<prv::Provider> provider);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
389
lib/libimhex/include/hex/api/imhex_api/system.hpp
Normal file
389
lib/libimhex/include/hex/api/imhex_api/system.hpp
Normal file
@@ -0,0 +1,389 @@
|
||||
#pragma once
|
||||
|
||||
#include <hex.hpp>
|
||||
|
||||
#include <hex/helpers/semantic_version.hpp>
|
||||
#include <hex/helpers/fs.hpp>
|
||||
|
||||
#include <chrono>
|
||||
#include <functional>
|
||||
#include <optional>
|
||||
#include <string>
|
||||
#include <map>
|
||||
|
||||
#if !defined(HEX_MODULE_EXPORT)
|
||||
using ImGuiID = unsigned int;
|
||||
struct ImVec2;
|
||||
struct ImFontAtlas;
|
||||
#endif
|
||||
|
||||
struct GLFWwindow;
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
#if !defined(HEX_MODULE_EXPORT)
|
||||
namespace impl {
|
||||
class AutoResetBase;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Functions to interact with various ImHex system settings */
|
||||
namespace ImHexApi::System {
|
||||
|
||||
struct ProgramArguments {
|
||||
int argc;
|
||||
char **argv;
|
||||
char **envp;
|
||||
};
|
||||
|
||||
struct InitialWindowProperties {
|
||||
i32 x, y;
|
||||
u32 width, height;
|
||||
bool maximized;
|
||||
};
|
||||
|
||||
enum class TaskProgressState {
|
||||
Reset,
|
||||
Progress,
|
||||
Flash
|
||||
};
|
||||
|
||||
enum class TaskProgressType {
|
||||
Normal,
|
||||
Warning,
|
||||
Error
|
||||
};
|
||||
|
||||
namespace impl {
|
||||
|
||||
void setMainInstanceStatus(bool status);
|
||||
|
||||
void setMainWindowPosition(i32 x, i32 y);
|
||||
void setMainWindowSize(u32 width, u32 height);
|
||||
void setMainDockSpaceId(ImGuiID id);
|
||||
void setMainWindowHandle(GLFWwindow *window);
|
||||
|
||||
void setGlobalScale(float scale);
|
||||
void setNativeScale(float scale);
|
||||
|
||||
void setBorderlessWindowMode(bool enabled);
|
||||
void setMultiWindowMode(bool enabled);
|
||||
void setInitialWindowProperties(InitialWindowProperties properties);
|
||||
|
||||
void setGPUVendor(const std::string &vendor);
|
||||
void setGLRenderer(const std::string &renderer);
|
||||
void setGLVersion(SemanticVersion version);
|
||||
|
||||
void addInitArgument(const std::string &key, const std::string &value = { });
|
||||
|
||||
void setLastFrameTime(double time);
|
||||
|
||||
bool isWindowResizable();
|
||||
|
||||
void addAutoResetObject(hex::impl::AutoResetBase *object);
|
||||
void removeAutoResetObject(hex::impl::AutoResetBase *object);
|
||||
|
||||
void cleanup();
|
||||
|
||||
bool frameRateUnlockRequested();
|
||||
void resetFrameRateUnlockRequested();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Closes ImHex
|
||||
* @param noQuestions Whether to skip asking the user for confirmation
|
||||
*/
|
||||
void closeImHex(bool noQuestions = false);
|
||||
|
||||
/**
|
||||
* @brief Restarts ImHex
|
||||
*/
|
||||
void restartImHex();
|
||||
|
||||
/**
|
||||
* @brief Sets the progress bar in the task bar
|
||||
* @param state The state of the progress bar
|
||||
* @param type The type of the progress bar progress
|
||||
* @param progress The progress of the progress bar
|
||||
*/
|
||||
void setTaskBarProgress(TaskProgressState state, TaskProgressType type, u32 progress);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Gets the current target FPS
|
||||
* @return The current target FPS
|
||||
*/
|
||||
float getTargetFPS();
|
||||
|
||||
/**
|
||||
* @brief Sets the target FPS
|
||||
* @param fps The target FPS
|
||||
*/
|
||||
void setTargetFPS(float fps);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Gets the current global scale
|
||||
* @return The current global scale
|
||||
*/
|
||||
float getGlobalScale();
|
||||
|
||||
/**
|
||||
* @brief Gets the current native scale
|
||||
* @return The current native scale
|
||||
*/
|
||||
float getNativeScale();
|
||||
|
||||
float getBackingScaleFactor();
|
||||
|
||||
/**
|
||||
* @brief Gets the current main window position
|
||||
* @return Position of the main window
|
||||
*/
|
||||
ImVec2 getMainWindowPosition();
|
||||
|
||||
/**
|
||||
* @brief Gets the current main window size
|
||||
* @return Size of the main window
|
||||
*/
|
||||
ImVec2 getMainWindowSize();
|
||||
|
||||
/**
|
||||
* @brief Gets the current main dock space ID
|
||||
* @return ID of the main dock space
|
||||
*/
|
||||
ImGuiID getMainDockSpaceId();
|
||||
|
||||
/**
|
||||
* @brief Gets the main window's GLFW window handle
|
||||
* @return GLFW window handle
|
||||
*/
|
||||
GLFWwindow* getMainWindowHandle();
|
||||
|
||||
/**
|
||||
* @brief Checks if borderless window mode is enabled currently
|
||||
* @return Whether borderless window mode is enabled
|
||||
*/
|
||||
bool isBorderlessWindowModeEnabled();
|
||||
|
||||
/**
|
||||
* @brief Checks if multi-window mode is enabled currently
|
||||
* @return Whether multi-window mode is enabled
|
||||
*/
|
||||
bool isMultiWindowModeEnabled();
|
||||
|
||||
/**
|
||||
* @brief Gets the init arguments passed to ImHex from the splash screen
|
||||
* @return Init arguments
|
||||
*/
|
||||
const std::map<std::string, std::string>& getInitArguments();
|
||||
|
||||
/**
|
||||
* @brief Gets a init arguments passed to ImHex from the splash screen
|
||||
* @param key The key of the init argument
|
||||
* @return Init argument
|
||||
*/
|
||||
std::string getInitArgument(const std::string &key);
|
||||
|
||||
/**
|
||||
* @brief Sets if ImHex should follow the system theme
|
||||
* @param enabled Whether to follow the system theme
|
||||
*/
|
||||
void enableSystemThemeDetection(bool enabled);
|
||||
|
||||
/**
|
||||
* @brief Checks if ImHex follows the system theme
|
||||
* @return Whether ImHex follows the system theme
|
||||
*/
|
||||
bool usesSystemThemeDetection();
|
||||
|
||||
|
||||
/**
|
||||
* @brief Gets the currently set additional folder paths
|
||||
* @return The currently set additional folder paths
|
||||
*/
|
||||
const std::vector<std::fs::path>& getAdditionalFolderPaths();
|
||||
|
||||
/**
|
||||
* @brief Sets the additional folder paths
|
||||
* @param paths The additional folder paths
|
||||
*/
|
||||
void setAdditionalFolderPaths(const std::vector<std::fs::path> &paths);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Gets the current GPU vendor
|
||||
* @return The current GPU vendor
|
||||
*/
|
||||
const std::string& getGPUVendor();
|
||||
|
||||
/**
|
||||
* @brief Gets the current GPU vendor
|
||||
* @return The current GPU vendor
|
||||
*/
|
||||
const std::string& getGLRenderer();
|
||||
|
||||
/**
|
||||
* @brief Gets the current OpenGL version
|
||||
* @return The current OpenGL version
|
||||
*/
|
||||
const SemanticVersion& getGLVersion();
|
||||
|
||||
/**
|
||||
* @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
|
||||
* @return Whether ImHex is running in portable mode
|
||||
*/
|
||||
bool isPortableVersion();
|
||||
|
||||
/**
|
||||
* @brief Gets the current Operating System name
|
||||
* @return Operating System name
|
||||
*/
|
||||
std::string getOSName();
|
||||
|
||||
/**
|
||||
* @brief Gets the current Operating System version
|
||||
* @return Operating System version
|
||||
*/
|
||||
std::string getOSVersion();
|
||||
|
||||
/**
|
||||
* @brief Gets the current CPU architecture
|
||||
* @return CPU architecture
|
||||
*/
|
||||
std::string getArchitecture();
|
||||
|
||||
|
||||
struct LinuxDistro {
|
||||
std::string name;
|
||||
std::string version;
|
||||
};
|
||||
/**
|
||||
* @brief Gets information related to the Linux distribution, if running on Linux
|
||||
*/
|
||||
std::optional<LinuxDistro> getLinuxDistro();
|
||||
|
||||
/**
|
||||
* @brief Gets the current ImHex version
|
||||
* @return ImHex version
|
||||
*/
|
||||
const SemanticVersion& getImHexVersion();
|
||||
|
||||
/**
|
||||
* @brief Gets the current git commit hash
|
||||
* @param longHash Whether to return the full hash or the shortened version
|
||||
* @return Git commit hash
|
||||
*/
|
||||
std::string getCommitHash(bool longHash = false);
|
||||
|
||||
/**
|
||||
* @brief Gets the current git commit branch
|
||||
* @return Git commit branch
|
||||
*/
|
||||
std::string getCommitBranch();
|
||||
|
||||
/**
|
||||
* @brief Gets the time ImHex was built
|
||||
* @return The time ImHex was built
|
||||
*/
|
||||
std::optional<std::chrono::system_clock::time_point> getBuildTime();
|
||||
|
||||
/**
|
||||
* @brief Checks if ImHex was built in debug mode
|
||||
* @return True if ImHex was built in debug mode, false otherwise
|
||||
*/
|
||||
bool isDebugBuild();
|
||||
|
||||
/**
|
||||
* @brief Checks if this version of ImHex is a nightly build
|
||||
* @return True if this version is a nightly, false if it's a release
|
||||
*/
|
||||
bool isNightlyBuild();
|
||||
|
||||
/**
|
||||
* @brief Checks if there's an update available for the current version of ImHex
|
||||
* @return Optional string returning the version string of the new version, or std::nullopt if no update is available
|
||||
*/
|
||||
std::optional<std::string> checkForUpdate();
|
||||
|
||||
enum class UpdateType {
|
||||
Stable,
|
||||
Nightly
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Triggers the update process
|
||||
* @param updateType The update channel
|
||||
* @return If the update process was successfully started
|
||||
*/
|
||||
bool updateImHex(UpdateType updateType);
|
||||
|
||||
/**
|
||||
* @brief Add a new startup task that will be run while ImHex's splash screen is shown
|
||||
* @param name Name to be shown in the UI
|
||||
* @param async Whether to run the task asynchronously
|
||||
* @param function The function to run
|
||||
*/
|
||||
void addStartupTask(const std::string &name, bool async, const std::function<bool()> &function);
|
||||
|
||||
/**
|
||||
* @brief Gets the time the previous frame took
|
||||
* @return Previous frame time
|
||||
*/
|
||||
double getLastFrameTime();
|
||||
|
||||
/**
|
||||
* @brief Sets the window resizable
|
||||
* @param resizable Whether the window should be resizable
|
||||
*/
|
||||
void setWindowResizable(bool resizable);
|
||||
|
||||
/**
|
||||
* @brief Checks if this window is the main instance of ImHex
|
||||
* @return True if this is the main instance, false if another instance is already running
|
||||
*/
|
||||
bool isMainInstance();
|
||||
|
||||
/**
|
||||
* @brief Gets the initial window properties
|
||||
* @return Initial window properties
|
||||
*/
|
||||
std::optional<InitialWindowProperties> getInitialWindowProperties();
|
||||
|
||||
/**
|
||||
* @brief Gets the module handle of libimhex
|
||||
* @return Module handle
|
||||
*/
|
||||
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);
|
||||
|
||||
/**
|
||||
* @brief Unlocks the frame rate temporarily, allowing animations to run smoothly
|
||||
*/
|
||||
void unlockFrameRate();
|
||||
|
||||
/**
|
||||
* @brief Sets the current post-processing shader to use
|
||||
* @param vertexShader The vertex shader to use
|
||||
* @param fragmentShader The fragment shader to use
|
||||
*/
|
||||
void setPostProcessingShader(const std::string &vertexShader, const std::string &fragmentShader);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -6,42 +6,41 @@
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <vector>
|
||||
#include <functional>
|
||||
|
||||
#include <fmt/core.h>
|
||||
#include <wolv/types/static_string.hpp>
|
||||
|
||||
EXPORT_MODULE namespace hex {
|
||||
|
||||
struct UnlocalizedString;
|
||||
using LanguageId = std::string;
|
||||
|
||||
namespace LocalizationManager {
|
||||
|
||||
class LanguageDefinition {
|
||||
public:
|
||||
explicit LanguageDefinition(std::map<std::string, std::string> &&entries);
|
||||
|
||||
[[nodiscard]] const std::map<std::string, std::string> &getEntries() const;
|
||||
|
||||
private:
|
||||
std::map<std::string, std::string> m_entries;
|
||||
struct PathEntry {
|
||||
std::string path;
|
||||
std::function<std::string_view(const std::string &path)> callback;
|
||||
};
|
||||
|
||||
namespace impl {
|
||||
struct LanguageDefinition {
|
||||
LanguageId id;
|
||||
std::string name, nativeName;
|
||||
LanguageId fallbackLanguageId;
|
||||
bool hidden;
|
||||
|
||||
void setFallbackLanguage(const std::string &language);
|
||||
void resetLanguageStrings();
|
||||
std::vector<PathEntry> languageFilePaths;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
void loadLanguage(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::string &getFallbackLanguage();
|
||||
[[nodiscard]] const std::string &getSelectedLanguage();
|
||||
void addLanguages(const std::string_view &languageList, std::function<std::string_view(const std::string &path)> callback);
|
||||
void setLanguage(const LanguageId &languageId);
|
||||
[[nodiscard]] const LanguageId& getSelectedLanguageId();
|
||||
[[nodiscard]] const std::string& get(const LanguageId& languageId, const UnlocalizedString &unlocalizedString);
|
||||
[[nodiscard]] const std::map<LanguageId, LanguageDefinition>& getLanguageDefinitions();
|
||||
[[nodiscard]] const LanguageDefinition& getLanguageDefinition(const LanguageId &languageId);
|
||||
|
||||
}
|
||||
|
||||
struct UnlocalizedString;
|
||||
|
||||
class LangConst;
|
||||
|
||||
class Lang {
|
||||
@@ -60,7 +59,6 @@ EXPORT_MODULE namespace hex {
|
||||
|
||||
private:
|
||||
std::size_t m_entryHash;
|
||||
std::string m_unlocalizedString;
|
||||
};
|
||||
|
||||
class LangConst {
|
||||
@@ -104,6 +102,14 @@ EXPORT_MODULE namespace hex {
|
||||
UnlocalizedString(const std::string &string) : m_unlocalizedString(string) { }
|
||||
UnlocalizedString(const char *string) : m_unlocalizedString(string) { }
|
||||
UnlocalizedString(const Lang& arg) = delete;
|
||||
UnlocalizedString(std::string &&string) : m_unlocalizedString(std::move(string)) { }
|
||||
UnlocalizedString(UnlocalizedString &&) = default;
|
||||
UnlocalizedString(const UnlocalizedString &) = default;
|
||||
|
||||
UnlocalizedString &operator=(const UnlocalizedString &) = default;
|
||||
UnlocalizedString &operator=(UnlocalizedString &&) = default;
|
||||
UnlocalizedString &operator=(const std::string &string) { m_unlocalizedString = string; return *this; }
|
||||
UnlocalizedString &operator=(std::string &&string) { m_unlocalizedString = std::move(string); return *this; }
|
||||
|
||||
[[nodiscard]] operator std::string() const {
|
||||
return m_unlocalizedString;
|
||||
@@ -154,4 +160,13 @@ struct std::hash<hex::UnlocalizedString> {
|
||||
std::size_t operator()(const hex::UnlocalizedString &string) const noexcept {
|
||||
return std::hash<std::string>{}(string.get());
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
namespace fmt {
|
||||
|
||||
template<typename ... Args>
|
||||
auto format(const hex::Lang &entry, Args &&... args) {
|
||||
return fmt::format(fmt::runtime(entry.get()), std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user