/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ /* * Copyright (C) 2012 Red Hat * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . * * Written by: * Jasper St. Pierre */ #include "config.h" #include "gnome-initial-setup.h" #include #include #include "gis-assistant.h" #define GIS_TYPE_DRIVER_MODE (gis_driver_mode_get_type ()) /* Statically include this for now. Maybe later * we'll generate this from glib-mkenums. */ GType gis_driver_mode_get_type (void) { static GType enum_type_id = 0; if (G_UNLIKELY (!enum_type_id)) { static const GEnumValue values[] = { { GIS_DRIVER_MODE_NEW_USER, "GIS_DRIVER_MODE_NEW_USER", "new_user" }, { GIS_DRIVER_MODE_EXISTING_USER, "GIS_DRIVER_MODE_EXISTING_USER", "existing_user" }, { 0, NULL, NULL } }; enum_type_id = g_enum_register_static("GisDriverMode", values); } return enum_type_id; } enum { REBUILD_PAGES, LOCALE_CHANGED, LAST_SIGNAL, }; static guint signals[LAST_SIGNAL]; enum { PROP_0, PROP_MODE, PROP_USERNAME, PROP_LAST, }; static GParamSpec *obj_props[PROP_LAST]; struct _GisDriverPrivate { GtkWindow *main_window; GisAssistant *assistant; ActUser *user_account; gchar *user_password; gchar *lang_id; gchar *username; GisDriverMode mode; UmAccountMode account_mode; }; typedef struct _GisDriverPrivate GisDriverPrivate; G_DEFINE_TYPE_WITH_PRIVATE(GisDriver, gis_driver, GTK_TYPE_APPLICATION) static void gis_driver_finalize (GObject *object) { GisDriver *driver = GIS_DRIVER (object); GisDriverPrivate *priv = gis_driver_get_instance_private (driver); g_free (priv->lang_id); g_free (priv->username); g_free (priv->user_password); g_clear_object (&priv->user_account); G_OBJECT_CLASS (gis_driver_parent_class)->finalize (object); } static void prepare_main_window (GisDriver *driver) { GisDriverPrivate *priv = gis_driver_get_instance_private (driver); GdkGeometry size_hints; if (gis_driver_is_small_screen (driver)) { GtkWidget *child, *sw; child = g_object_ref (gtk_bin_get_child (GTK_BIN (priv->main_window))); gtk_container_remove (GTK_CONTAINER (priv->main_window), child); sw = gtk_scrolled_window_new (NULL, NULL); gtk_widget_show (sw); gtk_container_add (GTK_CONTAINER (priv->main_window), sw); gtk_container_add (GTK_CONTAINER (sw), child); g_object_unref (child); gtk_window_maximize (priv->main_window); } else { size_hints.min_width = 1024; size_hints.min_height = 768; size_hints.win_gravity = GDK_GRAVITY_CENTER; gtk_window_set_geometry_hints (priv->main_window, NULL, &size_hints, GDK_HINT_MIN_SIZE | GDK_HINT_WIN_GRAVITY); gtk_window_set_resizable (priv->main_window, FALSE); gtk_window_set_position (priv->main_window, GTK_WIN_POS_CENTER_ALWAYS); } gtk_window_set_titlebar (priv->main_window, gis_assistant_get_titlebar (priv->assistant)); } static void rebuild_pages (GisDriver *driver) { g_signal_emit (G_OBJECT (driver), signals[REBUILD_PAGES], 0); } GisAssistant * gis_driver_get_assistant (GisDriver *driver) { GisDriverPrivate *priv = gis_driver_get_instance_private (driver); return priv->assistant; } void gis_driver_set_user_language (GisDriver *driver, const gchar *lang_id) { GisDriverPrivate *priv = gis_driver_get_instance_private (driver); g_free (priv->lang_id); priv->lang_id = g_strdup (lang_id); } const gchar * gis_driver_get_user_language (GisDriver *driver) { GisDriverPrivate *priv = gis_driver_get_instance_private (driver); return priv->lang_id; } void gis_driver_set_username (GisDriver *driver, const gchar *username) { GisDriverPrivate *priv = gis_driver_get_instance_private (driver); g_free (priv->username); priv->username = g_strdup (username); g_object_notify (G_OBJECT (driver), "username"); } const gchar * gis_driver_get_username (GisDriver *driver) { GisDriverPrivate *priv = gis_driver_get_instance_private (driver); return priv->username; } void gis_driver_set_user_permissions (GisDriver *driver, ActUser *user, const gchar *password) { GisDriverPrivate *priv = gis_driver_get_instance_private (driver); g_set_object (&priv->user_account, user); priv->user_password = g_strdup (password); } void gis_driver_get_user_permissions (GisDriver *driver, ActUser **user, const gchar **password) { GisDriverPrivate *priv = gis_driver_get_instance_private (driver); *user = priv->user_account; *password = priv->user_password; } void gis_driver_set_account_mode (GisDriver *driver, UmAccountMode mode) { GisDriverPrivate *priv = gis_driver_get_instance_private (driver); priv->account_mode = mode; } UmAccountMode gis_driver_get_account_mode (GisDriver *driver) { GisDriverPrivate *priv = gis_driver_get_instance_private (driver); return priv->account_mode; } void gis_driver_add_page (GisDriver *driver, GisPage *page) { GisDriverPrivate *priv = gis_driver_get_instance_private (driver); gis_assistant_add_page (priv->assistant, page); } void gis_driver_hide_window (GisDriver *driver) { GisDriverPrivate *priv = gis_driver_get_instance_private (driver); gtk_widget_hide (GTK_WIDGET (priv->main_window)); } static void gis_driver_real_locale_changed (GisDriver *driver) { GisDriverPrivate *priv = gis_driver_get_instance_private (driver); rebuild_pages (driver); gis_assistant_locale_changed (priv->assistant); } void gis_driver_locale_changed (GisDriver *driver) { g_signal_emit (G_OBJECT (driver), signals[LOCALE_CHANGED], 0); } GisDriverMode gis_driver_get_mode (GisDriver *driver) { GisDriverPrivate *priv = gis_driver_get_instance_private (driver); return priv->mode; } gboolean gis_driver_is_small_screen (GisDriver *driver) { GdkScreen *screen; screen = gdk_screen_get_default (); if (g_getenv ("GIS_SMALL_SCREEN")) return TRUE; return gdk_screen_get_height (screen) < 800; } static void gis_driver_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { GisDriver *driver = GIS_DRIVER (object); GisDriverPrivate *priv = gis_driver_get_instance_private (driver); switch (prop_id) { case PROP_MODE: g_value_set_enum (value, priv->mode); break; case PROP_USERNAME: g_value_set_string (value, priv->username); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gis_driver_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { GisDriver *driver = GIS_DRIVER (object); GisDriverPrivate *priv = gis_driver_get_instance_private (driver); switch (prop_id) { case PROP_MODE: priv->mode = g_value_get_enum (value); break; case PROP_USERNAME: g_free (priv->username); priv->username = g_value_dup_string (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gis_driver_activate (GApplication *app) { GisDriver *driver = GIS_DRIVER (app); GisDriverPrivate *priv = gis_driver_get_instance_private (driver); G_APPLICATION_CLASS (gis_driver_parent_class)->activate (app); gtk_window_present (GTK_WINDOW (priv->main_window)); } static void window_realize_cb (GtkWidget *widget, gpointer user_data) { GisDriver *driver = GIS_DRIVER (user_data); GisDriverPrivate *priv = gis_driver_get_instance_private (driver); GdkWindow *window; GdkWMFunction funcs; window = gtk_widget_get_window (GTK_WIDGET (priv->main_window)); funcs = GDK_FUNC_ALL | GDK_FUNC_MINIMIZE | GDK_FUNC_CLOSE; if (!gis_driver_is_small_screen (driver)) funcs |= GDK_FUNC_RESIZE | GDK_FUNC_MOVE | GDK_FUNC_MAXIMIZE; gdk_window_set_functions (window, funcs); } static void gis_driver_startup (GApplication *app) { GisDriver *driver = GIS_DRIVER (app); GisDriverPrivate *priv = gis_driver_get_instance_private (driver); G_APPLICATION_CLASS (gis_driver_parent_class)->startup (app); priv->main_window = g_object_new (GTK_TYPE_APPLICATION_WINDOW, "application", app, "type", GTK_WINDOW_TOPLEVEL, "icon-name", "preferences-system", "deletable", FALSE, NULL); g_signal_connect (priv->main_window, "realize", G_CALLBACK (window_realize_cb), (gpointer)app); priv->assistant = g_object_new (GIS_TYPE_ASSISTANT, NULL); gtk_container_add (GTK_CONTAINER (priv->main_window), GTK_WIDGET (priv->assistant)); gtk_widget_show (GTK_WIDGET (priv->assistant)); gis_driver_set_user_language (driver, setlocale (LC_MESSAGES, NULL)); prepare_main_window (driver); rebuild_pages (driver); } static void gis_driver_init (GisDriver *driver) { } static void gis_driver_class_init (GisDriverClass *klass) { GApplicationClass *application_class = G_APPLICATION_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass); gobject_class->get_property = gis_driver_get_property; gobject_class->set_property = gis_driver_set_property; gobject_class->finalize = gis_driver_finalize; application_class->startup = gis_driver_startup; application_class->activate = gis_driver_activate; klass->locale_changed = gis_driver_real_locale_changed; signals[REBUILD_PAGES] = g_signal_new ("rebuild-pages", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (GisDriverClass, rebuild_pages), NULL, NULL, NULL, G_TYPE_NONE, 0); signals[LOCALE_CHANGED] = g_signal_new ("locale-changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (GisDriverClass, locale_changed), NULL, NULL, NULL, G_TYPE_NONE, 0); obj_props[PROP_MODE] = g_param_spec_enum ("mode", "", "", GIS_TYPE_DRIVER_MODE, GIS_DRIVER_MODE_EXISTING_USER, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); obj_props[PROP_USERNAME] = g_param_spec_string ("username", "", "", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); g_object_class_install_properties (gobject_class, PROP_LAST, obj_props); } void gis_driver_save_data (GisDriver *driver) { GisDriverPrivate *priv = gis_driver_get_instance_private (driver); gis_assistant_save_data (priv->assistant); } GisDriver * gis_driver_new (GisDriverMode mode) { return g_object_new (GIS_TYPE_DRIVER, "application-id", "org.gnome.InitialSetup", "mode", mode, NULL); }