[Vala] regarding Gtk.Application managing a single instance app



Hello,

a student of mine has been appointed to develop a copy manager. He
decided to write the code in Vala and he's been consulting me since. The
idea is to be able to manage several copy processes in a single window,
so he's using Gtk.Application for that matter.

The logic behind the single instance is (as you may suppose) that the
first time the application is invoked it launches a new window with the
copy widgets on it. Any new attempt to invoke the application should add
a new copy to the already existing window (a window exists solely while
any of the copies it handles is alive, so: if the there is no copy in
progress any invocation is considered as the first one).

All that being said what's happening is that the second time the app is
invoked the "activate" method seems to be running on the first instance
of the class, and since the new copy information is stored on the
current instance, there is no new copy being created since the existing
instance tries to create (again) it's own copy resulting on an logical
error since the same copy cannot be run twice at the same time.

Issues related to good programming practices have been discussed with
the student already, yet I fail to understand how could the new info be
passed to the existing instance.

I'm hoping someone can shed some light on this.

Best regards,

D.H.Bahr.

PS: This is the code relevant to the problem:

/**********************************************************************/
using GLib;
using Gtk;

public class Main : Gtk.Application {

  private MainView main_view;
  private string operation_type;
  private List<string> sources;
  private string destination;
                
  public Main (string operation_type, List<string> sources, string
destination) {
    Object (application_id: "nova.ncopier", flags:
ApplicationFlags.FLAGS_NONE);
                
    this.operation_type = operation_type;
                
    this.sources = new List<string> ();         
    foreach (unowned string source in sources) {
      this.sources.append (source);
    }
                
    this.destination = destination;
  }

  public override void activate () {
    if (this.get_windows ().length () == 0) {
      main_view = new MainView (this.operation_type, this.sources,
this.destination);                      
      this.add_window(main_view);
    } else {
      for (int i = 0; i < (int) this.sources.length (); i++) {
        stdout.printf ("%d:%s", i, this.sources.nth_data (i));
      }
      main_view.add_operation (new OperationView (this.operation_type,
this.sources, this.destination));
      main_view.present ();
    }
  }

  static int main (string[] args) {
    Gtk.init (ref args);
                
    if (args.length < 4) {
      stdout.printf ("incomplete parameters\n");
      return 1;
    } else {
      string operation_type = "";
      List<string> sources = new List<string> ();
      string destination = "";
                        
      if (args[1] == "copy") {
        operation_type = "COPYING";
      }
      sources.append ("file:" + args[2]);
      destination = "file:" + args[3];
                        
      return new Main (operation_type, sources, destination).run ();
    }
  }
}
/***********************************************************************/




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]