The GNOME Panel Libraries
<<< Previous Page | Home | Up | Next Page >>>

# Shared Library Applets

It is possible to make applets which will not be separate processes, but will be loaded directly into the panel. This saves on memory, but can make the panel less stable if the applet is less stable.

Here is an example, George will comment on stuff unless I sleep:

Example 16. piCommander

    #include <config.>
    #include <applet-widget.h>

    typedef struct {
    	GtkWidget *applet;
    	GtkWidget *fentry;
    	GtkWidget *gentry;
    	GtkWidget *entry;
    } PicoData;

    static void
    entry_activate (GtkWidget *w, PicoData *pico)
    {
    	char *s;
    	s = gtk_editable_get_chars (GTK_EDITABLE (pico->entry), 0, -1);
    	gtk_editable_delete_text (GTK_EDITABLE (pico->entry), 0, -1);

    	if (strlen (s) == 0) {
    		g_free (s);
    		return;
    	}

    	gnome_execute_shell (NULL, s);

    	gnome_entry_save_history (GNOME_ENTRY (pico->gentry));
    	gnome_config_sync ();

    	g_free (s);
    }

    static int
    applet_save_session (GtkWidget *applet,
    		     const char *privcfgpath,
    		     const char *globcfgpath,
    		     PicoData *pico)
    {
    	gnome_entry_save_history (GNOME_ENTRY (pico->gentry));
    	gnome_config_sync ();
    	return FALSE;
    }

    static void
    applet_destroy (GtkWidget *applet, PicoData *pico)
    {
    	g_free (pico);
    }

    static CORBA_Object
    pico_begin (PortableServer_POA poa,
    	    const char *goad_id,
    	    const char **params,
    	    gpointer *impl_ptr,
    	    CORBA_Environment *ev)
    {
    	PicoData *pico = g_new0 (PicoData, 1);

    	pico->applet = applet_widget_new (goad_id);
    	pico->fentry = gnome_file_entry_new ("pico-commander", _("Run..."));
    	pico->gentry = gnome_file_entry_gnome_entry (GNOME_FILE_ENTRY (pico->fentry));
    	pico->entry = gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (pico->fentry));

    	gnome_entry_set_max_saved (GNOME_ENTRY (pico->gentry), 50);
    	gnome_entry_prepend_history (GNOME_ENTRY (pico->gentry), FALSE, "");
    	gtk_combo_set_use_arrows_always (GTK_COMBO (pico->gentry), TRUE);

    	applet_widget_add (APPLET_WIDGET (pico->applet), pico->fentry);

    	gtk_signal_connect (GTK_OBJECT (pico->entry), "activate",
    			    GTK_SIGNAL_FUNC (entry_activate), pico);
    	gtk_signal_connect (GTK_OBJECT (pico->applet), "save_session",
    			    GTK_SIGNAL_FUNC (applet_save_session), pico);
    	gtk_signal_connect (GTK_OBJECT (pico->applet), "destroy",
    			    GTK_SIGNAL_FUNC (applet_destroy), pico);

    	gtk_widget_show_all (pico->applet);

    	return applet_widget_corba_activate (APPLET_WIDGET (pico->applet),
    					     poa, goad_id, params,
    					     impl_ptr, ev);
    }

    static void
    pico_end (PortableServer_POA poa,
    	  const char *goad_id,
    	  gpointer impl_ptr,
    	  CORBA_Environment *ev)
    {
    	applet_widget_corba_deactivate (poa, goad_id, impl_ptr, ev);
    }

    static const char *repo_id[] = { "IDL:GNOME/Applet:1.0", NULL };
    static GnomePluginObject applets_list[] = {
    	{ repo_id, "pico-commander_applet", NULL, "50 line launcher",
    	  &pico_begin, &pico_end },
    	{ NULL }
    };

    GnomePlugin GNOME_Plugin_info = { applets_list, NULL };

<<< Previous Page | Home | Up | Next Page >>>
Multiple Applet Support | Building the Applets