mate-desktop / mate-screensaver

MATE screen saver and locker
https://mate-desktop.org
GNU General Public License v2.0
48 stars 40 forks source link

lock-dialog: add style_provider to current screen globally #204

Closed rbuj closed 5 years ago

rbuj commented 5 years ago
gtk_style_context_add_provider_for_screen (gdk_screen_get_default(),
                                           GTK_STYLE_PROVIDER (style_provider),
                                           GTK_STYLE_PROVIDER_PRIORITY_USER);

https://developer.gnome.org/gtk3/stable/GtkStyleContext.html#gtk-style-context-add-provider-for-screen

css data is located at /usr/share/mate-screensaver/lock-dialog-THEME.css, XDG_CONFIG_HOME/gtk-3.0/gtk.css, /usr/share/themes/...

/usr/share/mate-screensaver/lock-dialog-THEME.css file has highest priority, if exists:

  $ gsettings get org.mate.screensaver lock-dialog-theme
  'test'
  $ grep lock-dialog /usr/share/mate-screensaver/lock-dialog-test.css
  .lock-dialog.background {
  .lock-dialog frame {
  .lock-dialog notebook {
  .lock-dialog entry,
  .lock-dialog entry:focus {
  .lock-dialog button,
  .lock-dialog button:focus {
  .lock-dialog button:hover,
  .lock-dialog button:hover:active {
  ...

Otherwise:

  $ ls /usr/share/mate-screensaver/
  lock-dialog-default.ui  lock-dialog-test.css  lock-dialog-test.ui  mate-screensaver-preferences.ui
  $ gsettings get org.mate.screensaver lock-dialog-theme
  'default'
  $ gsettings get org.mate.interface gtk-theme
  'TraditionalOk'
  $ grep lock-dialog /usr/share/themes/TraditionalOk/gtk-3.0/*.css
  /usr/share/themes/TraditionalOk/gtk-3.0/mate-applications.css:.lock-dialog {
  /usr/share/themes/TraditionalOk/gtk-3.0/mate-applications.css:.lock-dialog notebook {

Examples:

[robert@PC09 ~]$ sudo cp /usr/share/mate-screensaver/lock-dialog-default.ui /usr/share/mate-screensaver/lock-dialog-test.ui
[robert@PC09 ~]$ sudo wget -q -O /usr/share/mate-screensaver/lock-dialog-test.css https://gist.githubusercontent.com/geki-yaba/19262f9af9b2a6f838636e6f019e96a3/raw/24a5ee22a0338c6c145db15f363bcbe73c64630d/gistfile1.txt 
[robert@PC09 ~]$ gsettings set org.mate.screensaver lock-dialog-theme test
[robert@PC09 ~]$ gsettings set org.mate.interface gtk-theme TraditionalOk

VirtualBox_Fedora 9_11_08_2019_16_25_37

[robert@PC09 ~]$ gsettings get org.mate.screensaver lock-dialog-theme
'default'
[robert@PC09 ~]$ gsettings get org.mate.interface gtk-theme
'TraditionalOk'

VirtualBox_Fedora 9_11_08_2019_14_23_55

[robert@PC09 ~]$ gsettings get org.mate.screensaver lock-dialog-theme
'default'
[robert@PC09 ~]$ gsettings get org.mate.interface gtk-theme
'Blue-Submarine'

VirtualBox_Fedora 9_11_08_2019_14_23_04

[robert@PC09 ~]$ gsettings get org.mate.screensaver lock-dialog-theme
'default'
[robert@PC09 ~]$ gsettings get org.mate.interface gtk-theme
'BlackMATE'

VirtualBox_Fedora 9_11_08_2019_14_24_22

Face image: https://en.wikipedia.org/wiki/File:User_icon_2.svg From Tango Desktop Project

sc0w commented 5 years ago

why not with little changes like I mentioned in https://github.com/mate-desktop/mate-screensaver/pull/203#issuecomment-520187193 ?

patch over master:

diff --git a/src/gs-lock-plug.c b/src/gs-lock-plug.c
index c3081c2..243eaaa 100644
--- a/src/gs-lock-plug.c
+++ b/src/gs-lock-plug.c
@@ -2011,7 +2011,12 @@ load_theme (GSLockPlug *plug)
        static GtkCssProvider *style_provider = NULL;

        if (style_provider == NULL)
+                {
            style_provider = gtk_css_provider_new ();
+                        gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
+                                                                   GTK_STYLE_PROVIDER (style_provider),
+                                                                   GTK_STYLE_PROVIDER_PRIORITY_USER);
+                }

        gtk_css_provider_load_from_path (style_provider, css, NULL);
    }

this reduces the scope of the static variable

rbuj commented 5 years ago

@sc0w

I think that style_provider should be created even if lock-dialog-THEME.css doesn't exist, since the user can define the css info in XDG_CONFIG_HOME.

$ LANG=C ls /usr/share/mate-screensaver/lock-dialog-default.css
ls: cannot access '/usr/share/mate-screensaver/lock-dialog-default.css': No such file or directory

Test: gtk-theme TraditionalOk + lock-dialog-theme default + ~/.config/gtk-3.0/gtk.css

mkdir -p ~/.config/gtk-3.0
wget -q -O ~/.config/gtk-3.0/gtk.css https://gist.githubusercontent.com/geki-yaba/19262f9af9b2a6f838636e6f019e96a3/raw/24a5ee22a0338c6c145db15f363bcbe73c64630d/gistfile1.txt
gsettings set org.mate.screensaver lock-dialog-theme default
gsettings set org.mate.interface gtk-theme TraditionalOk
mate-screensaver-command -l
rbuj commented 5 years ago

@sc0w

I'm sorry, you're right. Your proposal also works with the last test.