From 8a78d1312d2a7d25aabc4b2fd082891e4714dbb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20P=C3=B6sel?= Date: Tue, 9 Dec 2014 17:08:24 +0000 Subject: Steam: Show xstatus as extra icon in clist (step 3) git-svn-id: http://svn.miranda-ng.org/main/trunk@11303 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/Steam/src/common.h | 3 +++ protocols/Steam/src/stdafx.cpp | 9 +++++++++ protocols/Steam/src/steam_contacts.cpp | 22 +++++++++++++++++++--- protocols/Steam/src/steam_pooling.cpp | 2 +- protocols/Steam/src/steam_proto.cpp | 1 - protocols/Steam/src/steam_proto.h | 1 + protocols/Steam/src/steam_xstatus.cpp | 8 ++++++++ 7 files changed, 41 insertions(+), 5 deletions(-) (limited to 'protocols/Steam/src') diff --git a/protocols/Steam/src/common.h b/protocols/Steam/src/common.h index 37822139b9..d19f25ab3e 100644 --- a/protocols/Steam/src/common.h +++ b/protocols/Steam/src/common.h @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -42,6 +43,8 @@ class CSteamProto; extern HINSTANCE g_hInstance; +extern HANDLE hExtraXStatus; + #include "Steam\steam.h" #include "steam_proto.h" diff --git a/protocols/Steam/src/stdafx.cpp b/protocols/Steam/src/stdafx.cpp index d51a866ca3..7c6793d8cb 100644 --- a/protocols/Steam/src/stdafx.cpp +++ b/protocols/Steam/src/stdafx.cpp @@ -3,6 +3,8 @@ int hLangpack; HINSTANCE g_hInstance; +HANDLE hExtraXStatus; + PLUGININFOEX pluginInfo = { sizeof(PLUGININFOEX), @@ -43,6 +45,13 @@ extern "C" int __declspec(dllexport) Load(void) pd.fnUninit = (pfnUninitProto)CSteamProto::UninitProtoInstance; CallService(MS_PROTO_REGISTERMODULE, 0, (LPARAM)&pd); + char iconName[100]; + mir_snprintf(iconName, SIZEOF(iconName), "%s_%s", MODULE, "gaming"); + + // extra statuses + HookEvent(ME_SKIN2_ICONSCHANGED, OnReloadIcons); + hExtraXStatus = ExtraIcon_Register("steam_game", LPGEN("Steam game"), iconName); + CSteamProto::InitMenus(); return 0; diff --git a/protocols/Steam/src/steam_contacts.cpp b/protocols/Steam/src/steam_contacts.cpp index 25720b1d05..a950b8b436 100644 --- a/protocols/Steam/src/steam_contacts.cpp +++ b/protocols/Steam/src/steam_contacts.cpp @@ -4,7 +4,19 @@ void CSteamProto::SetContactStatus(MCONTACT hContact, WORD status) { WORD oldStatus = getWord(hContact, "Status", ID_STATUS_OFFLINE); if (oldStatus != status) + { setWord(hContact, "Status", status); + + // If contact is offline, clear also xstatus + if (status == ID_STATUS_OFFLINE) + { + delSetting(hContact, "XStatusId"); + delSetting(hContact, "XStatusName"); + delSetting(hContact, "XStatusMsg"); + + SetContactExtraIcon(hContact, NULL); + } + } } void CSteamProto::SetAllContactsStatus(WORD status) @@ -13,8 +25,8 @@ void CSteamProto::SetAllContactsStatus(WORD status) { if (this->isChatRoom(hContact)) continue; - //if (this->IsContactOnline(hContact)) - setWord(hContact, "Status", status); + + SetContactStatus(hContact, status); } } @@ -190,6 +202,8 @@ void CSteamProto::UpdateContact(MCONTACT hContact, JSONNODE *data) setDword(hContact, "XStatusId", gameId); setTString(hContact, "XStatusName", TranslateT("Playing")); setTString(hContact, "XStatusMsg", message); + + SetContactExtraIcon(hContact, gameId); } else { @@ -200,6 +214,8 @@ void CSteamProto::UpdateContact(MCONTACT hContact, JSONNODE *data) delSetting(hContact, "XStatusId"); delSetting(hContact, "XStatusName"); delSetting(hContact, "XStatusMsg"); + + SetContactExtraIcon(hContact, NULL); } } @@ -209,7 +225,7 @@ void CSteamProto::ContactIsRemoved(MCONTACT hContact) { setByte(hContact, "Auth", 1); setDword(hContact, "DeletedTS", ::time(NULL)); - setWord(hContact, "Status", ID_STATUS_OFFLINE); + SetContactStatus(hContact, ID_STATUS_OFFLINE); ptrT nick(getTStringA(hContact, "Nick")); TCHAR message[MAX_PATH]; diff --git a/protocols/Steam/src/steam_pooling.cpp b/protocols/Steam/src/steam_pooling.cpp index ff21a8e9c2..efdd6514f3 100644 --- a/protocols/Steam/src/steam_pooling.cpp +++ b/protocols/Steam/src/steam_pooling.cpp @@ -84,7 +84,7 @@ void CSteamProto::ParsePollData(JSONNODE *data) if (hContact == NULL) continue; // probably this is info about random player playing on same server, so we ignore it - setWord(hContact, "Status", status); + SetContactStatus(hContact, status); node = json_get(item, "persona_name"); setTString(hContact, "Nick", json_as_string(node)); diff --git a/protocols/Steam/src/steam_proto.cpp b/protocols/Steam/src/steam_proto.cpp index 2cb802c9fd..952e74b4e2 100644 --- a/protocols/Steam/src/steam_proto.cpp +++ b/protocols/Steam/src/steam_proto.cpp @@ -62,7 +62,6 @@ CSteamProto::CSteamProto(const char* protoName, const TCHAR* userName) : CreateProtoService(PS_GETCUSTOMSTATUSEX, &CSteamProto::OnGetXStatusEx); CreateProtoService(PS_GETCUSTOMSTATUSICON, &CSteamProto::OnGetXStatusIcon); CreateProtoService(PS_GETADVANCEDSTATUSICON, &CSteamProto::OnRequestAdvStatusIconIdx); - HookEvent(ME_SKIN2_ICONSCHANGED, OnReloadIcons); } CSteamProto::~CSteamProto() diff --git a/protocols/Steam/src/steam_proto.h b/protocols/Steam/src/steam_proto.h index d3c5b65b0a..0b1b2c0d20 100644 --- a/protocols/Steam/src/steam_proto.h +++ b/protocols/Steam/src/steam_proto.h @@ -292,5 +292,6 @@ protected: }; int OnReloadIcons(WPARAM wParam, LPARAM lParam); +void SetContactExtraIcon(MCONTACT hContact, int status); #endif //_STEAM_PROTO_H_ \ No newline at end of file diff --git a/protocols/Steam/src/steam_xstatus.cpp b/protocols/Steam/src/steam_xstatus.cpp index c67ddf5f6b..b157971331 100644 --- a/protocols/Steam/src/steam_xstatus.cpp +++ b/protocols/Steam/src/steam_xstatus.cpp @@ -17,6 +17,14 @@ int CSteamProto::GetContactXStatus(MCONTACT hContact) return getDword(hContact, "XStatusId", 0) ? 1 : 0; } +void SetContactExtraIcon(MCONTACT hContact, int status) +{ + char iconName[100]; + mir_snprintf(iconName, SIZEOF(iconName), "%s_%s", MODULE, "gaming"); + + ExtraIcon_SetIcon(hExtraXStatus, hContact, (status > 0) ? Skin_GetIconHandle(iconName) : NULL); +} + INT_PTR CSteamProto::OnGetXStatusEx(WPARAM wParam, LPARAM lParam) { MCONTACT hContact = (MCONTACT)wParam; -- cgit v1.2.3