void TermApp::ReadyToRun() { // Prevent opeing window when option -h is given. if (sUsageRequested) return; // Install a SIGCHLD signal handler, so that we will be notified, when // a shell exits. struct sigaction action; #ifdef __HAIKU__ action.sa_handler = (__sighandler_t)_SigChildHandler; #else action.sa_handler = (__signal_func_ptr)_SigChildHandler; #endif sigemptyset(&action.sa_mask); #ifdef SA_NODEFER action.sa_flags = SA_NODEFER; #endif action.sa_userdata = this; if (sigaction(SIGCHLD, &action, NULL) < 0) { fprintf(stderr, "sigaction() failed: %s\n", strerror(errno)); // continue anyway } // init the mouse copy'n'paste clipboard gMouseClipboard = new BClipboard(MOUSE_CLIPBOARD_NAME, true); status_t status = _MakeTermWindow(); // failed spawn, print stdout and open alert panel // TODO: This alert does never show up. if (status < B_OK) { BAlert* alert = new BAlert("alert", B_TRANSLATE("Terminal couldn't start the shell. Sorry."), B_TRANSLATE("OK"), NULL, NULL, B_WIDTH_FROM_LABEL, B_INFO_ALERT); alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); alert->Go(NULL); PostMessage(B_QUIT_REQUESTED); return; } // using BScreen::Frame isn't enough if (fStartFullscreen) BMessenger(fTermWindow).SendMessage(FULLSCREEN); }
void TermApp::ReadyToRun() { // Prevent opeing window when option -h is given. if (sUsageRequested) return; // Install a SIGCHLD signal handler, so that we will be notified, when // a shell exits. The handler itself will never be executed, since we block // the signal in all threads and handle it with sigwaitinfo() in the child // cleanup thread. struct sigaction action; action.sa_handler = (__sighandler_t)_SigChildHandler; sigemptyset(&action.sa_mask); action.sa_flags = 0; if (sigaction(SIGCHLD, &action, NULL) < 0) { fprintf(stderr, "sigaction() failed: %s\n", strerror(errno)); // continue anyway } // block SIGCHLD and SIGUSR1 -- we send the latter to wake up the child // cleanup thread when quitting. sigset_t blockedSignals; sigemptyset(&blockedSignals); sigaddset(&blockedSignals, SIGCHLD); sigaddset(&blockedSignals, SIGUSR1); int error = pthread_sigmask(SIG_BLOCK, &blockedSignals, NULL); if (error != 0) fprintf(stderr, "pthread_sigmask() failed: %s\n", strerror(errno)); // spawn the child cleanup thread fChildCleanupThread = spawn_thread(_ChildCleanupThreadEntry, "child cleanup", B_NORMAL_PRIORITY, this); if (fChildCleanupThread >= 0) { resume_thread(fChildCleanupThread); } else { fprintf(stderr, "Failed to start child cleanup thread: %s\n", strerror(fChildCleanupThread)); } // init the mouse copy'n'paste clipboard gMouseClipboard = new BClipboard(MOUSE_CLIPBOARD_NAME, true); status_t status = _MakeTermWindow(); // failed spawn, print stdout and open alert panel // TODO: This alert does never show up. if (status < B_OK) { BAlert* alert = new BAlert("alert", B_TRANSLATE("Terminal couldn't start the shell. Sorry."), B_TRANSLATE("OK"), NULL, NULL, B_WIDTH_FROM_LABEL, B_INFO_ALERT); alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); alert->Go(NULL); PostMessage(B_QUIT_REQUESTED); return; } // using BScreen::Frame isn't enough if (fStartFullscreen) BMessenger(fTermWindow).SendMessage(FULLSCREEN); }