Skip to content

Commit 01f400c

Browse files
authored
Haiku: minimal implementation (#1538)
1 parent 33c905a commit 01f400c

File tree

17 files changed

+420
-8
lines changed

17 files changed

+420
-8
lines changed

CMakeLists.txt

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "DragonFly")
3030
set(DragonFly TRUE CACHE BOOL "..." FORCE)
3131
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "SunOS")
3232
set(SunOS TRUE CACHE BOOL "..." FORCE)
33+
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Haiku")
34+
set(Haiku TRUE CACHE BOOL "..." FORCE)
3335
elseif(NOT APPLE AND NOT WIN32)
3436
message(FATAL_ERROR "Unsupported platform: ${CMAKE_SYSTEM_NAME}")
3537
endif()
@@ -139,7 +141,7 @@ set(WARNING_FLAGS "-Wall -Wextra -Wconversion -Werror=uninitialized -Werror=retu
139141
set(CMAKE_C_STANDARD 11)
140142
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${WARNING_FLAGS} -Werror=incompatible-pointer-types -Werror=implicit-function-declaration -Werror=int-conversion")
141143

142-
if(WIN32 OR ENABLE_DIRECTX_HEADERS)
144+
if(WIN32 OR HAIKU OR ENABLE_DIRECTX_HEADERS)
143145
enable_language(CXX)
144146
set(CMAKE_CXX_STANDARD 17)
145147
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${WARNING_FLAGS}")
@@ -1088,6 +1090,74 @@ elseif(SunOS)
10881090
src/util/platform/FFPlatform_unix.c
10891091
src/util/binary_linux.c
10901092
)
1093+
elseif(Haiku)
1094+
list(APPEND LIBFASTFETCH_SRC
1095+
src/common/io/io_unix.c
1096+
src/common/netif/netif_haiku.c
1097+
src/common/networking_linux.c
1098+
src/common/processing_linux.c
1099+
src/detection/battery/battery_nosupport.c
1100+
src/detection/bios/bios_nosupport.c
1101+
src/detection/board/board_nosupport.c
1102+
src/detection/bootmgr/bootmgr_nosupport.c
1103+
src/detection/brightness/brightness_nosupport.c
1104+
src/detection/btrfs/btrfs_nosupport.c
1105+
src/detection/chassis/chassis_nosupport.c
1106+
src/detection/cpu/cpu_nosupport.c
1107+
src/detection/cpucache/cpucache_nosupport.c
1108+
src/detection/cpuusage/cpuusage_nosupport.c
1109+
src/detection/cursor/cursor_nosupport.c
1110+
src/detection/bluetooth/bluetooth_nosupport.c
1111+
src/detection/bluetoothradio/bluetoothradio_nosupport.c
1112+
src/detection/disk/disk_nosupport.c
1113+
src/detection/dns/dns_linux.c
1114+
src/detection/physicaldisk/physicaldisk_nosupport.c
1115+
src/detection/physicalmemory/physicalmemory_nosupport.c
1116+
src/detection/diskio/diskio_nosupport.c
1117+
src/detection/displayserver/displayserver_haiku.cpp
1118+
src/detection/font/font_haiku.cpp
1119+
src/detection/gpu/gpu_nosupport.c
1120+
src/detection/gpu/gpu_pci.c
1121+
src/detection/gtk_qt/gtk.c
1122+
src/detection/host/host_nosupport.c
1123+
src/detection/icons/icons_nosupport.c
1124+
src/detection/initsystem/initsystem_nosupport.c
1125+
src/detection/keyboard/keyboard_nosupport.c
1126+
src/detection/libc/libc_nosupport.c
1127+
src/detection/lm/lm_nosupport.c
1128+
src/detection/loadavg/loadavg_nosupport.c
1129+
src/detection/locale/locale_linux.c
1130+
src/detection/localip/localip_linux.c
1131+
src/detection/gamepad/gamepad_nosupport.c
1132+
src/detection/media/media_nosupport.c
1133+
src/detection/memory/memory_haiku.c
1134+
src/detection/mouse/mouse_nosupport.c
1135+
src/detection/netio/netio_nosupport.c
1136+
src/detection/opengl/opengl_linux.c
1137+
src/detection/os/os_uname.c
1138+
src/detection/packages/packages_haiku.c
1139+
src/detection/poweradapter/poweradapter_nosupport.c
1140+
src/detection/processes/processes_haiku.c
1141+
src/detection/gtk_qt/qt.c
1142+
src/detection/sound/sound_nosupport.c
1143+
src/detection/swap/swap_haiku.c
1144+
src/detection/terminalfont/terminalfont_linux.c
1145+
src/detection/terminalshell/terminalshell_linux.c
1146+
src/detection/terminalsize/terminalsize_linux.c
1147+
src/detection/theme/theme_nosupport.c
1148+
src/detection/tpm/tpm_nosupport.c
1149+
src/detection/uptime/uptime_haiku.c
1150+
src/detection/users/users_linux.c
1151+
src/detection/wallpaper/wallpaper_nosupport.c
1152+
src/detection/wifi/wifi_nosupport.c
1153+
src/detection/wm/wm_nosupport.c
1154+
src/detection/de/de_nosupport.c
1155+
src/detection/wmtheme/wmtheme_nosupport.c
1156+
src/detection/camera/camera_nosupport.c
1157+
src/detection/zpool/zpool_nosupport.c
1158+
src/util/platform/FFPlatform_unix.c
1159+
src/util/binary_linux.c
1160+
)
10911161
endif()
10921162

10931163
if(ENABLE_DIRECTX_HEADERS)
@@ -1534,6 +1604,11 @@ elseif(ANDROID)
15341604
)
15351605
endif()
15361606
endif()
1607+
elseif(Haiku)
1608+
target_link_libraries(libfastfetch
1609+
PRIVATE "network"
1610+
PRIVATE "be"
1611+
)
15371612
endif()
15381613

15391614
target_include_directories(libfastfetch

src/common/io/io_unix.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ void listFilesRecursively(uint32_t baseLength, FFstrbuf* folder, uint8_t indenta
310310
continue;
311311

312312
bool isDir = false;
313-
#ifndef __sun
313+
#if !defined(__sun) && !defined(__HAIKU__)
314314
if(entry->d_type != DT_UNKNOWN && entry->d_type != DT_LNK)
315315
isDir = entry->d_type == DT_DIR;
316316
else

src/common/netif/netif_haiku.c

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#include "netif.h"
2+
#include "common/io/io.h"
3+
#include "util/mallocHelper.h"
4+
5+
#include <arpa/inet.h>
6+
#include <net/if.h>
7+
#include <net/route.h>
8+
#include <sys/socket.h>
9+
#include <sys/sockio.h>
10+
#include <stdio.h>
11+
12+
// losely based on Haiku's src/bin/network/route/route.cpp
13+
14+
bool ffNetifGetDefaultRouteImpl(char iface[IF_NAMESIZE + 1], uint32_t* ifIndex)
15+
{
16+
// TODO: AF_INET6
17+
FF_AUTO_CLOSE_FD int pfRoute = socket(AF_INET, SOCK_RAW, AF_INET);
18+
if (pfRoute < 0)
19+
return false;
20+
21+
struct ifconf config;
22+
config.ifc_len = sizeof(config.ifc_value);
23+
if (ioctl(pfRoute, SIOCGRTSIZE, &config, sizeof(struct ifconf)) < 0)
24+
return false;
25+
26+
int size = config.ifc_value;
27+
if (size == 0)
28+
return false;
29+
30+
FF_AUTO_FREE void *buffer = malloc(size);
31+
if (buffer == NULL) {
32+
return false;
33+
}
34+
35+
config.ifc_len = size;
36+
config.ifc_buf = buffer;
37+
if (ioctl(pfRoute, SIOCGRTTABLE, &config, sizeof(struct ifconf)) < 0)
38+
return false;
39+
40+
struct ifreq *interface = (struct ifreq*)buffer;
41+
struct ifreq *end = (struct ifreq*)((uint8_t*)buffer + size);
42+
43+
while (interface < end) {
44+
if (interface->ifr_route.flags & RTF_DEFAULT) {
45+
strlcpy(iface, interface->ifr_name, IF_NAMESIZE);
46+
*ifIndex = if_nametoindex(interface->ifr_name);
47+
return true;
48+
}
49+
50+
size_t addressSize = 0;
51+
if (interface->ifr_route.destination != NULL)
52+
addressSize += interface->ifr_route.destination->sa_len;
53+
if (interface->ifr_route.mask != NULL)
54+
addressSize += interface->ifr_route.mask->sa_len;
55+
if (interface->ifr_route.gateway != NULL)
56+
addressSize += interface->ifr_route.gateway->sa_len;
57+
58+
interface = (struct ifreq*)((addr_t)interface + IF_NAMESIZE
59+
+ sizeof(struct route_entry) + addressSize);
60+
}
61+
62+
return false;
63+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
extern "C" {
2+
#include "displayserver.h"
3+
#include "common/settings.h"
4+
#include "common/processing.h"
5+
}
6+
7+
#include <math.h>
8+
9+
#include <Application.h>
10+
#include <Screen.h>
11+
12+
extern "C" void ffConnectDisplayServerImpl(FFDisplayServerResult* ds);
13+
14+
static void detectDisplays(FFDisplayServerResult* ds)
15+
{
16+
// We need a valid be_app to query the app_server here.
17+
BApplication app("application/x-vnd.fastfetch-cli-fastfetch");
18+
BScreen s{}; // default screen is the main one
19+
bool main = true;
20+
21+
do
22+
{
23+
if (!s.IsValid())
24+
continue;
25+
26+
display_mode mode;
27+
if (s.GetMode(&mode) != B_OK)
28+
continue;
29+
30+
FF_STRBUF_AUTO_DESTROY name = ffStrbufCreateA(128);
31+
monitor_info monitor;
32+
// WARNING: This is experimental new Haiku API
33+
status_t err = s.GetMonitorInfo(&monitor);
34+
if (err == B_OK) {
35+
ffStrbufSetF(&name, "%s %s", monitor.vendor, monitor.name);
36+
}
37+
38+
uint32_t width = (uint32_t) s.Frame().Width() + 1;
39+
uint32_t height = (uint32_t) (uint32_t)s.Frame().Height() + 1;
40+
double scaleFactor = (double) 1.0;
41+
ffdsAppendDisplay(ds,
42+
width,
43+
height,
44+
(double)mode.timing.pixel_clock * 1000 / (mode.timing.v_total * mode.timing.h_total),
45+
(uint32_t) (width / scaleFactor + .5),
46+
(uint32_t) (height / scaleFactor + .5),
47+
0,
48+
0,
49+
0,
50+
0,
51+
&name,
52+
FF_DISPLAY_TYPE_UNKNOWN,
53+
main,
54+
s.ID().id,
55+
0,
56+
0,
57+
"BScreen"
58+
);
59+
main = false;
60+
} while (s.SetToNext() == B_OK);
61+
62+
return;
63+
}
64+
65+
void ffConnectDisplayServerImpl(FFDisplayServerResult* ds)
66+
{
67+
ffStrbufSetStatic(&ds->wmProcessName, "app_server");
68+
ffStrbufSetStatic(&ds->wmPrettyName, "Application Server");
69+
ffStrbufSetStatic(&ds->dePrettyName, "Application Kit");
70+
71+
detectDisplays(ds);
72+
}

src/detection/dns/dns_linux.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,15 @@
44
#include "util/mallocHelper.h"
55
#include "util/stringUtils.h"
66

7+
#ifdef __HAIKU__
8+
#define RESOLV_CONF "/system/settings/network/resolv.conf"
9+
#else
10+
#define RESOLV_CONF "/etc/resolv.conf"
11+
#endif
12+
713
const char* ffDetectDNS(FFDNSOptions* options, FFlist* results)
814
{
9-
FF_AUTO_CLOSE_FILE FILE* file = fopen(FASTFETCH_TARGET_DIR_ROOT "/etc/resolv.conf", "r");
15+
FF_AUTO_CLOSE_FILE FILE* file = fopen(FASTFETCH_TARGET_DIR_ROOT RESOLV_CONF, "r");
1016
if (!file)
1117
return "fopen (" FASTFETCH_TARGET_DIR_ROOT "/etc/resolv.conf) failed";
1218

src/detection/font/font.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ typedef struct FFFontResult
1010
* Linux / BSD: Qt, GTK2, GTK3, GTK4
1111
* MacOS: System, User, System Mono, User Mono
1212
* Windows: Caption, Menu, Message, Status
13+
* Haiku: Plain, Menu, Bold, Mono
1314
* Other: Unset, Unset, Unset, Unset
1415
*/
1516
FFstrbuf fonts[FF_DETECT_FONT_NUM_FONTS];

src/detection/font/font_haiku.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
extern "C" {
2+
#include "common/font.h"
3+
#include "common/parsing.h"
4+
#include "font.h"
5+
}
6+
7+
#include <Application.h>
8+
#include <Font.h>
9+
#include <Menu.h>
10+
11+
extern "C" {
12+
const char* ffDetectFontImpl(FFFontResult* result);
13+
}
14+
15+
static void generateString(FFFontResult* font)
16+
{
17+
const char* types[] = { "Plain", "Menu", "Bold", "Mono" };
18+
for(uint32_t i = 0; i < ARRAY_SIZE(types); ++i)
19+
{
20+
if(i == 0 || !ffStrbufEqual(&font->fonts[i - 1], &font->fonts[i]))
21+
{
22+
if(i > 0)
23+
ffStrbufAppendS(&font->display, "], ");
24+
ffStrbufAppendF(&font->display, "%s [%s", font->fonts[i].chars, types[i]);
25+
}
26+
else
27+
{
28+
ffStrbufAppendS(&font->display, " / ");
29+
ffStrbufAppendS(&font->display, types[i]);
30+
}
31+
}
32+
ffStrbufAppendC(&font->display, ']');
33+
}
34+
35+
const char* ffDetectFontImpl(FFFontResult* result)
36+
{
37+
struct menu_info menuInfo;
38+
const BFont *f;
39+
// We need a valid be_app to query the app_server here.
40+
BApplication app("application/x-vnd.fastfetch-cli-fastfetch");
41+
42+
if ((f = be_plain_font) != NULL)
43+
{
44+
f->GetFamilyAndStyle(&menuInfo.f_family, &menuInfo.f_style);
45+
ffStrbufAppendF(&result->fonts[0], "%s %s (%dpt)", menuInfo.f_family, menuInfo.f_style, (int)f->Size());
46+
}
47+
if (get_menu_info(&menuInfo) == B_OK)
48+
{
49+
ffStrbufAppendF(&result->fonts[1], "%s %s (%dpt)", menuInfo.f_family, menuInfo.f_style, (int)menuInfo.font_size);
50+
}
51+
if ((f = be_bold_font) != NULL)
52+
{
53+
f->GetFamilyAndStyle(&menuInfo.f_family, &menuInfo.f_style);
54+
ffStrbufAppendF(&result->fonts[2], "%s %s (%dpt)", menuInfo.f_family, menuInfo.f_style, (int)f->Size());
55+
}
56+
if ((f = be_fixed_font) != NULL)
57+
{
58+
f->GetFamilyAndStyle(&menuInfo.f_family, &menuInfo.f_style);
59+
ffStrbufAppendF(&result->fonts[3], "%s %s (%dpt)", menuInfo.f_family, menuInfo.f_style, (int)f->Size());
60+
}
61+
62+
generateString(result);
63+
64+
return NULL;
65+
}

0 commit comments

Comments
 (0)