PageRecord::PageRecord(MainWindow* main_window) : QWidget(main_window->centralWidget()) { m_main_window = main_window; m_page_started = false; m_input_started = false; m_output_started = false; m_previewing = false; m_last_error_sound = std::numeric_limits<int64_t>::min(); QGroupBox *groupbox_recording = new QGroupBox(tr("Recording"), this); { m_pushbutton_start_pause = new QPushButton(groupbox_recording); m_checkbox_hotkey_enable = new QCheckBox(tr("Enable recording hotkey"), groupbox_recording); m_checkbox_sound_notifications_enable = new QCheckBox(tr("Enable sound notifications"), groupbox_recording); QLabel *label_hotkey = new QLabel(tr("Hotkey:"), groupbox_recording); m_checkbox_hotkey_ctrl = new QCheckBox(tr("Ctrl +"), groupbox_recording); m_checkbox_hotkey_shift = new QCheckBox(tr("Shift +"), groupbox_recording); m_checkbox_hotkey_alt = new QCheckBox(tr("Alt +"), groupbox_recording); m_checkbox_hotkey_super = new QCheckBox(tr("Super +"), groupbox_recording); m_combobox_hotkey_key = new QComboBox(groupbox_recording); m_combobox_hotkey_key->setToolTip(tr("The key that you have to press (combined with the given modifiers) to start or pause recording.\n" "The program that you are recording will not receive the key press.")); // Note: The choice of keys is currently rather limited, because capturing key presses session-wide is a bit harder than it looks. // For example, applications are not allowed to capture the F1-F12 keys (on Ubuntu at least). The A-Z keys don't have this limitation apparently. for(unsigned int i = 0; i < 26; ++i) { m_combobox_hotkey_key->addItem(QString('A' + i)); } connect(m_pushbutton_start_pause, SIGNAL(clicked()), this, SLOT(OnRecordStartPause())); connect(m_checkbox_hotkey_enable, SIGNAL(clicked()), this, SLOT(OnUpdateHotkeyFields())); connect(m_checkbox_sound_notifications_enable, SIGNAL(clicked()), this, SLOT(OnUpdateSoundNotifications())); connect(m_checkbox_hotkey_ctrl, SIGNAL(clicked()), this, SLOT(OnUpdateHotkey())); connect(m_checkbox_hotkey_shift, SIGNAL(clicked()), this, SLOT(OnUpdateHotkey())); connect(m_checkbox_hotkey_alt, SIGNAL(clicked()), this, SLOT(OnUpdateHotkey())); connect(m_checkbox_hotkey_super, SIGNAL(clicked()), this, SLOT(OnUpdateHotkey())); connect(m_combobox_hotkey_key, SIGNAL(activated(int)), this, SLOT(OnUpdateHotkey())); QVBoxLayout *layout = new QVBoxLayout(groupbox_recording); layout->addWidget(m_pushbutton_start_pause); { QHBoxLayout *layout2 = new QHBoxLayout(); layout->addLayout(layout2); layout2->addWidget(m_checkbox_hotkey_enable); layout2->addWidget(m_checkbox_sound_notifications_enable); } { QHBoxLayout *layout2 = new QHBoxLayout(); layout->addLayout(layout2); layout2->addWidget(label_hotkey); layout2->addWidget(m_checkbox_hotkey_ctrl); layout2->addWidget(m_checkbox_hotkey_shift); layout2->addWidget(m_checkbox_hotkey_alt); layout2->addWidget(m_checkbox_hotkey_super); layout2->addWidget(m_combobox_hotkey_key); } } QSplitter *splitter_vertical = new QSplitter(Qt::Vertical, this); { QSplitter *splitter_horizontal = new QSplitter(Qt::Horizontal, splitter_vertical); { QGroupBox *groupbox_information = new QGroupBox(tr("Information"), splitter_horizontal); { QLabel *label_total_time = new QLabel(tr("Total time:"), groupbox_information); m_label_info_total_time = new QLabel(groupbox_information); QLabel *label_frame_rate_in = new QLabel(tr("FPS in:"), groupbox_information); m_label_info_frame_rate_in = new QLabel(groupbox_information); QLabel *label_frame_rate_out = new QLabel(tr("FPS out:"), groupbox_information); m_label_info_frame_rate_out = new QLabel(groupbox_information); QLabel *label_size_in = new QLabel(tr("Size in:"), groupbox_information); m_label_info_size_in = new QLabel(groupbox_information); QLabel *label_size_out = new QLabel(tr("Size out:"), groupbox_information); m_label_info_size_out = new QLabel(groupbox_information); QLabel *label_file_name = new QLabel(tr("File name:"), groupbox_information); m_label_info_file_name = new ElidedLabel(QString(), Qt::ElideMiddle, groupbox_information); m_label_info_file_name->setMinimumWidth(100); QLabel *label_file_size = new QLabel(tr("File size:"), groupbox_information); m_label_info_file_size = new QLabel(groupbox_information); QLabel *label_bit_rate = new QLabel(tr("Bit rate:"), groupbox_information); m_label_info_bit_rate = new QLabel(groupbox_information); QGridLayout *layout = new QGridLayout(groupbox_information); layout->addWidget(label_total_time, 0, 0); layout->addWidget(m_label_info_total_time, 0, 1); layout->addWidget(label_frame_rate_in, 1, 0); layout->addWidget(m_label_info_frame_rate_in, 1, 1); layout->addWidget(label_frame_rate_out, 2, 0); layout->addWidget(m_label_info_frame_rate_out, 2, 1); layout->addWidget(label_size_in, 3, 0); layout->addWidget(m_label_info_size_in, 3, 1); layout->addWidget(label_size_out, 4, 0); layout->addWidget(m_label_info_size_out, 4, 1); layout->addWidget(label_file_name, 5, 0); layout->addWidget(m_label_info_file_name, 5, 1); layout->addWidget(label_file_size, 6, 0); layout->addWidget(m_label_info_file_size, 6, 1); layout->addWidget(label_bit_rate, 7, 0); layout->addWidget(m_label_info_bit_rate, 7, 1); layout->setColumnStretch(1, 1); layout->setRowStretch(8, 1); } QGroupBox *groupbox_preview = new QGroupBox(tr("Preview"), splitter_horizontal); { m_preview_page1 = new QWidget(groupbox_preview); { QLabel *label_preview_frame_rate = new QLabel(tr("Preview frame rate:"), m_preview_page1); m_spinbox_preview_frame_rate = new QSpinBox(m_preview_page1); m_spinbox_preview_frame_rate->setRange(1, 1000); m_spinbox_preview_frame_rate->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); QLabel *label_preview_note = new QLabel(tr("Note: Previewing requires extra CPU time (especially at high frame rates)."), m_preview_page1); label_preview_note->setWordWrap(true); label_preview_note->setAlignment(Qt::AlignLeft | Qt::AlignTop); label_preview_note->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::MinimumExpanding); QGridLayout *layout = new QGridLayout(m_preview_page1); layout->setMargin(0); layout->addWidget(label_preview_frame_rate, 0, 0); layout->addWidget(m_spinbox_preview_frame_rate, 0, 1); layout->addWidget(label_preview_note, 1, 0, 1, 2); } m_preview_page2 = new QWidget(groupbox_preview); { m_video_previewer = new VideoPreviewer(m_preview_page2); m_label_mic_icon = new QLabel(m_preview_page2); m_label_mic_icon->setPixmap(g_icon_microphone.pixmap(24, 24)); m_audio_previewer = new AudioPreviewer(m_preview_page2); QVBoxLayout *layout = new QVBoxLayout(m_preview_page2); layout->setMargin(0); layout->addWidget(m_video_previewer); { QHBoxLayout *layout2 = new QHBoxLayout(); layout->addLayout(layout2); layout2->addStretch(); layout2->addWidget(m_label_mic_icon); layout2->addWidget(m_audio_previewer); layout2->addStretch(); } } m_pushbutton_preview_start_stop = new QPushButton(groupbox_preview); connect(m_pushbutton_preview_start_stop, SIGNAL(clicked()), this, SLOT(OnPreviewStartStop())); QVBoxLayout *layout = new QVBoxLayout(groupbox_preview); { m_stacked_layout_preview = new QStackedLayout(); layout->addLayout(m_stacked_layout_preview); m_stacked_layout_preview->addWidget(m_preview_page1); m_stacked_layout_preview->addWidget(m_preview_page2); } layout->addWidget(m_pushbutton_preview_start_stop); } splitter_horizontal->addWidget(groupbox_information); splitter_horizontal->addWidget(groupbox_preview); splitter_horizontal->setStretchFactor(0, 1); splitter_horizontal->setStretchFactor(1, 3); } QGroupBox *groupbox_log = new QGroupBox(tr("Log"), splitter_vertical); { m_textedit_log = new QTextEditSmall(groupbox_log); m_textedit_log->setReadOnly(true); QVBoxLayout *layout = new QVBoxLayout(groupbox_log); layout->addWidget(m_textedit_log); } splitter_vertical->addWidget(splitter_horizontal); splitter_vertical->addWidget(groupbox_log); splitter_vertical->setStretchFactor(0, 3); splitter_vertical->setStretchFactor(1, 1); } QPushButton *button_cancel = new QPushButton(g_icon_cancel, tr("Cancel recording"), this); QPushButton *button_save = new QPushButton(g_icon_save, tr("Save recording"), this); if(g_option_systray) { m_systray_icon = new QSystemTrayIcon(g_icon_ssr, m_main_window); QMenu *menu = new QMenu(m_main_window); m_systray_action_start_pause = menu->addAction(QString(), this, SLOT(OnRecordStartPause())); m_systray_action_start_pause->setIconVisibleInMenu(true); m_systray_action_cancel = menu->addAction(g_icon_cancel, tr("Cancel recording"), this, SLOT(OnCancel())); m_systray_action_cancel->setIconVisibleInMenu(true); m_systray_action_save = menu->addAction(g_icon_save, tr("Save recording"), this, SLOT(OnSave())); m_systray_action_save->setIconVisibleInMenu(true); menu->addSeparator(); m_systray_action_show_hide = menu->addAction(QString(), m_main_window, SLOT(OnShowHide())); m_systray_action_show_hide->setIconVisibleInMenu(true); m_systray_action_quit = menu->addAction(g_icon_quit, tr("Quit"), m_main_window, SLOT(close())); m_systray_action_quit->setIconVisibleInMenu(true); m_systray_icon->setContextMenu(menu); } else { m_systray_icon = NULL; } connect(button_cancel, SIGNAL(clicked()), this, SLOT(OnCancel())); connect(button_save, SIGNAL(clicked()), this, SLOT(OnSave())); if(m_systray_icon != NULL) connect(m_systray_icon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), m_main_window, SLOT(OnSysTrayActivated(QSystemTrayIcon::ActivationReason))); QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(groupbox_recording); layout->addWidget(splitter_vertical); { QHBoxLayout *layout2 = new QHBoxLayout(); layout->addLayout(layout2); layout2->addWidget(button_cancel); layout2->addWidget(button_save); } UpdateSysTray(); UpdateRecordPauseButton(); UpdatePreview(); m_timer_update_info = new QTimer(this); connect(m_timer_update_info, SIGNAL(timeout()), this, SLOT(OnUpdateInformation())); connect(&m_hotkey_start_pause, SIGNAL(Triggered()), this, SLOT(OnRecordStartPause()), Qt::QueuedConnection); connect(Logger::GetInstance(), SIGNAL(NewLine(Logger::enum_type,QString)), this, SLOT(OnNewLogLine(Logger::enum_type,QString)), Qt::QueuedConnection); if(m_systray_icon != NULL) m_systray_icon->show(); }
void MainWindow::OnSysTrayActivated(QSystemTrayIcon::ActivationReason reason) { if(reason == QSystemTrayIcon::Trigger || reason == QSystemTrayIcon::DoubleClick) { OnShowHide(); } }
int ShowHide(WPARAM wParam,LPARAM lParam) { HWND hwndContactList=(HWND)CallService(MS_CLUI_GETHWND,0,0); BOOL bShow = FALSE; int iVisibleState = GetWindowVisibleState(hwndContactList,0,0); int method; method=DBGetContactSettingByte(NULL, "ModernData", "HideBehind", 0);; //(0-none, 1-leftedge, 2-rightedge); if (method) { if (DBGetContactSettingByte(NULL, "ModernData", "BehindEdge", 0)==0 && lParam!=1) { //hide BehindEdge_Hide(); } else { BehindEdge_Show(); } bShow=TRUE; iVisibleState=GWVS_HIDDEN; } if (!method && DBGetContactSettingByte(NULL, "ModernData", "BehindEdge", 0)>0) { BehindEdgeSettings=DBGetContactSettingByte(NULL, "ModernData", "BehindEdge", 0); BehindEdge_Show(); BehindEdgeSettings=0; BehindEdge_State=0; DBDeleteContactSetting(NULL, "ModernData", "BehindEdge"); } //bShow is FALSE when we enter the switch if no hide behind edge. switch (iVisibleState) { case GWVS_PARTIALLY_COVERED: //If we don't want to bring it to top, we can use a simple break. This goes against readability ;-) but the comment explains it. case GWVS_COVERED: //Fall through (and we're already falling) if (DBGetContactSettingByte(NULL,"CList","OnDesktop",0) || !DBGetContactSettingByte(NULL, "CList", "BringToFront", SETTING_BRINGTOFRONT_DEFAULT)) break; case GWVS_HIDDEN: bShow = TRUE; break; case GWVS_VISIBLE: //This is not needed, but goes for readability. bShow = FALSE; break; case -1: //We can't get here, both hwndContactList and iStepX and iStepY are right. return 0; } if(bShow == TRUE || lParam) { WINDOWPLACEMENT pl={0}; HMONITOR (WINAPI *MyMonitorFromWindow)(HWND,DWORD); RECT rcScreen,rcWindow; int offScreen=0; SystemParametersInfo(SPI_GETWORKAREA,0,&rcScreen,FALSE); GetWindowRect(hwndContactList,&rcWindow); ActivateSubContainers(TRUE); ShowWindowNew(hwndContactList, SW_RESTORE); if (!DBGetContactSettingByte(NULL,"CList","OnDesktop",0)) { OnShowHide(hwndContactList,1); SetWindowPos(hwndContactList, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE |SWP_NOACTIVATE); CALLED_FROM_SHOWHIDE=1; BringWindowToTop(hwndContactList); if (!DBGetContactSettingByte(NULL,"CList","OnTop",SETTING_ONTOP_DEFAULT)) //&& ((DBGetContactSettingByte(NULL, "CList", "BringToFront", SETTING_BRINGTOFRONT_DEFAULT) /*&& iVisibleState>=2*/))) SetWindowPos(hwndContactList, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); SetForegroundWindow(hwndContactList); CALLED_FROM_SHOWHIDE=0; } else { SetWindowPos(hwndContactList, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); OnShowHide(hwndContactList,1); SetForegroundWindow(hwndContactList); } DBWriteContactSettingByte(NULL,"CList","State",SETTING_STATE_NORMAL); //this forces the window onto the visible screen MyMonitorFromWindow=(HMONITOR (WINAPI *)(HWND,DWORD))GetProcAddress(GetModuleHandle(TEXT("USER32")),"MonitorFromWindow"); if(MyMonitorFromWindow) { if(MyMonitorFromWindow(hwndContactList,0)==NULL) { BOOL (WINAPI *MyGetMonitorInfoA)(HMONITOR,LPMONITORINFO); MONITORINFO mi={0}; HMONITOR hMonitor=MyMonitorFromWindow(hwndContactList,2); MyGetMonitorInfoA=(BOOL (WINAPI *)(HMONITOR,LPMONITORINFO))GetProcAddress(GetModuleHandle(TEXT("USER32")),"GetMonitorInfoA"); mi.cbSize=sizeof(mi); MyGetMonitorInfoA(hMonitor,&mi); rcScreen=mi.rcWork; offScreen=1; } } else { RECT rcDest; if(IntersectRect(&rcDest,&rcScreen,&rcWindow)==0) offScreen=1; } if(offScreen) { if(rcWindow.top>=rcScreen.bottom) OffsetRect(&rcWindow,0,rcScreen.bottom-rcWindow.bottom); else if(rcWindow.bottom<=rcScreen.top) OffsetRect(&rcWindow,0,rcScreen.top-rcWindow.top); if(rcWindow.left>=rcScreen.right) OffsetRect(&rcWindow,rcScreen.right-rcWindow.right,0); else if(rcWindow.right<=rcScreen.left) OffsetRect(&rcWindow,rcScreen.left-rcWindow.left,0); SetWindowPos(hwndContactList,0,rcWindow.left,rcWindow.top,rcWindow.right-rcWindow.left,rcWindow.bottom-rcWindow.top,SWP_NOZORDER); } //if (DBGetContactSettingByte(NULL,"CList","OnDesktop",0)) // SetWindowPos(hwndContactList, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); } else { //It needs to be hidden HideWindow(hwndContactList, SW_HIDE); //OnShowHide(hwndContactList,0); DBWriteContactSettingByte(NULL,"CList","State",SETTING_STATE_HIDDEN); if(MySetProcessWorkingSetSize!=NULL && DBGetContactSettingByte(NULL,"CList","DisableWorkingSet",1)) MySetProcessWorkingSetSize(GetCurrentProcess(),-1,-1); } return 0; }