Skip to content
This repository was archived by the owner on Nov 28, 2025. It is now read-only.

Commit 10fb601

Browse files
committed
fix concurrency issue when loading skins
1 parent 899c2f7 commit 10fb601

File tree

7 files changed

+46
-57
lines changed

7 files changed

+46
-57
lines changed

1.16_combat-6/src/main/java/io/github/axolotlclient/modules/auth/skin/SkinManagementScreen.java

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ private void refreshCurrentList() {
311311
}
312312

313313
private void loadCapesList() {
314-
capesList.clearEntries0();
314+
List<Row> rows = new ArrayList<>();
315315
var profile = cachedProfile;
316316
int columns = Math.max(2, (width / 2 - 25) / LIST_SKIN_WIDTH);
317317
var capes = profile.capes();
@@ -336,12 +336,12 @@ private void loadCapesList() {
336336

337337
widgets.add(widget2);
338338
}
339-
capesList.addEntry(new Row(widgets));
339+
rows.add(new Row(widgets));
340340
}
341+
client.execute(() -> capesList.replaceEntries(rows));
341342
}
342343

343344
private void loadSkinsList() {
344-
skinList.clearEntries0();
345345
var profile = cachedProfile;
346346
int columns = Math.max(2, (width / 2 - 25) / LIST_SKIN_WIDTH);
347347
List<Skin> skins = new ArrayList<>(profile.skins());
@@ -386,6 +386,7 @@ private List<Skin> loadLocalSkins() {
386386

387387
private void populateSkinList(List<? extends Skin> skins, int columns) {
388388
int entryHeight = skinList.getEntryContentsHeight();
389+
List<Row> rows = new ArrayList<>();
389390
for (int i = 0; i < skins.size(); i += columns) {
390391
var s = skins.get(i);
391392
if (s != null && s.active()) {
@@ -403,8 +404,9 @@ private void populateSkinList(List<? extends Skin> skins, int columns) {
403404
var widget2 = createEntryForSkin(s2, entryHeight);
404405
widgets.add(widget2);
405406
}
406-
skinList.addEntry(new Row(widgets));
407+
rows.add(new Row(widgets));
407408
}
409+
client.execute(() -> skinList.replaceEntries(rows));
408410
}
409411

410412
private Path ensureNonexistent(Path p) {
@@ -487,11 +489,6 @@ public SkinListWidget(MinecraftClient minecraft, int width, int height, int y, i
487489
//setRenderBackground(false);
488490
}
489491

490-
@Override
491-
public int addEntry(Row entry) {
492-
return super.addEntry(entry);
493-
}
494-
495492
@Override
496493
protected int getScrollbarPositionX() {
497494
return right - 8;
@@ -518,8 +515,9 @@ public int getEntryContentsHeight() {
518515
return itemHeight - 4;
519516
}
520517

521-
public void clearEntries0() {
522-
super.clearEntries();
518+
@Override
519+
public void replaceEntries(Collection<Row> newEntries) {
520+
super.replaceEntries(newEntries);
523521
}
524522

525523
@Override

1.20/src/main/java/io/github/axolotlclient/modules/auth/skin/SkinManagementScreen.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ private void refreshCurrentList() {
273273
}
274274

275275
private void loadCapesList() {
276-
capesList.clearEntries();
276+
List<Row> rows = new ArrayList<>();
277277
var profile = cachedProfile;
278278
int columns = Math.max(2, (width / 2 - 25) / LIST_SKIN_WIDTH);
279279
var capes = profile.capes();
@@ -298,12 +298,12 @@ private void loadCapesList() {
298298

299299
widgets.add(widget2);
300300
}
301-
capesList.addEntry(new Row(widgets));
301+
rows.add(new Row(widgets));
302302
}
303+
client.execute(() -> capesList.replaceEntries(rows));
303304
}
304305

305306
private void loadSkinsList() {
306-
skinList.clearEntries();
307307
var profile = cachedProfile;
308308
int columns = Math.max(2, (width / 2 - 25) / LIST_SKIN_WIDTH);
309309
List<Skin> skins = new ArrayList<>(profile.skins());
@@ -348,6 +348,7 @@ private List<Skin> loadLocalSkins() {
348348

349349
private void populateSkinList(List<? extends Skin> skins, int columns) {
350350
int entryHeight = skinList.getEntryContentsHeight();
351+
List<Row> rows = new ArrayList<>();
351352
for (int i = 0; i < skins.size(); i += columns) {
352353
var s = skins.get(i);
353354
if (s != null && s.active()) {
@@ -365,8 +366,9 @@ private void populateSkinList(List<? extends Skin> skins, int columns) {
365366
var widget2 = createEntryForSkin(s2, entryHeight);
366367
widgets.add(widget2);
367368
}
368-
skinList.addEntry(new Row(widgets));
369+
rows.add(new Row(widgets));
369370
}
371+
client.execute(() -> skinList.replaceEntries(rows));
370372
}
371373

372374
private Path ensureNonexistent(Path p) {
@@ -448,11 +450,6 @@ public SkinListWidget(MinecraftClient minecraft, int width, int height, int y, i
448450
setRenderHeader(false, 0);
449451
}
450452

451-
@Override
452-
public int addEntry(Row entry) {
453-
return super.addEntry(entry);
454-
}
455-
456453
@Override
457454
protected int getScrollbarPositionX() {
458455
return right - 8;
@@ -482,8 +479,8 @@ public int getEntryContentsHeight() {
482479
}
483480

484481
@Override
485-
public void clearEntries() {
486-
super.clearEntries();
482+
public void replaceEntries(Collection<Row> newEntries) {
483+
super.replaceEntries(newEntries);
487484
}
488485

489486
@Override

1.21/src/main/java/io/github/axolotlclient/modules/auth/skin/SkinManagementScreen.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ private void refreshCurrentList() {
263263
}
264264

265265
private void loadCapesList() {
266-
capesList.clearEntries();
266+
List<Row> rows = new ArrayList<>();
267267
var profile = cachedProfile;
268268
int columns = Math.max(2, (width / 2 - 25) / LIST_SKIN_WIDTH);
269269
var capes = profile.capes();
@@ -288,12 +288,12 @@ private void loadCapesList() {
288288

289289
widgets.add(widget2);
290290
}
291-
capesList.addEntry(new Row(widgets));
291+
rows.add(new Row(widgets));
292292
}
293+
client.execute(() -> capesList.replaceEntries(rows));
293294
}
294295

295296
private void loadSkinsList() {
296-
skinList.clearEntries();
297297
var profile = cachedProfile;
298298
int columns = Math.max(2, (width / 2 - 25) / LIST_SKIN_WIDTH);
299299
List<Skin> skins = new ArrayList<>(profile.skins());
@@ -339,6 +339,7 @@ private List<Skin> loadLocalSkins() {
339339

340340
private void populateSkinList(List<? extends Skin> skins, int columns) {
341341
int entryHeight = skinList.getEntryContentsHeight();
342+
List<Row> rows = new ArrayList<>();
342343
for (int i = 0; i < skins.size(); i += columns) {
343344
var s = skins.get(i);
344345
if (s != null && s.active()) {
@@ -356,8 +357,9 @@ private void populateSkinList(List<? extends Skin> skins, int columns) {
356357
var widget2 = createEntryForSkin(s2, entryHeight);
357358
widgets.add(widget2);
358359
}
359-
skinList.addEntry(new Row(widgets));
360+
rows.add(new Row(widgets));
360361
}
362+
client.execute(() -> skinList.replaceEntries(rows));
361363
}
362364

363365
private Path ensureNonexistent(Path p) {
@@ -436,11 +438,6 @@ public SkinListWidget(MinecraftClient minecraft, int width, int height, int y, i
436438
super(minecraft, width, height, y, entryHeight);
437439
}
438440

439-
@Override
440-
public int addEntry(Row entry) {
441-
return super.addEntry(entry);
442-
}
443-
444441
@Override
445442
protected int getScrollbarPositionX() {
446443
return getXEnd() - 8;
@@ -470,8 +467,8 @@ public int getEntryContentsHeight() {
470467
}
471468

472469
@Override
473-
public void clearEntries() {
474-
super.clearEntries();
470+
public void replaceEntries(Collection<Row> newEntries) {
471+
super.replaceEntries(newEntries);
475472
}
476473

477474
@Override

1.8.9/src/main/java/io/github/axolotlclient/modules/auth/skin/SkinManagementScreen.java

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ private void refreshCurrentList() {
294294
}
295295

296296
private void loadCapesList() {
297-
capesList.clearEntries();
297+
List<Row> rows = new ArrayList<>();
298298
var profile = cachedProfile;
299299
int columns = Math.max(2, (width / 2 - 25) / LIST_SKIN_WIDTH);
300300
var capes = profile.capes();
@@ -319,12 +319,12 @@ private void loadCapesList() {
319319

320320
widgets.add(widget2);
321321
}
322-
capesList.addEntry(new Row(widgets));
322+
rows.add(new Row(widgets));
323323
}
324+
minecraft.submit(() -> capesList.replaceEntries(rows));
324325
}
325326

326327
private void loadSkinsList() {
327-
skinList.clearEntries();
328328
var profile = cachedProfile;
329329
int columns = Math.max(2, (width / 2 - 25) / LIST_SKIN_WIDTH);
330330
List<Skin> skins = new ArrayList<>(profile.skins());
@@ -369,6 +369,7 @@ private List<Skin> loadLocalSkins() {
369369

370370
private void populateSkinList(List<? extends Skin> skins, int columns) {
371371
int entryHeight = skinList.getEntryContentsHeight();
372+
List<Row> rows = new ArrayList<>();
372373
for (int i = 0; i < skins.size(); i += columns) {
373374
var s = skins.get(i);
374375
if (s != null && s.active()) {
@@ -386,8 +387,9 @@ private void populateSkinList(List<? extends Skin> skins, int columns) {
386387
var widget2 = createEntryForSkin(s2, entryHeight);
387388
widgets.add(widget2);
388389
}
389-
skinList.addEntry(new Row(widgets));
390+
rows.add(new Row(widgets));
390391
}
392+
minecraft.submit(() -> skinList.replaceEntries(rows));
391393
}
392394

393395
private Path ensureNonexistent(Path p) {
@@ -470,11 +472,6 @@ public SkinListWidget(Minecraft minecraft, int width, int height, int y, int ent
470472
setRenderHorizontalShadows(false);
471473
}
472474

473-
@Override
474-
public int addEntry(Row entry) {
475-
return super.addEntry(entry);
476-
}
477-
478475
@Override
479476
protected int getScrollbarPositionX() {
480477
return right - 8;
@@ -497,8 +494,9 @@ public int getEntryContentsHeight() {
497494
return itemHeight - 4;
498495
}
499496

500-
public void clearEntries() {
501-
super.clearEntries();
497+
@Override
498+
public void replaceEntries(Collection<Row> newEntries) {
499+
super.replaceEntries(newEntries);
502500
}
503501

504502
@Override

1.latest/src/main/java/io/github/axolotlclient/modules/auth/skin/SkinManagementScreen.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ private void refreshCurrentList() {
266266
}
267267

268268
private void loadCapesList() {
269-
capesList.clearEntries();
269+
List<Row> rows = new ArrayList<>();
270270
var profile = cachedProfile;
271271
int columns = Math.max(2, (width / 2 - 25) / LIST_SKIN_WIDTH);
272272
var capes = profile.capes();
@@ -291,13 +291,13 @@ private void loadCapesList() {
291291

292292
widgets.add(widget2);
293293
}
294-
capesList.addEntry(new Row(widgets));
294+
rows.add(new Row(widgets));
295295
}
296+
minecraft.execute(() -> capesList.replaceEntries(rows));
296297
capesList.setScrollAmount(capesList.scrollAmount());
297298
}
298299

299300
private void loadSkinsList() {
300-
skinList.clearEntries();
301301
var profile = cachedProfile;
302302
int columns = Math.max(2, (width / 2 - 25) / LIST_SKIN_WIDTH);
303303
List<Skin> skins = new ArrayList<>(profile.skins());
@@ -344,6 +344,7 @@ private List<Skin> loadLocalSkins() {
344344

345345
private void populateSkinList(List<? extends Skin> skins, int columns) {
346346
int entryHeight = skinList.getEntryContentsHeight();
347+
List<Row> rows = new ArrayList<>();
347348
for (int i = 0; i < skins.size(); i += columns) {
348349
var s = skins.get(i);
349350
if (s != null && s.active()) {
@@ -361,8 +362,9 @@ private void populateSkinList(List<? extends Skin> skins, int columns) {
361362
var widget2 = createEntryForSkin(s2, entryHeight);
362363
widgets.add(widget2);
363364
}
364-
skinList.addEntry(new Row(widgets));
365+
rows.add(new Row(widgets));
365366
}
367+
minecraft.execute(() -> skinList.replaceEntries(rows));
366368
}
367369

368370
private Path ensureNonexistent(Path p) {
@@ -443,11 +445,6 @@ public SkinListWidget(Minecraft minecraft, int width, int height, int y, int ent
443445
super(minecraft, width, height, y, entryHeight);
444446
}
445447

446-
@Override
447-
public int addEntry(Row entry) {
448-
return super.addEntry(entry);
449-
}
450-
451448
@Override
452449
protected int scrollBarX() {
453450
return getRight() - 8;
@@ -477,8 +474,8 @@ public int getEntryContentsHeight() {
477474
}
478475

479476
@Override
480-
public void clearEntries() {
481-
super.clearEntries();
477+
public void replaceEntries(Collection<Row> newEntries) {
478+
super.replaceEntries(newEntries);
482479
}
483480

484481
@Override

common/src/main/java/io/github/axolotlclient/AxolotlClientCommon.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ public static Path resolveProfileConfigFile(String file) {
6464
}
6565

6666
public static final boolean NVG_SUPPORTED = OSUtil.getOS() != OSUtil.OperatingSystem.OTHER &&
67-
!Objects.requireNonNullElse(System.getenv("TMPDIR"), "").contains("Android") && !FabricLoader.getInstance().isModLoaded("vulkanmod");
67+
!Objects.requireNonNullElse(System.getenv("TMPDIR"), "").contains("Android") &&
68+
!Objects.requireNonNullElse(System.getenv("HOME"), "").contains("Android") &&
69+
!FabricLoader.getInstance().isModLoaded("vulkanmod");
6870

6971
public static final String VERSION = FabricLoader.getInstance()
7072
.getModContainer("axolotlclient-common")

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ fabric.loom.disableMinecraftVerification=true
77
axolotlclient.modules.all=true
88

99
# Mod Properties
10-
version=3.1.6-beta.2
10+
version=3.1.6-beta.3
1111

1212
maven_group=io.github.axolotlclient
1313

0 commit comments

Comments
 (0)