static int uv__get_process_title() { WCHAR title_w[MAX_TITLE_LENGTH]; int length; if (!GetConsoleTitleW(title_w, sizeof(title_w) / sizeof(WCHAR))) { return -1; } /* Find out what the size of the buffer is that we need */ length = uv_utf16_to_utf8(title_w, -1, NULL, 0); if (!length) { return -1; } assert(!process_title); process_title = (char*)malloc(length); if (!process_title) { uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); } /* Do utf16 -> utf8 conversion here */ if (!uv_utf16_to_utf8(title_w, -1, process_title, length)) { free(process_title); return -1; } return 0; }
/* * Returns the current ps_buffer value into string. On some platforms * the string will not be null-terminated, so return the effective * length into *displen. * The return code indicates the error. */ int get_ps_title(int *displen, const char** string) { int rc = is_ps_title_available(); if (rc != PS_TITLE_SUCCESS) return rc; #ifdef PS_USE_WIN32 { wchar_t ps_buffer_w[MAX_PATH]; char *tmp; if (!(ps_buffer_cur_len = GetConsoleTitleW(ps_buffer_w, (DWORD)sizeof(ps_buffer_w)))) { return PS_TITLE_WINDOWS_ERROR; } tmp = php_win32_cp_conv_w_to_any(ps_buffer_w, PHP_WIN32_CP_IGNORE_LEN, &ps_buffer_cur_len); if (!tmp) { return PS_TITLE_WINDOWS_ERROR; } ps_buffer_cur_len = ps_buffer_cur_len > sizeof(ps_buffer)-1 ? sizeof(ps_buffer)-1 : ps_buffer_cur_len; memmove(ps_buffer, tmp, ps_buffer_size); ps_buffer[ps_buffer_cur_len] = '\0'; free(tmp); } #endif *displen = (int)ps_buffer_cur_len; *string = ps_buffer; return PS_TITLE_SUCCESS; }
static int uv__get_process_title() { WCHAR title_w[MAX_TITLE_LENGTH]; if (!GetConsoleTitleW(title_w, sizeof(title_w) / sizeof(WCHAR))) { return -1; } if (uv__convert_utf16_to_utf8(title_w, -1, &process_title) != 0) return -1; return 0; }
static PWSTR get_title(void) { size_t max_length = 256; PWSTR result = malloc(max_length * sizeof(WCHAR)); while(GetConsoleTitleW(result, max_length) > 0){ max_length *= 2; PWSTR new_result = realloc(result, max_length * sizeof(WCHAR)); if(new_result == NULL){ free(result); caml_raise_out_of_memory(); } result = new_result; } return result; }
/* stores current terminal title into title_state.title */ static void save_term_title() { #ifdef _WIN32 GetConsoleTitleW(title_state.title, ARRAY_LEN(title_state.title)); #else #ifdef HAVE_X11 Display *x11_display = 0; Window x11_window = 0; #ifdef DYN_X11 try_dynload_xlib(); #endif /* use X to determine current window title */ if(get_x11_disp_and_win(&x11_display, &x11_window)) get_x11_window_title(x11_display, x11_window, title_state.title, sizeof(title_state.title)); #endif #endif }
void QConsolePrivate::monitorConsole (void) { CONSOLE_SCREEN_BUFFER_INFO sbi; HANDLE hStdOut = GetStdHandle (STD_OUTPUT_HANDLE); static wchar_t titleBuf[260]; GetConsoleTitleW (titleBuf, sizeof (titleBuf)); QString title = QString::fromWCharArray (titleBuf); if (title != m_title) { q->setWindowTitle (title); emit q->titleChanged (title); } if (GetConsoleScreenBufferInfo (hStdOut, &sbi)) { if (m_bufferSize.width () != sbi.dwSize.X || m_bufferSize.height () != sbi.dwSize.Y) { // Buffer size changed m_bufferSize.setWidth(sbi.dwSize.X); m_bufferSize.setHeight(sbi.dwSize.Y); //m_bufferSize.rwidth () = sbi.dwSize.X; //m_bufferSize.rheight () = sbi.dwSize.Y; updateScrollBar (); } if (m_cursorPos.x () != sbi.dwCursorPosition.X || m_cursorPos.y () != sbi.dwCursorPosition.Y) { // Cursor position changed m_consoleView->update ((m_cursorPos.x () - sbi.srWindow.Left) * m_charSize.width (), (m_cursorPos.y () - sbi.srWindow.Top) * m_charSize.height (), m_charSize.width (), m_charSize.height ()); //m_cursorPos.rx () = sbi.dwCursorPosition.X; //m_cursorPos.ry () = sbi.dwCursorPosition.Y; m_cursorPos.setX(sbi.dwCursorPosition.X); m_cursorPos.setY(sbi.dwCursorPosition.Y); m_consoleView->update ((m_cursorPos.x () - sbi.srWindow.Left) * m_charSize.width (), (m_cursorPos.y () - sbi.srWindow.Top) * m_charSize.height (), m_charSize.width (), m_charSize.height ()); } if (m_consoleRect.left () != sbi.srWindow.Left || m_consoleRect.right () != sbi.srWindow.Right || m_consoleRect.top () != sbi.srWindow.Top || m_consoleRect.bottom () != sbi.srWindow.Bottom) { // Console window changed m_consoleRect = QRect (sbi.srWindow.Left, sbi.srWindow.Top, sbi.srWindow.Right - sbi.srWindow.Left + 1, sbi.srWindow.Bottom - sbi.srWindow.Top + 1); // sbi.srWindow.Right - sbi.srWindow.Left + 1, // sbi.srWindow.Bottom - sbi.srWindow.Top + 1); updateScrollBar (); updateConsoleView (); return; } if (m_tmpBuffer && m_buffer) { grabConsoleBuffer (m_tmpBuffer); if (memcmp (m_tmpBuffer, m_buffer, sizeof (CHAR_INFO) * m_consoleRect.width () * m_consoleRect.height ())) { // FIXME: compute the area to update based on the // difference between the 2 buffers. qSwap (m_buffer, m_tmpBuffer); updateConsoleView (false); } } } }
QConsolePrivate::QConsolePrivate (QWinTerminalImpl* parent, const QString& cmd) : q (parent), m_command (cmd), m_process (NULL), m_inWheelEvent (false) { //log (NULL); // Possibly detach from any existing console log ("Detaching from existing console (if any)...\n"); FreeConsole (); log ("Closing standard IO...\n"); closeStandardIO (0, STD_INPUT_HANDLE, "STDIN"); closeStandardIO (1, STD_OUTPUT_HANDLE, "STDOUT"); closeStandardIO (2, STD_ERROR_HANDLE, "STDERR"); #ifdef HIDDEN_CONSOLE HWINSTA hOrigSta, hNewSta; // Create new (hidden) console hOrigSta = GetProcessWindowStation (); hNewSta = CreateWindowStation (NULL, 0, GENERIC_ALL, NULL); log ("Current Windows station: %p.\nNew Windows station: %p.\n", hOrigSta, hNewSta); if (! SetProcessWindowStation (hNewSta)) log ("Failed to switch to new Windows station.\n"); #endif if (! AllocConsole ()) log ("Failed to create new console.\n"); #ifdef HIDDEN_CONSOLE if (! SetProcessWindowStation (hOrigSta)) log ("Failed to restore original Windows station.\n"); if (! CloseWindowStation (hNewSta)) log ("Failed to close new Windows station.\n"); #endif log ("New (hidden) console created.\n"); setupStandardIO (STD_INPUT_HANDLE, 0, "STDIN", "CONIN$"); setupStandardIO (STD_OUTPUT_HANDLE, 1, "STDOUT", "CONOUT$"); setupStandardIO (STD_ERROR_HANDLE, 2, "STDERR", "CONOUT$"); log ("Standard input/output/error set up.\n"); *stdin = *(fdopen (0, "rb")); *stdout = *(fdopen (1, "wb")); *stderr = *(fdopen (2, "wb")); log ("POSIX standard streams created.\n"); setvbuf (stdin, NULL, _IONBF, 0); setvbuf (stdout, NULL, _IONBF, 0); setvbuf (stderr, NULL, _IONBF, 0); log ("POSIX standard stream buffers adjusted.\n"); HANDLE hStdOut = GetStdHandle (STD_OUTPUT_HANDLE); log ("Console allocated: hStdOut: %p\n", hStdOut); m_stdOut = hStdOut; m_consoleWindow = GetConsoleWindow (); // In case the console window hasn't been created hidden... ShowWindow (m_consoleWindow, SW_HIDE); CONSOLE_SCREEN_BUFFER_INFO sbi; GetConsoleScreenBufferInfo (hStdOut, &sbi); m_bufferSize = QSize (sbi.dwSize.X, qMax (sbi.dwSize.Y, (SHORT)500)); m_consoleRect = QRect (sbi.srWindow.Left, sbi.srWindow.Top, sbi.srWindow.Right - sbi.srWindow.Left + 1, sbi.srWindow.Bottom - sbi.srWindow.Top + 1); m_cursorPos = QPoint (sbi.dwCursorPosition.X, sbi.dwCursorPosition.Y); log ("Initial console parameters:\n"); log (" buffer size: %d x %d\n", m_bufferSize.width (), m_bufferSize.height ()); log (" window: (%d, %d) -> (%d, %d) [%d x %d]\n", m_consoleRect.left (), m_consoleRect.top (), m_consoleRect.right (), m_consoleRect.bottom (), m_consoleRect.width (), m_consoleRect.height ()); wchar_t titleBuf[260]; GetConsoleTitleW (titleBuf, sizeof (titleBuf)); q->setWindowTitle (QString::fromWCharArray (titleBuf)); m_font.setFamily ("Lucida Console"); m_font.setPointSize (9); m_font.setStyleHint (QFont::TypeWriter); m_backgroundColor = Qt::white; m_buffer = m_tmpBuffer = 0; m_consoleView = new QConsoleView (parent); m_scrollBar = new QScrollBar (Qt::Vertical, parent); QHBoxLayout* l = new QHBoxLayout (parent); l->setContentsMargins (0, 0, 0, 0); l->setSpacing (0); l->addWidget (m_consoleView, 1); l->addWidget (m_scrollBar, 0); m_consoleView->setPalette (QPalette (m_backgroundColor)); m_consoleView->setAutoFillBackground (true); m_consoleView->setFont (m_font); parent->setFocusPolicy (Qt::StrongFocus); parent->winId (); updateScrollBar (); m_consoleWatcher = new QTimer (parent); m_consoleWatcher->setInterval (10); m_consoleWatcher->setSingleShot (false); QObject::connect (m_scrollBar, SIGNAL (valueChanged (int)), q, SLOT (scrollValueChanged (int))); QObject::connect (m_consoleWatcher, SIGNAL (timeout (void)), q, SLOT (monitorConsole (void))); m_consoleWatcher->start (); if (m_command.isEmpty ()) m_consoleThread = 0; else { m_consoleThread = new QConsoleThread (q); QObject::connect (m_consoleThread, SIGNAL (finished (void)), q, SIGNAL (terminated (void))); m_consoleThread->start (); } }
wstring get_console_title() { Buffer<wchar_t> buf(10000); DWORD size = GetConsoleTitleW(buf.data(), static_cast<DWORD>(buf.size())); return wstring(buf.data(), size); }