|
1 | 1 | #include "logo.h" |
2 | 2 |
|
3 | | -#include <limits.h> |
4 | | -#include <string.h> |
5 | | -#include <unistd.h> |
6 | | -#include <ctype.h> |
7 | | - |
8 | | -typedef struct FFlogo |
9 | | -{ |
10 | | - const char* data; |
11 | | - const char** names; //Null terminated |
12 | | - const char** builtinColors; //Null terminated |
13 | | -} FFlogo; |
14 | | - |
15 | 3 | #define FF_LOGO_INIT static FFlogo logo; static bool init = false; if(init) return &logo; init = true; |
16 | 4 | #define FF_LOGO_NAMES(...) static const char* names[] = (const char*[]) { __VA_ARGS__, NULL }; logo.names = names; |
17 | 5 | #define FF_LOGO_LINES(x) logo.data = x; |
18 | 6 | #define FF_LOGO_COLORS(...) static const char* colors[] = (const char*[]) { __VA_ARGS__, NULL }; logo.builtinColors = colors; |
19 | 7 | #define FF_LOGO_RETURN return &logo; |
20 | 8 |
|
21 | | -static const FFlogo* getLogoUnknown() |
| 9 | +const FFlogo* ffLogoBuiltinGetUnknown() |
22 | 10 | { |
23 | 11 | FF_LOGO_INIT |
24 | 12 | FF_LOGO_NAMES("unknown", "question mark", "?") |
@@ -1441,13 +1429,11 @@ static const FFlogo* getLogoZorin() |
1441 | 1429 | FF_LOGO_RETURN |
1442 | 1430 | } |
1443 | 1431 |
|
1444 | | -typedef const FFlogo*(*GetLogoMethod)(); |
1445 | | - |
1446 | | -static GetLogoMethod* getLogos() |
| 1432 | +GetLogoMethod* ffLogoBuiltinGetAll() |
1447 | 1433 | { |
1448 | 1434 | static GetLogoMethod logoMethods[] = { |
| 1435 | + ffLogoBuiltinGetUnknown, |
1449 | 1436 | getLogoNone, |
1450 | | - getLogoUnknown, |
1451 | 1437 | getLogoAndroid, |
1452 | 1438 | getLogoAndroidSmall, |
1453 | 1439 | getLogoArch, |
@@ -1504,187 +1490,3 @@ static GetLogoMethod* getLogos() |
1504 | 1490 |
|
1505 | 1491 | return logoMethods; |
1506 | 1492 | } |
1507 | | - |
1508 | | -static bool logoHasName(const FFlogo* logo, const char* name) |
1509 | | -{ |
1510 | | - const char** logoName = logo->names; |
1511 | | - |
1512 | | - while(*logoName != NULL) |
1513 | | - { |
1514 | | - if(strcasecmp(*logoName, name) == 0) |
1515 | | - return true; |
1516 | | - ++logoName; |
1517 | | - } |
1518 | | - |
1519 | | - return false; |
1520 | | -} |
1521 | | - |
1522 | | -static const FFlogo* getBuiltinLogo(const char* name) |
1523 | | -{ |
1524 | | - GetLogoMethod* methods = getLogos(); |
1525 | | - |
1526 | | - while(*methods != NULL) |
1527 | | - { |
1528 | | - const FFlogo* logo = (*methods)(); |
1529 | | - if(logoHasName(logo, name)) |
1530 | | - return logo; |
1531 | | - ++methods; |
1532 | | - } |
1533 | | - |
1534 | | - return NULL; |
1535 | | -} |
1536 | | - |
1537 | | -static const FFlogo* detectBuiltinLogoWithVersion(const FFstrbuf* versionString, const FFstrbuf* name) |
1538 | | -{ |
1539 | | - if(versionString->length == 0) |
1540 | | - return getBuiltinLogo(name->chars); |
1541 | | - |
1542 | | - #define FF_PRINT_LOGO_VERSIONED_IF_EXISTS(newLogo, oldLogo, ver) \ |
1543 | | - if(logoHasName(newLogo, name->chars)) \ |
1544 | | - { \ |
1545 | | - long version = strtol(versionString->chars, NULL, 10); \ |
1546 | | - return (version == 0 || version == LONG_MAX || version == LONG_MIN || version >= ver) ? newLogo : oldLogo; \ |
1547 | | - } |
1548 | | - |
1549 | | - FF_PRINT_LOGO_VERSIONED_IF_EXISTS(getLogoFedora(), getLogoFedoraOld(), 34) |
1550 | | - FF_PRINT_LOGO_VERSIONED_IF_EXISTS(getLogoMint(), getLogoMintOld(), 19) |
1551 | | - |
1552 | | - return getBuiltinLogo(name->chars); |
1553 | | -} |
1554 | | - |
1555 | | -static const FFlogo* detectBuiltinLogo(const FFinstance* instance) |
1556 | | -{ |
1557 | | - static const FFlogo* logo; |
1558 | | - static bool detected = false; |
1559 | | - if(detected) |
1560 | | - return logo; |
1561 | | - |
1562 | | - detected = true; |
1563 | | - |
1564 | | - const FFOSResult* os = ffDetectOS(instance); |
1565 | | - |
1566 | | - logo = detectBuiltinLogoWithVersion(&os->version, &os->name); |
1567 | | - if(logo != NULL) |
1568 | | - return logo; |
1569 | | - |
1570 | | - logo = detectBuiltinLogoWithVersion(&os->version, &os->id); |
1571 | | - if(logo != NULL) |
1572 | | - return logo; |
1573 | | - |
1574 | | - logo = detectBuiltinLogoWithVersion(&os->version, &os->idLike); |
1575 | | - if(logo != NULL) |
1576 | | - return logo; |
1577 | | - |
1578 | | - logo = detectBuiltinLogoWithVersion(&os->version, &os->systemName); |
1579 | | - if(logo != NULL) |
1580 | | - return logo; |
1581 | | - |
1582 | | - return getLogoUnknown(); |
1583 | | -} |
1584 | | - |
1585 | | -void ffLogoSetMainColor(FFinstance* instance) |
1586 | | -{ |
1587 | | - const FFlogo* logo = NULL; |
1588 | | - |
1589 | | - if(instance->config.logoSource.length > 0) |
1590 | | - logo = getBuiltinLogo(instance->config.logoSource.chars); |
1591 | | - |
1592 | | - if(logo == NULL) |
1593 | | - logo = detectBuiltinLogo(instance); |
1594 | | - |
1595 | | - ffStrbufAppendS(&instance->config.mainColor, logo->builtinColors[0]); |
1596 | | -} |
1597 | | - |
1598 | | -static void printLogoStruct(FFinstance* instance, const FFlogo* logo, bool doColorReplacement) |
1599 | | -{ |
1600 | | - if(!doColorReplacement) |
1601 | | - { |
1602 | | - ffLogoPrint(instance, logo->data, false); |
1603 | | - return; |
1604 | | - } |
1605 | | - |
1606 | | - const char** colors = logo->builtinColors; |
1607 | | - for(int i = 0; *colors != NULL && i < FASTFETCH_LOGO_MAX_COLORS; i++, colors++) |
1608 | | - { |
1609 | | - if(instance->config.logoColors[i].length == 0) |
1610 | | - ffStrbufAppendS(&instance->config.logoColors[i], *colors); |
1611 | | - } |
1612 | | - |
1613 | | - ffLogoPrint(instance, logo->data, true); |
1614 | | -} |
1615 | | - |
1616 | | -void ffLogoPrintUnknown(FFinstance* instance) |
1617 | | -{ |
1618 | | - printLogoStruct(instance, getLogoUnknown(), false); |
1619 | | -} |
1620 | | - |
1621 | | -bool ffLogoPrintBuiltinIfExists(FFinstance* instance) |
1622 | | -{ |
1623 | | - const FFlogo* logo = getBuiltinLogo(instance->config.logoSource.chars); |
1624 | | - if(logo == NULL) |
1625 | | - return false; |
1626 | | - |
1627 | | - printLogoStruct(instance, logo, true); |
1628 | | - return true; |
1629 | | -} |
1630 | | - |
1631 | | -void ffLogoPrintBuiltinDetected(FFinstance* instance) |
1632 | | -{ |
1633 | | - printLogoStruct(instance, detectBuiltinLogo(instance), true); |
1634 | | -} |
1635 | | - |
1636 | | -void ffPrintBuiltinLogos(FFinstance* instance) |
1637 | | -{ |
1638 | | - GetLogoMethod* methods = getLogos(); |
1639 | | - |
1640 | | - while(*methods != NULL) |
1641 | | - { |
1642 | | - const FFlogo* logo = (*methods)(); |
1643 | | - printf("\033[%sm%s:\033[0m\n", logo->builtinColors[0], logo->names[0]); |
1644 | | - printLogoStruct(instance, logo, true); |
1645 | | - ffPrintRemainingLogo(instance); |
1646 | | - |
1647 | | - instance->state.logoHeight = 0; |
1648 | | - for(uint8_t i = 0; i < FASTFETCH_LOGO_MAX_COLORS; i++) |
1649 | | - ffStrbufClear(&instance->config.logoColors[i]); |
1650 | | - |
1651 | | - puts("\n"); |
1652 | | - ++methods; |
1653 | | - } |
1654 | | -} |
1655 | | - |
1656 | | -void ffListBuiltinLogos() |
1657 | | -{ |
1658 | | - GetLogoMethod* methods = getLogos(); |
1659 | | - |
1660 | | - uint32_t counter = 0; |
1661 | | - |
1662 | | - while(*methods != NULL) |
1663 | | - { |
1664 | | - const FFlogo* logo = (*methods)(); |
1665 | | - const char** names = logo->names; |
1666 | | - |
1667 | | - printf("%u)%s ", counter, counter < 10 ? " " : ""); |
1668 | | - ++counter; |
1669 | | - |
1670 | | - while(*names != NULL) |
1671 | | - { |
1672 | | - printf("\"%s\" ", *names); |
1673 | | - ++names; |
1674 | | - } |
1675 | | - |
1676 | | - putchar('\n'); |
1677 | | - ++methods; |
1678 | | - } |
1679 | | -} |
1680 | | - |
1681 | | -void ffListBuiltinLogosAutocompletion() |
1682 | | -{ |
1683 | | - GetLogoMethod* methods = getLogos(); |
1684 | | - |
1685 | | - while(*methods != NULL) |
1686 | | - { |
1687 | | - printf("%s\n", (*methods)()->names[0]); |
1688 | | - ++methods; |
1689 | | - } |
1690 | | -} |
0 commit comments