diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 4f7163ba0..484243856 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -353,6 +353,7 @@ class SlideController(QtGui.QWidget): if self.commandItem is not None and \ self.commandItem.service_item_type == ServiceType.Command: Receiver().send_message(u'%s_first'% self.commandItem.name.lower()) + QtCore.QTimer.singleShot(0.5, self.grabMainDisplay) else: self.PreviewListWidget.selectRow(0) self.onSlideSelected() @@ -379,6 +380,7 @@ class SlideController(QtGui.QWidget): if row > -1 and row < self.PreviewListWidget.rowCount(): if self.commandItem.service_item_type == ServiceType.Command: Receiver().send_message(u'%s_slide'% self.commandItem.name.lower(), [row]) + QtCore.QTimer.singleShot(0.5, self.grabMainDisplay) else: #label = self.PreviewListWidget.cellWidget(row, 0) frame = self.serviceitem.frames[row][u'image'] @@ -389,6 +391,13 @@ class SlideController(QtGui.QWidget): log.info(u'Slide Rendering took %4s' % (time.time() - before)) if self.isLive: self.parent.mainDisplay.frameView(frame) + + def grabMainDisplay(self): + winid = QtGui.QApplication.desktop().winId() + rm = self.parent.RenderManager + rect = rm.screen_list[rm.current_display][u'size'] + winimg = QtGui.QPixmap.grabWindow(winid, rect.x(), rect.y(), rect.width(), rect.height()) + self.SlidePreview.setPixmap(winimg) def onSlideSelectedNext(self): """ @@ -397,6 +406,7 @@ class SlideController(QtGui.QWidget): if self.commandItem is not None and \ self.commandItem.service_item_type == ServiceType.Command: Receiver().send_message(u'%s_next'% self.commandItem.name.lower()) + QtCore.QTimer.singleShot(0.5, self.grabMainDisplay) else: row = self.PreviewListWidget.currentRow() + 1 if row == self.PreviewListWidget.rowCount(): @@ -412,6 +422,7 @@ class SlideController(QtGui.QWidget): self.commandItem.service_item_type == ServiceType.Command: Receiver().send_message( u'%s_previous'% self.commandItem.name.lower()) + QtCore.QTimer.singleShot(0.5, self.grabMainDisplay) else: row = self.PreviewListWidget.currentRow() - 1 if row == -1: @@ -426,6 +437,7 @@ class SlideController(QtGui.QWidget): if self.commandItem is not None and \ self.commandItem.service_item_type == ServiceType.Command: Receiver().send_message(u'%s_last'% self.commandItem.name.lower()) + QtCore.QTimer.singleShot(0.5, self.grabMainDisplay) else: self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount() - 1) self.onSlideSelected() diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index 219e8cec1..a971f8342 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -28,6 +28,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA import logging import os +import time if os.name == u'nt': from win32com.client import Dispatch @@ -85,7 +86,7 @@ class ImpressController(PresentationController): self.manager._FlagAsMethod(u'Bridge_GetValueObject') else: # -headless - cmd = u'openoffice.org -nologo -norestore -minimized -invisible ' + u'"' + u'-accept=socket,host=localhost,port=2002;urp;'+ u'"' + cmd = u'openoffice.org -nologo -norestore -minimized -invisible -nofirststartwizard -accept="socket,host=localhost,port=2002;urp;"' self.process = QtCore.QProcess() self.process.startDetached(cmd) self.process.waitForStarted() @@ -96,6 +97,12 @@ class ImpressController(PresentationController): """ log.debug(u'Kill') self.close_presentation() + if os.name != u'nt': + desktop = self.get_uno_desktop() + try: + desktop.terminate() + except: + pass def load_presentation(self, presentation): """ @@ -121,18 +128,19 @@ class ImpressController(PresentationController): url = uno.systemPathToFileUrl(presentation) if desktop is None: return + self.desktop = desktop + properties = [] + properties.append(self.create_property(u'Minimized', True)) + properties = tuple(properties) try: - self.desktop = desktop - properties = [] - properties = tuple(properties) self.document = desktop.loadComponentFromURL(url, u'_blank', 0, properties) - self.presentation = self.document.getPresentation() - self.presentation.Display = self.plugin.render_manager.current_display + 1 - self.controller = None except: log.exception(u'Failed to load presentation') return + self.presentation = self.document.getPresentation() + self.presentation.Display = self.plugin.render_manager.current_display + 1 + self.controller = None self.create_thumbnails() def create_thumbnails(self): @@ -148,13 +156,7 @@ class ImpressController(PresentationController): else: thumbdir = uno.systemPathToFileUrl(self.thumbnailpath) props = [] - if os.name == u'nt': - prop = self.manager.Bridge_GetStruct(u'com.sun.star.beans.PropertyValue') - else: - prop = PropertyValue() - prop.Name = u'FilterName' - prop.Value = u'impress_png_Export' - props.append(prop) + props.append(self.create_property(u'FilterName', u'impress_png_Export')) props = tuple(props) doc = self.document pages = doc.getDrawPages() @@ -164,6 +166,15 @@ class ImpressController(PresentationController): doc.storeToURL(thumbdir + u'/' + self.thumbnailprefix + unicode(idx+1) + u'.png', props) + def create_property(self, name, value): + if os.name == u'nt': + prop = self.manager.Bridge_GetStruct(u'com.sun.star.beans.PropertyValue') + else: + prop = PropertyValue() + prop.Name = name + prop.Value = value + return prop + def get_uno_desktop(self): log.debug(u'getUNODesktop') ctx = None @@ -245,6 +256,11 @@ class ImpressController(PresentationController): def start_presentation(self): if self.controller is None or not self.controller.isRunning(): self.presentation.start() + # start() returns before the getCurrentComponent is ready. Try for 5 seconds + i = 1 + while self.desktop.getCurrentComponent() is None and i < 50: + time.sleep(0.1) + i = i + 1 self.controller = self.desktop.getCurrentComponent().Presentation.getController() else: self.controller.activate()