1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sd.hxx" 26 27 #include "tools/IdleDetection.hxx" 28 29 #include "ViewShell.hxx" 30 #include "slideshow.hxx" 31 #include "ViewShellBase.hxx" 32 33 #include <vcl/window.hxx> 34 #include <sfx2/viewfrm.hxx> 35 36 #include <com/sun/star/frame/XFrame.hdl> 37 #include <vcl/svapp.hxx> 38 39 using namespace ::com::sun::star; 40 41 namespace sd { namespace tools { 42 43 44 sal_Int32 IdleDetection::GetIdleState (const ::Window* pWindow) 45 { 46 sal_Int32 nResult (CheckInputPending() | CheckSlideShowRunning()); 47 if (pWindow != NULL) 48 nResult |= CheckWindowPainting(*pWindow); 49 return nResult; 50 } 51 52 53 54 55 sal_Int32 IdleDetection::CheckInputPending (void) 56 { 57 if (GetpApp()->AnyInput(INPUT_MOUSE | INPUT_KEYBOARD | INPUT_PAINT)) 58 return IDET_SYSTEM_EVENT_PENDING; 59 else 60 return IDET_IDLE; 61 } 62 63 64 65 66 sal_Int32 IdleDetection::CheckSlideShowRunning (void) 67 { 68 sal_Int32 eResult (IDET_IDLE); 69 70 bool bIsSlideShowShowing = false; 71 72 // Iterate over all view frames. 73 SfxViewFrame* pViewFrame = SfxViewFrame::GetFirst(); 74 for (pViewFrame = SfxViewFrame::GetFirst(); 75 pViewFrame!=NULL && !bIsSlideShowShowing; 76 pViewFrame = SfxViewFrame::GetNext(*pViewFrame)) 77 { 78 // Ignore the current frame when it does not exist, is not valid, or 79 // is not active. 80 bool bIgnoreFrame (true); 81 uno::Reference<frame::XFrame> xFrame (pViewFrame->GetFrame().GetFrameInterface()); 82 try 83 { 84 if (xFrame.is() && xFrame->isActive()) 85 bIgnoreFrame = false; 86 } 87 catch (uno::RuntimeException e) 88 { 89 (void) e; 90 } 91 if (bIgnoreFrame) 92 continue; 93 94 // Get sd::ViewShell from active frame. 95 ViewShellBase* pBase = ViewShellBase::GetViewShellBase(pViewFrame); 96 if (pBase != NULL) 97 { 98 rtl::Reference< SlideShow > xSlideShow( SlideShow::GetSlideShow( *pBase ) ); 99 if( xSlideShow.is() && xSlideShow->isRunning() ) 100 { 101 if (xSlideShow->isFullScreen()) 102 eResult |= IDET_FULL_SCREEN_SHOW_ACTIVE; 103 else 104 eResult |= IDET_WINDOW_SHOW_ACTIVE; 105 } 106 } 107 } 108 109 return eResult; 110 } 111 112 113 114 115 sal_Int32 IdleDetection::CheckWindowPainting (const ::Window& rWindow) 116 { 117 if (rWindow.IsInPaint()) 118 return IDET_WINDOW_PAINTING; 119 else 120 return IDET_IDLE; 121 } 122 123 } } // end of namespace ::sd::tools 124