diff options
Diffstat (limited to 'battstat/battstat_applet.c')
-rw-r--r-- | battstat/battstat_applet.c | 1716 |
1 files changed, 869 insertions, 847 deletions
diff --git a/battstat/battstat_applet.c b/battstat/battstat_applet.c index 7f3838ed..a369612c 100644 --- a/battstat/battstat_applet.c +++ b/battstat/battstat_applet.c @@ -50,19 +50,21 @@ #define BATTSTAT_SCHEMA "org.mate.panel.applet.battstat" static gboolean check_for_updates (gpointer data); -static void about_cb( GtkAction *, ProgressData * ); -static void help_cb( GtkAction *, ProgressData * ); + +static void about_cb (GtkAction *, ProgressData *); + +static void help_cb (GtkAction *, ProgressData *); static const GtkActionEntry battstat_menu_actions [] = { - { "BattstatProperties", "document-properties", N_("_Preferences"), - NULL, NULL, - G_CALLBACK (prop_cb) }, - { "BattstatHelp", "help-browser", N_("_Help"), - NULL, NULL, - G_CALLBACK (help_cb) }, - { "BattstatAbout", "help-about", N_("_About"), - NULL, NULL, - G_CALLBACK (about_cb) } + { "BattstatProperties", "document-properties", N_("_Preferences"), + NULL, NULL, + G_CALLBACK (prop_cb) }, + { "BattstatHelp", "help-browser", N_("_Help"), + NULL, NULL, + G_CALLBACK (help_cb) }, + { "BattstatAbout", "help-about", N_("_About"), + NULL, NULL, + G_CALLBACK (about_cb) } }; #define AC_POWER_STRING _("System is running on AC power") @@ -78,22 +80,22 @@ static GSList *instances; static void status_change_callback (void) { - GSList *instance; + GSList *instance; - for (instance = instances; instance; instance = instance->next) - { - ProgressData *battstat = instance->data; - - if (battstat->timeout_id) + for (instance = instances; instance; instance = instance->next) { - g_source_remove (battstat->timeout_id); - battstat->timeout_id = 0; - } + ProgressData *battstat = instance->data; - check_for_updates (battstat); - } + if (battstat->timeout_id) + { + g_source_remove (battstat->timeout_id); + battstat->timeout_id = 0; + } + + check_for_updates (battstat); + } - event_driven = TRUE; + event_driven = TRUE; } /* The following two functions keep track of how many instances of the applet @@ -108,214 +110,215 @@ status_change_callback (void) static const char * static_global_initialisation (ProgressData *battstat) { - gboolean first_time; - const char *err; + gboolean first_time; + const char *err; - first_time = !instances; + first_time = !instances; - instances = g_slist_prepend (instances, battstat); + instances = g_slist_prepend (instances, battstat); - if (!first_time) - return NULL; + if (!first_time) + return NULL; - err = power_management_initialise (status_change_callback); + err = power_management_initialise (status_change_callback); - return err; + return err; } static void static_global_teardown (ProgressData *battstat) { - instances = g_slist_remove (instances, battstat); + instances = g_slist_remove (instances, battstat); - /* remaining instances... */ - if (instances) - return; + /* remaining instances... */ + if (instances) + return; - /* instances == 0 */ + /* instances == 0 */ - power_management_cleanup(); + power_management_cleanup (); } /* Pop up an error dialog on the same screen as 'applet' saying 'msg'. */ static void -battstat_error_dialog( GtkWidget *applet, const char *msg ) +battstat_error_dialog (GtkWidget *applet, + const char *msg) { - GtkWidget *dialog; + GtkWidget *dialog; - dialog = gtk_message_dialog_new( NULL, 0, GTK_MESSAGE_ERROR, - GTK_BUTTONS_OK, "%s", msg); + dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, "%s", msg); - gtk_window_set_screen( GTK_WINDOW (dialog), - gtk_widget_get_screen (GTK_WIDGET (applet)) ); + gtk_window_set_screen (GTK_WINDOW (dialog), + gtk_widget_get_screen (GTK_WIDGET (applet))); - g_signal_connect_swapped( G_OBJECT (dialog), "response", - G_CALLBACK (gtk_widget_destroy), - G_OBJECT (dialog) ); + g_signal_connect_swapped (G_OBJECT (dialog), "response", + G_CALLBACK (gtk_widget_destroy), + G_OBJECT (dialog)); - gtk_widget_show_all( dialog ); + gtk_widget_show_all (dialog); } /* Format a string describing how much time is left to fully (dis)charge - the battery. The return value must be g_free()d. + the battery. The return value must be g_free ()d. */ static char * get_remaining (BatteryStatus *info) { - int hours; - int mins; - - hours = info->minutes / 60; - mins = info->minutes % 60; - - if (info->on_ac_power && !info->charging) - return g_strdup_printf (_("Battery charged (%d%%)"), info->percent); - else if (info->minutes < 0 && !info->on_ac_power) - return g_strdup_printf (_("Unknown time (%d%%) remaining"), info->percent); - else if (info->minutes < 0 && info->on_ac_power) - return g_strdup_printf (_("Unknown time (%d%%) until charged"), info->percent); - else - if (hours == 0) - if (!info->on_ac_power) - return g_strdup_printf (ngettext ( - "%d minute (%d%%) remaining", - "%d minutes (%d%%) remaining", - mins), mins, info->percent); - else - return g_strdup_printf (ngettext ( - "%d minute until charged (%d%%)", - "%d minutes until charged (%d%%)", - mins), mins, info->percent); - else if (mins == 0) - if (!info->on_ac_power) - return g_strdup_printf (ngettext ( - "%d hour (%d%%) remaining", - "%d hours (%d%%) remaining", - hours), hours, info->percent); - else - return g_strdup_printf (ngettext ( - "%d hour until charged (%d%%)", - "%d hours until charged (%d%%)", - hours), hours, info->percent); - else - if (!info->on_ac_power) - /* TRANSLATOR: "%d %s %d %s" are "%d hours %d minutes" - * Swap order with "%2$s %2$d %1$s %1$d if needed */ - return g_strdup_printf (_("%d %s %d %s (%d%%) remaining"), - hours, ngettext ("hour", "hours", hours), - mins, ngettext ("minute", "minutes", mins), - info->percent); - else - /* TRANSLATOR: "%d %s %d %s" are "%d hours %d minutes" - * Swap order with "%2$s %2$d %1$s %1$d if needed */ - return g_strdup_printf (_("%d %s %d %s until charged (%d%%)"), - hours, ngettext ("hour", "hours", hours), - mins, ngettext ("minute", "minutes", mins), - info->percent); + int hours; + int mins; + + hours = info->minutes / 60; + mins = info->minutes % 60; + + if (info->on_ac_power && !info->charging) + return g_strdup_printf (_("Battery charged (%d%%)"), info->percent); + else if (info->minutes < 0 && !info->on_ac_power) + return g_strdup_printf (_("Unknown time (%d%%) remaining"), info->percent); + else if (info->minutes < 0 && info->on_ac_power) + return g_strdup_printf (_("Unknown time (%d%%) until charged"), info->percent); + else + if (hours == 0) + if (!info->on_ac_power) + return g_strdup_printf (ngettext ( + "%d minute (%d%%) remaining", + "%d minutes (%d%%) remaining", + mins), mins, info->percent); + else + return g_strdup_printf (ngettext ( + "%d minute until charged (%d%%)", + "%d minutes until charged (%d%%)", + mins), mins, info->percent); + else if (mins == 0) + if (!info->on_ac_power) + return g_strdup_printf (ngettext ( + "%d hour (%d%%) remaining", + "%d hours (%d%%) remaining", + hours), hours, info->percent); + else + return g_strdup_printf (ngettext ( + "%d hour until charged (%d%%)", + "%d hours until charged (%d%%)", + hours), hours, info->percent); + else + if (!info->on_ac_power) + /* TRANSLATOR: "%d %s %d %s" are "%d hours %d minutes" + * Swap order with "%2$s %2$d %1$s %1$d if needed */ + return g_strdup_printf (_("%d %s %d %s (%d%%) remaining"), + hours, ngettext ("hour", "hours", hours), + mins, ngettext ("minute", "minutes", mins), + info->percent); + else + /* TRANSLATOR: "%d %s %d %s" are "%d hours %d minutes" + * Swap order with "%2$s %2$d %1$s %1$d if needed */ + return g_strdup_printf (_("%d %s %d %s until charged (%d%%)"), + hours, ngettext ("hour", "hours", hours), + mins, ngettext ("minute", "minutes", mins), + info->percent); } static gboolean battery_full_notify (GtkWidget *applet) { #ifdef HAVE_LIBNOTIFY - GError *error = NULL; - GdkPixbuf *icon; - gboolean result; + GError *error = NULL; + GdkPixbuf *icon; + gboolean result; - if (!notify_is_initted () && !notify_init (_("Battery Monitor"))) - return FALSE; + if (!notify_is_initted () && !notify_init (_("Battery Monitor"))) + return FALSE; - icon = gtk_icon_theme_load_icon_for_scale ( - gtk_icon_theme_get_default (), - "battery", - 48, - gtk_widget_get_scale_factor (applet), - GTK_ICON_LOOKUP_USE_BUILTIN, - NULL); + icon = gtk_icon_theme_load_icon_for_scale (gtk_icon_theme_get_default (), + "battery", + 48, + gtk_widget_get_scale_factor (applet), + GTK_ICON_LOOKUP_USE_BUILTIN, + NULL); - NotifyNotification *n = notify_notification_new (_("Your battery is now fully recharged"), "", /* "battery" */ NULL); + NotifyNotification *n = notify_notification_new (_("Your battery is now fully recharged"), + "", /* "battery" */ NULL); - notify_notification_set_image_from_pixbuf (n, icon); - g_object_unref (icon); + notify_notification_set_image_from_pixbuf (n, icon); + g_object_unref (icon); - result = notify_notification_show (n, &error); + result = notify_notification_show (n, &error); - if (error) - { - g_warning ("%s", error->message); - g_error_free (error); - } + if (error) + { + g_warning ("%s", error->message); + g_error_free (error); + } - g_object_unref (G_OBJECT (n)); + g_object_unref (G_OBJECT (n)); - return result; + return result; #else - return FALSE; + return FALSE; #endif } -/* Show a dialog notifying the user that their battery is done charging. - */ +/* Show a dialog notifying the user that their battery is done charging. */ static void battery_full_dialog (GtkWidget *applet) { /* first attempt to use libnotify */ - if (battery_full_notify (applet)) - return; - - GtkWidget *dialog, *hbox, *image, *label; - cairo_surface_t *surface; - - gchar *new_label; - dialog = gtk_dialog_new_with_buttons ( - _("Battery Notice"), - NULL, - GTK_DIALOG_DESTROY_WITH_PARENT, - "gtk-ok", - GTK_RESPONSE_ACCEPT, - NULL); - g_signal_connect_swapped (G_OBJECT (dialog), "response", - G_CALLBACK (gtk_widget_destroy), - G_OBJECT (dialog)); - - gtk_container_set_border_width (GTK_CONTAINER (dialog), 6); - hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); - surface = gtk_icon_theme_load_surface ( - gtk_icon_theme_get_default (), - "battery", - 48, - gtk_widget_get_scale_factor (applet), - NULL, - GTK_ICON_LOOKUP_USE_BUILTIN, - NULL); - image = gtk_image_new_from_surface (surface); - cairo_surface_destroy (surface); - gtk_box_pack_start (GTK_BOX (hbox), image, TRUE, TRUE, 6); - new_label = g_strdup_printf ( - "<span weight=\"bold\" size=\"larger\">%s</span>", - _("Your battery is now fully recharged")); - label = gtk_label_new (new_label); - g_free (new_label); - gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); - gtk_label_set_use_markup (GTK_LABEL (label), TRUE); - gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 6); - gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), hbox); - gtk_window_set_keep_above (GTK_WINDOW (dialog), TRUE); - gtk_window_stick (GTK_WINDOW (dialog)); - gtk_window_set_skip_pager_hint (GTK_WINDOW (dialog), TRUE); - gtk_window_set_focus_on_map (GTK_WINDOW (dialog), FALSE); - gtk_widget_show_all (dialog); + if (battery_full_notify (applet)) + return; + + GtkWidget *dialog, *hbox, *image, *label; + cairo_surface_t *surface; + + gchar *new_label; + dialog = gtk_dialog_new_with_buttons (_("Battery Notice"), + NULL, + GTK_DIALOG_DESTROY_WITH_PARENT, + "gtk-ok", + GTK_RESPONSE_ACCEPT, + NULL); + g_signal_connect_swapped (G_OBJECT (dialog), + "response", + G_CALLBACK (gtk_widget_destroy), + G_OBJECT (dialog)); + + gtk_container_set_border_width (GTK_CONTAINER (dialog), 6); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); + surface = gtk_icon_theme_load_surface (gtk_icon_theme_get_default (), + "battery", + 48, + gtk_widget_get_scale_factor (applet), + NULL, + GTK_ICON_LOOKUP_USE_BUILTIN, + NULL); + + image = gtk_image_new_from_surface (surface); + cairo_surface_destroy (surface); + gtk_box_pack_start (GTK_BOX (hbox), image, TRUE, TRUE, 6); + new_label = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>", + _("Your battery is now fully recharged")); + + label = gtk_label_new (new_label); + g_free (new_label); + gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + gtk_label_set_use_markup (GTK_LABEL (label), TRUE); + gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 6); + gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), + hbox); + gtk_window_set_keep_above (GTK_WINDOW (dialog), TRUE); + gtk_window_stick (GTK_WINDOW (dialog)); + gtk_window_set_skip_pager_hint (GTK_WINDOW (dialog), TRUE); + gtk_window_set_focus_on_map (GTK_WINDOW (dialog), FALSE); + gtk_widget_show_all (dialog); } /* Destroy the low battery notification dialog and mark it as such. */ static void -battery_low_dialog_destroy( ProgressData *battstat ) +battery_low_dialog_destroy (ProgressData *battstat) { - gtk_widget_destroy( battstat->battery_low_dialog ); - battstat->battery_low_dialog = NULL; - battstat->battery_low_label = NULL; + gtk_widget_destroy (battstat->battery_low_dialog); + battstat->battery_low_dialog = NULL; + battstat->battery_low_label = NULL; } /* Determine if suspend is unsupported. For the time being this involves @@ -323,221 +326,226 @@ battery_low_dialog_destroy( ProgressData *battstat ) */ /* #define HAVE_PMI */ static gboolean -is_suspend_unavailable( void ) +is_suspend_unavailable (void) { #ifdef HAVE_PMI - int status; + int status; - status = system( "pmi query suspend" ); + status = system ("pmi query suspend"); - /* -1 - fail (pmi unavailable?). return 'false' since we don't know. - * 0 - success (can suspend). return 'false' since not unavailable. - * 1 - success (cannot suspend). return 'true' since unavailable. - */ - if( WEXITSTATUS( status ) == 1 ) - return TRUE; - else - return FALSE; + /* -1 - fail (pmi unavailable?). return 'false' since we don't know. + * 0 - success (can suspend). return 'false' since not unavailable. + * 1 - success (cannot suspend). return 'true' since unavailable. + */ + if (WEXITSTATUS (status) == 1 ) + return TRUE; + else + return FALSE; #else - return FALSE; /* return 'false' since we don't know. */ + return FALSE; /* return 'false' since we don't know. */ #endif } /* Update the text label in the battery low dialog. */ static void -battery_low_update_text( ProgressData *battstat, BatteryStatus *info ) +battery_low_update_text (ProgressData *battstat, + BatteryStatus *info) { - const char *suggest; - gchar *remaining, *new_label; - GtkRequisition size; - - /* If we're not displaying the dialog then don't update it. */ - if( battstat->battery_low_label == NULL || - battstat->battery_low_dialog == NULL ) - return; - - gtk_widget_get_preferred_size (GTK_WIDGET (battstat->battery_low_label), NULL, &size); - - /* If the label has never been set before, the width will be 0. If it - has been set before (width > 0) then we want to keep the size of - the old widget (to keep the dialog from changing sizes) so we set it - explicitly here. - */ - if( size.width > 0 ) - gtk_widget_set_size_request( GTK_WIDGET( battstat->battery_low_label ), - size.width, size.height ); - - if (info->minutes < 0 && !info->on_ac_power) - { - /* we don't know the remaining time */ - remaining = g_strdup_printf (_("You have %d%% of your total battery " - "capacity remaining."), info->percent); - } - else - { - remaining = g_strdup_printf( ngettext( - "You have %d minute of battery power " - "remaining (%d%% of the total capacity).", - "You have %d minutes of battery power " - "remaining (%d%% of the total capacity).", - info->minutes ), - info->minutes,info->percent ); - } - - if( is_suspend_unavailable() ) + const char *suggest; + gchar *remaining, *new_label; + GtkRequisition size; + + /* If we're not displaying the dialog then don't update it. */ + if (battstat->battery_low_label == NULL || + battstat->battery_low_dialog == NULL) + return; + + gtk_widget_get_preferred_size (GTK_WIDGET (battstat->battery_low_label), NULL, &size); + + /* If the label has never been set before, the width will be 0. If it + has been set before (width > 0) then we want to keep the size of + the old widget (to keep the dialog from changing sizes) so we set it + explicitly here. + */ + if (size.width > 0) + gtk_widget_set_size_request (GTK_WIDGET (battstat->battery_low_label), + size.width, size.height); + + if (info->minutes < 0 && !info->on_ac_power) + { + /* we don't know the remaining time */ + remaining = g_strdup_printf (_("You have %d%% of your total battery" + "capacity remaining."), info->percent); + } + else + { + remaining = g_strdup_printf (ngettext ("You have %d minute of battery power " + "remaining (%d%% of the total capacity).", + "You have %d minutes of battery power " + "remaining (%d%% of the total capacity).", + info->minutes), + info->minutes, + info->percent); + } + + if (is_suspend_unavailable ()) /* TRANSLATORS: this is a list, it is left as a single string * to allow you to make it appear like a list would in your * locale. This is if the laptop does not support suspend. */ - suggest = _("To avoid losing your work:\n" - " \xE2\x80\xA2 plug your laptop into external power, or\n" - " \xE2\x80\xA2 save open documents and shut your laptop down." - ); - else + suggest = _("To avoid losing your work:\n" + " \xE2\x80\xA2 plug your laptop into external power, or\n" + " \xE2\x80\xA2 save open documents and shut your laptop down."); + else /* TRANSLATORS: this is a list, it is left as a single string * to allow you to make it appear like a list would in your * locale. This is if the laptop supports suspend. */ - suggest = _("To avoid losing your work:\n" - " \xE2\x80\xA2 suspend your laptop to save power,\n" - " \xE2\x80\xA2 plug your laptop into external power, or\n" - " \xE2\x80\xA2 save open documents and shut your laptop down." - ); - - new_label = g_strdup_printf( - "<span weight=\"bold\" size=\"larger\">%s</span>\n\n%s\n\n%s", - _("Your battery is running low"), remaining, suggest ); - - gtk_label_set_markup( battstat->battery_low_label, new_label ); - g_free( remaining ); - g_free( new_label ); + suggest = _("To avoid losing your work:\n" + " \xE2\x80\xA2 suspend your laptop to save power,\n" + " \xE2\x80\xA2 plug your laptop into external power, or\n" + " \xE2\x80\xA2 save open documents and shut your laptop down."); + + new_label = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n\n%s\n\n%s", + _("Your battery is running low"), remaining, suggest); + + gtk_label_set_markup (battstat->battery_low_label, new_label); + g_free (remaining); + g_free (new_label); } /* Show a dialog notifying the user that their battery is running low. */ static void -battery_low_dialog( ProgressData *battery, BatteryStatus *info ) +battery_low_dialog (ProgressData *battery, + BatteryStatus *info) { - GtkWidget *hbox, *image, *label; - GtkWidget *vbox; - cairo_surface_t *surface; - - /* If the dialog is already displayed then don't display it again. */ - if( battery->battery_low_dialog != NULL ) - return; - - battery->battery_low_dialog = gtk_dialog_new_with_buttons ( - _("Battery Notice"), - NULL, - GTK_DIALOG_DESTROY_WITH_PARENT, - "gtk-ok", - GTK_RESPONSE_ACCEPT, - NULL); - gtk_dialog_set_default_response( GTK_DIALOG (battery->battery_low_dialog), - GTK_RESPONSE_ACCEPT ); - - g_signal_connect_swapped( G_OBJECT (battery->battery_low_dialog), - "response", - G_CALLBACK (battery_low_dialog_destroy), - battery ); - - gtk_container_set_border_width (GTK_CONTAINER (battery->battery_low_dialog), - 6); - hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); - gtk_container_set_border_width (GTK_CONTAINER (hbox), 6); - surface = gtk_icon_theme_load_surface (gtk_icon_theme_get_default (), - "battery", - 48, - gtk_widget_get_scale_factor (GTK_WIDGET (hbox)), - NULL, - GTK_ICON_LOOKUP_USE_BUILTIN, - NULL); - image = gtk_image_new_from_surface (surface); - cairo_surface_destroy (surface); - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 6); - gtk_box_pack_start (GTK_BOX (vbox), image, FALSE, FALSE, 0); - label = gtk_label_new (""); - battery->battery_low_label = GTK_LABEL( label ); - gtk_label_set_line_wrap( battery->battery_low_label, TRUE ); - gtk_label_set_selectable( battery->battery_low_label, TRUE ); - gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 6); - gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (battery->battery_low_dialog))), hbox); - - gtk_window_set_keep_above (GTK_WINDOW (battery->battery_low_dialog), TRUE); - gtk_window_stick (GTK_WINDOW (battery->battery_low_dialog)); - gtk_window_set_focus_on_map (GTK_WINDOW (battery->battery_low_dialog), - FALSE); - gtk_window_set_skip_pager_hint (GTK_WINDOW (battery->battery_low_dialog), - TRUE); - - battery_low_update_text( battery, info ); - - gtk_window_set_position (GTK_WINDOW (battery->battery_low_dialog), - GTK_WIN_POS_CENTER); - gtk_widget_show_all (battery->battery_low_dialog); + GtkWidget *hbox, *image, *label; + GtkWidget *vbox; + cairo_surface_t *surface; + + /* If the dialog is already displayed then don't display it again. */ + if (battery->battery_low_dialog != NULL) + return; + + battery->battery_low_dialog = + gtk_dialog_new_with_buttons (_("Battery Notice"), + NULL, + GTK_DIALOG_DESTROY_WITH_PARENT, + "gtk-ok", + GTK_RESPONSE_ACCEPT, + NULL); + + gtk_dialog_set_default_response (GTK_DIALOG (battery->battery_low_dialog), + GTK_RESPONSE_ACCEPT); + + g_signal_connect_swapped (G_OBJECT (battery->battery_low_dialog), + "response", + G_CALLBACK (battery_low_dialog_destroy), + battery); + + gtk_container_set_border_width (GTK_CONTAINER (battery->battery_low_dialog), + 6); + + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); + gtk_container_set_border_width (GTK_CONTAINER (hbox), 6); + surface = gtk_icon_theme_load_surface (gtk_icon_theme_get_default (), + "battery", + 48, + gtk_widget_get_scale_factor (GTK_WIDGET (hbox)), + NULL, + GTK_ICON_LOOKUP_USE_BUILTIN, + NULL); + + image = gtk_image_new_from_surface (surface); + cairo_surface_destroy (surface); + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 6); + gtk_box_pack_start (GTK_BOX (vbox), image, FALSE, FALSE, 0); + label = gtk_label_new (""); + battery->battery_low_label = GTK_LABEL (label); + gtk_label_set_line_wrap (battery->battery_low_label, TRUE); + gtk_label_set_selectable (battery->battery_low_label, TRUE); + gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 6); + gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (battery->battery_low_dialog))), + hbox); + + gtk_window_set_keep_above (GTK_WINDOW (battery->battery_low_dialog), TRUE); + gtk_window_stick (GTK_WINDOW (battery->battery_low_dialog)); + gtk_window_set_focus_on_map (GTK_WINDOW (battery->battery_low_dialog), + FALSE); + gtk_window_set_skip_pager_hint (GTK_WINDOW (battery->battery_low_dialog), + TRUE); + + battery_low_update_text (battery, info); + + gtk_window_set_position (GTK_WINDOW (battery->battery_low_dialog), + GTK_WIN_POS_CENTER); + gtk_widget_show_all (battery->battery_low_dialog); } /* Update the text of the tooltip from the provided info. */ static void -update_tooltip( ProgressData *battstat, BatteryStatus *info ) +update_tooltip (ProgressData *battstat, + BatteryStatus *info) { - gchar *powerstring; - gchar *remaining; - gchar *tiptext; - - if (info->present) - { - if (info->on_ac_power) - powerstring = AC_POWER_STRING; - else - powerstring = DC_POWER_STRING; + gchar *powerstring; + gchar *remaining; + gchar *tiptext; - remaining = get_remaining (info); + if (info->present) + { + if (info->on_ac_power) + powerstring = AC_POWER_STRING; + else + powerstring = DC_POWER_STRING; - tiptext = g_strdup_printf ("%s\n%s", powerstring, remaining); - g_free (remaining); - } - else - { - if (info->on_ac_power) - tiptext = g_strdup_printf ("%s\n%s", AC_POWER_STRING, - _("No battery present")); + remaining = get_remaining (info); + + tiptext = g_strdup_printf ("%s\n%s", powerstring, remaining); + g_free (remaining); + } else - tiptext = g_strdup_printf ("%s\n%s", DC_POWER_STRING, - _("Battery status unknown")); - } + { + if (info->on_ac_power) + tiptext = g_strdup_printf ("%s\n%s", AC_POWER_STRING, + _("No battery present")); + else + tiptext = g_strdup_printf ("%s\n%s", DC_POWER_STRING, + _("Battery status unknown")); + } - gtk_widget_set_tooltip_text (battstat->applet, tiptext); - g_free (tiptext); + gtk_widget_set_tooltip_text (battstat->applet, tiptext); + g_free (tiptext); } /* Update the text label that either shows the percentage of time left. */ static void -update_percent_label( ProgressData *battstat, BatteryStatus *info ) +update_percent_label (ProgressData *battstat, + BatteryStatus *info) { - gchar *new_label; - - if (info->present && battstat->showtext == APPLET_SHOW_PERCENT) - new_label = g_strdup_printf ("%d%%", info->percent); - else if (info->present && battstat->showtext == APPLET_SHOW_TIME) - { - /* Fully charged or unknown (-1) time remaining display none */ - if ((info->on_ac_power && info->percent == 100) || info->minutes < 0) - new_label = g_strdup (""); - else + gchar *new_label; + + if (info->present && battstat->showtext == APPLET_SHOW_PERCENT) + new_label = g_strdup_printf ("%d%%", info->percent); + else if (info->present && battstat->showtext == APPLET_SHOW_TIME) { - int time; - time = info->minutes; - new_label = g_strdup_printf ("%d:%02d", time/60, time%60); + /* Fully charged or unknown (-1) time remaining display none */ + if ((info->on_ac_power && info->percent == 100) || info->minutes < 0) + new_label = g_strdup (""); + else + { + int time; + time = info->minutes; + new_label = g_strdup_printf ("%d:%02d", time/60, time%60); + } } - } - else - new_label = g_strdup (_("N/A")); + else + new_label = g_strdup (_("N/A")); - gtk_label_set_text (GTK_LABEL (battstat->percent), new_label); - g_free (new_label); + gtk_label_set_text (GTK_LABEL (battstat->percent), new_label); + g_free (new_label); } /* Determine what status icon we ought to be displaying and change the @@ -545,184 +553,189 @@ update_percent_label( ProgressData *battstat, BatteryStatus *info ) showing. */ static void -possibly_update_status_icon( ProgressData *battstat, BatteryStatus *info ) +possibly_update_status_icon (ProgressData *battstat, + BatteryStatus *info ) { - GtkIconTheme *theme; - cairo_surface_t *surface; - gint icon_size, icon_scale; - gchar *icon_name; - int batt_life; - - batt_life = !battstat->red_value_is_time ? info->percent : info->minutes; - - if (batt_life <= battstat->red_val) - { - if (info->charging) - icon_name = "battery-caution-charging"; - else - icon_name = "battery-caution"; - } - else if (batt_life <= battstat->orange_val) - { - if (info->charging) - icon_name = "battery-low-charging"; - else - icon_name = "battery-low"; - } - else if (batt_life <= battstat->yellow_val) - { - if (info->charging) - icon_name = "battery-good-charging"; - else - icon_name = "battery-good"; - } - else if (info->on_ac_power) - { - if (info->charging) - icon_name = "battery-full-charging"; + GtkIconTheme *theme; + cairo_surface_t *surface; + gint icon_size, icon_scale; + gchar *icon_name; + int batt_life; + + batt_life = !battstat->red_value_is_time ? info->percent : info->minutes; + + if (batt_life <= battstat->red_val) + { + if (info->charging) + icon_name = "battery-caution-charging"; + else + icon_name = "battery-caution"; + } + else if (batt_life <= battstat->orange_val) + { + if (info->charging) + icon_name = "battery-low-charging"; + else + icon_name = "battery-low"; + } + else if (batt_life <= battstat->yellow_val) + { + if (info->charging) + icon_name = "battery-good-charging"; + else + icon_name = "battery-good"; + } + else if (info->on_ac_power) + { + if (info->charging) + icon_name = "battery-full-charging"; + else + icon_name = "battery-full-charged"; + } else - icon_name = "battery-full-charged"; - } - else - { - icon_name = "battery-full"; - } + { + icon_name = "battery-full"; + } - theme = gtk_icon_theme_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (battstat->applet))); + theme = gtk_icon_theme_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (battstat->applet))); - icon_size = mate_panel_applet_get_size (MATE_PANEL_APPLET (battstat->applet)); - icon_scale = gtk_widget_get_scale_factor (GTK_WIDGET (battstat->applet)); + icon_size = mate_panel_applet_get_size (MATE_PANEL_APPLET (battstat->applet)); + icon_scale = gtk_widget_get_scale_factor (GTK_WIDGET (battstat->applet)); - surface = gtk_icon_theme_load_surface (theme, icon_name, icon_size, icon_scale, NULL, 0, NULL); + surface = gtk_icon_theme_load_surface (theme, icon_name, + icon_size, + icon_scale, + NULL, 0, NULL); - gtk_image_set_from_surface (GTK_IMAGE(battstat->status), surface); - cairo_surface_destroy (surface); + gtk_image_set_from_surface (GTK_IMAGE (battstat->status), + surface); + cairo_surface_destroy (surface); } /* Gets called as a gtk_timeout once per second. Checks for updates and makes any changes as appropriate. */ static gboolean -check_for_updates( gpointer data ) +check_for_updates (gpointer data) { - ProgressData *battstat = data; - BatteryStatus info; - const char *err; + ProgressData *battstat = data; + BatteryStatus info; + const char *err; - if (DEBUG) g_print("check_for_updates()\n"); + if (DEBUG) g_print ("check_for_updates ()\n"); - if( (err = power_management_getinfo( &info )) ) - battstat_error_dialog( battstat->applet, err ); + if ((err = power_management_getinfo (&info))) + battstat_error_dialog (battstat->applet, err); - if (!event_driven) - { - int timeout; + if (!event_driven) + { + int timeout; - /* if on AC and not event driven scale back the polls to once every 10 */ - if (info.on_ac_power) - timeout = 10; - else - timeout = 2; + /* if on AC and not event driven scale back the polls to once every 10 */ + if (info.on_ac_power) + timeout = 10; + else + timeout = 2; - if (timeout != battstat->timeout) - { - battstat->timeout = timeout; + if (timeout != battstat->timeout) + { + battstat->timeout = timeout; - if (battstat->timeout_id) - g_source_remove (battstat->timeout_id); + if (battstat->timeout_id) + g_source_remove (battstat->timeout_id); + + battstat->timeout_id = g_timeout_add_seconds (battstat->timeout, + check_for_updates, + battstat); + } + } - battstat->timeout_id = g_timeout_add_seconds (battstat->timeout, - check_for_updates, - battstat); + + possibly_update_status_icon (battstat, &info); + + if (!info.on_ac_power && + battstat->last_batt_life != 1000 && + ( + /* if percentage drops below red_val */ + (!battstat->red_value_is_time && + battstat->last_batt_life > battstat->red_val && + info.percent <= battstat->red_val) || + /* if time drops below red_val */ + (battstat->red_value_is_time && + battstat->last_minutes > battstat->red_val && + info.minutes <= battstat->red_val) + ) + && info.present) + { + /* Warn that battery dropped below red_val */ + if (battstat->lowbattnotification) + { + battery_low_dialog (battstat, &info); + + if (battstat->beep) + gdk_display_beep (gdk_display_get_default ()); + } + } + + if (battstat->last_charging && + battstat->last_acline_status && + battstat->last_acline_status!=1000 && + !info.charging && + info.on_ac_power && + info.present && + info.percent > 99) + { + /* Inform that battery now fully charged */ + if (battstat->fullbattnot) + { + battery_full_dialog (battstat->applet); + + if (battstat->beep) + gdk_display_beep (gdk_display_get_default ()); + } } - } - - - possibly_update_status_icon( battstat, &info ); - - if (!info.on_ac_power && - battstat->last_batt_life != 1000 && - ( - /* if percentage drops below red_val */ - (!battstat->red_value_is_time && - battstat->last_batt_life > battstat->red_val && - info.percent <= battstat->red_val) || - /* if time drops below red_val */ - (battstat->red_value_is_time && - battstat->last_minutes > battstat->red_val && - info.minutes <= battstat->red_val) - ) && - info.present) - { - /* Warn that battery dropped below red_val */ - if(battstat->lowbattnotification) + + /* If the warning dialog is displayed and we just got plugged in then + stop displaying it. + */ + if (battstat->battery_low_dialog && info.on_ac_power) + battery_low_dialog_destroy (battstat); + + if (info.on_ac_power != battstat->last_acline_status || + info.percent != battstat->last_batt_life || + info.minutes != battstat->last_minutes || + info.charging != battstat->last_charging) { - battery_low_dialog(battstat, &info); + /* Update the tooltip */ + update_tooltip (battstat, &info); - if(battstat->beep) - gdk_display_beep (gdk_display_get_default ()); + /* If the warning dialog box is currently displayed, update that too. */ + if (battstat->battery_low_dialog != NULL) + battery_low_update_text (battstat, &info); } - } - - if( battstat->last_charging && - battstat->last_acline_status && - battstat->last_acline_status!=1000 && - !info.charging && - info.on_ac_power && - info.present && - info.percent > 99) - { - /* Inform that battery now fully charged */ - if(battstat->fullbattnot) + + if ((battstat->showtext == APPLET_SHOW_PERCENT && + battstat->last_batt_life != info.percent) || + (battstat->showtext == APPLET_SHOW_TIME && + battstat->last_minutes != info.minutes) || + battstat->last_acline_status != info.on_ac_power || + battstat->last_present != info.present || + battstat->refresh_label) /* set by properties dialog */ { - battery_full_dialog (battstat->applet); + /* Update the label */ + update_percent_label (battstat, &info); - if (battstat->beep) - gdk_display_beep (gdk_display_get_default ()); + /* done */ + battstat->refresh_label = FALSE; } - } - - /* If the warning dialog is displayed and we just got plugged in then - stop displaying it. - */ - if( battstat->battery_low_dialog && info.on_ac_power ) - battery_low_dialog_destroy( battstat ); - - if( info.on_ac_power != battstat->last_acline_status || - info.percent != battstat->last_batt_life || - info.minutes != battstat->last_minutes || - info.charging != battstat->last_charging ) - { - /* Update the tooltip */ - update_tooltip( battstat, &info ); - - /* If the warning dialog box is currently displayed, update that too. */ - if( battstat->battery_low_dialog != NULL ) - battery_low_update_text( battstat, &info ); - } - - if( (battstat->showtext == APPLET_SHOW_PERCENT && - battstat->last_batt_life != info.percent) || - (battstat->showtext == APPLET_SHOW_TIME && - battstat->last_minutes != info.minutes) || - battstat->last_acline_status != info.on_ac_power || - battstat->last_present != info.present || - battstat->refresh_label ) /* set by properties dialog */ - { - /* Update the label */ - update_percent_label( battstat, &info ); - - /* done */ - battstat->refresh_label = FALSE; - } - - battstat->last_charging = info.charging; - battstat->last_batt_life = info.percent; - battstat->last_minutes = info.minutes; - battstat->last_acline_status = info.on_ac_power; - battstat->last_present = info.present; - - return TRUE; + + battstat->last_charging = info.charging; + battstat->last_batt_life = info.percent; + battstat->last_minutes = info.minutes; + battstat->last_acline_status = info.on_ac_power; + battstat->last_present = info.present; + + return TRUE; } /* Gets called when the user removes the applet from the panel. Clean up @@ -730,26 +743,27 @@ check_for_updates( gpointer data ) decrease our applet count (and possibly perform global cleanup) */ static void -destroy_applet( GtkWidget *widget, ProgressData *battstat ) +destroy_applet (GtkWidget *widget, + ProgressData *battstat) { - if (DEBUG) g_print("destroy_applet()\n"); + if (DEBUG) g_print ("destroy_applet ()\n"); - if (battstat->prop_win) - gtk_widget_destroy (GTK_WIDGET (battstat->prop_win)); + if (battstat->prop_win) + gtk_widget_destroy (GTK_WIDGET (battstat->prop_win)); - if( battstat->battery_low_dialog ) - battery_low_dialog_destroy( battstat ); + if (battstat->battery_low_dialog) + battery_low_dialog_destroy (battstat); - if (battstat->timeout_id) - g_source_remove (battstat->timeout_id); + if (battstat->timeout_id) + g_source_remove (battstat->timeout_id); - g_object_unref( G_OBJECT(battstat->status) ); - g_object_unref( G_OBJECT(battstat->percent) ); - g_object_unref (battstat->settings); + g_object_unref (G_OBJECT (battstat->status)); + g_object_unref (G_OBJECT (battstat->percent)); + g_object_unref (battstat->settings); - static_global_teardown (battstat); + static_global_teardown (battstat); - g_free (battstat); + g_free (battstat); } /* Common function invoked by the 'Help' context menu item and the 'Help' @@ -759,91 +773,92 @@ void battstat_show_help (ProgressData *battstat, const char *section) { - GError *error = NULL; - char *uri; - - if (section) - uri = g_strdup_printf ("help:mate-battstat/%s", section); - else - uri = g_strdup ("help:mate-battstat"); - - gtk_show_uri_on_window (NULL, - uri, - gtk_get_current_event_time (), - &error); - - g_free (uri); - - if (error) - { - char *message; - - message = g_strdup_printf (_("There was an error displaying help: %s"), - error->message ); - battstat_error_dialog (battstat->applet, message); - g_error_free (error); - g_free (message); - } + GError *error = NULL; + char *uri; + + if (section) + uri = g_strdup_printf ("help:mate-battstat/%s", section); + else + uri = g_strdup ("help:mate-battstat"); + + gtk_show_uri_on_window (NULL, + uri, + gtk_get_current_event_time (), + &error); + + g_free (uri); + + if (error) + { + char *message; + + message = g_strdup_printf (_("There was an error displaying help: %s"), + error->message ); + battstat_error_dialog (battstat->applet, message); + g_error_free (error); + g_free (message); + } } /* Called when the user selects the 'help' menu item. */ static void -help_cb( GtkAction *action, ProgressData *battstat ) +help_cb (GtkAction *action, + ProgressData *battstat) { - battstat_show_help( battstat, NULL ); + battstat_show_help (battstat, NULL); } /* Called when the user selects the 'about' menu item. */ static void -about_cb( GtkAction *action, ProgressData *battstat ) +about_cb (GtkAction *action, ProgressData *battstat) { - const gchar *authors[] = { - "J\xC3\xB6rgen Pehrson <[email protected]>", - "Lennart Poettering <[email protected]> (Linux ACPI support)", - "Seth Nickell <[email protected]> (GNOME2 port)", - "Davyd Madeley <[email protected]>", - "Ryan Lortie <[email protected]>", - "Joe Marcus Clarke <[email protected]> (FreeBSD ACPI support)", - NULL - }; - - const gchar *documenters[] = { - "J\xC3\xB6rgen Pehrson <[email protected]>", - "Trevor Curtis <[email protected]>", - "Davyd Madeley <[email protected]>", - N_("MATE Documentation Team"), - NULL - }; - - char *comments = g_strdup_printf ("%s\n\n%s", - _("This utility shows the status of your laptop battery."), - power_management_using_upower () ? - /* true */ _("upower backend enabled.") : - /* false */ _("Legacy backend enabled.")); + const gchar *authors[] = { + "J\xC3\xB6rgen Pehrson <[email protected]>", + "Lennart Poettering <[email protected]> (Linux ACPI support)", + "Seth Nickell <[email protected]> (GNOME2 port)", + "Davyd Madeley <[email protected]>", + "Ryan Lortie <[email protected]>", + "Joe Marcus Clarke <[email protected]> (FreeBSD ACPI support)", + NULL + }; + + const gchar *documenters[] = { + "J\xC3\xB6rgen Pehrson <[email protected]>", + "Trevor Curtis <[email protected]>", + "Davyd Madeley <[email protected]>", + N_("MATE Documentation Team"), + NULL + }; + + char *comments = g_strdup_printf ("%s\n\n%s", + _("This utility shows the status of your laptop battery."), + power_management_using_upower () ? + /* true */ _("upower backend enabled.") : + /* false */ _("Legacy backend enabled.")); #ifdef ENABLE_NLS - const char **p; - for (p = documenters; *p; ++p) - *p = _(*p); + const char **p; + for (p = documenters; *p; ++p) + *p = _(*p); #endif - gtk_show_about_dialog( NULL, - "title", _("About Battery Charge Monitor"), - "version", VERSION, - "copyright", _("Copyright \xc2\xa9 2000 The Gnulix Society\n" - "Copyright \xc2\xa9 2002-2005 Free Software Foundation and others\n" - "Copyright \xc2\xa9 2012-2020 MATE developers"), - "comments", comments, - "authors", authors, - "documenters", documenters, - "translator-credits", _("translator-credits"), - "logo-icon-name", "battery", - NULL ); - - g_free (comments); + gtk_show_about_dialog (NULL, + "title", _("About Battery Charge Monitor"), + "version", VERSION, + "copyright", _("Copyright \xc2\xa9 2000 The Gnulix Society\n" + "Copyright \xc2\xa9 2002-2005 Free Software Foundation and others\n" + "Copyright \xc2\xa9 2012-2020 MATE developers"), + "comments", comments, + "authors", authors, + "documenters", documenters, + "translator-credits", _("translator-credits"), + "logo-icon-name", "battery", + NULL); + + g_free (comments); } /* Rotate text on side panels. Called on initial startup and when the @@ -851,17 +866,16 @@ about_cb( GtkAction *action, ProgressData *battstat ) * another panel). */ static void -setup_text_orientation( ProgressData *battstat ) +setup_text_orientation (ProgressData *battstat) { - if( battstat->orienttype == MATE_PANEL_APPLET_ORIENT_RIGHT ) - gtk_label_set_angle( GTK_LABEL( battstat->percent ), 90 ); - else if( battstat->orienttype == MATE_PANEL_APPLET_ORIENT_LEFT ) - gtk_label_set_angle( GTK_LABEL( battstat->percent ), 270 ); - else - gtk_label_set_angle( GTK_LABEL( battstat->percent ), 0 ); + if (battstat->orienttype == MATE_PANEL_APPLET_ORIENT_RIGHT) + gtk_label_set_angle (GTK_LABEL (battstat->percent), 90); + else if (battstat->orienttype == MATE_PANEL_APPLET_ORIENT_LEFT) + gtk_label_set_angle (GTK_LABEL (battstat->percent), 270); + else + gtk_label_set_angle (GTK_LABEL (battstat->percent), 0); } - /* This signal is delivered by the panel when the orientation of the applet has changed. This is either because the applet has just been created, has just been moved to a new panel or the panel that the applet was on @@ -869,69 +883,70 @@ setup_text_orientation( ProgressData *battstat ) */ static void change_orient (MatePanelApplet *applet, - MatePanelAppletOrient orient, - ProgressData *battstat) + MatePanelAppletOrient orient, + ProgressData *battstat) { - if (DEBUG) g_print("change_orient()\n"); + if (DEBUG) g_print ("change_orient ()\n"); - /* Ignore the update if we already know. */ - if( orient != battstat->orienttype ) - { - battstat->orienttype = orient; + /* Ignore the update if we already know. */ + if (orient != battstat->orienttype) + { + battstat->orienttype = orient; - /* The applet changing orientation very likely involves the layout - being changed to better fit the new shape of the panel. - */ - setup_text_orientation( battstat ); - reconfigure_layout( battstat ); - } + /* The applet changing orientation very likely involves the layout + being changed to better fit the new shape of the panel. + */ + setup_text_orientation (battstat); + reconfigure_layout (battstat); + } } /* This is delivered when our size has changed. This happens when the applet is just created or if the size of the panel has changed. */ static void -size_allocate( MatePanelApplet *applet, GtkAllocation *allocation, - ProgressData *battstat) +size_allocate (MatePanelApplet *applet, + GtkAllocation *allocation, + ProgressData *battstat) { - if (DEBUG) g_print("applet_change_pixel_size()\n"); + if (DEBUG) g_print ("applet_change_pixel_size ()\n"); - /* Ignore the update if we already know. */ - if( battstat->width == allocation->width && - battstat->height == allocation->height ) - return; + /* Ignore the update if we already know. */ + if (battstat->width == allocation->width && + battstat->height == allocation->height) + return; - battstat->width = allocation->width; - battstat->height = allocation->height; + battstat->width = allocation->width; + battstat->height = allocation->height; - /* The applet changing size could result in the layout changing. */ - reconfigure_layout( battstat ); + /* The applet changing size could result in the layout changing. */ + reconfigure_layout (battstat); } /* Get our settings out of gsettings. */ static void -load_preferences(ProgressData *battstat) +load_preferences (ProgressData *battstat) { - GSettings *settings = battstat->settings; + GSettings *settings = battstat->settings; - if (DEBUG) g_print("load_preferences()\n"); + if (DEBUG) g_print ("load_preferences ()\n"); - battstat->red_val = g_settings_get_int (settings, "red-value"); - battstat->red_val = MIN (battstat->red_val, 100); - battstat->red_value_is_time = g_settings_get_boolean (settings, "red-value-is-time"); + battstat->red_val = g_settings_get_int (settings, "red-value"); + battstat->red_val = MIN (battstat->red_val, 100); + battstat->red_value_is_time = g_settings_get_boolean (settings, "red-value-is-time"); - /* automatically calculate orangle and yellow values from the red value */ - battstat->orange_val = battstat->red_val * ORANGE_MULTIPLIER; - battstat->orange_val = MIN (battstat->orange_val, 100); + /* automatically calculate orangle and yellow values from the red value */ + battstat->orange_val = battstat->red_val * ORANGE_MULTIPLIER; + battstat->orange_val = MIN (battstat->orange_val, 100); - battstat->yellow_val = battstat->red_val * YELLOW_MULTIPLIER; - battstat->yellow_val = MIN (battstat->yellow_val, 100); + battstat->yellow_val = battstat->red_val * YELLOW_MULTIPLIER; + battstat->yellow_val = MIN (battstat->yellow_val, 100); - battstat->lowbattnotification = g_settings_get_boolean (settings, "low-battery-notification"); - battstat->fullbattnot = g_settings_get_boolean (settings, "full-battery-notification"); - battstat->beep = g_settings_get_boolean (settings, "beep"); - battstat->showtext = g_settings_get_int (settings, "show-text"); + battstat->lowbattnotification = g_settings_get_boolean (settings, "low-battery-notification"); + battstat->fullbattnot = g_settings_get_boolean (settings, "full-battery-notification"); + battstat->beep = g_settings_get_boolean (settings, "beep"); + battstat->showtext = g_settings_get_int (settings, "show-text"); } /* Convenience function to attach a child widget to a GtkGrid in the @@ -939,41 +954,43 @@ load_preferences(ProgressData *battstat) gridss and only supports positions that are used in this applet. */ static void -grid_layout_attach (GtkGrid *grid, LayoutLocation loc, GtkWidget *child) +grid_layout_attach (GtkGrid *grid, + LayoutLocation loc, + GtkWidget *child) { - switch( loc ) - { - case LAYOUT_LONG: - gtk_grid_attach (grid, child, 1, 0, 1, 2); - break; - - case LAYOUT_TOPLEFT: - gtk_grid_attach (grid, child, 0, 0, 1, 1); - break; - - case LAYOUT_TOP: - gtk_grid_attach (grid, child, 1, 0, 1, 1); - break; - - case LAYOUT_LEFT: - gtk_grid_attach (grid, child, 0, 1, 1, 1); - break; - - case LAYOUT_CENTRE: - gtk_grid_attach (grid, child, 1, 1, 1, 1); - break; - - case LAYOUT_RIGHT: - gtk_grid_attach (grid, child, 2, 1, 1, 1); - break; - - case LAYOUT_BOTTOM: - gtk_grid_attach (grid, child, 1, 2, 1, 1); - break; - - default: - break; - } + switch (loc) + { + case LAYOUT_LONG: + gtk_grid_attach (grid, child, 1, 0, 1, 2); + break; + + case LAYOUT_TOPLEFT: + gtk_grid_attach (grid, child, 0, 0, 1, 1); + break; + + case LAYOUT_TOP: + gtk_grid_attach (grid, child, 1, 0, 1, 1); + break; + + case LAYOUT_LEFT: + gtk_grid_attach (grid, child, 0, 1, 1, 1); + break; + + case LAYOUT_CENTRE: + gtk_grid_attach (grid, child, 1, 1, 1, 1); + break; + + case LAYOUT_RIGHT: + gtk_grid_attach (grid, child, 2, 1, 1, 1); + break; + + case LAYOUT_BOTTOM: + gtk_grid_attach (grid, child, 1, 2, 1, 1); + break; + + default: + break; + } } /* The layout has (maybe) changed. Calculate what layout we ought to be @@ -982,132 +999,132 @@ grid_layout_attach (GtkGrid *grid, LayoutLocation loc, GtkWidget *child) when elements get added or removed. */ void -reconfigure_layout( ProgressData *battstat ) +reconfigure_layout (ProgressData *battstat) { - LayoutConfiguration c; - - /* Default to no elements being displayed. */ - c.status = c.text = LAYOUT_NONE; - - switch( battstat->orienttype ) - { - case MATE_PANEL_APPLET_ORIENT_UP: - case MATE_PANEL_APPLET_ORIENT_DOWN: - /* Stack horizontally for top and bottom panels. */ - c.status = LAYOUT_LEFT; - if( battstat->showtext ) - c.text = LAYOUT_RIGHT; - break; - - case MATE_PANEL_APPLET_ORIENT_LEFT: - case MATE_PANEL_APPLET_ORIENT_RIGHT: - /* Stack vertically for left and right panels. */ - c.status = LAYOUT_TOP; - if( battstat->showtext ) - c.text = LAYOUT_BOTTOM; - break; - } - - if( memcmp( &c, &battstat->layout, sizeof (LayoutConfiguration) ) ) - { - /* Something in the layout has changed. Rebuild. */ - - /* Start by removing any elements in the grid from the grid. */ - if( battstat->layout.text ) - gtk_container_remove( GTK_CONTAINER( battstat->grid ), - battstat->percent ); - if( battstat->layout.status ) - gtk_container_remove( GTK_CONTAINER( battstat->grid ), - battstat->status ); - - /* Attach the elements to their new locations. */ - grid_layout_attach( GTK_GRID(battstat->grid), - c.status, battstat->status ); - grid_layout_attach( GTK_GRID(battstat->grid), - c.text, battstat->percent ); - - gtk_widget_show_all( battstat->applet ); - } - - battstat->layout = c; - - /* Check for generic updates. This is required, for example, to make sure - the text label is immediately updated to show the time remaining or - percentage. - */ - check_for_updates( battstat ); + LayoutConfiguration c; + + /* Default to no elements being displayed. */ + c.status = c.text = LAYOUT_NONE; + + switch (battstat->orienttype) + { + case MATE_PANEL_APPLET_ORIENT_UP: + case MATE_PANEL_APPLET_ORIENT_DOWN: + /* Stack horizontally for top and bottom panels. */ + c.status = LAYOUT_LEFT; + if (battstat->showtext) + c.text = LAYOUT_RIGHT; + break; + + case MATE_PANEL_APPLET_ORIENT_LEFT: + case MATE_PANEL_APPLET_ORIENT_RIGHT: + /* Stack vertically for left and right panels. */ + c.status = LAYOUT_TOP; + if (battstat->showtext) + c.text = LAYOUT_BOTTOM; + break; + } + + if (memcmp (&c, &battstat->layout, sizeof (LayoutConfiguration))) + { + /* Something in the layout has changed. Rebuild. */ + + /* Start by removing any elements in the grid from the grid. */ + if (battstat->layout.text) + gtk_container_remove (GTK_CONTAINER (battstat->grid), + battstat->percent); + if (battstat->layout.status) + gtk_container_remove (GTK_CONTAINER (battstat->grid), + battstat->status); + + /* Attach the elements to their new locations. */ + grid_layout_attach (GTK_GRID (battstat->grid), + c.status, battstat->status); + grid_layout_attach (GTK_GRID (battstat->grid), + c.text, battstat->percent); + + gtk_widget_show_all (battstat->applet); + } + + battstat->layout = c; + + /* Check for generic updates. This is required, for example, to make sure + the text label is immediately updated to show the time remaining or + percentage. + */ + check_for_updates (battstat); } /* Allocate the widgets for the applet and connect our signals. */ static gint -create_layout(ProgressData *battstat) +create_layout (ProgressData *battstat) { - if (DEBUG) g_print("create_layout()\n"); - - /* Have our background automatically painted. */ - mate_panel_applet_set_background_widget( MATE_PANEL_APPLET( battstat->applet ), - GTK_WIDGET( battstat->applet ) ); - - /* Allocate the four widgets that we need. */ - battstat->grid = gtk_grid_new (); - battstat->percent = gtk_label_new( "" ); - battstat->status = gtk_image_new(); - - /* When you first get a pointer to a newly created GtkWidget it has one - 'floating' reference. When you first add this widget to a container - the container adds a real reference and removes the floating reference - if one exists. Since we insert/remove these widgets from the table - when our layout is reconfigured, we need to keep our own 'real' - reference to each widget. This adds a real reference to each widget - and "sinks" the floating reference. - */ - g_object_ref( battstat->status ); - g_object_ref( battstat->percent ); - g_object_ref_sink( G_OBJECT( battstat->status ) ); - g_object_ref_sink( G_OBJECT( battstat->percent ) ); - - /* Let reconfigure_layout know that the grid is currently empty. */ - battstat->layout.status = LAYOUT_NONE; - battstat->layout.text = LAYOUT_NONE; - - /* Put the grid directly inside the applet and show everything. */ - gtk_widget_set_halign (battstat->grid, GTK_ALIGN_CENTER); - gtk_widget_set_valign (battstat->grid, GTK_ALIGN_CENTER); - gtk_container_add (GTK_CONTAINER (battstat->applet), battstat->grid); - gtk_widget_show_all (battstat->applet); - - /* Attach all sorts of signals to the applet. */ - g_signal_connect(G_OBJECT(battstat->applet), - "destroy", - G_CALLBACK(destroy_applet), - battstat); - - g_signal_connect (battstat->applet, - "change_orient", - G_CALLBACK(change_orient), - battstat); - - g_signal_connect (battstat->applet, - "size_allocate", - G_CALLBACK (size_allocate), - battstat); - - return FALSE; + if (DEBUG) g_print ("create_layout ()\n"); + + /* Have our background automatically painted. */ + mate_panel_applet_set_background_widget (MATE_PANEL_APPLET (battstat->applet), + GTK_WIDGET (battstat->applet)); + + /* Allocate the four widgets that we need. */ + battstat->grid = gtk_grid_new (); + battstat->percent = gtk_label_new (""); + battstat->status = gtk_image_new (); + + /* When you first get a pointer to a newly created GtkWidget it has one + 'floating' reference. When you first add this widget to a container + the container adds a real reference and removes the floating reference + if one exists. Since we insert/remove these widgets from the table + when our layout is reconfigured, we need to keep our own 'real' + reference to each widget. This adds a real reference to each widget + and "sinks" the floating reference. + */ + g_object_ref (battstat->status); + g_object_ref (battstat->percent); + g_object_ref_sink (G_OBJECT (battstat->status)); + g_object_ref_sink (G_OBJECT (battstat->percent)); + + /* Let reconfigure_layout know that the grid is currently empty. */ + battstat->layout.status = LAYOUT_NONE; + battstat->layout.text = LAYOUT_NONE; + + /* Put the grid directly inside the applet and show everything. */ + gtk_widget_set_halign (battstat->grid, GTK_ALIGN_CENTER); + gtk_widget_set_valign (battstat->grid, GTK_ALIGN_CENTER); + gtk_container_add (GTK_CONTAINER (battstat->applet), battstat->grid); + gtk_widget_show_all (battstat->applet); + + /* Attach all sorts of signals to the applet. */ + g_signal_connect (G_OBJECT (battstat->applet), + "destroy", + G_CALLBACK (destroy_applet), + battstat); + + g_signal_connect (battstat->applet, + "change_orient", + G_CALLBACK (change_orient), + battstat); + + g_signal_connect (battstat->applet, + "size_allocate", + G_CALLBACK (size_allocate), + battstat); + + return FALSE; } void prop_cb (GtkAction *action, ProgressData *battstat) { - if (battstat->prop_win) { - gtk_window_set_screen (GTK_WINDOW (battstat->prop_win), - gtk_widget_get_screen (battstat->applet)); - gtk_window_present (GTK_WINDOW (battstat->prop_win)); - } else { - battstat->prop_win = battstat_preferences_new (battstat); - gtk_widget_show_all (GTK_WIDGET (battstat->prop_win)); - } + if (battstat->prop_win) { + gtk_window_set_screen (GTK_WINDOW (battstat->prop_win), + gtk_widget_get_screen (battstat->applet)); + gtk_window_present (GTK_WINDOW (battstat->prop_win)); + } else { + battstat->prop_win = battstat_preferences_new (battstat); + gtk_widget_show_all (GTK_WIDGET (battstat->prop_win)); + } } /* Called by the factory to fill in the fields for the applet. @@ -1115,92 +1132,97 @@ prop_cb (GtkAction *action, static gboolean battstat_applet_fill (MatePanelApplet *applet) { - ProgressData *battstat; - AtkObject *atk_widget; - GtkActionGroup *action_group; - const char *err; - - if (DEBUG) g_print("main()\n"); - - g_set_application_name (_("Battery Charge Monitor")); - - gtk_window_set_default_icon_name ("battery"); - - mate_panel_applet_set_flags (applet, MATE_PANEL_APPLET_EXPAND_MINOR); - - battstat = g_new0 (ProgressData, 1); - battstat->settings = mate_panel_applet_settings_new (applet, BATTSTAT_SCHEMA); - - /* Some starting values... */ - battstat->applet = GTK_WIDGET (applet); - battstat->refresh_label = TRUE; - battstat->last_batt_life = 1000; - battstat->last_acline_status = 1000; - battstat->last_charging = 1000; - battstat->orienttype = mate_panel_applet_get_orient (applet); - battstat->battery_low_dialog = NULL; - battstat->battery_low_label = NULL; - battstat->timeout = -1; - battstat->timeout_id = 0; - - /* The first received size_allocate event will cause a reconfigure. */ - battstat->height = -1; - battstat->width = -1; - - load_preferences (battstat); - create_layout (battstat); - setup_text_orientation( battstat ); - - action_group = gtk_action_group_new ("Battstat Applet Actions"); - gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); - gtk_action_group_add_actions (action_group, - battstat_menu_actions, - G_N_ELEMENTS (battstat_menu_actions), - battstat); - - mate_panel_applet_setup_menu_from_resource (MATE_PANEL_APPLET (battstat->applet), - BATTSTAT_RESOURCE_PATH "battstat-applet-menu.xml", - action_group); - - if (mate_panel_applet_get_locked_down (MATE_PANEL_APPLET (battstat->applet))) { - GtkAction *action; - - action = gtk_action_group_get_action (action_group, "BattstatProperties"); - gtk_action_set_visible (action, FALSE); - } - g_object_unref (action_group); - - atk_widget = gtk_widget_get_accessible (battstat->applet); - if (GTK_IS_ACCESSIBLE (atk_widget)) { - atk_object_set_name (atk_widget, _("Battery Charge Monitor")); - atk_object_set_description(atk_widget, _("Monitor a laptop's remaining power")); - } - - if ((err = static_global_initialisation (battstat))) - battstat_error_dialog (GTK_WIDGET (applet), err); - - return TRUE; + ProgressData *battstat; + AtkObject *atk_widget; + GtkActionGroup *action_group; + const char *err; + + if (DEBUG) g_print ("main ()\n"); + + g_set_application_name (_("Battery Charge Monitor")); + + gtk_window_set_default_icon_name ("battery"); + + mate_panel_applet_set_flags (applet, + MATE_PANEL_APPLET_EXPAND_MINOR); + + battstat = g_new0 (ProgressData, 1); + battstat->settings = mate_panel_applet_settings_new (applet, + BATTSTAT_SCHEMA); + + /* Some starting values... */ + battstat->applet = GTK_WIDGET (applet); + battstat->refresh_label = TRUE; + battstat->last_batt_life = 1000; + battstat->last_acline_status = 1000; + battstat->last_charging = 1000; + battstat->orienttype = mate_panel_applet_get_orient (applet); + battstat->battery_low_dialog = NULL; + battstat->battery_low_label = NULL; + battstat->timeout = -1; + battstat->timeout_id = 0; + + /* The first received size_allocate event will cause a reconfigure. */ + battstat->height = -1; + battstat->width = -1; + + load_preferences (battstat); + create_layout (battstat); + setup_text_orientation (battstat); + + action_group = gtk_action_group_new ("Battstat Applet Actions"); + gtk_action_group_set_translation_domain (action_group, + GETTEXT_PACKAGE); + gtk_action_group_add_actions (action_group, + battstat_menu_actions, + G_N_ELEMENTS (battstat_menu_actions), + battstat); + + mate_panel_applet_setup_menu_from_resource (MATE_PANEL_APPLET (battstat->applet), + BATTSTAT_RESOURCE_PATH "battstat-applet-menu.xml", + action_group); + + if (mate_panel_applet_get_locked_down (MATE_PANEL_APPLET (battstat->applet))) { + GtkAction *action; + + action = gtk_action_group_get_action (action_group, + "BattstatProperties"); + gtk_action_set_visible (action, FALSE); + } + g_object_unref (action_group); + + atk_widget = gtk_widget_get_accessible (battstat->applet); + if (GTK_IS_ACCESSIBLE (atk_widget)) { + atk_object_set_name (atk_widget, + _("Battery Charge Monitor")); + atk_object_set_description (atk_widget, + _("Monitor a laptop's remaining power")); + } + + if ((err = static_global_initialisation (battstat))) + battstat_error_dialog (GTK_WIDGET (applet), err); + + return TRUE; } /* Boilerplate... */ static gboolean battstat_applet_factory (MatePanelApplet *applet, - const gchar *iid, - gpointer data) + const gchar *iid, + gpointer data) { - gboolean retval = FALSE; + gboolean retval = FALSE; - if (!strcmp (iid, "BattstatApplet")) - retval = battstat_applet_fill (applet); + if (!strcmp (iid, "BattstatApplet")) + retval = battstat_applet_fill (applet); - return retval; + return retval; } MATE_PANEL_APPLET_OUT_PROCESS_FACTORY ("BattstatAppletFactory", - PANEL_TYPE_APPLET, - "battstat", - battstat_applet_factory, - NULL) - + PANEL_TYPE_APPLET, + "battstat", + battstat_applet_factory, + NULL) |