diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index 75a0c00b..08915074 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -40,7 +40,7 @@ jobs: shell: bash run: | sudo apt-get update - sudo apt-get install --no-install-recommends -y pkg-config libfreetype6-dev libx11-dev libxext-dev libxfixes-dev libgl1-mesa-dev libegl1-mesa-dev + sudo apt-get install --no-install-recommends -y pkg-config libfreetype6-dev libx11-dev libxext-dev libxfixes-dev libxrandr-dev libgl1-mesa-dev libegl1-mesa-dev - name: Install clang-17 Dependencies if: ${{ matrix.compiler == 'clang-17' }} @@ -162,7 +162,7 @@ jobs: wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - sudo apt-add-repository -y "deb http://apt.llvm.org/noble/ llvm-toolchain-noble-22 main" sudo apt-get update - sudo apt-get install -y clang-22 lld-22 llvm-22 gcc-14 pkg-config libfreetype6-dev libx11-dev libxext-dev libxfixes-dev libgl1-mesa-dev libegl1-mesa-dev + sudo apt-get install -y clang-22 lld-22 llvm-22 gcc-14 pkg-config libfreetype6-dev libx11-dev libxext-dev libxfixes-dev libxrandr-dev libgl1-mesa-dev libegl1-mesa-dev # crash callstack symbolizer depends on LLVM sudo ln -s /usr/bin/llvm-symbolizer-22 /usr/bin/llvm-symbolizer - name: Run diff --git a/README.md b/README.md index 0dfb01e9..05403355 100644 --- a/README.md +++ b/README.md @@ -247,6 +247,7 @@ on the system: - `libx11` - `libxext` - `libxfixes` +- `libxrandr` - `libgl` - `libegl` @@ -256,13 +257,13 @@ installed using one of the following commands, depending on your distribution: #### Ubuntu / Debian / Mint ``` -sudo apt install -y libfreetype6-dev libx11-dev libxext-dev libxfixes-dev libgl-dev libegl-dev +sudo apt install -y libfreetype6-dev libx11-dev libxext-dev libxfixes-dev libxrandr-dev libgl-dev libegl-dev ``` #### Arch / Manjaro ``` -sudo pacman -S --needed freetype2 libx11 libxext libxfixes libglvnd +sudo pacman -S --needed freetype2 libx11 libxext libxfixes libxrandr libglvnd ``` ### 3. Building diff --git a/build.sh b/build.sh index dfa98c5a..6ad190be 100755 --- a/build.sh +++ b/build.sh @@ -29,14 +29,14 @@ cc_link="-lpthread -lm -lrt -ldl" cc_link_dll="-fPIC" # --- External Libraries ------------------------------------------------------ -# sudo apt install -y pkg-config libfreetype6-dev libx11-dev libxext-dev libxfixes-dev libgl-dev libegl-dev +# sudo apt install -y pkg-config libfreetype6-dev libx11-dev libxext-dev libxfixes-dev libxrandr-dev libgl-dev libegl-dev if [[ -x "$(command -v pkg-config)" ]]; then cc_font_provider="$(pkg-config --cflags --libs freetype2)" - cc_os_gfx="$(pkg-config --cflags --libs x11 xext xfixes)" + cc_os_gfx="$(pkg-config --cflags --libs x11 xext xfixes xrandr)" cc_render="$(pkg-config --cflags --libs gl egl)" else cc_font_provider="-I/usr/include/freetype2 -lfreetype" - cc_os_gfx="-lX11 -lXext -lXfixes" + cc_os_gfx="-lX11 -lXext -lXfixes -lXrandr" cc_render="-lGL -lEGL" fi diff --git a/src/linux/window_manager/linux_window_manager.c b/src/linux/window_manager/linux_window_manager.c index a7b501a3..cda0a06a 100644 --- a/src/linux/window_manager/linux_window_manager.c +++ b/src/linux/window_manager/linux_window_manager.c @@ -374,11 +374,41 @@ wm_init(void) //- rjf: open im lnx_wm_state->xim = XOpenIM(lnx_wm_state->display, 0, 0, 0); - //- rjf: fill out gfx info + //- rjf: fill out default gfx info lnx_wm_state->gfx_info.double_click_time = 0.5f; lnx_wm_state->gfx_info.caret_blink_time = 0.5f; lnx_wm_state->gfx_info.default_refresh_rate = 60.f; + //- rjf: determine default refresh rate + { + XRRScreenResources *res = XRRGetScreenResourcesCurrent(lnx_wm_state->display, DefaultRootWindow(lnx_wm_state->display)); + for EachIndex(idx, res->noutput) + { + XRROutputInfo *out_info = XRRGetOutputInfo(lnx_wm_state->display, res, res->outputs[idx]); + if(out_info && out_info->connection == RR_Connected && out_info->crtc != None) + { + XRRCrtcInfo *crtc_info = XRRGetCrtcInfo(lnx_wm_state->display, res, out_info->crtc); + if(crtc_info) + { + for EachIndex(mode_idx, res->nmode) + { + if(res->modes[mode_idx].id == crtc_info->mode) + { + XRRModeInfo *mode_info = &res->modes[mode_idx]; + if(mode_info->vTotal != 0 && mode_info->hTotal != 0) + { + lnx_wm_state->gfx_info.default_refresh_rate = (F32)mode_info->dotClock / ((F32)mode_info->hTotal * (F32)mode_info->vTotal); + } + } + } + XRRFreeCrtcInfo(crtc_info); + } + XRRFreeOutputInfo(out_info); + } + } + XRRFreeScreenResources(res); + } + //- rjf: fill out cursors { struct diff --git a/src/linux/window_manager/linux_window_manager.h b/src/linux/window_manager/linux_window_manager.h index 9a4f4622..be652d72 100644 --- a/src/linux/window_manager/linux_window_manager.h +++ b/src/linux/window_manager/linux_window_manager.h @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include