gnome-panel r10816 - trunk/gnome-panel
- From: vuntz svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-panel r10816 - trunk/gnome-panel
- Date: Mon, 11 Feb 2008 13:52:29 +0000 (GMT)
Author: vuntz
Date: Mon Feb 11 13:52:29 2008
New Revision: 10816
URL: http://svn.gnome.org/viewvc/gnome-panel?rev=10816&view=rev
Log:
2008-02-11 Vincent Untz <vuntz gnome org>
Better bonobo applets asynchronous loading.
Patch by openSUSE people (don't know who, probably Rodrigo Moya or
Michael Meeks).
Fix bug #499973.
* panel-applet-frame.c: (panel_applet_frame_load): use
bonobo-activation instead of moniker
(panel_applet_frame_construct_moniker): renamed to...
(panel_applet_frame_construct_item): this, and updated
(panel_applet_frame_activated): do lots of complex stuff I don't fully
understand :-) But it works! I promise!
Modified:
trunk/gnome-panel/ChangeLog
trunk/gnome-panel/panel-applet-frame.c
Modified: trunk/gnome-panel/panel-applet-frame.c
==============================================================================
--- trunk/gnome-panel/panel-applet-frame.c (original)
+++ trunk/gnome-panel/panel-applet-frame.c Mon Feb 11 13:52:29 2008
@@ -96,14 +96,9 @@
static void panel_applet_frame_cnx_broken (ORBitConnection *cnx,
PanelAppletFrame *frame);
-static char *panel_applet_frame_construct_moniker (PanelAppletFrame *frame,
- PanelWidget *panel,
- const char *iid,
- const char *id);
-
-static void panel_applet_frame_activated (Bonobo_Unknown object,
- CORBA_Environment *ev,
- gpointer *data);
+static void panel_applet_frame_activated (CORBA_Object object,
+ const char *error_reason,
+ gpointer data);
void
panel_applet_frame_sync_menu_state (PanelAppletFrame *frame)
@@ -335,7 +330,6 @@
{
PanelAppletFrame *frame;
CORBA_Environment ev;
- char *moniker;
PanelAppletFrameActivating *frame_act;
g_return_if_fail (iid != NULL);
@@ -360,15 +354,11 @@
frame_act->exactpos = exactpos;
frame_act->id = g_strdup (id);
- moniker = panel_applet_frame_construct_moniker (frame, panel, iid, id);
-
CORBA_exception_init (&ev);
- bonobo_get_object_async (moniker, "IDL:Bonobo/Control:1.0", &ev,
- (BonoboMonikerAsyncFn) panel_applet_frame_activated,
- frame_act);
-
- g_free (moniker);
+ bonobo_activation_activate_from_id_async (frame->priv->iid, 0,
+ (BonoboActivationCallback) panel_applet_frame_activated,
+ frame_act, &ev);
}
void
@@ -1209,10 +1199,9 @@
}
static char *
-panel_applet_frame_construct_moniker (PanelAppletFrame *frame,
- PanelWidget *panel,
- const char *iid,
- const char *id)
+panel_applet_frame_construct_item (PanelAppletFrame *frame,
+ PanelWidget *panel,
+ const char *id)
{
char *retval;
char *bg_str;
@@ -1227,9 +1216,9 @@
locked_down = panel_lockdown_get_locked_down ();
retval = g_strdup_printf (
- "%s!prefs_key=/apps/panel/applets/%s/prefs;"
+ "prefs_key=/apps/panel/applets/%s/prefs;"
"background=%s;orient=%s;size=%s;locked_down=%s",
- iid, id, bg_str,
+ id, bg_str,
panel_applet_frame_get_orient_string (frame, panel),
panel_applet_frame_get_size_string (frame, panel),
locked_down ? "true" : "false");
@@ -1254,40 +1243,82 @@
}
static void
-panel_applet_frame_activated (Bonobo_Unknown object,
- CORBA_Environment *ev,
- gpointer *data)
+panel_applet_frame_activated (CORBA_Object object,
+ const char *error_reason,
+ gpointer data)
{
PanelAppletFrameActivating *frame_act;
PanelAppletFrame *frame;
GtkWidget *widget;
BonoboControlFrame *control_frame;
Bonobo_Control control;
+ Bonobo_ItemContainer container;
CORBA_Environment corba_ev;
AppletInfo *info;
char *error;
+ char *item_name;
frame_act = (PanelAppletFrameActivating *) data;
frame = frame_act->frame;
/* according to the source of bonobo control == NULL && no
exception can happen, so handle it */
- if (BONOBO_EX (ev) || object == CORBA_OBJECT_NIL) {
- error = bonobo_exception_get_text (ev);
+ if (error_reason != NULL || object == CORBA_OBJECT_NIL) {
g_warning (G_STRLOC ": failed to load applet %s:\n%s",
- frame->priv->iid, error);
+ frame->priv->iid, error_reason);
panel_applet_frame_loading_failed (frame, frame_act->id);
g_free (frame_act->id);
g_free (frame_act);
- g_free (error);
return;
}
- frame->priv->control = CORBA_Object_duplicate (object, NULL);
+ CORBA_exception_init (&corba_ev);
+
+ item_name = panel_applet_frame_construct_item (frame,
+ frame->priv->panel,
+ frame_act->id);
+
+ frame->priv->control = CORBA_OBJECT_NIL;
+ container = Bonobo_Unknown_queryInterface (object,
+ "IDL:Bonobo/ItemContainer:1.0",
+ &corba_ev);
+ if (!BONOBO_EX (&corba_ev) && container != CORBA_OBJECT_NIL) {
+ Bonobo_Unknown containee;
+
+ containee = Bonobo_ItemContainer_getObjectByName (container,
+ item_name,
+ TRUE,
+ &corba_ev);
+ bonobo_object_release_unref (container, NULL);
+
+ if (!BONOBO_EX (&corba_ev) && containee != CORBA_OBJECT_NIL) {
+ frame->priv->control =
+ Bonobo_Unknown_queryInterface (containee,
+ "IDL:Bonobo/Control:1.0",
+ &corba_ev);
+
+ bonobo_object_release_unref (containee, NULL);
+ }
+ }
+ g_free (item_name);
+
+ if (frame->priv->control == CORBA_OBJECT_NIL) {
+ error = bonobo_exception_get_text (&corba_ev);
+ g_warning (G_STRLOC ": failed to get Bonobo/Control interface on applet %s:\n%s",
+ frame->priv->iid, error);
+ panel_applet_frame_loading_failed (frame, frame_act->id);
+ CORBA_exception_free (&corba_ev);
+ bonobo_object_release_unref (object, NULL);
+ g_free (frame_act->id);
+ g_free (frame_act);
+ g_free (error);
+ return;
+ }
- widget = bonobo_widget_new_control_from_objref (object,
+ widget = bonobo_widget_new_control_from_objref (frame->priv->control,
CORBA_OBJECT_NIL);
+ CORBA_exception_free (&corba_ev);
bonobo_object_release_unref (object, NULL);
if (!widget) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]