linux updates:

* Fix double clipboard
* Implement the new memory stuff
master
insofaras 2016-07-12 02:41:55 +01:00
parent 0d5f6e82d3
commit 0146c990d8
1 changed files with 33 additions and 25 deletions

View File

@ -647,42 +647,43 @@ MEMORY_ALLOCATE_SIG(system_memory_allocate){
internal internal
MEMORY_SET_PROTECTION_SIG(system_memory_set_protection){ MEMORY_SET_PROTECTION_SIG(system_memory_set_protection){
#if 0 // NOTE(allen):
// NOTE(allen): Don't know how to do this off the top
// of my head. Here is a copy of the windows version.
// There is no such thing as "write only" in windows // There is no such thing as "write only" in windows
// so I just made write = write + read in all cases. // so I just made write = write + read in all cases.
bool32 result = false; bool32 result = 1;
DWORD old_protect = 0; int protect = 0;
DWORD protect = 0;
flags = flags & 0x7; flags = flags & 0x7;
switch (flags){ switch (flags){
case 0: case 0:
protect = PAGE_NOACCESS; break; protect = PROT_NONE; break;
case MemProtect_Read: case MemProtect_Read:
protect = PAGE_READONLY; break; protect = PROT_READ; break;
case MemProtect_Write: case MemProtect_Write:
case MemProtect_Read|MemProtect_Write: case MemProtect_Read|MemProtect_Write:
protect = PAGE_READWRITE; break; protect = PROT_READ | PROT_WRITE; break;
case MemProtect_Execute: case MemProtect_Execute:
protect = PAGE_EXECUTE; break; protect = PROT_EXEC; break;
case MemProtect_Execute|MemProtect_Read: case MemProtect_Execute|MemProtect_Read:
protect = PAGE_EXECUTE_READ; break; protect = PROT_READ | PROT_EXEC; break;
// NOTE(inso): some W^X protection things might be unhappy about this one
case MemProtect_Execute|MemProtect_Write: case MemProtect_Execute|MemProtect_Write:
case MemProtect_Execute|MemProtect_Write|MemProtect_Read: case MemProtect_Execute|MemProtect_Write|MemProtect_Read:
protect = PAGE_EXECUTE_READWRITE; break; protect = PROT_READ | PROT_WRITE | PROT_EXEC; break;
} }
VirtualProtect(ptr, size, protect, &old_protect); if(mprotect(ptr, size, protect) == -1){
result = 0;
perror("mprotect");
}
return(result); return(result);
#endif
} }
internal internal
@ -1288,22 +1289,26 @@ LinuxLoadAppCode(String* base_dir){
internal void internal void
LinuxLoadSystemCode(){ LinuxLoadSystemCode(){
linuxvars.system.file_time_stamp = system_file_time_stamp; linuxvars.system.file_time_stamp = system_file_time_stamp;
linuxvars.system.file_unique_hash = system_file_unique_hash; linuxvars.system.now_time_stamp = system_now_time_stamp;
linuxvars.system.set_file_list = system_set_file_list; linuxvars.system.set_file_list = system_set_file_list;
linuxvars.system.file_unique_hash = system_file_unique_hash;
linuxvars.system.file_track = system_file_track; linuxvars.system.file_track = system_file_track;
linuxvars.system.file_untrack = system_file_untrack; linuxvars.system.file_untrack = system_file_untrack;
linuxvars.system.file_load_begin = system_file_load_begin; linuxvars.system.file_load_begin = system_file_load_begin;
linuxvars.system.file_load_end = system_file_load_end; linuxvars.system.file_load_end = system_file_load_end;
linuxvars.system.file_save = system_file_save; linuxvars.system.file_save = system_file_save;
linuxvars.system.memory_allocate = system_memory_allocate;
linuxvars.system.memory_set_protection = system_memory_set_protection;
linuxvars.system.memory_free = system_memory_free;
linuxvars.system.file_exists = system_file_exists; linuxvars.system.file_exists = system_file_exists;
linuxvars.system.directory_cd = system_directory_cd; linuxvars.system.directory_cd = system_directory_cd;
linuxvars.system.get_4ed_path = system_get_4ed_path; linuxvars.system.get_4ed_path = system_get_4ed_path;
linuxvars.system.show_mouse_cursor = system_show_mouse_cursor; linuxvars.system.show_mouse_cursor = system_show_mouse_cursor;
linuxvars.system.post_clipboard = system_post_clipboard; linuxvars.system.post_clipboard = system_post_clipboard;
linuxvars.system.now_time_stamp = system_now_time_stamp;
linuxvars.system.create_coroutine = system_create_coroutine; linuxvars.system.create_coroutine = system_create_coroutine;
linuxvars.system.launch_coroutine = system_launch_coroutine; linuxvars.system.launch_coroutine = system_launch_coroutine;
@ -2462,14 +2467,17 @@ LinuxHandleX11Events(void)
default: { default: {
if(Event.type == linuxvars.xfixes_selection_event){ if(Event.type == linuxvars.xfixes_selection_event){
XConvertSelection( XFixesSelectionNotifyEvent* sne = (XFixesSelectionNotifyEvent*)&Event;
linuxvars.XDisplay, if(sne->subtype == XFixesSelectionNotify && sne->owner != linuxvars.XWindow){
linuxvars.atom_CLIPBOARD, XConvertSelection(
linuxvars.atom_UTF8_STRING, linuxvars.XDisplay,
linuxvars.atom_CLIPBOARD, linuxvars.atom_CLIPBOARD,
linuxvars.XWindow, linuxvars.atom_UTF8_STRING,
CurrentTime linuxvars.atom_CLIPBOARD,
); linuxvars.XWindow,
CurrentTime
);
}
} }
}break; }break;
} }