diff options
Diffstat (limited to 'vcl/unx/gtk/gtksys.cxx')
-rw-r--r-- | vcl/unx/gtk/gtksys.cxx | 296 |
1 files changed, 0 insertions, 296 deletions
diff --git a/vcl/unx/gtk/gtksys.cxx b/vcl/unx/gtk/gtksys.cxx deleted file mode 100644 index 373459589429..000000000000 --- a/vcl/unx/gtk/gtksys.cxx +++ /dev/null @@ -1,296 +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 . - */ - -#include <string.h> -#include <gmodule.h> -#include <gtk/gtk.h> -#include <unx/gtk/gtkinst.hxx> -#include <unx/gtk/gtksys.hxx> -#include <osl/module.h> - -GtkSalSystem *GtkSalSystem::GetSingleton() -{ - static GtkSalSystem *pSingleton = new GtkSalSystem(); - return pSingleton; -} - -SalSystem *GtkInstance::CreateSalSystem() -{ - return GtkSalSystem::GetSingleton(); -} - -GtkSalSystem::GtkSalSystem() : SalGenericSystem() -{ - mpDisplay = gdk_display_get_default(); - countScreenMonitors(); -#if GTK_CHECK_VERSION(3,0,0) - // rhbz#1285356, native look will be gtk2, which crashes - // when gtk3 is already loaded. Until there is a solution - // java-side force look and feel to something that doesn't - // crash when we are using gtk3 - setenv("STOC_FORCE_SYSTEM_LAF", "true", 1); -#endif -} - -GtkSalSystem::~GtkSalSystem() -{ -} - -int -GtkSalSystem::GetDisplayXScreenCount() -{ - return gdk_display_get_n_screens (mpDisplay); -} - -namespace -{ - -struct GdkRectangleCoincidentLess -{ - // fdo#78799 - detect and elide overlaying monitors of different sizes - bool operator()(GdkRectangle const& rLeft, GdkRectangle const& rRight) - { - return - rLeft.x < rRight.x - || rLeft.y < rRight.y - ; - } -}; -struct GdkRectangleCoincident -{ - // fdo#78799 - detect and elide overlaying monitors of different sizes - bool operator()(GdkRectangle const& rLeft, GdkRectangle const& rRight) - { - return - rLeft.x == rRight.x - && rLeft.y == rRight.y - ; - } -}; - -} - -/** - * GtkSalSystem::countScreenMonitors() - * - * This method builds the vector which allows us to map from VCL's - * idea of linear integer ScreenNumber to gtk+'s rather more - * complicated screen + monitor concept. - */ -void -GtkSalSystem::countScreenMonitors() -{ - maScreenMonitors.clear(); - for (gint i = 0; i < gdk_display_get_n_screens(mpDisplay); i++) - { - GdkScreen* const pScreen(gdk_display_get_screen(mpDisplay, i)); - gint nMonitors(pScreen ? gdk_screen_get_n_monitors(pScreen) : 0); - if (nMonitors > 1) - { - std::vector<GdkRectangle> aGeometries; - aGeometries.reserve(nMonitors); - for (gint j(0); j != nMonitors; ++j) - { - GdkRectangle aGeometry; - gdk_screen_get_monitor_geometry(pScreen, j, &aGeometry); - aGeometries.push_back(aGeometry); - } - std::sort(aGeometries.begin(), aGeometries.end(), - GdkRectangleCoincidentLess()); - const std::vector<GdkRectangle>::iterator aUniqueEnd( - std::unique(aGeometries.begin(), aGeometries.end(), - GdkRectangleCoincident())); - nMonitors = std::distance(aGeometries.begin(), aUniqueEnd); - } - maScreenMonitors.emplace_back(pScreen, nMonitors); - } -} - -// Including gdkx.h kills us with the Window / XWindow conflict -extern "C" { -#if GTK_CHECK_VERSION(3,0,0) - GType gdk_x11_display_get_type(); -#endif - int gdk_x11_screen_get_screen_number (GdkScreen *screen); -} - -SalX11Screen -GtkSalSystem::getXScreenFromDisplayScreen(unsigned int nScreen) -{ - gint nMonitor; - - GdkScreen *pScreen = getScreenMonitorFromIdx (nScreen, nMonitor); - if (!pScreen) - return SalX11Screen (0); -#if GTK_CHECK_VERSION(3,0,0) - if (!G_TYPE_CHECK_INSTANCE_TYPE (mpDisplay, gdk_x11_display_get_type ())) - return SalX11Screen (0); -#endif - return SalX11Screen (gdk_x11_screen_get_screen_number (pScreen)); -} - -GdkScreen * -GtkSalSystem::getScreenMonitorFromIdx (int nIdx, gint &nMonitor) -{ - GdkScreen *pScreen = nullptr; - for (auto const& screenMonitor : maScreenMonitors) - { - pScreen = screenMonitor.first; - if (!pScreen) - break; - if (nIdx >= screenMonitor.second) - nIdx -= screenMonitor.second; - else - break; - } - nMonitor = nIdx; - - // handle invalid monitor indexes as non-existent screens - if (nMonitor < 0 || (pScreen && nMonitor >= gdk_screen_get_n_monitors (pScreen))) - pScreen = nullptr; - - return pScreen; -} - -int -GtkSalSystem::getScreenIdxFromPtr (GdkScreen *pScreen) -{ - int nIdx = 0; - for (auto const& screenMonitor : maScreenMonitors) - { - if (screenMonitor.first == pScreen) - return nIdx; - nIdx += screenMonitor.second; - } - g_warning ("failed to find screen %p", pScreen); - return 0; -} - -int GtkSalSystem::getScreenMonitorIdx (GdkScreen *pScreen, - int nX, int nY) -{ - // TODO: this will fail horribly for exotic combinations like two - // monitors in mirror mode and one extra. Hopefully such - // abominations are not used (or, even better, not possible) in - // practice .-) - return getScreenIdxFromPtr (pScreen) + - gdk_screen_get_monitor_at_point (pScreen, nX, nY); -} - -unsigned int GtkSalSystem::GetDisplayScreenCount() -{ - gint nMonitor; - (void)getScreenMonitorFromIdx (G_MAXINT, nMonitor); - return G_MAXINT - nMonitor; -} - -bool GtkSalSystem::IsUnifiedDisplay() -{ - return gdk_display_get_n_screens (mpDisplay) == 1; -} - -namespace { -int _fallback_get_primary_monitor (GdkScreen *pScreen) -{ - // Use monitor name as primacy heuristic - int max = gdk_screen_get_n_monitors (pScreen); - for (int i = 0; i < max; ++i) - { - char *name = gdk_screen_get_monitor_plug_name (pScreen, i); - bool bLaptop = (name && !g_ascii_strncasecmp (name, "LVDS", 4)); - g_free (name); - if (bLaptop) - return i; - } - return 0; -} - -int _get_primary_monitor (GdkScreen *pScreen) -{ - static int (*get_fn) (GdkScreen *) = nullptr; -#if GTK_CHECK_VERSION(3,0,0) - get_fn = gdk_screen_get_primary_monitor; -#endif - // Perhaps we have a newer gtk+ with this symbol: - if (!get_fn) - { - get_fn = reinterpret_cast<int(*)(GdkScreen*)>(osl_getAsciiFunctionSymbol(nullptr, - "gdk_screen_get_primary_monitor")); - } - if (!get_fn) - get_fn = _fallback_get_primary_monitor; - if (get_fn) - return get_fn (pScreen); - else - return 0; -} -} // end anonymous namespace - -unsigned int GtkSalSystem::GetDisplayBuiltInScreen() -{ - GdkScreen *pDefault = gdk_display_get_default_screen (mpDisplay); - int idx = getScreenIdxFromPtr (pDefault); - return idx + _get_primary_monitor (pDefault); -} - -tools::Rectangle GtkSalSystem::GetDisplayScreenPosSizePixel (unsigned int nScreen) -{ - gint nMonitor; - GdkScreen *pScreen; - GdkRectangle aRect; - pScreen = getScreenMonitorFromIdx (nScreen, nMonitor); - if (!pScreen) - return tools::Rectangle(); - gdk_screen_get_monitor_geometry (pScreen, nMonitor, &aRect); - return tools::Rectangle (Point(aRect.x, aRect.y), Size(aRect.width, aRect.height)); -} - -// convert ~ to indicate mnemonic to '_' -static OString MapToGtkAccelerator(const OUString &rStr) -{ - return OUStringToOString(rStr.replaceFirst("~", "_"), RTL_TEXTENCODING_UTF8); -} - -int GtkSalSystem::ShowNativeDialog (const OUString& rTitle, const OUString& rMessage, - const std::vector< OUString >& rButtonNames) -{ - OString aTitle (OUStringToOString (rTitle, RTL_TEXTENCODING_UTF8)); - OString aMessage (OUStringToOString (rMessage, RTL_TEXTENCODING_UTF8)); - - GtkDialog *pDialog = GTK_DIALOG ( - g_object_new (GTK_TYPE_MESSAGE_DIALOG, - "title", aTitle.getStr(), - "message-type", int(GTK_MESSAGE_WARNING), - "text", aMessage.getStr(), - nullptr)); - int nButton = 0; - for (auto const& buttonName : rButtonNames) - gtk_dialog_add_button (pDialog, MapToGtkAccelerator(buttonName).getStr(), nButton++); - gtk_dialog_set_default_response (pDialog, 0/*nDefaultButton*/); - - nButton = gtk_dialog_run (pDialog); - if (nButton < 0) - nButton = -1; - - gtk_widget_destroy (GTK_WIDGET (pDialog)); - - return nButton; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |