init
This commit is contained in:
26
flake.lock
generated
Normal file
26
flake.lock
generated
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1764947035,
|
||||||
|
"narHash": "sha256-EYHSjVM4Ox4lvCXUMiKKs2vETUSL5mx+J2FfutM7T9w=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "a672be65651c80d3f592a89b3945466584a22069",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
91
flake.nix
Normal file
91
flake.nix
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
{
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "nixpkgs/nixpkgs-unstable";
|
||||||
|
};
|
||||||
|
outputs = {nixpkgs, ...}: let
|
||||||
|
system = "x86_64-linux";
|
||||||
|
pkgs = nixpkgs.legacyPackages.${system};
|
||||||
|
debugGhcOptions = pkgs.lib.concatStringsSep " " (debugGhcFlags ++ commonGhcFlags);
|
||||||
|
debugGhcFlags =
|
||||||
|
[
|
||||||
|
"-O0"
|
||||||
|
"-Wall"
|
||||||
|
"-Widentities"
|
||||||
|
"-Wincomplete-record-updates"
|
||||||
|
"-Wincomplete-uni-patterns"
|
||||||
|
# "-Wmissing-export-lists"
|
||||||
|
"-Wmissing-home-modules"
|
||||||
|
"-Wpartial-fields"
|
||||||
|
"-Wredundant-constraints"
|
||||||
|
]
|
||||||
|
++ commonGhcFlags;
|
||||||
|
haddockOptions = pkgs.lib.concatStringsSep " " haddockFlags;
|
||||||
|
haddockFlags = [
|
||||||
|
"--html"
|
||||||
|
"--odir docs"
|
||||||
|
"--optghc=-i./src"
|
||||||
|
"src/Game.hs"
|
||||||
|
];
|
||||||
|
releaseGhcOptions = pkgs.lib.concatStringsSep " " (releaseGhcFlags ++ commonGhcFlags);
|
||||||
|
releaseGhcFlags =
|
||||||
|
[
|
||||||
|
"-O2"
|
||||||
|
"-threaded"
|
||||||
|
"-rtsopts"
|
||||||
|
"-with-rtsopts=-N"
|
||||||
|
"-main-is Main"
|
||||||
|
]
|
||||||
|
++ commonGhcFlags;
|
||||||
|
noHaddockOptions = "";
|
||||||
|
commonGhcFlags = [
|
||||||
|
"-i./src"
|
||||||
|
"-threaded"
|
||||||
|
"-rtsopts"
|
||||||
|
"-with-rtsopts=-N"
|
||||||
|
"-main-is Main"
|
||||||
|
];
|
||||||
|
ghcPackages = p: [
|
||||||
|
];
|
||||||
|
buildDeps = [
|
||||||
|
pkgs.pkg-config
|
||||||
|
pkgs.wayland-protocols
|
||||||
|
pkgs.wayland-scanner
|
||||||
|
|
||||||
|
pkgs.egl-wayland
|
||||||
|
pkgs.libGL
|
||||||
|
pkgs.libxkbcommon
|
||||||
|
pkgs.wayland
|
||||||
|
pkgs.xorg.libX11
|
||||||
|
pkgs.xorg.libXcursor
|
||||||
|
pkgs.xorg.libXi
|
||||||
|
pkgs.xorg.libXrandr
|
||||||
|
];
|
||||||
|
in {
|
||||||
|
packages.${system} = {
|
||||||
|
debug = pkgs.callPackage ./package.nix {
|
||||||
|
ghcOptions = debugGhcOptions;
|
||||||
|
haddockOptions = noHaddockOptions;
|
||||||
|
inherit ghcPackages;
|
||||||
|
inherit buildDeps;
|
||||||
|
};
|
||||||
|
release = pkgs.callPackage ./package.nix {
|
||||||
|
ghcOptions = releaseGhcOptions;
|
||||||
|
haddockOptions = noHaddockOptions;
|
||||||
|
inherit ghcPackages;
|
||||||
|
inherit buildDeps;
|
||||||
|
};
|
||||||
|
docs = pkgs.callPackage ./package.nix {
|
||||||
|
ghcOptions = "--version";
|
||||||
|
inherit haddockOptions;
|
||||||
|
inherit ghcPackages;
|
||||||
|
inherit buildDeps;
|
||||||
|
};
|
||||||
|
default = pkgs.callPackage ./package.nix {
|
||||||
|
ghcOptions = releaseGhcOptions;
|
||||||
|
inherit haddockOptions;
|
||||||
|
inherit ghcPackages;
|
||||||
|
inherit buildDeps;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
14040
lib/RGFW.h
Normal file
14040
lib/RGFW.h
Normal file
File diff suppressed because it is too large
Load Diff
64
package.nix
Normal file
64
package.nix
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
{
|
||||||
|
buildDeps,
|
||||||
|
haskellPackages,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
stdenv,
|
||||||
|
ghcOptions,
|
||||||
|
haddockOptions,
|
||||||
|
ghcPackages,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
pname = "hs-rgfw";
|
||||||
|
version = "0.1.0";
|
||||||
|
src = ./.;
|
||||||
|
nativeBuildInputs =
|
||||||
|
[
|
||||||
|
(haskellPackages.ghcWithPackages ghcPackages)
|
||||||
|
]
|
||||||
|
++ buildDeps;
|
||||||
|
buildInputs =
|
||||||
|
[
|
||||||
|
]
|
||||||
|
++ buildDeps;
|
||||||
|
configurePhase = ''
|
||||||
|
export PKG_CONFIG_PATH=/run/current-system/sw/lib/pkgconfig
|
||||||
|
|
||||||
|
mkdir ccode
|
||||||
|
wayland-scanner public-code ${pkgs.wayland-protocols}/share/wayland-protocols/stable/xdg-shell/xdg-shell.xml ./ccode/xdg-shell.c
|
||||||
|
wayland-scanner public-code ${pkgs.wayland-protocols}/share/wayland-protocols/staging/xdg-toplevel-icon/xdg-toplevel-icon-v1.xml ./ccode/xdg-toplevel-icon-v1.c
|
||||||
|
wayland-scanner public-code ${pkgs.wayland-protocols}/share/wayland-protocols/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml ./ccode/xdg-decoration-unstable-v1.c
|
||||||
|
wayland-scanner public-code ${pkgs.wayland-protocols}/share/wayland-protocols/unstable/relative-pointer/relative-pointer-unstable-v1.xml ./ccode/relative-pointer-unstable-v1.c
|
||||||
|
wayland-scanner public-code ${pkgs.wayland-protocols}/share/wayland-protocols/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml ./ccode/pointer-constraints-unstable-v1.c
|
||||||
|
wayland-scanner public-code ${pkgs.wayland-protocols}/share/wayland-protocols/unstable/xdg-output/xdg-output-unstable-v1.xml ./ccode/xdg-output-unstable-v1.c
|
||||||
|
|
||||||
|
mkdir headers
|
||||||
|
wayland-scanner client-header ${pkgs.wayland-protocols}/share/wayland-protocols/stable/xdg-shell/xdg-shell.xml ./headers/xdg-shell.h
|
||||||
|
wayland-scanner client-header ${pkgs.wayland-protocols}/share/wayland-protocols/staging/xdg-toplevel-icon/xdg-toplevel-icon-v1.xml ./headers/xdg-toplevel-icon-v1.h
|
||||||
|
wayland-scanner client-header ${pkgs.wayland-protocols}/share/wayland-protocols/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml ./headers/xdg-decoration-unstable-v1.h
|
||||||
|
wayland-scanner client-header ${pkgs.wayland-protocols}/share/wayland-protocols/unstable/relative-pointer/relative-pointer-unstable-v1.xml ./headers/relative-pointer-unstable-v1.h
|
||||||
|
wayland-scanner client-header ${pkgs.wayland-protocols}/share/wayland-protocols/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml ./headers/pointer-constraints-unstable-v1.h
|
||||||
|
wayland-scanner client-header ${pkgs.wayland-protocols}/share/wayland-protocols/unstable/xdg-output/xdg-output-unstable-v1.xml ./headers/xdg-output-unstable-v1.h
|
||||||
|
'';
|
||||||
|
buildPhase = ''
|
||||||
|
mkdir src/lib
|
||||||
|
cp lib/* src/lib/
|
||||||
|
cp ccode/*.c ./
|
||||||
|
ghc ${ghcOptions} ./src/Main.hs -o ./Main $(pkg-config --cflags --libs gl wayland-client wayland-egl wayland-cursor xkbcommon x11 xcursor xrandr xi) -I./headers/ $(ls *.c)
|
||||||
|
mkdir ./docs
|
||||||
|
haddock ${haddockOptions}
|
||||||
|
'';
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out/bin
|
||||||
|
cp ./Main $out/bin/hs-rgfw
|
||||||
|
cp ./docs $out/docs -r
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
homepage = "https://mtgmonkey.net";
|
||||||
|
license = lib.licenses.bsd3;
|
||||||
|
mainProgram = "hs-rgfw";
|
||||||
|
platforms = ["x86_64-linux"];
|
||||||
|
};
|
||||||
|
}
|
||||||
121
src/Main.hs
Normal file
121
src/Main.hs
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
{-# LANGUAGE CApiFFI #-}
|
||||||
|
|
||||||
|
module Main (main) where
|
||||||
|
|
||||||
|
import Data.Bits (shiftL, (.|.))
|
||||||
|
import Foreign
|
||||||
|
import Foreign.C.String
|
||||||
|
import Foreign.C.Types
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- main
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
window <- withCString "a window" (\name ->
|
||||||
|
rgfwCreateWindow
|
||||||
|
name
|
||||||
|
0
|
||||||
|
0
|
||||||
|
800
|
||||||
|
600
|
||||||
|
$ mkWindowFlags
|
||||||
|
[ WindowCenter
|
||||||
|
, WindowNoResize
|
||||||
|
, WindowOpenGL
|
||||||
|
]
|
||||||
|
)
|
||||||
|
let loop = do
|
||||||
|
putStrLn $ show window
|
||||||
|
putStrLn
|
||||||
|
$ show
|
||||||
|
$ mkWindowFlags
|
||||||
|
[ WindowCenter
|
||||||
|
, WindowNoResize
|
||||||
|
, WindowOpenGL
|
||||||
|
]
|
||||||
|
shouldClose <- rgfwWindowShouldClose window
|
||||||
|
if 0 == shouldClose
|
||||||
|
then return ()
|
||||||
|
else loop
|
||||||
|
loop
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- Haskell-ier abstractions
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
data WindowFlags
|
||||||
|
= WindowNoBorder
|
||||||
|
| WindowNoResize
|
||||||
|
| WindowAllowDND
|
||||||
|
| WindowHideMouse
|
||||||
|
| WindowFullscreen
|
||||||
|
| WindowTransparent
|
||||||
|
| WindowCenter
|
||||||
|
| WindowRawMouse
|
||||||
|
| WindowScaleToMonitor
|
||||||
|
| WindowHide
|
||||||
|
| WindowMaximize
|
||||||
|
| WindowCenterCursor
|
||||||
|
| WindowFloating
|
||||||
|
| WindowFocusOnShow
|
||||||
|
| WindowMinimize
|
||||||
|
| WindowFocus
|
||||||
|
| WindowOpenGL
|
||||||
|
| WindowEGL
|
||||||
|
| WindowedFullscreen
|
||||||
|
|
||||||
|
mkWindowFlags :: [WindowFlags] -> RGFWwindowFlags
|
||||||
|
mkWindowFlags [] = 0
|
||||||
|
mkWindowFlags (flag:flags) =
|
||||||
|
let
|
||||||
|
shift =
|
||||||
|
case flag of
|
||||||
|
WindowNoBorder -> 0
|
||||||
|
WindowNoResize -> 1
|
||||||
|
WindowAllowDND -> 2
|
||||||
|
WindowHideMouse -> 3
|
||||||
|
WindowFullscreen -> 4
|
||||||
|
WindowTransparent -> 5
|
||||||
|
WindowCenter -> 6
|
||||||
|
WindowRawMouse -> 7
|
||||||
|
WindowScaleToMonitor -> 8
|
||||||
|
WindowHide -> 9
|
||||||
|
WindowMaximize -> 10
|
||||||
|
WindowCenterCursor -> 11
|
||||||
|
WindowFloating -> 12
|
||||||
|
WindowFocusOnShow -> 13
|
||||||
|
WindowMinimize -> 14
|
||||||
|
WindowFocus -> 15
|
||||||
|
WindowOpenGL -> 17
|
||||||
|
WindowEGL -> 18
|
||||||
|
_ -> 19 -- TODO fix this silent error, implement windowedFullscreen
|
||||||
|
in
|
||||||
|
(shiftL 1 shift) .|. (mkWindowFlags flags)
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
-- directly from RFGW.h
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
-- RGFWindow
|
||||||
|
data RGFWwindow
|
||||||
|
-- ptr
|
||||||
|
type RGFWwindowPtr = Ptr RGFWwindow
|
||||||
|
-- flags to create
|
||||||
|
type RGFWwindowFlags = Word32
|
||||||
|
|
||||||
|
type RGFWbool = CUInt
|
||||||
|
|
||||||
|
foreign import capi "lib/RGFW.h RGFW_createWindow" rgfwCreateWindow
|
||||||
|
:: CString
|
||||||
|
-> Int32
|
||||||
|
-> Int32
|
||||||
|
-> Int32
|
||||||
|
-> Int32
|
||||||
|
-> RGFWwindowFlags
|
||||||
|
-> IO RGFWwindowPtr
|
||||||
|
|
||||||
|
foreign import capi "lib/RGFW.h RGFW_window_shouldClose" rgfwWindowShouldClose
|
||||||
|
:: RGFWwindowPtr
|
||||||
|
-> IO RGFWbool
|
||||||
Reference in New Issue
Block a user