203 lines
6.0 KiB
C
203 lines
6.0 KiB
C
#pragma comment(lib, "user32")
|
|
#pragma comment(lib, "shell32")
|
|
#include <shellapi.h>
|
|
|
|
f64 GetUnixTimestamp ();
|
|
s64 GetUnixTimestampNanoseconds ();
|
|
|
|
enum class Wait_For_Result: s32 {
|
|
SUCCESS = 0,
|
|
TIMEOUT = 1,
|
|
ERROR = 2 // can't use ERROR because of Windows.h *sigh*
|
|
};
|
|
|
|
internal void semaphore_init (Semaphore* sem, s32 initial_value = 0);
|
|
internal void semaphore_destroy (Semaphore* sem);
|
|
internal void signal (Semaphore* sem);
|
|
internal Wait_For_Result wait_for (Semaphore* sem, s32 milliseconds = -1);
|
|
|
|
internal void condition_variable_init (Condition_Variable* cv);
|
|
internal void condition_variable_destroy (Condition_Variable* cv);
|
|
internal void wait (Condition_Variable* cv, Mutex* mutex, s32 wait_time_ms = -1);
|
|
internal void wake (Condition_Variable* cv);
|
|
internal void wake_all (Condition_Variable* cv);
|
|
|
|
typedef u32 OS_Error_Code;
|
|
internal string get_error_string (OS_Error_Code error_code);
|
|
|
|
internal bool file_is_valid (File file);
|
|
internal File file_open (string file_path, bool for_writing=false, bool keep_existing_content=false, bool log_errors=false);
|
|
internal void file_close (File* file);
|
|
internal bool file_read (File file, void* data, s64 bytes_to_read_count, s64* bytes_read_count=nullptr);
|
|
internal bool file_length (File file, s64* length);
|
|
internal bool file_length (string file_path, s64* length);
|
|
internal s64 file_current_position (File file);
|
|
internal bool file_set_position (File file, s64 position);
|
|
internal ArrayView<u8> read_entire_file (File file);
|
|
internal ArrayView<u8> read_entire_file (string file_path, bool log_errors=false);
|
|
|
|
// use to_byte_view to convert ArrayView<non-u8> to ArrayView<u8>
|
|
internal bool file_write (File* file, void* data, s64 length);
|
|
internal bool write_entire_file (string file_path, void* file_data, s64 count);
|
|
internal bool write_entire_file (string file_path, ArrayView<u8> file_data);
|
|
|
|
// file_write
|
|
// write_entire_file...
|
|
|
|
// #TODO #fs File System Operations
|
|
// file_move, file_delete
|
|
|
|
// #window_creation
|
|
typedef HWND Window_Type;
|
|
typedef HICON Window_Icon;
|
|
|
|
struct Window_Dimensions {
|
|
s32 window_x;
|
|
s32 window_y;
|
|
s32 window_width;
|
|
s32 window_height;
|
|
};
|
|
|
|
struct Window_Info {
|
|
Window_Type window;
|
|
Window_Dimensions initial_dimensions; // for resetting.
|
|
Window_Icon icon;
|
|
Window_Icon icon_minimized;
|
|
|
|
bool is_main_window;
|
|
bool tray_icon_added;
|
|
bool minimized_to_tray;
|
|
// Platform-Specific (Win32)
|
|
HMENU tray_icon_menu;
|
|
HDC hdc;
|
|
// Likely will only be used for main window:
|
|
NOTIFYICONDATAW nid;
|
|
};
|
|
|
|
// #move: Monitor - platform-independent hardware monitor information:
|
|
struct Monitor {
|
|
s64 left;
|
|
s64 top;
|
|
s64 right;
|
|
s64 bottom;
|
|
bool primary;
|
|
bool present;
|
|
#if OS_WINDOWS
|
|
MONITORINFO monitor_info;
|
|
#endif
|
|
};
|
|
|
|
enum class Win32_Drive_Type: s32 {
|
|
Unknown = 0,
|
|
No_Root_Dir = 1,
|
|
Removable = 2,
|
|
Fixed = 3,
|
|
Remote = 4,
|
|
cdrom = 5,
|
|
ramdisk = 6
|
|
};
|
|
|
|
enum class File_System: s32 {
|
|
Unknown = 0,
|
|
MusaFS = 1,
|
|
exFAT = 2,
|
|
Ext2 = 65,
|
|
Ext3 = 66,
|
|
Ext4 = 67,
|
|
Btrfs = 79,
|
|
XFS = 86,
|
|
ZFS = 91,
|
|
NTFS = 128, // Windows
|
|
ReFS = 130, // Windows
|
|
AFS = 256, // Apple File System
|
|
F2FS = 1024,
|
|
// Legacy systems:
|
|
FAT32 = -1,
|
|
// FAT16 :: -2;
|
|
// FAT12 :: -3;
|
|
};
|
|
|
|
string to_string (Win32_Drive_Type type) {
|
|
switch (type) {
|
|
case Win32_Drive_Type::Unknown: { return "Unknown"; } break;
|
|
case Win32_Drive_Type::No_Root_Dir: { return "No_Root_Dir"; } break;
|
|
case Win32_Drive_Type::Removable: { return "Removable"; } break;
|
|
case Win32_Drive_Type::Fixed: { return "Fixed"; } break;
|
|
case Win32_Drive_Type::Remote: { return "Remote"; } break;
|
|
case Win32_Drive_Type::cdrom: { return "cdrom"; } break;
|
|
case Win32_Drive_Type::ramdisk: { return "ramdisk"; } break;
|
|
}
|
|
|
|
Assert(false);
|
|
return "Unknown";
|
|
}
|
|
|
|
string to_string (File_System fs) {
|
|
switch (fs) {
|
|
case File_System::Unknown: { return "Unknown"; } break;
|
|
case File_System::MusaFS: { return "MusaFS"; } break;
|
|
case File_System::exFAT: { return "exFAT"; } break;
|
|
case File_System::Ext2: { return "Ext2"; } break;
|
|
case File_System::Ext3: { return "Ext3"; } break;
|
|
case File_System::Ext4: { return "Ext4"; } break;
|
|
case File_System::Btrfs: { return "Btrfs"; } break;
|
|
case File_System::XFS: { return "XFS"; } break;
|
|
case File_System::ZFS: { return "ZFS"; } break;
|
|
case File_System::NTFS: { return "NTFS"; } break;
|
|
case File_System::ReFS: { return "ReFS"; } break;
|
|
case File_System::AFS: { return "AFS"; } break;
|
|
case File_System::F2FS: { return "F2FS"; } break;
|
|
case File_System::FAT32: { return "FAT32"; } break;
|
|
}
|
|
|
|
Assert(false);
|
|
return "Unknown";
|
|
}
|
|
|
|
File_System Win32_filesystem_from_string (string s) {
|
|
string s_copy = to_lower_copy(s);
|
|
|
|
if (s_copy == "ntfs") { return File_System::NTFS; }
|
|
if (s_copy == "refs") { return File_System::ReFS; }
|
|
if (s_copy == "fat") { return File_System::FAT32; }
|
|
if (s_copy == "exfat") { return File_System::exFAT; }
|
|
|
|
Assert(false);
|
|
return File_System::Unknown;
|
|
}
|
|
struct Dense_FS; // #Temp forward declare!
|
|
struct Win32_Drive {
|
|
// Arena* pool;
|
|
string label;
|
|
string volume_name;
|
|
Win32_Drive_Type type;
|
|
File_System file_system;
|
|
s64 full_size;
|
|
s64 free_space;
|
|
u32 serial_number;
|
|
u32 max_component_length;
|
|
u32 file_system_flags;
|
|
bool is_present;
|
|
// Not sure if this should be here...
|
|
// f32 enumeration_time;
|
|
// f64 last_seen_alive_timestamp;
|
|
Dense_FS* data;
|
|
};
|
|
|
|
typedef Win32_Drive OS_Drive;
|
|
|
|
bool os_window_is_minimized (Window_Type window);
|
|
|
|
bool os_main_window_is_minimized ();
|
|
|
|
bool os_create_window (string new_window_name, Window_Type parent=nullptr, bool center_window=true, bool open_on_largest_monitor=true, bool display_window=true, void* wnd_proc_override=nullptr);
|
|
|
|
Window_Info get_main_window ();
|
|
Window_Info* get_main_window_pointer ();
|
|
|
|
// struct File_Contents {
|
|
// File file = {};
|
|
// ArrayView<u8> file_data = {};
|
|
// bool read_success = false;
|
|
// };
|