forked from openlp/openlp
Added support for disabling Impress Presentation Screen. Fixes bug 1798651
Fixes: https://launchpad.net/bugs/1798651
This commit is contained in:
parent
2ebccbfb91
commit
52bdb8db02
@ -36,7 +36,7 @@ import time
|
|||||||
|
|
||||||
from PyQt5 import QtCore
|
from PyQt5 import QtCore
|
||||||
|
|
||||||
from openlp.core.common import delete_file, get_uno_command, get_uno_instance, is_win
|
from openlp.core.common import delete_file, get_uno_command, get_uno_instance, is_win, trace_error_handler
|
||||||
from openlp.core.common.registry import Registry
|
from openlp.core.common.registry import Registry
|
||||||
from openlp.core.display.screens import ScreenList
|
from openlp.core.display.screens import ScreenList
|
||||||
from openlp.plugins.presentations.lib.presentationcontroller import PresentationController, PresentationDocument, \
|
from openlp.plugins.presentations.lib.presentationcontroller import PresentationController, PresentationDocument, \
|
||||||
@ -55,7 +55,7 @@ if is_win():
|
|||||||
class SlideShowListenerImport(XSlideShowListenerObj.__class__):
|
class SlideShowListenerImport(XSlideShowListenerObj.__class__):
|
||||||
pass
|
pass
|
||||||
except (AttributeError, pywintypes.com_error):
|
except (AttributeError, pywintypes.com_error):
|
||||||
class SlideShowListenerImport(object):
|
class SlideShowListenerImport():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Declare an empty exception to match the exception imported from UNO
|
# Declare an empty exception to match the exception imported from UNO
|
||||||
@ -97,6 +97,8 @@ class ImpressController(PresentationController):
|
|||||||
self.process = None
|
self.process = None
|
||||||
self.desktop = None
|
self.desktop = None
|
||||||
self.manager = None
|
self.manager = None
|
||||||
|
self.conf_provider = None
|
||||||
|
self.presenter_screen_disabled_by_openlp = False
|
||||||
|
|
||||||
def check_available(self):
|
def check_available(self):
|
||||||
"""
|
"""
|
||||||
@ -105,8 +107,7 @@ class ImpressController(PresentationController):
|
|||||||
log.debug('check_available')
|
log.debug('check_available')
|
||||||
if is_win():
|
if is_win():
|
||||||
return self.get_com_servicemanager() is not None
|
return self.get_com_servicemanager() is not None
|
||||||
else:
|
return uno_available
|
||||||
return uno_available
|
|
||||||
|
|
||||||
def start_process(self):
|
def start_process(self):
|
||||||
"""
|
"""
|
||||||
@ -146,6 +147,7 @@ class ImpressController(PresentationController):
|
|||||||
self.manager = uno_instance.ServiceManager
|
self.manager = uno_instance.ServiceManager
|
||||||
log.debug('get UNO Desktop Openoffice - createInstanceWithContext - Desktop')
|
log.debug('get UNO Desktop Openoffice - createInstanceWithContext - Desktop')
|
||||||
desktop = self.manager.createInstanceWithContext("com.sun.star.frame.Desktop", uno_instance)
|
desktop = self.manager.createInstanceWithContext("com.sun.star.frame.Desktop", uno_instance)
|
||||||
|
self.toggle_presentation_screen(False)
|
||||||
return desktop
|
return desktop
|
||||||
except Exception:
|
except Exception:
|
||||||
log.warning('Failed to get UNO desktop')
|
log.warning('Failed to get UNO desktop')
|
||||||
@ -163,6 +165,7 @@ class ImpressController(PresentationController):
|
|||||||
desktop = self.manager.createInstance('com.sun.star.frame.Desktop')
|
desktop = self.manager.createInstance('com.sun.star.frame.Desktop')
|
||||||
except (AttributeError, pywintypes.com_error):
|
except (AttributeError, pywintypes.com_error):
|
||||||
log.warning('Failure to find desktop - Impress may have closed')
|
log.warning('Failure to find desktop - Impress may have closed')
|
||||||
|
self.toggle_presentation_screen(False)
|
||||||
return desktop if desktop else None
|
return desktop if desktop else None
|
||||||
|
|
||||||
def get_com_servicemanager(self):
|
def get_com_servicemanager(self):
|
||||||
@ -181,6 +184,8 @@ class ImpressController(PresentationController):
|
|||||||
Called at system exit to clean up any running presentations.
|
Called at system exit to clean up any running presentations.
|
||||||
"""
|
"""
|
||||||
log.debug('Kill OpenOffice')
|
log.debug('Kill OpenOffice')
|
||||||
|
if self.presenter_screen_disabled_by_openlp:
|
||||||
|
self._toggle_presentation_screen(True)
|
||||||
while self.docs:
|
while self.docs:
|
||||||
self.docs[0].close_presentation()
|
self.docs[0].close_presentation()
|
||||||
desktop = None
|
desktop = None
|
||||||
@ -210,6 +215,51 @@ class ImpressController(PresentationController):
|
|||||||
except Exception:
|
except Exception:
|
||||||
log.warning('Failed to terminate OpenOffice')
|
log.warning('Failed to terminate OpenOffice')
|
||||||
|
|
||||||
|
def toggle_presentation_screen(self, target_value):
|
||||||
|
"""
|
||||||
|
Enable or disable the Presentation Screen/Console
|
||||||
|
"""
|
||||||
|
# Create Instance of ConfigurationProvider
|
||||||
|
if not self.conf_provider:
|
||||||
|
if is_win():
|
||||||
|
self.conf_provider = self.manager.createInstance("com.sun.star.configuration.ConfigurationProvider")
|
||||||
|
else:
|
||||||
|
self.conf_provider = self.manager.createInstanceWithContext("com.sun.star.configuration.ConfigurationProvider", uno.getComponentContext())
|
||||||
|
# Setup lookup properties to get Impress settings
|
||||||
|
properties = []
|
||||||
|
properties.append(self.create_property('nodepath', 'org.openoffice.Office.Impress'))
|
||||||
|
properties = tuple(properties)
|
||||||
|
try:
|
||||||
|
# Get an updateable configuration view
|
||||||
|
impress_conf_props = self.conf_provider.createInstanceWithArguments('com.sun.star.configuration.ConfigurationUpdateAccess', properties)
|
||||||
|
# Get the specific setting for presentation screen
|
||||||
|
presenter_screen_enabled = impress_conf_props.getHierarchicalPropertyValue('Misc/Start/EnablePresenterScreen')
|
||||||
|
# If the presentation screen is enabled we disable it
|
||||||
|
if presenter_screen_enabled != target_value:
|
||||||
|
impress_conf_props.setHierarchicalPropertyValue('Misc/Start/EnablePresenterScreen', target_value)
|
||||||
|
impress_conf_props.commitChanges()
|
||||||
|
# if target_value is False this is an attempt to disable the Presenter Screen
|
||||||
|
# so we make a note that it has been disabled, so it can be enabled again on close.
|
||||||
|
if target_value == False:
|
||||||
|
self.presenter_screen_disabled_by_openlp = True
|
||||||
|
except Exception as e:
|
||||||
|
log.exception(e)
|
||||||
|
trace_error_handler(log)
|
||||||
|
return
|
||||||
|
|
||||||
|
def create_property(self, name, value):
|
||||||
|
"""
|
||||||
|
Create an OOo style property object which are passed into some Uno methods.
|
||||||
|
"""
|
||||||
|
log.debug('create property OpenOffice')
|
||||||
|
if is_win():
|
||||||
|
property_object = self.manager.Bridge_GetStruct('com.sun.star.beans.PropertyValue')
|
||||||
|
else:
|
||||||
|
property_object = PropertyValue()
|
||||||
|
property_object.Name = name
|
||||||
|
property_object.Value = value
|
||||||
|
return property_object
|
||||||
|
|
||||||
|
|
||||||
class ImpressDocument(PresentationDocument):
|
class ImpressDocument(PresentationDocument):
|
||||||
"""
|
"""
|
||||||
@ -250,7 +300,7 @@ class ImpressDocument(PresentationDocument):
|
|||||||
return False
|
return False
|
||||||
self.desktop = desktop
|
self.desktop = desktop
|
||||||
properties = []
|
properties = []
|
||||||
properties.append(self.create_property('Hidden', True))
|
properties.append(self.controller.create_property('Hidden', True))
|
||||||
properties = tuple(properties)
|
properties = tuple(properties)
|
||||||
try:
|
try:
|
||||||
self.document = desktop.loadComponentFromURL(url, '_blank', 0, properties)
|
self.document = desktop.loadComponentFromURL(url, '_blank', 0, properties)
|
||||||
@ -277,7 +327,7 @@ class ImpressDocument(PresentationDocument):
|
|||||||
temp_folder_path = self.get_temp_folder()
|
temp_folder_path = self.get_temp_folder()
|
||||||
thumb_dir_url = temp_folder_path.as_uri()
|
thumb_dir_url = temp_folder_path.as_uri()
|
||||||
properties = []
|
properties = []
|
||||||
properties.append(self.create_property('FilterName', 'impress_png_Export'))
|
properties.append(self.controller.create_property('FilterName', 'impress_png_Export'))
|
||||||
properties = tuple(properties)
|
properties = tuple(properties)
|
||||||
doc = self.document
|
doc = self.document
|
||||||
pages = doc.getDrawPages()
|
pages = doc.getDrawPages()
|
||||||
@ -299,19 +349,6 @@ class ImpressDocument(PresentationDocument):
|
|||||||
except Exception:
|
except Exception:
|
||||||
log.exception('{path} - Unable to store openoffice preview'.format(path=path))
|
log.exception('{path} - Unable to store openoffice preview'.format(path=path))
|
||||||
|
|
||||||
def create_property(self, name, value):
|
|
||||||
"""
|
|
||||||
Create an OOo style property object which are passed into some Uno methods.
|
|
||||||
"""
|
|
||||||
log.debug('create property OpenOffice')
|
|
||||||
if is_win():
|
|
||||||
property_object = self.controller.manager.Bridge_GetStruct('com.sun.star.beans.PropertyValue')
|
|
||||||
else:
|
|
||||||
property_object = PropertyValue()
|
|
||||||
property_object.Name = name
|
|
||||||
property_object.Value = value
|
|
||||||
return property_object
|
|
||||||
|
|
||||||
def close_presentation(self):
|
def close_presentation(self):
|
||||||
"""
|
"""
|
||||||
Close presentation and clean up objects. Triggered by new object being added to SlideController or OpenLP being
|
Close presentation and clean up objects. Triggered by new object being added to SlideController or OpenLP being
|
||||||
@ -376,8 +413,7 @@ class ImpressDocument(PresentationDocument):
|
|||||||
log.debug('is blank OpenOffice')
|
log.debug('is blank OpenOffice')
|
||||||
if self.control and self.control.isRunning():
|
if self.control and self.control.isRunning():
|
||||||
return self.control.isPaused()
|
return self.control.isPaused()
|
||||||
else:
|
return False
|
||||||
return False
|
|
||||||
|
|
||||||
def stop_presentation(self):
|
def stop_presentation(self):
|
||||||
"""
|
"""
|
||||||
@ -513,7 +549,7 @@ class ImpressDocument(PresentationDocument):
|
|||||||
titles.append(self.__get_text_from_page(slide_no, TextType.Title).replace('\r\n', ' ')
|
titles.append(self.__get_text_from_page(slide_no, TextType.Title).replace('\r\n', ' ')
|
||||||
.replace('\n', ' ').strip())
|
.replace('\n', ' ').strip())
|
||||||
note = self.__get_text_from_page(slide_no, TextType.Notes)
|
note = self.__get_text_from_page(slide_no, TextType.Notes)
|
||||||
if len(note) == 0:
|
if not note:
|
||||||
note = ' '
|
note = ' '
|
||||||
notes.append(note)
|
notes.append(note)
|
||||||
self.save_titles_and_notes(titles, notes)
|
self.save_titles_and_notes(titles, notes)
|
||||||
|
Loading…
Reference in New Issue
Block a user