2023-02-27 15:02:21 +01:00
# define WLR_USE_UNSTABLE
# include <unistd.h>
2023-04-27 00:44:12 +02:00
# include <hyprland/src/Compositor.hpp>
2024-03-20 04:02:10 +01:00
# include <hyprland/src/desktop/Window.hpp>
2023-04-27 00:44:12 +02:00
# include <hyprland/src/config/ConfigManager.hpp>
2023-02-27 15:02:21 +01:00
# include "globals.hpp"
// Methods
2024-03-02 18:10:59 +01:00
inline CFunctionHook * g_pMouseMotionHook = nullptr ;
inline CFunctionHook * g_pSurfaceSizeHook = nullptr ;
inline CFunctionHook * g_pSurfaceDamageHook = nullptr ;
inline CFunctionHook * g_pWLSurfaceDamageHook = nullptr ;
2023-09-28 23:21:37 +02:00
typedef void ( * origMotion ) ( wlr_seat * , uint32_t , double , double ) ;
2023-02-27 15:02:21 +01:00
typedef void ( * origSurfaceSize ) ( wlr_xwayland_surface * , int16_t , int16_t , uint16_t , uint16_t ) ;
typedef void ( * origSurfaceDamage ) ( wlr_surface * , pixman_region32_t * ) ;
2024-03-02 18:10:59 +01:00
typedef CRegion ( * origWLSurfaceDamage ) ( CWLSurface * ) ;
2023-02-27 15:02:21 +01:00
// Do NOT change this function.
2023-09-03 16:40:39 +02:00
APICALL EXPORT std : : string PLUGIN_API_VERSION ( ) {
return HYPRLAND_API_VERSION ;
}
2023-02-27 15:02:21 +01:00
2023-09-28 23:21:37 +02:00
void hkNotifyMotion ( wlr_seat * wlr_seat , uint32_t time_msec , double sx , double sy ) {
2024-02-18 16:30:21 +01:00
static auto * const RESX = ( Hyprlang : : INT * const * ) HyprlandAPI : : getConfigValue ( PHANDLE , " plugin:csgo-vulkan-fix:res_w " ) - > getDataStaticPtr ( ) ;
static auto * const RESY = ( Hyprlang : : INT * const * ) HyprlandAPI : : getConfigValue ( PHANDLE , " plugin:csgo-vulkan-fix:res_h " ) - > getDataStaticPtr ( ) ;
static auto * const PCLASS = ( Hyprlang : : STRING const * ) HyprlandAPI : : getConfigValue ( PHANDLE , " plugin:csgo-vulkan-fix:class " ) - > getDataStaticPtr ( ) ;
2023-09-28 23:21:37 +02:00
2023-10-31 18:45:55 +01:00
if ( g_pCompositor - > m_pLastWindow & & g_pCompositor - > m_pLastWindow - > m_szInitialClass = = * PCLASS & & g_pCompositor - > m_pLastMonitor ) {
2023-09-28 23:21:37 +02:00
// fix the coords
2024-02-18 16:30:21 +01:00
sx * = ( * * RESX / g_pCompositor - > m_pLastMonitor - > vecSize . x ) / g_pCompositor - > m_pLastWindow - > m_fX11SurfaceScaledBy ;
sy * = ( * * RESY / g_pCompositor - > m_pLastMonitor - > vecSize . y ) / g_pCompositor - > m_pLastWindow - > m_fX11SurfaceScaledBy ;
2023-09-28 23:21:37 +02:00
}
( * ( origMotion ) g_pMouseMotionHook - > m_pOriginal ) ( wlr_seat , time_msec , sx , sy ) ;
}
2023-02-27 15:02:21 +01:00
void hkSetWindowSize ( wlr_xwayland_surface * surface , int16_t x , int16_t y , uint16_t width , uint16_t height ) {
2024-02-18 16:30:21 +01:00
static auto * const RESX = ( Hyprlang : : INT * const * ) HyprlandAPI : : getConfigValue ( PHANDLE , " plugin:csgo-vulkan-fix:res_w " ) - > getDataStaticPtr ( ) ;
static auto * const RESY = ( Hyprlang : : INT * const * ) HyprlandAPI : : getConfigValue ( PHANDLE , " plugin:csgo-vulkan-fix:res_h " ) - > getDataStaticPtr ( ) ;
static auto * const PCLASS = ( Hyprlang : : STRING const * ) HyprlandAPI : : getConfigValue ( PHANDLE , " plugin:csgo-vulkan-fix:class " ) - > getDataStaticPtr ( ) ;
2023-02-27 15:02:21 +01:00
2023-09-03 16:40:39 +02:00
if ( ! surface ) {
( * ( origSurfaceSize ) g_pSurfaceSizeHook - > m_pOriginal ) ( surface , x , y , width , height ) ;
return ;
}
const auto SURF = surface - > surface ;
const auto PWINDOW = g_pCompositor - > getWindowFromSurface ( SURF ) ;
2023-10-31 18:45:55 +01:00
if ( PWINDOW & & PWINDOW - > m_szInitialClass = = * PCLASS ) {
2024-02-18 16:30:21 +01:00
width = * * RESX ;
height = * * RESY ;
2023-10-20 21:22:37 +02:00
CWLSurface : : surfaceFromWlr ( SURF ) - > m_bFillIgnoreSmall = true ;
2023-02-27 15:02:21 +01:00
}
( * ( origSurfaceSize ) g_pSurfaceSizeHook - > m_pOriginal ) ( surface , x , y , width , height ) ;
}
void hkSurfaceDamage ( wlr_surface * surface , pixman_region32_t * damage ) {
( * ( origSurfaceDamage ) g_pSurfaceDamageHook - > m_pOriginal ) ( surface , damage ) ;
2024-02-18 16:30:21 +01:00
static auto * const PCLASS = ( Hyprlang : : STRING const * ) HyprlandAPI : : getConfigValue ( PHANDLE , " plugin:csgo-vulkan-fix:class " ) - > getDataStaticPtr ( ) ;
2023-02-27 15:02:21 +01:00
2023-10-31 18:45:55 +01:00
const auto SURF = CWLSurface : : surfaceFromWlr ( surface ) ;
2024-03-02 18:06:08 +01:00
if ( SURF & & SURF - > exists ( ) & & SURF - > getWindow ( ) & & SURF - > getWindow ( ) - > m_szInitialClass = = * PCLASS ) {
const auto PMONITOR = g_pCompositor - > getMonitorFromID ( SURF - > getWindow ( ) - > m_iMonitorID ) ;
if ( PMONITOR )
g_pHyprRenderer - > damageMonitor ( PMONITOR ) ;
else
g_pHyprRenderer - > damageWindow ( SURF - > getWindow ( ) ) ;
}
2023-02-27 15:02:21 +01:00
}
2024-03-02 18:10:59 +01:00
CRegion hkWLSurfaceDamage ( CWLSurface * thisptr ) {
2024-03-02 18:15:35 +01:00
const auto RG = ( * ( origWLSurfaceDamage ) g_pWLSurfaceDamageHook - > m_pOriginal ) ( thisptr ) ;
2024-03-02 18:10:59 +01:00
static auto * const PCLASS = ( Hyprlang : : STRING const * ) HyprlandAPI : : getConfigValue ( PHANDLE , " plugin:csgo-vulkan-fix:class " ) - > getDataStaticPtr ( ) ;
if ( thisptr - > exists ( ) & & thisptr - > getWindow ( ) & & thisptr - > getWindow ( ) - > m_szInitialClass = = * PCLASS ) {
const auto PMONITOR = g_pCompositor - > getMonitorFromID ( thisptr - > getWindow ( ) - > m_iMonitorID ) ;
if ( PMONITOR )
g_pHyprRenderer - > damageMonitor ( PMONITOR ) ;
else
g_pHyprRenderer - > damageWindow ( thisptr - > getWindow ( ) ) ;
}
return RG ;
}
2023-02-27 15:02:21 +01:00
APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT ( HANDLE handle ) {
PHANDLE = handle ;
2024-03-19 23:18:47 +01:00
const std : : string HASH = __hyprland_api_get_hash ( ) ;
if ( HASH ! = GIT_COMMIT_HASH ) {
HyprlandAPI : : addNotification ( PHANDLE , " [csgo-vulkan-fix] Failure in initialization: Version mismatch (headers ver is not equal to running hyprland ver) " ,
CColor { 1.0 , 0.2 , 0.2 , 1.0 } , 5000 ) ;
throw std : : runtime_error ( " [vkfix] Version mismatch " ) ;
}
2024-02-18 16:30:21 +01:00
HyprlandAPI : : addConfigValue ( PHANDLE , " plugin:csgo-vulkan-fix:res_w " , Hyprlang : : INT { 1680 } ) ;
HyprlandAPI : : addConfigValue ( PHANDLE , " plugin:csgo-vulkan-fix:res_h " , Hyprlang : : INT { 1050 } ) ;
HyprlandAPI : : addConfigValue ( PHANDLE , " plugin:csgo-vulkan-fix:class " , Hyprlang : : STRING { " cs2 " } ) ;
2023-02-27 15:02:21 +01:00
2024-03-15 15:16:03 +01:00
auto FNS = HyprlandAPI : : findFunctionsByName ( PHANDLE , " wlr_seat_pointer_notify_motion " ) ;
bool success = ! FNS . empty ( ) ;
if ( success )
g_pMouseMotionHook = HyprlandAPI : : createFunctionHook ( PHANDLE , FNS [ 0 ] . address , ( void * ) : : hkNotifyMotion ) ;
FNS = HyprlandAPI : : findFunctionsByName ( PHANDLE , " wlr_xwayland_surface_configure " ) ;
success = success & & ! FNS . empty ( ) ;
if ( success )
g_pSurfaceSizeHook = HyprlandAPI : : createFunctionHook ( PHANDLE , FNS [ 0 ] . address , ( void * ) : : hkSetWindowSize ) ;
FNS = HyprlandAPI : : findFunctionsByName ( PHANDLE , " wlr_surface_get_effective_damage " ) ;
success = success & & ! FNS . empty ( ) ;
if ( success )
g_pSurfaceDamageHook = HyprlandAPI : : createFunctionHook ( PHANDLE , FNS [ 0 ] . address , ( void * ) : : hkSurfaceDamage ) ;
FNS = HyprlandAPI : : findFunctionsByName ( PHANDLE , " logicalDamage " ) ;
for ( auto & r : FNS ) {
2024-03-02 18:10:59 +01:00
if ( ! r . demangled . contains ( " CWLSurface " ) )
continue ;
g_pWLSurfaceDamageHook = HyprlandAPI : : createFunctionHook ( PHANDLE , r . address , ( void * ) : : hkWLSurfaceDamage ) ;
break ;
}
2024-03-15 15:16:03 +01:00
success = success & & g_pWLSurfaceDamageHook - > hook ( ) ;
success = success & & g_pMouseMotionHook - > hook ( ) ;
success = success & & g_pSurfaceSizeHook - > hook ( ) ;
success = success & & g_pSurfaceDamageHook - > hook ( ) ;
2023-02-27 15:02:21 +01:00
2024-03-15 15:16:03 +01:00
if ( success )
2023-10-31 18:45:55 +01:00
HyprlandAPI : : addNotification ( PHANDLE , " [csgo-vulkan-fix] Initialized successfully! (Anything version) " , CColor { 0.2 , 1.0 , 0.2 , 1.0 } , 5000 ) ;
2023-10-29 22:25:17 +01:00
else {
2023-02-27 15:02:21 +01:00
HyprlandAPI : : addNotification ( PHANDLE , " [csgo-vulkan-fix] Failure in initialization (hook failed)! " , CColor { 1.0 , 0.2 , 0.2 , 1.0 } , 5000 ) ;
2023-10-29 22:25:17 +01:00
throw std : : runtime_error ( " [csgo-vk-fix] Hooks failed " ) ;
}
2023-02-27 15:02:21 +01:00
2023-10-31 18:45:55 +01:00
return { " csgo-vulkan-fix " , " A plugin to force specific apps to a fake resolution " , " Vaxry " , " 1.2 " } ;
2023-02-27 15:02:21 +01:00
}
2023-09-03 16:40:39 +02:00
APICALL EXPORT void PLUGIN_EXIT ( ) {
;
2024-03-02 18:15:35 +01:00
}