<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 2021-07-07 5:24 a.m., Bruce Steers
      wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CABuQYCAL6v1VRV5uUii4q33UbDk-cdk__bvbCPgxefFKoukt0A@mail.gmail.com">
      <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      <div dir="ltr">
        <div class="gmail_default" style="font-size:small">Hi all,</div>
        <div class="gmail_default" style="font-size:small">I'm looking
          for a sure fire recommended way to make an application a
          "Single Instance" application that takes filepath args.</div>
        <div class="gmail_default" style="font-size:small"><br>
        </div>
        <div class="gmail_default" style="font-size:small">The Reason:</div>
        <div class="gmail_default" style="font-size:small">If i create a
          desktop launcher for my app and drop multiple files on it
          linux does not launch the application once and send all the
          dropped file paths to it.  it launches the application
          multiple times all with one file arg.</div>
        <div class="gmail_default" style="font-size:small">So i needed a
          way to only let one app launch and the other instances just
          send the file args to the first instance.</div>
        <div class="gmail_default" style="font-size:small"><br>
        </div>
        <div class="gmail_default" style="font-size:small">Currently i
          have used a pipe and Shell "pgrep -f AppName" to list all app
          id's the lowest app id is selected as the working app and any
          other instances of the app launched are quickly closed after
          sending their file args to the pipe.</div>
        <div class="gmail_default" style="font-size:small">Then the
          first app picks up the file args from the pipe file.</div>
        <div class="gmail_default" style="font-size:small">(example app
          here... <a
            href="https://forum.gambas.one/viewtopic.php?f=13&t=1149"
            moz-do-not-send="true">https://forum.gambas.one/viewtopic.php?f=13&t=1149</a>)<br>
        </div>
        <div class="gmail_default" style="font-size:small"><br>
        </div>
        <div class="gmail_default" style="font-size:small">I'm currently
          looking into DBus as a better alternative for detecting an
          already loaded app and sending it args but i'm making slow
          progress with DBus atm (any simple app DBus communication
          examples would be handy)</div>
        <div class="gmail_default" style="font-size:small"><br>
        </div>
        <div class="gmail_default" style="font-size:small">Just wondered
          if anyone here has done this sort of thing already and may
          have any advice / examples.</div>
        <div class="gmail_default" style="font-size:small"><br>
        </div>
        <div class="gmail_default" style="font-size:small">Cheers in
          advance :)<br>
        </div>
        <div class="gmail_default" style="font-size:small">BruceS</div>
        <div class="gmail_default" style="font-size:small"><br>
        </div>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <pre class="moz-quote-pre" wrap="">
----[ <a class="moz-txt-link-freetext" href="http://gambaswiki.org/wiki/doc/netiquette">http://gambaswiki.org/wiki/doc/netiquette</a> ]----
</pre>
    </blockquote>
    <p><br>
    </p>
    <p>I have the following code in a startup module.  It could go in a
      startup form as well.</p>
    <p>Private hDbusObj As DbusObj<br>
      <br>
      Const TEXTEDITOR_DBUS_NAME As String =
      "org.ajmconsulting.TextEditor"<br>
      Const TEXTEDITOR_PATH As String = "/org/ajmconsulting/TextEditor"<br>
      Const TEXTEDITOR_DBUS_INTERFACE As String =
      "org.ajmconsulting.TextEditor"<br>
      <br>
      Public Sub Main()    'Form_Open if startup form<br>
          'check if gbTE is already open<br>
          If DBus.Session.Applications.Exist(TEXTEDITOR_DBUS_NAME) Then<br>
            'yes it is, so pass-off current file list<br>
            If Files.Count > 0 Then<br>
              For Each $file In Files<br>
                DBus[TEXTEDITOR_DBUS_NAME][TEXTEDITOR_PATH,
      TEXTEDITOR_DBUS_INTERFACE].Open($file.Name, $file.ReadOnly,
      $file.LineNumber, $file.ColumnNumber)<br>
              Next<br>
            Endif<br>
            Try DBus[TEXTEDITOR_DBUS_NAME][TEXTEDITOR_PATH,
      TEXTEDITOR_DBUS_INTERFACE].Show()<br>
            Return    'exit, replace with Me.Close if in startup form<br>
          Endif<br>
          'set up to receive pass-off commands<br>
          DBus.Name = TEXTEDITOR_DBUS_NAME<br>
          hDbusObj = New DbusObj<br>
          DBus.Session.Register(hDbusObj, TEXTEDITOR_PATH,
      TEXTEDITOR_DBUS_INTERFACE])<br>
        Endif<br>
      <br>
        fEditor.ShowModal()  'wait until editing is all done, skip if in
      startup form<br>
      <br>
        'clean-up and exit, place remaining code in Form_Close if in
      startup form<br>
        If Not IsNull(hDbusObj) And If DBus.IsRegistered(hDbusObj) Then<br>
          DBus.Unregister(hDbusObj)<br>
        Endif<br>
      <br>
      End<br>
    </p>
    <p>The remaining code goes into a class file named dbusobj.</p>
    <p>' Gambas class file<br>
      <br>
      Inherits DBusObject<br>
      <br>
      Public Sub org_ajmconsulting_TextEditor_Show()<br>
      <br>
        fEditor.Show()<br>
      <br>
      End<br>
      <br>
      Public Sub org_ajmconsulting_TextEditor_Open(sFilePath As String,
      bReadOnly As Boolean, nLine As Integer, nColumn As Integer)<br>
      <br>
        fEditor.AddEditor(sFilePath, bReadOnly, nLine, nColumn)<br>
        fEditor.Raise()<br>
      <br>
      End<br>
      <br>
    </p>
  </body>
</html>