Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] Font display broken on 2.17 (QT) #1053

Closed
nelsonhef opened this issue Jun 28, 2024 · 13 comments · Fixed by #1054
Closed

[BUG] Font display broken on 2.17 (QT) #1053

nelsonhef opened this issue Jun 28, 2024 · 13 comments · Fixed by #1054
Labels
bug Something isn't working linux regression

Comments

@nelsonhef
Copy link

General description of bug:

  • What happened: QT Font display is broken
  • What should happen: Should display the name of the font for QT and GTK
  • Fastfetch version used: 2.17
  • Did it work in an older version: Yes, 2.16
  • Where did you get the binary: PPA
  • Does this issue still occur in the latest dev build? Yes

Often helpful information:

Screenshot:
Captura de tela de 2024-06-28 11-09-27

Output of fastfetch -c ci.jsonc --format json:

[
  {
    "type": "Title",
    "result": {
      "userName": "nelson",
      "hostName": "nelson-lenovo",
      "homeDir": "/home/nelson/",
      "exePath": "/usr/bin/fastfetch",
      "userShell": "/bin/bash",
      "pageSize": 4096
    },
    "stat": 0
  },
  {
    "type": "Separator",
    "error": "Unsupported for JSON format",
    "stat": 0
  },
  {
    "type": "OS",
    "result": {
      "buildID": "",
      "codename": "virginia",
      "id": "linuxmint",
      "idLike": "ubuntu debian",
      "name": "Linux Mint",
      "prettyName": "Linux Mint 21.3",
      "variant": "",
      "variantID": "",
      "version": "21.3 (Virginia)",
      "versionID": "21.3"
    },
    "stat": 1
  },
  {
    "type": "Host",
    "result": {
      "family": "IDEAPAD",
      "name": "20149",
      "version": "Lenovo G480",
      "sku": "LENOVO_MT_20149",
      "vendor": "LENOVO",
      "serial": "",
      "uuid": ""
    },
    "stat": 0
  },
  {
    "type": "Bios",
    "result": {
      "date": "12/19/2012",
      "release": "0.149",
      "vendor": "LENOVO",
      "version": "5ECN95WW(V9.00)",
      "type": "UEFI"
    },
    "stat": 0
  },
  {
    "type": "Bootmgr",
    "result": {
      "name": "Ubuntu",
      "firmware": "\\EFI\\ubuntu\\grubx64.efi",
      "secureBoot": false
    },
    "stat": 0
  },
  {
    "type": "Board",
    "error": "board_name is not set.",
    "stat": 0
  },
  {
    "type": "Chassis",
    "result": {
      "type": "Notebook",
      "vendor": "LENOVO",
      "version": "Lenovo G480",
      "serial": ""
    },
    "stat": 0
  },
  {
    "type": "Kernel",
    "result": {
      "architecture": "x86_64",
      "name": "Linux",
      "release": "6.5.0-41-generic",
      "version": "#41~22.04.2-Ubuntu SMP PREEMPT_DYNAMIC Mon Jun  3 11:32:55 UTC 2",
      "displayVersion": ""
    },
    "stat": 0
  },
  {
    "type": "InitSystem",
    "result": {
      "name": "systemd",
      "exe": "/usr/lib/systemd/systemd",
      "version": "249.11-0ubuntu3.12",
      "pid": 1
    },
    "stat": 5
  },
  {
    "type": "Uptime",
    "result": {
      "uptime": 1350000,
      "bootTime": "2024-06-28T11:33:08.769-0300"
    },
    "stat": 0
  },
  {
    "type": "Loadavg",
    "result": [
      0.2646484375,
      0.49072265625,
      0.46875
    ],
    "stat": 0
  },
  {
    "type": "Processes",
    "result": 256,
    "stat": 0
  },
  {
    "type": "Packages",
    "result": {
      "all": 2641,
      "apk": 0,
      "brew": 0,
      "brewCask": 0,
      "choco": 0,
      "dpkg": 2608,
      "emerge": 0,
      "eopkg": 0,
      "flatpakSystem": 33,
      "flatpakUser": 0,
      "nixDefault": 0,
      "nixSystem": 0,
      "nixUser": 0,
      "pacman": 0,
      "paludis": 0,
      "pkg": 0,
      "pkgtool": 0,
      "macports": 0,
      "rpm": 0,
      "scoop": 0,
      "snap": 0,
      "winget": 0,
      "xbps": 0,
      "opkg": 0,
      "am": 0,
      "sorcery": 0,
      "guixSystem": 0,
      "guixUser": 0,
      "guixHome": 0,
      "pacmanBranch": ""
    },
    "stat": 2
  },
  {
    "type": "Shell",
    "result": {
      "exe": "bash",
      "exeName": "bash",
      "exePath": "/usr/bin/bash",
      "pid": 7073,
      "ppid": 7052,
      "processName": "bash",
      "prettyName": "bash",
      "version": "5.1.16",
      "tty": 0
    },
    "stat": 2
  },
  {
    "type": "Editor",
    "error": "$VISUAL or $EDITOR not set",
    "stat": 0
  },
  {
    "type": "Display",
    "result": [
      {
        "width": 1366,
        "height": 768,
        "id": 0,
        "name": "SEC454C",
        "primary": true,
        "refreshRate": 59.99489201398311,
        "rotation": 0,
        "scaledHeight": 768,
        "scaledWidth": 1366,
        "type": "Unknown"
      }
    ],
    "stat": 1
  },
  {
    "type": "Brightness",
    "result": [
      {
        "name": "SEC454C",
        "max": 976.0,
        "min": 0.0,
        "current": 688.0
      }
    ],
    "stat": 0
  },
  {
    "type": "Monitor",
    "result": [
      {
        "hdrCompatible": false,
        "name": "L192WS",
        "resolution": {
          "width": 1440,
          "height": 900
        },
        "physical": {
          "height": 256,
          "width": 410
        },
        "manufactureDate": {
          "year": 2007,
          "week": 32
        },
        "serial": 160174
      },
      {
        "hdrCompatible": false,
        "name": "SEC454C",
        "resolution": {
          "width": 1366,
          "height": 768
        },
        "physical": {
          "height": 174,
          "width": 309
        },
        "manufactureDate": {
          "year": 2011,
          "week": 0
        },
        "serial": null
      }
    ],
    "stat": 0
  },
  {
    "type": "LM",
    "result": {
      "service": "lightdm",
      "type": "X11",
      "version": "1.30.0"
    },
    "stat": 4
  },
  {
    "type": "DE",
    "result": {
      "processName": "cinnamon",
      "prettyName": "Cinnamon",
      "version": "6.0.4"
    },
    "stat": 0
  },
  {
    "type": "WM",
    "result": {
      "processName": "Mutter (Muffin)",
      "prettyName": "Muffin",
      "protocolName": "X11",
      "pluginName": ""
    },
    "stat": 0
  },
  {
    "type": "WMTheme",
    "result": "Mint-Y-Dark-Aqua (Mint-Y)",
    "stat": 3
  },
  {
    "type": "Theme",
    "result": {
      "theme1": "gtk2 [QT]",
      "theme2": "Mint-Y-Dark-Aqua [GTK2/3/4]"
    },
    "stat": 0
  },
  {
    "type": "Icons",
    "result": {
      "icons1": "Mint-Y [QT]",
      "icons2": "Papirus-Dark [GTK2/3/4]"
    },
    "stat": 0
  },
  {
    "type": "Font",
    "result": {
      "display": "@Variant(\\0\\0\\0@\\0\\0\\0\\f\\0R\\0o\\0\\x62\\0o\\0t\\0o@$\\0\\0\\0\\0\\0\\0\\xff\\xff\\xff\\xff\\x5\\x1\\0\\x19\\x10) [QT], Roboto (10pt, Light) [GTK2/3/4]",
      "fonts": [
        "@Variant(\\0\\0\\0@\\0\\0\\0\\f\\0R\\0o\\0\\x62\\0o\\0t\\0o@$\\0\\0\\0\\0\\0\\0\\xff\\xff\\xff\\xff\\x5\\x1\\0\\x19\\x10)",
        "Roboto (10pt, Light)",
        "Roboto (10pt, Light)",
        "Roboto (10pt, Light)"
      ]
    },
    "stat": 0
  },
  {
    "type": "Cursor",
    "result": {
      "theme": "Adwaita",
      "size": "24"
    },
    "stat": 0
  },
  {
    "type": "Wallpaper",
    "result": "/home/nelson/.local/share/pix/wallpaper29.jpeg",
    "stat": 0
  },
  {
    "type": "Terminal",
    "result": {
      "processName": "gnome-terminal-",
      "exe": "/usr/libexec/gnome-terminal-server",
      "exeName": "gnome-terminal-server",
      "exePath": "/usr/libexec/gnome-terminal-server",
      "pid": 7052,
      "ppid": 2177,
      "prettyName": "GNOME Terminal",
      "version": "3.44.0",
      "tty": ""
    },
    "stat": 80
  },
  {
    "type": "TerminalFont",
    "result": {
      "font": {
        "name": "Noto Mono",
        "size": "11",
        "styles": [],
        "pretty": "Noto Mono (11pt)"
      },
      "fallback": {
        "name": "",
        "size": "",
        "styles": [],
        "pretty": ""
      }
    },
    "stat": 0
  },
  {
    "type": "TerminalSize",
    "result": {
      "columns": 122,
      "rows": 32,
      "width": 1098,
      "height": 576
    },
    "stat": 21
  },
  {
    "type": "TerminalTheme",
    "result": {
      "fg": {
        "r": 170,
        "g": 170,
        "b": 170,
        "dark": false
      },
      "bg": {
        "r": 0,
        "g": 0,
        "b": 0,
        "dark": true
      }
    },
    "stat": 21
  },
  {
    "type": "CPU",
    "result": {
      "cpu": "Intel(R) Core(TM) i5-3360M",
      "vendor": "GenuineIntel",
      "cores": {
        "physical": 2,
        "logical": 4,
        "online": 4
      },
      "frequency": {
        "base": 2.579,
        "max": 3.5,
        "min": 1.2,
        "biosLimit": null
      },
      "coreTypes": [
        {
          "count": 4,
          "freq": 3500000
        }
      ],
      "temperature": 48.0
    },
    "stat": 2
  },
  {
    "type": "CPUCache",
    "result": {
      "l1": [
        {
          "size": 32768,
          "num": 2,
          "lineSize": 64,
          "type": "data"
        },
        {
          "size": 32768,
          "num": 2,
          "lineSize": 64,
          "type": "instruction"
        }
      ],
      "l2": [
        {
          "size": 262144,
          "num": 2,
          "lineSize": 64,
          "type": "unified"
        }
      ],
      "l3": [
        {
          "size": 3145728,
          "num": 1,
          "lineSize": 64,
          "type": "unified"
        }
      ]
    },
    "stat": 0
  },
  {
    "type": "CPUUsage",
    "result": [
      0.0,
      0.0,
      0.0,
      0.0
    ],
    "stat": 201
  },
  {
    "type": "GPU",
    "result": [
      {
        "coreCount": null,
        "memory": {
          "dedicated": {
            "total": null,
            "used": null
          },
          "shared": {
            "total": null,
            "used": null
          }
        },
        "driver": "i915",
        "name": "3rd Gen Core processor Graphics Controller",
        "temperature": null,
        "type": "Integrated",
        "vendor": "Intel",
        "platformApi": "DRM (card0)",
        "frequency": 1.2,
        "deviceId": 1432
      }
    ],
    "stat": 1
  },
  {
    "type": "Memory",
    "result": {
      "total": 8176242688,
      "used": 1996312576
    },
    "stat": 0
  },
  {
    "type": "PhysicalMemory",
    "error": "Failed to get SMBIOS data",
    "stat": 0
  },
  {
    "type": "Swap",
    "result": {
      "total": 2147479552,
      "used": 0
    },
    "stat": 0
  },
  {
    "type": "Disk",
    "result": [
      {
        "bytes": {
          "available": 49680056320,
          "free": 53696835584,
          "total": 78151184384,
          "used": 24454348800
        },
        "files": {
          "total": 4890624,
          "used": 703660
        },
        "filesystem": "ext4",
        "mountpoint": "/",
        "mountFrom": "/dev/sda5",
        "name": "",
        "volumeType": [
          "Regular"
        ],
        "createTime": "2023-09-20T11:45:25.000-0300"
      },
      {
        "bytes": {
          "available": 67790848,
          "free": 67790848,
          "total": 100663296,
          "used": 32872448
        },
        "files": {
          "total": null,
          "used": null
        },
        "filesystem": "vfat",
        "mountpoint": "/boot/efi",
        "mountFrom": "/dev/sda2",
        "name": "EFI system partition",
        "volumeType": [
          "Hidden"
        ],
        "createTime": null
      }
    ],
    "stat": 0
  },
  {
    "type": "Battery",
    "result": [
      {
        "capacity": 100.0,
        "manufacturer": "LENOVO",
        "manufactureDate": "",
        "modelName": "PABAS0241231",
        "status": "AC Connected",
        "technology": "Li-ion",
        "serial": "41167",
        "temperature": null,
        "cycleCount": 0
      }
    ],
    "stat": 29
  },
  {
    "type": "PowerAdapter",
    "result": [],
    "stat": 0
  },
  {
    "type": "Player",
    "error": "No media found",
    "stat": 3
  },
  {
    "type": "Media",
    "error": "No media found",
    "stat": 0
  },
  {
    "type": "PublicIp",
    "result": {
      "ip": "xxx.xxx.xxx.xx",
      "location": "xxx"
    },
    "stat": 0
  },
  {
    "type": "LocalIp",
    "result": [
      {
        "defaultRoute": true,
        "ipv4": "192.168.10.181/24",
        "ipv6": "",
        "mac": "d0:37:45:d8:98:38",
        "name": "wlxd03745d89838",
        "mtu": 1500
      }
    ],
    "stat": 1
  },
  {
    "type": "Wifi",
    "result": [
      {
        "inf": {
          "description": "wlxd03745d89838",
          "status": "Activated"
        },
        "conn": {
          "status": "Connected",
          "ssid": "Enterprise_5G",
          "bssid": "D6:92:5E:FA:0C:04",
          "protocol": "802.11ac (Wi-Fi 5)",
          "security": "WPA2",
          "signalQuality": 68.0,
          "rxRate": 58.0,
          "txRate": 802.0
        }
      }
    ],
    "stat": 18
  },
  {
    "type": "DateTime",
    "result": "2024-06-28T11:10:39.158-0300",
    "stat": 0
  },
  {
    "type": "Locale",
    "result": "pt_BR.UTF-8",
    "stat": 0
  },
  {
    "type": "Vulkan",
    "result": {
      "apiVersion": "1.2.255",
      "conformanceVersion": "",
      "driver": "Intel open-source Mesa driver [Mesa 23.2.1-1ubuntu3.1~22.04.2]",
      "gpus": [
        {
          "type": "Integrated",
          "vendor": "Intel",
          "name": "Intel(R) HD Graphics 4000 (IVB GT2)",
          "driver": "Mesa 23.2.1-1ubuntu3.1~22.04.2",
          "platformApi": "Vulkan 1.2.255",
          "deviceId": 358,
          "memory": {
            "dedicated": {
              "total": 0,
              "used": null
            },
            "shared": {
              "total": 1610612736,
              "used": null
            }
          },
          "deviceId": 358
        }
      ]
    },
    "stat": 32
  },
  {
    "type": "OpenGL",
    "result": {
      "version": "4.2 (Compatibility Profile) Mesa 23.2.1-1ubuntu3.1~22.04.2",
      "renderer": "Mesa Intel(R) HD Graphics 4000 (IVB GT2)",
      "vendor": "Intel",
      "slv": "4.20",
      "library": "EGL"
    },
    "stat": 36
  },
  {
    "type": "OpenCL",
    "error": "clGetPlatformIDs() failed",
    "stat": 0
  },
  {
    "type": "Users",
    "result": [
      {
        "name": "nelson",
        "hostName": ":0",
        "sessionName": "tty7",
        "clientIp": "0.0.0.0",
        "loginTime": "2024-06-28T11:03:16.075-0300"
      }
    ],
    "stat": 0
  },
  {
    "type": "Bluetooth",
    "error": "Failed to call GetManagedObjects",
    "stat": 36
  },
  {
    "type": "Sound",
    "result": [
      {
        "active": true,
        "main": true,
        "volume": 55,
        "name": "Áudio interno Estéreo analógico",
        "identifier": "alsa_output.pci-0000_00_1b.0.analog-stereo"
      }
    ],
    "stat": 2
  },
  {
    "type": "Camera",
    "result": [
      {
        "name": "Lenovo EasyCamera: Lenovo EasyC",
        "vendor": "",
        "colorSpace": "sRGB",
        "id": "usb-0000:00:1d.0-1.6",
        "width": 1280,
        "height": 720
      }
    ],
    "stat": 138
  },
  {
    "type": "Gamepad",
    "result": [],
    "stat": 0
  },
  {
    "type": "Weather",
    "result": "xxxxx",
    "stat": 0
  },
  {
    "type": "NetIO",
    "result": [
      {
        "name": "wlxd03745d89838",
        "defaultRoute": true,
        "txBytes": 1258,
        "rxBytes": 1597,
        "txPackets": 12,
        "rxPackets": 10,
        "rxErrors": 0,
        "txErrors": 0,
        "rxDrops": 0,
        "txDrops": 0
      }
    ],
    "stat": 361
  },
  {
    "type": "DiskIO",
    "result": [
      {
        "name": "PLDS DVD-RW DS8A8SH",
        "devPath": "/dev/sr0",
        "bytesRead": 0,
        "bytesWritten": 0,
        "readCount": 0,
        "writeCount": 0
      },
      {
        "name": "ATA P3-256",
        "devPath": "/dev/sda",
        "bytesRead": 0,
        "bytesWritten": 81920,
        "readCount": 0,
        "writeCount": 19
      }
    ],
    "stat": 1
  },
  {
    "type": "PhysicalDisk",
    "result": [
      {
        "name": "PLDS DVD-RW DS8A8SH",
        "devPath": "/dev/sr0",
        "interconnect": "ATA",
        "kind": "HDD",
        "size": 1073741312,
        "serial": "",
        "removable": true,
        "readOnly": false,
        "revision": "",
        "temperature": null
      },
      {
        "name": "ATA P3-256",
        "devPath": "/dev/sda",
        "interconnect": "ATA",
        "kind": "SSD",
        "size": 256060514304,
        "serial": "",
        "removable": false,
        "readOnly": false,
        "revision": "",
        "temperature": null
      }
    ],
    "stat": 0
  },
  {
    "type": "Version",
    "result": {
      "projectName": "fastfetch",
      "architecture": "x86_64",
      "version": "2.17.0",
      "versionTweak": "",
      "cmakeBuiltType": "RelWithDebInfo",
      "compileTime": "Jun 28 2024, 05:43:18",
      "compiler": "gcc 11.4.0",
      "debugMode": false,
      "libc": "glibc 2.35"
    },
    "stat": 0
  },
  {
    "type": "Break",
    "error": "Unsupported for JSON format",
    "stat": 0
  },
  {
    "type": "Colors",
    "error": "Unsupported for JSON format",
    "stat": 0
  }
@nelsonhef nelsonhef added the bug Something isn't working label Jun 28, 2024
@CarterLi
Copy link
Member

Should be a regression introduced in #1047

@capezotte Do you have any idea?

@CarterLi
Copy link
Member

CarterLi commented Jun 28, 2024

Do you use qt[56]ct? What did it use to display? Please paste the content of ~/.config/qt5ct/qt5ct.conf and ~/.config/qt6ct/qt6ct.conf

@nelsonhef
Copy link
Author

Yes, i have qt5ct installed.
Captura de tela de 2024-06-28 11-42-06

~/.config/qt5ct/qt5ct.conf

[Appearance]
color_scheme_path=/usr/share/qt5ct/colors/airy.conf
custom_palette=false
icon_theme=Mint-Y
standard_dialogs=default
style=gtk2

[Fonts]
fixed=@Variant(\0\0\0@\0\0\0\x12\0N\0o\0t\0o\0 \0M\0o\0n\0o@&\0\0\0\0\0\0\xff\xff\xff\xff\x5\x1\0\x32\x10)
general=@Variant(\0\0\0@\0\0\0\f\0R\0o\0\x62\0o\0t\0o@$\0\0\0\0\0\0\xff\xff\xff\xff\x5\x1\0\x19\x10)

[Interface]
activate_item_on_single_click=1
buttonbox_layout=0
cursor_flash_time=1000
dialog_buttons_have_icons=1
double_click_interval=400
gui_effects=@Invalid()
keyboard_scheme=2
menus_have_icons=true
show_shortcuts_in_context_menus=true
stylesheets=@Invalid()
toolbutton_style=4
underline_shortcut=1
wheel_scroll_lines=3

[SettingsWindow]
geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1e\0\0\0\x1e\0\0\x2\xfc\0\0\x2~\0\0\0\x1e\0\0\0>\0\0\x2\xfc\0\0\x2~\0\0\0\0\0\0\0\0\x5V\0\0\0\x1e\0\0\0>\0\0\x2\xfc\0\0\x2~)

[Troubleshooting]
force_raster_widgets=1
ignored_applications=@Invalid()

@CarterLi
Copy link
Member

fixed=@variant(\0\0\0@\0\0\0\x12\0N\0o\0t\0o\0 \0M\0o\0n\0o@&\0\0\0\0\0\0\xff\xff\xff\xff\x5\x1\0\x32\x10)

Do you have any idea what this is?

@capezotte
Copy link
Contributor

capezotte commented Jun 28, 2024

Do you have any idea?

I think the user's distribution is shipping an older version that triggers the FIXME part of the PR. I've never found any clear documentation for the @Variant(...) encoding for fonts. From some experimentation I did before my distribution updated to a version with the simpler output format, I think the font name is between the pair of @s and the last few bytes are the font size in big endian.

I can try making a PR that tries to wrangle this format (or just clears the font output if it's found).

info: I'm running qt5ct 1.8 and qt6ct 0.9.

@CarterLi
Copy link
Member

I can try making a PR that tries to wrangle this format (or just clears the font output if it's found).

I think if we get @Variant(...), just set the font as qtxct

@CarterLi
Copy link
Member

@nelsonhef What did it use to print?

@capezotte
Copy link
Contributor

I think if we get @variant(...), just set the font as qtxct

So the output would be qtXct [Qt], Roboto (10pt) [GTK 2/3]?

@CarterLi
Copy link
Member

Seems strange.

@nelsonhef
Copy link
Author

@nelsonhef What did it use to print?

Screenshot of 2.16
Captura de tela de 2024-06-28 12-07-20

@capezotte hit the nail, it's the old (1.5) version of qt5ct shipped with Mint 21 (Ubuntu 22.04) that uses a text encoding instead of plain text.

@CarterLi
Copy link
Member

They serialized QVariant of some struct as byte string, hence the output. If we can find the source code of qt5ct 1.5, we can definitely deserialize it.

@capezotte
Copy link
Contributor

This seems to be relevant: https://invent.kde.org/qt/qt/qtbase/-/blob/dev/src/gui/text/qfont.cpp?ref_type=heads#L2761

@CarterLi
Copy link
Member

CarterLi commented Jun 28, 2024

It was QVariant of QFont.

https://github.com/qt/qtbase/blob/d7a70f5ac887d46fbc82a60c2db074083d448126/src/corelib/kernel/qvariant.cpp#L1364

\0\0\0@\0\0\0\f\0R\0o\0\x62\0o\0t\0o@$\0\0\0\0\0\0\xff\xff\xff\xff\x5\x1\0\x19\x10

  • \0\0\0@ (64): typeId QVariant::Type::Font.

The code of QFont serialization is https://github.com/qt/qtbase/blob/d7a70f5ac887d46fbc82a60c2db074083d448126/src/gui/text/qfont.cpp#L2761

  • \0\0\0\f: 12, string length
  • \0R\0o\0\x62\0o\0t\0o: Roboto in UCS2
  • @$\0\0\0\0\0\0: point size (double)
  • \xff\xff\xff\xff: -1, pixel size (qint32 aka int)
  • \x5: styleHint
  • \x1\0\x19\x10: styleStrategy + weight?

The code is really complex. It contains lots of Qt version tests and different version of Qt generates different results.

The byte order is big endian by default but it's configurable

I really don't want to touch this kind of things. If you don't either, I think qtXct [Qt] is acceptable (better than empty) @capezotte

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working linux regression
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants