static void
xfdesktop_volume_icon_menu_unmount(GtkWidget *widget, gpointer user_data)
{
    XfdesktopVolumeIcon *icon = XFDESKTOP_VOLUME_ICON(user_data);
    GtkWidget *icon_view = xfdesktop_icon_peek_icon_view(XFDESKTOP_ICON(icon));
    GtkWidget *toplevel = gtk_widget_get_toplevel(icon_view);
    GVolume *volume;
    GMount *mount;
    GMountOperation *operation;

    volume = xfdesktop_volume_icon_peek_volume(icon);
    mount = g_volume_get_mount(volume);

    if(!mount)
        return;

#ifdef HAVE_LIBNOTIFY
    xfdesktop_notify_unmount(mount);
#endif

    operation = gtk_mount_operation_new(toplevel ? GTK_WINDOW(toplevel) : NULL);
    gtk_mount_operation_set_screen(GTK_MOUNT_OPERATION(operation),
                                   icon->priv->gscreen);

    g_mount_unmount_with_operation(mount,
                                   G_MOUNT_UNMOUNT_NONE,
                                   operation,
                                   NULL,
                                   xfdesktop_volume_icon_unmount_finish,
                                   g_object_ref(icon));

    g_object_unref(mount);
    g_object_unref(operation);
}
Example #2
0
static void
gtk_mount_operation_get_property (GObject    *object,
                                  guint       prop_id,
                                  GValue     *value,
                                  GParamSpec *pspec)
{
    GtkMountOperationPrivate *priv;
    GtkMountOperation *operation;

    operation = GTK_MOUNT_OPERATION (object);
    priv = operation->priv;

    switch (prop_id)
    {
    case PROP_PARENT:
        g_value_set_object (value, priv->parent_window);
        break;

    case PROP_IS_SHOWING:
        g_value_set_boolean (value, priv->dialog != NULL);
        break;

    case PROP_SCREEN:
        g_value_set_object (value, priv->screen);
        break;

    default:
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
        break;
    }
}
Example #3
0
static void
gtk_mount_operation_set_property (GObject      *object,
                                  guint         prop_id,
                                  const GValue *value,
                                  GParamSpec   *pspec)
{
    GtkMountOperation *operation;
    gpointer tmp;

    operation = GTK_MOUNT_OPERATION (object);

    switch (prop_id)
    {
    case PROP_PARENT:
        tmp = g_value_get_object (value);
        gtk_mount_operation_set_parent (operation, tmp);
        break;

    case PROP_SCREEN:
        tmp = g_value_get_object (value);
        gtk_mount_operation_set_screen (operation, tmp);
        break;

    case PROP_IS_SHOWING:
    default:
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
        break;
    }
}
Example #4
0
static void
gtk_mount_operation_ask_question (GMountOperation *op,
                                  const char      *message,
                                  const char      *choices[])
{
    GtkMountOperationPrivate *priv;
    GtkWidget  *dialog;
    const char *secondary = NULL;
    char       *primary;
    int        count, len = 0;

    g_return_if_fail (GTK_IS_MOUNT_OPERATION (op));
    g_return_if_fail (message != NULL);
    g_return_if_fail (choices != NULL);

    priv = GTK_MOUNT_OPERATION (op)->priv;

    primary = strstr (message, "\n");
    if (primary)
    {
        secondary = primary + 1;
        primary = g_strndup (message, primary - message);
    }

    dialog = gtk_message_dialog_new (priv->parent_window, 0,
                                     GTK_MESSAGE_QUESTION,
                                     GTK_BUTTONS_NONE, "%s",
                                     primary != NULL ? primary : message);
    g_free (primary);

    if (secondary)
        gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
                "%s", secondary);

    /* First count the items in the list then
     * add the buttons in reverse order */

    while (choices[len] != NULL)
        len++;

    for (count = len - 1; count >= 0; count--)
        gtk_dialog_add_button (GTK_DIALOG (dialog), choices[count], count);

    g_signal_connect (G_OBJECT (dialog), "response",
                      G_CALLBACK (question_dialog_button_clicked), op);

    priv->dialog = GTK_DIALOG (dialog);
    g_object_notify (G_OBJECT (op), "is-showing");

    if (priv->parent_window == NULL && priv->screen)
        gtk_window_set_screen (GTK_WINDOW (dialog), priv->screen);

    gtk_widget_show (dialog);
    g_object_ref (op);
}
Example #5
0
static void
panel_menu_item_mount_volume (GtkWidget *menuitem,
			      GVolume   *volume)
{
	PanelVolumeMountData *mount_data;

	mount_data = g_slice_new (PanelVolumeMountData);
	mount_data->screen = menuitem_to_screen (menuitem);
	mount_data->mount_op = gtk_mount_operation_new (NULL);
	gtk_mount_operation_set_screen (GTK_MOUNT_OPERATION (mount_data->mount_op),
					mount_data->screen);

	g_volume_mount (volume, G_MOUNT_MOUNT_NONE, mount_data->mount_op, NULL,
			volume_mount_cb, mount_data);
}
Example #6
0
static gboolean
_panel_show_handle_error (const gchar  *uri,
			  GdkScreen    *screen,
			  GError       *local_error,
			  GError      **error)
{
	if (local_error == NULL)
		return TRUE;

	else if (g_error_matches (local_error,
				  G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
		g_error_free (local_error);
		return TRUE;
	}

	else if (g_error_matches (local_error,
				  G_IO_ERROR, G_IO_ERROR_NOT_MOUNTED)) {
		GFile *file;
		PanelShowMountOperationHandle *handle;

		handle = g_slice_new (PanelShowMountOperationHandle);
		file = g_file_new_for_uri (uri);

		/* If it's not mounted, try to mount it ourselves */
		handle->mount_op = gtk_mount_operation_new (NULL);
		gtk_mount_operation_set_screen (GTK_MOUNT_OPERATION (handle->mount_op),
						screen);
		handle->screen = screen;

		g_file_mount_enclosing_volume (file, G_MOUNT_MOUNT_NONE,
					       handle->mount_op, NULL,
					       _panel_show_mount_async_callback,
					       handle);
		g_object_unref (file);

		return TRUE;
	}

	else if (error != NULL)
		g_propagate_error (error, local_error);

	else {
		_panel_show_error_dialog (uri, screen, local_error->message);
		g_error_free (local_error);
	}

	return FALSE;
}
Example #7
0
static void
gtk_mount_operation_finalize (GObject *object)
{
    GtkMountOperation *operation;
    GtkMountOperationPrivate *priv;

    operation = GTK_MOUNT_OPERATION (object);

    priv = operation->priv;

    if (priv->parent_window)
        g_object_unref (priv->parent_window);

    if (priv->screen)
        g_object_unref (priv->screen);

    G_OBJECT_CLASS (gtk_mount_operation_parent_class)->finalize (object);
}
Example #8
0
static void
question_dialog_button_clicked (GtkDialog       *dialog,
                                gint             button_number,
                                GMountOperation *op)
{
    GtkMountOperationPrivate *priv;
    GtkMountOperation *operation;

    operation = GTK_MOUNT_OPERATION (op);
    priv = operation->priv;

    if (button_number >= 0)
    {
        g_mount_operation_set_choice (op, button_number);
        g_mount_operation_reply (op, G_MOUNT_OPERATION_HANDLED);
    }
    else
        g_mount_operation_reply (op, G_MOUNT_OPERATION_ABORTED);

    priv->dialog = NULL;
    g_object_notify (G_OBJECT (operation), "is-showing");
    gtk_widget_destroy (GTK_WIDGET (dialog));
    g_object_unref (op);
}
Example #9
0
static void
gtk_mount_operation_ask_password (GMountOperation   *mount_op,
                                  const char        *message,
                                  const char        *default_user,
                                  const char        *default_domain,
                                  GAskPasswordFlags  flags)
{
    GtkMountOperation *operation;
    GtkMountOperationPrivate *priv;
    GtkWidget *widget;
    GtkDialog *dialog;
    GtkWindow *window;
    GtkWidget *entry_container;
    GtkWidget *hbox, *main_vbox, *vbox, *icon;
    GtkWidget *table;
    GtkWidget *message_label;
    gboolean   can_anonymous;
    guint      rows;

    operation = GTK_MOUNT_OPERATION (mount_op);
    priv = operation->priv;

    priv->ask_flags = flags;

    widget = gtk_dialog_new ();
    dialog = GTK_DIALOG (widget);
    window = GTK_WINDOW (widget);

    priv->dialog = dialog;

    /* Set the dialog up with HIG properties */
    gtk_dialog_set_has_separator (dialog, FALSE);
    gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
    gtk_box_set_spacing (GTK_BOX (dialog->vbox), 2); /* 2 * 5 + 2 = 12 */
    gtk_container_set_border_width (GTK_CONTAINER (dialog->action_area), 5);
    gtk_box_set_spacing (GTK_BOX (dialog->action_area), 6);

    gtk_window_set_resizable (window, FALSE);
    gtk_window_set_title (window, "");
    gtk_window_set_icon_name (window, GTK_STOCK_DIALOG_AUTHENTICATION);

    gtk_dialog_add_buttons (dialog,
                            GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                            _("Co_nnect"), GTK_RESPONSE_OK,
                            NULL);
    gtk_dialog_set_default_response (dialog, GTK_RESPONSE_OK);

    gtk_dialog_set_alternative_button_order (dialog,
            GTK_RESPONSE_OK,
            GTK_RESPONSE_CANCEL,
            -1);

    /* Build contents */
    hbox = gtk_hbox_new (FALSE, 12);
    gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
    gtk_box_pack_start (GTK_BOX (dialog->vbox), hbox, TRUE, TRUE, 0);

    icon = gtk_image_new_from_stock (GTK_STOCK_DIALOG_AUTHENTICATION,
                                     GTK_ICON_SIZE_DIALOG);

    gtk_misc_set_alignment (GTK_MISC (icon), 0.5, 0.0);
    gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0);

    main_vbox = gtk_vbox_new (FALSE, 18);
    gtk_box_pack_start (GTK_BOX (hbox), main_vbox, TRUE, TRUE, 0);

    message_label = gtk_label_new (message);
    gtk_misc_set_alignment (GTK_MISC (message_label), 0.0, 0.5);
    gtk_label_set_line_wrap (GTK_LABEL (message_label), TRUE);
    gtk_box_pack_start (GTK_BOX (main_vbox), GTK_WIDGET (message_label),
                        FALSE, FALSE, 0);

    vbox = gtk_vbox_new (FALSE, 6);
    gtk_box_pack_start (GTK_BOX (main_vbox), vbox, FALSE, FALSE, 0);

    can_anonymous = flags & G_ASK_PASSWORD_ANONYMOUS_SUPPORTED;

    if (can_anonymous)
    {
        GtkWidget *anon_box;
        GtkWidget *choice;
        GSList    *group;

        anon_box = gtk_vbox_new (FALSE, 6);
        gtk_box_pack_start (GTK_BOX (vbox), anon_box,
                            FALSE, FALSE, 0);

        choice = gtk_radio_button_new_with_mnemonic (NULL, _("Connect _anonymously"));
        gtk_box_pack_start (GTK_BOX (anon_box),
                            choice,
                            FALSE, FALSE, 0);
        g_signal_connect (choice, "toggled",
                          G_CALLBACK (pw_dialog_anonymous_toggled), operation);
        priv->anonymous_toggle = choice;

        group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (choice));
        choice = gtk_radio_button_new_with_mnemonic (group, _("Connect as u_ser:"));
        gtk_box_pack_start (GTK_BOX (anon_box),
                            choice,
                            FALSE, FALSE, 0);
        g_signal_connect (choice, "toggled",
                          G_CALLBACK (pw_dialog_anonymous_toggled), operation);
    }

    rows = 0;

    if (flags & G_ASK_PASSWORD_NEED_PASSWORD)
        rows++;

    if (flags & G_ASK_PASSWORD_NEED_USERNAME)
        rows++;

    if (flags &G_ASK_PASSWORD_NEED_DOMAIN)
        rows++;

    /* The table that holds the entries */
    entry_container = gtk_alignment_new (0.0, 0.0, 1.0, 1.0);

    gtk_alignment_set_padding (GTK_ALIGNMENT (entry_container),
                               0, 0, can_anonymous ? 12 : 0, 0);

    gtk_box_pack_start (GTK_BOX (vbox), entry_container,
                        FALSE, FALSE, 0);
    priv->entry_container = entry_container;

    table = gtk_table_new (rows, 2, FALSE);
    gtk_table_set_col_spacings (GTK_TABLE (table), 12);
    gtk_table_set_row_spacings (GTK_TABLE (table), 6);
    gtk_container_add (GTK_CONTAINER (entry_container), table);

    rows = 0;

    if (flags & G_ASK_PASSWORD_NEED_USERNAME)
        priv->username_entry = table_add_entry (table, rows++, _("_Username:"******"_Domain:"),
                                              default_domain, operation);

    if (flags & G_ASK_PASSWORD_NEED_PASSWORD)
    {
        priv->password_entry = table_add_entry (table, rows++, _("_Password:"******"Forget password _immediately"));
        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (choice),
                                      password_save == G_PASSWORD_SAVE_NEVER);
        g_object_set_data (G_OBJECT (choice), "password-save",
                           GINT_TO_POINTER (G_PASSWORD_SAVE_NEVER));
        g_signal_connect (choice, "toggled",
                          G_CALLBACK (remember_button_toggled), operation);
        gtk_box_pack_start (GTK_BOX (remember_box), choice, FALSE, FALSE, 0);

        group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (choice));
        choice = gtk_radio_button_new_with_mnemonic (group, _("Remember password until you _logout"));
        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (choice),
                                      password_save == G_PASSWORD_SAVE_FOR_SESSION);
        g_object_set_data (G_OBJECT (choice), "password-save",
                           GINT_TO_POINTER (G_PASSWORD_SAVE_FOR_SESSION));
        g_signal_connect (choice, "toggled",
                          G_CALLBACK (remember_button_toggled), operation);
        gtk_box_pack_start (GTK_BOX (remember_box), choice, FALSE, FALSE, 0);

        group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (choice));
        choice = gtk_radio_button_new_with_mnemonic (group, _("Remember _forever"));
        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (choice),
                                      password_save == G_PASSWORD_SAVE_PERMANENTLY);
        g_object_set_data (G_OBJECT (choice), "password-save",
                           GINT_TO_POINTER (G_PASSWORD_SAVE_PERMANENTLY));
        g_signal_connect (choice, "toggled",
                          G_CALLBACK (remember_button_toggled), operation);
        gtk_box_pack_start (GTK_BOX (remember_box), choice, FALSE, FALSE, 0);
    }

    g_signal_connect (G_OBJECT (dialog), "response",
                      G_CALLBACK (pw_dialog_got_response), operation);

    if (can_anonymous)
    {
        /* The anonymous option will be active by default,
         * ensure the toggled signal is emitted for it.
         */
        gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON (priv->anonymous_toggle));
    }
    else if (! pw_dialog_input_is_valid (operation))
        gtk_dialog_set_response_sensitive (dialog, GTK_RESPONSE_OK, FALSE);

    g_object_notify (G_OBJECT (operation), "is-showing");

    if (priv->parent_window)
    {
        gtk_window_set_transient_for (window, priv->parent_window);
        gtk_window_set_modal (window, TRUE);
    }
    else if (priv->screen)
        gtk_window_set_screen (GTK_WINDOW (dialog), priv->screen);

    gtk_widget_show_all (GTK_WIDGET (dialog));

    g_object_ref (operation);
}