Bring the window of an existing instance to front

This commit is contained in:
Zane U. Ji 2013-12-20 20:39:04 +08:00
parent bdd030850e
commit f8c21cb846
9 changed files with 306 additions and 87 deletions

View File

@ -222,6 +222,8 @@ ENCHANT_LIBS = @ENCHANT_LIBS@
EXEEXT = @EXEEXT@ EXEEXT = @EXEEXT@
FGREP = @FGREP@ FGREP = @FGREP@
GREP = @GREP@ GREP = @GREP@
GTK_CFLAGS = @GTK_CFLAGS@
GTK_LIBS = @GTK_LIBS@
INSTALL = @INSTALL@ INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@ INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_PROGRAM = @INSTALL_PROGRAM@

91
configure vendored
View File

@ -633,6 +633,8 @@ ac_subst_vars='am__EXEEXT_FALSE
am__EXEEXT_TRUE am__EXEEXT_TRUE
LTLIBOBJS LTLIBOBJS
LIBOBJS LIBOBJS
GTK_LIBS
GTK_CFLAGS
ASPELL_LIBS ASPELL_LIBS
ENCHANT_LIBS ENCHANT_LIBS
ENCHANT_CFLAGS ENCHANT_CFLAGS
@ -791,7 +793,9 @@ PKG_CONFIG
PKG_CONFIG_PATH PKG_CONFIG_PATH
PKG_CONFIG_LIBDIR PKG_CONFIG_LIBDIR
ENCHANT_CFLAGS ENCHANT_CFLAGS
ENCHANT_LIBS' ENCHANT_LIBS
GTK_CFLAGS
GTK_LIBS'
# Initialize some variables set by options. # Initialize some variables set by options.
@ -1455,6 +1459,8 @@ Some influential environment variables:
C compiler flags for ENCHANT, overriding pkg-config C compiler flags for ENCHANT, overriding pkg-config
ENCHANT_LIBS ENCHANT_LIBS
linker flags for ENCHANT, overriding pkg-config linker flags for ENCHANT, overriding pkg-config
GTK_CFLAGS C compiler flags for GTK, overriding pkg-config
GTK_LIBS linker flags for GTK, overriding pkg-config
Use these variables to override the choices made by `configure' or to help Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations. it to find libraries and programs with nonstandard names/locations.
@ -15561,6 +15567,86 @@ fi
# Check gtk
# This has to match the one wxWidgets linked with
# It is needed to make single-instance-check work
pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5
$as_echo_n "checking for GTK... " >&6; }
if test -n "$GTK_CFLAGS"; then
pkg_cv_GTK_CFLAGS="$GTK_CFLAGS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0\""; } >&5
($PKG_CONFIG --exists --print-errors "gtk+-2.0") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
fi
else
pkg_failed=untried
fi
if test -n "$GTK_LIBS"; then
pkg_cv_GTK_LIBS="$GTK_LIBS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0\""; } >&5
($PKG_CONFIG --exists --print-errors "gtk+-2.0") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-2.0" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
fi
else
pkg_failed=untried
fi
if test $pkg_failed = yes; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
_pkg_short_errors_supported=yes
else
_pkg_short_errors_supported=no
fi
if test $_pkg_short_errors_supported = yes; then
GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-2.0" 2>&1`
else
GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-2.0" 2>&1`
fi
# Put the nasty error message in config.log where it belongs
echo "$GTK_PKG_ERRORS" >&5
CXXFLAGS="$CXXFLAGS -D__NO_GTK__"
#[PKG_CHECK_MODULES(GTK, [gtk+-3.0], [AC_MSG_RESULT([gtk+-3.0])])]
elif test $pkg_failed = untried; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
CXXFLAGS="$CXXFLAGS -D__NO_GTK__"
#[PKG_CHECK_MODULES(GTK, [gtk+-3.0], [AC_MSG_RESULT([gtk+-3.0])])]
else
GTK_CFLAGS=$pkg_cv_GTK_CFLAGS
GTK_LIBS=$pkg_cv_GTK_LIBS
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: gtk+-2.0" >&5
$as_echo "gtk+-2.0" >&6; }
fi
ac_config_files="$ac_config_files Makefile src/Makefile" ac_config_files="$ac_config_files Makefile src/Makefile"
cat >confcache <<\_ACEOF cat >confcache <<\_ACEOF
@ -18054,4 +18140,7 @@ echo "Debug Enabled"
else else
echo "Debug Disabled" echo "Debug Disabled"
fi fi
if [ "$GTK_LIBS" = "" ]; then
echo "GTK No. There will be problems when single instance is enabled."
fi

View File

@ -138,6 +138,14 @@ PKG_CHECK_MODULES(ENCHANT, [enchant], [CXXFLAGS="$CXXFLAGS -DUSE_ENCHANT"],
AC_SUBST(ASPELL_LIBS) AC_SUBST(ASPELL_LIBS)
# Check gtk
# This has to match the one wxWidgets linked with
# It is needed to make single-instance-check work
PKG_CHECK_MODULES(GTK, [gtk+-2.0], [AC_MSG_RESULT([gtk+-2.0])],
[CXXFLAGS="$CXXFLAGS -D__NO_GTK__"]
#[PKG_CHECK_MODULES(GTK, [gtk+-3.0], [AC_MSG_RESULT([gtk+-3.0])])]
)
AC_OUTPUT(Makefile src/Makefile) AC_OUTPUT(Makefile src/Makefile)
dnl Summarized output dnl Summarized output
@ -150,4 +158,7 @@ echo "Debug Enabled"
else else
echo "Debug Disabled" echo "Debug Disabled"
fi fi
if [[ "$GTK_LIBS" = "" ]]; then
echo "GTK No. There will be problems when single instance is enabled."
fi

View File

@ -33,7 +33,7 @@ xmlcopyeditor_SOURCES = xmlcopyeditor.cpp associatedialog.cpp casehandler.cpp \
xmlcopyeditor.desktop xmlcopyeditor.desktop
xmlcopyeditor_LDFLAGS = $(WX_LIBS) \ xmlcopyeditor_LDFLAGS = $(WX_LIBS) \
-lexpat -lxslt -lxml2 -lpcre -lxerces-c $(ASPELL_LIBS) $(ENCHANT_LIBS) -lexpat -lxslt -lxml2 -lpcre -lxerces-c $(ASPELL_LIBS) $(ENCHANT_LIBS) $(GTK_LIBS)
nobase_dist_xmlcopyeditor_DATA = $(srcdir)/catalog/catalog \ nobase_dist_xmlcopyeditor_DATA = $(srcdir)/catalog/catalog \
$(srcdir)/copying/*.txt \ $(srcdir)/copying/*.txt \
@ -82,5 +82,5 @@ pixmap_DATA = xmlcopyeditor.png
applications_DATA = xmlcopyeditor.desktop applications_DATA = xmlcopyeditor.desktop
AM_CPPFLAGS = -I/usr/include/libxml2 $(ENCHANT_CFLAGS) AM_CPPFLAGS = -I/usr/include/libxml2 $(ENCHANT_CFLAGS) $(GTK_CFLAGS)

View File

@ -258,6 +258,8 @@ ENCHANT_LIBS = @ENCHANT_LIBS@
EXEEXT = @EXEEXT@ EXEEXT = @EXEEXT@
FGREP = @FGREP@ FGREP = @FGREP@
GREP = @GREP@ GREP = @GREP@
GTK_CFLAGS = @GTK_CFLAGS@
GTK_LIBS = @GTK_LIBS@
INSTALL = @INSTALL@ INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@ INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_PROGRAM = @INSTALL_PROGRAM@
@ -379,7 +381,7 @@ xmlcopyeditor_SOURCES = xmlcopyeditor.cpp associatedialog.cpp casehandler.cpp \
xmlcopyeditor.desktop xmlcopyeditor.desktop
xmlcopyeditor_LDFLAGS = $(WX_LIBS) \ xmlcopyeditor_LDFLAGS = $(WX_LIBS) \
-lexpat -lxslt -lxml2 -lpcre -lxerces-c $(ASPELL_LIBS) $(ENCHANT_LIBS) -lexpat -lxslt -lxml2 -lpcre -lxerces-c $(ASPELL_LIBS) $(ENCHANT_LIBS) $(GTK_LIBS)
nobase_dist_xmlcopyeditor_DATA = $(srcdir)/catalog/catalog \ nobase_dist_xmlcopyeditor_DATA = $(srcdir)/catalog/catalog \
$(srcdir)/copying/*.txt \ $(srcdir)/copying/*.txt \
@ -426,7 +428,7 @@ nobase_dist_xmlcopyeditor_DATA = $(srcdir)/catalog/catalog \
pixmap_DATA = xmlcopyeditor.png pixmap_DATA = xmlcopyeditor.png
applications_DATA = xmlcopyeditor.desktop applications_DATA = xmlcopyeditor.desktop
AM_CPPFLAGS = -I/usr/include/libxml2 $(ENCHANT_CFLAGS) AM_CPPFLAGS = -I/usr/include/libxml2 $(ENCHANT_CFLAGS) $(GTK_CFLAGS)
all: all-am all: all-am
.SUFFIXES: .SUFFIXES:
@ -440,9 +442,9 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
exit 1;; \ exit 1;; \
esac; \ esac; \
done; \ done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \
$(am__cd) $(top_srcdir) && \ $(am__cd) $(top_srcdir) && \
$(AUTOMAKE) --gnu src/Makefile $(AUTOMAKE) --foreign src/Makefile
.PRECIOUS: Makefile .PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \ @case '$?' in \

View File

@ -19,6 +19,17 @@
#include "myipc.h" #include "myipc.h"
#include "xmlcopyeditor.h" #include "xmlcopyeditor.h"
#include "pathresolver.h"
#if defined ( __WXGTK__ ) && !defined ( __NO_GTK__ )
#include <gtk/gtk.h>
guint32 XTimeNow()
{
struct timespec ts;
clock_gettime ( CLOCK_MONOTONIC, &ts );
return ts.tv_sec * 1000 + ts.tv_nsec / 1000000;
}
#endif // __WXGTK__
MyServerConnection *server_connection = 0; MyServerConnection *server_connection = 0;
MyClientConnection *client_connection = 0; MyClientConnection *client_connection = 0;
@ -32,7 +43,9 @@ wxConnectionBase *MyServer::OnAcceptConnection ( const wxString& topic )
return NULL; return NULL;
} }
MyServerConnection::MyServerConnection() : wxConnection() MyServerConnection::MyServerConnection()
: wxConnection()
, mFrameWnd ( ( wxIntPtr ) NULL )
{ {
server_connection = this; server_connection = this;
} }
@ -48,13 +61,8 @@ MyServerConnection::~MyServerConnection()
bool MyServerConnection::OnPoke ( bool MyServerConnection::OnPoke (
const wxString& WXUNUSED ( topic ) const wxString& WXUNUSED ( topic )
, const wxString& item , const wxString& item
#if wxCHECK_VERSION(2,9,0) , IPCData *data
, const void *data , IPCSize_t size
, size_t size
#else
, wxChar *data
, int size
#endif
, wxIPCFormat WXUNUSED ( format ) , wxIPCFormat WXUNUSED ( format )
) )
{ {
@ -78,10 +86,63 @@ bool MyServerConnection::OnPoke (
frame->openFile ( ( wxString& ) item ); frame->openFile ( ( wxString& ) item );
//frame->addToFileQueue ( ( wxString& ) item ); // prevent event loop problems //frame->addToFileQueue ( ( wxString& ) item ); // prevent event loop problems
} }
#ifndef __WXMSW__
#if defined ( __WXGTK__ ) && !defined ( __NO_GTK__ )
// Processes mostly cannot raise theire own windows.
// http://osdir.com/ml/gnome.gaim.devel/2004-12/msg00077.html
GtkWidget *widget = frame->GetHandle();
GdkWindow *window = gtk_widget_get_window ( widget );
gdk_x11_window_set_user_time ( window,
//XTimeNow() ); // This works too.
gdk_x11_get_server_time ( window ) );
//gdk_window_show ( window );
//gdk_window_raise ( window );
//gtk_window_present ( GTK_WINDOW ( widget ) );
#endif // __WXGTK__ && !__NO_GTK__
frame->Show();
frame->Raise(); frame->Raise();
#endif // __WXMSW__
return true; return true;
} }
IPCData *MyServerConnection::OnRequest
( const wxString& WXUNUSED ( topic )
, const wxString& item
, IPCSize_t *size
, wxIPCFormat WXUNUSED ( format ) /*= wxIPC_PRIVATE */
)
{
if ( size == NULL )
return NULL;
if ( item == IPC_FRAME_WND )
{
if ( !mFrameWnd )
{
wxWindow *window = wxTheApp->GetTopWindow();
if ( window )
{
#if defined ( __WXGTK__ ) && !defined ( __NO_GTK__ )
GtkWidget *wnd = window->GetHandle();
if ( wnd )
{
GdkWindow *gwnd = gtk_widget_get_window ( wnd );
if ( gwnd )
mFrameWnd = GDK_WINDOW_XID ( gwnd );
}
#else
mFrameWnd = window->GetHandle();
#endif
}
}
*size = sizeof mFrameWnd;
return ( IPCData * ) &mFrameWnd;
}
*size = 0;
return NULL;
}
bool MyServerConnection::OnStartAdvise ( const wxString& WXUNUSED ( topic ), bool MyServerConnection::OnStartAdvise ( const wxString& WXUNUSED ( topic ),
const wxString& WXUNUSED ( item ) ) const wxString& WXUNUSED ( item ) )
{ {
@ -89,7 +150,8 @@ bool MyServerConnection::OnStartAdvise ( const wxString& WXUNUSED ( topic ),
} }
MyClientConnection::MyClientConnection() MyClientConnection::MyClientConnection()
{} {
}
wxConnectionBase *MyClient::OnMakeConnection() wxConnectionBase *MyClient::OnMakeConnection()
{ {
@ -99,13 +161,8 @@ wxConnectionBase *MyClient::OnMakeConnection()
bool MyClientConnection::OnAdvise ( bool MyClientConnection::OnAdvise (
const wxString& WXUNUSED ( topic ) const wxString& WXUNUSED ( topic )
, const wxString& WXUNUSED ( item ) , const wxString& WXUNUSED ( item )
#if wxCHECK_VERSION(2,9,0) , IPCData * WXUNUSED ( data )
, const void * WXUNUSED ( data ) , IPCSize_t WXUNUSED ( size )
, size_t WXUNUSED ( size )
#else
, wxChar * WXUNUSED ( data )
, int WXUNUSED ( size )
#endif
, wxIPCFormat WXUNUSED ( format ) , wxIPCFormat WXUNUSED ( format )
) )
{ {
@ -119,7 +176,74 @@ bool MyClientConnection::OnDisconnect()
} }
MyServer::MyServer() MyServer::MyServer()
{ } {
}
MyClient::MyClient() MyClient::MyClient()
{ } {
}
bool MyClient::talkToServer ( int argc, const wxChar * const *argv )
{
MyClientConnection *connection = ( MyClientConnection * )
MakeConnection ( _T ( "localhost" ), IPC_SERVICE, IPC_TOPIC );
if ( !connection || !connection->StartAdvise ( IPC_ADVISE_NAME ) )
return false;
wxString argument;
// wxConnectionBase::Poke expects something other than NULL in debug
// version
#ifdef __WXDEBUG__
static wxChar whatBuffer[] = _T ( "Data" );
#else
static wxChar whatBuffer[0];
#endif
if ( argc <= 1 )
{
connection->Poke ( IPC_NO_FILE, whatBuffer );
}
else for ( int i = 1; i < argc; i++ )
{
argument = argv[i];
argument = PathResolver::run ( argument );
if ( ! connection->Poke ( argument, whatBuffer ) )
break;
}
// Bring the window to front
IPCSize_t size;
const void *data = connection->Request ( IPC_FRAME_WND, &size );
if ( !data )
return false;
#ifdef __WXMSW__
if ( size == sizeof ( HWND ) )
{
HWND hwnd = * ( const HWND * )data;
if ( ::IsIconic ( hwnd ) )
::ShowWindow ( hwnd, SW_RESTORE );
else
::SetForegroundWindow ( hwnd );
}
#elif defined ( __WXGTK__x ) // It doesn't work
if ( size == sizeof ( GdkNativeWindow ) )
{
GdkNativeWindow xWnd = * ( GdkNativeWindow * ) data;
GdkWindow *window = gdk_window_foreign_new ( xWnd );
if ( window )
{
gdk_x11_window_set_user_time ( window,
XTimeNow() );
//gdk_x11_get_server_time ( window ) );
gdk_window_show ( window );
gdk_window_raise ( window );
gdk_window_unref ( window );
//GtkWidget *widget;
//gdk_window_get_user_data(window, (void**)&widget);
//printf ("widget: %p\n",widget);
//gtk_window_present ( GTK_WINDOW ( widget ) );
}
}
#endif // __WXMSW__
return true;
}

View File

@ -25,11 +25,30 @@
#include <wx/wx.h> #include <wx/wx.h>
#include <wx/ipc.h> #include <wx/ipc.h>
#if defined ( __WXGTK__ ) && !defined ( __NO_GTK__ )
#if wxCHECK_VERSION(2,9,0) // GSocket is defined in wxWidgets 2.8
#include <gdk/gdkx.h>
#else // wxCHECK_VERSION(2,9,0)
#define GSocket GlibGSocket
#include <gdk/gdkx.h>
#undef GSocket
#endif // wxCHECK_VERSION(2,9,0)
#endif // __WXGTK__ && !__NO_GTK__
#define IPC_SERVICE _T("4242") #define IPC_SERVICE _T("4242")
#define IPC_TOPIC _T("IPC TEST") #define IPC_TOPIC _T("IPC TEST")
#define IPC_ADVISE_NAME _T("Item") #define IPC_ADVISE_NAME _T("Item")
#define IPC_FRAME_WND _T("FrameWnd")
#define IPC_NO_FILE _T("[nofile]") #define IPC_NO_FILE _T("[nofile]")
#if wxCHECK_VERSION(2,9,0)
typedef const void IPCData;
typedef size_t IPCSize_t;
#else
typedef wxChar IPCData;
typedef int IPCSize_t;
#endif
class MyServerConnection; class MyServerConnection;
class MyClientConnection; class MyClientConnection;
extern MyServerConnection *server_connection; extern MyServerConnection *server_connection;
@ -42,16 +61,20 @@ class MyServerConnection : public wxConnection
~MyServerConnection(); ~MyServerConnection();
bool OnPoke ( const wxString& topic bool OnPoke ( const wxString& topic
, const wxString& item , const wxString& item
#if wxCHECK_VERSION(2,9,0) , IPCData *data
, const void *data , IPCSize_t size
, size_t size
#else
, wxChar *data
, int size
#endif
, wxIPCFormat format , wxIPCFormat format
); );
bool OnStartAdvise ( const wxString& topic, const wxString& item ); bool OnStartAdvise ( const wxString& topic, const wxString& item );
IPCData *OnRequest(const wxString& topic, const wxString& item,
IPCSize_t *size, wxIPCFormat format = wxIPC_PRIVATE );
protected:
#if defined ( __WXGTK__ ) && !defined ( __NO_GTK__ )
GdkNativeWindow mFrameWnd;
#else
WXWidget mFrameWnd;
#endif
}; };
class MyClientConnection: public wxConnection class MyClientConnection: public wxConnection
@ -60,13 +83,8 @@ class MyClientConnection: public wxConnection
MyClientConnection(); MyClientConnection();
bool OnAdvise ( const wxString& topic bool OnAdvise ( const wxString& topic
, const wxString& item , const wxString& item
#if wxCHECK_VERSION(2,9,0) , IPCData *data
, const void *data , IPCSize_t size
, size_t size
#else
, wxChar *data
, int size
#endif
, wxIPCFormat format ); , wxIPCFormat format );
bool OnDisconnect(); bool OnDisconnect();
}; };
@ -76,6 +94,7 @@ class MyClient: public wxClient
public: public:
MyClient(); MyClient();
wxConnectionBase *OnMakeConnection(); wxConnectionBase *OnMakeConnection();
bool talkToServer ( int argc, const wxChar * const *argv );
}; };
class MyServer: public wxServer class MyServer: public wxServer
@ -86,3 +105,4 @@ class MyServer: public wxServer
}; };
#endif #endif

View File

@ -64,6 +64,7 @@
#include "threadreaper.h" #include "threadreaper.h"
#include <wx/wupdlock.h> #include <wx/wupdlock.h>
#include "dtd2schema.h" #include "dtd2schema.h"
#include "myipc.h"
#define ngettext wxGetTranslation #define ngettext wxGetTranslation
@ -304,68 +305,37 @@ bool MyApp::OnInit()
break; break;
} }
if ( config.get() )
{
#ifdef __WXMSW__
singleInstanceCheck = config->Read ( _T ( "singleInstanceCheck" ), true );
#else
long longFalse = 0;
singleInstanceCheck = config->Read ( _T ( "singleInstanceCheck" ), longFalse );
#endif
lang = config->Read ( _T ( "lang" ), systemLocale );
}
else
{
lang = systemLocale;
#ifdef __WXMSW__ #ifdef __WXMSW__
singleInstanceCheck = true; singleInstanceCheck = true;
#else #else
singleInstanceCheck = false; singleInstanceCheck = false;
#endif #endif
if ( config.get() )
{
singleInstanceCheck = config->Read ( _T ( "singleInstanceCheck" ),
singleInstanceCheck );
lang = config->Read ( _T ( "lang" ), systemLocale );
}
else
{
lang = systemLocale;
} }
wxString name, service, hostName;
name.Printf ( _T ( "xmlcopyeditor-%s" ), wxGetUserId().c_str() );
service = IPC_SERVICE;
hostName = _T ( "localhost" );
if ( singleInstanceCheck ) if ( singleInstanceCheck )
{ {
wxString name;
name.Printf ( _T ( "xmlcopyeditor-%s" ), wxGetUserId().c_str() );
checker = new wxSingleInstanceChecker ( name ); checker = new wxSingleInstanceChecker ( name );
while ( checker->IsAnotherRunning() ) if ( checker->IsAnotherRunning() )
{ {
// attempt calling server
MyClient client; MyClient client;
MyClientConnection *connection = ( MyClientConnection * ) if ( client.talkToServer ( argc, argv ) )
client.MakeConnection ( hostName, service, IPC_TOPIC );
if ( !connection || !connection->StartAdvise ( IPC_ADVISE_NAME ) )
break;
else
{
wxString argument;
wxChar whatBuffer[] = _T ( "Data" );
if ( this->argc > 1 )
{
for ( int i = 1; i < this->argc; i++ )
{
argument = ( wxString ) this->argv[i];
argument = PathResolver::run ( argument );
if ( ! connection->Poke ( argument, whatBuffer ) )
break;
}
}
else
{
argument = ( wxString ) IPC_NO_FILE;
connection->Poke ( argument, whatBuffer );
}
return false; return false;
} }
} }
}
server = new MyServer; server = new MyServer;
server->Create ( service ); server->Create ( IPC_SERVICE );
myLocale.Init ( lang, wxLOCALE_LOAD_DEFAULT ); myLocale.Init ( lang, wxLOCALE_LOAD_DEFAULT );

View File

@ -52,7 +52,6 @@
#include "xmldoc.h" #include "xmldoc.h"
#include "myhtmlpane.h" #include "myhtmlpane.h"
#include "xmlencodinghandler.h" #include "xmlencodinghandler.h"
#include "myipc.h"
#include <wx/aui/framemanager.h> #include <wx/aui/framemanager.h>
enum enum
@ -167,6 +166,8 @@ enum
CONST_QUESTION CONST_QUESTION
}; };
class MyServer;
class MyApp : public wxApp class MyApp : public wxApp
{ {
public: public: