browser_window_core/window/
c.rs

1//! This module implements the `Window` trait with the corresponding function definitions found in the C code base of `browser-window-c`.
2//! All functions are basically wrapping the FFI provided by crate `browser-window-c`.
3
4use super::{
5	WindowExt,
6	WindowOptions
7};
8
9use crate::{
10	application::ApplicationImpl,
11	prelude::*
12};
13
14use std::{
15	os::raw::c_char,
16	ptr
17};
18
19
20
21#[derive(Clone,Copy)]
22pub struct WindowImpl {
23	pub(in crate) inner: *mut cbw_Window
24}
25
26
27
28impl WindowImpl {
29
30	pub fn new(
31		app: ApplicationImpl,
32		parent: Self,
33		title: &str,
34		width: Option<u32>,
35		height: Option<u32>,
36		options: &WindowOptions,
37		user_data: *mut ()
38	) -> Self {
39		let str_slice: cbw_CStrSlice = title.into();
40
41		let w = match width {
42			None => -1i32,
43			Some( x ) => x as i32
44		};
45		let h = match height {
46			None => -1i32,
47			Some( x ) => x as i32
48		};
49
50		let handle = unsafe { cbw_Window_new(
51			app.inner,
52			parent.inner,
53			str_slice,
54			w,
55			h,
56			options,
57			user_data as _
58		) };
59
60		// Return
61		Self { inner: handle }
62	}
63}
64
65impl WindowExt for WindowImpl {
66
67	fn app( &self ) -> ApplicationImpl {
68		ApplicationImpl { inner: unsafe { (*self.inner).app } }
69	}
70
71	fn destroy( &self ) {
72		unsafe { cbw_Window_destroy( self.inner ) }
73	}
74
75	fn drop( &self ) {
76		unsafe { cbw_Window_drop( self.inner ) }
77	}
78
79	fn get_content_dimensions( &self ) -> Dims2D {
80		unsafe { Dims2D(cbw_Window_getContentDimensions( self.inner )) }
81	}
82
83	fn get_opacity( &self ) -> u8 {
84		unsafe { cbw_Window_getOpacity( self.inner ) }
85	}
86
87	fn get_position( &self ) -> Pos2D {
88		unsafe { Pos2D(cbw_Window_getPosition( self.inner )) }
89	}
90
91	fn get_title( &self ) -> String {
92		// First obtain string size
93		let mut buf: *mut c_char = ptr::null_mut();
94		let buf_len = unsafe { cbw_Window_getTitle( self.inner, &mut buf) };
95
96		let slice = cbw_StrSlice { data: buf, len: buf_len };
97
98		unsafe { cbw_string_freeCstr(buf) };
99
100		// Convert to String
101		slice.into()
102	}
103
104	fn get_window_dimensions( &self ) -> Dims2D {
105		unsafe { Dims2D(cbw_Window_getWindowDimensions( self.inner )) }
106	}
107
108	fn hide( &self ) {
109		unsafe { cbw_Window_hide( self.inner ) }
110	}
111
112	fn set_content_dimensions( &self, dimensions: Dims2D ) {
113		unsafe { cbw_Window_setContentDimensions( self.inner, dimensions.0 ) }
114	}
115
116	fn set_opacity( &self, opacity: u8 ) {
117		unsafe { cbw_Window_setOpacity( self.inner, opacity ) }
118	}
119
120	fn set_position( &self, position: Pos2D ) {
121		unsafe { cbw_Window_setPosition( self.inner, position.0 ) }
122	}
123
124	fn set_title( &self, title: &str ) {
125		let slice: cbw_CStrSlice = title.into();
126		unsafe { cbw_Window_setTitle( self.inner, slice ) };
127	}
128
129	fn set_window_dimensions( &self, dimensions: Dims2D ) {
130		unsafe { cbw_Window_setWindowDimensions( self.inner, dimensions.0 ) }
131	}
132
133	fn show( &self ) {
134		unsafe { cbw_Window_show( self.inner ) }
135	}
136}
137
138impl Default for WindowImpl {
139	fn default() -> Self {
140		Self {
141			inner: ptr::null_mut()
142		}
143	}
144}