diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index 4db78f7a5..6554c033a 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -80,7 +80,8 @@ class Controller(object): if self.doc.is_active(): return if not self.doc.is_loaded(): - self.doc.load_presentation() + if not self.doc.load_presentation(): + return if self.is_live: self.doc.start_presentation() if self.doc.slidenumber > 1: diff --git a/openlp/plugins/presentations/lib/powerpointcontroller.py b/openlp/plugins/presentations/lib/powerpointcontroller.py index 4dc9e8f3a..f220f558a 100644 --- a/openlp/plugins/presentations/lib/powerpointcontroller.py +++ b/openlp/plugins/presentations/lib/powerpointcontroller.py @@ -77,8 +77,11 @@ class PowerpointController(PresentationController): """ Loads PowerPoint process """ - self.process = Dispatch(u'PowerPoint.Application') - self.process.Visible = True + log.debug(u'start_process') + if not self.process: + self.process = Dispatch(u'PowerPoint.Application') + if float(self.process.Version) < 13: + self.process.Visible = True self.process.WindowState = 2 def kill(self): @@ -120,13 +123,14 @@ class PowerpointDocument(PresentationDocument): ``presentation`` The file name of the presentations to run. """ - log.debug(u'LoadPresentation') + log.debug(u'load_presentation') if not self.controller.process or not self.controller.process.Visible: self.controller.start_process() try: self.controller.process.Presentations.Open(self.filepath, False, False, True) except pywintypes.com_error: + log.debug(u'PPT open failed') return False self.presentation = self.controller.process.Presentations( self.controller.process.Presentations.Count) @@ -145,6 +149,7 @@ class PowerpointDocument(PresentationDocument): However, for the moment, we want a physical file since it makes life easier elsewhere. """ + log.debug(u'create_thumbnails') if self.check_thumbnails(): return for num in range(0, self.presentation.Slides.Count): @@ -170,6 +175,7 @@ class PowerpointDocument(PresentationDocument): """ Returns ``True`` if a presentation is loaded. """ + log.debug(u'is_loaded') try: if not self.controller.process.Visible: return False @@ -186,6 +192,7 @@ class PowerpointDocument(PresentationDocument): """ Returns ``True`` if a presentation is currently active. """ + log.debug(u'is_active') if not self.is_loaded(): return False try: @@ -201,6 +208,7 @@ class PowerpointDocument(PresentationDocument): """ Unblanks (restores) the presentation. """ + log.debug(u'unblank_screen') self.presentation.SlideShowSettings.Run() self.presentation.SlideShowWindow.View.State = 1 self.presentation.SlideShowWindow.Activate() @@ -209,12 +217,14 @@ class PowerpointDocument(PresentationDocument): """ Blanks the screen. """ + log.debug(u'blank_screen') self.presentation.SlideShowWindow.View.State = 3 def is_blank(self): """ Returns ``True`` if screen is blank. """ + log.debug(u'is_blank') if self.is_active(): return self.presentation.SlideShowWindow.View.State == 3 else: @@ -224,6 +234,7 @@ class PowerpointDocument(PresentationDocument): """ Stops the current presentation and hides the output. """ + log.debug(u'stop_presentation') self.presentation.SlideShowWindow.View.Exit() if os.name == u'nt': @@ -231,6 +242,7 @@ class PowerpointDocument(PresentationDocument): """ Starts a presentation from the beginning. """ + log.debug(u'start_presentation') #SlideShowWindow measures its size/position by points, not pixels try: dpi = win32ui.GetActiveWindow().GetDC().GetDeviceCaps(88) @@ -253,30 +265,35 @@ class PowerpointDocument(PresentationDocument): """ Returns the current slide number. """ + log.debug(u'get_slide_number') return self.presentation.SlideShowWindow.View.CurrentShowPosition def get_slide_count(self): """ Returns total number of slides. """ + log.debug(u'get_slide_count') return self.presentation.Slides.Count def goto_slide(self, slideno): """ Moves to a specific slide in the presentation. """ + log.debug(u'goto_slide') self.presentation.SlideShowWindow.View.GotoSlide(slideno) def next_step(self): """ Triggers the next effect of slide on the running presentation. """ + log.debug(u'next_step') self.presentation.SlideShowWindow.View.Next() def previous_step(self): """ Triggers the previous slide on the running presentation. """ + log.debug(u'previous_step') self.presentation.SlideShowWindow.View.Previous() def get_slide_text(self, slide_no): diff --git a/openlp/plugins/presentations/lib/pptviewcontroller.py b/openlp/plugins/presentations/lib/pptviewcontroller.py index b97d22c03..e9130ea00 100644 --- a/openlp/plugins/presentations/lib/pptviewcontroller.py +++ b/openlp/plugins/presentations/lib/pptviewcontroller.py @@ -84,7 +84,8 @@ class PptviewController(PresentationController): dllpath = os.path.join(self.plugin.pluginManager.basepath, u'presentations', u'lib', u'pptviewlib', u'pptviewlib.dll') self.process = cdll.LoadLibrary(dllpath) - self.process.SetDebug(1) + if log.isEnabledFor(log.DEBUG): + self.process.SetDebug(1) def kill(self): """ diff --git a/openlp/plugins/presentations/lib/pptviewlib/ppttest.py b/openlp/plugins/presentations/lib/pptviewlib/ppttest.py index 1e10def7d..f8d0fabd9 100644 --- a/openlp/plugins/presentations/lib/pptviewlib/ppttest.py +++ b/openlp/plugins/presentations/lib/pptviewlib/ppttest.py @@ -133,7 +133,7 @@ class PPTViewer(QtGui.QWidget): def OpenClick(self): oldid = self.pptid; rect = RECT(100,100,900,700) - filename = unicode(self.PPTEdit.text()) + filename = str(self.PPTEdit.text().replace(u'/', u'\\')) print filename self.pptid = pptdll.OpenPPT(filename, None, rect, 'c:\\temp\\slide') print "id: " + unicode(self.pptid) diff --git a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp index de22e2d41..92b849797 100644 --- a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp +++ b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp @@ -27,31 +27,28 @@ #include #include "pptviewlib.h" - -// Because of the callbacks used by SetWindowsHookEx, the memory used needs to be -// sharable across processes (the callbacks are done from a different process) +// Because of the callbacks used by SetWindowsHookEx, the memory used needs to +// be sharable across processes (callbacks are done from a different process) // Therefore use data_seg with RWS memory. // -// See http://msdn.microsoft.com/en-us/library/aa366551(VS.85).aspx for alternative -// method of holding memory, removing fixed limits which would allow dynamic number -// of items, rather than a fixed number. Use a Local\ mapping, since global has UAC -// issues in Vista. +// See http://msdn.microsoft.com/en-us/library/aa366551(VS.85).aspx for +// alternative method of holding memory, removing fixed limits which would allow +// dynamic number of items, rather than a fixed number. Use a Local\ mapping, +// since global has UAC issues in Vista. + #pragma data_seg(".PPTVIEWLIB") -PPTVIEWOBJ pptviewobj[MAX_PPTOBJS] = {NULL}; -HHOOK globalhook = NULL; +PPTVIEW pptviews[MAX_PPTS] = {NULL}; +HHOOK global_hook = NULL; BOOL debug = FALSE; #pragma data_seg() #pragma comment(linker, "/SECTION:.PPTVIEWLIB,RWS") -#define DEBUG(...) if(debug) printf(__VA_ARGS__) +HINSTANCE h_instance = NULL; - -HINSTANCE hInstance = NULL; - -BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, - LPVOID lpReserved) +BOOL APIENTRY DllMain(HMODULE h_module, DWORD ul_reason_for_call, + LPVOID lp_reserved) { - hInstance = (HINSTANCE)hModule; + h_instance = (HINSTANCE)h_module; switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: @@ -67,25 +64,25 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, // Clean up... hopefully there is only the one process attached? // We'll find out soon enough during tests! DEBUG("PROCESS_DETACH\n"); - for(int i = 0; i.bmp" will be appended to complete the path. E.g. "c:\temp\slide" would // create "c:\temp\slide1.bmp" slide2.bmp, slide3.bmp etc. // It will also create a *info.txt containing information about the ppt -DllExport int OpenPPT(char *filename, HWND hParentWnd, RECT rect, - char *previewpath) +DllExport int OpenPPT(char *filename, HWND h_parent_wnd, RECT rect, + char *preview_path) { int id; - DEBUG("OpenPPT start: %s; %s\n", filename, previewpath); - DEBUG("OpenPPT start: %u; %i, %i, %i, %i\n", hParentWnd, rect.top, + DEBUG("OpenPPT start: %s; %s\n", filename, preview_path); + DEBUG("OpenPPT start: %u; %i, %i, %i, %i\n", h_parent_wnd, rect.top, rect.left, rect.bottom, rect.right); id = -1; - for(int i = 0; i < MAX_PPTOBJS; i++) + for(int i = 0; i < MAX_PPTS; i++) { - if(pptviewobj[i].state == PPT_CLOSED) + if(pptviews[i].state == PPT_CLOSED) { id = i; break; @@ -116,39 +113,43 @@ DllExport int OpenPPT(char *filename, HWND hParentWnd, RECT rect, DEBUG("OpenPPT: Too many PPTs\n"); return -1; } - BOOL gotinfo = InitPPTObject(id, filename, hParentWnd, rect, previewpath); + BOOL got_info = InitPPTObject(id, filename, h_parent_wnd, rect, + preview_path); if(!StartPPTView(id)) { ClosePPT(id); return -1; } - if(!gotinfo) + if(!got_info) { DEBUG("OpenPPT: Get info\n"); - pptviewobj[id].steps = 0; + pptviews[id].steps = 0; int steps = 0; - while(pptviewobj[id].state == PPT_OPENED) + while(pptviews[id].state == PPT_OPENED) { - if(steps <= pptviewobj[id].steps) + if(steps <= pptviews[id].steps) { Sleep(20); - DEBUG("OpenPPT: Step %d/%d\n",steps,pptviewobj[id].steps); + DEBUG("OpenPPT: Step %d/%d\n", steps, pptviews[id].steps); steps++; NextStep(id); } Sleep(10); } DEBUG("OpenPPT: Steps %d, first slide steps %d\n", - pptviewobj[id].steps,pptviewobj[id].firstSlideSteps); + pptviews[id].steps, pptviews[id].first_slide_steps); SavePPTInfo(id); - if(pptviewobj[id].state == PPT_CLOSING || pptviewobj[id].slideCount <= 0) + if(pptviews[id].state == PPT_CLOSING + || pptviews[id].slide_count <= 0) { - // We've gone off the end and pptview is closing. We'll need to start again + // We've gone off the end and pptview is closing. + // We'll need to start again ClosePPT(id); - gotinfo = InitPPTObject(id, filename, hParentWnd, rect, previewpath); - if(gotinfo) - gotinfo = StartPPTView(id); - if(!gotinfo) + got_info = InitPPTObject(id, filename, h_parent_wnd, rect, + preview_path); + if(got_info) + got_info = StartPPTView(id); + if(!got_info) { ClosePPT(id); return -1; @@ -157,55 +158,55 @@ DllExport int OpenPPT(char *filename, HWND hParentWnd, RECT rect, else RestartShow(id); } - if(gotinfo) + if(got_info) { DEBUG("OpenPPT: Info loaded, no refresh\n"); - pptviewobj[id].state = PPT_LOADED; + pptviews[id].state = PPT_LOADED; Resume(id); } - if(pptviewobj[id].mhook != NULL) - UnhookWindowsHookEx(pptviewobj[id].mhook); - pptviewobj[id].mhook = NULL; + if(pptviews[id].mhook != NULL) + UnhookWindowsHookEx(pptviews[id].mhook); + pptviews[id].mhook = NULL; DEBUG("OpenPPT: Exit: id=%i\n", id); return id; } -BOOL InitPPTObject(int id, char *filename, HWND hParentWnd, - RECT rect, char *previewpath) +BOOL InitPPTObject(int id, char *filename, HWND h_parent_wnd, + RECT rect, char *preview_path) { - DEBUG("InitPPTObject\n"); - memset(&pptviewobj[id], 0, sizeof(PPTVIEWOBJ)); - strcpy_s(pptviewobj[id].filename, MAX_PATH, filename); - strcpy_s(pptviewobj[id].previewpath, MAX_PATH, previewpath); - pptviewobj[id].state = PPT_CLOSED; - pptviewobj[id].slideCount = 0; - pptviewobj[id].currentSlide = 0; - pptviewobj[id].firstSlideSteps = 0; - pptviewobj[id].guess = 1; + DEBUG("InitPPTObject %d\n", id); + memset(&pptviews[id], 0, sizeof(pptviews)); + strcpy_s(pptviews[id].filename, MAX_PATH, filename); + strcpy_s(pptviews[id].preview_path, MAX_PATH, preview_path); + pptviews[id].state = PPT_CLOSED; + pptviews[id].slide_count = 0; + pptviews[id].current_slide = 0; + pptviews[id].first_slide_steps = 0; + pptviews[id].guess = 1; for(int i = 0; i < MAX_SLIDES; i++) - pptviewobj[id].slideNo[i] = 0; - pptviewobj[id].hParentWnd = hParentWnd; - pptviewobj[id].hWnd = NULL; - pptviewobj[id].hWnd2 = NULL; - if(hParentWnd != NULL && rect.top == 0 && rect.bottom == 0 + pptviews[id].slide_no[i] = 0; + pptviews[id].h_parent_wnd = h_parent_wnd; + pptviews[id].h_wnd = NULL; + pptviews[id].h_wnd_input = NULL; + if(h_parent_wnd != NULL && rect.top == 0 && rect.bottom == 0 && rect.left == 0 && rect.right == 0) { - LPRECT wndrect = NULL; - GetWindowRect(hParentWnd, wndrect); - pptviewobj[id].rect.top = 0; - pptviewobj[id].rect.left = 0; - pptviewobj[id].rect.bottom = wndrect->bottom-wndrect->top; - pptviewobj[id].rect.right = wndrect->right-wndrect->left; + LPRECT wnd_rect = NULL; + GetWindowRect(h_parent_wnd, wnd_rect); + pptviews[id].rect.top = 0; + pptviews[id].rect.left = 0; + pptviews[id].rect.bottom = wnd_rect->bottom - wnd_rect->top; + pptviews[id].rect.right = wnd_rect->right - wnd_rect->left; } else { - pptviewobj[id].rect.top = rect.top; - pptviewobj[id].rect.left = rect.left; - pptviewobj[id].rect.bottom = rect.bottom; - pptviewobj[id].rect.right = rect.right; + pptviews[id].rect.top = rect.top; + pptviews[id].rect.left = rect.left; + pptviews[id].rect.bottom = rect.bottom; + pptviews[id].rect.right = rect.right; } - BOOL gotinfo = GetPPTInfo(id); - return gotinfo; + BOOL got_info = GetPPTInfo(id); + return got_info; } BOOL StartPPTView(int id) { @@ -220,40 +221,41 @@ BOOL StartPPTView(int id) DEBUG("StartPPTView\n"); STARTUPINFO si; PROCESS_INFORMATION pi; - char cmdline[MAX_PATH * 2]; + char cmd_line[MAX_PATH * 2]; - if(globalhook != NULL) - UnhookWindowsHookEx(globalhook); - globalhook = SetWindowsHookEx(WH_CBT, CbtProc, hInstance, NULL); - if(globalhook == 0) + if(global_hook != NULL) + UnhookWindowsHookEx(global_hook); + global_hook = SetWindowsHookEx(WH_CBT, CbtProc, h_instance, NULL); + if(global_hook == 0) { DEBUG("OpenPPT: SetWindowsHookEx failed\n"); ClosePPT(id); return FALSE; } - if(GetPPTViewerPath(cmdline, sizeof(cmdline)) == FALSE) + if(GetPPTViewerPath(cmd_line, sizeof(cmd_line)) == FALSE) { DEBUG("OpenPPT: GetPPTViewerPath failed\n"); return FALSE; } - pptviewobj[id].state = PPT_STARTED; + pptviews[id].state = PPT_STARTED; Sleep(10); - strcat_s(cmdline, MAX_PATH * 2, "/F /S \""); - strcat_s(cmdline, MAX_PATH * 2, pptviewobj[id].filename); - strcat_s(cmdline, MAX_PATH * 2, "\""); + strcat_s(cmd_line, MAX_PATH * 2, "/F /S \""); + strcat_s(cmd_line, MAX_PATH * 2, pptviews[id].filename); + strcat_s(cmd_line, MAX_PATH * 2, "\""); memset(&si, 0, sizeof(si)); memset(&pi, 0, sizeof(pi)); - if(!CreateProcess(NULL, cmdline, NULL, NULL, FALSE, 0, 0, NULL, &si, &pi)) + DEBUG("Command: %s\n", cmd_line); + if(!CreateProcess(NULL, cmd_line, NULL, NULL, FALSE, 0, 0, NULL, &si, &pi)) { DEBUG("OpenPPT: CreateProcess failed\n"); ClosePPT(id); return FALSE; } - pptviewobj[id].dwProcessId = pi.dwProcessId; - pptviewobj[id].dwThreadId = pi.dwThreadId; - pptviewobj[id].hThread = pi.hThread; - pptviewobj[id].hProcess = pi.hProcess; - while(pptviewobj[id].state == PPT_STARTED) + pptviews[id].dw_process_id = pi.dwProcessId; + pptviews[id].dw_thread_id = pi.dwThreadId; + pptviews[id].h_thread = pi.hThread; + pptviews[id].h_process = pi.hProcess; + while(pptviews[id].state == PPT_STARTED) Sleep(10); return TRUE; } @@ -267,67 +269,67 @@ BOOL StartPPTView(int id) // first slide steps BOOL GetPPTInfo(int id) { - struct _stat filestats; + struct _stat file_stats; char info[MAX_PATH]; - FILE* pFile; + FILE* p_file; char buf[100]; DEBUG("GetPPTInfo: start\n"); - if(_stat(pptviewobj[id].filename, &filestats) != 0) + if(_stat(pptviews[id].filename, &file_stats) != 0) return FALSE; - sprintf_s(info, MAX_PATH, "%sinfo.txt", pptviewobj[id].previewpath); - int err = fopen_s(&pFile, info, "r"); + sprintf_s(info, MAX_PATH, "%sinfo.txt", pptviews[id].preview_path); + int err = fopen_s(&p_file, info, "r"); if(err != 0) { DEBUG("GetPPTInfo: file open failed - %d\n", err); return FALSE; } - fgets(buf, 100, pFile); // version == 1 - fgets(buf, 100, pFile); - if(filestats.st_mtime != atoi(buf)) + fgets(buf, 100, p_file); // version == 1 + fgets(buf, 100, p_file); + if(file_stats.st_mtime != atoi(buf)) { - fclose (pFile); + fclose (p_file); return FALSE; } - fgets(buf, 100, pFile); - if(filestats.st_size != atoi(buf)) + fgets(buf, 100, p_file); + if(file_stats.st_size != atoi(buf)) { - fclose(pFile); + fclose(p_file); return FALSE; } - fgets(buf, 100, pFile); // slidecount - int slidecount = atoi(buf); - fgets(buf, 100, pFile); // first slide steps - int firstslidesteps = atoi(buf); + fgets(buf, 100, p_file); // slidecount + int slide_count = atoi(buf); + fgets(buf, 100, p_file); // first slide steps + int first_slide_steps = atoi(buf); // check all the preview images still exist - for(int i = 1; i <= slidecount; i++) + for(int i = 1; i <= slide_count; i++) { sprintf_s(info, MAX_PATH, "%s%i.bmp", - pptviewobj[id].previewpath, i); + pptviews[id].preview_path, i); if(GetFileAttributes(info) == INVALID_FILE_ATTRIBUTES) return FALSE; } - fclose(pFile); - pptviewobj[id].slideCount = slidecount; - pptviewobj[id].firstSlideSteps = firstslidesteps; + fclose(p_file); + pptviews[id].slide_count = slide_count; + pptviews[id].first_slide_steps = first_slide_steps; DEBUG("GetPPTInfo: exit ok\n"); return TRUE; } BOOL SavePPTInfo(int id) { - struct _stat filestats; + struct _stat file_stats; char info[MAX_PATH]; - FILE* pFile; + FILE* p_file; DEBUG("SavePPTInfo: start\n"); - if(_stat(pptviewobj[id].filename, &filestats) != 0) + if(_stat(pptviews[id].filename, &file_stats) != 0) { - DEBUG("SavePPTInfo: stat of %s failed\n", pptviewobj[id].filename); + DEBUG("SavePPTInfo: stat of %s failed\n", pptviews[id].filename); return FALSE; } - sprintf_s(info, MAX_PATH, "%sinfo.txt", pptviewobj[id].previewpath); - int err = fopen_s(&pFile, info, "w"); + sprintf_s(info, MAX_PATH, "%sinfo.txt", pptviews[id].preview_path); + int err = fopen_s(&p_file, info, "w"); if(err != 0) { DEBUG("SavePPTInfo: fopen of %s failed%i\n", info, err); @@ -337,48 +339,45 @@ BOOL SavePPTInfo(int id) { DEBUG("SavePPTInfo: fopen of %s succeeded\n", info); } - fprintf(pFile, "1\n"); - fprintf(pFile, "%u\n", filestats.st_mtime); - fprintf(pFile, "%u\n", filestats.st_size); - fprintf(pFile, "%u\n", pptviewobj[id].slideCount); - fprintf(pFile, "%u\n", pptviewobj[id].firstSlideSteps); - fclose (pFile); + fprintf(p_file, "1\n"); + fprintf(p_file, "%u\n", file_stats.st_mtime); + fprintf(p_file, "%u\n", file_stats.st_size); + fprintf(p_file, "%u\n", pptviews[id].slide_count); + fprintf(p_file, "%u\n", pptviews[id].first_slide_steps); + fclose(p_file); DEBUG("SavePPTInfo: exit ok\n"); return TRUE; } // Get the path of the PowerPoint viewer from the registry -BOOL GetPPTViewerPath(char *pptviewerpath, int strsize) +BOOL GetPPTViewerPath(char *pptviewer_path, int str_size) { - HKEY hkey; - DWORD dwtype, dwsize; - LRESULT lresult; + HKEY h_key; + DWORD dw_type, dw_size; + LRESULT l_result; DEBUG("GetPPTViewerPath: start\n"); - if(RegOpenKeyEx(HKEY_CLASSES_ROOT, + if((RegOpenKeyEx(HKEY_CLASSES_ROOT, "PowerPointViewer.Show.12\\shell\\Show\\command", - 0, KEY_READ, &hkey)!=ERROR_SUCCESS) - { - if(RegOpenKeyEx(HKEY_CLASSES_ROOT, - "Applications\\PPTVIEW.EXE\\shell\\open\\command", - 0, KEY_READ, &hkey) != ERROR_SUCCESS) - { - if(RegOpenKeyEx(HKEY_CLASSES_ROOT, - "Applications\\PPTVIEW.EXE\\shell\\Show\\command", - 0, KEY_READ, &hkey) != ERROR_SUCCESS) - { - return FALSE; - } - } - } - dwtype = REG_SZ; - dwsize = (DWORD)strsize; - lresult = RegQueryValueEx(hkey, NULL, NULL, &dwtype, - (LPBYTE)pptviewerpath, &dwsize); - RegCloseKey(hkey); - if(lresult != ERROR_SUCCESS) + 0, KEY_READ, &h_key) != ERROR_SUCCESS) + && (RegOpenKeyEx(HKEY_CLASSES_ROOT, + "Applications\\PPTVIEW.EXE\\shell\\open\\command", + 0, KEY_READ, &h_key) != ERROR_SUCCESS) + && (RegOpenKeyEx(HKEY_CLASSES_ROOT, + "Applications\\PPTVIEW.EXE\\shell\\Show\\command", + 0, KEY_READ, &h_key) != ERROR_SUCCESS)) + { + return FALSE; + } + dw_type = REG_SZ; + dw_size = (DWORD)str_size; + l_result = RegQueryValueEx(h_key, NULL, NULL, &dw_type, + (LPBYTE)pptviewer_path, &dw_size); + RegCloseKey(h_key); + if(l_result != ERROR_SUCCESS) return FALSE; - pptviewerpath[strlen(pptviewerpath)-4] = '\0'; // remove "%1" from end of key value + // remove "%1" from the end of the key value + pptviewer_path[strlen(pptviewer_path) - 4] = '\0'; DEBUG("GetPPTViewerPath: exit ok\n"); return TRUE; } @@ -387,12 +386,12 @@ BOOL GetPPTViewerPath(char *pptviewerpath, int strsize) void Unhook(int id) { DEBUG("Unhook: start %d\n", id); - if(pptviewobj[id].hook != NULL) - UnhookWindowsHookEx(pptviewobj[id].hook); - if(pptviewobj[id].mhook != NULL) - UnhookWindowsHookEx(pptviewobj[id].mhook); - pptviewobj[id].hook = NULL; - pptviewobj[id].mhook = NULL; + if(pptviews[id].hook != NULL) + UnhookWindowsHookEx(pptviews[id].hook); + if(pptviews[id].mhook != NULL) + UnhookWindowsHookEx(pptviews[id].mhook); + pptviews[id].hook = NULL; + pptviews[id].mhook = NULL; DEBUG("Unhook: exit ok\n"); } @@ -400,15 +399,15 @@ void Unhook(int id) DllExport void ClosePPT(int id) { DEBUG("ClosePPT: start%d\n", id); - pptviewobj[id].state = PPT_CLOSED; + pptviews[id].state = PPT_CLOSED; Unhook(id); - if(pptviewobj[id].hWnd == 0) - TerminateThread(pptviewobj[id].hThread, 0); + if(pptviews[id].h_wnd == 0) + TerminateThread(pptviews[id].h_thread, 0); else - PostMessage(pptviewobj[id].hWnd, WM_CLOSE, 0, 0); - CloseHandle(pptviewobj[id].hThread); - CloseHandle(pptviewobj[id].hProcess); - memset(&pptviewobj[id], 0, sizeof(PPTVIEWOBJ)); + PostMessage(pptviews[id].h_wnd, WM_CLOSE, 0, 0); + CloseHandle(pptviews[id].h_thread); + CloseHandle(pptviews[id].h_process); + memset(&pptviews[id], 0, sizeof(pptviews)); DEBUG("ClosePPT: exit ok\n"); return; } @@ -416,59 +415,60 @@ DllExport void ClosePPT(int id) DllExport void Resume(int id) { DEBUG("Resume: %d\n", id); - MoveWindow(pptviewobj[id].hWnd, pptviewobj[id].rect.left, - pptviewobj[id].rect.top, - pptviewobj[id].rect.right - pptviewobj[id].rect.left, - pptviewobj[id].rect.bottom - pptviewobj[id].rect.top, TRUE); + MoveWindow(pptviews[id].h_wnd, pptviews[id].rect.left, + pptviews[id].rect.top, + pptviews[id].rect.right - pptviews[id].rect.left, + pptviews[id].rect.bottom - pptviews[id].rect.top, TRUE); Unblank(id); } // Moves the show off the screen so it can't be seen DllExport void Stop(int id) { DEBUG("Stop:%d\n", id); - MoveWindow(pptviewobj[id].hWnd, -32000, -32000, - pptviewobj[id].rect.right - pptviewobj[id].rect.left, - pptviewobj[id].rect.bottom - pptviewobj[id].rect.top, TRUE); + MoveWindow(pptviews[id].h_wnd, -32000, -32000, + pptviews[id].rect.right - pptviews[id].rect.left, + pptviews[id].rect.bottom - pptviews[id].rect.top, TRUE); } // Return the total number of slides DllExport int GetSlideCount(int id) { DEBUG("GetSlideCount:%d\n", id); - if(pptviewobj[id].state == 0) + if(pptviews[id].state == 0) return -1; else - return pptviewobj[id].slideCount; + return pptviews[id].slide_count; } // Return the number of the slide currently viewing DllExport int GetCurrentSlide(int id) { DEBUG("GetCurrentSlide:%d\n", id); - if(pptviewobj[id].state == 0) + if(pptviews[id].state == 0) return -1; else - return pptviewobj[id].currentSlide; + return pptviews[id].current_slide; } // Take a step forwards through the show DllExport void NextStep(int id) { - DEBUG("NextStep:%d (%d)\n", id, pptviewobj[id].currentSlide); - if(pptviewobj[id].currentSlide>pptviewobj[id].slideCount) + DEBUG("NextStep:%d (%d)\n", id, pptviews[id].current_slide); + if(pptviews[id].current_slide > pptviews[id].slide_count) return; - pptviewobj[id].guess = pptviewobj[id].currentSlide + 1; - PostMessage(pptviewobj[id].hWnd2, WM_MOUSEWHEEL, + pptviews[id].guess = pptviews[id].current_slide + 1; + PostMessage(pptviews[id].h_wnd_input, WM_MOUSEWHEEL, MAKEWPARAM(0, -WHEEL_DELTA), 0); } // Take a step backwards through the show DllExport void PrevStep(int id) { - DEBUG("PrevStep:%d (%d)\n", id, pptviewobj[id].currentSlide); - if(pptviewobj[id].currentSlide > 1) - pptviewobj[id].guess = pptviewobj[id].currentSlide - 1; - PostMessage(pptviewobj[id].hWnd2, WM_MOUSEWHEEL, MAKEWPARAM(0, WHEEL_DELTA), 0); + DEBUG("PrevStep:%d (%d)\n", id, pptviews[id].current_slide); + if(pptviews[id].current_slide > 1) + pptviews[id].guess = pptviews[id].current_slide - 1; + PostMessage(pptviews[id].h_wnd_input, WM_MOUSEWHEEL, + MAKEWPARAM(0, WHEEL_DELTA), 0); } // Blank the show (black screen) @@ -481,18 +481,22 @@ DllExport void Blank(int id) DEBUG("Blank:%d\n", id); HWND h1 = GetForegroundWindow(); HWND h2 = GetFocus(); - SetForegroundWindow(pptviewobj[id].hWnd); - SetFocus(pptviewobj[id].hWnd); - Sleep(50); // slight pause, otherwise event triggering this call may grab focus back! + SetForegroundWindow(pptviews[id].h_wnd); + SetFocus(pptviews[id].h_wnd); + // slight pause, otherwise event triggering this call may grab focus back! + Sleep(50); keybd_event((int)'A', 0, 0, 0); keybd_event((int)'A', 0, KEYEVENTF_KEYUP, 0); keybd_event((int)'B', 0, 0, 0); keybd_event((int)'B', 0, KEYEVENTF_KEYUP, 0); SetForegroundWindow(h1); SetFocus(h2); - //PostMessage(pptviewobj[id].hWnd2, WM_KEYDOWN, 'B', 0x00300001); - //PostMessage(pptviewobj[id].hWnd2, WM_CHAR, 'b', 0x00300001); - //PostMessage(pptviewobj[id].hWnd2, WM_KEYUP, 'B', 0xC0300001); + + // This is the preferred method, but didn't work. Keep it here for + // documentation if we revisit in the future + //PostMessage(pptviews[id].h_wnd_input, WM_KEYDOWN, 'B', 0x00300001); + //PostMessage(pptviews[id].h_wnd_input, WM_CHAR, 'b', 0x00300001); + //PostMessage(pptviews[id].h_wnd_input, WM_KEYUP, 'B', 0xC0300001); } // Unblank the show DllExport void Unblank(int id) @@ -500,38 +504,43 @@ DllExport void Unblank(int id) DEBUG("Unblank:%d\n", id); // Pressing any key resumes. // For some reason SendMessage works for unblanking, but not blanking. -// SendMessage(pptviewobj[id].hWnd2, WM_KEYDOWN, 'A', 0); - SendMessage(pptviewobj[id].hWnd2, WM_CHAR, 'A', 0); -// SendMessage(pptviewobj[id].hWnd2, WM_KEYUP, 'A', 0); -// HWND h1 = GetForegroundWindow(); -// HWND h2 = GetFocus(); -// Sleep(50); // slight pause, otherwise event triggering this call may grab focus back! -// SetForegroundWindow(pptviewobj[id].hWnd); -// SetFocus(pptviewobj[id].hWnd); -// keybd_event((int)'A', 0, 0, 0); -// SetForegroundWindow(h1); -// SetFocus(h2); + // However keep the commented code for documentation in case we want + // to revisit later. + + //SendMessage(pptviews[id].h_wnd_input, WM_KEYDOWN, 'A', 0); + SendMessage(pptviews[id].h_wnd_input, WM_CHAR, 'A', 0); + //SendMessage(pptviews[id].h_wnd_input, WM_KEYUP, 'A', 0); + //HWND h1 = GetForegroundWindow(); + //HWND h2 = GetFocus(); + ////slight pause, otherwise event triggering this call may grab focus back! + //Sleep(50); + //SetForegroundWindow(pptviews[id].h_wnd); + //SetFocus(pptviews[id].h_wnd); + //keybd_event((int)'A', 0, 0, 0); + //SetForegroundWindow(h1); + //SetFocus(h2); } // Go directly to a slide -DllExport void GotoSlide(int id, int slideno) +DllExport void GotoSlide(int id, int slide_no) { - DEBUG("GotoSlide %i %i:\n", id, slideno); + DEBUG("GotoSlide %i %i:\n", id, slide_no); // Did try WM_KEYDOWN/WM_CHAR/WM_KEYUP with SendMessage but didn't work // perhaps I was sending to the wrong window? No idea. // Anyway fall back to keybd_event, which is OK as long we makesure // the slideshow has focus first char ch[10]; - if(slideno < 0) + if(slide_no < 0) return; - pptviewobj[id].guess = slideno; - _itoa_s(slideno, ch, 10, 10); + pptviews[id].guess = slide_no; + _itoa_s(slide_no, ch, 10, 10); HWND h1 = GetForegroundWindow(); HWND h2 = GetFocus(); - SetForegroundWindow(pptviewobj[id].hWnd); - SetFocus(pptviewobj[id].hWnd); - Sleep(50); // slight pause, otherwise event triggering this call may grab focus back! + SetForegroundWindow(pptviews[id].h_wnd); + SetFocus(pptviews[id].h_wnd); + // slight pause, otherwise event triggering this call may grab focus back! + Sleep(50); for(int i = 0; i < 10; i++) { if(ch[i] == '\0') @@ -544,36 +553,40 @@ DllExport void GotoSlide(int id, int slideno) SetForegroundWindow(h1); SetFocus(h2); + // I don't know why the below didn't work. + // Kept here as documentation in case we want to try again in the future + // //for(int i=0;i<10;i++) //{ // if(ch[i]=='\0') break; - // SendMessage(pptviewobj[id].hWnd2, WM_KEYDOWN, ch[i], 0); - // SendMessage(pptviewobj[id].hWnd2, WM_CHAR, ch[i], 0); - // SendMessage(pptviewobj[id].hWnd2, WM_KEYUP, ch[i], 0); + // SendMessage(pptviews[id].h_wnd_input, WM_KEYDOWN, ch[i], 0); + // SendMessage(pptviews[id].h_wnd_input, WM_CHAR, ch[i], 0); + // SendMessage(pptviews[id].h_wnd_input, WM_KEYUP, ch[i], 0); //} - //SendMessage(pptviewobj[id].hWnd2, WM_KEYDOWN, VK_RETURN, 0); - //SendMessage(pptviewobj[id].hWnd2, WM_CHAR, VK_RETURN, 0); - //SendMessage(pptviewobj[id].hWnd2, WM_KEYUP, VK_RETURN, 0); + //SendMessage(pptviews[id].h_wnd_input, WM_KEYDOWN, VK_RETURN, 0); + //SendMessage(pptviews[id].h_wnd_input, WM_CHAR, VK_RETURN, 0); + //SendMessage(pptviews[id].h_wnd_input, WM_KEYUP, VK_RETURN, 0); //keybd_event(VK_RETURN, 0, 0, 0); } // Restart the show from the beginning DllExport void RestartShow(int id) { - // If we just go direct to slide one, then it remembers that all other slides have - // been animated, so ends up just showing the completed slides of those slides that - // have been animated next time we advance. - // Only way I've found to get around this is to step backwards all the way through. - // Lets move the window out of the way first so the audience doesn't see this. + // If we just go direct to slide one, then it remembers that all other + // slides have been animated, so ends up just showing the completed slides + // of those slides that have been animated next time we advance. + // Only way I've found to get around this is to step backwards all the way + // through. Lets move the window out of the way first so the audience + // doesn't see this. DEBUG("RestartShow:%d\n", id); Stop(id); - GotoSlide(id, pptviewobj[id].slideCount); - while(pptviewobj[id].currentSlide > 1) + GotoSlide(id, pptviews[id].slide_count); + while(pptviews[id].current_slide > 1) { PrevStep(id); Sleep(10); } - for(int i = 0; i <= pptviewobj[id].firstSlideSteps; i++) + for(int i = 0; i <= pptviews[id].first_slide_steps; i++) { PrevStep(id); Sleep(10); @@ -585,23 +598,23 @@ DllExport void RestartShow(int id) // WM_CREATEWND message. At this point (and only this point) can the // window be resized to the correct size. // Release the hook as soon as we're complete to free up resources -LRESULT CALLBACK CbtProc(int nCode, WPARAM wParam, LPARAM lParam) +LRESULT CALLBACK CbtProc(int n_code, WPARAM w_param, LPARAM l_param) { - HHOOK hook = globalhook; - if(nCode == HCBT_CREATEWND) + HHOOK hook = global_hook; + if(n_code == HCBT_CREATEWND) { - char csClassName[16]; - HWND hCurrWnd = (HWND)wParam; - DWORD retProcId = NULL; - GetClassName(hCurrWnd, csClassName, sizeof(csClassName)); - if((strcmp(csClassName, "paneClassDC") == 0) - ||(strcmp(csClassName, "screenClass") == 0)) + char cs_class_name[16]; + HWND h_curr_wnd = (HWND)w_param; + DWORD ret_proc_id = NULL; + GetClassName(h_curr_wnd, cs_class_name, sizeof(cs_class_name)); + if((strcmp(cs_class_name, "paneClassDC") == 0) + ||(strcmp(cs_class_name, "screenClass") == 0)) { int id = -1; - DWORD windowthread = GetWindowThreadProcessId(hCurrWnd,NULL); - for(int i = 0; i < MAX_PPTOBJS; i++) + DWORD window_thread = GetWindowThreadProcessId(h_curr_wnd,NULL); + for(int i = 0; i < MAX_PPTS; i++) { - if(pptviewobj[i].dwThreadId == windowthread) + if(pptviews[i].dw_thread_id == window_thread) { id = i; break; @@ -609,177 +622,186 @@ LRESULT CALLBACK CbtProc(int nCode, WPARAM wParam, LPARAM lParam) } if(id >= 0) { - if(strcmp(csClassName, "paneClassDC") == 0) - pptviewobj[id].hWnd2=hCurrWnd; + if(strcmp(cs_class_name, "paneClassDC") == 0) + pptviews[id].h_wnd_input = h_curr_wnd; else { - pptviewobj[id].hWnd = hCurrWnd; - CBT_CREATEWND* cw = (CBT_CREATEWND*)lParam; - if(pptviewobj[id].hParentWnd != NULL) - cw->lpcs->hwndParent = pptviewobj[id].hParentWnd; - cw->lpcs->cy = (pptviewobj[id].rect.bottom-pptviewobj[id].rect.top); - cw->lpcs->cx = (pptviewobj[id].rect.right-pptviewobj[id].rect.left); + pptviews[id].h_wnd = h_curr_wnd; + CBT_CREATEWND* cw = (CBT_CREATEWND*)l_param; + if(pptviews[id].h_parent_wnd != NULL) + cw->lpcs->hwndParent = pptviews[id].h_parent_wnd; + cw->lpcs->cy = pptviews[id].rect.bottom + - pptviews[id].rect.top; + cw->lpcs->cx = pptviews[id].rect.right + - pptviews[id].rect.left; cw->lpcs->y = -32000; cw->lpcs->x = -32000; } - if((pptviewobj[id].hWnd != NULL) && (pptviewobj[id].hWnd2 != NULL)) + if((pptviews[id].h_wnd != NULL) + && (pptviews[id].h_wnd_input != NULL)) { - UnhookWindowsHookEx(globalhook); - globalhook = NULL; - pptviewobj[id].hook = SetWindowsHookEx(WH_CALLWNDPROC, - CwpProc,hInstance, pptviewobj[id].dwThreadId); - pptviewobj[id].mhook = SetWindowsHookEx(WH_GETMESSAGE, - GetMsgProc, hInstance, pptviewobj[id].dwThreadId); + UnhookWindowsHookEx(global_hook); + global_hook = NULL; + pptviews[id].hook = SetWindowsHookEx(WH_CALLWNDPROC, + CwpProc, h_instance, pptviews[id].dw_thread_id); + pptviews[id].mhook = SetWindowsHookEx(WH_GETMESSAGE, + GetMsgProc, h_instance, pptviews[id].dw_thread_id); Sleep(10); - pptviewobj[id].state = PPT_OPENED; + pptviews[id].state = PPT_OPENED; } } } } - return CallNextHookEx(hook, nCode, wParam, lParam); + return CallNextHookEx(hook, n_code, w_param, l_param); } // This hook exists whilst the slideshow is loading but only listens on the // slideshows thread. It listens out for mousewheel events -LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) +LRESULT CALLBACK GetMsgProc(int n_code, WPARAM w_param, LPARAM l_param) { HHOOK hook = NULL; - MSG *pMSG = (MSG *)lParam; - DWORD windowthread = GetWindowThreadProcessId(pMSG->hwnd, NULL); + MSG *p_msg = (MSG *)l_param; + DWORD window_thread = GetWindowThreadProcessId(p_msg->hwnd, NULL); int id = -1; - for(int i = 0; i < MAX_PPTOBJS; i++) + for(int i = 0; i < MAX_PPTS; i++) { - if(pptviewobj[i].dwThreadId == windowthread) + if(pptviews[i].dw_thread_id == window_thread) { id = i; - hook = pptviewobj[id].mhook; + hook = pptviews[id].mhook; break; } } - if(id >= 0 && nCode == HC_ACTION && wParam == PM_REMOVE - && pMSG->message == WM_MOUSEWHEEL) + if(id >= 0 && n_code == HC_ACTION && w_param == PM_REMOVE + && p_msg->message == WM_MOUSEWHEEL) { - if(pptviewobj[id].state != PPT_LOADED) + if(pptviews[id].state != PPT_LOADED) { - if(pptviewobj[id].currentSlide == 1) - pptviewobj[id].firstSlideSteps++; - pptviewobj[id].steps++; + if(pptviews[id].current_slide == 1) + pptviews[id].first_slide_steps++; + pptviews[id].steps++; } } - return CallNextHookEx(hook, nCode, wParam, lParam); + return CallNextHookEx(hook, n_code, w_param, l_param); } + // This hook exists whilst the slideshow is running but only listens on the // slideshows thread. It listens out for slide changes, message WM_USER+22. -LRESULT CALLBACK CwpProc(int nCode, WPARAM wParam, LPARAM lParam) +LRESULT CALLBACK CwpProc(int n_code, WPARAM w_param, LPARAM l_param) { CWPSTRUCT *cwp; - cwp = (CWPSTRUCT *)lParam; + cwp = (CWPSTRUCT *)l_param; HHOOK hook = NULL; char filename[MAX_PATH]; - DWORD windowthread = GetWindowThreadProcessId(cwp->hwnd, NULL); + DWORD window_thread = GetWindowThreadProcessId(cwp->hwnd, NULL); int id = -1; - for(int i = 0; i < MAX_PPTOBJS; i++) + for(int i = 0; i < MAX_PPTS; i++) { - if(pptviewobj[i].dwThreadId == windowthread) + if(pptviews[i].dw_thread_id == window_thread) { id = i; - hook = pptviewobj[id].hook; + hook = pptviews[id].hook; break; } } - if((id >= 0) && (nCode == HC_ACTION)) + if((id >= 0) && (n_code == HC_ACTION)) { if(cwp->message == WM_USER + 22) { - if(pptviewobj[id].state != PPT_LOADED) + if(pptviews[id].state != PPT_LOADED) { - if((pptviewobj[id].currentSlide > 0) - && (pptviewobj[id].previewpath != NULL - && strlen(pptviewobj[id].previewpath) > 0)) + if((pptviews[id].current_slide > 0) + && (pptviews[id].preview_path != NULL + && strlen(pptviews[id].preview_path) > 0)) { - sprintf_s(filename, MAX_PATH, "%s%i.bmp", pptviewobj[id].previewpath, - pptviewobj[id].currentSlide); + sprintf_s(filename, MAX_PATH, "%s%i.bmp", + pptviews[id].preview_path, + pptviews[id].current_slide); CaptureAndSaveWindow(cwp->hwnd, filename); } } if(cwp->wParam == 0) { - if(pptviewobj[id].currentSlide > 0) + if(pptviews[id].current_slide > 0) { - pptviewobj[id].state = PPT_LOADED; - pptviewobj[id].currentSlide = pptviewobj[id].slideCount + 1; + pptviews[id].state = PPT_LOADED; + pptviews[id].current_slide = pptviews[id].slide_count + 1; } } else { - if(pptviewobj[id].state != PPT_LOADED) + if(pptviews[id].state != PPT_LOADED) { - if((pptviewobj[id].currentSlide == 0) - ||(pptviewobj[id].slideNo[pptviewobj[id].currentSlide] != cwp->wParam)) + if((pptviews[id].current_slide == 0) + ||(pptviews[id].slide_no[pptviews[id].current_slide] + != cwp->wParam)) { - if(pptviewobj[id].slideNo[1] == cwp->wParam) + if(pptviews[id].slide_no[1] == cwp->wParam) { - pptviewobj[id].state = PPT_LOADED; + pptviews[id].state = PPT_LOADED; } else { - pptviewobj[id].currentSlide++; - pptviewobj[id].slideCount = pptviewobj[id].currentSlide; - pptviewobj[id].slideNo[pptviewobj[id].currentSlide] = cwp->wParam; + pptviews[id].current_slide++; + pptviews[id].slide_count + = pptviews[id].current_slide; + pptviews[id].slide_no[pptviews[id].current_slide] + = cwp->wParam; } } } else { - if(pptviewobj[id].guess > 0 - && pptviewobj[id].slideNo[pptviewobj[id].guess] == 0) + if(pptviews[id].guess > 0 + && pptviews[id].slide_no[pptviews[id].guess] == 0) { - pptviewobj[id].currentSlide = 0; + pptviews[id].current_slide = 0; } - for(int i = 1; i < pptviewobj[id].slideCount; i++) + for(int i = 1; i < pptviews[id].slide_count; i++) { - if(pptviewobj[id].slideNo[i] == cwp->wParam) + if(pptviews[id].slide_no[i] == cwp->wParam) { - pptviewobj[id].currentSlide = i; + pptviews[id].current_slide = i; break; } } - if(pptviewobj[id].currentSlide == 0) + if(pptviews[id].current_slide == 0) { - pptviewobj[id].slideNo[pptviewobj[id].guess] = cwp->wParam; - pptviewobj[id].currentSlide = pptviewobj[id].guess; + pptviews[id].slide_no[pptviews[id].guess] = cwp->wParam; + pptviews[id].current_slide = pptviews[id].guess; } } } } - if((pptviewobj[id].state != PPT_CLOSED) + if((pptviews[id].state != PPT_CLOSED) && (cwp->message == WM_CLOSE || cwp->message == WM_QUIT)) { - pptviewobj[id].state = PPT_CLOSING; + pptviews[id].state = PPT_CLOSING; } } - return CallNextHookEx(hook,nCode,wParam,lParam); + return CallNextHookEx(hook, n_code, w_param, l_param); } -VOID CaptureAndSaveWindow(HWND hWnd, CHAR* filename) +// Take a screenshot of the current slide, and create a .bmp +VOID CaptureAndSaveWindow(HWND h_wnd, CHAR* filename) { - HBITMAP hBmp; - if ((hBmp = CaptureWindow(hWnd)) == NULL) + HBITMAP h_bmp; + if ((h_bmp = CaptureWindow(h_wnd)) == NULL) return; RECT client; - GetClientRect (hWnd, &client); - UINT uiBytesPerRow = 3 * client.right; // RGB takes 24 bits - UINT uiRemainderForPadding; + GetClientRect(h_wnd, &client); + UINT ui_bytes_per_row = 3 * client.right; // RGB takes 24 bits + UINT ui_remainder_for_padding; - if ((uiRemainderForPadding = uiBytesPerRow % sizeof (DWORD)) > 0) - uiBytesPerRow += (sizeof (DWORD) - uiRemainderForPadding); + if ((ui_remainder_for_padding = ui_bytes_per_row % sizeof (DWORD)) > 0) + ui_bytes_per_row += (sizeof(DWORD) - ui_remainder_for_padding); - UINT uiBytesPerAllRows = uiBytesPerRow * client.bottom; - PBYTE pDataBits; + UINT ui_bytes_per_all_rows = ui_bytes_per_row * client.bottom; + PBYTE p_data_bits; - if ((pDataBits = new BYTE[uiBytesPerAllRows]) != NULL) + if ((p_data_bits = new BYTE[ui_bytes_per_all_rows]) != NULL) { BITMAPINFOHEADER bmi = {0}; BITMAPFILEHEADER bmf = {0}; @@ -792,75 +814,77 @@ VOID CaptureAndSaveWindow(HWND hWnd, CHAR* filename) bmi.biWidth = client.right; // Get it: - HDC hDC = GetDC(hWnd); - GetDIBits(hDC, hBmp, 0, client.bottom, pDataBits, + HDC h_dc = GetDC(h_wnd); + GetDIBits(h_dc, h_bmp, 0, client.bottom, p_data_bits, (BITMAPINFO*) &bmi, DIB_RGB_COLORS); - ReleaseDC(hWnd, hDC); + ReleaseDC(h_wnd, h_dc); // Fill the file header: bmf.bfOffBits = sizeof(bmf) + sizeof(bmi); - bmf.bfSize = bmf.bfOffBits + uiBytesPerAllRows; + bmf.bfSize = bmf.bfOffBits + ui_bytes_per_all_rows; bmf.bfType = 0x4D42; // Writing: - FILE* pFile; - int err = fopen_s(&pFile, filename, "wb"); + FILE* p_file; + int err = fopen_s(&p_file, filename, "wb"); if (err == 0) { - fwrite(&bmf, sizeof(bmf), 1, pFile); - fwrite(&bmi, sizeof(bmi), 1, pFile); - fwrite(pDataBits, sizeof(BYTE), uiBytesPerAllRows, pFile); - fclose(pFile); + fwrite(&bmf, sizeof(bmf), 1, p_file); + fwrite(&bmi, sizeof(bmi), 1, p_file); + fwrite(p_data_bits, sizeof(BYTE), ui_bytes_per_all_rows, p_file); + fclose(p_file); } - delete [] pDataBits; + delete [] p_data_bits; } - DeleteObject(hBmp); + DeleteObject(h_bmp); } -HBITMAP CaptureWindow(HWND hWnd) +HBITMAP CaptureWindow(HWND h_wnd) { - HDC hDC; - BOOL bOk = FALSE; - HBITMAP hImage = NULL; + HDC h_dc; + BOOL b_ok = FALSE; + HBITMAP h_image = NULL; - hDC = GetDC(hWnd); - RECT rcClient; - GetClientRect(hWnd, &rcClient); - if((hImage = CreateCompatibleBitmap(hDC, rcClient.right, rcClient.bottom)) - != NULL) + h_dc = GetDC(h_wnd); + RECT rc_client; + GetClientRect(h_wnd, &rc_client); + if((h_image = CreateCompatibleBitmap(h_dc, rc_client.right, + rc_client.bottom)) != NULL) { - HDC hMemDC; - HBITMAP hDCBmp; + HDC h_mem_dc; + HBITMAP h_dc_bmp; - if((hMemDC = CreateCompatibleDC (hDC)) != NULL) + if((h_mem_dc = CreateCompatibleDC (h_dc)) != NULL) { - hDCBmp = (HBITMAP)SelectObject(hMemDC, hImage); - HMODULE hLib = LoadLibrary("User32"); + h_dc_bmp = (HBITMAP)SelectObject(h_mem_dc, h_image); + HMODULE h_lib = LoadLibrary("User32"); // PrintWindow works for windows outside displayable area - // but was only introduced in WinXP. BitBlt requires the window to be topmost - // and within the viewable area of the display - if(GetProcAddress(hLib, "PrintWindow")==NULL) + // but was only introduced in WinXP. BitBlt requires the window + // to be topmost and within the viewable area of the display + if(GetProcAddress(h_lib, "PrintWindow") == NULL) { - SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE); - BitBlt (hMemDC, 0, 0, rcClient.right, rcClient.bottom, hDC, 0, 0, SRCCOPY); - SetWindowPos(hWnd, HWND_NOTOPMOST, -32000, -32000, 0, 0, SWP_NOSIZE); + SetWindowPos(h_wnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE); + BitBlt (h_mem_dc, 0, 0, rc_client.right, rc_client.bottom, + h_dc, 0, 0, SRCCOPY); + SetWindowPos(h_wnd, HWND_NOTOPMOST, -32000, -32000, 0, 0, + SWP_NOSIZE); } else { - PrintWindow(hWnd, hMemDC, 0); + PrintWindow(h_wnd, h_mem_dc, 0); } - SelectObject (hMemDC, hDCBmp); - DeleteDC (hMemDC); - bOk = TRUE; + SelectObject(h_mem_dc, h_dc_bmp); + DeleteDC(h_mem_dc); + b_ok = TRUE; } } - ReleaseDC(hWnd, hDC); - if(!bOk) + ReleaseDC(h_wnd, h_dc); + if(!b_ok) { - if (hImage) + if (h_image) { - DeleteObject(hImage); - hImage = NULL; + DeleteObject(h_image); + h_image = NULL; } } - return hImage; + return h_image; } \ No newline at end of file diff --git a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.dll b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.dll index 9c8240636..d7d7c1fba 100644 Binary files a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.dll and b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.dll differ diff --git a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h index a45f3b4c2..6b98e329b 100644 --- a/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h +++ b/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h @@ -1,60 +1,63 @@ -#define DllExport extern "C" __declspec( dllexport ) +#define DllExport extern "C" __declspec(dllexport) +#define DEBUG(...) if(debug) printf(__VA_ARGS__) -enum PPTVIEWSTATE { PPT_CLOSED, PPT_STARTED, PPT_OPENED, PPT_LOADED, PPT_CLOSING}; +enum PPTVIEWSTATE {PPT_CLOSED, PPT_STARTED, PPT_OPENED, + PPT_LOADED, PPT_CLOSING}; -DllExport int OpenPPT(char *filename, HWND hParentWnd, RECT rect, char *previewpath); +DllExport int OpenPPT(char *filename, HWND h_parent_wnd, RECT rect, + char *preview_path); DllExport BOOL CheckInstalled(); DllExport void ClosePPT(int id); DllExport int GetCurrentSlide(int id); DllExport int GetSlideCount(int id); DllExport void NextStep(int id); DllExport void PrevStep(int id); -DllExport void GotoSlide(int id, int slideno); +DllExport void GotoSlide(int id, int slide_no); DllExport void RestartShow(int id); DllExport void Blank(int id); DllExport void Unblank(int id); DllExport void Stop(int id); DllExport void Resume(int id); -DllExport void SetDebug(BOOL onoff); +DllExport void SetDebug(BOOL on_off); -LRESULT CALLBACK CbtProc(int nCode, WPARAM wParam, LPARAM lParam); -LRESULT CALLBACK CwpProc(int nCode, WPARAM wParam, LPARAM lParam); -LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam); -BOOL GetPPTViewerPath(char *pptviewerpath, int strsize); -HBITMAP CaptureWindow (HWND hWnd); -VOID SaveBitmap (CHAR* filename, HBITMAP hBmp) ; -VOID CaptureAndSaveWindow(HWND hWnd, CHAR* filename); +LRESULT CALLBACK CbtProc(int n_code, WPARAM w_param, LPARAM l_param); +LRESULT CALLBACK CwpProc(int n_code, WPARAM w_param, LPARAM l_param); +LRESULT CALLBACK GetMsgProc(int n_code, WPARAM w_param, LPARAM l_param); +BOOL GetPPTViewerPath(char *pptviewer_path, int str_size); +HBITMAP CaptureWindow (HWND h_wnd); +VOID SaveBitmap (CHAR* filename, HBITMAP h_bmp); +VOID CaptureAndSaveWindow(HWND h_wnd, CHAR* filename); BOOL GetPPTInfo(int id); BOOL SavePPTInfo(int id); -BOOL InitPPTObject(int id, char *filename, HWND hParentWnd, - RECT rect, char *previewpath); +BOOL InitPPTObject(int id, char *filename, HWND h_parent_wnd, + RECT rect, char *preview_path); BOOL StartPPTView(int id); void Unhook(int id); -#define MAX_PPTOBJS 16 +#define MAX_PPTS 16 #define MAX_SLIDES 256 -struct PPTVIEWOBJ +struct PPTVIEW { HHOOK hook; HHOOK mhook; - HWND hWnd; - HWND hWnd2; - HWND hParentWnd; - HANDLE hProcess; - HANDLE hThread; - DWORD dwProcessId; - DWORD dwThreadId; + HWND h_wnd; // The main pptview window + HWND h_wnd_input; // A child pptview window which takes windows messages + HWND h_parent_wnd; + HANDLE h_process; + HANDLE h_thread; + DWORD dw_process_id; + DWORD dw_thread_id; RECT rect; - int slideCount; - int currentSlide; - int firstSlideSteps; + int slide_count; + int current_slide; + int first_slide_steps; int steps; - int guess; + int guess; // What the current slide might be, based on the last action char filename[MAX_PATH]; - char previewpath[MAX_PATH]; - int slideNo[MAX_SLIDES]; + char preview_path[MAX_PATH]; + int slide_no[MAX_SLIDES]; PPTVIEWSTATE state; };