Events

To actually do anything with your new GNOME File Selector, you will need to get its event source. This is done via the standard Bonobo::Unknown::queryInterface() method.

Example 2. Querying for the Bonobo::EventSource


	  Bonobo_EventSource es;
	  Bonobo_Unknown     corba_control;

	  corba_control = bonobo_widget_get_objref (BONOBO_WIDGET (control));
	  es = Bonobo_Unknown_queryInterface (corba_control,
	                                      "IDL:Bonobo/EventSource:1.0",
	                                      ev);
	

When the user clicks either the Ok or Cancel button, the GNOME File Selector emits a ButtonClicked event. To get notified of these events, you need to create a Bonobo::Listener and connect it to the previous EventSource.

Example 3. Listening to ButtonClicked Events


	  BonoboListener     *listener;
	  Bonobo_Listener     corba_listener;
	  Bonobo_EventSource  es;
	  Bonobo_EventSource_ListenerId id;

	  listener = bonobo_listener_new (listener_cb, data);
	  corba_listener = BONOBO_OBJREF (listener);

	  id = Bonobo_EventSource_addListenerWithMask (es, corba_listener,
	                                               "GNOME/FileSelector/Control:ButtonClicked",
	                                               ev);
	

The subtype for this event is either Action or Cancel, depending on which button was clicked. If the action button was clicked, the data for this event is a CORBA_sequence_CORBA_string (basically a char **) listing the files which were selected by the user when the action button was clicked.

Example 4. Handling ButtonClicked Events

	  
	  static void
	  listener_cb (BonoboListener    *listener,
	               const char        *event_name,
	               const CORBA_any   *any,
	               CORBA_Environment *ev,
	               gpointer           data)
	  {
	          const CORBA_sequence_CORBA_string *seq;
	          const char *subtype;
	          int i;
	  
	          subtype = bonobo_event_subtype (event_name);
	          if (!strcmp (subtype, "Action")) {
	                  seq = any->_value;
	                  for (i = 0; i < seq->_length; i++) {
	                          g_print ("user selected: %s\n", seq->_buffer[i]);
	                          /* code to open file */
	                  }
	          } else {
	                  /* code to close/hide the window */
	          }

	          g_free (subtype);
	  }
	

It is pretty easy - no appending files onto directories or interacting with GtkCLists.