[Gambas-user] Single instance application, anyone else done it?

Bruce Steers bsteers4 at gmail.com
Wed Jul 7 15:18:55 CEST 2021


On Wed, 7 Jul 2021 at 13:11, Tony Morehen <tmorehen at ajm-software.com> wrote:

>
> On 2021-07-07 5:24 a.m., Bruce Steers wrote:
>
> Hi all,
> I'm looking for a sure fire recommended way to make an application a
> "Single Instance" application that takes filepath args.
>
> The Reason:
> 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.
> So i needed a way to only let one app launch and the other instances just
> send the file args to the first instance.
>
> 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.
> Then the first app picks up the file args from the pipe file.
> (example app here... https://forum.gambas.one/viewtopic.php?f=13&t=1149)
>
> 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)
>
> Just wondered if anyone here has done this sort of thing already and may
> have any advice / examples.
>
> Cheers in advance :)
> BruceS
>
>
> ----[ http://gambaswiki.org/wiki/doc/netiquette ]----
>
>
> I have the following code in a startup module.  It could go in a startup
> form as well.
>
> Private hDbusObj As DbusObj
>
> Const TEXTEDITOR_DBUS_NAME As String = "org.ajmconsulting.TextEditor"
> Const TEXTEDITOR_PATH As String = "/org/ajmconsulting/TextEditor"
> Const TEXTEDITOR_DBUS_INTERFACE As String = "org.ajmconsulting.TextEditor"
>
> Public Sub Main()    'Form_Open if startup form
>     'check if gbTE is already open
>     If DBus.Session.Applications.Exist(TEXTEDITOR_DBUS_NAME) Then
>       'yes it is, so pass-off current file list
>       If Files.Count > 0 Then
>         For Each $file In Files
>           DBus[TEXTEDITOR_DBUS_NAME][TEXTEDITOR_PATH,
> TEXTEDITOR_DBUS_INTERFACE].Open($file.Name, $file.ReadOnly,
> $file.LineNumber, $file.ColumnNumber)
>         Next
>       Endif
>       Try DBus[TEXTEDITOR_DBUS_NAME][TEXTEDITOR_PATH,
> TEXTEDITOR_DBUS_INTERFACE].Show()
>       Return    'exit, replace with Me.Close if in startup form
>     Endif
>     'set up to receive pass-off commands
>     DBus.Name = TEXTEDITOR_DBUS_NAME
>     hDbusObj = New DbusObj
>     DBus.Session.Register(hDbusObj, TEXTEDITOR_PATH,
> TEXTEDITOR_DBUS_INTERFACE])
>   Endif
>
>   fEditor.ShowModal()  'wait until editing is all done, skip if in startup
> form
>
>   'clean-up and exit, place remaining code in Form_Close if in startup form
>   If Not IsNull(hDbusObj) And If DBus.IsRegistered(hDbusObj) Then
>     DBus.Unregister(hDbusObj)
>   Endif
>
> End
>
> The remaining code goes into a class file named dbusobj.
>
> ' Gambas class file
>
> Inherits DBusObject
>
> Public Sub org_ajmconsulting_TextEditor_Show()
>
>   fEditor.Show()
>
> End
>
> Public Sub org_ajmconsulting_TextEditor_Open(sFilePath As String,
> bReadOnly As Boolean, nLine As Integer, nColumn As Integer)
>
>   fEditor.AddEditor(sFilePath, bReadOnly, nLine, nColumn)
>   fEditor.Raise()
>
> End
>

Excellent thank you Tony :)
I was so close lol, things are working now though thanks to your help.

Much appreciated :)
BruceS
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.gambas-basic.org/pipermail/user/attachments/20210707/d6b8245a/attachment-0001.htm>


More information about the User mailing list