diff options
author | Caolán McNamara <caolanm@redhat.com> | 2018-03-16 16:50:42 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2018-03-16 21:33:30 +0100 |
commit | 2937661f0e9381f84067a025f76e5554b8a1a457 (patch) | |
tree | fc3f39e5b61958aaadf923a3aaadac41cfbecf11 | |
parent | d2f95590f478a68a4de6ef05018785523e46506b (diff) |
rhbz#1392145 ensure titlebar close button matches 'outside' direction
Change-Id: I20e925c58adb56acd4d1a63720d330c8b6613441
Reviewed-on: https://gerrit.libreoffice.org/51433
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r-- | vcl/inc/unx/gtk/gtkframe.hxx | 1 | ||||
-rw-r--r-- | vcl/source/app/svmain.cxx | 3 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkframe.cxx | 32 |
3 files changed, 34 insertions, 2 deletions
diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx index 6f4e0db8dc7f..160a4408d44f 100644 --- a/vcl/inc/unx/gtk/gtkframe.hxx +++ b/vcl/inc/unx/gtk/gtkframe.hxx @@ -173,6 +173,7 @@ class GtkSalFrame : public SalFrame SalX11Screen m_nXScreen; GtkWidget* m_pWindow; #if GTK_CHECK_VERSION(3,0,0) + GtkHeaderBar* m_pHeaderBar; GtkGrid* m_pTopLevelGrid; #endif GtkEventBox* m_pEventBox; diff --git a/vcl/source/app/svmain.cxx b/vcl/source/app/svmain.cxx index 1e84db1dd9cf..f337bc9657ce 100644 --- a/vcl/source/app/svmain.cxx +++ b/vcl/source/app/svmain.cxx @@ -31,7 +31,7 @@ #include <comphelper/processfactory.hxx> #include <comphelper/asyncnotification.hxx> - +#include <i18nlangtag/mslangid.hxx> #include <unotools/syslocaleoptions.hxx> #include <vcl/svapp.hxx> #include <vcl/vclmain.hxx> @@ -335,6 +335,7 @@ bool InitVCL() OUString aLocaleString(SvtSysLocaleOptions().GetRealUILanguageTag().getGlibcLocaleString(".UTF-8")); if (!aLocaleString.isEmpty()) { + MsLangId::getSystemUILanguage(); //call this now to pin what the system UI really was OUString envVar("LANGUAGE"); osl_setEnvironment(envVar.pData, aLocaleString.pData); } diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx index 0171bdfcf696..f9208e0a895b 100644 --- a/vcl/unx/gtk3/gtk3gtkframe.cxx +++ b/vcl/unx/gtk3/gtk3gtkframe.cxx @@ -75,6 +75,8 @@ # include <cstdio> #endif +#include <i18nlangtag/mslangid.hxx> + #include <cstdlib> #include <cmath> @@ -488,6 +490,7 @@ bool GtkSalFrame::doKeyCallback( guint state, GtkSalFrame::GtkSalFrame( SalFrame* pParent, SalFrameStyleFlags nStyle ) : m_nXScreen( getDisplay()->GetDefaultXScreen() ) + , m_pHeaderBar(nullptr) , m_pGraphics(nullptr) , m_bGraphics(false) { @@ -500,6 +503,7 @@ GtkSalFrame::GtkSalFrame( SalFrame* pParent, SalFrameStyleFlags nStyle ) GtkSalFrame::GtkSalFrame( SystemParentData* pSysData ) : m_nXScreen( getDisplay()->GetDefaultXScreen() ) + , m_pHeaderBar(nullptr) , m_pGraphics(nullptr) , m_bGraphics(false) { @@ -1249,6 +1253,27 @@ void GtkSalFrame::Init( SalFrame* pParent, SalFrameStyleFlags nStyle ) gtk_window_set_type_hint( GTK_WINDOW(m_pWindow), eType ); gtk_window_set_gravity( GTK_WINDOW(m_pWindow), GDK_GRAVITY_STATIC ); gtk_window_set_resizable( GTK_WINDOW(m_pWindow), bool(nStyle & SalFrameStyleFlags::SIZEABLE) ); + +#if defined(GDK_WINDOWING_WAYLAND) + //rhbz#1392145 under wayland/csd if we've overridden the default widget direction in order to set LibreOffice's + //UI to the configured ui language but the system ui locale is a different text direction, then the toplevel + //built-in close button of the titlebar follows the overridden direction rather than continue in the same + //direction as every other titlebar on the user's desktop. So if they don't match set an explicit + //header bar with the desired 'outside' direction + if ((eType == GDK_WINDOW_TYPE_HINT_NORMAL || eType == GDK_WINDOW_TYPE_HINT_DIALOG) && GDK_IS_WAYLAND_DISPLAY(GtkSalFrame::getGdkDisplay())) + { + const bool bDesktopIsRTL = MsLangId::isRightToLeft(MsLangId::getSystemUILanguage()); + const bool bAppIsRTL = gtk_widget_get_default_direction() == GTK_TEXT_DIR_RTL; + if (bDesktopIsRTL != bAppIsRTL) + { + m_pHeaderBar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_set_direction(GTK_WIDGET(m_pHeaderBar), bDesktopIsRTL ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR); + gtk_header_bar_set_show_close_button(m_pHeaderBar, true); + gtk_window_set_titlebar(GTK_WINDOW(m_pWindow), GTK_WIDGET(m_pHeaderBar)); + gtk_widget_show(GTK_WIDGET(m_pHeaderBar)); + } + } +#endif } else if( nStyle & SalFrameStyleFlags::FLOAT ) gtk_window_set_type_hint( GTK_WINDOW(m_pWindow), GDK_WINDOW_TYPE_HINT_POPUP_MENU ); @@ -1340,7 +1365,12 @@ void GtkSalFrame::SetTitle( const OUString& rTitle ) { m_aTitle = rTitle; if( m_pWindow && ! isChild() ) - gtk_window_set_title( GTK_WINDOW(m_pWindow), OUStringToOString( rTitle, RTL_TEXTENCODING_UTF8 ).getStr() ); + { + OString sTitle(OUStringToOString(rTitle, RTL_TEXTENCODING_UTF8)); + gtk_window_set_title(GTK_WINDOW(m_pWindow), sTitle.getStr()); + if (m_pHeaderBar) + gtk_header_bar_set_title(m_pHeaderBar, sTitle.getStr()); + } } void GtkSalFrame::SetIcon( sal_uInt16 nIcon ) |