[gnome-flashback] shell: fix level bar in OSD window



commit dc4598291601bdbb3cb7ffab6f3195728ddb0efd
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Sun Aug 25 21:50:23 2019 +0300

    shell: fix level bar in OSD window
    
    GNOME Settings Daemon now uses double type for level.
    
    At the same time add support for max_level.
    
    https://gitlab.gnome.org/GNOME/gnome-flashback/issues/22

 data/theme/Adwaita/gnome-flashback-dark.css |  5 +++
 data/theme/Adwaita/gnome-flashback.css      |  5 +++
 data/theme/HighContrast/gnome-flashback.css |  5 +++
 gnome-flashback/libshell/flashback-osd.c    | 10 ++++-
 gnome-flashback/libshell/gf-osd-window.c    | 61 +++++++++++++++++++++++------
 gnome-flashback/libshell/gf-osd-window.h    | 24 +++++++-----
 6 files changed, 86 insertions(+), 24 deletions(-)
---
diff --git a/data/theme/Adwaita/gnome-flashback-dark.css b/data/theme/Adwaita/gnome-flashback-dark.css
index 0488183..e7e1317 100644
--- a/data/theme/Adwaita/gnome-flashback-dark.css
+++ b/data/theme/Adwaita/gnome-flashback-dark.css
@@ -55,5 +55,10 @@ gf-popup-window.solid {
 #gf-osd-window {
 }
 
+#gf-osd-window levelbar block.overdrive {
+  background-color: #e01b24;
+  border-color: #e01b24;
+}
+
 #gf-bubble {
 }
diff --git a/data/theme/Adwaita/gnome-flashback.css b/data/theme/Adwaita/gnome-flashback.css
index 6eda9ee..da9ee3c 100644
--- a/data/theme/Adwaita/gnome-flashback.css
+++ b/data/theme/Adwaita/gnome-flashback.css
@@ -55,5 +55,10 @@ gf-popup-window.solid {
 #gf-osd-window {
 }
 
+#gf-osd-window levelbar block.overdrive {
+  background-color: #e01b24;
+  border-color: #e01b24;
+}
+
 #gf-bubble {
 }
diff --git a/data/theme/HighContrast/gnome-flashback.css b/data/theme/HighContrast/gnome-flashback.css
index e32fb7b..653848d 100644
--- a/data/theme/HighContrast/gnome-flashback.css
+++ b/data/theme/HighContrast/gnome-flashback.css
@@ -55,5 +55,10 @@ gf-popup-window.solid {
 #gf-osd-window {
 }
 
+#gf-osd-window levelbar block.overdrive {
+  background-color: #ef2929;
+  border-color: #ef2929;
+}
+
 #gf-bubble {
 }
diff --git a/gnome-flashback/libshell/flashback-osd.c b/gnome-flashback/libshell/flashback-osd.c
index 3602261..188a9fa 100644
--- a/gnome-flashback/libshell/flashback-osd.c
+++ b/gnome-flashback/libshell/flashback-osd.c
@@ -122,7 +122,8 @@ flashback_osd_show (FlashbackOsd     *osd,
   const gchar *icon_name;
   const gchar *label;
   GIcon *icon;
-  gint level;
+  gdouble level;
+  gdouble max_level;
   const gchar *connector;
   gint monitor;
   gint i;
@@ -135,9 +136,12 @@ flashback_osd_show (FlashbackOsd     *osd,
   if (!g_variant_dict_lookup (&dict, "label", "&s", &label))
     label = NULL;
 
-  if (!g_variant_dict_lookup (&dict, "level", "i", &level))
+  if (!g_variant_dict_lookup (&dict, "level", "d", &level))
     level = -1;
 
+  if (!g_variant_dict_lookup (&dict, "max_level", "d", &max_level))
+    max_level = 1.0;
+
   if (!g_variant_dict_lookup (&dict, "connector", "&s", &connector))
     connector = NULL;
 
@@ -158,6 +162,7 @@ flashback_osd_show (FlashbackOsd     *osd,
               gf_osd_window_set_icon (osd->windows[i], icon);
               gf_osd_window_set_label (osd->windows[i], label);
               gf_osd_window_set_level (osd->windows[i], level);
+              gf_osd_window_set_max_level (osd->windows[i], max_level);
               gf_osd_window_show (osd->windows[i]);
             }
           else
@@ -173,6 +178,7 @@ flashback_osd_show (FlashbackOsd     *osd,
           gf_osd_window_set_icon (osd->windows[i], icon);
           gf_osd_window_set_label (osd->windows[i], label);
           gf_osd_window_set_level (osd->windows[i], level);
+          gf_osd_window_set_max_level (osd->windows[i], max_level);
           gf_osd_window_show (osd->windows[i]);
         }
     }
diff --git a/gnome-flashback/libshell/gf-osd-window.c b/gnome-flashback/libshell/gf-osd-window.c
index 842739d..d67909b 100644
--- a/gnome-flashback/libshell/gf-osd-window.c
+++ b/gnome-flashback/libshell/gf-osd-window.c
@@ -30,16 +30,45 @@ struct _GfOsdWindow
 
   guint          hide_timeout_id;
 
+  gdouble        max_level;
+  gdouble        level;
+
   GtkWidget     *icon_image;
   gint           icon_size;
 
   GtkWidget     *label;
 
-  GtkWidget     *level;
+  GtkWidget     *level_bar;
 };
 
 G_DEFINE_TYPE (GfOsdWindow, gf_osd_window, GF_TYPE_POPUP_WINDOW)
 
+static void
+update_level_bar (GfOsdWindow *window)
+{
+  gdouble level;
+  GtkLevelBar *level_bar;
+
+  if (window->level < 0.0)
+    {
+      gtk_widget_hide (window->level_bar);
+      return;
+    }
+
+  level = MAX (0.0, MIN (window->level, window->max_level));
+  level_bar = GTK_LEVEL_BAR (window->level_bar);
+
+  gtk_level_bar_set_max_value (level_bar, window->max_level);
+  gtk_level_bar_set_value (level_bar, level);
+
+  if (window->max_level > 1.0)
+    gtk_level_bar_add_offset_value (level_bar, "overdrive", window->max_level);
+  else
+    gtk_level_bar_remove_offset_value (level_bar, "overdrive");
+
+  gtk_widget_show (window->level_bar);
+}
+
 static void
 fade_finished_cb (GfPopupWindow *window)
 {
@@ -128,6 +157,9 @@ gf_osd_window_init (GfOsdWindow *window)
   gtk_container_add (GTK_CONTAINER (window), box);
   gtk_widget_show (box);
 
+  window->max_level = 1.0;
+  window->level = -1;
+
   window->icon_image = gtk_image_new ();
   gtk_widget_set_halign (window->icon_image, GTK_ALIGN_CENTER);
   gtk_widget_set_valign (window->icon_image, GTK_ALIGN_CENTER);
@@ -137,9 +169,9 @@ gf_osd_window_init (GfOsdWindow *window)
   gtk_widget_set_halign (window->label, GTK_ALIGN_CENTER);
   gtk_box_pack_start (GTK_BOX (box), window->label, FALSE, FALSE, 0);
 
-  window->level = gtk_level_bar_new_for_interval (0, 100);
-  gtk_widget_set_halign (window->level, GTK_ALIGN_FILL);
-  gtk_box_pack_start (GTK_BOX (box), window->level, FALSE, FALSE, 0);
+  window->level_bar = gtk_level_bar_new_for_interval (0.0, window->max_level);
+  gtk_box_pack_start (GTK_BOX (box), window->level_bar, FALSE, FALSE, 0);
+  gtk_widget_set_halign (window->level_bar, GTK_ALIGN_FILL);
 
   g_signal_connect (window, "fade-finished",
                     G_CALLBACK (fade_finished_cb), NULL);
@@ -209,17 +241,20 @@ gf_osd_window_set_label (GfOsdWindow *window,
 
 void
 gf_osd_window_set_level (GfOsdWindow *window,
-                         gint         level)
+                         gdouble      level)
 {
-  if (level == -1)
-    {
-      gtk_widget_hide (window->level);
-      return;
-    }
+  window->level = level;
+
+  update_level_bar (window);
+}
+
+void
+gf_osd_window_set_max_level (GfOsdWindow *window,
+                             gdouble      max_level)
+{
+  window->max_level = max_level;
 
-  level = MAX (0, MIN (level, 100));
-  gtk_level_bar_set_value (GTK_LEVEL_BAR (window->level), level);
-  gtk_widget_show (window->level);
+  update_level_bar (window);
 }
 
 void
diff --git a/gnome-flashback/libshell/gf-osd-window.h b/gnome-flashback/libshell/gf-osd-window.h
index 1443d74..5410d9b 100644
--- a/gnome-flashback/libshell/gf-osd-window.h
+++ b/gnome-flashback/libshell/gf-osd-window.h
@@ -26,17 +26,23 @@ G_BEGIN_DECLS
 G_DECLARE_FINAL_TYPE (GfOsdWindow, gf_osd_window,
                       GF, OSD_WINDOW, GfPopupWindow)
 
-GfOsdWindow *gf_osd_window_new       (gint         monitor);
+GfOsdWindow *gf_osd_window_new           (gint         monitor);
 
-void         gf_osd_window_set_icon  (GfOsdWindow *window,
-                                      GIcon       *icon);
-void         gf_osd_window_set_label (GfOsdWindow *window,
-                                      const gchar *label);
-void         gf_osd_window_set_level (GfOsdWindow *window,
-                                      gint         level);
+void         gf_osd_window_set_icon      (GfOsdWindow *window,
+                                          GIcon       *icon);
 
-void         gf_osd_window_show      (GfOsdWindow *window);
-void         gf_osd_window_hide      (GfOsdWindow *window);
+void         gf_osd_window_set_label     (GfOsdWindow *window,
+                                          const gchar *label);
+
+void         gf_osd_window_set_level     (GfOsdWindow *window,
+                                          gdouble      level);
+
+void         gf_osd_window_set_max_level (GfOsdWindow *window,
+                                          gdouble      max_level);
+
+void         gf_osd_window_show          (GfOsdWindow *window);
+
+void         gf_osd_window_hide          (GfOsdWindow *window);
 
 G_END_DECLS
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]