1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 /* 3 * This file is part of the LibreOffice project. 4 * 5 * This Source Code Form is subject to the terms of the Mozilla Public 6 * License, v. 2.0. If a copy of the MPL was not distributed with this 7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. 8 * 9 * This file incorporates work covered by the following license notice: 10 * 11 * Licensed to the Apache Software Foundation (ASF) under one or more 12 * contributor license agreements. See the NOTICE file distributed 13 * with this work for additional information regarding copyright 14 * ownership. The ASF licenses this file to you under the Apache 15 * License, Version 2.0 (the "License"); you may not use this file 16 * except in compliance with the License. You may obtain a copy of 17 * the License at http://www.apache.org/licenses/LICENSE-2.0 . 18 */ 19 20 #ifndef INCLUDED_VCL_INC_UNX_GTK_GTKGDI_HXX 21 #define INCLUDED_VCL_INC_UNX_GTK_GTKGDI_HXX 22 23 #include <config_cairo_canvas.h> 24 25 #include <gtk/gtk.h> 26 #include "gtkbackend.hxx" 27 #include <gdk/gdkkeysyms.h> 28 29 #include <unx/gtk/gtkframe.hxx> 30 #include <ControlCacheKey.hxx> 31 32 #include <headless/svpgdi.hxx> 33 #include <textrender.hxx> 34 35 enum class GtkControlPart 36 { 37 ToplevelWindow, 38 Button, 39 LinkButton, 40 CheckButton, 41 CheckButtonCheck, 42 RadioButton, 43 RadioButtonRadio, 44 Entry, 45 Combobox, 46 ComboboxBox, 47 ComboboxBoxEntry, 48 ComboboxBoxButton, 49 ComboboxBoxButtonBox, 50 ComboboxBoxButtonBoxArrow, 51 Listbox, 52 ListboxBox, 53 ListboxBoxButton, 54 ListboxBoxButtonBox, 55 ListboxBoxButtonBoxArrow, 56 SpinButton, 57 SpinButtonUpButton, 58 SpinButtonDownButton, 59 ScrollbarVertical, 60 ScrollbarVerticalContents, 61 ScrollbarVerticalTrough, 62 ScrollbarVerticalSlider, 63 ScrollbarVerticalButton, 64 ScrollbarHorizontal, 65 ScrollbarHorizontalContents, 66 ScrollbarHorizontalTrough, 67 ScrollbarHorizontalSlider, 68 ScrollbarHorizontalButton, 69 ProgressBar, 70 ProgressBarTrough, 71 ProgressBarProgress, 72 Notebook, 73 NotebookHeader, 74 NotebookStack, 75 NotebookHeaderTabs, 76 NotebookHeaderTabsTab, 77 NotebookHeaderTabsTabLabel, 78 NotebookHeaderTabsTabActiveLabel, 79 NotebookHeaderTabsTabHoverLabel, 80 FrameBorder, 81 MenuBar, 82 MenuBarItem, 83 MenuWindow, 84 Menu, 85 MenuItem, 86 MenuItemLabel, 87 MenuItemArrow, 88 CheckMenuItem, 89 CheckMenuItemCheck, 90 RadioMenuItem, 91 RadioMenuItemRadio, 92 SeparatorMenuItem, 93 SeparatorMenuItemSeparator, 94 }; 95 96 class GtkSalGraphics : public SvpSalGraphics 97 { 98 GtkSalFrame * const mpFrame; 99 100 protected: 101 #if !GTK_CHECK_VERSION(4, 0, 0) 102 bool isNativeControlSupported(ControlType, ControlPart) override; 103 virtual bool drawNativeControl( ControlType nType, ControlPart nPart, 104 const tools::Rectangle& rControlRegion, 105 ControlState nState, const ImplControlValue& aValue, 106 const OUString& rCaption, 107 const Color& rBackgroundColor ) override; 108 virtual bool getNativeControlRegion( ControlType nType, ControlPart nPart, 109 const tools::Rectangle& rControlRegion, 110 ControlState nState, 111 const ImplControlValue& aValue, 112 const OUString& rCaption, 113 tools::Rectangle &rNativeBoundingRegion, 114 tools::Rectangle &rNativeContentRegion ) override; 115 #endif 116 bool updateSettings(AllSettings&) override; 117 void handleDamage(const tools::Rectangle&) override; 118 119 public: 120 GtkSalGraphics( GtkSalFrame *pFrame, GtkWidget *pWindow ); 121 122 #if ENABLE_CAIRO_CANVAS 123 virtual bool SupportsCairo() const override; 124 virtual cairo::SurfaceSharedPtr CreateSurface(const cairo::CairoSurfaceSharedPtr& rSurface) const override; 125 virtual cairo::SurfaceSharedPtr CreateSurface(const OutputDevice& rRefDevice, int x, int y, int width, int height) const override; 126 #endif 127 128 void WidgetQueueDraw() const; 129 130 virtual void GetResolution(sal_Int32& rDPIX, sal_Int32& rDPIY) override; 131 getRenderBackendName() const132 virtual OUString getRenderBackendName() const override { return "gtk3svp"; } 133 134 GtkStyleContext* createStyleContext(GtkControlPart ePart); 135 #if !GTK_CHECK_VERSION(4, 0, 0) 136 GtkStyleContext* makeContext(GtkWidgetPath *pPath, GtkStyleContext *pParent); 137 #endif 138 private: 139 GtkWidget *mpWindow; 140 static GtkStyleContext *mpWindowStyle; 141 static GtkStyleContext *mpButtonStyle; 142 static GtkStyleContext *mpLinkButtonStyle; 143 static GtkStyleContext *mpEntryStyle; 144 static GtkStyleContext *mpTextViewStyle; 145 static GtkStyleContext *mpVScrollbarStyle; 146 static GtkStyleContext *mpVScrollbarContentsStyle; 147 static GtkStyleContext *mpVScrollbarTroughStyle; 148 static GtkStyleContext *mpVScrollbarSliderStyle; 149 static GtkStyleContext *mpVScrollbarButtonStyle; 150 static GtkStyleContext *mpHScrollbarStyle; 151 static GtkStyleContext *mpHScrollbarContentsStyle; 152 static GtkStyleContext *mpHScrollbarTroughStyle; 153 static GtkStyleContext *mpHScrollbarSliderStyle; 154 static GtkStyleContext *mpHScrollbarButtonStyle; 155 static GtkStyleContext *mpToolbarStyle; 156 static GtkStyleContext *mpToolButtonStyle; 157 static GtkStyleContext *mpToolbarSeparatorStyle; 158 static GtkStyleContext *mpCheckButtonStyle; 159 static GtkStyleContext *mpCheckButtonCheckStyle; 160 static GtkStyleContext *mpRadioButtonStyle; 161 static GtkStyleContext *mpRadioButtonRadioStyle; 162 static GtkStyleContext *mpSpinStyle; 163 static GtkStyleContext *mpSpinUpStyle; 164 static GtkStyleContext *mpSpinDownStyle; 165 static GtkStyleContext *mpComboboxStyle; 166 static GtkStyleContext *mpComboboxBoxStyle; 167 static GtkStyleContext *mpComboboxEntryStyle; 168 static GtkStyleContext *mpComboboxButtonStyle; 169 static GtkStyleContext *mpComboboxButtonBoxStyle; 170 static GtkStyleContext *mpComboboxButtonArrowStyle; 171 static GtkStyleContext *mpListboxStyle; 172 static GtkStyleContext *mpListboxBoxStyle; 173 static GtkStyleContext *mpListboxButtonStyle; 174 static GtkStyleContext *mpListboxButtonBoxStyle; 175 static GtkStyleContext *mpListboxButtonArrowStyle; 176 static GtkStyleContext *mpFrameInStyle; 177 static GtkStyleContext *mpFrameOutStyle; 178 static GtkStyleContext *mpFixedHoriLineStyle; 179 static GtkStyleContext *mpFixedVertLineStyle; 180 static GtkStyleContext *mpTreeHeaderButtonStyle; 181 static GtkStyleContext *mpProgressBarStyle; 182 static GtkStyleContext *mpProgressBarTroughStyle; 183 static GtkStyleContext *mpProgressBarProgressStyle; 184 static GtkStyleContext *mpNotebookStyle; 185 static GtkStyleContext *mpNotebookStackStyle; 186 static GtkStyleContext *mpNotebookHeaderStyle; 187 static GtkStyleContext *mpNotebookHeaderTabsStyle; 188 static GtkStyleContext *mpNotebookHeaderTabsTabStyle; 189 static GtkStyleContext *mpNotebookHeaderTabsTabLabelStyle; 190 static GtkStyleContext *mpNotebookHeaderTabsTabActiveLabelStyle; 191 static GtkStyleContext *mpNotebookHeaderTabsTabHoverLabelStyle; 192 static GtkStyleContext *mpMenuBarStyle; 193 static GtkStyleContext *mpMenuBarItemStyle; 194 static GtkStyleContext *mpMenuWindowStyle; 195 static GtkStyleContext *mpMenuStyle; 196 static GtkStyleContext *mpMenuItemStyle; 197 static GtkStyleContext *mpMenuItemLabelStyle; 198 static GtkStyleContext *mpMenuItemArrowStyle; 199 static GtkStyleContext *mpCheckMenuItemStyle; 200 static GtkStyleContext *mpCheckMenuItemCheckStyle; 201 static GtkStyleContext *mpRadioMenuItemStyle; 202 static GtkStyleContext *mpRadioMenuItemRadioStyle; 203 static GtkStyleContext *mpSeparatorMenuItemStyle; 204 static GtkStyleContext *mpSeparatorMenuItemSeparatorStyle; 205 206 #if !GTK_CHECK_VERSION(4, 0, 0) 207 static tools::Rectangle NWGetScrollButtonRect( ControlPart nPart, tools::Rectangle aAreaRect ); 208 static tools::Rectangle NWGetSpinButtonRect( ControlPart nPart, tools::Rectangle aAreaRect); 209 static tools::Rectangle NWGetComboBoxButtonRect(ControlType nType, ControlPart nPart, tools::Rectangle aAreaRect); 210 211 static void PaintScrollbar(GtkStyleContext *context, 212 cairo_t *cr, 213 const tools::Rectangle& rControlRectangle, 214 ControlPart nPart, 215 const ImplControlValue& aValue ); 216 void PaintOneSpinButton( GtkStyleContext *context, 217 cairo_t *cr, 218 ControlPart nPart, 219 tools::Rectangle aAreaRect, 220 ControlState nState ); 221 void PaintSpinButton(GtkStateFlags flags, 222 cairo_t *cr, 223 const tools::Rectangle& rControlRectangle, 224 ControlPart nPart, 225 const ImplControlValue& aValue); 226 static void PaintCombobox(GtkStateFlags flags, 227 cairo_t *cr, 228 const tools::Rectangle& rControlRectangle, 229 ControlType nType, 230 ControlPart nPart); 231 static void PaintCheckOrRadio(cairo_t *cr, GtkStyleContext *context, 232 const tools::Rectangle& rControlRectangle, 233 bool bIsCheck, bool bInMenu); 234 235 static void PaintCheck(cairo_t *cr, GtkStyleContext *context, 236 const tools::Rectangle& rControlRectangle, bool bInMenu); 237 238 static void PaintRadio(cairo_t *cr, GtkStyleContext *context, 239 const tools::Rectangle& rControlRectangle, bool bInMenu); 240 #endif 241 242 static bool style_loaded; 243 }; 244 245 #endif // INCLUDED_VCL_INC_UNX_GTK_GTKGDI_HXX 246 247 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 248