Files
evolution/shell/evolution-activity-client.c
Ettore Perazzoli 482cf3700a [With this commit, the shell compiles without deprecated
GLib/GTK+ functions, except for a couple of places were we use
GtkCList.]

* Makefile.am (INCLUDES): Add `-DG_DISABLE_DEPRECATED
-DGTK_DISABLE_DEPRECATED'.

* evolution-test-component.c (create_new_folder_selector): No
gtk_window_set_policy().

* main.c (quit_box_new): gtk_window_set_resizable() instead of
gtk_window_set_policy().
(view_map_callback): g_signal_handlers_disconnect_by_func()
instead of gtk_signal_disconnect_by_func().
(main): No need to push the GdkRGB visual/cmap anymore.
(new_view_created_callback): Likewise.

* e-task-widget.c: Renamed member pixmap of ETaskWidgetPrivate to
`image'.
(init): Updated accordingly.
(e_task_widget_construct): Use GtkImage, not GtkPixmap.

* e-storage.c (class_init): Converted from gtk_signal_new() to
g_signal_new().

* e-storage-set.c (class_init): Converted from gtk_signal_new() to
g_signal_new().

* e-storage-set-view.c
(setup_folder_properties_items_if_corba_storage_clicked):
g_string_append_printf() instead of g_string_sprintfa().
(class_init): Converted from gtk_signal_new() to g_signal_new().
(setup_folder_changed_callbacks): Use
e_signal_connect_while_alive() and
e_signal_connect_full_while_alive().

* e-splash.c (e_splash_construct): gtk_window_set_resizable()
instead of gtk_window_set_policy().

* e-shortcuts.c: Do not #include e-unicode.h.
(shortcut_item_update): Use g_path_get_basename() instead of
g_basename().
(e_shortcuts_add_default_shortcuts): No need to de-utfize strings.
(e_shortcuts_add_default_group): Same here.

* e-shortcuts-view.c: Do not #include <e-unicode.h>.
(class_init): Converted from gtk_signal_new() to g_signal_new().
(destroy_group_cb): No need to convert the text from UTF8.

* e-shell.c (impl_dispose): g_signal_handlers_disconnect_by_func()
instead of gtk_signal_disconnect_by_func().
(class_init): Use g_signal_new() instead of gtk_signal_new().

* e-shell-view.c: Do not #include e-unicode.h.  Renamed member
offline_toggle_pixmap to offline_toggle_image in
EShellViewPrivate.
(update_folder_title_bar): No need to de-UTF8-ize the title.
(cleanup_delayed_selection):
g_signal_handlers_disconnect_by_func() instead of
gtk_signal_disconnect_by_func().
(ui_engine_add_hint_callback): gtk_label_set_text(), not
gtk_label_set().
(class_init): Use g_signal_new() instead of gtk_signal_new().
(update_for_current_uri): No need to convert the title from UTF8.
(setup_offline_toggle): Changed to set up a GtkImage, not a
GtkPixmap.
(update_offline_toggle_status): Accordingly (gtk_image* instead of
gtk_pixmap*).
(set_current_notebook_page): gtk_notebook_set_current_page(), not
gtk_notebook_set_page().
(get_storage_set_path_from_uri): g_ascii_strncasecmp() instead of
g_strncasecmp().
(folder_bar_popup_map_callback): Use
e_signal_connect_while_alive() instead of
gtk_signal_connect_while_alive().
(e_shell_view_construct): Likewise.
(display_uri): g_signal_connect_after() instead of
gtk_signal_connect_full().
(update_for_current_uri):
g_signal_handlers_{block,unblock}_by_func() instead of
gtk_signal_handler_{block,unblock}_by_func().

* e-shell-view-menu.c (command_about_box):
gtk_window_set_resizable() instead of gtk_window_set_policy().

* e-shell-utils.c (get_mini_name): g_path_get_basename() instead
of g_basename().

* e-shell-user-creatable-items-handler.c
(append_xml_for_menu_item): g_string_append_printf() instead of
g_string_sprintfa().
(create_menu_xml): Likewise.

* e-shell-shared-folder-picker-dialog.c: Do not #include
e-unicode.h.
(progress_bar_timeout_callback): Expect a GtkProgressBar data and
just use gtk_progress_bar_pulse().
(create_progress_dialog): gtk_window_set_resizable() instead of
gtk_window_set_policy().  No gtk_progress_set_activity_mode().
(setup_server_option_menu): Just use
gtk_menu_item_new_with_label() instead of
e_utf8_gtk_menu_item_new_with_label().

* e-shell-settings-dialog.c (set_dialog_size): Ported to Pango.

* e-shell-offline-sync.c
(impl_SyncFolderProgressListener_updateProgress):
gtk_progress_set_fraction() instead of
gtk_progress_bar_set_percentage().
(sync_folder): Likewise.
(setup_dialog): gtk_window_set_resizable() instead of
gtk_window_set_policy().
(sync_folder): No gtk_progress_set_activity_mode().

* e-shell-offline-handler.c: #undef {G,GTK}_DISABLE_DEPRECATED
here for now (need to port from GtkCList).
(class_init): Use g_signal_new()

* e-shell-importer.c: #undef {G,GTK}_DISABLE_DEPRECATED here for
now (need to port from GtkCList).

* e-shell-folder-title-bar.c (create_image_widget_from_xpm):
Renamed from create_pixmap_widget_from_xpm(); handle GtkImage
instead of GtkPixmap.
(new_empty_image_widget): Renamed from new_empty_pixmap_widget();
return a GtkImage instead of a GtkPixmap.
(add_navigation_buttons): Updated accordingly; so use GtkImages
instead of GtkPixmaps.
(e_shell_folder_title_bar_construct): Likewise.
(e_shell_folder_title_bar_set_icon): Use gtk_image_* instead of
gtk_pixmap_* on the image widgets.
(class_init): Converted to use g_signal_new() instead of
gtk_signal_new().
(e_shell_folder_title_bar_new): No need for pushing the GdkRGB
visual/cmap anymore.

* e-shell-folder-selection-dialog.c (check_folder_type_valid):
Just use strcmp instead of strcasecmp().
(class_init): g_signal_new() instead of gtk_signal_new().
(e_shell_folder_selection_dialog_construct): Removed call to
gtk_window_set_policy().

* e-shell-folder-creation-dialog.c
(type_with_display_name_compare_func): Changed to use
g_utf8_casefold().

* e-shell-folder-commands.c: Do not #include e-unicode.h.
(e_shell_command_rename_folder): g_path_get_dirname() instead of
g_dirname().
(folder_selection_dialog_folder_selected_callback):
g_path_get_basename() instead of g_basename().
(rename_cb): Likewise.
(delete_dialog): Do not convert from UTF8 for display purposes.
(e_shell_command_rename_folder): Likewise.

* e-shell-about-box.c (timeout_callback): Ported to Pango and use
gdk_window_invalidate_rect() instead of gtk_widget_draw().

* e-setup.c (check_evolution_directory): Use
gtk_window_set_resizable() instead of gtk_window_set_policy().

* e-local-storage.c: Do not include e-unicode.h.
(create_folder): Use g_path_get_basename() instead of
g_basename().
(create_folder_directory): Likewise.
(remove_folder_directory): Likewise.
(append_xfer_item_list): Likewise.

* e-local-folder.c (construct_loading_metadata): Use
g_path_get_basename() instead of g_basename().

* e-folder-dnd-bridge.c (handle_evolution_path_drag_motion): Use
g_path_get_basename() instead of g_basename().

* e-corba-storage-registry.c: G_STRUCT_OFFSET instead of
GTK_STRUCT_OFFSET.

* e-corba-shortcuts.c: G_STRUCT_OFFSET instead of
GTK_STRUCT_OFFSET.

* e-component-registry.c
(sleep_with_g_main_loop_timeout_callback): g_main_loop_* instead
of g_main_*.
(sleep_with_g_main_loop): Likewise.

* e-activity-handler.c: G_STRUCT_OFFSET instead of
GTK_STRUCT_OFFSET.

* evolution-wizard.c (evolution_wizard_class_init): g_signal_new()
instead of gtk_signal_new().

* evolution-storage-listener.c (class_init): g_signal_new()
instead of gtk_signal_new().

* evolution-shell-view.c (class_init): g_signal_new() instead of
gtk_signal_new().

* evolution-shell-component-dnd.c: G_STRUCT_OFFSET instead of
GTK_STRUCT_OFFSET.

* evolution-shell-component.c: G_STRUCT_OFFSET instead of
GTK_STRUCT_OFFSET.

* evolution-session.c: G_STRUCT_OFFSET instead of
GTK_STRUCT_OFFSET.

* evolution-folder-selector-button.c: Do not include e-unicode.h.
(set_folder): No need to convert from UTF8 to locale encoding
anymore.  Removed unused variable.

* evolution-config-control.c (class_init): Use g_signal_new()
instead of gtk_signal_new().

* evolution-activity-client.c (class_init): Use g_signal_new()
instead of gtk_signal_new().

* e-folder-list.c: Do not include e-unicode.h.  Use E_MAKE_TYPE().
(e_folder_list_get_type): Removed explicit implementation of this.
(e_folder_list_set_arg): Removed.
(e_folder_list_get_arg): Removed.
(e_folder_list_set_property): New.
(e_folder_list_get_property): New.
(e_folder_list_destroy): Removed.
(e_folder_list_dispose): New.
(e_folder_list_class_init): Updated accordingly.

* e-folder.c (impl_save_info): Use G_OBJECT_TYPE_NAME() instead of
gtk_type_name().
(impl_load_info): Likewise.
(impl_remove): Likewise.
(class_init): Use g_signal_new() instead of gtk_signal_new().

svn path=/trunk/; revision=19170
2002-12-19 22:03:40 +00:00

448 lines
12 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/* evolution-activity-client.c
*
* Copyright (C) 2001 Ximian, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of version 2 of the GNU General Public
* License as published by the Free Software Foundation.
*
* 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, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
* Author: Ettore Perazzoli <ettore@ximian.com>
*/
/* Another evil GTK+ object wrapper for a CORBA API. In this case, the wrapper
is needed to avoid sending too frequent CORBA requests across the wire, thus
slowing the client down. The wrapper makes sure that there is a minimum
amount of time between each CORBA method invocation. */
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "evolution-activity-client.h"
#include "e-shell-corba-icon-utils.h"
#include "e-shell-marshal.h"
#include <gtk/gtksignal.h>
#include <gtk/gtkmain.h>
#include <bonobo/bonobo-listener.h>
#include <bonobo/bonobo-exception.h>
#include <gal/util/e-util.h>
#define PARENT_TYPE gtk_object_get_type ()
static GtkObjectClass *parent_class = NULL;
/* The minimum time between updates, in msecs. */
#define UPDATE_DELAY 1000
enum {
SHOW_DETAILS,
CANCEL,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0 };
struct _EvolutionActivityClientPrivate {
/* The ::Activity interface that we QI from the shell. */
GNOME_Evolution_Activity activity_interface;
/* BonoboListener used to get notification about actions that the user
requested on the activity. */
BonoboListener *listener;
/* Id of this activity. */
GNOME_Evolution_Activity_ActivityId activity_id;
/* Id for the GTK+ timeout used to do updates. */
int next_update_timeout_id;
/* Wether we have to actually push an update at this timeout. */
int have_pending_update;
/* Data for the next update. */
char *new_information;
double new_progress;
};
/* Utility functions. */
static gboolean
corba_update_progress (EvolutionActivityClient *activity_client,
const char *information,
double progress)
{
EvolutionActivityClientPrivate *priv;
CORBA_Environment ev;
gboolean retval;
priv = activity_client->priv;
CORBA_exception_init (&ev);
GNOME_Evolution_Activity_operationProgressing (priv->activity_interface,
priv->activity_id,
information,
progress,
&ev);
if (! BONOBO_EX (&ev)) {
retval = TRUE;
} else {
g_warning ("EvolutionActivityClient: Error updating progress -- %s",
BONOBO_EX_REPOID (&ev));
retval = FALSE;
}
CORBA_exception_free (&ev);
return retval;
}
static gboolean
update_timeout_callback (void *data)
{
EvolutionActivityClient *activity_client;
EvolutionActivityClientPrivate *priv;
activity_client = EVOLUTION_ACTIVITY_CLIENT (data);
priv = activity_client->priv;
if (priv->have_pending_update) {
priv->have_pending_update = FALSE;
corba_update_progress (activity_client, priv->new_information, priv->new_progress);
return TRUE;
} else {
priv->next_update_timeout_id = 0;
return FALSE;
}
}
/* BonoboListener callback. */
static void
listener_callback (BonoboListener *listener,
const char *event_name,
const CORBA_any *any,
CORBA_Environment *ev,
void *data)
{
EvolutionActivityClient *activity_client;
activity_client = EVOLUTION_ACTIVITY_CLIENT (data);
if (strcmp (event_name, "ShowDetails") == 0)
g_signal_emit (activity_client, signals[SHOW_DETAILS], 0);
else if (strcmp (event_name, "Cancel") == 0)
g_signal_emit (activity_client, signals[CANCEL], 0);
else
g_warning ("EvolutionActivityClient: Unknown event from listener -- %s", event_name);
}
/* GObject methods. */
static void
impl_dispose (GObject *object)
{
EvolutionActivityClient *activity_client;
EvolutionActivityClientPrivate *priv;
CORBA_Environment ev;
activity_client = EVOLUTION_ACTIVITY_CLIENT (object);
priv = activity_client->priv;
if (priv->next_update_timeout_id != 0) {
g_source_remove (priv->next_update_timeout_id);
priv->next_update_timeout_id = 0;
}
CORBA_exception_init (&ev);
if (! CORBA_Object_is_nil (priv->activity_interface, &ev)) {
GNOME_Evolution_Activity_operationFinished (priv->activity_interface,
priv->activity_id,
&ev);
if (BONOBO_EX (&ev))
g_warning ("EvolutionActivityClient: Error reporting completion of operation -- %s",
BONOBO_EX_REPOID (&ev));
CORBA_Object_release (priv->activity_interface, &ev);
priv->activity_interface = CORBA_OBJECT_NIL;
}
CORBA_exception_free (&ev);
if (priv->listener != NULL) {
bonobo_object_unref (BONOBO_OBJECT (priv->listener));
priv->listener = NULL;
}
(* G_OBJECT_CLASS (parent_class)->dispose) (object);
}
static void
impl_finalize (GObject *object)
{
EvolutionActivityClient *activity_client;
EvolutionActivityClientPrivate *priv;
activity_client = EVOLUTION_ACTIVITY_CLIENT (object);
priv = activity_client->priv;
g_free (priv->new_information);
g_free (priv);
(* G_OBJECT_CLASS (parent_class)->finalize) (object);
}
static void
class_init (EvolutionActivityClientClass *klass)
{
GObjectClass *object_class;
parent_class = g_type_class_ref(PARENT_TYPE);
object_class = G_OBJECT_CLASS (klass);
object_class->dispose = impl_dispose;
object_class->finalize = impl_finalize;
signals[SHOW_DETAILS]
= g_signal_new ("show_details",
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (EvolutionActivityClientClass, show_details),
NULL, NULL,
e_shell_marshal_NONE__NONE,
G_TYPE_NONE, 0);
signals[CANCEL]
= g_signal_new ("cancel",
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (EvolutionActivityClientClass, cancel),
NULL, NULL,
e_shell_marshal_NONE__NONE,
G_TYPE_NONE, 0);
}
static void
init (EvolutionActivityClient *activity_client)
{
EvolutionActivityClientPrivate *priv;
priv = g_new (EvolutionActivityClientPrivate, 1);
priv->activity_interface = CORBA_OBJECT_NIL;
priv->listener = bonobo_listener_new (listener_callback, activity_client);
priv->activity_id = (GNOME_Evolution_Activity_ActivityId) 0;
priv->next_update_timeout_id = 0;
priv->have_pending_update = FALSE;
priv->new_information = NULL;
priv->new_progress = 0.0;
activity_client->priv = priv;
}
gboolean
evolution_activity_client_construct (EvolutionActivityClient *activity_client,
EvolutionShellClient *shell_client,
const char *component_id,
GdkPixbuf **animated_icon,
const char *information,
gboolean cancellable,
gboolean *suggest_display_return)
{
EvolutionActivityClientPrivate *priv;
GNOME_Evolution_Activity activity_interface;
CORBA_Environment ev;
CORBA_boolean suggest_display;
GNOME_Evolution_AnimatedIcon *corba_animated_icon;
g_return_val_if_fail (activity_client != NULL, FALSE);
g_return_val_if_fail (EVOLUTION_IS_ACTIVITY_CLIENT (activity_client), FALSE);
g_return_val_if_fail (shell_client != NULL, FALSE);
g_return_val_if_fail (EVOLUTION_IS_SHELL_CLIENT (shell_client), FALSE);
g_return_val_if_fail (animated_icon != NULL, FALSE);
g_return_val_if_fail (*animated_icon != NULL, FALSE);
g_return_val_if_fail (information != NULL, FALSE);
g_return_val_if_fail (suggest_display_return != NULL, FALSE);
priv = activity_client->priv;
g_return_val_if_fail (priv->activity_interface == CORBA_OBJECT_NIL, FALSE);
GTK_OBJECT_UNSET_FLAGS (activity_client, GTK_FLOATING);
CORBA_exception_init (&ev);
activity_interface = evolution_shell_client_get_activity_interface (shell_client);
priv->activity_interface = CORBA_Object_duplicate (activity_interface, &ev);
if (ev._major != CORBA_NO_EXCEPTION) {
priv->activity_interface = CORBA_OBJECT_NIL;
CORBA_exception_free (&ev);
return FALSE;
}
corba_animated_icon = e_new_corba_animated_icon_from_pixbuf_array (animated_icon);
GNOME_Evolution_Activity_operationStarted (activity_interface,
component_id,
corba_animated_icon,
information,
cancellable,
bonobo_object_corba_objref (BONOBO_OBJECT (priv->listener)),
&priv->activity_id,
&suggest_display,
&ev);
CORBA_free (corba_animated_icon);
if (ev._major != CORBA_NO_EXCEPTION) {
CORBA_exception_free (&ev);
return FALSE;
}
*suggest_display_return = (gboolean) suggest_display;
CORBA_exception_free (&ev);
return TRUE;
}
EvolutionActivityClient *
evolution_activity_client_new (EvolutionShellClient *shell_client,
const char *component_id,
GdkPixbuf **animated_icon,
const char *information,
gboolean cancellable,
gboolean *suggest_display_return)
{
EvolutionActivityClient *activity_client;
g_return_val_if_fail (shell_client != NULL, NULL);
g_return_val_if_fail (EVOLUTION_IS_SHELL_CLIENT (shell_client), NULL);
g_return_val_if_fail (animated_icon != NULL, NULL);
g_return_val_if_fail (*animated_icon != NULL, NULL);
g_return_val_if_fail (information != NULL, NULL);
g_return_val_if_fail (suggest_display_return != NULL, NULL);
activity_client = g_object_new (evolution_activity_client_get_type (), NULL);
if (! evolution_activity_client_construct (activity_client,
shell_client,
component_id,
animated_icon,
information,
cancellable,
suggest_display_return)) {
g_object_unref (activity_client);
return NULL;
}
return activity_client;
}
gboolean
evolution_activity_client_update (EvolutionActivityClient *activity_client,
const char *information,
double progress)
{
EvolutionActivityClientPrivate *priv;
gboolean retval;
g_return_val_if_fail (activity_client != NULL, FALSE);
g_return_val_if_fail (EVOLUTION_IS_ACTIVITY_CLIENT (activity_client), FALSE);
g_return_val_if_fail (information != NULL, FALSE);
g_return_val_if_fail (progress == -1.0 || (progress >= 0.0 && progress <= 1.0), FALSE);
priv = activity_client->priv;
if (priv->next_update_timeout_id == 0) {
/* There is no pending timeout, so the last CORBA update
happened more than UPDATE_DELAY msecs ago. So we set up a
timeout so we can check against it at the next update
request.
Notice that GLib timeouts or other operations on this object
can be invoked within a remote CORBA invocation, so we need
to set `next_update_timeout_id' and `have_pending_update'
before doing the CORBA call, or nasty race conditions might
happen. */
priv->have_pending_update = FALSE;
priv->next_update_timeout_id = g_timeout_add (UPDATE_DELAY,
update_timeout_callback,
activity_client);
retval = corba_update_progress (activity_client, information, progress);
} else {
/* There is a pending timeout, so the last CORBA update
happened less than UPDATE_DELAY msecs ago. So just queue an
update instead. */
g_free (priv->new_information);
priv->new_information = g_strdup (information);
priv->new_progress = progress;
priv->have_pending_update = TRUE;
retval = TRUE;
}
return retval;
}
GNOME_Evolution_Activity_DialogAction
evolution_activity_client_request_dialog (EvolutionActivityClient *activity_client,
GNOME_Evolution_Activity_DialogType dialog_type)
{
EvolutionActivityClientPrivate *priv;
GNOME_Evolution_Activity_DialogAction retval;
CORBA_Environment ev;
g_return_val_if_fail (activity_client != NULL, GNOME_Evolution_Activity_DIALOG_ACTION_ERROR);
g_return_val_if_fail (EVOLUTION_IS_ACTIVITY_CLIENT (activity_client), GNOME_Evolution_Activity_DIALOG_ACTION_ERROR);
priv = activity_client->priv;
CORBA_exception_init (&ev);
retval = GNOME_Evolution_Activity_requestDialog (priv->activity_interface,
priv->activity_id,
dialog_type,
&ev);
if (BONOBO_EX (&ev) != CORBA_NO_EXCEPTION) {
g_warning ("EvolutionActivityClient: Error requesting a dialog -- %s", BONOBO_EX_REPOID (&ev));
retval = GNOME_Evolution_Activity_DIALOG_ACTION_ERROR;
}
CORBA_exception_free (&ev);
return retval;
}
E_MAKE_TYPE (evolution_activity_client, "EvolutionActivityClient", EvolutionActivityClient,
class_init, init, PARENT_TYPE)