* Copyright 2001-2025 Haiku, Inc. All rights reserved
* Copyright (c) 2003-4 Kian Duffy <myob@users.sourceforge.net>
* Parts Copyright (C) 1998,99 Kazuho Okui and Takashi Murai.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files or portions
* thereof (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so, subject
* to the following conditions:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice
* in the binary, as well as this list of conditions and the following
* disclaimer in the documentation and/or other materials provided with
* the distribution.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
*/
#ifndef TERM_WINDOW_H
#define TERM_WINDOW_H
#include <InterfaceDefs.h>
#include <MessageRunner.h>
#include <String.h>
#include <Window.h>
#include "SmartTabView.h"
#include "SetTitleDialog.h"
#include "TerminalRoster.h"
#include "TermView.h"
class Arguments;
class BFile;
class BFont;
class BMenu;
class BMenuBar;
class FindWindow;
class PrefWindow;
class TermViewContainerView;
class ThemeWindow;
class TermWindow : public BWindow, private SmartTabView::Listener,
private TermView::Listener, private SetTitleDialog::Listener,
private TerminalRoster::Listener {
public:
TermWindow(const Arguments& args);
virtual ~TermWindow();
void SessionChanged();
static void MakeEncodingMenu(BMenu*);
static void MakeWindowSizeMenu(BMenu*);
protected:
virtual bool QuitRequested();
virtual void MessageReceived(BMessage* message);
virtual void WindowActivated(bool activated);
virtual void MenusBeginning();
virtual void Zoom(BPoint leftTop, float width, float height);
virtual void FrameResized(float newWidth, float newHeight);
virtual void WorkspacesChanged(uint32 oldWorkspaces,
uint32 newWorkspaces);
virtual void WorkspaceActivated(int32 workspace,
bool state);
virtual void Minimize(bool minimize);
private:
virtual void TabSelected(SmartTabView* tabView, int32 index);
virtual void TabDoubleClicked(SmartTabView* tabView,
BPoint point, int32 index);
virtual void TabMiddleClicked(SmartTabView* tabView,
BPoint point, int32 index);
virtual void TabRightClicked(SmartTabView* tabView,
BPoint point, int32 index);
virtual void NotifyTermViewQuit(TermView* view,
int32 reason);
virtual void SetTermViewTitle(TermView* view,
const char* title);
virtual void PreviousTermView(TermView* view);
virtual void NextTermView(TermView* view);
virtual void TitleChanged(SetTitleDialog* dialog,
const BString& title,
bool titleUserDefined);
virtual void SetTitleDialogDone(SetTitleDialog* dialog);
virtual void TerminalInfosUpdated(TerminalRoster* roster);
private:
struct Title {
BString title;
BString pattern;
bool patternUserDefined;
};
struct SessionID {
SessionID(int32 id = -1);
SessionID(const BMessage& message,
const char* field);
bool IsValid() const { return fID >= 0; }
status_t AddToMessage(BMessage& message,
const char* field) const;
bool operator==(const SessionID& other) const
{ return fID == other.fID; }
bool operator!=(const SessionID& other) const
{ return !(*this == other); }
private:
int32 fID;
};
struct Session;
private:
void _SetTermColors();
void _SetTermColors(TermViewContainerView* containerView);
void _InitWindow();
void _SetupMenu();
static BMenu* _MakeFontSizeMenu(uint32 command, uint8 defaultSize);
void _UpdateSwitchTerminalsMenuItem();
status_t _GetWindowPositionFile(BFile* file,
uint32 openMode);
status_t _LoadWindowPosition(BRect* frame,
uint32* workspaces);
status_t _SaveWindowPosition();
void _GetPreferredFont(BFont &font);
status_t _DoPageSetup();
void _DoPrint();
void _NewTab();
void _AddTab(const Arguments* args,
const BString& currentDirectory
= BString());
void _RemoveTab(int32 index);
void _NavigateTab(int32 index, int32 direction,
bool move);
bool _CanClose(int32 index);
TermViewContainerView* _ActiveTermViewContainerView() const;
TermViewContainerView* _TermViewContainerViewAt(int32 index) const;
TermView* _ActiveTermView() const;
TermView* _TermViewAt(int32 index) const;
int32 _IndexOfTermView(TermView* termView) const;
inline Session* _SessionAt(int32 index) const;
Session* _SessionForID(const SessionID& sessionID) const;
inline int32 _IndexOfSession(Session* session) const;
void _CheckChildren();
void _ResizeView(TermView* view);
void _TitleSettingsChanged();
void _UpdateTitles();
void _UpdateSessionTitle(int32 index);
void _OpenSetTabTitleDialog(int32 index);
void _OpenSetWindowTitleDialog();
void _FinishTitleDialog();
void _SwitchTerminal();
team_id _FindSwitchTerminalTarget();
SessionID _NewSessionID();
int32 _NewSessionIndex();
void _MoveWindowInScreen(BWindow* window);
void _UpdateKeymap();
private:
TerminalRoster fTerminalRoster;
Title fTitle;
BString fSessionTitlePattern;
BMessageRunner fTitleUpdateRunner;
BList fSessions;
int32 fNextSessionID;
SmartTabView* fTabView;
BMenuBar* fMenuBar;
BMenuItem* fSwitchTerminalsMenuItem;
BMenu* fEncodingMenu;
BMenu* fFontSizeMenu;
BMessage* fPrintSettings;
PrefWindow* fPrefWindow;
ThemeWindow* fThemeWindow;
FindWindow* fFindPanel;
BRect fSavedFrame;
window_look fSavedLook;
SetTitleDialog* fSetWindowTitleDialog;
SetTitleDialog* fSetTabTitleDialog;
SessionID fSetTabTitleSession;
BString fFindString;
BMenuItem* fFindNextMenuItem;
BMenuItem* fFindPreviousMenuItem;
BMenuItem* fIncreaseFontSizeMenuItem;
BMenuItem* fDecreaseFontSizeMenuItem;
bool fFindSelection;
bool fForwardSearch;
bool fMatchCase;
bool fMatchWord;
bool fFullScreen;
key_map* fKeymap;
char* fKeymapChars;
};
#endif