Blame src/glade-registration.c

Packit 1e8aac
/*
Packit 1e8aac
 * Copyright (C) 2014 Juan Pablo Ugarte.
Packit 1e8aac
 *
Packit 1e8aac
 * This program is free software; you can redistribute it and/or modify
Packit 1e8aac
 * it under the terms of the GNU General Public License as
Packit 1e8aac
 * published by the Free Software Foundation; either version 2 of the
Packit 1e8aac
 * License, or (at your option) any later version.
Packit 1e8aac
 *
Packit 1e8aac
 * This program is distributed in the hope that it will be useful,
Packit 1e8aac
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 1e8aac
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 1e8aac
 * GNU General Public License for more details.
Packit 1e8aac
 *
Packit 1e8aac
 * You should have received a copy of the GNU General Public License
Packit 1e8aac
 * along with this program; if not, write to the Free Software
Packit 1e8aac
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit 1e8aac
 *
Packit 1e8aac
 * Authors:
Packit 1e8aac
 *   Juan Pablo Ugarte <juanpablougarte@gmail.com>
Packit 1e8aac
 */
Packit 1e8aac
Packit 1e8aac
#include "config.h"
Packit 1e8aac
#include "glade-registration.h"
Packit 1e8aac
#include "glade-http.h"
Packit 1e8aac
#include "glade-logo.h"
Packit 1e8aac
#include <gladeui/glade.h>
Packit 1e8aac
#include <glib/gi18n.h>
Packit 1e8aac
Packit 1e8aac
#define CONFIG_GROUP             "User & Survey"
Packit 1e8aac
Packit 1e8aac
/* translators: Email subject sent to the user after completing the survey */
Packit 1e8aac
#define MAIL_SUBJECT _("Glade User Survey")
Packit 1e8aac
/* translators: Email body sent to the user after completing the survey */
Packit 1e8aac
#define MAIL_BODY _("Thank you for taking Glade Users survey, we appreciate it!\n\nTo validate this email address open the folowing link\n\nhttps://people.gnome.org/~jpu/glade/registration.php?email=$email&validation_token=$new_validation_token\n\nIn case you want to change or update the survey, your current update token is:\n$new_token\n\nCheers\n\n	The Glade team\n")
Packit 1e8aac
Packit 1e8aac
/* translators: Email subject sent to the user after updating the survey */
Packit 1e8aac
#define UPDATE_MAIL_SUBJECT _("Glade User Survey (update)")
Packit 1e8aac
/* translators: Email body sent to the user after updating the survey */
Packit 1e8aac
#define UPDATE_MAIL_BODY _("Thank you for updating your Glade Users survey data, we appreciate it!\n\nIn case you want to change something again, your current update token is:\n$new_token\n\nCheers\n\n	The Glade team\n")
Packit 1e8aac
Packit 1e8aac
struct _GladeRegistrationPrivate
Packit 1e8aac
{
Packit 1e8aac
  GtkWidget    *infobar;
Packit 1e8aac
  GtkWidget    *net_spinner;
Packit 1e8aac
  GtkLabel     *infobar_label;
Packit 1e8aac
  GtkLabel     *status_label;
Packit 1e8aac
  GladeHTTP    *http;
Packit 1e8aac
  GladeHTTP    *sub_http;
Packit 1e8aac
  GCancellable *cancellable;
Packit 1e8aac
Packit 1e8aac
  /* Form widgets */
Packit 1e8aac
Packit 1e8aac
  GtkWidget *name;
Packit 1e8aac
  GtkWidget *email;
Packit 1e8aac
  GtkWidget *country_id;
Packit 1e8aac
  GtkWidget *city;
Packit 1e8aac
  GtkWidget *contact_type;
Packit 1e8aac
  GtkWidget *contact_name;
Packit 1e8aac
  GtkWidget *contact_website;
Packit 1e8aac
  GtkWidget *subscribe;
Packit 1e8aac
Packit 1e8aac
  GtkWidget *update_token_checkbutton;
Packit 1e8aac
  GtkWidget *update_token;
Packit 1e8aac
Packit 1e8aac
  GtkWidget *experience;
Packit 1e8aac
  GtkWidget *experience_unit;
Packit 1e8aac
  GtkWidget *experience_not_programmer;
Packit 1e8aac
  GtkWidget *lang_c;
Packit 1e8aac
  GtkWidget *lang_cpp;
Packit 1e8aac
  GtkWidget *lang_csharp;
Packit 1e8aac
  GtkWidget *lang_java;
Packit 1e8aac
  GtkWidget *lang_python;
Packit 1e8aac
  GtkWidget *lang_javascript;
Packit 1e8aac
  GtkWidget *lang_vala;
Packit 1e8aac
  GtkWidget *lang_perl;
Packit 1e8aac
  GtkWidget *lang_other;
Packit 1e8aac
  GtkWidget *start_using;
Packit 1e8aac
  GtkWidget *start_using_unit;
Packit 1e8aac
  GtkWidget *version;
Packit 1e8aac
  GtkWidget *version_other;
Packit 1e8aac
  GtkWidget *os;
Packit 1e8aac
  GtkWidget *os_linux;
Packit 1e8aac
  GtkWidget *os_bsd;
Packit 1e8aac
  GtkWidget *os_windows;
Packit 1e8aac
  GtkWidget *os_osx;
Packit 1e8aac
  GtkWidget *os_solaris;
Packit 1e8aac
  GtkWidget *os_other;
Packit 1e8aac
  GtkWidget *freq;
Packit 1e8aac
  GtkWidget *user_level;
Packit 1e8aac
  GtkWidget *soft_free;
Packit 1e8aac
  GtkWidget *soft_open;
Packit 1e8aac
  GtkWidget *soft_commercial;
Packit 1e8aac
  GtkWidget *soft_none;
Packit 1e8aac
  GtkWidget *field_academic;
Packit 1e8aac
  GtkWidget *field_accounting;
Packit 1e8aac
  GtkWidget *field_desktop;
Packit 1e8aac
  GtkWidget *field_educational;
Packit 1e8aac
  GtkWidget *field_embedded;
Packit 1e8aac
  GtkWidget *field_medical;
Packit 1e8aac
  GtkWidget *field_industrial;
Packit 1e8aac
  GtkWidget *field_scientific;
Packit 1e8aac
  GtkWidget *field_other;
Packit 1e8aac
  GtkWidget *improvement;
Packit 1e8aac
  GtkWidget *problem;
Packit 1e8aac
  GtkWidget *problem_other;
Packit 1e8aac
  GtkWidget *bug;
Packit 1e8aac
  GtkWidget *bugzilla;
Packit 1e8aac
  GtkWidget *contributing;
Packit 1e8aac
  GtkWidget *contributing_whynot;
Packit 1e8aac
  GtkWidget *comments;
Packit 1e8aac
};
Packit 1e8aac
Packit 1e8aac
G_DEFINE_TYPE_WITH_PRIVATE (GladeRegistration, glade_registration, GTK_TYPE_DIALOG);
Packit 1e8aac
Packit 1e8aac
enum 
Packit 1e8aac
{
Packit 1e8aac
  PROP_0,
Packit 1e8aac
  PROP_COMPLETED,
Packit 1e8aac
  PROP_SKIP_REMINDER
Packit 1e8aac
};
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
string_append_input_key_value_tuple (GString *string,
Packit 1e8aac
                                     const gchar *name,
Packit 1e8aac
                                     GtkWidget *input)
Packit 1e8aac
{
Packit 1e8aac
  if (string->len)
Packit 1e8aac
    g_string_append_c (string, '&';;
Packit 1e8aac
Packit 1e8aac
  g_string_append (string, name);
Packit 1e8aac
  g_string_append_c (string, '=');
Packit 1e8aac
  
Packit 1e8aac
  if (GTK_IS_ENTRY (input))
Packit 1e8aac
    g_string_append_uri_escaped (string, gtk_entry_get_text (GTK_ENTRY (input)), NULL, FALSE);
Packit 1e8aac
  else if (GTK_IS_TEXT_VIEW (input))
Packit 1e8aac
    {
Packit 1e8aac
      GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (input));      
Packit 1e8aac
      GtkTextIter start, end;
Packit 1e8aac
      gchar *text;
Packit 1e8aac
      
Packit 1e8aac
      gtk_text_buffer_get_bounds (buffer, &start, &end;;
Packit 1e8aac
      text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
Packit 1e8aac
      g_string_append_uri_escaped (string, text ? text : "", NULL, FALSE);
Packit 1e8aac
      g_free (text);
Packit 1e8aac
    }
Packit 1e8aac
  else if (GTK_IS_COMBO_BOX (input))
Packit 1e8aac
    g_string_append_uri_escaped (string, gtk_combo_box_get_active_id (GTK_COMBO_BOX (input)), NULL, FALSE);
Packit 1e8aac
  else if (GTK_IS_RADIO_BUTTON (input))
Packit 1e8aac
    {
Packit 1e8aac
      GSList *group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (input));
Packit 1e8aac
Packit 1e8aac
      for (; group; group = g_slist_next (group))
Packit 1e8aac
        {
Packit 1e8aac
          if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (group->data)))            
Packit 1e8aac
            g_string_append (string, gtk_widget_get_name (group->data));
Packit 1e8aac
        }
Packit 1e8aac
    }
Packit 1e8aac
  else if (GTK_IS_TOGGLE_BUTTON (input))
Packit 1e8aac
    g_string_append_printf (string, "%d", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (input)) ? 1 : 0);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_registration_show_message (GladeRegistration *registration,
Packit 1e8aac
                                 GtkMessageType     type,
Packit 1e8aac
                                 const gchar       *format,
Packit 1e8aac
                                 ...) G_GNUC_PRINTF (3, 4);
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_registration_show_message (GladeRegistration *registration,
Packit 1e8aac
                                 GtkMessageType     type,
Packit 1e8aac
                                 const gchar       *format,
Packit 1e8aac
                                 ...)
Packit 1e8aac
{
Packit 1e8aac
  GladeRegistrationPrivate *priv = registration->priv;
Packit 1e8aac
Packit 1e8aac
  gtk_info_bar_set_message_type (GTK_INFO_BAR (priv->infobar), type);
Packit 1e8aac
Packit 1e8aac
  if (format)
Packit 1e8aac
    {
Packit 1e8aac
      va_list args;
Packit 1e8aac
      gchar *string;
Packit 1e8aac
Packit 1e8aac
      va_start (args, format);
Packit 1e8aac
      string = g_strdup_vprintf (format, args);
Packit 1e8aac
      va_end (args);
Packit 1e8aac
Packit 1e8aac
      gtk_label_set_text (priv->infobar_label, string);
Packit 1e8aac
Packit 1e8aac
      g_free (string);
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    gtk_label_set_text (priv->infobar_label, "");
Packit 1e8aac
  
Packit 1e8aac
  /* Only show the infobar if the dialog is visible */
Packit 1e8aac
  if (gtk_widget_is_visible (GTK_WIDGET (registration)))
Packit 1e8aac
    gtk_widget_show (priv->infobar);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
#ifdef GDK_WINDOWING_X11
Packit 1e8aac
#include "gdk/gdkx.h"
Packit 1e8aac
#endif
Packit 1e8aac
Packit 1e8aac
#ifdef GDK_WINDOWING_QUARTZ
Packit 1e8aac
#include "gdk/gdkquartz.h"
Packit 1e8aac
#endif
Packit 1e8aac
Packit 1e8aac
#ifdef GDK_WINDOWING_WIN32
Packit 1e8aac
#include "gdk/gdkwin32.h"
Packit 1e8aac
#endif
Packit 1e8aac
Packit 1e8aac
#ifdef GDK_WINDOWING_WAYLAND
Packit 1e8aac
#include "gdk/gdkwayland.h"
Packit 1e8aac
#endif
Packit 1e8aac
Packit 1e8aac
#ifdef GDK_WINDOWING_BROADWAY
Packit 1e8aac
#include "gdk/gdkbroadway.h"
Packit 1e8aac
#endif
Packit 1e8aac
Packit 1e8aac
static const gchar *
Packit 1e8aac
get_gdk_backend (GtkWidget *widget)
Packit 1e8aac
{
Packit 1e8aac
  GdkDisplay *display = gtk_widget_get_display (widget);
Packit 1e8aac
Packit 1e8aac
#ifdef GDK_WINDOWING_X11
Packit 1e8aac
  if (GDK_IS_X11_DISPLAY (display))
Packit 1e8aac
    return "X11";
Packit 1e8aac
  else
Packit 1e8aac
#endif
Packit 1e8aac
Packit 1e8aac
#ifdef GDK_WINDOWING_QUARTZ
Packit 1e8aac
  if (GDK_IS_QUARTZ_DISPLAY (display))
Packit 1e8aac
    return "Quartz";
Packit 1e8aac
  else
Packit 1e8aac
#endif
Packit 1e8aac
Packit 1e8aac
#ifdef GDK_WINDOWING_WIN32
Packit 1e8aac
  if (GDK_IS_WIN32_DISPLAY (display))
Packit 1e8aac
    return "Win32";
Packit 1e8aac
  else
Packit 1e8aac
#endif
Packit 1e8aac
Packit 1e8aac
#ifdef GDK_WINDOWING_WAYLAND
Packit 1e8aac
  if (GDK_IS_WAYLAND_DISPLAY (display))
Packit 1e8aac
    return "Wayland";
Packit 1e8aac
  else
Packit 1e8aac
#endif
Packit 1e8aac
Packit 1e8aac
#ifdef GDK_WINDOWING_BROADWAY
Packit 1e8aac
  if (GDK_IS_BROADWAY_DISPLAY (display))
Packit 1e8aac
    return "Broadway";
Packit 1e8aac
  else
Packit 1e8aac
#endif
Packit 1e8aac
  {
Packit 1e8aac
    return "Unknown";
Packit 1e8aac
  }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_registration_http_post (GladeRegistration *registration,
Packit 1e8aac
                              GladeHTTP         *http,
Packit 1e8aac
                              GCancellable      *cancellable,
Packit 1e8aac
                              const gchar       *url,
Packit 1e8aac
                              GString           *content)
Packit 1e8aac
{
Packit 1e8aac
  const gchar *lang = pango_language_to_string (pango_language_get_default ());
Packit 1e8aac
Packit 1e8aac
  glade_http_request_send_async (http, cancellable,
Packit 1e8aac
                                 "POST %s HTTP/1.1\r\n"
Packit 1e8aac
                                 "Host: %s\r\n"
Packit 1e8aac
                                 "User-Agent: Glade/"PACKAGE_VERSION" (%s; Gtk+ %d.%d.%d; glib %d.%d.%d; %s)\r\n"
Packit 1e8aac
                                 "Connection: close\r\n"
Packit 1e8aac
                                 "Accept: text/plain\r\n"
Packit 1e8aac
                                 "Accept-Language: %s\r\n"
Packit 1e8aac
                                 "Content-Type: application/x-www-form-urlencoded\r\n"
Packit 1e8aac
                                 "Content-Length: %"G_GSIZE_FORMAT"\r\n"
Packit 1e8aac
                                 "\r\n%s",
Packit 1e8aac
                                 url,                                                       /* POST url */
Packit 1e8aac
                                 glade_http_get_host (http),                                /* Host */
Packit 1e8aac
                                 get_gdk_backend (GTK_WIDGET (registration)),               /* User-Agent backend */
Packit 1e8aac
                                 GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION,   /* User-Agent gtk version */
Packit 1e8aac
                                 glib_major_version, glib_minor_version, glib_micro_version,/* User-Agent glib version */
Packit 1e8aac
                                 lang,                                                      /* User-Agent language */
Packit 1e8aac
                                 lang,                                                      /* Accept-Language */
Packit 1e8aac
                                 content->len,                                              /* Content-length */
Packit 1e8aac
                                 content->str);                                             /* content */
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
#define append_input_tuple(s,i) string_append_input_key_value_tuple (s, #i, priv->i)
Packit 1e8aac
Packit 1e8aac
static void 
Packit 1e8aac
on_http_status (GladeHTTP         *http,
Packit 1e8aac
                GladeHTTPStatus    status,
Packit 1e8aac
                GError            *error,
Packit 1e8aac
                GladeRegistration *registration)
Packit 1e8aac
{
Packit 1e8aac
  gchar *text = NULL;
Packit 1e8aac
  
Packit 1e8aac
  switch (status)
Packit 1e8aac
    {
Packit 1e8aac
      case GLADE_HTTP_READY:
Packit 1e8aac
      break;
Packit 1e8aac
      case GLADE_HTTP_CONNECTING:
Packit 1e8aac
        text = g_strdup_printf (_("Connecting to %s"), glade_http_get_host (http));
Packit 1e8aac
      break;
Packit 1e8aac
      case GLADE_HTTP_SENDING:
Packit 1e8aac
        text = g_strdup_printf (_("Sending data to %s"), glade_http_get_host (http));
Packit 1e8aac
      break;
Packit 1e8aac
      case GLADE_HTTP_WAITING:
Packit 1e8aac
        text = g_strdup_printf (_("Waiting for %s"), glade_http_get_host (http));
Packit 1e8aac
      break;
Packit 1e8aac
      case GLADE_HTTP_RECEIVING:
Packit 1e8aac
        text = g_strdup_printf (_("Receiving data from %s"), glade_http_get_host (http));
Packit 1e8aac
      break;
Packit 1e8aac
      case GLADE_HTTP_ERROR:
Packit 1e8aac
        glade_registration_show_message (registration, GTK_MESSAGE_WARNING,
Packit 1e8aac
                                         "%s", error->message);
Packit 1e8aac
      break;
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  gtk_label_set_text (registration->priv->status_label, text ? text : "");
Packit 1e8aac
  gtk_widget_set_visible (registration->priv->net_spinner, text != NULL);
Packit 1e8aac
  g_free (text);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static void 
Packit 1e8aac
on_subscribe_http_request_done (GladeHTTP         *http,
Packit 1e8aac
                                gint               code,
Packit 1e8aac
                                const gchar      **headers,
Packit 1e8aac
                                const gchar      **values,
Packit 1e8aac
                                const gchar       *response,
Packit 1e8aac
                                GladeRegistration *registration)
Packit 1e8aac
{
Packit 1e8aac
  GtkDialog *dialog;
Packit 1e8aac
  GtkWidget *button;
Packit 1e8aac
  
Packit 1e8aac
  if (code == 200)
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  dialog = GTK_DIALOG (gtk_message_dialog_new (GTK_WINDOW (registration),
Packit 1e8aac
                                               GTK_DIALOG_DESTROY_WITH_PARENT,
Packit 1e8aac
                                               GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
Packit 1e8aac
                                               "%s",
Packit 1e8aac
                                               _("Sorry, automatic subscription to Glade Users mailing list failed")));
Packit 1e8aac
  
Packit 1e8aac
  button = gtk_link_button_new_with_label ("http://lists.ximian.com/mailman/listinfo/glade-users",
Packit 1e8aac
                                           _("Open Glade Users Website"));
Packit 1e8aac
  gtk_widget_show (button);
Packit 1e8aac
  gtk_dialog_add_action_widget (dialog, button, GTK_RESPONSE_CANCEL);
Packit 1e8aac
  gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (gtk_dialog_get_action_area (dialog)), button, TRUE);
Packit 1e8aac
Packit 1e8aac
  gtk_dialog_run (dialog);
Packit 1e8aac
  gtk_widget_destroy (GTK_WIDGET (dialog));
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_registration_subscribe_email (GladeRegistration *registration)
Packit 1e8aac
{
Packit 1e8aac
  GladeRegistrationPrivate *priv = registration->priv;
Packit 1e8aac
  GString *post;
Packit 1e8aac
Packit 1e8aac
  if (!priv->sub_http)
Packit 1e8aac
    {
Packit 1e8aac
      priv->sub_http = glade_http_new ("lists.ximian.com", 80, FALSE);
Packit 1e8aac
      g_signal_connect_object (priv->sub_http, "request-done",
Packit 1e8aac
                               G_CALLBACK (on_subscribe_http_request_done),
Packit 1e8aac
                               registration, 0);
Packit 1e8aac
    }
Packit 1e8aac
  
Packit 1e8aac
  post = g_string_new ("");
Packit 1e8aac
Packit 1e8aac
  string_append_input_key_value_tuple (post, "email", priv->email);
Packit 1e8aac
  string_append_input_key_value_tuple (post, "fullname", priv->name);
Packit 1e8aac
Packit 1e8aac
  glade_registration_http_post (registration, priv->sub_http, NULL,
Packit 1e8aac
                                "/mailman/subscribe/glade-users",
Packit 1e8aac
                                post);
Packit 1e8aac
Packit 1e8aac
  g_string_free (post, TRUE);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
#define append_input_tuple(s,i) string_append_input_key_value_tuple (s, #i, priv->i)
Packit 1e8aac
Packit 1e8aac
static void 
Packit 1e8aac
on_http_request_done (GladeHTTP         *http,
Packit 1e8aac
                      gint               code,
Packit 1e8aac
                      const gchar      **headers,
Packit 1e8aac
                      const gchar      **values,
Packit 1e8aac
                      const gchar       *response,
Packit 1e8aac
                      GladeRegistration *registration)
Packit 1e8aac
{
Packit 1e8aac
  switch (code)
Packit 1e8aac
    {
Packit 1e8aac
      case 100:
Packit 1e8aac
        /* Ignore Continue HTTP response */
Packit 1e8aac
      break;
Packit 1e8aac
      case 200:
Packit 1e8aac
        {
Packit 1e8aac
          const gchar *status = NULL, *message = _("Internal server error");
Packit 1e8aac
          GladeRegistrationPrivate *priv = registration->priv;
Packit 1e8aac
          gint i;
Packit 1e8aac
Packit 1e8aac
          for (i = 0; headers[i]; i++)
Packit 1e8aac
            {
Packit 1e8aac
              if (g_strcmp0 (headers[i], "X-Glade-Status") == 0)
Packit 1e8aac
                status = values[i];
Packit 1e8aac
              else if (g_strcmp0 (headers[i], "X-Glade-Message") == 0)
Packit 1e8aac
                message = values[i];
Packit 1e8aac
            }
Packit 1e8aac
Packit 1e8aac
          if (status == NULL)
Packit 1e8aac
            glade_registration_show_message (registration, GTK_MESSAGE_WARNING, 
Packit 1e8aac
                                             "%s", message);
Packit 1e8aac
          else if (g_strcmp0 (status, "ok") == 0)
Packit 1e8aac
            {
Packit 1e8aac
              gtk_label_set_text (priv->status_label, "");
Packit 1e8aac
              gtk_widget_hide (priv->net_spinner);
Packit 1e8aac
Packit 1e8aac
              if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->subscribe)))
Packit 1e8aac
                glade_registration_subscribe_email (registration);
Packit 1e8aac
Packit 1e8aac
              glade_util_ui_message (GTK_WIDGET (registration), GLADE_UI_INFO, NULL,
Packit 1e8aac
                                     "<big>%s</big>", _("Thank you for taking the time to complete the survey, we appreciate it!"));
Packit 1e8aac
              gtk_widget_hide (GTK_WIDGET (registration));
Packit 1e8aac
Packit 1e8aac
              g_object_set (registration, "completed", TRUE, NULL);
Packit 1e8aac
              glade_app_config_save ();
Packit 1e8aac
            }
Packit 1e8aac
          else if (g_strcmp0 (status, "error_required_field") == 0)
Packit 1e8aac
            glade_registration_show_message (registration, GTK_MESSAGE_INFO,
Packit 1e8aac
                                             "%s", _("Name and Email fields are required"));
Packit 1e8aac
          else if (g_strcmp0 (status, "error_email_in_use") == 0)
Packit 1e8aac
            glade_registration_show_message (registration, GTK_MESSAGE_WARNING,
Packit 1e8aac
                                             "%s", _("Oops! Email address is already in use!\nTo update information you need to provide the token that was sent to your inbox."));
Packit 1e8aac
          else if (g_strcmp0 (status, "error_db_user_info") == 0)
Packit 1e8aac
            glade_registration_show_message (registration, GTK_MESSAGE_WARNING,
Packit 1e8aac
                                             _("Oops! Error saving user information: %s"), message);
Packit 1e8aac
          else if (g_strcmp0 (status, "error_db_survey_data") == 0)
Packit 1e8aac
            glade_registration_show_message (registration, GTK_MESSAGE_WARNING,
Packit 1e8aac
                                             _("Oops! Error saving survey data: %s"), message);
Packit 1e8aac
          else if (g_strcmp0 (status, "error_db") == 0)
Packit 1e8aac
            glade_registration_show_message (registration, GTK_MESSAGE_WARNING,
Packit 1e8aac
                                             _("Oops! Error accessing DB: %s"), message);
Packit 1e8aac
          else
Packit 1e8aac
            glade_registration_show_message (registration, GTK_MESSAGE_WARNING, "%s", message);
Packit 1e8aac
        }
Packit 1e8aac
      break;
Packit 1e8aac
      default:
Packit 1e8aac
        glade_registration_show_message (registration, GTK_MESSAGE_WARNING,
Packit 1e8aac
                                         "%s", response ? response : "");
Packit 1e8aac
      break;
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void 
Packit 1e8aac
glade_registration_clear_cancellable (GladeRegistrationPrivate *priv)
Packit 1e8aac
{
Packit 1e8aac
  if (priv->cancellable)
Packit 1e8aac
    {
Packit 1e8aac
      g_cancellable_cancel (priv->cancellable);
Packit 1e8aac
      g_clear_object (&priv->cancellable);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void 
Packit 1e8aac
on_registration_dialog_response (GtkDialog *dialog, gint response_id)
Packit 1e8aac
{
Packit 1e8aac
  GladeRegistrationPrivate *priv = GLADE_REGISTRATION (dialog)->priv;
Packit 1e8aac
  GString *post;
Packit 1e8aac
Packit 1e8aac
  gtk_widget_hide (priv->infobar);
Packit 1e8aac
  
Packit 1e8aac
  if (response_id != GTK_RESPONSE_APPLY)
Packit 1e8aac
    {
Packit 1e8aac
      gtk_widget_hide (GTK_WIDGET (dialog));
Packit 1e8aac
      glade_registration_clear_cancellable (priv);
Packit 1e8aac
      return;
Packit 1e8aac
    }
Packit 1e8aac
  
Packit 1e8aac
  glade_registration_clear_cancellable (priv);
Packit 1e8aac
  priv->cancellable = g_cancellable_new ();
Packit 1e8aac
  
Packit 1e8aac
  post = g_string_new ("");
Packit 1e8aac
Packit 1e8aac
  append_input_tuple (post, name);
Packit 1e8aac
  append_input_tuple (post, email);
Packit 1e8aac
  append_input_tuple (post, country_id);
Packit 1e8aac
  append_input_tuple (post, city);
Packit 1e8aac
  append_input_tuple (post, contact_type);
Packit 1e8aac
  append_input_tuple (post, contact_name);
Packit 1e8aac
  append_input_tuple (post, contact_website);
Packit 1e8aac
Packit 1e8aac
  append_input_tuple (post, update_token_checkbutton);
Packit 1e8aac
  append_input_tuple (post, update_token);
Packit 1e8aac
  
Packit 1e8aac
  append_input_tuple (post, experience);
Packit 1e8aac
  append_input_tuple (post, experience_unit);
Packit 1e8aac
  append_input_tuple (post, experience_not_programmer);
Packit 1e8aac
  append_input_tuple (post, lang_c);
Packit 1e8aac
  append_input_tuple (post, lang_cpp);
Packit 1e8aac
  append_input_tuple (post, lang_csharp);
Packit 1e8aac
  append_input_tuple (post, lang_java);
Packit 1e8aac
  append_input_tuple (post, lang_python);
Packit 1e8aac
  append_input_tuple (post, lang_javascript);
Packit 1e8aac
  append_input_tuple (post, lang_vala);
Packit 1e8aac
  append_input_tuple (post, lang_perl);
Packit 1e8aac
  append_input_tuple (post, lang_other);
Packit 1e8aac
  append_input_tuple (post, start_using);
Packit 1e8aac
  append_input_tuple (post, start_using_unit);
Packit 1e8aac
  append_input_tuple (post, version);
Packit 1e8aac
  append_input_tuple (post, version_other);
Packit 1e8aac
  append_input_tuple (post, os);
Packit 1e8aac
  string_append_input_key_value_tuple (post, "linux", priv->os_linux);
Packit 1e8aac
  string_append_input_key_value_tuple (post, "bsd", priv->os_bsd);
Packit 1e8aac
  string_append_input_key_value_tuple (post, "windows", priv->os_windows);
Packit 1e8aac
  string_append_input_key_value_tuple (post, "osx", priv->os_osx);
Packit 1e8aac
  string_append_input_key_value_tuple (post, "solaris", priv->os_solaris);
Packit 1e8aac
  append_input_tuple (post, os_other);
Packit 1e8aac
  append_input_tuple (post, freq);
Packit 1e8aac
  append_input_tuple (post, user_level);
Packit 1e8aac
  append_input_tuple (post, soft_free);
Packit 1e8aac
  append_input_tuple (post, soft_open);
Packit 1e8aac
  append_input_tuple (post, soft_commercial);
Packit 1e8aac
  append_input_tuple (post, soft_none);
Packit 1e8aac
  append_input_tuple (post, field_academic);
Packit 1e8aac
  append_input_tuple (post, field_accounting);
Packit 1e8aac
  append_input_tuple (post, field_desktop);
Packit 1e8aac
  append_input_tuple (post, field_educational);
Packit 1e8aac
  append_input_tuple (post, field_embedded);
Packit 1e8aac
  append_input_tuple (post, field_medical);
Packit 1e8aac
  append_input_tuple (post, field_industrial);
Packit 1e8aac
  append_input_tuple (post, field_scientific);
Packit 1e8aac
  append_input_tuple (post, field_other);
Packit 1e8aac
  append_input_tuple (post, improvement);
Packit 1e8aac
  append_input_tuple (post, problem);
Packit 1e8aac
  append_input_tuple (post, problem_other);
Packit 1e8aac
  append_input_tuple (post, bug);
Packit 1e8aac
  append_input_tuple (post, bugzilla);
Packit 1e8aac
  append_input_tuple (post, contributing);
Packit 1e8aac
  append_input_tuple (post, contributing_whynot);
Packit 1e8aac
  append_input_tuple (post, comments);
Packit 1e8aac
Packit 1e8aac
  glade_registration_http_post (GLADE_REGISTRATION (dialog),
Packit 1e8aac
                                priv->http,
Packit 1e8aac
                                priv->cancellable,
Packit 1e8aac
                                "/~jpu/glade/registration.php",
Packit 1e8aac
                                post);
Packit 1e8aac
  
Packit 1e8aac
  g_string_free (post, TRUE);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
toggle_button_set_visible_on_toggle (GtkToggleButton *button, GtkWidget *widget)
Packit 1e8aac
{
Packit 1e8aac
  gtk_widget_set_visible (widget, gtk_toggle_button_get_active (button));
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
toggle_button_set_sensitive_on_toggle (GtkToggleButton *button, GtkWidget *widget)
Packit 1e8aac
{
Packit 1e8aac
  gtk_widget_set_sensitive (widget, gtk_toggle_button_get_active (button));
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
on_viewport_draw (GtkWidget *viewport, cairo_t *cr, GladeRegistration *widget)
Packit 1e8aac
{
Packit 1e8aac
  GtkStyleContext *context = gtk_widget_get_style_context (viewport);
Packit 1e8aac
  GtkAllocation alloc;
Packit 1e8aac
  gdouble scale;
Packit 1e8aac
  GdkRGBA c;
Packit 1e8aac
Packit 1e8aac
  gtk_style_context_get_color (context, gtk_style_context_get_state (context), &c);
Packit 1e8aac
Packit 1e8aac
  gtk_widget_get_allocation (viewport, &alloc);
Packit 1e8aac
      
Packit 1e8aac
  scale = MIN (alloc.width/GLADE_LOGO_WIDTH, alloc.height/GLADE_LOGO_HEIGHT) - .1;
Packit 1e8aac
      
Packit 1e8aac
  cairo_save (cr);
Packit 1e8aac
Packit 1e8aac
  cairo_set_source_rgba (cr, c.red, c.green, c.blue, .04);
Packit 1e8aac
  cairo_scale (cr, scale, scale);
Packit 1e8aac
  cairo_translate (cr, (alloc.width / scale) - GLADE_LOGO_WIDTH*.95,
Packit 1e8aac
                   (alloc.height / scale) - GLADE_LOGO_HEIGHT);
Packit 1e8aac
  cairo_append_path (cr, &glade_logo_path);
Packit 1e8aac
  cairo_fill (cr);
Packit 1e8aac
Packit 1e8aac
  cairo_restore (cr);
Packit 1e8aac
Packit 1e8aac
  return FALSE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_registration_init (GladeRegistration *registration)
Packit 1e8aac
{
Packit 1e8aac
  GladeRegistrationPrivate *priv = glade_registration_get_instance_private (registration);
Packit 1e8aac
Packit 1e8aac
  registration->priv = priv;
Packit 1e8aac
Packit 1e8aac
  /* HTTPS default port is 443 */
Packit 1e8aac
  priv->http = glade_http_new ("people.gnome.org", 443, TRUE);
Packit 1e8aac
Packit 1e8aac
  g_signal_connect_object (priv->http, "request-done",
Packit 1e8aac
                           G_CALLBACK (on_http_request_done),
Packit 1e8aac
                           registration, 0);
Packit 1e8aac
  g_signal_connect_object (priv->http, "status",
Packit 1e8aac
                           G_CALLBACK (on_http_status),
Packit 1e8aac
                           registration, 0);
Packit 1e8aac
  
Packit 1e8aac
  gtk_widget_init_template (GTK_WIDGET (registration));
Packit 1e8aac
Packit 1e8aac
  if (GTK_IS_COMBO_BOX_TEXT (priv->version_other))
Packit 1e8aac
    {
Packit 1e8aac
      GtkComboBoxText *combo = GTK_COMBO_BOX_TEXT (priv->version_other);
Packit 1e8aac
      gchar id[16], text[18];
Packit 1e8aac
      gint minor;
Packit 1e8aac
Packit 1e8aac
      for (minor = 0; minor <= GLADE_MINOR_VERSION; minor+=2)
Packit 1e8aac
        {
Packit 1e8aac
          g_snprintf (id, 16, "%d", minor);
Packit 1e8aac
          g_snprintf (text, 18, "3.%d", minor);
Packit 1e8aac
          gtk_combo_box_text_append (combo, id, text);
Packit 1e8aac
        }
Packit 1e8aac
Packit 1e8aac
      gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_registration_finalize (GObject *object)
Packit 1e8aac
{
Packit 1e8aac
  GladeRegistrationPrivate *priv = GLADE_REGISTRATION (object)->priv;
Packit 1e8aac
Packit 1e8aac
  g_clear_object (&priv->http);
Packit 1e8aac
  g_clear_object (&priv->sub_http);
Packit 1e8aac
  g_clear_object (&priv->cancellable);
Packit 1e8aac
Packit 1e8aac
  G_OBJECT_CLASS (glade_registration_parent_class)->finalize (object);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_registration_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
Packit 1e8aac
{
Packit 1e8aac
  GKeyFile *config = glade_app_get_config ();
Packit 1e8aac
  g_return_if_fail (GLADE_IS_REGISTRATION (object));
Packit 1e8aac
Packit 1e8aac
  switch (prop_id)
Packit 1e8aac
    {
Packit 1e8aac
      case PROP_SKIP_REMINDER:
Packit 1e8aac
      case PROP_COMPLETED:
Packit 1e8aac
        g_key_file_set_boolean (config, CONFIG_GROUP, pspec->name, g_value_get_boolean (value));
Packit 1e8aac
        break;
Packit 1e8aac
      default:
Packit 1e8aac
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit 1e8aac
        break;
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_registration_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
Packit 1e8aac
{
Packit 1e8aac
  GKeyFile *config = glade_app_get_config ();
Packit 1e8aac
  g_return_if_fail (GLADE_IS_REGISTRATION (object));
Packit 1e8aac
Packit 1e8aac
  switch (prop_id)
Packit 1e8aac
    {
Packit 1e8aac
      case PROP_SKIP_REMINDER:
Packit 1e8aac
      case PROP_COMPLETED:
Packit 1e8aac
        g_value_set_boolean (value, g_key_file_get_boolean (config, CONFIG_GROUP, pspec->name, NULL));
Packit 1e8aac
        break;
Packit 1e8aac
      default:
Packit 1e8aac
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit 1e8aac
        break;
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_registration_class_init (GladeRegistrationClass *klass)
Packit 1e8aac
{
Packit 1e8aac
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit 1e8aac
  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
Packit 1e8aac
  GtkCssProvider *css_provider;
Packit 1e8aac
Packit 1e8aac
  gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/glade/glade-registration.glade");
Packit 1e8aac
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, infobar);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, net_spinner);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, infobar_label);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, status_label);
Packit 1e8aac
  
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, name);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, email);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, country_id);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, city);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, contact_type);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, contact_name);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, contact_website);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, subscribe);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, update_token_checkbutton);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, update_token);
Packit 1e8aac
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, experience);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, experience_unit);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, experience_not_programmer);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, lang_c);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, lang_cpp);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, lang_csharp);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, lang_java);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, lang_python);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, lang_javascript);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, lang_vala);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, lang_perl);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, lang_other);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, start_using);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, start_using_unit);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, version);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, version_other);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, os);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, os_linux);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, os_bsd);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, os_windows);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, os_osx);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, os_solaris);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, os_other);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, freq);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, user_level);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, soft_free);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, soft_open);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, soft_commercial);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, soft_none);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, field_academic);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, field_accounting);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, field_desktop);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, field_educational);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, field_embedded);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, field_medical);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, field_industrial);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, field_scientific);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, field_other);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, improvement);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, problem);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, problem_other);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, bug);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, bugzilla);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, contributing);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, contributing_whynot);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeRegistration, comments);
Packit 1e8aac
  
Packit 1e8aac
  gtk_widget_class_bind_template_callback (widget_class, on_registration_dialog_response);
Packit 1e8aac
  gtk_widget_class_bind_template_callback (widget_class, toggle_button_set_visible_on_toggle);
Packit 1e8aac
  gtk_widget_class_bind_template_callback (widget_class, toggle_button_set_sensitive_on_toggle);
Packit 1e8aac
  gtk_widget_class_bind_template_callback (widget_class, on_viewport_draw);
Packit 1e8aac
  
Packit 1e8aac
  object_class->finalize = glade_registration_finalize;
Packit 1e8aac
  object_class->set_property = glade_registration_set_property;
Packit 1e8aac
  object_class->get_property = glade_registration_get_property;
Packit 1e8aac
Packit 1e8aac
  g_object_class_install_property (object_class,
Packit 1e8aac
                                   PROP_COMPLETED,
Packit 1e8aac
                                   g_param_spec_boolean ("completed",
Packit 1e8aac
                                                         "Completed",
Packit 1e8aac
                                                         "Registration was completed successfully",
Packit 1e8aac
                                                         FALSE,
Packit 1e8aac
                                                         G_PARAM_READWRITE));
Packit 1e8aac
Packit 1e8aac
  g_object_class_install_property (object_class,
Packit 1e8aac
                                   PROP_SKIP_REMINDER,
Packit 1e8aac
                                   g_param_spec_boolean ("skip-reminder",
Packit 1e8aac
                                                         "Skip reminder",
Packit 1e8aac
                                                         "Skip registration reminder dialog",
Packit 1e8aac
                                                         FALSE,
Packit 1e8aac
                                                         G_PARAM_READWRITE));
Packit 1e8aac
Packit 1e8aac
  /* Setup Custom CSS */
Packit 1e8aac
  css_provider = gtk_css_provider_new ();
Packit 1e8aac
  gtk_css_provider_load_from_resource (css_provider, "/org/gnome/glade/glade-registration.css");
Packit 1e8aac
Packit 1e8aac
  gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
Packit 1e8aac
                                             GTK_STYLE_PROVIDER (css_provider),
Packit 1e8aac
                                             GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
Packit 1e8aac
 g_object_unref (css_provider);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
GtkWidget*
Packit 1e8aac
glade_registration_new (void)
Packit 1e8aac
{
Packit 1e8aac
  return GTK_WIDGET (g_object_new (GLADE_TYPE_REGISTRATION, NULL));
Packit 1e8aac
}
Packit 1e8aac