First, thanks a million for the container. Simple and interesting to play with. I offer some modifications of the container (support for png,pdf,ps and initial work for non-bonobowindow-based test app). I played with 4 kinds of servers: ggf, gpdf, gtkhtml3, eog and found them very different in terms of bonobization quality level. gtkhtml is really nice. And probably best working of 4. ggv, gpdf, eog declare themselves as zoomable. But only eog really zooms from popup menu and toolbar. Both ggv and gpdf show menu items and buttons - but do not zoom. Also, I started to modify (#ifdef GTKWIN) the application to see how these controls embed themselves into usual gtk widgets. They work not that bad - but only popup menus are available. If I could get at least toolbars... Well, gtkhtml really goes crazy in this mode. It shows formatting toolbar. Twice - on top and bottom:) Versions: ggv 1.99.98 gpdf 0.100 gtkhtml3 3.0.1 eog 2.2.1 GNOME 2.2.1 taken from NyQuist by apt-get on RH8.0 In a word: I think this test app would be a really nice thing to have in GNOME CVS. Even with simplest makefile. Just as a bench for bonobo control developers - at least we could compare different controls on their bonobo quality level. Michal, what do you think on this? -- Sergey
#define BONOBO_UI_INTERNAL
#include <bonobo.h>
#include <glib.h>
#define GTKWIN
BonoboControlFrame *ctrl_frame;
BonoboUIComponent *ui_comp;
/* vbox */
GtkWidget *box;
GtkWidget *ctrl_widget;
char *image_file;
#ifdef GTKWIN
static Bonobo_Control instantiate_control( const char *fileMoniker )
{
GtkWidget *bo = bonobo_widget_new_control( fileMoniker, CORBA_OBJECT_NIL );
return ( Bonobo_Control )
Bonobo_Unknown_queryInterface( bonobo_widget_get_objref
( BONOBO_WIDGET( bo ) ),
"IDL:Bonobo/Control:1.0", NULL );
}
#else
static Bonobo_Control instantiate_control( const char *fileMoniker )
{
Bonobo_Control control;
Bonobo_PersistFile pfile;
CORBA_Environment ev;
const char *iid = strstr( fileMoniker,
".png" ) ? "OAFIID:GNOME_EOG_Control" :
strstr( fileMoniker,
".ps" ) ? "OAFIID:GNOME_GGV_Control" :
strstr( fileMoniker,
".pdf" ) ? "OAFIID:GNOME_PDF_Control" :
strstr( fileMoniker,
".html" ) ? "OAFIID:GNOME_GtkHTML_Editor:3.0" : "WTF?";
CORBA_exception_init( &ev );
/* get control component */
control = bonobo_get_object( iid, "Bonobo/Control", &ev );
if( BONOBO_EX( &ev ) || ( control == CORBA_OBJECT_NIL ) )
exit( 1 );
/* get PersistFile interface */
pfile =
Bonobo_Unknown_queryInterface( control, "IDL:Bonobo/PersistFile:1.0",
&ev );
if( BONOBO_EX( &ev ) || ( pfile == CORBA_OBJECT_NIL ) )
exit( 1 );
/* load the file */
Bonobo_PersistFile_load( pfile, image_file, &ev );
bonobo_object_release_unref( pfile, NULL );
return control;
}
static void
verb_DoNothing( BonoboUIComponent * uic, gpointer user_data,
const char *cname )
{
}
static BonoboUIVerb app_verbs[] = {
BONOBO_UI_VERB( "FileNewWindow", verb_DoNothing ),
BONOBO_UI_VERB( "FileOpen", verb_DoNothing ),
BONOBO_UI_VERB( "FileCloseWindow", verb_DoNothing ),
BONOBO_UI_VERB( "FileExit", verb_DoNothing ),
BONOBO_UI_VERB( "Preferences", verb_DoNothing ),
BONOBO_UI_VERB( "HelpAbout", verb_DoNothing ),
BONOBO_UI_VERB( "Help", verb_DoNothing ),
BONOBO_UI_VERB( "DnDNewWindow", verb_DoNothing ),
BONOBO_UI_VERB( "DnDSameWindow", verb_DoNothing ),
BONOBO_UI_VERB( "DnDCancel", verb_DoNothing ),
BONOBO_UI_VERB_END
};
#endif
static void add_control_to_ui( GtkWidget * window, Bonobo_Control control )
{
CORBA_Environment ev;
Bonobo_PropertyControl prop_control;
BonoboUIContainer *ui_container;
char *curdir;
g_return_if_fail( window != NULL );
#ifndef GTKWIN
g_return_if_fail( BONOBO_IS_WINDOW( window ) );
#endif
CORBA_exception_init( &ev );
#ifdef GTKWIN
ui_container = bonobo_ui_container_new( );
BonoboUIEngine *bue = bonobo_ui_engine_new( G_OBJECT( window ) );
bonobo_ui_engine_set_ui_container( bue, ui_container );
#else
ui_container = bonobo_window_get_ui_container( BONOBO_WINDOW( window ) );
#endif
ctrl_frame = bonobo_control_frame_new( BONOBO_OBJREF( ui_container ) );
/* bind and view new control widget */
bonobo_control_frame_bind_to_control( ctrl_frame, control, &ev );
bonobo_control_frame_control_activate( ctrl_frame );
if( control != CORBA_OBJECT_NIL && ctrl_widget == NULL )
{
ctrl_widget = bonobo_control_frame_get_widget( ctrl_frame );
if( !ctrl_widget )
g_assert_not_reached( );
#ifdef GTKWIN
gtk_container_add( GTK_CONTAINER( window ), GTK_WIDGET( ctrl_widget ) );
#else
bonobo_window_set_contents( BONOBO_WINDOW( window ),
GTK_WIDGET( ctrl_widget ) );
#endif
gtk_widget_show( ctrl_widget );
}
ui_comp = bonobo_ui_component_new( "eog" );
bonobo_ui_component_set_container( ui_comp, BONOBO_OBJREF( ui_container ),
NULL );
#ifndef GTKWIN
curdir = ( char * ) getcwd( NULL, 0 );
printf( "curdir = %s\n", curdir );
bonobo_ui_util_set_ui( ui_comp, curdir, "container-ui.xml", "Container",
NULL );
free( curdir );
bonobo_ui_component_add_verb_list_with_data( ui_comp, app_verbs, window );
/* update sensitivity of the properties menu item */
prop_control = Bonobo_Unknown_queryInterface( control,
"IDL:Bonobo/PropertyControl:1.0",
&ev );
bonobo_ui_component_set_prop( ui_comp, "/commands/Preferences", "sensitive",
prop_control == CORBA_OBJECT_NIL ? "0" : "1",
&ev );
bonobo_object_release_unref( prop_control, &ev );
#endif
/* enable view menu */
/* FIXME: We should check if the component adds anything to
* the menu, so that we don't view an empty menu.
*/
CORBA_exception_free( &ev );
/* retrieve control properties and install listeners */
//check_for_control_properties (window);
}
static void window_destroyed( GtkWindow * window, char *data )
{
Bonobo_Control control;
bonobo_control_frame_control_deactivate( ctrl_frame );
control = bonobo_control_frame_get_control( ctrl_frame );
bonobo_object_release_unref( control, NULL );
bonobo_main_quit( );
}
int main( int argc, char *argv[] )
{
BonoboWidget *bw;
gchar filename[100];
GtkWindow *window;
BonoboUIEngine *engine;
BonoboUIContainer *container;
Bonobo_Control control;
bindtextdomain( "container", GNOMELOCALEDIR );
bind_textdomain_codeset( "container", "UTF-8" );
textdomain( "container" );
if( argc <= 1 )
{
fprintf( stderr, "%s: not enough args\n", argv[0] );
fprintf( stderr, "Usage: %s <image file>\n", argv[0] );
exit( 1 );
}
image_file = argv[1];
bonobo_ui_init( "container", "1.0", &argc, argv );
if( gnome_vfs_init( ) == FALSE )
g_error( _( "Could not initialize GnomeVFS!\n" ) );
#ifdef GTKWIN
window = GTK_WINDOW( gtk_window_new( GTK_WINDOW_TOPLEVEL ) );
GtkWidget *nb = gtk_notebook_new( );
gtk_container_add( GTK_CONTAINER( window ), nb );
GtkWidget *page1 = gtk_alignment_new( 12, 12, 1, 1 );
gtk_notebook_append_page( GTK_NOTEBOOK( nb ), page1,
gtk_label_new( "bonobo control" ) );
GtkWidget *page2 = gtk_label_new( "Just for fun..." );
gtk_notebook_append_page( GTK_NOTEBOOK( nb ), page2,
gtk_label_new( "gtk label" ) );
#else
window = GTK_WINDOW( bonobo_window_new( "Window", "Test Container" ) );
#endif
// instantiate a control
g_snprintf( filename, sizeof( filename ), "file:/%s", image_file );
control = instantiate_control( filename );
// put it into our window
#ifdef GTKWIN
add_control_to_ui( page1, control );
#else
add_control_to_ui( GTK_WIDGET( window ), control );
#endif
g_signal_connect( window, "destroy",
G_CALLBACK( window_destroyed ), &window );
gtk_widget_show_all( GTK_WIDGET( window ) );
bonobo_main( );
return 0;
}
Attachment:
signature.asc
Description: This is a digitally signed message part