summaryrefslogtreecommitdiff
path: root/sfx2/source
diff options
context:
space:
mode:
authorRene Engelhard <rene@rene-engelhard.de>2018-05-18 14:31:35 +0200
committerMichael Stahl <Michael.Stahl@cib.de>2018-05-23 12:02:59 +0200
commit3e9c908b73f0fe0978c9980750a06bbc9e02295e (patch)
tree01601c826307aeb4ee3e4a50525a8039e59de443 /sfx2/source
parent5c6c6ebd121a50b293e015d0aa6c0f1e4dc416ae (diff)
remove Linux ("UNX") systray "Quickstarter"
Change-Id: Ie0e8b8b7ad59ee640d6b195dfae1a7cf745056fd Reviewed-on: https://gerrit.libreoffice.org/54543 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Michael Stahl <Michael.Stahl@cib.de>
Diffstat (limited to 'sfx2/source')
-rw-r--r--sfx2/source/appl/shutdownicon.cxx117
-rw-r--r--sfx2/source/appl/shutdowniconunx.cxx388
2 files changed, 11 insertions, 494 deletions
diff --git a/sfx2/source/appl/shutdownicon.cxx b/sfx2/source/appl/shutdownicon.cxx
index 0e9548dbcbec..8f420d84395d 100644
--- a/sfx2/source/appl/shutdownicon.cxx
+++ b/sfx2/source/appl/shutdownicon.cxx
@@ -78,12 +78,6 @@ using namespace ::com::sun::star::util;
using namespace ::com::sun::star::ui::dialogs;
using namespace ::sfx2;
-#ifdef ENABLE_QUICKSTART_APPLET
-# if !defined(_WIN32) && !defined(MACOSX)
-extern "C" { static void thisModule() {} }
-# endif
-#endif
-
class SfxNotificationListener_Impl : public cppu::WeakImplHelper< XDispatchResultListener >
{
public:
@@ -143,27 +137,7 @@ bool LoadModule()
pInitSystray = aqua_init_systray;
pDeInitSystray = aqua_shutdown_systray;
loaded = true;
-# else // UNX
- osl::Module plugin;
- oslGenericFunction pTmpInit = nullptr;
- oslGenericFunction pTmpDeInit = nullptr;
- if ( plugin.loadRelative( &thisModule, "libqstart_gtklo.so" ) )
- {
- pTmpInit = plugin.getFunctionSymbol( "plugin_init_sys_tray" );
- pTmpDeInit = plugin.getFunctionSymbol( "plugin_shutdown_sys_tray" );
- }
- if ( !pTmpInit || !pTmpDeInit )
- {
- loaded = false;
- }
- else
- {
- plugin.release();
- pInitSystray = pTmpInit;
- pDeInitSystray = pTmpDeInit;
- loaded = true;
- }
-# endif // UNX
+# endif // MACOSX
#endif // ENABLE_QUICKSTART_APPLET
}
assert(!boost::logic::indeterminate(loaded));
@@ -637,56 +611,15 @@ void ShutdownIcon::LeaveModalMode()
#else
bool ShutdownIcon::IsQuickstarterInstalled()
{
-#ifndef ENABLE_QUICKSTART_APPLET
return false;
-#else // !ENABLE_QUICKSTART_APPLET
-#ifdef UNX
- return LoadModule();
-#endif // UNX
-#endif // !ENABLE_QUICKSTART_APPLET
-}
-#endif // !WNT
-
-
-#if defined (ENABLE_QUICKSTART_APPLET) && defined (UNX)
-/**
-* Return the XDG autostart directory.
-* http://standards.freedesktop.org/autostart-spec/autostart-spec-latest.html
-* Available in Unix and with Quickstart enabled.
-* @param bCreate Create the directory if it does not exist yet.
-* @return OUString containing the autostart directory path.
-*/
-static OUString getAutostartDir( bool bCreate )
-{
- OUString aShortcut;
- const char *pConfigHome;
- if( (pConfigHome = getenv("XDG_CONFIG_HOME") ) )
- aShortcut = OStringToOUString( OString( pConfigHome ),
- RTL_TEXTENCODING_UTF8 );
- else
- {
- OUString aHomeURL;
- osl::Security().getHomeDir( aHomeURL );
- ::osl::File::getSystemPathFromFileURL( aHomeURL, aShortcut );
- aShortcut += "/.config";
- }
- aShortcut += "/autostart";
- if (bCreate)
- {
- OUString aShortcutUrl;
- osl::File::getFileURLFromSystemPath( aShortcut, aShortcutUrl );
- osl::Directory::createPath( aShortcutUrl );
- }
- return aShortcut;
}
#endif
+
+#ifdef ENABLE_QUICKSTART_APPLET
+#ifndef MACOSX
OUString ShutdownIcon::getShortcutName()
{
-#ifndef ENABLE_QUICKSTART_APPLET
- return OUString();
-#else
-
#ifdef _WIN32
OUString aShortcutName(SfxResId(STR_QUICKSTART_LNKNAME));
aShortcutName += ".lnk";
@@ -694,13 +627,11 @@ OUString ShutdownIcon::getShortcutName()
OUString aShortcut(GetAutostartFolderNameW32());
aShortcut += "\\";
aShortcut += aShortcutName;
-#else // UNX
- OUString aShortcut = getAutostartDir(false);
- aShortcut += "/qstart.desktop";
-#endif // UNX
return aShortcut;
-#endif // ENABLE_QUICKSTART_APPLET
+#endif // _WIN32
}
+#endif
+#endif
bool ShutdownIcon::GetAutostart( )
{
@@ -727,48 +658,22 @@ bool ShutdownIcon::GetAutostart( )
void ShutdownIcon::SetAutostart( bool bActivate )
{
#ifdef ENABLE_QUICKSTART_APPLET
+#ifndef MACOSX
OUString aShortcut( getShortcutName() );
+#endif
if( bActivate && IsQuickstarterInstalled() )
{
#ifdef _WIN32
EnableAutostartW32( aShortcut );
-#else // UNX
- getAutostartDir( true );
-
- OUString aPath( "${BRAND_BASE_DIR}/" LIBO_SHARE_FOLDER "/xdg/qstart.desktop" );
- rtl::Bootstrap::expandMacros( aPath );
-
- OUString aDesktopFile;
- ::osl::File::getSystemPathFromFileURL( aPath, aDesktopFile );
-
- OString aDesktopFileUnx = OUStringToOString( aDesktopFile,
- osl_getThreadTextEncoding() );
- OString aShortcutUnx = OUStringToOString( aShortcut,
- osl_getThreadTextEncoding() );
- if ((0 != symlink(aDesktopFileUnx.getStr(), aShortcutUnx.getStr())) && (errno == EEXIST))
- {
- unlink(aShortcutUnx.getStr());
- (void) symlink(aDesktopFileUnx.getStr(), aShortcutUnx.getStr());
- //deliberately ignore return value, it's non-critical if it fails
- }
-
- ShutdownIcon *pIcon = ShutdownIcon::createInstance();
- if( pIcon )
- pIcon->initSystray();
-#endif // UNX
+#endif
}
else
{
+#ifndef MACOSX
OUString aShortcutUrl;
::osl::File::getFileURLFromSystemPath( aShortcut, aShortcutUrl );
::osl::File::remove( aShortcutUrl );
-#ifdef UNX
- if (pShutdownIcon)
- {
- ShutdownIcon *pIcon = getInstance();
- pIcon->deInitSystray();
- }
#endif
}
#else
diff --git a/sfx2/source/appl/shutdowniconunx.cxx b/sfx2/source/appl/shutdowniconunx.cxx
deleted file mode 100644
index 25c35f86a35c..000000000000
--- a/sfx2/source/appl/shutdowniconunx.cxx
+++ /dev/null
@@ -1,388 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#ifdef ENABLE_QUICKSTART_APPLET
-
-#include <unotools/moduleoptions.hxx>
-
-#include <unotools/dynamicmenuoptions.hxx>
-
-#include <gtk/gtk.h>
-#include <glib.h>
-#include <osl/module.hxx>
-#include <sfx2/app.hxx>
-#include <sfx2/sfxresid.hxx>
-#include <sfx2/strings.hrc>
-#include "shutdownicon.hxx"
-
-#include <config_gio.h>
-
-#if ENABLE_GIO
-#include <gio/gio.h>
-#endif
-
-// Cut/paste from vcl/inc/svids.hrc
-#define SV_ICON_ID_TEXT 2
-#define SV_ICON_ID_SPREADSHEET 4
-#define SV_ICON_ID_DRAWING 6
-#define SV_ICON_ID_PRESENTATION 8
-#define SV_ICON_ID_TEMPLATE 11
-#define SV_ICON_ID_DATABASE 12
-#define SV_ICON_ID_FORMULA 13
-
-using namespace ::osl;
-
-static GtkStatusIcon* pTrayIcon;
-static GtkWidget *pExitMenuItem = nullptr;
-static GtkWidget *pOpenMenuItem = nullptr;
-static GtkWidget *pDisableMenuItem = nullptr;
-#if ENABLE_GIO
-static GFileMonitor* pMonitor = nullptr;
-#endif
-
-static void open_url_cb( GtkWidget *, gpointer data )
-{
- ShutdownIcon::OpenURL( *static_cast<OUString *>(data),
- "_default" );
-}
-
-static void open_file_cb( GtkWidget * )
-{
- if ( !ShutdownIcon::bModalMode )
- ShutdownIcon::FileOpen();
-}
-
-static void open_template_cb( GtkWidget * )
-{
- if ( !ShutdownIcon::bModalMode )
- ShutdownIcon::FromTemplate();
-}
-
-static void systray_disable_cb()
-{
- ShutdownIcon::SetAutostart( false );
- ShutdownIcon::terminateDesktop();
-}
-
-static void exit_quickstarter_cb( GtkWidget * )
-{
- plugin_shutdown_sys_tray();
- //terminate may cause this .so to be unloaded. So we must be hands off
- //all calls into this .so after this call
- ShutdownIcon::terminateDesktop();
-}
-
-static void menu_deactivate_cb( GtkWidget *pMenu )
-{
- gtk_menu_popdown( GTK_MENU( pMenu ) );
-}
-
-extern "C" {
-static void oustring_delete (gpointer data,
- GClosure * /* closure */)
-{
- OUString *pURL = static_cast<OUString *>(data);
- delete pURL;
-}
-}
-
-static void add_item( GtkMenuShell *pMenuShell, const char *pAsciiURL,
- OUString const *pOverrideLabel,
- sal_uInt16 nResId, GCallback pFnCallback )
-{
- OUString *pURL = new OUString (OStringToOUString( pAsciiURL,
- RTL_TEXTENCODING_UTF8 ));
- OString aLabel;
- if (pOverrideLabel)
- aLabel = OUStringToOString (*pOverrideLabel, RTL_TEXTENCODING_UTF8);
- else
- {
- aLabel = OUStringToOString (ShutdownIcon::GetUrlDescription( *pURL ),
- RTL_TEXTENCODING_UTF8);
- }
-
- gchar* appicon;
-
- if (nResId == SV_ICON_ID_TEXT)
- appicon = g_strdup ("libreoffice-writer");
- else if (nResId == SV_ICON_ID_SPREADSHEET)
- appicon = g_strdup ("libreoffice-calc");
- else if (nResId == SV_ICON_ID_DRAWING)
- appicon = g_strdup ("libreoffice-draw");
- else if (nResId == SV_ICON_ID_PRESENTATION)
- appicon = g_strdup ("libreoffice-impress");
- else if (nResId == SV_ICON_ID_DATABASE)
- appicon = g_strdup ("libreoffice-base");
- else if (nResId == SV_ICON_ID_FORMULA)
- appicon = g_strdup ("libreoffice-math");
- else
- appicon = g_strdup ("libreoffice-startcenter");
-
- GtkWidget *pImage = gtk_image_new_from_icon_name (appicon, GTK_ICON_SIZE_MENU);
- GtkWidget *pMenuItem = gtk_image_menu_item_new_with_label( aLabel.getStr() );
- gtk_image_menu_item_set_image( GTK_IMAGE_MENU_ITEM( pMenuItem ), pImage );
- g_signal_connect_data( pMenuItem, "activate", pFnCallback, pURL,
- oustring_delete, GConnectFlags(0));
-
- gtk_menu_shell_append( pMenuShell, pMenuItem );
-}
-
-// Unbelievably nasty
-using namespace ::com::sun::star::uno;
-using namespace ::com::sun::star::task;
-using namespace ::com::sun::star::lang;
-using namespace ::com::sun::star::beans;
-
-static void add_ugly_db_item( GtkMenuShell *pMenuShell, const char *pAsciiURL,
- sal_uInt16 nResId, GCallback pFnCallback )
-{
- SvtDynamicMenuOptions aOpt;
- Sequence < Sequence < PropertyValue > > aMenu = aOpt.GetMenu( EDynamicMenuType::NewMenu );
- for ( sal_Int32 n=0; n<aMenu.getLength(); n++ )
- {
- OUString aURL;
- OUString aDescription;
- Sequence < PropertyValue >& aEntry = aMenu[n];
- for ( sal_Int32 m=0; m<aEntry.getLength(); m++ )
- {
- if ( aEntry[m].Name == "URL" )
- aEntry[m].Value >>= aURL;
- if ( aEntry[m].Name == "Title" )
- aEntry[m].Value >>= aDescription;
- }
-
- if ( aURL == BASE_URL && !aDescription.isEmpty() )
- {
- add_item (pMenuShell, pAsciiURL, &aDescription, nResId, pFnCallback);
- break;
- }
- }
-}
-
-static GtkWidget *
-add_image_menu_item( GtkMenuShell *pMenuShell,
- const gchar *stock_id,
- const OUString& aLabel,
- GCallback activate_cb )
-{
- OString aUtfLabel = OUStringToOString (aLabel, RTL_TEXTENCODING_UTF8 );
-
- GtkWidget *pImage;
- pImage = gtk_image_new_from_stock( stock_id, GTK_ICON_SIZE_MENU );
-
- GtkWidget *pMenuItem;
- pMenuItem = gtk_image_menu_item_new_with_label( aUtfLabel.getStr() );
- gtk_image_menu_item_set_image( GTK_IMAGE_MENU_ITEM( pMenuItem ), pImage );
-
- gtk_menu_shell_append( pMenuShell, pMenuItem );
- g_signal_connect( pMenuItem, "activate", activate_cb, nullptr);
-
- return pMenuItem;
-}
-
-static void populate_menu( GtkWidget *pMenu )
-{
- GtkMenuShell *pMenuShell = GTK_MENU_SHELL( pMenu );
- SvtModuleOptions aModuleOptions;
-
- if ( aModuleOptions.IsWriter() )
- add_item (pMenuShell, WRITER_URL, nullptr,
- SV_ICON_ID_TEXT, G_CALLBACK( open_url_cb ));
-
- if ( aModuleOptions.IsCalc() )
- add_item (pMenuShell, CALC_URL, nullptr,
- SV_ICON_ID_SPREADSHEET, G_CALLBACK( open_url_cb ));
-
- if ( aModuleOptions.IsImpress() )
- add_item (pMenuShell, IMPRESS_URL, nullptr,
- SV_ICON_ID_PRESENTATION, G_CALLBACK( open_url_cb ));
-
- if ( aModuleOptions.IsDraw() )
- add_item (pMenuShell, DRAW_URL, nullptr,
- SV_ICON_ID_DRAWING, G_CALLBACK( open_url_cb ));
-
- if ( aModuleOptions.IsDataBase() )
- add_ugly_db_item (pMenuShell, BASE_URL,
- SV_ICON_ID_DATABASE, G_CALLBACK( open_url_cb ));
-
- if ( aModuleOptions.IsMath() )
- add_item (pMenuShell, MATH_URL, nullptr,
- SV_ICON_ID_FORMULA, G_CALLBACK( open_url_cb ));
-
- OUString aULabel = SfxResId(STR_QUICKSTART_FROMTEMPLATE);
- add_item (pMenuShell, "dummy", &aULabel,
- SV_ICON_ID_TEMPLATE, G_CALLBACK( open_template_cb ));
-
- GtkWidget *pMenuItem;
-
- pMenuItem = gtk_separator_menu_item_new();
- gtk_menu_shell_append( pMenuShell, pMenuItem );
-
- pOpenMenuItem = add_image_menu_item
- (pMenuShell, GTK_STOCK_OPEN,
- SfxResId(STR_QUICKSTART_FILEOPEN),
- G_CALLBACK( open_file_cb ));
-
-
- pMenuItem = gtk_separator_menu_item_new();
- gtk_menu_shell_append( pMenuShell, pMenuItem );
-
- pDisableMenuItem = add_image_menu_item
- ( pMenuShell, GTK_STOCK_CLOSE,
- SfxResId(STR_QUICKSTART_PRELAUNCH_UNX),
- G_CALLBACK( systray_disable_cb ) );
-
- pMenuItem = gtk_separator_menu_item_new();
- gtk_menu_shell_append( pMenuShell, pMenuItem );
-
- pExitMenuItem = add_image_menu_item
- ( pMenuShell, GTK_STOCK_QUIT,
- SfxResId(STR_QUICKSTART_EXIT),
- G_CALLBACK( exit_quickstarter_cb ) );
-
- gtk_widget_show_all( pMenu );
-}
-
-static void refresh_menu( GtkWidget *pMenu )
-{
- if (!pExitMenuItem)
- populate_menu( pMenu );
-
- bool bModal = ShutdownIcon::bModalMode;
- gtk_widget_set_sensitive( pExitMenuItem, !bModal);
- gtk_widget_set_sensitive( pOpenMenuItem, !bModal);
- gtk_widget_set_sensitive( pDisableMenuItem, !bModal);
-}
-
-static gboolean display_menu_cb( GtkWidget *,
- GdkEventButton *event, GtkWidget *pMenu )
-{
- if (event->button == 2)
- return false;
-
- refresh_menu( pMenu );
-
- gtk_menu_popup( GTK_MENU( pMenu ), nullptr, nullptr,
- gtk_status_icon_position_menu, pTrayIcon,
- 0, event->time );
-
- return true;
-}
-
-#if ENABLE_GIO
-/*
- * If the quickstarter is running, then LibreOffice is
- * upgraded, then the old quickstarter is still running, but is now unreliable
- * as the old install has been deleted. A fairly intractable problem but we
- * can avoid much of the pain if we turn off the quickstarter if we detect
- * that it has been physically deleted or overwritten
-*/
-static void notify_file_changed(GFileMonitor * /*gfilemonitor*/, GFile * /*arg1*/,
- GFile * /*arg2*/, GFileMonitorEvent event_type, gpointer /*user_data*/)
-{
- //Shutdown the quick starter if anything has happened to make it unsafe
- //to remain running, e.g. rpm --erased and all libs deleted, or
- //rpm --upgrade and libs being overwritten
- switch (event_type)
- {
- case G_FILE_MONITOR_EVENT_DELETED:
- case G_FILE_MONITOR_EVENT_CREATED:
- case G_FILE_MONITOR_EVENT_PRE_UNMOUNT:
- case G_FILE_MONITOR_EVENT_UNMOUNTED:
- exit_quickstarter_cb(GTK_WIDGET(pTrayIcon));
- break;
- default:
- break;
- }
-}
-#endif
-
-void plugin_init_sys_tray()
-{
- ::SolarMutexGuard aGuard;
-
- /* we need the vcl plugin and mainloop initialized */
- if (!g_type_from_name( "GdkDisplay" ))
- return;
-
- OString aLabel;
- ShutdownIcon *pShutdownIcon = ShutdownIcon::getInstance();
-
- aLabel = OUStringToOString (
- SfxResId(STR_QUICKSTART_TIP),
- RTL_TEXTENCODING_UTF8 );
-
- pTrayIcon = gtk_status_icon_new_from_icon_name ("libreoffice-startcenter");
-
- g_object_set (pTrayIcon, "title", aLabel.getStr(),
- "tooltip_text", aLabel.getStr(), nullptr);
-
- GtkWidget *pMenu = gtk_menu_new();
- g_signal_connect(pTrayIcon, "button-press-event",
- G_CALLBACK(display_menu_cb), pMenu);
- g_signal_connect (pMenu, "deactivate",
- G_CALLBACK (menu_deactivate_cb), nullptr);
-
- // disable shutdown
- pShutdownIcon->SetVeto( true );
- ShutdownIcon::addTerminateListener();
-
-#if ENABLE_GIO
- GFile* pFile = nullptr;
- OUString sLibraryFileUrl;
- if (osl::Module::getUrlFromAddress(plugin_init_sys_tray, sLibraryFileUrl))
- pFile = g_file_new_for_uri(OUStringToOString(sLibraryFileUrl, RTL_TEXTENCODING_UTF8).getStr());
-
- if (pFile)
- {
- if ((pMonitor = g_file_monitor_file(pFile, G_FILE_MONITOR_NONE, nullptr, nullptr)))
- g_signal_connect(pMonitor, "changed", reinterpret_cast<GCallback>(notify_file_changed), nullptr);
- g_object_unref(pFile);
- }
-#endif
-}
-
-void plugin_shutdown_sys_tray()
-{
- ::SolarMutexGuard aGuard;
- if( !pTrayIcon )
- return;
-
-#if ENABLE_GIO
- if (pMonitor)
- {
- g_signal_handlers_disconnect_by_func(pMonitor,
- reinterpret_cast<gpointer>(&notify_file_changed), pMonitor);
- g_file_monitor_cancel(pMonitor);
- g_object_unref(pMonitor);
- pMonitor = nullptr;
- }
-#endif
-
- g_object_unref(pTrayIcon);
- pTrayIcon = nullptr;
-
- pExitMenuItem = nullptr;
- pOpenMenuItem = nullptr;
- pDisableMenuItem = nullptr;
-}
-
-#endif // ENABLE_QUICKSTART_APPLET
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */