diff options
Diffstat (limited to 'src/x11')
| -rw-r--r-- | src/x11/ffi.rs | 17 | ||||
| -rw-r--r-- | src/x11/window/mod.rs | 17 | 
2 files changed, 30 insertions, 4 deletions
| diff --git a/src/x11/ffi.rs b/src/x11/ffi.rs index f9dc3ad..6fbfd81 100644 --- a/src/x11/ffi.rs +++ b/src/x11/ffi.rs @@ -1338,6 +1338,23 @@ pub struct XButtonEvent {  }  #[repr(C)] +pub struct XConfigureEvent { +    pub type_: libc::c_int, +    pub serial: libc::c_ulong, +    pub send_event: Bool, +    pub display: *mut Display, +    pub event: Window, +    pub window: Window, +    pub x: libc::c_int, +    pub y: libc::c_int, +    pub width: libc::c_int, +    pub height: libc::c_int, +    pub border_width: libc::c_int, +    pub above: Window, +    pub override_redirect: Bool, +} + +#[repr(C)]  pub struct XF86VidModeModeInfo {      pub dotclock: libc::c_uint,      pub hdisplay: libc::c_ushort, diff --git a/src/x11/window/mod.rs b/src/x11/window/mod.rs index d69feab..62e8bfb 100644 --- a/src/x11/window/mod.rs +++ b/src/x11/window/mod.rs @@ -33,6 +33,7 @@ pub struct Window {      screen_id: libc::c_int,      is_fullscreen: bool,      current_modifiers: Cell<KeyModifiers>, +    current_size: Cell<(libc::c_int, libc::c_int)>,  }  impl Window { @@ -134,7 +135,7 @@ impl Window {          let mut set_win_attr = {              let mut swa: ffi::XSetWindowAttributes = unsafe { mem::zeroed() };              swa.colormap = cmap; -            swa.event_mask = ffi::ExposureMask | ffi::ResizeRedirectMask | +            swa.event_mask = ffi::ExposureMask | ffi::StructureNotifyMask |                  ffi::VisibilityChangeMask | ffi::KeyPressMask | ffi::PointerMotionMask |                  ffi::KeyReleaseMask | ffi::ButtonPressMask |                  ffi::ButtonReleaseMask | ffi::KeymapStateMask; @@ -246,6 +247,9 @@ impl Window {              context          }; +        // Make context current before call to glViewport below. +        unsafe { ffi::glx::MakeCurrent(display, window, context) }; +          // creating the window object          let window = Window {              display: display, @@ -259,6 +263,7 @@ impl Window {              screen_id: screen_id,              is_fullscreen: builder.monitor.is_some(),              current_modifiers: Cell::new(KeyModifiers::empty()), +            current_size: Cell::new((0, 0)),          };          // calling glViewport @@ -367,10 +372,14 @@ impl Window {                      }                  }, -                ffi::ResizeRequest => { +                ffi::ConfigureNotify => {                      use Resized; -                    let rs_event: &ffi::XResizeRequestEvent = unsafe { mem::transmute(&xev) }; -                    events.push(Resized(rs_event.width as uint, rs_event.height as uint)); +                    let cfg_event: &ffi::XConfigureEvent = unsafe { mem::transmute(&xev) }; +                    let (current_width, current_height) = self.current_size.get(); +                    if current_width != cfg_event.width || current_height != cfg_event.height { +                        self.current_size.set((cfg_event.width, cfg_event.height)); +                        events.push(Resized(cfg_event.width as uint, cfg_event.height as uint)); +                    }                  },                  ffi::MotionNotify => { | 
