Improved the behaviour to don't get focus when a message is received or the user is typing, from that rev the chat window will appear on the screen without leaving the focus of your current application. But there are two exeptions...when a window is created the first time or the user open it from the contacts list it will get focus. Other little fixes, changed variable names and style.

This commit is contained in:
barrett 2012-06-07 16:46:07 +00:00
parent d661379bc4
commit 92f2ee4547
10 changed files with 97 additions and 53 deletions

View File

@ -96,6 +96,20 @@ ChatWindow::ChatWindow(ContactLinker* cl)
}
void
ChatWindow::ShowWindow()
{
if (IsHidden())
Show();
if (IsMinimized())
Minimize(false);
if (!IsActive())
Activate(true);
}
bool
ChatWindow::QuitRequested()
{
@ -153,6 +167,7 @@ ChatWindow::MessageReceived(BMessage* message)
case IM_MESSAGE:
ImMessage(message);
break;
default:
BWindow::MessageReceived(message);
break;
@ -265,3 +280,16 @@ ChatWindow::AppendStatus(CayaStatus status)
fReceiveView->Append("\n", COL_TEXT, COL_TEXT, R_TEXT);
fReceiveView->ScrollToSelection();
}
void
ChatWindow::AvoidFocus(bool avoid)
{
// This is needed to avoid the window focus when
// a new message is received, since it could be a lot annoying
// for the user
if (avoid)
SetFlags(B_AVOID_FOCUS);
else
SetFlags(Flags() &~ B_AVOID_FOCUS);
}

View File

@ -20,6 +20,8 @@ class ChatWindow : public BWindow, public Observer {
public:
ChatWindow(ContactLinker* cl);
virtual void ShowWindow();
virtual void MessageReceived(BMessage* message);
virtual bool QuitRequested();
@ -32,6 +34,7 @@ public:
void ObserveInteger(int32 what, int32 val);
void AppendStatus(CayaStatus status);
void AvoidFocus(bool avoid);
private:
BTextView* fSendView;
ContactLinker* fContactLinker;

View File

@ -34,7 +34,8 @@ ContactLinker::ContactLinker(BString id, BMessenger msgn)
fMessenger(msgn),
fLooper(NULL),
fStatus(CAYA_OFFLINE),
fPopUp(NULL)
fPopUp(NULL),
fNewWindow(true)
{
// Create the roster item and register it as observer
fRosterItem = new RosterItem(id.String(), this);
@ -59,29 +60,38 @@ ContactLinker::DeleteWindow()
UnregisterObserver(fChatWindow);
fChatWindow->Quit();
fChatWindow = NULL;
fNewWindow = true;
}
}
}
void
ContactLinker::ShowWindow()
ContactLinker::ShowWindow(bool typing, bool userAction)
{
if (fChatWindow == NULL)
CreateChatWindow();
fChatWindow->AvoidFocus(true);
if (CayaPreferences::Item()->MoveToCurrentWorkspace)
fChatWindow->SetWorkspaces(B_CURRENT_WORKSPACE);
if (fChatWindow->IsHidden())
fChatWindow->Show();
if (fChatWindow->IsMinimized())
fChatWindow->Minimize(false);
if (CayaPreferences::Item()->FocusOnMessageReceived == true
|| CayaPreferences::Item()->FocusUserIsTyping == true)
fChatWindow->Activate(true);
if (fNewWindow || userAction) {
fChatWindow->AvoidFocus(false);
fChatWindow->ShowWindow();
fNewWindow = false;
} else {
if (typing) {
if (CayaPreferences::Item()->RaiseUserIsTyping)
fChatWindow->ShowWindow();
} else {
if (CayaPreferences::Item()->RaiseOnMessageReceived
|| fChatWindow->IsHidden())
fChatWindow->ShowWindow();
}
}
fChatWindow->AvoidFocus(false);
}

View File

@ -27,7 +27,7 @@ public:
ChatWindow* GetChatWindow();
void DeleteWindow();
void ShowWindow();
void ShowWindow(bool typing = false, bool userAction = false);
void HideWindow();
void ShowPopUp(BPoint where);
@ -70,6 +70,8 @@ private:
BBitmap* fAvatarBitmap;
CayaStatus fStatus;
ContactPopUp* fPopUp;
bool fNewWindow;
};
#endif // _CONTACT_LINKER_H_

View File

@ -137,7 +137,8 @@ void
MainWindow::MessageReceived(BMessage* message)
{
switch (message->what) {
case kSearchContact: {
case kSearchContact:
{
void* control = NULL;
if (message->FindPointer("source", &control) != B_OK)
return;
@ -165,16 +166,18 @@ MainWindow::MessageReceived(BMessage* message)
}
break;
}
case CAYA_SHOW_SETTINGS: {
case CAYA_SHOW_SETTINGS:
{
PreferencesDialog* dialog = new PreferencesDialog();
dialog->Show();
break;
}
case CAYA_OPEN_CHAT_WINDOW: {
case CAYA_OPEN_CHAT_WINDOW:
{
int index = message->FindInt32("index");
RosterItem* ritem = ItemAt(index);
if (ritem != NULL)
ritem->GetContactLinker()->ShowWindow();
ritem->GetContactLinker()->ShowWindow(false, true);
break;
}

View File

@ -321,8 +321,7 @@ Server::ImMessage(BMessage* msg)
ContactLinker* item = fRosterMap.ValueFor(id, &found);
if (found) {
ChatWindow* win = item->GetChatWindow();
if (CayaPreferences::Item()->FocusOnMessageReceived)
item->ShowWindow();
item->ShowWindow();
win->PostMessage(msg);
}
}
@ -338,8 +337,7 @@ Server::ImMessage(BMessage* msg)
ContactLinker* item = fRosterMap.ValueFor(id, &found);
if (found) {
ChatWindow* win = item->GetChatWindow();
if (CayaPreferences::Item()->FocusUserIsTyping)
item->ShowWindow();
item->ShowWindow(true);
win->PostMessage(msg);
}
}

View File

@ -14,8 +14,8 @@ template<> const char* CayaPreferences::fFilename = "preferences";
CayaPreferencesData::CayaPreferencesData()
:
MoveToCurrentWorkspace(true),
FocusOnMessageReceived(false),
FocusUserIsTyping(false),
RaiseOnMessageReceived(false),
RaiseUserIsTyping(false),
HideCayaDeskbar(false),
DisableReplicant(true),
IgnoreEmoticons(false),
@ -78,8 +78,8 @@ CayaPreferencesData::Flatten(BPositionIO* flatData) const
// Behaviour
_AddBool(flatData, MoveToCurrentWorkspace);
_AddBool(flatData, FocusOnMessageReceived);
_AddBool(flatData, FocusUserIsTyping);
_AddBool(flatData, RaiseOnMessageReceived);
_AddBool(flatData, RaiseUserIsTyping);
_AddBool(flatData, NotifyProtocolStatus);
_AddBool(flatData, NotifyContactStatus);
@ -142,8 +142,8 @@ CayaPreferencesData::Unflatten(type_code code, BPositionIO* flatData)
// Behaviour
MoveToCurrentWorkspace = _ReadBool(flatData);
FocusOnMessageReceived = _ReadBool(flatData);
FocusUserIsTyping = _ReadBool(flatData);
RaiseOnMessageReceived = _ReadBool(flatData);
RaiseUserIsTyping = _ReadBool(flatData);
NotifyProtocolStatus = _ReadBool(flatData);
NotifyContactStatus = _ReadBool(flatData);

View File

@ -26,8 +26,8 @@ public:
status_t Unflatten(type_code code, BPositionIO* flatData);
bool MoveToCurrentWorkspace;
bool FocusOnMessageReceived;
bool FocusUserIsTyping;
bool RaiseOnMessageReceived;
bool RaiseUserIsTyping;
bool NotifyProtocolStatus;
bool NotifyContactStatus;

View File

@ -24,14 +24,14 @@
#include "TheApp.h"
const uint32 kToCurrentWorkspace = 'CBcw';
const uint32 kFocusOnMessageReceived= 'FCmr';
const uint32 kFocusUserIsTyping = 'FCit';
const uint32 kRaiseOnMessageReceived = 'FCmr';
const uint32 kRaiseUserIsTyping = 'FCit';
const uint32 kNotifyProtocolsLogin = 'NTpl';
const uint32 kNotifyContactStatus = 'NTcl';
PreferencesBehavior::PreferencesBehavior()
: BView("Behavior", B_WILL_DRAW)
: BView("Behavior", B_WILL_DRAW)
{
fOnIncoming = new BStringView("onIncoming", "On incoming message...");
@ -42,13 +42,13 @@ PreferencesBehavior::PreferencesBehavior()
"Move window to current workspace",
new BMessage(kToCurrentWorkspace));
fFocusOnMessageReceived = new BCheckBox("FocusOnMessageReceived",
"Get focus when a message is received",
new BMessage(kFocusOnMessageReceived));
fRaiseOnMessageReceived = new BCheckBox("FocusOnMessageReceived",
"Auto-raise when a message is received",
new BMessage(kRaiseOnMessageReceived));
fFocusUserIsTyping = new BCheckBox("FocusUserIsTyping",
"Get focus when user is typing",
new BMessage(kFocusUserIsTyping));
fRaiseUserIsTyping = new BCheckBox("FocusUserIsTyping",
"Auto-raise when user is typing",
new BMessage(kRaiseUserIsTyping));
fPlaySoundOnMessageReceived = new BCheckBox("PlaySoundOnMessageReceived",
"Play sound event", NULL);
@ -82,8 +82,8 @@ PreferencesBehavior::PreferencesBehavior()
.Add(fOnIncoming)
.AddGroup(B_VERTICAL, spacing)
.Add(fToCurrentWorkspace)
.Add(fFocusOnMessageReceived)
.Add(fFocusUserIsTyping)
.Add(fRaiseOnMessageReceived)
.Add(fRaiseUserIsTyping)
.Add(fMarkUnreadWindow)
.Add(fMarkUnreadReplicant)
.Add(fPlaySoundOnMessageReceived)
@ -106,17 +106,17 @@ void
PreferencesBehavior::AttachedToWindow()
{
fToCurrentWorkspace->SetTarget(this);
fFocusUserIsTyping->SetTarget(this);
fFocusOnMessageReceived->SetTarget(this);
fRaiseUserIsTyping->SetTarget(this);
fRaiseOnMessageReceived->SetTarget(this);
fNotifyProtocols->SetTarget(this);
fNotifyContactStatus->SetTarget(this);
fToCurrentWorkspace->SetValue(
CayaPreferences::Item()->MoveToCurrentWorkspace);
fFocusUserIsTyping->SetValue(
CayaPreferences::Item()->FocusUserIsTyping);
fFocusOnMessageReceived->SetValue(
CayaPreferences::Item()->FocusOnMessageReceived);
fRaiseUserIsTyping->SetValue(
CayaPreferences::Item()->RaiseUserIsTyping);
fRaiseOnMessageReceived->SetValue(
CayaPreferences::Item()->RaiseOnMessageReceived);
fNotifyProtocols->SetValue(
CayaPreferences::Item()->NotifyProtocolStatus);
fNotifyContactStatus->SetValue(
@ -132,13 +132,13 @@ PreferencesBehavior::MessageReceived(BMessage* message)
CayaPreferences::Item()->MoveToCurrentWorkspace
= fToCurrentWorkspace->Value();
break;
case kFocusOnMessageReceived:
CayaPreferences::Item()->FocusOnMessageReceived
= fFocusOnMessageReceived->Value();
case kRaiseOnMessageReceived:
CayaPreferences::Item()->RaiseOnMessageReceived
= fRaiseOnMessageReceived->Value();
break;
case kFocusUserIsTyping:
CayaPreferences::Item()->FocusUserIsTyping
= fFocusUserIsTyping->Value();
case kRaiseUserIsTyping:
CayaPreferences::Item()->RaiseUserIsTyping
= fRaiseUserIsTyping->Value();
break;
case kNotifyProtocolsLogin:
CayaPreferences::Item()->NotifyProtocolStatus

View File

@ -22,8 +22,8 @@ private:
BStringView* fOnIncoming;
BCheckBox* fToCurrentWorkspace;
BCheckBox* fFocusOnMessageReceived;
BCheckBox* fFocusUserIsTyping;
BCheckBox* fRaiseOnMessageReceived;
BCheckBox* fRaiseUserIsTyping;
BCheckBox* fPlaySoundOnMessageReceived;
BCheckBox* fMarkUnreadWindow;
BCheckBox* fMarkUnreadReplicant;