2023-08-07 13:35:19 +02:00
# pragma once
# include <cmath>
2023-08-31 22:52:02 +02:00
# include <csignal>
2023-08-07 13:35:19 +02:00
# include <utility>
# ifndef NDEBUG
# ifdef HYPRLAND_DEBUG
2024-03-03 19:39:20 +01:00
# define HYPRLAND_DEBUG
2023-08-07 13:35:19 +02:00
# define ISDEBUG true
# else
# define ISDEBUG false
# endif
# else
# define ISDEBUG false
# endif
2023-10-10 21:21:57 +02:00
# include "version.h"
2023-08-07 13:35:19 +02:00
# define SPECIAL_WORKSPACE_START (-99)
# define PI 3.14159265358979
2023-09-12 17:46:22 +02:00
# define STRVAL_EMPTY "[[EMPTY]]"
2023-11-12 14:34:42 +01:00
# define WORKSPACE_INVALID -1L
2023-08-07 13:35:19 +02:00
# define LISTENER(name) \
void listener_ # # name ( wl_listener * , void * ) ; \
inline wl_listener listen_ # # name = { . notify = listener_ # # name }
# define DYNLISTENFUNC(name) void listener_##name(void*, void*)
# define DYNLISTENER(name) CHyprWLListener hyprListener_##name
# define DYNMULTILISTENER(name) wl_listener listen_##name
# define VECINRECT(vec, x1, y1, x2, y2) ((vec).x >= (x1) && (vec).x <= (x2) && (vec).y >= (y1) && (vec).y <= (y2))
# define DELTALESSTHAN(a, b, delta) (abs((a) - (b)) < (delta))
# define STICKS(a, b) abs((a) - (b)) < 2
# define HYPRATOM(name) \
{ name , 0 }
# define RASSERT(expr, reason, ...) \
if ( ! ( expr ) ) { \
2023-09-06 12:51:36 +02:00
Debug : : log ( CRIT , " \n ========================================================================================== \n ASSERTION FAILED! \n \n {} \n \n at: line {} in {} " , \
2023-09-20 09:26:20 +02:00
std : : format ( reason , # # __VA_ARGS__ ) , __LINE__ , \
2023-12-06 23:54:56 +01:00
( [ ] ( ) constexpr - > std : : string { return std : : string ( __FILE__ ) . substr ( std : : string ( __FILE__ ) . find_last_of ( ' / ' ) + 1 ) ; } ) ( ) ) ; \
2023-08-07 13:35:19 +02:00
printf ( " Assertion failed! See the log in /tmp/hypr/hyprland.log for more info. " ) ; \
2023-08-31 22:52:02 +02:00
raise ( SIGABRT ) ; \
2023-08-07 13:35:19 +02:00
}
# define ASSERT(expr) RASSERT(expr, "?")
2023-09-20 17:25:03 +02:00
// absolutely ridiculous formatter spec parsing
# define FORMAT_PARSE(specs__, type__) \
template < typename FormatContext > \
constexpr auto parse ( FormatContext & ctx ) { \
auto it = ctx . begin ( ) ; \
for ( ; it ! = ctx . end ( ) & & * it ! = ' } ' ; it + + ) { \
switch ( * it ) { specs__ default : throw std : : format_error ( " invalid format specification " ) ; } \
} \
return it ; \
}
# define FORMAT_FLAG(spec__, flag__) \
2023-12-06 23:54:56 +01:00
case spec__ : ( flag__ ) = true ; break ;
2023-09-20 17:25:03 +02:00
# define FORMAT_NUMBER(buf__) \
case ' 0 ' : \
case ' 1 ' : \
case ' 2 ' : \
case ' 3 ' : \
case ' 4 ' : \
case ' 5 ' : \
case ' 6 ' : \
case ' 7 ' : \
case ' 8 ' : \
2023-12-06 23:54:56 +01:00
case ' 9 ' : ( buf__ ) . push_back ( * it ) ; break ;
2023-09-20 17:25:03 +02:00
2023-08-07 13:35:19 +02:00
# if ISDEBUG
# define UNREACHABLE() \
{ \
Debug : : log ( CRIT , " \n \n MEMORY CORRUPTED: Unreachable failed! (Reached an unreachable position, memory corruption!!!) " ) ; \
2023-08-31 22:52:02 +02:00
raise ( SIGABRT ) ; \
2023-08-07 13:35:19 +02:00
}
# else
# define UNREACHABLE() std::unreachable();
# endif