1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// This file was generated by gir (https://github.com/gtk-rs/gir)
// from gir-files (https://github.com/gtk-rs/gir-files)
// DO NOT EDIT

use crate::Initable;
use glib::object::Cast;
use glib::object::IsA;
use glib::signal::connect_raw;
use glib::signal::SignalHandlerId;
use glib::translate::*;
use std::boxed::Box as Box_;
use std::fmt;
use std::mem::transmute;

glib::wrapper! {
    /// [`PowerProfileMonitor`][crate::PowerProfileMonitor] makes it possible for applications as well as OS components
    /// to monitor system power profiles and act upon them. It currently only exports
    /// whether the system is in “Power Saver” mode (known as “Low Power” mode on
    /// some systems).
    ///
    /// When in “Low Power” mode, it is recommended that applications:
    /// - disabling automatic downloads
    /// - reduce the rate of refresh from online sources such as calendar or
    ///  email synchronisation
    /// - if the application has expensive visual effects, reduce them
    ///
    /// It is also likely that OS components providing services to applications will
    /// lower their own background activity, for the sake of the system.
    ///
    /// There are a variety of tools that exist for power consumption analysis, but those
    /// usually depend on the OS and hardware used. On Linux, one could use `upower` to
    /// monitor the battery discharge rate, `powertop` to check on the background activity
    /// or activity at all), `sysprof` to inspect CPU usage, and `intel_gpu_time` to
    /// profile GPU usage.
    ///
    /// Don't forget to disconnect the `signal::PowerProfileMonitor::notify`::power-saver-enabled
    /// signal, and unref the [`PowerProfileMonitor`][crate::PowerProfileMonitor] itself when exiting.
    ///
    /// # Implements
    ///
    /// [`PowerProfileMonitorExt`][trait@crate::prelude::PowerProfileMonitorExt], [`InitableExt`][trait@crate::prelude::InitableExt]
    #[doc(alias = "GPowerProfileMonitor")]
    pub struct PowerProfileMonitor(Interface<ffi::GPowerProfileMonitor, ffi::GPowerProfileMonitorInterface>) @requires Initable;

    match fn {
        type_ => || ffi::g_power_profile_monitor_get_type(),
    }
}

impl PowerProfileMonitor {
    pub const NONE: Option<&'static PowerProfileMonitor> = None;

    /// Gets a reference to the default [`PowerProfileMonitor`][crate::PowerProfileMonitor] for the system.
    ///
    /// # Returns
    ///
    /// a new reference to the default [`PowerProfileMonitor`][crate::PowerProfileMonitor]
    #[doc(alias = "g_power_profile_monitor_dup_default")]
    #[doc(alias = "dup_default")]
    pub fn get_default() -> PowerProfileMonitor {
        unsafe { from_glib_full(ffi::g_power_profile_monitor_dup_default()) }
    }
}

/// Trait containing all [`struct@PowerProfileMonitor`] methods.
///
/// # Implementors
///
/// [`PowerProfileMonitor`][struct@crate::PowerProfileMonitor]
pub trait PowerProfileMonitorExt: 'static {
    /// Gets whether the system is in “Power Saver” mode.
    ///
    /// You are expected to listen to the
    /// `signal::PowerProfileMonitor::notify`::power-saver-enabled signal to know when the profile has
    /// changed.
    ///
    /// # Returns
    ///
    /// Whether the system is in “Power Saver” mode.
    #[doc(alias = "g_power_profile_monitor_get_power_saver_enabled")]
    #[doc(alias = "get_power_saver_enabled")]
    fn is_power_saver_enabled(&self) -> bool;

    #[cfg(any(feature = "v2_70", feature = "dox"))]
    #[cfg_attr(feature = "dox", doc(cfg(feature = "v2_70")))]
    #[doc(alias = "power-saver-enabled")]
    fn connect_power_saver_enabled_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
}

impl<O: IsA<PowerProfileMonitor>> PowerProfileMonitorExt for O {
    fn is_power_saver_enabled(&self) -> bool {
        unsafe {
            from_glib(ffi::g_power_profile_monitor_get_power_saver_enabled(
                self.as_ref().to_glib_none().0,
            ))
        }
    }

    #[cfg(any(feature = "v2_70", feature = "dox"))]
    #[cfg_attr(feature = "dox", doc(cfg(feature = "v2_70")))]
    fn connect_power_saver_enabled_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
        unsafe extern "C" fn notify_power_saver_enabled_trampoline<
            P: IsA<PowerProfileMonitor>,
            F: Fn(&P) + 'static,
        >(
            this: *mut ffi::GPowerProfileMonitor,
            _param_spec: glib::ffi::gpointer,
            f: glib::ffi::gpointer,
        ) {
            let f: &F = &*(f as *const F);
            f(PowerProfileMonitor::from_glib_borrow(this).unsafe_cast_ref())
        }
        unsafe {
            let f: Box_<F> = Box_::new(f);
            connect_raw(
                self.as_ptr() as *mut _,
                b"notify::power-saver-enabled\0".as_ptr() as *const _,
                Some(transmute::<_, unsafe extern "C" fn()>(
                    notify_power_saver_enabled_trampoline::<Self, F> as *const (),
                )),
                Box_::into_raw(f),
            )
        }
    }
}

impl fmt::Display for PowerProfileMonitor {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        f.write_str("PowerProfileMonitor")
    }
}