mozilla-enable-csd.patch
author Wolfgang Rosenauer <wr@rosenauer.org>
Sat, 23 Jun 2018 09:43:17 +0200
branchfirefox61
changeset 1061 42510f8eee28
parent 1046 75893a3d8fbe
permissions -rw-r--r--
61.0 release
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1046
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     1
This is a composition of these patches for Firefox 60:
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     2
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     3
https://bugzilla.mozilla.org/show_bug.cgi?id=1441873
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     4
https://bugzilla.mozilla.org/show_bug.cgi?id=1441665
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     5
https://bugzilla.mozilla.org/show_bug.cgi?id=1456898
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     6
https://bugzilla.mozilla.org/show_bug.cgi?id=1457309
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     7
https://bugzilla.mozilla.org/show_bug.cgi?id=1457691
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     8
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     9
which fix popup window placement at CSD window mode.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    10
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    11
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    12
diff --git a/widget/gtk/nsLookAndFeel.cpp b/widget/gtk/nsLookAndFeel.cpp
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    13
--- a/widget/gtk/nsLookAndFeel.cpp
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    14
+++ b/widget/gtk/nsLookAndFeel.cpp
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    15
@@ -1076,19 +1076,18 @@ nsLookAndFeel::EnsureInit()
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    16
                          nullptr);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    17
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    18
     GetSystemFontInfo(gtk_widget_get_style_context(entry),
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    19
                       &mFieldFontName, &mFieldFontStyle);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    20
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    21
     gtk_widget_destroy(window);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    22
     g_object_unref(labelWidget);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    23
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    24
-    // Require GTK 3.10 for GtkHeaderBar support and compatible window manager.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    25
-    mCSDAvailable = (gtk_check_version(3, 10, 0) == nullptr &&
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    26
-        nsWindow::GetCSDSupportLevel() != nsWindow::CSD_SUPPORT_NONE);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    27
+    mCSDAvailable =
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    28
+        nsWindow::GetSystemCSDSupportLevel() != nsWindow::CSD_SUPPORT_NONE;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    29
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    30
     mCSDCloseButton = false;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    31
     mCSDMinimizeButton = false;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    32
     mCSDMaximizeButton = false;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    33
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    34
     // We need to initialize whole CSD config explicitly because it's queried
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    35
     // as -moz-gtk* media features.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    36
     WidgetNodeType buttonLayout[TOOLBAR_BUTTONS];
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    37
diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    38
--- a/widget/gtk/nsWindow.h
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    39
+++ b/widget/gtk/nsWindow.h
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    40
@@ -395,28 +395,26 @@ public:
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    41
     // From GDK
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    42
     int GdkCoordToDevicePixels(gint coord);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    43
     LayoutDeviceIntPoint GdkPointToDevicePixels(GdkPoint point);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    44
     LayoutDeviceIntPoint GdkEventCoordsToDevicePixels(gdouble x, gdouble y);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    45
     LayoutDeviceIntRect GdkRectToDevicePixels(GdkRectangle rect);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    46
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    47
     virtual bool WidgetTypeSupportsAcceleration() override;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    48
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    49
-    bool DoDrawTitlebar() const;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    50
-
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    51
     typedef enum { CSD_SUPPORT_SYSTEM,    // CSD including shadows
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    52
                    CSD_SUPPORT_CLIENT,    // CSD without shadows
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    53
                    CSD_SUPPORT_NONE,      // WM does not support CSD at all
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    54
                    CSD_SUPPORT_UNKNOWN
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    55
     } CSDSupportLevel;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    56
     /**
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    57
      * Get the support of Client Side Decoration by checking
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    58
      * the XDG_CURRENT_DESKTOP environment variable.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    59
      */
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    60
-    static CSDSupportLevel GetCSDSupportLevel();
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    61
+    static CSDSupportLevel GetSystemCSDSupportLevel();
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    62
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    63
 protected:
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    64
     virtual ~nsWindow();
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    65
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    66
     // event handling code
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    67
     void DispatchActivateEvent(void);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    68
     void DispatchDeactivateEvent(void);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    69
     void DispatchResized();
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    70
@@ -512,19 +510,21 @@ private:
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    71
     int                 mXDepth;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    72
     mozilla::widget::WindowSurfaceProvider mSurfaceProvider;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    73
 #endif
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    74
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    75
     // Upper bound on pending ConfigureNotify events to be dispatched to the
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    76
     // window. See bug 1225044.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    77
     unsigned int mPendingConfigures;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    78
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    79
-    bool               mIsCSDAvailable;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    80
+    // Window titlebar rendering mode, CSD_SUPPORT_NONE if it's disabled
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    81
+    // for this window.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    82
+    CSDSupportLevel    mCSDSupportLevel;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    83
     // If true, draw our own window titlebar.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    84
-    bool               mIsCSDEnabled;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    85
+    bool               mDrawInTitlebar;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    86
     // Draggable titlebar region maintained by UpdateWindowDraggingRegion
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    87
     LayoutDeviceIntRegion mDraggableRegion;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    88
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    89
 #ifdef ACCESSIBILITY
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    90
     RefPtr<mozilla::a11y::Accessible> mRootAccessible;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    91
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    92
     /**
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    93
      * Request to create the accessible for this window if it is top level.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    94
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    95
diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    96
--- a/widget/gtk/nsWindow.cpp
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    97
+++ b/widget/gtk/nsWindow.cpp
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    98
@@ -474,18 +474,18 @@ nsWindow::nsWindow()
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    99
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   100
     mTransparencyBitmapWidth  = 0;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   101
     mTransparencyBitmapHeight = 0;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   102
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   103
 #if GTK_CHECK_VERSION(3,4,0)
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   104
     mLastScrollEventTime = GDK_CURRENT_TIME;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   105
 #endif
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   106
     mPendingConfigures = 0;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   107
-    mIsCSDAvailable = false;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   108
-    mIsCSDEnabled = false;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   109
+    mCSDSupportLevel = CSD_SUPPORT_NONE;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   110
+    mDrawInTitlebar = false;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   111
 }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   112
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   113
 nsWindow::~nsWindow()
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   114
 {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   115
     LOG(("nsWindow::~nsWindow() [%p]\n", (void *)this));
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   116
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   117
     delete[] mTransparencyBitmap;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   118
     mTransparencyBitmap = nullptr;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   119
@@ -2814,17 +2814,17 @@ nsWindow::OnButtonReleaseEvent(GdkEventB
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   120
     LayoutDeviceIntPoint pos = event.mRefPoint;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   121
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   122
     nsEventStatus eventStatus = DispatchInputEvent(&event);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   123
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   124
     bool defaultPrevented = (eventStatus == nsEventStatus_eConsumeNoDefault);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   125
     // Check if mouse position in titlebar and doubleclick happened to
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   126
     // trigger restore/maximize.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   127
     if (!defaultPrevented
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   128
-             && mIsCSDEnabled
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   129
+             && mDrawInTitlebar
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   130
              && event.button == WidgetMouseEvent::eLeftButton
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   131
              && event.mClickCount == 2
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   132
              && mDraggableRegion.Contains(pos.x, pos.y)) {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   133
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   134
         if (mSizeState == nsSizeMode_Maximized) {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   135
             SetSizeMode(nsSizeMode_Normal);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   136
         } else {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   137
             SetSizeMode(nsSizeMode_Maximized);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   138
@@ -3758,22 +3758,18 @@ nsWindow::Create(nsIWidget* aParent,
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   139
             gtk_window_set_wmclass(GTK_WINDOW(mShell), "Toplevel",
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   140
                                    gdk_get_program_class());
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   141
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   142
             // each toplevel window gets its own window group
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   143
             GtkWindowGroup *group = gtk_window_group_new();
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   144
             gtk_window_group_add_window(group, GTK_WINDOW(mShell));
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   145
             g_object_unref(group);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   146
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   147
-            int32_t isCSDAvailable = false;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   148
-            nsresult rv = LookAndFeel::GetInt(LookAndFeel::eIntID_GTKCSDAvailable,
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   149
-                                              &isCSDAvailable);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   150
-            if (NS_SUCCEEDED(rv)) {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   151
-               mIsCSDAvailable = isCSDAvailable;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   152
-            }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   153
+            // We enable titlebar rendering for toplevel windows only.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   154
+            mCSDSupportLevel = GetSystemCSDSupportLevel();
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   155
         }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   156
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   157
         // Create a container to hold child windows and child GtkWidgets.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   158
         GtkWidget *container = moz_container_new();
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   159
         mContainer = MOZ_CONTAINER(container);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   160
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   161
         // "csd" style is set when widget is realized so we need to call
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   162
         // it explicitly now.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   163
@@ -3788,17 +3784,17 @@ nsWindow::Create(nsIWidget* aParent,
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   164
          *    are drawn by Gtk+ to mShell. Content is rendered to mContainer
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   165
          *    and we listen to the Gtk+ events on mContainer.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   166
          * 3) We're running on Wayland. All gecko content is rendered
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   167
          *    to mContainer and we listen to the Gtk+ events on mContainer.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   168
          */
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   169
         GtkStyleContext* style = gtk_widget_get_style_context(mShell);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   170
         drawToContainer =
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   171
             !mIsX11Display ||
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   172
-            (mIsCSDAvailable && GetCSDSupportLevel() == CSD_SUPPORT_CLIENT) ||
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   173
+            (mCSDSupportLevel == CSD_SUPPORT_CLIENT) ||
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   174
             gtk_style_context_has_class(style, "csd");
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   175
         eventWidget = (drawToContainer) ? container : mShell;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   176
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   177
         gtk_widget_add_events(eventWidget, kEvents);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   178
         if (drawToContainer)
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   179
             gtk_widget_add_events(mShell, GDK_PROPERTY_CHANGE_MASK);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   180
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   181
         // Prevent GtkWindow from painting a background to avoid flickering.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   182
@@ -6581,90 +6577,91 @@ nsWindow::ClearCachedResources()
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   183
             window->ClearCachedResources();
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   184
         }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   185
     }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   186
 }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   187
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   188
 nsresult
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   189
 nsWindow::SetNonClientMargins(LayoutDeviceIntMargin &aMargins)
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   190
 {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   191
-  SetDrawsInTitlebar(aMargins.top == 0);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   192
-  return NS_OK;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   193
+    SetDrawsInTitlebar(aMargins.top == 0);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   194
+    return NS_OK;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   195
 }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   196
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   197
 void
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   198
 nsWindow::SetDrawsInTitlebar(bool aState)
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   199
 {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   200
-  if (!mIsCSDAvailable || aState == mIsCSDEnabled)
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   201
-      return;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   202
-
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   203
-  if (mShell) {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   204
-      if (GetCSDSupportLevel() == CSD_SUPPORT_SYSTEM) {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   205
-          SetWindowDecoration(aState ? eBorderStyle_border : mBorderStyle);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   206
-      }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   207
-      else {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   208
-          /* Window manager does not support GDK_DECOR_BORDER,
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   209
-           * emulate it by CSD.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   210
-           *
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   211
-           * gtk_window_set_titlebar() works on unrealized widgets only,
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   212
-           * we need to handle mShell carefully here.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   213
-           * When CSD is enabled mGdkWindow is owned by mContainer which is good
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   214
-           * as we can't delete our mGdkWindow. To make mShell unrealized while
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   215
-           * mContainer is preserved we temporary reparent mContainer to an
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   216
-           * invisible GtkWindow.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   217
-           */
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   218
-          NativeShow(false);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   219
-
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   220
-          // Using GTK_WINDOW_POPUP rather than
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   221
-          // GTK_WINDOW_TOPLEVEL in the hope that POPUP results in less
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   222
-          // initialization and window manager interaction.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   223
-          GtkWidget* tmpWindow = gtk_window_new(GTK_WINDOW_POPUP);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   224
-          gtk_widget_realize(tmpWindow);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   225
-
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   226
-          gtk_widget_reparent(GTK_WIDGET(mContainer), tmpWindow);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   227
-          gtk_widget_unrealize(GTK_WIDGET(mShell));
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   228
-
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   229
-          // Available as of GTK 3.10+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   230
-          static auto sGtkWindowSetTitlebar = (void (*)(GtkWindow*, GtkWidget*))
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   231
-              dlsym(RTLD_DEFAULT, "gtk_window_set_titlebar");
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   232
-          MOZ_ASSERT(sGtkWindowSetTitlebar,
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   233
-              "Missing gtk_window_set_titlebar(), old Gtk+ library?");
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   234
-
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   235
-          if (aState) {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   236
-              // Add a hidden titlebar widget to trigger CSD, but disable the default
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   237
-              // titlebar.  GtkFixed is a somewhat random choice for a simple unused
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   238
-              // widget. gtk_window_set_titlebar() takes ownership of the titlebar
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   239
-              // widget.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   240
-              sGtkWindowSetTitlebar(GTK_WINDOW(mShell), gtk_fixed_new());
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   241
-          } else {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   242
-              sGtkWindowSetTitlebar(GTK_WINDOW(mShell), nullptr);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   243
-          }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   244
-
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   245
-          /* A workaround for https://bugzilla.gnome.org/show_bug.cgi?id=791081
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   246
-           * gtk_widget_realize() throws:
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   247
-           * "In pixman_region32_init_rect: Invalid rectangle passed"
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   248
-           * when mShell has default 1x1 size.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   249
-           */
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   250
-          GtkAllocation allocation = {0, 0, 0, 0};
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   251
-          gtk_widget_get_preferred_width(GTK_WIDGET(mShell), nullptr,
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   252
-                                         &allocation.width);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   253
-          gtk_widget_get_preferred_height(GTK_WIDGET(mShell), nullptr,
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   254
-                                          &allocation.height);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   255
-          gtk_widget_size_allocate(GTK_WIDGET(mShell), &allocation);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   256
-
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   257
-          gtk_widget_realize(GTK_WIDGET(mShell));
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   258
-          gtk_widget_reparent(GTK_WIDGET(mContainer), GTK_WIDGET(mShell));
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   259
-          mNeedsShow = true;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   260
-          NativeResize();
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   261
-
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   262
-          gtk_widget_destroy(tmpWindow);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   263
-      }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   264
-  }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   265
-
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   266
-  mIsCSDEnabled = aState;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   267
+    if (!mShell ||
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   268
+        mCSDSupportLevel == CSD_SUPPORT_NONE ||
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   269
+        aState == mDrawInTitlebar) {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   270
+        return;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   271
+    }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   272
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   273
+    if (mCSDSupportLevel == CSD_SUPPORT_SYSTEM) {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   274
+        SetWindowDecoration(aState ? eBorderStyle_border : mBorderStyle);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   275
+    }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   276
+    else if (mCSDSupportLevel == CSD_SUPPORT_CLIENT) {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   277
+        /* Window manager does not support GDK_DECOR_BORDER,
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   278
+         * emulate it by CSD.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   279
+         *
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   280
+         * gtk_window_set_titlebar() works on unrealized widgets only,
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   281
+         * we need to handle mShell carefully here.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   282
+         * When CSD is enabled mGdkWindow is owned by mContainer which is good
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   283
+         * as we can't delete our mGdkWindow. To make mShell unrealized while
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   284
+         * mContainer is preserved we temporary reparent mContainer to an
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   285
+         * invisible GtkWindow.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   286
+         */
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   287
+        NativeShow(false);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   288
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   289
+        // Using GTK_WINDOW_POPUP rather than
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   290
+        // GTK_WINDOW_TOPLEVEL in the hope that POPUP results in less
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   291
+        // initialization and window manager interaction.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   292
+        GtkWidget* tmpWindow = gtk_window_new(GTK_WINDOW_POPUP);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   293
+        gtk_widget_realize(tmpWindow);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   294
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   295
+        gtk_widget_reparent(GTK_WIDGET(mContainer), tmpWindow);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   296
+        gtk_widget_unrealize(GTK_WIDGET(mShell));
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   297
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   298
+        // Available as of GTK 3.10+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   299
+        static auto sGtkWindowSetTitlebar = (void (*)(GtkWindow*, GtkWidget*))
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   300
+            dlsym(RTLD_DEFAULT, "gtk_window_set_titlebar");
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   301
+        MOZ_ASSERT(sGtkWindowSetTitlebar,
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   302
+            "Missing gtk_window_set_titlebar(), old Gtk+ library?");
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   303
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   304
+        if (aState) {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   305
+            // Add a hidden titlebar widget to trigger CSD, but disable the default
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   306
+            // titlebar.  GtkFixed is a somewhat random choice for a simple unused
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   307
+            // widget. gtk_window_set_titlebar() takes ownership of the titlebar
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   308
+            // widget.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   309
+            sGtkWindowSetTitlebar(GTK_WINDOW(mShell), gtk_fixed_new());
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   310
+        } else {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   311
+            sGtkWindowSetTitlebar(GTK_WINDOW(mShell), nullptr);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   312
+        }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   313
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   314
+        /* A workaround for https://bugzilla.gnome.org/show_bug.cgi?id=791081
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   315
+         * gtk_widget_realize() throws:
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   316
+         * "In pixman_region32_init_rect: Invalid rectangle passed"
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   317
+         * when mShell has default 1x1 size.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   318
+         */
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   319
+        GtkAllocation allocation = {0, 0, 0, 0};
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   320
+        gtk_widget_get_preferred_width(GTK_WIDGET(mShell), nullptr,
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   321
+                                       &allocation.width);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   322
+        gtk_widget_get_preferred_height(GTK_WIDGET(mShell), nullptr,
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   323
+                                        &allocation.height);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   324
+        gtk_widget_size_allocate(GTK_WIDGET(mShell), &allocation);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   325
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   326
+        gtk_widget_realize(GTK_WIDGET(mShell));
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   327
+        gtk_widget_reparent(GTK_WIDGET(mContainer), GTK_WIDGET(mShell));
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   328
+        mNeedsShow = true;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   329
+        NativeResize();
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   330
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   331
+        gtk_widget_destroy(tmpWindow);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   332
+    }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   333
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   334
+    mDrawInTitlebar = aState;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   335
 }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   336
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   337
 gint
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   338
 nsWindow::GdkScaleFactor()
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   339
 {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   340
 #if (MOZ_WIDGET_GTK >= 3)
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   341
     // Available as of GTK 3.10+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   342
     static auto sGdkWindowGetScaleFactorPtr = (gint (*)(GdkWindow*))
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   343
@@ -6923,28 +6920,28 @@ nsWindow::SynthesizeNativeTouchPoint(uin
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   344
   event.touch.y = DevicePixelsToGdkCoordRoundDown(pointInWindow.y);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   345
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   346
   gdk_event_put(&event);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   347
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   348
   return NS_OK;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   349
 }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   350
 #endif
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   351
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   352
-bool
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   353
-nsWindow::DoDrawTitlebar() const
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   354
-{
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   355
-    return mIsCSDEnabled && mSizeState == nsSizeMode_Normal;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   356
-}
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   357
-
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   358
 nsWindow::CSDSupportLevel
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   359
-nsWindow::GetCSDSupportLevel() {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   360
+nsWindow::GetSystemCSDSupportLevel() {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   361
     if (sCSDSupportLevel != CSD_SUPPORT_UNKNOWN) {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   362
         return sCSDSupportLevel;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   363
     }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   364
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   365
+    // Require GTK 3.10 for GtkHeaderBar support and compatible window manager.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   366
+    if (gtk_check_version(3, 10, 0) != nullptr) {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   367
+        sCSDSupportLevel = CSD_SUPPORT_NONE;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   368
+        return sCSDSupportLevel;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   369
+    }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   370
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   371
     const char* currentDesktop = getenv("XDG_CURRENT_DESKTOP");
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   372
     if (currentDesktop) {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   373
         // GNOME Flashback (fallback)
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   374
         if (strstr(currentDesktop, "GNOME-Flashback:GNOME") != nullptr) {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   375
             sCSDSupportLevel = CSD_SUPPORT_CLIENT;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   376
         // gnome-shell
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   377
         } else if (strstr(currentDesktop, "GNOME") != nullptr) {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   378
             sCSDSupportLevel = CSD_SUPPORT_SYSTEM;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   379
diff -up firefox-60.0/widget/gtk/gtk3drawing.cpp.orig firefox-60.0/widget/gtk/gtk3drawing.cpp
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   380
--- firefox-60.0/widget/gtk/gtk3drawing.cpp.orig	2018-04-26 22:07:36.000000000 +0200
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   381
+++ firefox-60.0/widget/gtk/gtk3drawing.cpp	2018-04-30 13:38:19.083949868 +0200
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   382
@@ -38,6 +38,16 @@ static ToolbarGTKMetrics sToolbarMetrics
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   383
 #define GTK_STATE_FLAG_CHECKED (1 << 11)
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   384
 #endif
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   385
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   386
+static GtkBorder
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   387
+operator+=(GtkBorder& first, const GtkBorder& second)
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   388
+{
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   389
+    first.left += second.left;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   390
+    first.right += second.right;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   391
+    first.top += second.top;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   392
+    first.bottom += second.bottom;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   393
+    return first;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   394
+}
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   395
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   396
 static gint
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   397
 moz_gtk_get_tab_thickness(GtkStyleContext *style);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   398
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   399
@@ -3056,6 +3066,76 @@ GetScrollbarMetrics(GtkOrientation aOrie
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   400
     return metrics;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   401
 }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   402
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   403
+/*
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   404
+ * get_shadow_width() from gtkwindow.c is not public so we need
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   405
+ * to implement it.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   406
+ */
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   407
+bool
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   408
+GetCSDDecorationSize(GtkWindow *aGtkWindow, GtkBorder* aDecorationSize)
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   409
+{
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   410
+    GtkStyleContext* context = gtk_widget_get_style_context(GTK_WIDGET(aGtkWindow));
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   411
+    bool solidDecorations = gtk_style_context_has_class(context, "solid-csd");
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   412
+    context = GetStyleContext(solidDecorations ?
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   413
+                              MOZ_GTK_WINDOW_DECORATION_SOLID :
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   414
+                              MOZ_GTK_WINDOW_DECORATION);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   415
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   416
+    /* Always sum border + padding */
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   417
+    GtkBorder padding;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   418
+    GtkStateFlags state = gtk_style_context_get_state(context);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   419
+    gtk_style_context_get_border(context, state, aDecorationSize);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   420
+    gtk_style_context_get_padding(context, state, &padding);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   421
+    *aDecorationSize += padding;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   422
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   423
+    // Available on GTK 3.20+.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   424
+    static auto sGtkRenderBackgroundGetClip =
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   425
+        (void (*)(GtkStyleContext*, gdouble, gdouble, gdouble, gdouble, GdkRectangle*))
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   426
+        dlsym(RTLD_DEFAULT, "gtk_render_background_get_clip");
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   427
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   428
+    GtkBorder margin;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   429
+    gtk_style_context_get_margin(context, state, &margin);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   430
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   431
+    GtkBorder extents = {0, 0, 0, 0};
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   432
+    if (sGtkRenderBackgroundGetClip) {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   433
+        /* Get shadow extents but combine with style margin; use the bigger value.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   434
+         */
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   435
+        GdkRectangle clip;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   436
+        sGtkRenderBackgroundGetClip(context, 0, 0, 0, 0, &clip);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   437
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   438
+        extents.top = -clip.y;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   439
+        extents.right = clip.width + clip.x;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   440
+        extents.bottom = clip.height + clip.y;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   441
+        extents.left = -clip.x;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   442
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   443
+        // Margin is used for resize grip size - it's not present on
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   444
+        // popup windows.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   445
+        if (gtk_window_get_window_type(aGtkWindow) != GTK_WINDOW_POPUP) {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   446
+            extents.top = MAX(extents.top, margin.top);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   447
+            extents.right = MAX(extents.right, margin.right);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   448
+            extents.bottom = MAX(extents.bottom, margin.bottom);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   449
+            extents.left = MAX(extents.left, margin.left);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   450
+        }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   451
+    } else {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   452
+        /* If we can't get shadow extents use decoration-resize-handle instead
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   453
+         * as a workaround. This is inspired by update_border_windows()
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   454
+         * from gtkwindow.c although this is not 100% accurate as we emulate
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   455
+         * the extents here.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   456
+         */
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   457
+        gint handle;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   458
+        gtk_widget_style_get(GetWidget(MOZ_GTK_WINDOW),
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   459
+                             "decoration-resize-handle", &handle,
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   460
+                             NULL);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   461
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   462
+        extents.top = handle + margin.top;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   463
+        extents.right = handle + margin.right;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   464
+        extents.bottom = handle + margin.bottom;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   465
+        extents.left = handle + margin.left;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   466
+    }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   467
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   468
+    *aDecorationSize += extents;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   469
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   470
+    return (sGtkRenderBackgroundGetClip != nullptr);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   471
+}
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   472
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   473
 /* cairo_t *cr argument has to be a system-cairo. */
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   474
 gint
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   475
 moz_gtk_widget_paint(WidgetNodeType widget, cairo_t *cr,
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   476
diff -up firefox-60.0/widget/gtk/gtkdrawing.h.orig firefox-60.0/widget/gtk/gtkdrawing.h
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   477
--- firefox-60.0/widget/gtk/gtkdrawing.h.orig	2018-04-26 22:07:35.000000000 +0200
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   478
+++ firefox-60.0/widget/gtk/gtkdrawing.h	2018-04-30 13:38:19.083949868 +0200
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   479
@@ -334,6 +334,10 @@ typedef enum {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   480
    */
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   481
   MOZ_GTK_HEADER_BAR_BUTTON_MAXIMIZE_RESTORE,
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   482
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   483
+  /* Client-side window decoration node. Available on GTK 3.20+. */
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   484
+  MOZ_GTK_WINDOW_DECORATION,
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   485
+  MOZ_GTK_WINDOW_DECORATION_SOLID,
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   486
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   487
   MOZ_GTK_WIDGET_NODE_COUNT
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   488
 } WidgetNodeType;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   489
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   490
@@ -606,4 +610,17 @@ GetToolbarButtonMetrics(WidgetNodeType a
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   491
 int
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   492
 GetGtkHeaderBarButtonLayout(WidgetNodeType* aButtonLayout, int aMaxButtonNums);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   493
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   494
+/**
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   495
+ * Get size of CSD window extents of given GtkWindow.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   496
+ *
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   497
+ * aGtkWindow      [IN]  Decorated window.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   498
+ * aDecorationSize [OUT] Returns calculated (or estimated) decoration
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   499
+ *                       size of given aGtkWindow.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   500
+ *
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   501
+ * returns:    True if we have extract decoration size (for GTK 3.20+)
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   502
+ *             False if we have only an estimation (for GTK+ before  3.20+)
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   503
+ */
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   504
+bool
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   505
+GetCSDDecorationSize(GtkWindow *aGtkWindow, GtkBorder* aDecorationSize);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   506
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   507
 #endif
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   508
diff -up firefox-60.0/widget/gtk/nsWindow.cpp.orig firefox-60.0/widget/gtk/nsWindow.cpp
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   509
--- firefox-60.0/widget/gtk/nsWindow.cpp.orig	2018-04-30 13:37:32.145122854 +0200
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   510
+++ firefox-60.0/widget/gtk/nsWindow.cpp	2018-04-30 13:39:12.593752681 +0200
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   511
@@ -127,6 +127,7 @@ using namespace mozilla::widget;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   512
 #endif
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   513
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   514
 #include "nsShmImage.h"
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   515
+#include "gtkdrawing.h"
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   516
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   517
 #include "nsIDOMWheelEvent.h"
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   518
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   519
@@ -3360,6 +3361,10 @@ nsWindow::OnWindowStateEvent(GtkWidget *
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   520
           aEvent->new_window_state & GDK_WINDOW_STATE_FULLSCREEN);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   521
       }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   522
     }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   523
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   524
+    if (mDrawInTitlebar && mCSDSupportLevel == CSD_SUPPORT_CLIENT) {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   525
+        UpdateClientOffsetForCSDWindow();
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   526
+    }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   527
 }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   528
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   529
 void
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   530
@@ -6552,6 +6557,32 @@ nsWindow::ClearCachedResources()
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   531
     }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   532
 }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   533
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   534
+/* nsWindow::UpdateClientOffsetForCSDWindow() is designed to be called from
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   535
+ * paint code to update mClientOffset any time. It also propagates
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   536
+ * the mClientOffset to child tabs.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   537
+ *
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   538
+ * It works only for CSD decorated GtkWindow.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   539
+ */
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   540
+void
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   541
+nsWindow::UpdateClientOffsetForCSDWindow()
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   542
+{
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   543
+    // _NET_FRAME_EXTENTS is not set on client decorated windows,
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   544
+    // so we need to read offset between mContainer and toplevel mShell
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   545
+    // window.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   546
+    if (mSizeState == nsSizeMode_Normal) {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   547
+        GtkBorder decorationSize;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   548
+        GetCSDDecorationSize(GTK_WINDOW(mShell), &decorationSize);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   549
+        mClientOffset = nsIntPoint(decorationSize.left, decorationSize.top);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   550
+    } else {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   551
+        mClientOffset = nsIntPoint(0, 0);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   552
+    }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   553
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   554
+    // Send a WindowMoved notification. This ensures that TabParent
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   555
+    // picks up the new client offset and sends it to the child process
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   556
+    // if appropriate.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   557
+    NotifyWindowMoved(mBounds.x, mBounds.y);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   558
+}
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   559
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   560
 nsresult
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   561
 nsWindow::SetNonClientMargins(LayoutDeviceIntMargin &aMargins)
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   562
 {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   563
@@ -6626,6 +6657,13 @@ nsWindow::SetDrawsInTitlebar(bool aState
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   564
         mNeedsShow = true;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   565
         NativeResize();
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   566
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   567
+        // When we use system titlebar setup managed by Gtk+ we also get
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   568
+        // _NET_FRAME_EXTENTS property for our toplevel window so we can't
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   569
+        // update the client offset it here.
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   570
+        if (aState) {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   571
+            UpdateClientOffsetForCSDWindow();
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   572
+        }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   573
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   574
         gtk_widget_destroy(tmpWindow);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   575
     }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   576
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   577
diff -up firefox-60.0/widget/gtk/nsWindow.h.orig firefox-60.0/widget/gtk/nsWindow.h
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   578
--- firefox-60.0/widget/gtk/nsWindow.h.orig	2018-04-30 13:37:32.143122861 +0200
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   579
+++ firefox-60.0/widget/gtk/nsWindow.h	2018-04-30 13:38:19.085949861 +0200
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   580
@@ -454,6 +454,8 @@ private:
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   581
     nsIWidgetListener* GetListener();
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   582
     bool               IsComposited() const;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   583
 
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   584
+    void               UpdateClientOffsetForCSDWindow();
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   585
+
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   586
     GtkWidget          *mShell;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   587
     MozContainer       *mContainer;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   588
     GdkWindow          *mGdkWindow;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   589
diff -up firefox-60.0/widget/gtk/WidgetStyleCache.cpp.orig firefox-60.0/widget/gtk/WidgetStyleCache.cpp
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   590
--- firefox-60.0/widget/gtk/WidgetStyleCache.cpp.orig	2018-04-26 22:07:35.000000000 +0200
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   591
+++ firefox-60.0/widget/gtk/WidgetStyleCache.cpp	2018-04-30 13:38:19.085949861 +0200
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   592
@@ -1285,6 +1285,22 @@ GetCssNodeStyleInternal(WidgetNodeType a
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   593
           "MOZ_GTK_HEADER_BAR_BUTTON_RESTORE is used as an icon only!");
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   594
       return nullptr;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   595
     }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   596
+    case MOZ_GTK_WINDOW_DECORATION:
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   597
+    {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   598
+      GtkStyleContext* parentStyle =
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   599
+          CreateSubStyleWithClass(MOZ_GTK_WINDOW, "csd");
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   600
+      style = CreateCSSNode("decoration", parentStyle);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   601
+      g_object_unref(parentStyle);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   602
+      break;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   603
+    }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   604
+    case MOZ_GTK_WINDOW_DECORATION_SOLID:
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   605
+    {
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   606
+      GtkStyleContext* parentStyle =
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   607
+          CreateSubStyleWithClass(MOZ_GTK_WINDOW, "solid-csd");
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   608
+      style = CreateCSSNode("decoration", parentStyle);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   609
+      g_object_unref(parentStyle);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   610
+      break;
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   611
+    }
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   612
     default:
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   613
       return GetWidgetRootStyle(aNodeType);
75893a3d8fbe 60.0b16
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
   614
   }