fix Sun CC warning about name clash between the method parameters and member variable...
[wxWidgets.git] / src / unix / appunix.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: wx/unix/appunix.cpp
3 // Purpose: wxAppConsole with wxMainLoop implementation
4 // Author: Lukasz Michalski
5 // Created: 28/01/2005
6 // RCS-ID: $Id$
7 // Copyright: (c) Lukasz Michalski
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10
11 #include "wx/app.h"
12 #include "wx/log.h"
13 #include "wx/evtloop.h"
14
15 #include <signal.h>
16 #include <unistd.h>
17
18 // use unusual names for arg[cv] to avoid clashes with wxApp members with the
19 // same names
20 bool wxAppConsole::Initialize(int& argc_, wxChar** argv_)
21 {
22 if ( !wxAppConsoleBase::Initialize(argc_, argv_) )
23 return false;
24
25 sigemptyset(&m_signalsCaught);
26
27 return true;
28 }
29
30 void wxAppConsole::HandleSignal(int signal)
31 {
32 wxAppConsole * const app = wxTheApp;
33 if ( !app )
34 return;
35
36 sigaddset(&(app->m_signalsCaught), signal);
37 app->WakeUpIdle();
38 }
39
40 void wxAppConsole::CheckSignal()
41 {
42 for ( SignalHandlerHash::iterator it = m_signalHandlerHash.begin();
43 it != m_signalHandlerHash.end();
44 ++it )
45 {
46 int sig = it->first;
47 if ( sigismember(&m_signalsCaught, sig) )
48 {
49 sigdelset(&m_signalsCaught, sig);
50 (it->second)(sig);
51 }
52 }
53 }
54
55 bool wxAppConsole::SetSignalHandler(int signal, SignalHandler handler)
56 {
57 const bool install = handler != SIG_DFL && handler != SIG_IGN;
58
59 struct sigaction sa;
60 memset(&sa, 0, sizeof(sa));
61 sa.sa_handler = &wxAppConsole::HandleSignal;
62 sa.sa_flags = SA_RESTART;
63 int res = sigaction(signal, &sa, 0);
64 if ( res != 0 )
65 {
66 wxLogSysError(_("Failed to install signal handler"));
67 return false;
68 }
69
70 if ( install )
71 m_signalHandlerHash[signal] = handler;
72 else
73 m_signalHandlerHash.erase(signal);
74
75 return true;
76 }
77