]> www.fi.muni.cz Git - evince.git/blobdiff - libview/ev-loading-window.c
[dualscreen] fix crash on ctrl+w and fix control window closing
[evince.git] / libview / ev-loading-window.c
index 6c60c344db920b6f35fb6222f65c8c504030fb10..94576ee71d9fa64bdb390b2da647b2db9d996a5f 100644 (file)
@@ -33,6 +33,7 @@ struct _EvLoadingWindow {
        GtkWindow  base_instance;
 
        GtkWindow *parent;
+       GtkWidget *spinner;
 
        gint       x;
        gint       y;
@@ -69,20 +70,18 @@ ev_loading_window_init (EvLoadingWindow *window)
        GtkWindow   *gtk_window = GTK_WINDOW (window);
        GtkWidget   *widget = GTK_WIDGET (window);
        GtkWidget   *hbox;
-       GtkWidget   *spinner;
        GtkWidget   *label;
-       GtkStyle    *style;
-       GdkColor    fg, bg;
+       GtkStyleContext *context;
+       GdkRGBA    fg, bg;
        const gchar *loading_text = _("Loading…");
        const gchar *fg_color_name = "info_fg_color";
        const gchar *bg_color_name = "info_bg_color";
 
        hbox = gtk_hbox_new (FALSE, 12);
 
-       spinner = gtk_spinner_new ();
-       gtk_spinner_start (GTK_SPINNER (spinner));
-       gtk_box_pack_start (GTK_BOX (hbox), spinner, FALSE, FALSE, 0);
-       gtk_widget_show (spinner);
+       window->spinner = gtk_spinner_new ();
+       gtk_box_pack_start (GTK_BOX (hbox), window->spinner, FALSE, FALSE, 0);
+       gtk_widget_show (window->spinner);
 
        label = gtk_label_new (loading_text);
        gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
@@ -95,31 +94,27 @@ ev_loading_window_init (EvLoadingWindow *window)
 
        gtk_container_set_border_width (GTK_CONTAINER (window), 10);
 
+       gtk_window_set_type_hint (gtk_window, GDK_WINDOW_TYPE_HINT_NOTIFICATION);
        gtk_window_set_accept_focus (gtk_window, FALSE);
-       gtk_window_set_focus_on_map (gtk_window, FALSE);
        gtk_window_set_decorated (gtk_window, FALSE);
-       gtk_window_set_skip_taskbar_hint (gtk_window, TRUE);
-       gtk_window_set_skip_pager_hint (gtk_window, TRUE);
        gtk_window_set_resizable (gtk_window, FALSE);
 
-       style = gtk_widget_get_style (widget);
-       if (!gtk_style_lookup_color (style, fg_color_name, &fg) ||
-           !gtk_style_lookup_color (style, bg_color_name, &bg)) {
-               fg.pixel = 0;
-               fg.red = 0xb800;
-               fg.green = 0xad00;
-               fg.blue = 0x9d00;
-
-               bg.pixel = 0;
-               bg.red = 0xff00;
-               bg.green = 0xff00;
-               bg.blue = 0xbf00;
+       context = gtk_widget_get_style_context (widget);
+        if (!gtk_style_context_lookup_color (context, fg_color_name, &fg) ||
+            !gtk_style_context_lookup_color (context, bg_color_name, &bg)) {
+               fg.red = 0.7;
+               fg.green = 0.67;
+               fg.blue = 0.63;
+                fg.alpha = 1.0;
+
+               bg.red = 0.99;
+               bg.green = 0.99;
+               bg.blue = 0.71;
+                bg.alpha = 1.0;
        }
 
-       if (!gdk_color_equal (&bg, &style->bg[GTK_STATE_NORMAL]))
-               gtk_widget_modify_bg (widget, GTK_STATE_NORMAL, &bg);
-       if (!gdk_color_equal (&fg, &style->fg[GTK_STATE_NORMAL]))
-               gtk_widget_modify_fg (widget, GTK_STATE_NORMAL, &fg);
+        gtk_widget_override_background_color (widget, GTK_STATE_NORMAL, &bg);
+        gtk_widget_override_color (widget, GTK_STATE_NORMAL, &fg);
 }
 
 static GObject *
@@ -179,7 +174,8 @@ ev_loading_window_size_allocate (GtkWidget      *widget,
                                 GtkAllocation  *allocation)
 {
        EvLoadingWindow *window = EV_LOADING_WINDOW (widget);
-       GdkPixmap       *mask;
+        cairo_surface_t *surface;
+        cairo_region_t  *shape;
        cairo_t         *cr;
        double           r;
 
@@ -191,8 +187,10 @@ ev_loading_window_size_allocate (GtkWidget      *widget,
        window->width = allocation->width;
        window->height = allocation->height;
 
-       mask = gdk_pixmap_new (NULL, window->width, window->height, 1);
-       cr = gdk_cairo_create (GDK_DRAWABLE (mask));
+        surface = cairo_image_surface_create (CAIRO_FORMAT_A8,
+                                              window->width,
+                                              window->height);
+       cr = cairo_create (surface);
 
        cairo_save (cr);
        cairo_rectangle (cr, 0, 0, window->width, window->height);
@@ -207,8 +205,11 @@ ev_loading_window_size_allocate (GtkWidget      *widget,
 
        cairo_destroy (cr);
 
-       gtk_widget_shape_combine_mask (widget, mask, 0, 0);
-       g_object_unref (mask);
+        shape = gdk_cairo_region_create_from_surface (surface);
+        cairo_surface_destroy (surface);
+
+        gtk_widget_shape_combine_region (widget, shape);
+        cairo_region_destroy (shape);
 }
 
 static void
@@ -218,9 +219,21 @@ ev_loading_window_hide (GtkWidget *widget)
 
        window->x = window->y = 0;
 
+       gtk_spinner_stop (GTK_SPINNER (window->spinner));
+
        GTK_WIDGET_CLASS (ev_loading_window_parent_class)->hide (widget);
 }
 
+static void
+ev_loading_window_show (GtkWidget *widget)
+{
+       EvLoadingWindow *window = EV_LOADING_WINDOW (widget);
+
+       gtk_spinner_start (GTK_SPINNER (window->spinner));
+
+       GTK_WIDGET_CLASS (ev_loading_window_parent_class)->show (widget);
+}
+
 static void
 ev_loading_window_class_init (EvLoadingWindowClass *klass)
 {
@@ -231,6 +244,7 @@ ev_loading_window_class_init (EvLoadingWindowClass *klass)
        g_object_class->set_property = ev_loading_window_set_property;
 
        gtk_widget_class->size_allocate = ev_loading_window_size_allocate;
+       gtk_widget_class->show = ev_loading_window_show;
        gtk_widget_class->hide = ev_loading_window_hide;
 
        g_object_class_install_property (g_object_class,
@@ -252,6 +266,7 @@ ev_loading_window_new (GtkWindow *parent)
        g_return_val_if_fail (GTK_IS_WINDOW (parent), NULL);
 
        window = g_object_new (EV_TYPE_LOADING_WINDOW,
+                               "type", GTK_WINDOW_POPUP,
                               "parent", parent,
                               NULL);
        return window;