mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-10-06 16:05:42 +00:00
os -> wm; *_w32_ -> w32_*_, *_lnx_ -> lnx_*_
This commit is contained in:
+33
-33
@@ -71,7 +71,7 @@ os_lnx_file_properties_from_stat(struct stat *s)
|
||||
internal void
|
||||
os_lnx_safe_call_sig_handler(int x)
|
||||
{
|
||||
OS_LNX_SafeCallChain *chain = os_lnx_safe_call_chain;
|
||||
LNX_SafeCallChain *chain = os_lnx_safe_call_chain;
|
||||
if(chain != 0 && chain->fail_handler != 0)
|
||||
{
|
||||
chain->fail_handler(chain->ptr);
|
||||
@@ -82,10 +82,10 @@ os_lnx_safe_call_sig_handler(int x)
|
||||
////////////////////////////////
|
||||
//~ rjf: Entities
|
||||
|
||||
internal OS_LNX_Entity *
|
||||
os_lnx_entity_alloc(OS_LNX_EntityKind kind)
|
||||
internal LNX_Entity *
|
||||
os_lnx_entity_alloc(LNX_EntityKind kind)
|
||||
{
|
||||
OS_LNX_Entity *entity = 0;
|
||||
LNX_Entity *entity = 0;
|
||||
DeferLoop(pthread_mutex_lock(&os_lnx_state.entity_mutex),
|
||||
pthread_mutex_unlock(&os_lnx_state.entity_mutex))
|
||||
{
|
||||
@@ -96,7 +96,7 @@ os_lnx_entity_alloc(OS_LNX_EntityKind kind)
|
||||
}
|
||||
else
|
||||
{
|
||||
entity = push_array_no_zero(os_lnx_state.entity_arena, OS_LNX_Entity, 1);
|
||||
entity = push_array_no_zero(os_lnx_state.entity_arena, LNX_Entity, 1);
|
||||
}
|
||||
}
|
||||
MemoryZeroStruct(entity);
|
||||
@@ -105,7 +105,7 @@ os_lnx_entity_alloc(OS_LNX_EntityKind kind)
|
||||
}
|
||||
|
||||
internal void
|
||||
os_lnx_entity_release(OS_LNX_Entity *entity)
|
||||
os_lnx_entity_release(LNX_Entity *entity)
|
||||
{
|
||||
DeferLoop(pthread_mutex_lock(&os_lnx_state.entity_mutex),
|
||||
pthread_mutex_unlock(&os_lnx_state.entity_mutex))
|
||||
@@ -120,7 +120,7 @@ os_lnx_entity_release(OS_LNX_Entity *entity)
|
||||
internal void *
|
||||
os_lnx_thread_entry_point(void *ptr)
|
||||
{
|
||||
OS_LNX_Entity *entity = (OS_LNX_Entity *)ptr;
|
||||
LNX_Entity *entity = (LNX_Entity *)ptr;
|
||||
ThreadEntryPointFunctionType *func = entity->thread.func;
|
||||
void *thread_ptr = entity->thread.ptr;
|
||||
supplement_thread_base_entry_point(func, thread_ptr);
|
||||
@@ -353,7 +353,7 @@ set_platform_thread_name(String8 name)
|
||||
internal Thread
|
||||
thread_launch(ThreadEntryPointFunctionType *f, void *p)
|
||||
{
|
||||
OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Thread);
|
||||
LNX_Entity *entity = os_lnx_entity_alloc(LNX_EntityKind_Thread);
|
||||
entity->thread.func = f;
|
||||
entity->thread.ptr = p;
|
||||
{
|
||||
@@ -372,7 +372,7 @@ internal B32
|
||||
thread_join(Thread thread, U64 endt_us)
|
||||
{
|
||||
if(MemoryIsZeroStruct(&thread)) { return 0; }
|
||||
OS_LNX_Entity *entity = (OS_LNX_Entity *)thread.u64[0];
|
||||
LNX_Entity *entity = (LNX_Entity *)thread.u64[0];
|
||||
int join_result = pthread_join(entity->thread.handle, 0);
|
||||
B32 result = (join_result == 0);
|
||||
os_lnx_entity_release(entity);
|
||||
@@ -383,7 +383,7 @@ internal void
|
||||
thread_detach(Thread thread)
|
||||
{
|
||||
if(MemoryIsZeroStruct(&thread)) { return; }
|
||||
OS_LNX_Entity *entity = (OS_LNX_Entity *)thread.u64[0];
|
||||
LNX_Entity *entity = (LNX_Entity *)thread.u64[0];
|
||||
os_lnx_entity_release(entity);
|
||||
}
|
||||
|
||||
@@ -395,7 +395,7 @@ thread_detach(Thread thread)
|
||||
internal Mutex
|
||||
mutex_alloc(void)
|
||||
{
|
||||
OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Mutex);
|
||||
LNX_Entity *entity = os_lnx_entity_alloc(LNX_EntityKind_Mutex);
|
||||
int init_result = pthread_mutex_init(&entity->mutex_handle, 0);
|
||||
if(init_result == -1)
|
||||
{
|
||||
@@ -410,7 +410,7 @@ internal void
|
||||
mutex_release(Mutex mutex)
|
||||
{
|
||||
if(MemoryIsZeroStruct(&mutex)) { return; }
|
||||
OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0];
|
||||
LNX_Entity *entity = (LNX_Entity *)mutex.u64[0];
|
||||
pthread_mutex_destroy(&entity->mutex_handle);
|
||||
os_lnx_entity_release(entity);
|
||||
}
|
||||
@@ -419,7 +419,7 @@ internal void
|
||||
mutex_take(Mutex mutex)
|
||||
{
|
||||
if(MemoryIsZeroStruct(&mutex)) { return; }
|
||||
OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0];
|
||||
LNX_Entity *entity = (LNX_Entity *)mutex.u64[0];
|
||||
pthread_mutex_lock(&entity->mutex_handle);
|
||||
}
|
||||
|
||||
@@ -427,7 +427,7 @@ internal void
|
||||
mutex_drop(Mutex mutex)
|
||||
{
|
||||
if(MemoryIsZeroStruct(&mutex)) { return; }
|
||||
OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0];
|
||||
LNX_Entity *entity = (LNX_Entity *)mutex.u64[0];
|
||||
pthread_mutex_unlock(&entity->mutex_handle);
|
||||
}
|
||||
|
||||
@@ -436,7 +436,7 @@ mutex_drop(Mutex mutex)
|
||||
internal RWMutex
|
||||
rw_mutex_alloc(void)
|
||||
{
|
||||
OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_RWMutex);
|
||||
LNX_Entity *entity = os_lnx_entity_alloc(LNX_EntityKind_RWMutex);
|
||||
int init_result = pthread_rwlock_init(&entity->rwmutex_handle, 0);
|
||||
if(init_result == -1)
|
||||
{
|
||||
@@ -451,7 +451,7 @@ internal void
|
||||
rw_mutex_release(RWMutex mutex)
|
||||
{
|
||||
if(MemoryIsZeroStruct(&mutex)) { return; }
|
||||
OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0];
|
||||
LNX_Entity *entity = (LNX_Entity *)mutex.u64[0];
|
||||
pthread_rwlock_destroy(&entity->rwmutex_handle);
|
||||
os_lnx_entity_release(entity);
|
||||
}
|
||||
@@ -460,7 +460,7 @@ internal void
|
||||
rw_mutex_take(RWMutex mutex, B32 write_mode)
|
||||
{
|
||||
if(MemoryIsZeroStruct(&mutex)) { return; }
|
||||
OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0];
|
||||
LNX_Entity *entity = (LNX_Entity *)mutex.u64[0];
|
||||
if(write_mode)
|
||||
{
|
||||
pthread_rwlock_wrlock(&entity->rwmutex_handle);
|
||||
@@ -475,7 +475,7 @@ internal void
|
||||
rw_mutex_drop(RWMutex mutex, B32 write_mode)
|
||||
{
|
||||
if(MemoryIsZeroStruct(&mutex)) { return; }
|
||||
OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0];
|
||||
LNX_Entity *entity = (LNX_Entity *)mutex.u64[0];
|
||||
pthread_rwlock_unlock(&entity->rwmutex_handle);
|
||||
}
|
||||
|
||||
@@ -484,7 +484,7 @@ rw_mutex_drop(RWMutex mutex, B32 write_mode)
|
||||
internal CondVar
|
||||
cond_var_alloc(void)
|
||||
{
|
||||
OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_ConditionVariable);
|
||||
LNX_Entity *entity = os_lnx_entity_alloc(LNX_EntityKind_ConditionVariable);
|
||||
int init_result = pthread_cond_init(&entity->cv.cond_handle, 0);
|
||||
if(init_result == -1)
|
||||
{
|
||||
@@ -510,7 +510,7 @@ internal void
|
||||
cond_var_release(CondVar cv)
|
||||
{
|
||||
if(MemoryIsZeroStruct(&cv)) { return; }
|
||||
OS_LNX_Entity *entity = (OS_LNX_Entity *)cv.u64[0];
|
||||
LNX_Entity *entity = (LNX_Entity *)cv.u64[0];
|
||||
pthread_cond_destroy(&entity->cv.cond_handle);
|
||||
pthread_mutex_destroy(&entity->cv.rwlock_mutex_handle);
|
||||
os_lnx_entity_release(entity);
|
||||
@@ -521,8 +521,8 @@ cond_var_wait(CondVar cv, Mutex mutex, U64 endt_us)
|
||||
{
|
||||
if(MemoryIsZeroStruct(&cv)) { return 0; }
|
||||
if(MemoryIsZeroStruct(&mutex)) { return 0; }
|
||||
OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0];
|
||||
OS_LNX_Entity *mutex_entity = (OS_LNX_Entity *)mutex.u64[0];
|
||||
LNX_Entity *cv_entity = (LNX_Entity *)cv.u64[0];
|
||||
LNX_Entity *mutex_entity = (LNX_Entity *)mutex.u64[0];
|
||||
struct timespec endt_timespec;
|
||||
endt_timespec.tv_sec = endt_us/Million(1);
|
||||
endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1));
|
||||
@@ -540,8 +540,8 @@ cond_var_wait_rw(CondVar cv, RWMutex mutex_rw, B32 write_mode, U64 endt_us)
|
||||
//
|
||||
if(MemoryIsZeroStruct(&cv)) { return 0; }
|
||||
if(MemoryIsZeroStruct(&mutex_rw)) { return 0; }
|
||||
OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0];
|
||||
OS_LNX_Entity *rw_mutex_entity = (OS_LNX_Entity *)mutex_rw.u64[0];
|
||||
LNX_Entity *cv_entity = (LNX_Entity *)cv.u64[0];
|
||||
LNX_Entity *rw_mutex_entity = (LNX_Entity *)mutex_rw.u64[0];
|
||||
struct timespec endt_timespec;
|
||||
endt_timespec.tv_sec = endt_us/Million(1);
|
||||
endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1));
|
||||
@@ -585,7 +585,7 @@ internal void
|
||||
cond_var_signal(CondVar cv)
|
||||
{
|
||||
if(MemoryIsZeroStruct(&cv)) { return; }
|
||||
OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0];
|
||||
LNX_Entity *cv_entity = (LNX_Entity *)cv.u64[0];
|
||||
pthread_cond_signal(&cv_entity->cv.cond_handle);
|
||||
}
|
||||
|
||||
@@ -593,7 +593,7 @@ internal void
|
||||
cond_var_broadcast(CondVar cv)
|
||||
{
|
||||
if(MemoryIsZeroStruct(&cv)) { return; }
|
||||
OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0];
|
||||
LNX_Entity *cv_entity = (LNX_Entity *)cv.u64[0];
|
||||
pthread_cond_broadcast(&cv_entity->cv.cond_handle);
|
||||
}
|
||||
|
||||
@@ -713,7 +713,7 @@ semaphore_drop(Semaphore semaphore)
|
||||
internal Barrier
|
||||
barrier_alloc(U64 count)
|
||||
{
|
||||
OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Barrier);
|
||||
LNX_Entity *entity = os_lnx_entity_alloc(LNX_EntityKind_Barrier);
|
||||
if(entity != 0)
|
||||
{
|
||||
pthread_barrier_init(&entity->barrier, 0, count);
|
||||
@@ -725,7 +725,7 @@ barrier_alloc(U64 count)
|
||||
internal void
|
||||
barrier_release(Barrier barrier)
|
||||
{
|
||||
OS_LNX_Entity *entity = (OS_LNX_Entity*)PtrFromInt(barrier.u64[0]);
|
||||
LNX_Entity *entity = (LNX_Entity*)PtrFromInt(barrier.u64[0]);
|
||||
if(entity != 0)
|
||||
{
|
||||
pthread_barrier_destroy(&entity->barrier);
|
||||
@@ -736,7 +736,7 @@ barrier_release(Barrier barrier)
|
||||
internal void
|
||||
barrier_wait(Barrier barrier)
|
||||
{
|
||||
OS_LNX_Entity *entity = (OS_LNX_Entity*)PtrFromInt(barrier.u64[0]);
|
||||
LNX_Entity *entity = (LNX_Entity*)PtrFromInt(barrier.u64[0]);
|
||||
if(entity != 0)
|
||||
{
|
||||
pthread_barrier_wait(&entity->barrier);
|
||||
@@ -750,7 +750,7 @@ internal void
|
||||
safe_call(ThreadEntryPointFunctionType *func, ThreadEntryPointFunctionType *fail_handler, void *ptr)
|
||||
{
|
||||
// rjf: push handler to chain
|
||||
OS_LNX_SafeCallChain chain = {0};
|
||||
LNX_SafeCallChain chain = {0};
|
||||
SLLStackPush(os_lnx_safe_call_chain, &chain);
|
||||
chain.fail_handler = fail_handler;
|
||||
chain.ptr = ptr;
|
||||
@@ -1088,7 +1088,7 @@ file_iter_begin(Arena *arena, String8 path, FileIterFlags flags)
|
||||
{
|
||||
FileIter *base_iter = push_array(arena, FileIter, 1);
|
||||
base_iter->flags = flags;
|
||||
OS_LNX_FileIter *iter = (OS_LNX_FileIter *)base_iter->memory;
|
||||
LNX_FileIter *iter = (LNX_FileIter *)base_iter->memory;
|
||||
{
|
||||
String8 path_copy = push_str8_copy(arena, path);
|
||||
iter->dir = opendir((char *)path_copy.str);
|
||||
@@ -1101,7 +1101,7 @@ internal B32
|
||||
file_iter_next(Arena *arena, FileIter *iter, FileInfo *info_out)
|
||||
{
|
||||
B32 good = 0;
|
||||
OS_LNX_FileIter *lnx_iter = (OS_LNX_FileIter *)iter->memory;
|
||||
LNX_FileIter *lnx_iter = (LNX_FileIter *)iter->memory;
|
||||
for(;lnx_iter->dir != 0;)
|
||||
{
|
||||
// rjf: get next entry
|
||||
@@ -1152,7 +1152,7 @@ file_iter_next(Arena *arena, FileIter *iter, FileInfo *info_out)
|
||||
internal void
|
||||
file_iter_end(FileIter *iter)
|
||||
{
|
||||
OS_LNX_FileIter *lnx_iter = (OS_LNX_FileIter *)iter->memory;
|
||||
LNX_FileIter *lnx_iter = (LNX_FileIter *)iter->memory;
|
||||
closedir(lnx_iter->dir);
|
||||
}
|
||||
|
||||
|
||||
+25
-25
@@ -41,7 +41,7 @@ typedef struct timespec timespec;
|
||||
////////////////////////////////
|
||||
//~ rjf: Linux Call Interruption Retry Helper
|
||||
|
||||
#define OS_LNX_RETRY_ON_EINTR(expr) \
|
||||
#define LNX_RETRY_ON_EINTR(expr) \
|
||||
(__extension__({ \
|
||||
__typeof__(expr) __ret; \
|
||||
do { \
|
||||
@@ -54,22 +54,22 @@ __ret; \
|
||||
////////////////////////////////
|
||||
//~ rjf: File Iterator
|
||||
|
||||
typedef struct OS_LNX_FileIter OS_LNX_FileIter;
|
||||
struct OS_LNX_FileIter
|
||||
typedef struct LNX_FileIter LNX_FileIter;
|
||||
struct LNX_FileIter
|
||||
{
|
||||
DIR *dir;
|
||||
struct dirent *dp;
|
||||
String8 path;
|
||||
};
|
||||
StaticAssert(sizeof(Member(FileIter, memory)) >= sizeof(OS_LNX_FileIter), os_lnx_file_iter_size_check);
|
||||
StaticAssert(sizeof(Member(FileIter, memory)) >= sizeof(LNX_FileIter), os_lnx_file_iter_size_check);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Safe Call Handler Chain
|
||||
|
||||
typedef struct OS_LNX_SafeCallChain OS_LNX_SafeCallChain;
|
||||
struct OS_LNX_SafeCallChain
|
||||
typedef struct LNX_SafeCallChain LNX_SafeCallChain;
|
||||
struct LNX_SafeCallChain
|
||||
{
|
||||
OS_LNX_SafeCallChain *next;
|
||||
LNX_SafeCallChain *next;
|
||||
ThreadEntryPointFunctionType *fail_handler;
|
||||
void *ptr;
|
||||
};
|
||||
@@ -77,21 +77,21 @@ struct OS_LNX_SafeCallChain
|
||||
////////////////////////////////
|
||||
//~ rjf: Entities
|
||||
|
||||
typedef enum OS_LNX_EntityKind
|
||||
typedef enum LNX_EntityKind
|
||||
{
|
||||
OS_LNX_EntityKind_Thread,
|
||||
OS_LNX_EntityKind_Mutex,
|
||||
OS_LNX_EntityKind_RWMutex,
|
||||
OS_LNX_EntityKind_ConditionVariable,
|
||||
OS_LNX_EntityKind_Barrier,
|
||||
LNX_EntityKind_Thread,
|
||||
LNX_EntityKind_Mutex,
|
||||
LNX_EntityKind_RWMutex,
|
||||
LNX_EntityKind_ConditionVariable,
|
||||
LNX_EntityKind_Barrier,
|
||||
}
|
||||
OS_LNX_EntityKind;
|
||||
LNX_EntityKind;
|
||||
|
||||
typedef struct OS_LNX_Entity OS_LNX_Entity;
|
||||
struct OS_LNX_Entity
|
||||
typedef struct LNX_Entity LNX_Entity;
|
||||
struct LNX_Entity
|
||||
{
|
||||
OS_LNX_Entity *next;
|
||||
OS_LNX_EntityKind kind;
|
||||
LNX_Entity *next;
|
||||
LNX_EntityKind kind;
|
||||
union
|
||||
{
|
||||
struct
|
||||
@@ -114,15 +114,15 @@ struct OS_LNX_Entity
|
||||
////////////////////////////////
|
||||
//~ rjf: State
|
||||
|
||||
typedef struct OS_LNX_State OS_LNX_State;
|
||||
struct OS_LNX_State
|
||||
typedef struct LNX_State LNX_State;
|
||||
struct LNX_State
|
||||
{
|
||||
Arena *arena;
|
||||
SystemInfo system_info;
|
||||
ProcessInfo process_info;
|
||||
pthread_mutex_t entity_mutex;
|
||||
Arena *entity_arena;
|
||||
OS_LNX_Entity *entity_free;
|
||||
LNX_Entity *entity_free;
|
||||
U64 default_env_count;
|
||||
char **default_env;
|
||||
};
|
||||
@@ -130,8 +130,8 @@ struct OS_LNX_State
|
||||
////////////////////////////////
|
||||
//~ rjf: Globals
|
||||
|
||||
global OS_LNX_State os_lnx_state = {0};
|
||||
thread_static OS_LNX_SafeCallChain *os_lnx_safe_call_chain = 0;
|
||||
global LNX_State os_lnx_state = {0};
|
||||
thread_static LNX_SafeCallChain *os_lnx_safe_call_chain = 0;
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Helpers
|
||||
@@ -146,8 +146,8 @@ internal void os_lnx_safe_call_sig_handler(int x);
|
||||
////////////////////////////////
|
||||
//~ rjf: Entities
|
||||
|
||||
internal OS_LNX_Entity *os_lnx_entity_alloc(OS_LNX_EntityKind kind);
|
||||
internal void os_lnx_entity_release(OS_LNX_Entity *entity);
|
||||
internal LNX_Entity *os_lnx_entity_alloc(LNX_EntityKind kind);
|
||||
internal void os_lnx_entity_release(LNX_Entity *entity);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Thread Entry Point
|
||||
|
||||
+509
-509
File diff suppressed because it is too large
Load Diff
+206
-207
@@ -1,16 +1,16 @@
|
||||
// Copyright (c) Epic Games Tools
|
||||
// Licensed under the MIT license (https://opensource.org/license/mit/)
|
||||
|
||||
#ifndef DEMON_CORE_LINUX_H
|
||||
#define DEMON_CORE_LINUX_H
|
||||
#ifndef LINUX_DEMON_H
|
||||
#define LINUX_DEMON_H
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Register Layouts
|
||||
//
|
||||
// These are defined in <sys/user.h>, but only for one architecture at a time
|
||||
|
||||
typedef struct OS_LNX_GprsX64 OS_LNX_GprsX64;
|
||||
struct OS_LNX_GprsX64
|
||||
typedef struct LNX_DMN_GprsX64 LNX_DMN_GprsX64;
|
||||
struct LNX_DMN_GprsX64
|
||||
{
|
||||
U64 r15;
|
||||
U64 r14;
|
||||
@@ -41,10 +41,10 @@ struct OS_LNX_GprsX64
|
||||
U64 gs;
|
||||
};
|
||||
|
||||
typedef struct OS_LNX_UserX64 OS_LNX_UserX64;
|
||||
struct OS_LNX_UserX64
|
||||
typedef struct LNX_DMN_UserX64 LNX_DMN_UserX64;
|
||||
struct LNX_DMN_UserX64
|
||||
{
|
||||
OS_LNX_GprsX64 regs;
|
||||
LNX_DMN_GprsX64 regs;
|
||||
S32 u_fpvalid;
|
||||
U32 _pad0;
|
||||
X64_FXSave i387;
|
||||
@@ -62,22 +62,22 @@ struct OS_LNX_UserX64
|
||||
U8 u_comm[32];
|
||||
U64 u_debugreg[8];
|
||||
};
|
||||
StaticAssert(sizeof(OS_LNX_UserX64) == 912, g_os_lnx_user_x64_size_check);
|
||||
StaticAssert(sizeof(LNX_DMN_UserX64) == 912, lnx_user_x64_size_check);
|
||||
|
||||
////////////////////////////////
|
||||
//~ TLS
|
||||
|
||||
typedef struct DMN_LNX_DbDesc
|
||||
typedef struct LNX_DMN_DbDesc
|
||||
{
|
||||
U32 bit_size;
|
||||
U32 count;
|
||||
U32 offset;
|
||||
} DMN_LNX_DbDesc;
|
||||
} LNX_DMN_DbDesc;
|
||||
|
||||
////////////////////////////////
|
||||
//~ SDT Probes
|
||||
|
||||
typedef struct DMN_LNX_Probe
|
||||
typedef struct LNX_DMN_Probe
|
||||
{
|
||||
String8 provider;
|
||||
String8 name;
|
||||
@@ -85,22 +85,22 @@ typedef struct DMN_LNX_Probe
|
||||
STAP_ArgArray args;
|
||||
U64 pc;
|
||||
U64 semaphore;
|
||||
} DMN_LNX_Probe;
|
||||
} LNX_DMN_Probe;
|
||||
|
||||
typedef struct DMN_LNX_ProbeNode
|
||||
typedef struct LNX_DMN_ProbeNode
|
||||
{
|
||||
DMN_LNX_Probe v;
|
||||
struct DMN_LNX_ProbeNode *next;
|
||||
} DMN_LNX_ProbeNode;
|
||||
LNX_DMN_Probe v;
|
||||
struct LNX_DMN_ProbeNode *next;
|
||||
} LNX_DMN_ProbeNode;
|
||||
|
||||
typedef struct DMN_LNX_ProbeList
|
||||
typedef struct LNX_DMN_ProbeList
|
||||
{
|
||||
U64 count;
|
||||
DMN_LNX_ProbeNode *first;
|
||||
DMN_LNX_ProbeNode *last;
|
||||
} DMN_LNX_ProbeList;
|
||||
LNX_DMN_ProbeNode *first;
|
||||
LNX_DMN_ProbeNode *last;
|
||||
} LNX_DMN_ProbeList;
|
||||
|
||||
#define DMN_LNX_Probe_XList \
|
||||
#define LNX_DMN_Probe_XList \
|
||||
X(InitStart, 2, "init_start") \
|
||||
X(InitComplete, 2, "init_complete") \
|
||||
X(RelocStart, 2, "reloc_start") \
|
||||
@@ -115,17 +115,17 @@ X(SetJmp, 3, "setjmp")
|
||||
|
||||
typedef enum
|
||||
{
|
||||
DMN_LNX_ProbeType_Null,
|
||||
#define X(_N,...) DMN_LNX_ProbeType_##_N,
|
||||
DMN_LNX_Probe_XList
|
||||
LNX_DMN_ProbeType_Null,
|
||||
#define X(_N,...) LNX_DMN_ProbeType_##_N,
|
||||
LNX_DMN_Probe_XList
|
||||
#undef X
|
||||
DMN_LNX_ProbeType_Count,
|
||||
} DMN_LNX_ProbeType;
|
||||
LNX_DMN_ProbeType_Count,
|
||||
} LNX_DMN_ProbeType;
|
||||
|
||||
////////////////////////////////
|
||||
//~ Process Info
|
||||
|
||||
typedef struct DMN_LNX_Auxv
|
||||
typedef struct LNX_DMN_Auxv
|
||||
{
|
||||
U64 base;
|
||||
U64 phnum;
|
||||
@@ -133,9 +133,9 @@ typedef struct DMN_LNX_Auxv
|
||||
U64 phdr;
|
||||
U64 execfn;
|
||||
U64 pagesz;
|
||||
} DMN_LNX_Auxv;
|
||||
} LNX_DMN_Auxv;
|
||||
|
||||
typedef struct DMN_LNX_DynamicInfo
|
||||
typedef struct LNX_DMN_DynamicInfo
|
||||
{
|
||||
U64 hash_vaddr;
|
||||
U64 gnu_hash_vaddr;
|
||||
@@ -143,59 +143,59 @@ typedef struct DMN_LNX_DynamicInfo
|
||||
U64 strtab_size;
|
||||
U64 symtab_vaddr;
|
||||
U64 symtab_entry_size;
|
||||
} DMN_LNX_DynamicInfo;
|
||||
} LNX_DMN_DynamicInfo;
|
||||
|
||||
////////////////////////////////
|
||||
//~ Entities
|
||||
|
||||
typedef enum DMN_LNX_EntityKind
|
||||
typedef enum LNX_DMN_EntityKind
|
||||
{
|
||||
DMN_LNX_EntityKind_Null,
|
||||
DMN_LNX_EntityKind_Process,
|
||||
DMN_LNX_EntityKind_ProcessCtx,
|
||||
DMN_LNX_EntityKind_Thread,
|
||||
DMN_LNX_EntityKind_Module,
|
||||
} DMN_LNX_EntityKind;
|
||||
LNX_DMN_EntityKind_Null,
|
||||
LNX_DMN_EntityKind_Process,
|
||||
LNX_DMN_EntityKind_ProcessCtx,
|
||||
LNX_DMN_EntityKind_Thread,
|
||||
LNX_DMN_EntityKind_Module,
|
||||
} LNX_DMN_EntityKind;
|
||||
|
||||
typedef enum DMN_LNX_ThreadState
|
||||
typedef enum LNX_DMN_ThreadState
|
||||
{
|
||||
DMN_LNX_ThreadState_Null,
|
||||
DMN_LNX_ThreadState_Running,
|
||||
DMN_LNX_ThreadState_Stopped,
|
||||
DMN_LNX_ThreadState_Exited,
|
||||
DMN_LNX_ThreadState_PendingCreation,
|
||||
} DMN_LNX_ThreadState;
|
||||
LNX_DMN_ThreadState_Null,
|
||||
LNX_DMN_ThreadState_Running,
|
||||
LNX_DMN_ThreadState_Stopped,
|
||||
LNX_DMN_ThreadState_Exited,
|
||||
LNX_DMN_ThreadState_PendingCreation,
|
||||
} LNX_DMN_ThreadState;
|
||||
|
||||
typedef struct DMN_LNX_Thread
|
||||
typedef struct LNX_DMN_Thread
|
||||
{
|
||||
pid_t tid;
|
||||
DMN_LNX_ThreadState state;
|
||||
struct DMN_LNX_Process *process;
|
||||
LNX_DMN_ThreadState state;
|
||||
struct LNX_DMN_Process *process;
|
||||
void *reg_block;
|
||||
B32 is_reg_block_dirty;
|
||||
B32 pass_through_signal;
|
||||
U64 pass_through_signo;
|
||||
U64 orig_rax;
|
||||
|
||||
struct DMN_LNX_Thread *next;
|
||||
struct DMN_LNX_Thread *prev;
|
||||
} DMN_LNX_Thread;
|
||||
struct LNX_DMN_Thread *next;
|
||||
struct LNX_DMN_Thread *prev;
|
||||
} LNX_DMN_Thread;
|
||||
|
||||
typedef struct DMN_LNX_ThreadPtrNode
|
||||
typedef struct LNX_DMN_ThreadPtrNode
|
||||
{
|
||||
DMN_LNX_Thread *v;
|
||||
struct DMN_LNX_ThreadPtrNode *next;
|
||||
struct DMN_LNX_ThreadPtrNode *prev;
|
||||
} DMN_LNX_ThreadPtrNode;
|
||||
LNX_DMN_Thread *v;
|
||||
struct LNX_DMN_ThreadPtrNode *next;
|
||||
struct LNX_DMN_ThreadPtrNode *prev;
|
||||
} LNX_DMN_ThreadPtrNode;
|
||||
|
||||
typedef struct DMN_LNX_ThreadPtrList
|
||||
typedef struct LNX_DMN_ThreadPtrList
|
||||
{
|
||||
U64 count;
|
||||
DMN_LNX_ThreadPtrNode *first;
|
||||
DMN_LNX_ThreadPtrNode *last;
|
||||
} DMN_LNX_ThreadPtrList;
|
||||
LNX_DMN_ThreadPtrNode *first;
|
||||
LNX_DMN_ThreadPtrNode *last;
|
||||
} LNX_DMN_ThreadPtrList;
|
||||
|
||||
typedef struct DMN_LNX_Module
|
||||
typedef struct LNX_DMN_Module
|
||||
{
|
||||
U64 name_vaddr;
|
||||
U64 base_vaddr;
|
||||
@@ -209,86 +209,86 @@ typedef struct DMN_LNX_Module
|
||||
B8 is_live;
|
||||
B8 is_main;
|
||||
|
||||
struct DMN_LNX_Module *next;
|
||||
struct DMN_LNX_Module *prev;
|
||||
} DMN_LNX_Module;
|
||||
struct LNX_DMN_Module *next;
|
||||
struct LNX_DMN_Module *prev;
|
||||
} LNX_DMN_Module;
|
||||
|
||||
typedef struct DMN_LNX_ModulePtrNode
|
||||
typedef struct LNX_DMN_ModulePtrNode
|
||||
{
|
||||
DMN_LNX_Module *v;
|
||||
struct DMN_LNX_ModulePtrNode *next;
|
||||
} DMN_LNX_ModulePtrNode;
|
||||
LNX_DMN_Module *v;
|
||||
struct LNX_DMN_ModulePtrNode *next;
|
||||
} LNX_DMN_ModulePtrNode;
|
||||
|
||||
typedef struct DMN_LNX_ModulePtrList
|
||||
typedef struct LNX_DMN_ModulePtrList
|
||||
{
|
||||
U64 count;
|
||||
DMN_LNX_ModulePtrNode *first;
|
||||
DMN_LNX_ModulePtrNode *last;
|
||||
} DMN_LNX_ModulePtrList;
|
||||
LNX_DMN_ModulePtrNode *first;
|
||||
LNX_DMN_ModulePtrNode *last;
|
||||
} LNX_DMN_ModulePtrList;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
DMN_LNX_ProcessState_Null,
|
||||
DMN_LNX_ProcessState_Launch,
|
||||
DMN_LNX_ProcessState_Attach,
|
||||
DMN_LNX_ProcessState_WaitForExec,
|
||||
DMN_LNX_ProcessState_ExecFailedDoExit,
|
||||
DMN_LNX_ProcessState_Normal,
|
||||
} DMN_LNX_ProcessState;
|
||||
LNX_DMN_ProcessState_Null,
|
||||
LNX_DMN_ProcessState_Launch,
|
||||
LNX_DMN_ProcessState_Attach,
|
||||
LNX_DMN_ProcessState_WaitForExec,
|
||||
LNX_DMN_ProcessState_ExecFailedDoExit,
|
||||
LNX_DMN_ProcessState_Normal,
|
||||
} LNX_DMN_ProcessState;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
DMN_LNX_CreateProcessFlag_DebugSubprocesses = (1 << 0),
|
||||
DMN_LNX_CreateProcessFlag_Rebased = (1 << 1),
|
||||
DMN_LNX_CreateProcessFlag_Cow = (1 << 2),
|
||||
DMN_LNX_CreateProcessFlag_ClonedMemory = (1 << 3),
|
||||
} DMN_LNX_CreateProcessFlags;
|
||||
LNX_DMN_CreateProcessFlag_DebugSubprocesses = (1 << 0),
|
||||
LNX_DMN_CreateProcessFlag_Rebased = (1 << 1),
|
||||
LNX_DMN_CreateProcessFlag_Cow = (1 << 2),
|
||||
LNX_DMN_CreateProcessFlag_ClonedMemory = (1 << 3),
|
||||
} LNX_DMN_CreateProcessFlags;
|
||||
|
||||
typedef struct DMN_LNX_Process
|
||||
typedef struct LNX_DMN_Process
|
||||
{
|
||||
pid_t pid;
|
||||
int fd;
|
||||
DMN_LNX_ProcessState state;
|
||||
LNX_DMN_ProcessState state;
|
||||
B32 debug_subprocesses;
|
||||
B32 is_cow;
|
||||
B32 vfork_with_spoof;
|
||||
U64 thread_count;
|
||||
DMN_LNX_Thread *first_thread;
|
||||
DMN_LNX_Thread *last_thread;
|
||||
LNX_DMN_Thread *first_thread;
|
||||
LNX_DMN_Thread *last_thread;
|
||||
U64 main_thread_exit_code;
|
||||
struct DMN_LNX_Process *parent_process;
|
||||
struct DMN_LNX_ProcessCtx *ctx;
|
||||
struct LNX_DMN_Process *parent_process;
|
||||
struct LNX_DMN_ProcessCtx *ctx;
|
||||
|
||||
|
||||
struct DMN_LNX_Process *next;
|
||||
struct DMN_LNX_Process *prev;
|
||||
} DMN_LNX_Process;
|
||||
struct LNX_DMN_Process *next;
|
||||
struct LNX_DMN_Process *prev;
|
||||
} LNX_DMN_Process;
|
||||
|
||||
typedef struct DMN_LNX_ProcessPtrNode
|
||||
typedef struct LNX_DMN_ProcessPtrNode
|
||||
{
|
||||
DMN_LNX_Process *v;
|
||||
struct DMN_LNX_ProcessPtrNode *next;
|
||||
} DMN_LNX_ProcessPtrNode;
|
||||
LNX_DMN_Process *v;
|
||||
struct LNX_DMN_ProcessPtrNode *next;
|
||||
} LNX_DMN_ProcessPtrNode;
|
||||
|
||||
typedef struct DMN_LNX_ProcessPtrList
|
||||
typedef struct LNX_DMN_ProcessPtrList
|
||||
{
|
||||
U64 count;
|
||||
DMN_LNX_ProcessPtrNode *first;
|
||||
DMN_LNX_ProcessPtrNode *last;
|
||||
} DMN_LNX_ProcessPtrList;
|
||||
LNX_DMN_ProcessPtrNode *first;
|
||||
LNX_DMN_ProcessPtrNode *last;
|
||||
} LNX_DMN_ProcessPtrList;
|
||||
|
||||
typedef struct DMN_LNX_ProcessCtx
|
||||
typedef struct LNX_DMN_ProcessCtx
|
||||
{
|
||||
Arena *arena;
|
||||
Arch arch;
|
||||
U64 rdebug_vaddr;
|
||||
ELF_Class dl_class;
|
||||
HashTable *loaded_modules_ht;
|
||||
DMN_LNX_Probe **probes;
|
||||
LNX_DMN_Probe **probes;
|
||||
DMN_ActiveTrap *first_probe_trap;
|
||||
DMN_ActiveTrap *last_probe_trap;
|
||||
DMN_LNX_Module *first_module;
|
||||
DMN_LNX_Module *last_module;
|
||||
LNX_DMN_Module *first_module;
|
||||
LNX_DMN_Module *last_module;
|
||||
U64 module_count;
|
||||
U64 ref_count;
|
||||
|
||||
@@ -299,42 +299,42 @@ typedef struct DMN_LNX_ProcessCtx
|
||||
U64 xcr0;
|
||||
U64 xsave_size;
|
||||
X64_XSaveLayout xsave_layout;
|
||||
} DMN_LNX_ProcessCtx;
|
||||
} LNX_DMN_ProcessCtx;
|
||||
|
||||
typedef struct DMN_LNX_Entity
|
||||
typedef struct LNX_DMN_Entity
|
||||
{
|
||||
union
|
||||
{
|
||||
DMN_LNX_Process process;
|
||||
DMN_LNX_ProcessCtx process_ctx;
|
||||
DMN_LNX_Thread thread;
|
||||
DMN_LNX_Module module;
|
||||
LNX_DMN_Process process;
|
||||
LNX_DMN_ProcessCtx process_ctx;
|
||||
LNX_DMN_Thread thread;
|
||||
LNX_DMN_Module module;
|
||||
struct
|
||||
{
|
||||
struct DMN_LNX_Entity *next;
|
||||
struct LNX_DMN_Entity *next;
|
||||
};
|
||||
};
|
||||
U32 gen;
|
||||
DMN_LNX_EntityKind kind;
|
||||
} DMN_LNX_Entity;
|
||||
LNX_DMN_EntityKind kind;
|
||||
} LNX_DMN_Entity;
|
||||
|
||||
typedef struct DMN_LNX_EntityNode
|
||||
typedef struct LNX_DMN_EntityNode
|
||||
{
|
||||
DMN_LNX_Entity *v;
|
||||
struct DMN_LNX_EntityNode *next;
|
||||
} DMN_LNX_EntityNode;
|
||||
LNX_DMN_Entity *v;
|
||||
struct LNX_DMN_EntityNode *next;
|
||||
} LNX_DMN_EntityNode;
|
||||
|
||||
typedef struct DMN_LNX_EntityList
|
||||
typedef struct LNX_DMN_EntityList
|
||||
{
|
||||
U64 count;
|
||||
DMN_LNX_EntityNode *first;
|
||||
DMN_LNX_EntityNode *last;
|
||||
} DMN_LNX_EntityList;
|
||||
LNX_DMN_EntityNode *first;
|
||||
LNX_DMN_EntityNode *last;
|
||||
} LNX_DMN_EntityList;
|
||||
|
||||
////////////////////////////////
|
||||
//~ Global State
|
||||
|
||||
typedef struct DMN_LNX_State
|
||||
typedef struct LNX_DMN_State
|
||||
{
|
||||
Arena *arena;
|
||||
|
||||
@@ -344,8 +344,8 @@ typedef struct DMN_LNX_State
|
||||
|
||||
// rjf: entity storage
|
||||
Arena *entities_arena;
|
||||
DMN_LNX_Entity *entities_base;
|
||||
DMN_LNX_Entity *free_entity;
|
||||
LNX_DMN_Entity *entities_base;
|
||||
LNX_DMN_Entity *free_entity;
|
||||
U64 entities_count;
|
||||
|
||||
HashTable *tid_ht; // thread id -> thread entity
|
||||
@@ -353,8 +353,8 @@ typedef struct DMN_LNX_State
|
||||
|
||||
// process tracking
|
||||
U64 process_count;
|
||||
DMN_LNX_Process *first_process;
|
||||
DMN_LNX_Process *last_process;
|
||||
LNX_DMN_Process *first_process;
|
||||
LNX_DMN_Process *last_process;
|
||||
|
||||
// process/thread creation tracking
|
||||
U64 process_pending_creation;
|
||||
@@ -369,134 +369,133 @@ typedef struct DMN_LNX_State
|
||||
|
||||
// TLS
|
||||
B32 is_tls_detected;
|
||||
DMN_LNX_DbDesc tls_modid_desc;
|
||||
DMN_LNX_DbDesc tls_offset_desc;
|
||||
} DMN_LNX_State;
|
||||
LNX_DMN_DbDesc tls_modid_desc;
|
||||
LNX_DMN_DbDesc tls_offset_desc;
|
||||
} LNX_DMN_State;
|
||||
|
||||
////////////////////////////////
|
||||
//~ Globals
|
||||
|
||||
global B32 dmn_lnx_ctrl_thread;
|
||||
global DMN_LNX_State *dmn_lnx_state;
|
||||
global B32 lnx_dmn_ctrl_thread;
|
||||
global LNX_DMN_State *lnx_dmn_state;
|
||||
|
||||
////////////////////////////////
|
||||
//~ Memory R/W
|
||||
|
||||
internal U64 dmn_lnx_read(int memory_fd, Rng1U64 range, void *dst);
|
||||
internal B32 dmn_lnx_write(int memory_fd, Rng1U64 range, void *src);
|
||||
internal String8 dmn_lnx_read_string_capped(Arena *arena, int memory_fd, U64 base_vaddr, U64 cap_size);
|
||||
internal String8 dmn_lnx_read_string(Arena *arena, int memory_fd, U64 base_vaddr);
|
||||
#define dmn_lnx_read_struct(fd, vaddr, ptr) dmn_lnx_read((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr))
|
||||
#define dmn_lnx_write_struct(fd, vaddr, ptr) dmn_lnx_write((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr))
|
||||
internal U64 lnx_dmn_read(int memory_fd, Rng1U64 range, void *dst);
|
||||
internal B32 lnx_dmn_write(int memory_fd, Rng1U64 range, void *src);
|
||||
internal String8 lnx_dmn_read_string_capped(Arena *arena, int memory_fd, U64 base_vaddr, U64 cap_size);
|
||||
internal String8 lnx_dmn_read_string(Arena *arena, int memory_fd, U64 base_vaddr);
|
||||
#define lnx_dmn_read_struct(fd, vaddr, ptr) lnx_dmn_read((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr))
|
||||
#define lnx_dmn_write_struct(fd, vaddr, ptr) lnx_dmn_write((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr))
|
||||
|
||||
////////////////////////////////
|
||||
//~ ELF/GNU info
|
||||
|
||||
internal Rng1U64 dmn_lnx_compute_image_vrange(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum);
|
||||
internal DMN_LNX_DynamicInfo dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_Class, U64 rebase, U64 dynamic_vaddr);
|
||||
internal U64 dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vaddr, B32 is_rebased);
|
||||
internal Rng1U64 lnx_dmn_compute_image_vrange(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum);
|
||||
internal LNX_DMN_DynamicInfo lnx_dmn_dynamic_info_from_memory(int memory_fd, ELF_Class elf_Class, U64 rebase, U64 dynamic_vaddr);
|
||||
internal U64 lnx_dmn_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vaddr, B32 is_rebased);
|
||||
|
||||
////////////////////////////////
|
||||
//~ Process Info
|
||||
|
||||
internal String8 dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid);
|
||||
internal String8 dmn_lnx_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base);
|
||||
internal ELF_Hdr64 dmn_lnx_ehdr_from_pid(pid_t pid);
|
||||
internal DMN_LNX_Auxv dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class);
|
||||
internal DMN_LNX_Thread * dmn_lnx_thread_from_pid(pid_t pid);
|
||||
internal DMN_LNX_Process * dmn_lnx_process_from_pid(pid_t pid);
|
||||
internal String8 lnx_dmn_exe_path_from_pid(Arena *arena, pid_t pid);
|
||||
internal String8 lnx_dmn_dl_path_from_pid(Arena *arena, pid_t pid, U64 auxv_base);
|
||||
internal ELF_Hdr64 lnx_dmn_ehdr_from_pid(pid_t pid);
|
||||
internal LNX_DMN_Auxv lnx_dmn_auxv_from_pid(pid_t pid, ELF_Class elf_class);
|
||||
internal LNX_DMN_Thread * lnx_dmn_thread_from_pid(pid_t pid);
|
||||
internal LNX_DMN_Process * lnx_dmn_process_from_pid(pid_t pid);
|
||||
|
||||
////////////////////////////////
|
||||
//~ Entity
|
||||
|
||||
// alloc
|
||||
internal DMN_LNX_Entity * dmn_lnx_entity_alloc(DMN_LNX_EntityKind kind);
|
||||
internal DMN_LNX_Process * dmn_lnx_process_alloc(pid_t pid, DMN_LNX_ProcessState state, DMN_LNX_Process *parent_process, B32 debug_subprocess, B32 is_cow);
|
||||
internal DMN_LNX_ProcessCtx * dmn_lnx_process_ctx_alloc(DMN_LNX_Process *process, B32 is_rebased);
|
||||
internal DMN_LNX_Thread * dmn_lnx_thread_alloc(DMN_LNX_Process *process, DMN_LNX_ThreadState thread_state, pid_t tid);
|
||||
internal DMN_LNX_Module * dmn_lnx_module_alloc(DMN_LNX_ProcessCtx *ctx, int memory_fd, U64 base_vaddr, U64 name_vaddr, U64 name_space_id, B32 is_main);
|
||||
internal LNX_DMN_Entity * lnx_dmn_entity_alloc(LNX_DMN_EntityKind kind);
|
||||
internal LNX_DMN_Process * lnx_dmn_process_alloc(pid_t pid, LNX_DMN_ProcessState state, LNX_DMN_Process *parent_process, B32 debug_subprocess, B32 is_cow);
|
||||
internal LNX_DMN_ProcessCtx * lnx_dmn_process_ctx_alloc(LNX_DMN_Process *process, B32 is_rebased);
|
||||
internal LNX_DMN_Thread * lnx_dmn_thread_alloc(LNX_DMN_Process *process, LNX_DMN_ThreadState thread_state, pid_t tid);
|
||||
internal LNX_DMN_Module * lnx_dmn_module_alloc(LNX_DMN_ProcessCtx *ctx, int memory_fd, U64 base_vaddr, U64 name_vaddr, U64 name_space_id, B32 is_main);
|
||||
|
||||
// release
|
||||
internal void dmn_lnx_entity_release(DMN_LNX_Entity *entity);
|
||||
internal void dmn_lnx_process_release(DMN_LNX_Process *process);
|
||||
internal void dmn_lnx_process_ctx_release(DMN_LNX_ProcessCtx *process_ctx);
|
||||
internal void dmn_lnx_thread_release(DMN_LNX_Thread *thread);
|
||||
internal void dmn_lnx_module_release(DMN_LNX_ProcessCtx *ctx, DMN_LNX_Module *module);
|
||||
internal void lnx_dmn_entity_release(LNX_DMN_Entity *entity);
|
||||
internal void lnx_dmn_process_release(LNX_DMN_Process *process);
|
||||
internal void lnx_dmn_process_ctx_release(LNX_DMN_ProcessCtx *process_ctx);
|
||||
internal void lnx_dmn_thread_release(LNX_DMN_Thread *thread);
|
||||
internal void lnx_dmn_module_release(LNX_DMN_ProcessCtx *ctx, LNX_DMN_Module *module);
|
||||
|
||||
// clone
|
||||
internal DMN_LNX_ProcessCtx * dmn_lnx_process_ctx_clone(DMN_LNX_Process *process, DMN_LNX_ProcessCtx *ctx);
|
||||
internal DMN_LNX_Module * dmn_lnx_module_clone(DMN_LNX_ProcessCtx *process_ctx, DMN_LNX_Module *module);
|
||||
internal LNX_DMN_ProcessCtx * lnx_dmn_process_ctx_clone(LNX_DMN_Process *process, LNX_DMN_ProcessCtx *ctx);
|
||||
internal LNX_DMN_Module * lnx_dmn_module_clone(LNX_DMN_ProcessCtx *process_ctx, LNX_DMN_Module *module);
|
||||
|
||||
// entity -> handle
|
||||
internal DMN_Handle dmn_lnx_handle_from_entity(DMN_LNX_Entity *entity);
|
||||
internal DMN_Handle dmn_lnx_handle_from_process(DMN_LNX_Process *process);
|
||||
internal DMN_Handle dmn_lnx_handle_from_process_ctx(DMN_LNX_ProcessCtx *process_ctx);
|
||||
internal DMN_Handle dmn_lnx_handle_from_thread(DMN_LNX_Thread *thread);
|
||||
internal DMN_Handle dmn_lnx_handle_from_module(DMN_LNX_Module *module);
|
||||
internal DMN_Handle lnx_dmn_handle_from_entity(LNX_DMN_Entity *entity);
|
||||
internal DMN_Handle lnx_dmn_handle_from_process(LNX_DMN_Process *process);
|
||||
internal DMN_Handle lnx_dmn_handle_from_process_ctx(LNX_DMN_ProcessCtx *process_ctx);
|
||||
internal DMN_Handle lnx_dmn_handle_from_thread(LNX_DMN_Thread *thread);
|
||||
internal DMN_Handle lnx_dmn_handle_from_module(LNX_DMN_Module *module);
|
||||
|
||||
// handle -> entity
|
||||
internal DMN_LNX_Entity * dmn_lnx_entity_from_handle(DMN_Handle handle, DMN_LNX_EntityKind expected_kind);
|
||||
internal DMN_LNX_Process * dmn_lnx_process_from_handle(DMN_Handle process_handle);
|
||||
internal DMN_LNX_ProcessCtx * dmn_lnx_process_ctx_from_handle(DMN_Handle process_ctx_handle);
|
||||
internal DMN_LNX_Thread * dmn_lnx_thread_from_handle(DMN_Handle thread_handle);
|
||||
internal DMN_LNX_Module * dmn_lnx_module_from_handle(DMN_Handle module_handle);
|
||||
internal LNX_DMN_Entity * lnx_dmn_entity_from_handle(DMN_Handle handle, LNX_DMN_EntityKind expected_kind);
|
||||
internal LNX_DMN_Process * lnx_dmn_process_from_handle(DMN_Handle process_handle);
|
||||
internal LNX_DMN_ProcessCtx * lnx_dmn_process_ctx_from_handle(DMN_Handle process_ctx_handle);
|
||||
internal LNX_DMN_Thread * lnx_dmn_thread_from_handle(DMN_Handle thread_handle);
|
||||
internal LNX_DMN_Module * lnx_dmn_module_from_handle(DMN_Handle module_handle);
|
||||
|
||||
////////////////////////////////
|
||||
//~ Process Helpers
|
||||
|
||||
internal void dmn_lnx_process_trap_probes(DMN_LNX_Process *process);
|
||||
internal void dmn_lnx_process_untrap_probes(DMN_LNX_Process *process);
|
||||
internal void lnx_dmn_process_trap_probes(LNX_DMN_Process *process);
|
||||
internal void lnx_dmn_process_untrap_probes(LNX_DMN_Process *process);
|
||||
|
||||
////////////////////////////////
|
||||
//~ Thread Helpers
|
||||
|
||||
internal U64 dmn_lnx_thread_read_ip(DMN_LNX_Thread *thread);
|
||||
internal U64 dmn_lnx_thread_read_sp(DMN_LNX_Thread *thread);
|
||||
internal void dmn_lnx_thread_write_ip(DMN_LNX_Thread *thread, U64 ip);
|
||||
internal void dmn_lnx_thread_write_sp(DMN_LNX_Thread *thread, U64 sp);
|
||||
internal B32 dmn_lnx_thread_read_reg_block(DMN_LNX_Thread *thread);
|
||||
internal B32 dmn_lnx_thread_write_reg_block(DMN_LNX_Thread *thread);
|
||||
internal B32 dmn_lnx_set_single_step_flag(DMN_LNX_Thread *thread, B32 is_on);
|
||||
internal U64 lnx_dmn_thread_read_ip(LNX_DMN_Thread *thread);
|
||||
internal U64 lnx_dmn_thread_read_sp(LNX_DMN_Thread *thread);
|
||||
internal void lnx_dmn_thread_write_ip(LNX_DMN_Thread *thread, U64 ip);
|
||||
internal void lnx_dmn_thread_write_sp(LNX_DMN_Thread *thread, U64 sp);
|
||||
internal B32 lnx_dmn_thread_read_reg_block(LNX_DMN_Thread *thread);
|
||||
internal B32 lnx_dmn_thread_write_reg_block(LNX_DMN_Thread *thread);
|
||||
internal B32 lnx_dmn_set_single_step_flag(LNX_DMN_Thread *thread, B32 is_on);
|
||||
|
||||
////////////////////////////////
|
||||
//~ List Helpers
|
||||
|
||||
internal void dmn_lnx_thread_ptr_list_push_node(DMN_LNX_ThreadPtrList *list, DMN_LNX_ThreadPtrNode *n);
|
||||
internal DMN_LNX_ThreadPtrNode * dmn_lnx_thread_ptr_list_push(Arena *arena, DMN_LNX_ThreadPtrList *list, DMN_LNX_Thread *v);
|
||||
internal DMN_LNX_ModulePtrNode * dmn_lnx_module_ptr_list_push(Arena *arena, DMN_LNX_ModulePtrList *list, DMN_LNX_Module *v);
|
||||
internal DMN_LNX_ProcessPtrNode * dmn_lnx_process_ptr_list_push(Arena *arena, DMN_LNX_ProcessPtrList *list, DMN_LNX_Process *v);
|
||||
internal void lnx_dmn_thread_ptr_list_push_node(LNX_DMN_ThreadPtrList *list, LNX_DMN_ThreadPtrNode *n);
|
||||
internal LNX_DMN_ThreadPtrNode * lnx_dmn_thread_ptr_list_push(Arena *arena, LNX_DMN_ThreadPtrList *list, LNX_DMN_Thread *v);
|
||||
internal LNX_DMN_ModulePtrNode * lnx_dmn_module_ptr_list_push(Arena *arena, LNX_DMN_ModulePtrList *list, LNX_DMN_Module *v);
|
||||
internal LNX_DMN_ProcessPtrNode * lnx_dmn_process_ptr_list_push(Arena *arena, LNX_DMN_ProcessPtrList *list, LNX_DMN_Process *v);
|
||||
|
||||
////////////////////////////////
|
||||
//~ Debug Event Pushers
|
||||
|
||||
internal void dmn_lnx_push_event_create_process(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process);
|
||||
internal void dmn_lnx_push_event_exit_process(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process);
|
||||
internal void dmn_lnx_push_event_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread);
|
||||
internal void dmn_lnx_push_event_exit_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 exit_code);
|
||||
internal void dmn_lnx_push_event_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, DMN_LNX_Module *module);
|
||||
internal void dmn_lnx_push_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, DMN_LNX_Module *module);
|
||||
internal void dmn_lnx_push_event_handshake_complete(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process);
|
||||
internal void dmn_lnx_push_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 address);
|
||||
internal void dmn_lnx_push_event_single_step(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread);
|
||||
internal void dmn_lnx_push_event_exception(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 signo);
|
||||
internal void dmn_lnx_push_event_halt(Arena *arena, DMN_EventList *events);
|
||||
internal void dmn_lnx_push_event_not_attached(Arena *arena, DMN_EventList *events);
|
||||
internal void lnx_dmn_push_event_create_process(Arena *arena, DMN_EventList *events, LNX_DMN_Process *process);
|
||||
internal void lnx_dmn_push_event_exit_process(Arena *arena, DMN_EventList *events, LNX_DMN_Process *process);
|
||||
internal void lnx_dmn_push_event_create_thread(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread);
|
||||
internal void lnx_dmn_push_event_exit_thread(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread, U64 exit_code);
|
||||
internal void lnx_dmn_push_event_load_module(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread, LNX_DMN_Module *module);
|
||||
internal void lnx_dmn_push_event_unload_module(Arena *arena, DMN_EventList *events, LNX_DMN_Process *process, LNX_DMN_Module *module);
|
||||
internal void lnx_dmn_push_event_handshake_complete(Arena *arena, DMN_EventList *events, LNX_DMN_Process *process);
|
||||
internal void lnx_dmn_push_event_breakpoint(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread, U64 address);
|
||||
internal void lnx_dmn_push_event_single_step(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread);
|
||||
internal void lnx_dmn_push_event_exception(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread, U64 signo);
|
||||
internal void lnx_dmn_push_event_halt(Arena *arena, DMN_EventList *events);
|
||||
internal void lnx_dmn_push_event_not_attached(Arena *arena, DMN_EventList *events);
|
||||
|
||||
////////////////////////////////
|
||||
//~ Debug Event
|
||||
|
||||
internal DMN_LNX_Thread * dmn_lnx_event_create_thread(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, pid_t tid);
|
||||
internal void dmn_lnx_event_exit_thread(Arena *arena, DMN_EventList *events, pid_t tid, U64 exit_code);
|
||||
internal DMN_LNX_Process * dmn_lnx_event_create_process(Arena *arena, DMN_EventList *events, pid_t pid, DMN_LNX_Process *parent_process, DMN_LNX_CreateProcessFlags flags);
|
||||
internal void dmn_lnx_event_exit_process(Arena *arena, DMN_EventList *events, pid_t pid);
|
||||
internal void dmn_lnx_event_load_module(Arena *arena, DMN_EventList *events, DMN_LNX_Thread *thread, U64 name_space_id, U64 new_link_map_vaddr);
|
||||
internal void dmn_lnx_event_unload_module(Arena *arena, DMN_EventList *events, DMN_LNX_Process *process, U64 rdebug_vaddr);
|
||||
internal void dmn_lnx_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *user_traps, pid_t tid);
|
||||
internal void dmn_lnx_event_data_breakpoint(Arena *arena, DMN_EventList *events, pid_t tid);
|
||||
internal void dmn_lnx_event_halt(Arena *arena, DMN_EventList *events);
|
||||
internal void dmn_lnx_event_single_step(Arena *arena, DMN_EventList *events, pid_t tid);
|
||||
internal void dmn_lnx_event_exception(Arena *arena, DMN_EventList *events, pid_t tid, U64 signo);
|
||||
internal DMN_LNX_Process * dmn_lnx_event_attach(Arena *arena, DMN_EventList *events, pid_t pid);
|
||||
|
||||
#endif // DEMON_CORE_LINUX_H
|
||||
internal LNX_DMN_Thread * lnx_dmn_event_create_thread(Arena *arena, DMN_EventList *events, LNX_DMN_Process *process, pid_t tid);
|
||||
internal void lnx_dmn_event_exit_thread(Arena *arena, DMN_EventList *events, pid_t tid, U64 exit_code);
|
||||
internal LNX_DMN_Process * lnx_dmn_event_create_process(Arena *arena, DMN_EventList *events, pid_t pid, LNX_DMN_Process *parent_process, LNX_DMN_CreateProcessFlags flags);
|
||||
internal void lnx_dmn_event_exit_process(Arena *arena, DMN_EventList *events, pid_t pid);
|
||||
internal void lnx_dmn_event_load_module(Arena *arena, DMN_EventList *events, LNX_DMN_Thread *thread, U64 name_space_id, U64 new_link_map_vaddr);
|
||||
internal void lnx_dmn_event_unload_module(Arena *arena, DMN_EventList *events, LNX_DMN_Process *process, U64 rdebug_vaddr);
|
||||
internal void lnx_dmn_event_breakpoint(Arena *arena, DMN_EventList *events, DMN_ActiveTrap *user_traps, pid_t tid);
|
||||
internal void lnx_dmn_event_data_breakpoint(Arena *arena, DMN_EventList *events, pid_t tid);
|
||||
internal void lnx_dmn_event_halt(Arena *arena, DMN_EventList *events);
|
||||
internal void lnx_dmn_event_single_step(Arena *arena, DMN_EventList *events, pid_t tid);
|
||||
internal void lnx_dmn_event_exception(Arena *arena, DMN_EventList *events, pid_t tid, U64 signo);
|
||||
internal LNX_DMN_Process * lnx_dmn_event_attach(Arena *arena, DMN_EventList *events, pid_t pid);
|
||||
|
||||
#endif // LINUX_DEMON_H
|
||||
|
||||
@@ -4,11 +4,11 @@
|
||||
////////////////////////////////
|
||||
//~ rjf: Helpers
|
||||
|
||||
internal OS_LNX_Window *
|
||||
internal LNX_WM_Window *
|
||||
os_lnx_window_from_x11window(Window window)
|
||||
{
|
||||
OS_LNX_Window *result = 0;
|
||||
for(OS_LNX_Window *w = os_lnx_gfx_state->first_window; w != 0; w = w->next)
|
||||
LNX_WM_Window *result = 0;
|
||||
for(LNX_WM_Window *w = os_lnx_gfx_state->first_window; w != 0; w = w->next)
|
||||
{
|
||||
if(w->window == window)
|
||||
{
|
||||
@@ -23,11 +23,11 @@ os_lnx_window_from_x11window(Window window)
|
||||
//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS)
|
||||
|
||||
internal void
|
||||
os_gfx_init(void)
|
||||
wm_init(void)
|
||||
{
|
||||
//- rjf: initialize basics
|
||||
Arena *arena = arena_alloc();
|
||||
os_lnx_gfx_state = push_array(arena, OS_LNX_GfxState, 1);
|
||||
os_lnx_gfx_state = push_array(arena, LNX_WM_GfxState, 1);
|
||||
os_lnx_gfx_state->arena = arena;
|
||||
os_lnx_gfx_state->display = XOpenDisplay(0);
|
||||
|
||||
@@ -48,20 +48,20 @@ os_gfx_init(void)
|
||||
{
|
||||
struct
|
||||
{
|
||||
OS_Cursor cursor;
|
||||
WM_Cursor cursor;
|
||||
unsigned int id;
|
||||
}
|
||||
map[] =
|
||||
{
|
||||
{OS_Cursor_Pointer, XC_left_ptr},
|
||||
{OS_Cursor_IBar, XC_xterm},
|
||||
{OS_Cursor_LeftRight, XC_sb_h_double_arrow},
|
||||
{OS_Cursor_UpDown, XC_sb_v_double_arrow},
|
||||
{OS_Cursor_DownRight, XC_bottom_right_corner},
|
||||
{OS_Cursor_UpRight, XC_top_right_corner},
|
||||
{OS_Cursor_UpDownLeftRight, XC_fleur},
|
||||
{OS_Cursor_HandPoint, XC_hand1},
|
||||
{OS_Cursor_Disabled, XC_X_cursor},
|
||||
{WM_Cursor_Pointer, XC_left_ptr},
|
||||
{WM_Cursor_IBar, XC_xterm},
|
||||
{WM_Cursor_LeftRight, XC_sb_h_double_arrow},
|
||||
{WM_Cursor_UpDown, XC_sb_v_double_arrow},
|
||||
{WM_Cursor_DownRight, XC_bottom_right_corner},
|
||||
{WM_Cursor_UpRight, XC_top_right_corner},
|
||||
{WM_Cursor_UpDownLeftRight, XC_fleur},
|
||||
{WM_Cursor_HandPoint, XC_hand1},
|
||||
{WM_Cursor_Disabled, XC_X_cursor},
|
||||
};
|
||||
for EachElement(idx, map)
|
||||
{
|
||||
@@ -73,8 +73,8 @@ os_gfx_init(void)
|
||||
////////////////////////////////
|
||||
//~ rjf: @os_hooks Graphics System Info (Implemented Per-OS)
|
||||
|
||||
internal OS_GfxInfo *
|
||||
os_get_gfx_info(void)
|
||||
internal WM_SystemInfo *
|
||||
wm_get_system_info(void)
|
||||
{
|
||||
return &os_lnx_gfx_state->gfx_info;
|
||||
}
|
||||
@@ -83,13 +83,13 @@ os_get_gfx_info(void)
|
||||
//~ rjf: @os_hooks Clipboards (Implemented Per-OS)
|
||||
|
||||
internal void
|
||||
os_set_clipboard_text(String8 string)
|
||||
wm_set_clipboard_text(String8 string)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
internal String8
|
||||
os_get_clipboard_text(Arena *arena)
|
||||
wm_get_clipboard_text(Arena *arena)
|
||||
{
|
||||
String8 result = {0};
|
||||
return result;
|
||||
@@ -98,20 +98,20 @@ os_get_clipboard_text(Arena *arena)
|
||||
////////////////////////////////
|
||||
//~ rjf: @os_hooks Windows (Implemented Per-OS)
|
||||
|
||||
internal OS_Window
|
||||
os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title)
|
||||
internal WM_Window
|
||||
wm_window_open(Rng2F32 rect, WM_WindowFlags flags, String8 title)
|
||||
{
|
||||
Vec2F32 resolution = dim_2f32(rect);
|
||||
|
||||
//- rjf: allocate window
|
||||
OS_LNX_Window *w = os_lnx_gfx_state->free_window;
|
||||
LNX_WM_Window *w = os_lnx_gfx_state->free_window;
|
||||
if(w)
|
||||
{
|
||||
SLLStackPop(os_lnx_gfx_state->free_window);
|
||||
}
|
||||
else
|
||||
{
|
||||
w = push_array_no_zero(os_lnx_gfx_state->arena, OS_LNX_Window, 1);
|
||||
w = push_array_no_zero(os_lnx_gfx_state->arena, LNX_WM_Window, 1);
|
||||
}
|
||||
MemoryZeroStruct(w);
|
||||
DLLPushBack(os_lnx_gfx_state->first_window, os_lnx_gfx_state->last_window, w);
|
||||
@@ -161,50 +161,50 @@ os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title)
|
||||
scratch_end(scratch);
|
||||
|
||||
//- rjf: convert to handle & return
|
||||
OS_Window handle = {(U64)w};
|
||||
WM_Window handle = {(U64)w};
|
||||
return handle;
|
||||
}
|
||||
|
||||
internal void
|
||||
os_window_close(OS_Window handle)
|
||||
wm_window_close(WM_Window handle)
|
||||
{
|
||||
if(os_window_match(handle, os_window_zero())) {return;}
|
||||
OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0];
|
||||
if(wm_window_match(handle, wm_window_zero())) {return;}
|
||||
LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0];
|
||||
XDestroyWindow(os_lnx_gfx_state->display, w->window);
|
||||
}
|
||||
|
||||
internal void
|
||||
os_window_set_title(OS_Window handle, String8 title)
|
||||
wm_window_set_title(WM_Window handle, String8 title)
|
||||
{
|
||||
if(os_window_match(handle, os_window_zero())) {return;}
|
||||
if(wm_window_match(handle, wm_window_zero())) {return;}
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0];
|
||||
LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0];
|
||||
String8 title_copy = push_str8_copy(scratch.arena, title);
|
||||
XStoreName(os_lnx_gfx_state->display, w->window, (char *)title_copy.str);
|
||||
scratch_end(scratch);
|
||||
}
|
||||
|
||||
internal void
|
||||
os_window_first_paint(OS_Window handle)
|
||||
wm_window_first_paint(WM_Window handle)
|
||||
{
|
||||
if(os_window_match(handle, os_window_zero())) {return;}
|
||||
OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0];
|
||||
if(wm_window_match(handle, wm_window_zero())) {return;}
|
||||
LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0];
|
||||
XMapWindow(os_lnx_gfx_state->display, w->window);
|
||||
}
|
||||
|
||||
internal void
|
||||
os_window_focus(OS_Window handle)
|
||||
wm_window_focus(WM_Window handle)
|
||||
{
|
||||
if(os_window_match(handle, os_window_zero())) {return;}
|
||||
OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0];
|
||||
if(wm_window_match(handle, wm_window_zero())) {return;}
|
||||
LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0];
|
||||
XSetInputFocus(os_lnx_gfx_state->display, w->window, RevertToNone, CurrentTime);
|
||||
}
|
||||
|
||||
internal B32
|
||||
os_window_is_focused(OS_Window handle)
|
||||
wm_window_is_focused(WM_Window handle)
|
||||
{
|
||||
if(os_window_match(handle, os_window_zero())) {return 0;}
|
||||
OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0];
|
||||
if(wm_window_match(handle, wm_window_zero())) {return 0;}
|
||||
LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0];
|
||||
Window focused_window = 0;
|
||||
int revert_to = 0;
|
||||
XGetInputFocus(os_lnx_gfx_state->display, &focused_window, &revert_to);
|
||||
@@ -213,97 +213,97 @@ os_window_is_focused(OS_Window handle)
|
||||
}
|
||||
|
||||
internal B32
|
||||
os_window_is_fullscreen(OS_Window handle)
|
||||
wm_window_is_fullscreen(WM_Window handle)
|
||||
{
|
||||
if(os_window_match(handle, os_window_zero())) {return 0;}
|
||||
if(wm_window_match(handle, wm_window_zero())) {return 0;}
|
||||
// TODO(rjf)
|
||||
return 0;
|
||||
}
|
||||
|
||||
internal void
|
||||
os_window_set_fullscreen(OS_Window handle, B32 fullscreen)
|
||||
wm_window_set_fullscreen(WM_Window handle, B32 fullscreen)
|
||||
{
|
||||
if(os_window_match(handle, os_window_zero())) {return;}
|
||||
if(wm_window_match(handle, wm_window_zero())) {return;}
|
||||
// TODO(rjf)
|
||||
}
|
||||
|
||||
internal B32
|
||||
os_window_is_maximized(OS_Window handle)
|
||||
wm_window_is_maximized(WM_Window handle)
|
||||
{
|
||||
if(os_window_match(handle, os_window_zero())) {return 0;}
|
||||
if(wm_window_match(handle, wm_window_zero())) {return 0;}
|
||||
// TODO(rjf)
|
||||
return 0;
|
||||
}
|
||||
|
||||
internal void
|
||||
os_window_set_maximized(OS_Window handle, B32 maximized)
|
||||
wm_window_set_maximized(WM_Window handle, B32 maximized)
|
||||
{
|
||||
if(os_window_match(handle, os_window_zero())) {return;}
|
||||
if(wm_window_match(handle, wm_window_zero())) {return;}
|
||||
// TODO(rjf)
|
||||
}
|
||||
|
||||
internal B32
|
||||
os_window_is_minimized(OS_Window handle)
|
||||
wm_window_is_minimized(WM_Window handle)
|
||||
{
|
||||
if(os_window_match(handle, os_window_zero())) {return 0;}
|
||||
if(wm_window_match(handle, wm_window_zero())) {return 0;}
|
||||
// TODO(rjf)
|
||||
return 0;
|
||||
}
|
||||
|
||||
internal void
|
||||
os_window_set_minimized(OS_Window handle, B32 minimized)
|
||||
wm_window_set_minimized(WM_Window handle, B32 minimized)
|
||||
{
|
||||
if(os_window_match(handle, os_window_zero())) {return;}
|
||||
if(wm_window_match(handle, wm_window_zero())) {return;}
|
||||
// TODO(rjf)
|
||||
}
|
||||
|
||||
internal void
|
||||
os_window_bring_to_front(OS_Window handle)
|
||||
wm_window_bring_to_front(WM_Window handle)
|
||||
{
|
||||
if(os_window_match(handle, os_window_zero())) {return;}
|
||||
if(wm_window_match(handle, wm_window_zero())) {return;}
|
||||
// TODO(rjf)
|
||||
}
|
||||
|
||||
internal void
|
||||
os_window_set_monitor(OS_Window handle, OS_Monitor monitor)
|
||||
wm_window_set_monitor(WM_Window handle, WM_Monitor monitor)
|
||||
{
|
||||
if(os_window_match(handle, os_window_zero())) {return;}
|
||||
if(wm_window_match(handle, wm_window_zero())) {return;}
|
||||
// TODO(rjf)
|
||||
}
|
||||
|
||||
internal void
|
||||
os_window_clear_custom_border_data(OS_Window handle)
|
||||
wm_window_clear_custom_border_data(WM_Window handle)
|
||||
{
|
||||
if(os_window_match(handle, os_window_zero())) {return;}
|
||||
if(wm_window_match(handle, wm_window_zero())) {return;}
|
||||
// TODO(rjf)
|
||||
}
|
||||
|
||||
internal void
|
||||
os_window_push_custom_title_bar(OS_Window handle, F32 thickness)
|
||||
wm_window_push_custom_title_bar(WM_Window handle, F32 thickness)
|
||||
{
|
||||
if(os_window_match(handle, os_window_zero())) {return;}
|
||||
if(wm_window_match(handle, wm_window_zero())) {return;}
|
||||
// TODO(rjf)
|
||||
}
|
||||
|
||||
internal void
|
||||
os_window_push_custom_edges(OS_Window handle, F32 thickness)
|
||||
wm_window_push_custom_edges(WM_Window handle, F32 thickness)
|
||||
{
|
||||
if(os_window_match(handle, os_window_zero())) {return;}
|
||||
if(wm_window_match(handle, wm_window_zero())) {return;}
|
||||
// TODO(rjf)
|
||||
}
|
||||
|
||||
internal void
|
||||
os_window_push_custom_title_bar_client_area(OS_Window handle, Rng2F32 rect)
|
||||
wm_window_push_custom_title_bar_client_area(WM_Window handle, Rng2F32 rect)
|
||||
{
|
||||
if(os_window_match(handle, os_window_zero())) {return;}
|
||||
if(wm_window_match(handle, wm_window_zero())) {return;}
|
||||
// TODO(rjf)
|
||||
}
|
||||
|
||||
internal Rng2F32
|
||||
os_rect_from_window(OS_Window handle)
|
||||
wm_rect_from_window(WM_Window handle)
|
||||
{
|
||||
if(os_window_match(handle, os_window_zero())) {return r2f32p(0, 0, 0, 0);}
|
||||
OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0];
|
||||
if(wm_window_match(handle, wm_window_zero())) {return r2f32p(0, 0, 0, 0);}
|
||||
LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0];
|
||||
XWindowAttributes atts = {0};
|
||||
Status s = XGetWindowAttributes(os_lnx_gfx_state->display, w->window, &atts);
|
||||
Rng2F32 result = r2f32p((F32)atts.x, (F32)atts.y, (F32)atts.x + (F32)atts.width, (F32)atts.y + (F32)atts.height);
|
||||
@@ -311,9 +311,9 @@ os_rect_from_window(OS_Window handle)
|
||||
}
|
||||
|
||||
internal Rng2F32
|
||||
os_client_rect_from_window(OS_Window handle)
|
||||
wm_client_rect_from_window(WM_Window handle)
|
||||
{
|
||||
OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0];
|
||||
LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0];
|
||||
XWindowAttributes atts = {0};
|
||||
Status s = XGetWindowAttributes(os_lnx_gfx_state->display, w->window, &atts);
|
||||
Rng2F32 result = r2f32p(0, 0, (F32)atts.width, (F32)atts.height);
|
||||
@@ -321,7 +321,7 @@ os_client_rect_from_window(OS_Window handle)
|
||||
}
|
||||
|
||||
internal F32
|
||||
os_dpi_from_window(OS_Window handle)
|
||||
wm_dpi_from_window(WM_Window handle)
|
||||
{
|
||||
// TODO(rjf)
|
||||
return 96.f;
|
||||
@@ -330,16 +330,16 @@ os_dpi_from_window(OS_Window handle)
|
||||
////////////////////////////////
|
||||
//~ rjf: @os_hooks External Windows (Implemented Per-OS)
|
||||
|
||||
internal OS_ExternalWindow
|
||||
os_focused_external_window(void)
|
||||
internal WM_ExtWindow
|
||||
wm_focused_external_window(void)
|
||||
{
|
||||
OS_ExternalWindow result = {0};
|
||||
WM_ExtWindow result = {0};
|
||||
// TODO(rjf)
|
||||
return result;
|
||||
}
|
||||
|
||||
internal void
|
||||
os_focus_external_window(OS_ExternalWindow handle)
|
||||
wm_focus_external_window(WM_ExtWindow handle)
|
||||
{
|
||||
// TODO(rjf)
|
||||
}
|
||||
@@ -347,46 +347,46 @@ os_focus_external_window(OS_ExternalWindow handle)
|
||||
////////////////////////////////
|
||||
//~ rjf: @os_hooks Monitors (Implemented Per-OS)
|
||||
|
||||
internal OS_MonitorArray
|
||||
os_push_monitors_array(Arena *arena)
|
||||
internal WM_MonitorArray
|
||||
wm_push_monitors_array(Arena *arena)
|
||||
{
|
||||
OS_MonitorArray result = {0};
|
||||
WM_MonitorArray result = {0};
|
||||
// TODO(rjf)
|
||||
return result;
|
||||
}
|
||||
|
||||
internal OS_Monitor
|
||||
os_primary_monitor(void)
|
||||
internal WM_Monitor
|
||||
wm_primary_monitor(void)
|
||||
{
|
||||
OS_Monitor result = {0};
|
||||
WM_Monitor result = {0};
|
||||
// TODO(rjf)
|
||||
return result;
|
||||
}
|
||||
|
||||
internal OS_Monitor
|
||||
os_monitor_from_window(OS_Window window)
|
||||
internal WM_Monitor
|
||||
wm_monitor_from_window(WM_Window window)
|
||||
{
|
||||
OS_Monitor result = {0};
|
||||
WM_Monitor result = {0};
|
||||
// TODO(rjf)
|
||||
return result;
|
||||
}
|
||||
|
||||
internal String8
|
||||
os_name_from_monitor(Arena *arena, OS_Monitor monitor)
|
||||
wm_name_from_monitor(Arena *arena, WM_Monitor monitor)
|
||||
{
|
||||
// TODO(rjf)
|
||||
return str8_zero();
|
||||
}
|
||||
|
||||
internal Vec2F32
|
||||
os_dim_from_monitor(OS_Monitor monitor)
|
||||
wm_dim_from_monitor(WM_Monitor monitor)
|
||||
{
|
||||
// TODO(rjf)
|
||||
return v2f32(0, 0);
|
||||
}
|
||||
|
||||
internal F32
|
||||
os_dpi_from_monitor(OS_Monitor monitor)
|
||||
wm_dpi_from_monitor(WM_Monitor monitor)
|
||||
{
|
||||
// TODO(rjf)
|
||||
return 96.f;
|
||||
@@ -396,15 +396,15 @@ os_dpi_from_monitor(OS_Monitor monitor)
|
||||
//~ rjf: @os_hooks Events (Implemented Per-OS)
|
||||
|
||||
internal void
|
||||
os_send_wakeup_event(void)
|
||||
wm_send_wakeup_event(void)
|
||||
{
|
||||
// TODO(rjf)
|
||||
}
|
||||
|
||||
internal OS_EventList
|
||||
os_get_events(Arena *arena, B32 wait)
|
||||
internal WM_EventList
|
||||
wm_get_events(Arena *arena, B32 wait)
|
||||
{
|
||||
OS_EventList evts = {0};
|
||||
WM_EventList evts = {0};
|
||||
for(;XPending(os_lnx_gfx_state->display) > 0 || (wait && evts.count == 0);)
|
||||
{
|
||||
XEvent evt = {0};
|
||||
@@ -419,86 +419,86 @@ os_get_events(Arena *arena, B32 wait)
|
||||
case KeyRelease:
|
||||
{
|
||||
// rjf: determine flags
|
||||
OS_Modifiers modifiers = 0;
|
||||
if(evt.xkey.state & ShiftMask) { modifiers |= OS_Modifier_Shift; }
|
||||
if(evt.xkey.state & ControlMask) { modifiers |= OS_Modifier_Ctrl; }
|
||||
if(evt.xkey.state & Mod1Mask) { modifiers |= OS_Modifier_Alt; }
|
||||
WM_Modifiers modifiers = 0;
|
||||
if(evt.xkey.state & ShiftMask) { modifiers |= WM_Modifier_Shift; }
|
||||
if(evt.xkey.state & ControlMask) { modifiers |= WM_Modifier_Ctrl; }
|
||||
if(evt.xkey.state & Mod1Mask) { modifiers |= WM_Modifier_Alt; }
|
||||
|
||||
// rjf: map keycode -> keysym & codepoint
|
||||
OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xkey.window);
|
||||
LNX_WM_Window *window = os_lnx_window_from_x11window(evt.xkey.window);
|
||||
KeySym keysym = 0;
|
||||
U8 text[256] = {0};
|
||||
U64 text_size = Xutf8LookupString(window->xic, &evt.xkey, (char *)text, sizeof(text), &keysym, 0);
|
||||
|
||||
// rjf: map keysym -> OS_Key
|
||||
// rjf: map keysym -> WM_Key
|
||||
B32 is_right_sided = 0;
|
||||
OS_Key key = OS_Key_Null;
|
||||
WM_Key key = WM_Key_Null;
|
||||
switch(keysym)
|
||||
{
|
||||
default:
|
||||
{
|
||||
if(0){}
|
||||
else if(XK_F1 <= keysym && keysym <= XK_F24) { key = (OS_Key)(OS_Key_F1 + (keysym - XK_F1)); }
|
||||
else if('0' <= keysym && keysym <= '9') { key = OS_Key_0 + (keysym-'0'); }
|
||||
else if(XK_F1 <= keysym && keysym <= XK_F24) { key = (WM_Key)(WM_Key_F1 + (keysym - XK_F1)); }
|
||||
else if('0' <= keysym && keysym <= '9') { key = WM_Key_0 + (keysym-'0'); }
|
||||
}break;
|
||||
case XK_Escape:{key = OS_Key_Esc;};break;
|
||||
case XK_BackSpace:{key = OS_Key_Backspace;}break;
|
||||
case XK_Delete:{key = OS_Key_Delete;}break;
|
||||
case XK_Return:{key = OS_Key_Return;}break;
|
||||
case XK_Pause:{key = OS_Key_Pause;}break;
|
||||
case XK_Tab:{key = OS_Key_Tab;}break;
|
||||
case XK_Left:{key = OS_Key_Left;}break;
|
||||
case XK_Right:{key = OS_Key_Right;}break;
|
||||
case XK_Up:{key = OS_Key_Up;}break;
|
||||
case XK_Down:{key = OS_Key_Down;}break;
|
||||
case XK_Home:{key = OS_Key_Home;}break;
|
||||
case XK_End:{key = OS_Key_End;}break;
|
||||
case XK_Page_Up:{key = OS_Key_PageUp;}break;
|
||||
case XK_Page_Down:{key = OS_Key_PageDown;}break;
|
||||
case XK_Alt_L:{ key = OS_Key_Alt; }break;
|
||||
case XK_Alt_R:{ key = OS_Key_Alt; is_right_sided = 1;}break;
|
||||
case XK_Shift_L:{ key = OS_Key_Shift; }break;
|
||||
case XK_Shift_R:{ key = OS_Key_Shift; is_right_sided = 1;}break;
|
||||
case XK_Control_L:{ key = OS_Key_Ctrl; }break;
|
||||
case XK_Control_R:{ key = OS_Key_Ctrl; is_right_sided = 1;}break;
|
||||
case '-':{key = OS_Key_Minus;}break;
|
||||
case '=':{key = OS_Key_Equal;}break;
|
||||
case '[':{key = OS_Key_LeftBracket;}break;
|
||||
case ']':{key = OS_Key_RightBracket;}break;
|
||||
case ';':{key = OS_Key_Semicolon;}break;
|
||||
case '\'':{key = OS_Key_Quote;}break;
|
||||
case '.':{key = OS_Key_Period;}break;
|
||||
case ',':{key = OS_Key_Comma;}break;
|
||||
case '/':{key = OS_Key_Slash;}break;
|
||||
case '\\':{key = OS_Key_BackSlash;}break;
|
||||
case '\t':{key = OS_Key_Tab;}break;
|
||||
case 'a':case 'A':{key = OS_Key_A;}break;
|
||||
case 'b':case 'B':{key = OS_Key_B;}break;
|
||||
case 'c':case 'C':{key = OS_Key_C;}break;
|
||||
case 'd':case 'D':{key = OS_Key_D;}break;
|
||||
case 'e':case 'E':{key = OS_Key_E;}break;
|
||||
case 'f':case 'F':{key = OS_Key_F;}break;
|
||||
case 'g':case 'G':{key = OS_Key_G;}break;
|
||||
case 'h':case 'H':{key = OS_Key_H;}break;
|
||||
case 'i':case 'I':{key = OS_Key_I;}break;
|
||||
case 'j':case 'J':{key = OS_Key_J;}break;
|
||||
case 'k':case 'K':{key = OS_Key_K;}break;
|
||||
case 'l':case 'L':{key = OS_Key_L;}break;
|
||||
case 'm':case 'M':{key = OS_Key_M;}break;
|
||||
case 'n':case 'N':{key = OS_Key_N;}break;
|
||||
case 'o':case 'O':{key = OS_Key_O;}break;
|
||||
case 'p':case 'P':{key = OS_Key_P;}break;
|
||||
case 'q':case 'Q':{key = OS_Key_Q;}break;
|
||||
case 'r':case 'R':{key = OS_Key_R;}break;
|
||||
case 's':case 'S':{key = OS_Key_S;}break;
|
||||
case 't':case 'T':{key = OS_Key_T;}break;
|
||||
case 'u':case 'U':{key = OS_Key_U;}break;
|
||||
case 'v':case 'V':{key = OS_Key_V;}break;
|
||||
case 'w':case 'W':{key = OS_Key_W;}break;
|
||||
case 'x':case 'X':{key = OS_Key_X;}break;
|
||||
case 'y':case 'Y':{key = OS_Key_Y;}break;
|
||||
case 'z':case 'Z':{key = OS_Key_Z;}break;
|
||||
case ' ':{key = OS_Key_Space;}break;
|
||||
case XK_Escape:{key = WM_Key_Esc;};break;
|
||||
case XK_BackSpace:{key = WM_Key_Backspace;}break;
|
||||
case XK_Delete:{key = WM_Key_Delete;}break;
|
||||
case XK_Return:{key = WM_Key_Return;}break;
|
||||
case XK_Pause:{key = WM_Key_Pause;}break;
|
||||
case XK_Tab:{key = WM_Key_Tab;}break;
|
||||
case XK_Left:{key = WM_Key_Left;}break;
|
||||
case XK_Right:{key = WM_Key_Right;}break;
|
||||
case XK_Up:{key = WM_Key_Up;}break;
|
||||
case XK_Down:{key = WM_Key_Down;}break;
|
||||
case XK_Home:{key = WM_Key_Home;}break;
|
||||
case XK_End:{key = WM_Key_End;}break;
|
||||
case XK_Page_Up:{key = WM_Key_PageUp;}break;
|
||||
case XK_Page_Down:{key = WM_Key_PageDown;}break;
|
||||
case XK_Alt_L:{ key = WM_Key_Alt; }break;
|
||||
case XK_Alt_R:{ key = WM_Key_Alt; is_right_sided = 1;}break;
|
||||
case XK_Shift_L:{ key = WM_Key_Shift; }break;
|
||||
case XK_Shift_R:{ key = WM_Key_Shift; is_right_sided = 1;}break;
|
||||
case XK_Control_L:{ key = WM_Key_Ctrl; }break;
|
||||
case XK_Control_R:{ key = WM_Key_Ctrl; is_right_sided = 1;}break;
|
||||
case '-':{key = WM_Key_Minus;}break;
|
||||
case '=':{key = WM_Key_Equal;}break;
|
||||
case '[':{key = WM_Key_LeftBracket;}break;
|
||||
case ']':{key = WM_Key_RightBracket;}break;
|
||||
case ';':{key = WM_Key_Semicolon;}break;
|
||||
case '\'':{key = WM_Key_Quote;}break;
|
||||
case '.':{key = WM_Key_Period;}break;
|
||||
case ',':{key = WM_Key_Comma;}break;
|
||||
case '/':{key = WM_Key_Slash;}break;
|
||||
case '\\':{key = WM_Key_BackSlash;}break;
|
||||
case '\t':{key = WM_Key_Tab;}break;
|
||||
case 'a':case 'A':{key = WM_Key_A;}break;
|
||||
case 'b':case 'B':{key = WM_Key_B;}break;
|
||||
case 'c':case 'C':{key = WM_Key_C;}break;
|
||||
case 'd':case 'D':{key = WM_Key_D;}break;
|
||||
case 'e':case 'E':{key = WM_Key_E;}break;
|
||||
case 'f':case 'F':{key = WM_Key_F;}break;
|
||||
case 'g':case 'G':{key = WM_Key_G;}break;
|
||||
case 'h':case 'H':{key = WM_Key_H;}break;
|
||||
case 'i':case 'I':{key = WM_Key_I;}break;
|
||||
case 'j':case 'J':{key = WM_Key_J;}break;
|
||||
case 'k':case 'K':{key = WM_Key_K;}break;
|
||||
case 'l':case 'L':{key = WM_Key_L;}break;
|
||||
case 'm':case 'M':{key = WM_Key_M;}break;
|
||||
case 'n':case 'N':{key = WM_Key_N;}break;
|
||||
case 'o':case 'O':{key = WM_Key_O;}break;
|
||||
case 'p':case 'P':{key = WM_Key_P;}break;
|
||||
case 'q':case 'Q':{key = WM_Key_Q;}break;
|
||||
case 'r':case 'R':{key = WM_Key_R;}break;
|
||||
case 's':case 'S':{key = WM_Key_S;}break;
|
||||
case 't':case 'T':{key = WM_Key_T;}break;
|
||||
case 'u':case 'U':{key = WM_Key_U;}break;
|
||||
case 'v':case 'V':{key = WM_Key_V;}break;
|
||||
case 'w':case 'W':{key = WM_Key_W;}break;
|
||||
case 'x':case 'X':{key = WM_Key_X;}break;
|
||||
case 'y':case 'Y':{key = WM_Key_Y;}break;
|
||||
case 'z':case 'Z':{key = WM_Key_Z;}break;
|
||||
case ' ':{key = WM_Key_Space;}break;
|
||||
}
|
||||
|
||||
// rjf: push text event
|
||||
@@ -509,7 +509,7 @@ os_get_events(Arena *arena, B32 wait)
|
||||
UnicodeDecode decode = utf8_decode(text+off, text_size-off);
|
||||
if(decode.codepoint != 0 && (decode.codepoint >= 32 || decode.codepoint == '\t'))
|
||||
{
|
||||
OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_Text);
|
||||
WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_Text);
|
||||
e->window.u64[0] = (U64)window;
|
||||
e->character = decode.codepoint;
|
||||
}
|
||||
@@ -523,7 +523,7 @@ os_get_events(Arena *arena, B32 wait)
|
||||
|
||||
// rjf: push key event
|
||||
{
|
||||
OS_Event *e = os_event_list_push_new(arena, &evts, evt.type == KeyPress ? OS_EventKind_Press : OS_EventKind_Release);
|
||||
WM_Event *e = wm_event_list_push_new(arena, &evts, evt.type == KeyPress ? WM_EventKind_Press : WM_EventKind_Release);
|
||||
e->window.u64[0] = (U64)window;
|
||||
e->modifiers = modifiers;
|
||||
e->key = key;
|
||||
@@ -536,26 +536,26 @@ os_get_events(Arena *arena, B32 wait)
|
||||
case ButtonRelease:
|
||||
{
|
||||
// rjf: determine flags
|
||||
OS_Modifiers modifiers = 0;
|
||||
if(evt.xbutton.state & ShiftMask) { modifiers |= OS_Modifier_Shift; }
|
||||
if(evt.xbutton.state & ControlMask) { modifiers |= OS_Modifier_Ctrl; }
|
||||
if(evt.xbutton.state & Mod1Mask) { modifiers |= OS_Modifier_Alt; }
|
||||
WM_Modifiers modifiers = 0;
|
||||
if(evt.xbutton.state & ShiftMask) { modifiers |= WM_Modifier_Shift; }
|
||||
if(evt.xbutton.state & ControlMask) { modifiers |= WM_Modifier_Ctrl; }
|
||||
if(evt.xbutton.state & Mod1Mask) { modifiers |= WM_Modifier_Alt; }
|
||||
|
||||
// rjf: map button -> OS_Key
|
||||
OS_Key key = OS_Key_Null;
|
||||
// rjf: map button -> WM_Key
|
||||
WM_Key key = WM_Key_Null;
|
||||
switch(evt.xbutton.button)
|
||||
{
|
||||
default:{}break;
|
||||
case Button1:{key = OS_Key_LeftMouseButton;}break;
|
||||
case Button2:{key = OS_Key_MiddleMouseButton;}break;
|
||||
case Button3:{key = OS_Key_RightMouseButton;}break;
|
||||
case Button1:{key = WM_Key_LeftMouseButton;}break;
|
||||
case Button2:{key = WM_Key_MiddleMouseButton;}break;
|
||||
case Button3:{key = WM_Key_RightMouseButton;}break;
|
||||
}
|
||||
|
||||
// rjf: push event
|
||||
OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xbutton.window);
|
||||
if(key != OS_Key_Null)
|
||||
LNX_WM_Window *window = os_lnx_window_from_x11window(evt.xbutton.window);
|
||||
if(key != WM_Key_Null)
|
||||
{
|
||||
OS_Event *e = os_event_list_push_new(arena, &evts, evt.type == ButtonPress ? OS_EventKind_Press : OS_EventKind_Release);
|
||||
WM_Event *e = wm_event_list_push_new(arena, &evts, evt.type == ButtonPress ? WM_EventKind_Press : WM_EventKind_Release);
|
||||
e->window.u64[0] = (U64)window;
|
||||
e->modifiers = modifiers;
|
||||
e->key = key;
|
||||
@@ -564,7 +564,7 @@ os_get_events(Arena *arena, B32 wait)
|
||||
else if(evt.xbutton.button == Button4 ||
|
||||
evt.xbutton.button == Button5)
|
||||
{
|
||||
OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_Scroll);
|
||||
WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_Scroll);
|
||||
e->window.u64[0] = (U64)window;
|
||||
e->modifiers = modifiers;
|
||||
e->delta = v2f32(0, evt.xbutton.button == Button4 ? -1.f : +1.f);
|
||||
@@ -575,8 +575,8 @@ os_get_events(Arena *arena, B32 wait)
|
||||
//- rjf: mouse motion
|
||||
case MotionNotify:
|
||||
{
|
||||
OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xclient.window);
|
||||
OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_MouseMove);
|
||||
LNX_WM_Window *window = os_lnx_window_from_x11window(evt.xclient.window);
|
||||
WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_MouseMove);
|
||||
e->window.u64[0] = (U64)window;
|
||||
e->pos.x = (F32)evt.xmotion.x;
|
||||
e->pos.y = (F32)evt.xmotion.y;
|
||||
@@ -589,8 +589,8 @@ os_get_events(Arena *arena, B32 wait)
|
||||
}break;
|
||||
case FocusOut:
|
||||
{
|
||||
OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xfocus.window);
|
||||
OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_WindowLoseFocus);
|
||||
LNX_WM_Window *window = os_lnx_window_from_x11window(evt.xfocus.window);
|
||||
WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_WindowLoseFocus);
|
||||
e->window.u64[0] = (U64)window;
|
||||
}break;
|
||||
|
||||
@@ -599,13 +599,13 @@ os_get_events(Arena *arena, B32 wait)
|
||||
{
|
||||
if((Atom)evt.xclient.data.l[0] == os_lnx_gfx_state->wm_delete_window_atom)
|
||||
{
|
||||
OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xclient.window);
|
||||
OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_WindowClose);
|
||||
LNX_WM_Window *window = os_lnx_window_from_x11window(evt.xclient.window);
|
||||
WM_Event *e = wm_event_list_push_new(arena, &evts, WM_EventKind_WindowClose);
|
||||
e->window.u64[0] = (U64)window;
|
||||
}
|
||||
else if((Atom)evt.xclient.data.l[0] == os_lnx_gfx_state->wm_sync_request_atom)
|
||||
{
|
||||
OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xclient.window);
|
||||
LNX_WM_Window *window = os_lnx_window_from_x11window(evt.xclient.window);
|
||||
if(window != 0)
|
||||
{
|
||||
window->counter_value = 0;
|
||||
@@ -637,25 +637,25 @@ os_get_events(Arena *arena, B32 wait)
|
||||
return evts;
|
||||
}
|
||||
|
||||
internal OS_Modifiers
|
||||
os_get_modifiers(void)
|
||||
internal WM_Modifiers
|
||||
wm_get_modifiers(void)
|
||||
{
|
||||
// TODO(rjf)
|
||||
return 0;
|
||||
}
|
||||
|
||||
internal B32
|
||||
os_key_is_down(OS_Key key)
|
||||
wm_key_is_down(WM_Key key)
|
||||
{
|
||||
// TODO(rjf)
|
||||
return 0;
|
||||
}
|
||||
|
||||
internal Vec2F32
|
||||
os_mouse_from_window(OS_Window handle)
|
||||
wm_mouse_from_window(WM_Window handle)
|
||||
{
|
||||
if(os_window_match(handle, os_window_zero())) {return v2f32(0, 0);}
|
||||
OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0];
|
||||
if(wm_window_match(handle, wm_window_zero())) {return v2f32(0, 0);}
|
||||
LNX_WM_Window *w = (LNX_WM_Window *)handle.u64[0];
|
||||
Vec2F32 result = {0};
|
||||
{
|
||||
Window root_window = 0;
|
||||
@@ -678,7 +678,7 @@ os_mouse_from_window(OS_Window handle)
|
||||
//~ rjf: @os_hooks Cursors (Implemented Per-OS)
|
||||
|
||||
internal void
|
||||
os_set_cursor(OS_Cursor cursor)
|
||||
wm_set_cursor(WM_Cursor cursor)
|
||||
{
|
||||
os_lnx_gfx_state->last_set_cursor = cursor;
|
||||
}
|
||||
@@ -687,7 +687,7 @@ os_set_cursor(OS_Cursor cursor)
|
||||
//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS)
|
||||
|
||||
internal void
|
||||
os_graphical_message(B32 error, String8 title, String8 message)
|
||||
wm_graphical_message(B32 error, String8 title, String8 message)
|
||||
{
|
||||
if(error)
|
||||
{
|
||||
@@ -698,7 +698,7 @@ os_graphical_message(B32 error, String8 title, String8 message)
|
||||
}
|
||||
|
||||
internal String8
|
||||
os_graphical_pick_file(Arena *arena, String8 initial_path)
|
||||
wm_graphical_pick_file(Arena *arena, String8 initial_path)
|
||||
{
|
||||
return str8_zero();
|
||||
}
|
||||
@@ -707,13 +707,13 @@ os_graphical_pick_file(Arena *arena, String8 initial_path)
|
||||
//~ rjf: @os_hooks Shell Operations
|
||||
|
||||
internal void
|
||||
os_show_in_filesystem_ui(String8 path)
|
||||
wm_show_in_filesystem_ui(String8 path)
|
||||
{
|
||||
// TODO(rjf)
|
||||
}
|
||||
|
||||
internal void
|
||||
os_open_in_browser(String8 url)
|
||||
wm_open_in_browser(String8 url)
|
||||
{
|
||||
// TODO(rjf)
|
||||
}
|
||||
|
||||
@@ -17,11 +17,11 @@
|
||||
////////////////////////////////
|
||||
//~ rjf: Window State
|
||||
|
||||
typedef struct OS_LNX_Window OS_LNX_Window;
|
||||
struct OS_LNX_Window
|
||||
typedef struct LNX_WM_Window LNX_WM_Window;
|
||||
struct LNX_WM_Window
|
||||
{
|
||||
OS_LNX_Window *next;
|
||||
OS_LNX_Window *prev;
|
||||
LNX_WM_Window *next;
|
||||
LNX_WM_Window *prev;
|
||||
Window window;
|
||||
XIC xic;
|
||||
XID counter_xid;
|
||||
@@ -31,31 +31,31 @@ struct OS_LNX_Window
|
||||
////////////////////////////////
|
||||
//~ rjf: State Bundle
|
||||
|
||||
typedef struct OS_LNX_GfxState OS_LNX_GfxState;
|
||||
struct OS_LNX_GfxState
|
||||
typedef struct LNX_WM_GfxState LNX_WM_GfxState;
|
||||
struct LNX_WM_GfxState
|
||||
{
|
||||
Arena *arena;
|
||||
Display *display;
|
||||
XIM xim;
|
||||
OS_LNX_Window *first_window;
|
||||
OS_LNX_Window *last_window;
|
||||
OS_LNX_Window *free_window;
|
||||
LNX_WM_Window *first_window;
|
||||
LNX_WM_Window *last_window;
|
||||
LNX_WM_Window *free_window;
|
||||
Atom wm_delete_window_atom;
|
||||
Atom wm_sync_request_atom;
|
||||
Atom wm_sync_request_counter_atom;
|
||||
Cursor cursors[OS_Cursor_COUNT];
|
||||
OS_Cursor last_set_cursor;
|
||||
OS_GfxInfo gfx_info;
|
||||
Cursor cursors[WM_Cursor_COUNT];
|
||||
WM_Cursor last_set_cursor;
|
||||
WM_SystemInfo gfx_info;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Globals
|
||||
|
||||
global OS_LNX_GfxState *os_lnx_gfx_state = 0;
|
||||
global LNX_WM_GfxState *os_lnx_gfx_state = 0;
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Helpers
|
||||
|
||||
internal OS_LNX_Window *os_lnx_window_from_x11window(Window window);
|
||||
internal LNX_WM_Window *os_lnx_window_from_x11window(Window window);
|
||||
|
||||
#endif // OS_GFX_LINUX_H
|
||||
|
||||
Reference in New Issue
Block a user