aboutsummaryrefslogtreecommitdiffstats
path: root/src/win32/init.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/win32/init.rs')
-rw-r--r--src/win32/init.rs70
1 files changed, 33 insertions, 37 deletions
diff --git a/src/win32/init.rs b/src/win32/init.rs
index 365bcb8..0da916b 100644
--- a/src/win32/init.rs
+++ b/src/win32/init.rs
@@ -40,12 +40,12 @@ pub fn new_window(builder: WindowBuilder) -> Result<Window, String> {
cbClsExtra: 0,
cbWndExtra: 0,
hInstance: unsafe { ffi::GetModuleHandleW(ptr::null()) },
- hIcon: ptr::mut_null(),
- hCursor: ptr::mut_null(),
- hbrBackground: ptr::mut_null(),
+ hIcon: ptr::null(),
+ hCursor: ptr::null(),
+ hbrBackground: ptr::null(),
lpszMenuName: ptr::null(),
lpszClassName: class_name.as_ptr(),
- hIconSm: ptr::mut_null(),
+ hIconSm: ptr::null(),
};
// We ignore errors because registering the same window class twice would trigger
@@ -87,7 +87,7 @@ pub fn new_window(builder: WindowBuilder) -> Result<Window, String> {
screen_settings.dmFields = ffi::DM_BITSPERPEL | ffi::DM_PELSWIDTH | ffi::DM_PELSHEIGHT;
let result = unsafe { ffi::ChangeDisplaySettingsExW(monitor.get_system_name().as_ptr(),
- &mut screen_settings, ptr::mut_null(), ffi::CDS_FULLSCREEN, ptr::mut_null()) };
+ &mut screen_settings, ptr::null(), ffi::CDS_FULLSCREEN, ptr::mut_null()) };
if result != ffi::DISP_CHANGE_SUCCESSFUL {
tx.send(Err(format!("ChangeDisplaySettings failed: {}", result)));
@@ -106,9 +106,9 @@ pub fn new_window(builder: WindowBuilder) -> Result<Window, String> {
// adjusting the window coordinates using the style
unsafe { ffi::AdjustWindowRectEx(&mut rect, style, 0, ex_style) };
- // getting the address of wglCreateContextAttribs and the pixel format
+ // getting the address of wglCreateContextAttribsARB and the pixel format
// that we will use
- let (create_context_attribs, pixel_format) = {
+ let (extra_functions, pixel_format) = {
// creating a dummy invisible window for GL initialization
let dummy_window = unsafe {
let handle = ffi::CreateWindowExW(ex_style, class_name.as_ptr(),
@@ -116,7 +116,7 @@ pub fn new_window(builder: WindowBuilder) -> Result<Window, String> {
style | ffi::WS_CLIPSIBLINGS | ffi::WS_CLIPCHILDREN,
ffi::CW_USEDEFAULT, ffi::CW_USEDEFAULT,
rect.right - rect.left, rect.bottom - rect.top,
- ptr::mut_null(), ptr::mut_null(), ffi::GetModuleHandleW(ptr::null()),
+ ptr::null(), ptr::null(), ffi::GetModuleHandleW(ptr::null()),
ptr::mut_null());
if handle.is_null() {
@@ -191,7 +191,7 @@ pub fn new_window(builder: WindowBuilder) -> Result<Window, String> {
// creating the dummy OpenGL context
let dummy_context = {
- let ctxt = unsafe { ffi::wglCreateContext(dummy_hdc) };
+ let ctxt = unsafe { ffi::wgl::CreateContext(dummy_hdc) };
if ctxt.is_null() {
tx.send(Err(format!("wglCreateContext function failed: {}",
os::error_string(os::errno() as uint))));
@@ -202,33 +202,27 @@ pub fn new_window(builder: WindowBuilder) -> Result<Window, String> {
};
// making context current
- unsafe { ffi::wglMakeCurrent(dummy_hdc, dummy_context); }
-
- // getting the pointer to wglCreateContextAttribs
- let mut addr = unsafe { ffi::wglGetProcAddress(b"wglCreateContextAttribs".as_ptr()
- as *const i8) } as *const ();
-
- if addr.is_null() {
- addr = unsafe { ffi::wglGetProcAddress(b"wglCreateContextAttribsARB".as_ptr()
- as *const i8) } as *const ();
- }
+ unsafe { ffi::wgl::MakeCurrent(dummy_hdc, dummy_context); }
+
+ // loading the extra WGL functions
+ let extra_functions = ffi::wgl_extra::Wgl::load_with(|addr| {
+ unsafe {
+ addr.with_c_str(|s| {
+ use libc;
+ ffi::wgl::GetProcAddress(s) as *const libc::c_void
+ })
+ }
+ });
// removing current context
- unsafe { ffi::wglMakeCurrent(ptr::mut_null(), ptr::mut_null()); }
+ unsafe { ffi::wgl::MakeCurrent(ptr::null(), ptr::null()); }
// destroying the context and the window
- unsafe { ffi::wglDeleteContext(dummy_context); }
+ unsafe { ffi::wgl::DeleteContext(dummy_context); }
unsafe { ffi::DestroyWindow(dummy_window); }
// returning the address
- if addr.is_null() {
- (None, pixel_format)
- } else {
- use libc;
- let addr: extern "system" fn(ffi::HDC, ffi::HGLRC, *const libc::c_int) -> ffi::HGLRC
- = unsafe { mem::transmute(addr) };
- (Some(addr), pixel_format)
- }
+ (extra_functions, pixel_format)
};
// creating the real window this time
@@ -245,7 +239,7 @@ pub fn new_window(builder: WindowBuilder) -> Result<Window, String> {
if builder.monitor.is_some() { 0 } else { ffi::CW_USEDEFAULT },
if builder.monitor.is_some() { 0 } else { ffi::CW_USEDEFAULT },
width.unwrap_or(ffi::CW_USEDEFAULT), height.unwrap_or(ffi::CW_USEDEFAULT),
- ptr::mut_null(), ptr::mut_null(), ffi::GetModuleHandleW(ptr::null()),
+ ptr::null(), ptr::null(), ffi::GetModuleHandleW(ptr::null()),
ptr::mut_null());
if handle.is_null() {
@@ -288,18 +282,20 @@ pub fn new_window(builder: WindowBuilder) -> Result<Window, String> {
if builder.gl_version.is_some() {
let version = builder.gl_version.as_ref().unwrap();
- attributes.push(ffi::WGL_CONTEXT_MAJOR_VERSION_ARB);
+ attributes.push(ffi::wgl_extra::CONTEXT_MAJOR_VERSION_ARB as libc::c_int);
attributes.push(version.val0() as libc::c_int);
- attributes.push(ffi::WGL_CONTEXT_MINOR_VERSION_ARB);
+ attributes.push(ffi::wgl_extra::CONTEXT_MINOR_VERSION_ARB as libc::c_int);
attributes.push(version.val1() as libc::c_int);
}
attributes.push(0);
let ctxt = unsafe {
- match create_context_attribs {
- None => ffi::wglCreateContext(hdc),
- Some(ptr) => ptr(hdc, ptr::mut_null(), attributes.as_slice().as_ptr())
+ if extra_functions.CreateContextAttribsARB.is_loaded() {
+ extra_functions.CreateContextAttribsARB(hdc, ptr::null(),
+ attributes.as_slice().as_ptr())
+ } else {
+ ffi::wgl::CreateContext(hdc)
}
};
@@ -332,7 +328,7 @@ pub fn new_window(builder: WindowBuilder) -> Result<Window, String> {
if lib.is_null() {
tx.send(Err(format!("LoadLibrary function failed: {}",
os::error_string(os::errno() as uint))));
- unsafe { ffi::wglDeleteContext(context); }
+ unsafe { ffi::wgl::DeleteContext(context); }
unsafe { ffi::DestroyWindow(real_window); }
return;
}
@@ -357,7 +353,7 @@ pub fn new_window(builder: WindowBuilder) -> Result<Window, String> {
loop {
let mut msg = unsafe { mem::uninitialized() };
- if unsafe { ffi::GetMessageW(&mut msg, ptr::mut_null(), 0, 0) } == 0 {
+ if unsafe { ffi::GetMessageW(&mut msg, ptr::null(), 0, 0) } == 0 {
break;
}