Skip to content

Commit 7bb6a3e

Browse files
committed
- More robust operations when RDP remote host
- Option to power off devices during RDP - Some additional help texts in the options dialog - Bugfixes and optimisations
1 parent 63d552c commit 7bb6a3e

10 files changed

Lines changed: 250 additions & 82 deletions

File tree

LGTV Companion Service/Service.cpp

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,11 +410,13 @@ DWORD SvcCtrlHandler(DWORD dwCtrl, DWORD dwEventType, LPVOID lpEventData, LPVOI
410410
EventCallbackStatus = NULL;;
411411
Log("** System resumed from low power state (Automatic).");
412412
DispatchSystemPowerEvent(SYSTEM_EVENT_RESUMEAUTO);
413+
Prefs.DisplayIsCurrentlyRequestedPoweredOnByWindows = true;
413414
break;
414415
case PBT_APMRESUMESUSPEND:
415416
EventCallbackStatus = NULL;;
416417
Log("** System resumed from low power state.");
417418
DispatchSystemPowerEvent(SYSTEM_EVENT_RESUME);
419+
Prefs.DisplayIsCurrentlyRequestedPoweredOnByWindows = true;
418420
break;
419421
case PBT_APMSUSPEND:
420422

@@ -427,16 +429,19 @@ DWORD SvcCtrlHandler(DWORD dwCtrl, DWORD dwEventType, LPVOID lpEventData, LPVOI
427429
{
428430
Log("** System is shutting down (low power mode).");
429431
DispatchSystemPowerEvent(SYSTEM_EVENT_SUSPEND);
432+
Prefs.DisplayIsCurrentlyRequestedPoweredOnByWindows = false;
430433
}
431434
else if (EventCallbackStatus == SYSTEM_EVENT_UNSURE)
432435
{
433436
Log("WARNING! Unable to determine if system is shutting down or restarting. Please check 'additional settings' in the UI.");
434437
DispatchSystemPowerEvent(SYSTEM_EVENT_UNSURE);
438+
Prefs.DisplayIsCurrentlyRequestedPoweredOnByWindows = false;
435439
}
436440
else
437441
{
438442
Log("** System is suspending to a low power state.");
439443
DispatchSystemPowerEvent(SYSTEM_EVENT_SUSPEND);
444+
Prefs.DisplayIsCurrentlyRequestedPoweredOnByWindows = false;
440445
}
441446
break;
442447
case PBT_POWERSETTINGCHANGE:
@@ -451,16 +456,19 @@ DWORD SvcCtrlHandler(DWORD dwCtrl, DWORD dwEventType, LPVOID lpEventData, LPVOI
451456
{
452457
Log("** System requests displays OFF.");
453458
DispatchSystemPowerEvent(SYSTEM_EVENT_DISPLAYOFF);
459+
Prefs.DisplayIsCurrentlyRequestedPoweredOnByWindows = false;
454460
}
455461
else if (PBS->Data[0] == 2)
456462
{
457463
Log("** System requests displays OFF(DIMMED).");
458464
DispatchSystemPowerEvent(SYSTEM_EVENT_DISPLAYDIMMED);
465+
Prefs.DisplayIsCurrentlyRequestedPoweredOnByWindows = false;
459466
}
460467
else
461468
{
462469
Log("** System requests displays ON.");
463470
DispatchSystemPowerEvent(SYSTEM_EVENT_DISPLAYON);
471+
Prefs.DisplayIsCurrentlyRequestedPoweredOnByWindows = true;
464472
}
465473
}
466474
else
@@ -493,17 +501,20 @@ DWORD SvcCtrlHandler(DWORD dwCtrl, DWORD dwEventType, LPVOID lpEventData, LPVOI
493501
{
494502
Log("** System is shutting down.");
495503
DispatchSystemPowerEvent(SYSTEM_EVENT_SHUTDOWN);
504+
Prefs.DisplayIsCurrentlyRequestedPoweredOnByWindows = false;
496505
}
497506
else if (EventCallbackStatus == SYSTEM_EVENT_UNSURE)
498507
{
499508
Log("WARNING! Unable to determine if system is shutting down or restarting. Please check 'additional settings in the UI.");
500509
DispatchSystemPowerEvent(SYSTEM_EVENT_UNSURE);
510+
Prefs.DisplayIsCurrentlyRequestedPoweredOnByWindows = false;
501511
}
502512
else
503513
{
504514
//This does happen sometimes, probably for timing reasons when shutting down the system.
505515
Log("WARNING! The application did not receive an Event Subscription Callback prior to system shutting down. Unable to determine if system is shutting down or restarting.");
506516
DispatchSystemPowerEvent(SYSTEM_EVENT_UNSURE);
517+
Prefs.DisplayIsCurrentlyRequestedPoweredOnByWindows = false;
507518
}
508519

509520
ReportSvcStatus(SERVICE_STOP_PENDING, NO_ERROR, 20000);
@@ -693,6 +704,10 @@ bool ReadConfigFile()
693704
if (!j.empty() && j.is_number())
694705
Prefs.BlankScreenWhenIdleDelay = j.get<int>();
695706

707+
j = jsonPrefs[JSON_PREFS_NODE][JSON_RDP_POWEROFF];
708+
if (!j.empty() && j.is_boolean())
709+
Prefs.PowerOffDuringRDP = j.get<bool>();
710+
696711
Log(st);
697712
Log("Configuration file successfully read");
698713
Log(ty);
@@ -1064,7 +1079,51 @@ void IPCThread(void)
10641079
Log("IPC, User is idle.");
10651080
DispatchSystemPowerEvent(SYSTEM_EVENT_USERIDLE);
10661081
}
1067-
1082+
else if (param == "remoteconnect_busy")
1083+
{
1084+
if (Prefs.PowerOffDuringRDP)
1085+
{
1086+
Log("IPC, Remote session connected. User idle management disabled, Powering off managed displays.");
1087+
DispatchSystemPowerEvent(SYSTEM_EVENT_DISPLAYOFF);
1088+
}
1089+
else
1090+
Log("IPC, Remote session connected. User idle management disabled.");
1091+
}
1092+
else if (param == "remoteconnect_idle")
1093+
{
1094+
if (Prefs.PowerOffDuringRDP)
1095+
{
1096+
Log("IPC, Remote session connected. User idle management disabled. Powering off managed displays.");
1097+
DispatchSystemPowerEvent(SYSTEM_EVENT_DISPLAYOFF);
1098+
}
1099+
else
1100+
{
1101+
Log("IPC, Remote session connected. User idle management disabled");
1102+
DispatchSystemPowerEvent(SYSTEM_EVENT_UNBLANK);
1103+
}
1104+
}
1105+
else if (param == "remoteconnect")
1106+
{
1107+
if (Prefs.PowerOffDuringRDP)
1108+
{
1109+
Log("IPC, Remote session connected. Powering off managed displays.");
1110+
DispatchSystemPowerEvent(SYSTEM_EVENT_DISPLAYOFF);
1111+
}
1112+
else
1113+
Log("IPC, Remote session connected.");
1114+
}
1115+
else if (param == "remotedisconnect")
1116+
{
1117+
if (Prefs.DisplayIsCurrentlyRequestedPoweredOnByWindows)
1118+
{
1119+
Log("IPC, Remote session disconnected. Powering on managed displays.");
1120+
DispatchSystemPowerEvent(SYSTEM_EVENT_DISPLAYON);
1121+
}
1122+
else
1123+
{
1124+
Log("IPC, Remote session disconnected.");
1125+
}
1126+
}
10681127
}
10691128
else
10701129
{

LGTV Companion Service/Service.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
#pragma comment(lib, "Iphlpapi.lib")
3838

3939
#define APPNAME L"LGTV Companion"
40-
#define APPVERSION L"1.6.2"
40+
#define APPVERSION L"1.7.0"
4141
#define SVCNAME L"LGTVsvc"
4242
#define SVCDISPLAYNAME L"LGTV Companion Service"
4343
#define SERVICE_PORT "3000"
@@ -52,6 +52,7 @@
5252
#define DEFAULT_SHUTDOWN {"shutdown","power off"}
5353
#define JSON_IDLEBLANK "BlankWhenIdle"
5454
#define JSON_IDLEBLANKDELAY "BlankWhenIdleDelay"
55+
#define JSON_RDP_POWEROFF "PowerOffDuringRDP"
5556

5657
#define SERVICE_DEPENDENCIES L"Dhcp\0Dnscache\0LanmanServer\0\0"
5758
#define SERVICE_ACCOUNT NULL //L"NT AUTHORITY\\LocalService"
@@ -75,6 +76,7 @@
7576
#define SYSTEM_EVENT_USERIDLE 14
7677
#define SYSTEM_EVENT_FORCESETHDMI 15
7778
#define SYSTEM_EVENT_BOOT 16
79+
#define SYSTEM_EVENT_UNBLANK 17
7880

7981
#define APP_CMDLINE_ON 1
8082
#define APP_CMDLINE_OFF 2
@@ -116,6 +118,9 @@ struct PREFS {
116118
int PowerOnTimeout = 40;
117119
bool BlankWhenIdle = false;
118120
int BlankScreenWhenIdleDelay = 10;
121+
bool PowerOffDuringRDP = false;
122+
bool DisplayIsCurrentlyRequestedPoweredOnByWindows = false;
123+
119124
};
120125

121126
struct SESSIONPARAMETERS {
@@ -134,6 +139,7 @@ struct SESSIONPARAMETERS {
134139
int BlankScreenWhenIdleDelay = 10;
135140
bool SetHDMIInputOnResume = false;
136141
int SetHDMIInputOnResumeToNumber = 1;
142+
137143
};
138144

139145
class CSession {
@@ -152,7 +158,7 @@ class CSession {
152158
bool ThreadedOpDisplayOff = false;
153159
bool ThreadedOpDisplaySetHdmiInput = false;
154160
time_t ThreadedOpDisplayOffTime = 0;
155-
void TurnOnDisplay(void);
161+
void TurnOnDisplay(bool SendWOL);
156162
void TurnOffDisplay(bool forced, bool dimmed, bool blankscreen);
157163
void SetDisplayHdmiInput(int HdmiInput);
158164

@@ -177,7 +183,7 @@ void Log(std::string);
177183
DWORD WINAPI SubCallback(EVT_SUBSCRIBE_NOTIFY_ACTION Action, PVOID UserContext, EVT_HANDLE Event);
178184
std::wstring widen(std::string);
179185
std::string narrow(std::wstring);
180-
void DisplayPowerOnThread(SESSIONPARAMETERS *, bool *, int);
186+
void DisplayPowerOnThread(SESSIONPARAMETERS *, bool *, int, bool);
181187
void DisplayPowerOffThread(SESSIONPARAMETERS*, bool *, bool, bool);
182188
void SetDisplayHdmiInputThread(SESSIONPARAMETERS*, bool*, int, int);
183189

LGTV Companion Service/Session.cpp

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ void CSession::SetDisplayHdmiInput(int HdmiInput)
156156
Log(s);
157157
return;
158158
}
159-
void CSession::TurnOnDisplay()
159+
void CSession::TurnOnDisplay(bool SendWOL)
160160
{
161161
string s;
162162

@@ -175,7 +175,7 @@ void CSession::TurnOnDisplay()
175175
ThreadedOpDisplayOn = true;
176176
// ThreadedOperationsTimeStamp = time(0);
177177

178-
thread thread_obj(DisplayPowerOnThread, &Parameters, &ThreadedOpDisplayOn, Parameters.PowerOnTimeout);
178+
thread thread_obj(DisplayPowerOnThread, &Parameters, &ThreadedOpDisplayOn, Parameters.PowerOnTimeout, SendWOL);
179179
thread_obj.detach();
180180
}
181181
else
@@ -233,7 +233,7 @@ void CSession::SystemEvent(DWORD dwMsg, int param)
233233
{
234234
// forced events are always processed, i.e. the user has issued this command.
235235
if (dwMsg == SYSTEM_EVENT_FORCEON)
236-
TurnOnDisplay();
236+
TurnOnDisplay(true);
237237
if (dwMsg == SYSTEM_EVENT_FORCEOFF)
238238
TurnOffDisplay(true, false, false);
239239
if (dwMsg == SYSTEM_EVENT_FORCESCREENOFF)
@@ -279,7 +279,7 @@ void CSession::SystemEvent(DWORD dwMsg, int param)
279279

280280
case SYSTEM_EVENT_DISPLAYON:
281281
{
282-
TurnOnDisplay();
282+
TurnOnDisplay(true);
283283
}break;
284284
case SYSTEM_EVENT_DISPLAYOFF:
285285
{
@@ -297,18 +297,22 @@ void CSession::SystemEvent(DWORD dwMsg, int param)
297297
case SYSTEM_EVENT_USERBUSY:
298298
{
299299
if(Parameters.BlankWhenIdle)
300-
TurnOnDisplay();
300+
TurnOnDisplay(true);
301301
}break;
302302
case SYSTEM_EVENT_BOOT:
303303
{
304304
if (Parameters.SetHDMIInputOnResume)
305305
SetDisplayHdmiInput(Parameters.SetHDMIInputOnResumeToNumber);
306306
}break;
307+
case SYSTEM_EVENT_UNBLANK:
308+
{
309+
TurnOnDisplay(false);
310+
}break;
307311
default:break;
308312
}
309313
}
310314
// THREAD: Spawned when the device should power ON. This thread manages the pairing key from the display and verifies that the display has been powered on
311-
void DisplayPowerOnThread(SESSIONPARAMETERS * CallingSessionParameters, bool * CallingSessionThreadRunning, int Timeout)
315+
void DisplayPowerOnThread(SESSIONPARAMETERS * CallingSessionParameters, bool * CallingSessionThreadRunning, int Timeout, bool SendWOL)
312316
{
313317
string screenonmess = "{ \"id\":\"2\",\"type\" : \"request\",\"uri\" : \"ssap://com.webos.service.tvpower/power/turnOnScreen\"}";
314318

@@ -323,8 +327,11 @@ void DisplayPowerOnThread(SESSIONPARAMETERS * CallingSessionParameters, bool * C
323327
string handshake;
324328
time_t origtim = time(0);
325329

326-
thread wolthread(WOLthread, CallingSessionParameters, CallingSessionThreadRunning, Timeout);
327-
wolthread.detach();
330+
if (SendWOL)
331+
{
332+
thread wolthread(WOLthread, CallingSessionParameters, CallingSessionThreadRunning, Timeout);
333+
wolthread.detach();
334+
}
328335

329336
// build the appropriate WebOS handshake
330337
if (key == "")

LGTV Companion Setup/Product.wxs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
44
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
55
<?define LGTV Companion Service_TargetDir=$(var.LGTV Companion Service.TargetDir)?><?define LGTV Companion UI_TargetDir=$(var.LGTV Companion UI.TargetDir)?>
6-
<Product Id="135A627A-1B23-4D62-9E93-5C827E59BEC1" Name="LGTV Companion" Language="1033" Version="1.6.2" Manufacturer="J Persson" UpgradeCode="0BA17E5B-11CE-491D-B1A1-05DD2D9F610A">
6+
<Product Id="9AD205C9-ACBF-4A46-9D1F-80A95DF34F2B" Name="LGTV Companion" Language="1033" Version="1.7.0" Manufacturer="J Persson" UpgradeCode="0BA17E5B-11CE-491D-B1A1-05DD2D9F610A">
77
<Package Id="*" InstallerVersion="301" Compressed="yes" InstallScope="perMachine" Platform='x64' Description="LGTV Companion installer" InstallPrivileges="elevated" AdminImage="yes"/>
88
<Media Id="1" Cabinet="LGTVapp.cab" EmbedCab="yes" />
99

0 commit comments

Comments
 (0)