Skip to content

Commit 0f57e3b

Browse files
committed
Fix macOS titlebar preference
1 parent a0650b5 commit 0f57e3b

2 files changed

Lines changed: 40 additions & 102 deletions

File tree

pdf_viewer/macos_specific.mm

Lines changed: 0 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -21,79 +21,3 @@
2121
window.titlebarAppearsTransparent = YES;
2222
window.backgroundColor = [NSColor colorWithRed:red green:green blue:blue alpha: alpha];
2323
}
24-
25-
@interface DraggableTitleView : NSView
26-
@end
27-
28-
@implementation DraggableTitleView
29-
30-
// Handle mouse click events
31-
- (void)mouseDown:(NSEvent *)event {
32-
// double-click to zoom
33-
if ([event clickCount] == 2) {
34-
[self.window zoom:nil];
35-
} else {
36-
// drag Window
37-
[self.window performWindowDragWithEvent:event];
38-
}
39-
}
40-
41-
- (void)updateTrackingAreas {
42-
[self initTrackingArea];
43-
}
44-
45-
-(void) initTrackingArea {
46-
NSTrackingAreaOptions options = (NSTrackingActiveAlways | NSTrackingInVisibleRect |
47-
NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved);
48-
49-
NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self bounds]
50-
options:options
51-
owner:self
52-
userInfo:nil];
53-
54-
[self addTrackingArea:area];
55-
}
56-
-(void)mouseEntered:(NSEvent *)event {
57-
if((self.window.styleMask & NSWindowStyleMaskFullScreen) == 0) {
58-
[[self.window standardWindowButton: NSWindowCloseButton] setHidden:NO];
59-
[[self.window standardWindowButton: NSWindowMiniaturizeButton] setHidden:NO];
60-
[[self.window standardWindowButton: NSWindowZoomButton] setHidden:NO];
61-
}
62-
}
63-
64-
-(void)mouseExited:(NSEvent *)event {
65-
if((self.window.styleMask & NSWindowStyleMaskFullScreen) == 0) {
66-
[[self.window standardWindowButton: NSWindowCloseButton] setHidden:YES];
67-
[[self.window standardWindowButton: NSWindowMiniaturizeButton] setHidden:YES];
68-
[[self.window standardWindowButton: NSWindowZoomButton] setHidden:YES];
69-
}
70-
}
71-
72-
@end
73-
74-
extern "C" void hideWindowTitleBar(WId winId) {
75-
if (winId == 0) return;
76-
77-
NSView* nativeView = reinterpret_cast<NSView*>(winId);
78-
NSWindow* nativeWindow = [nativeView window];
79-
80-
if(nativeWindow.titleVisibility == NSWindowTitleHidden){
81-
return;
82-
}
83-
84-
[[nativeWindow standardWindowButton: NSWindowCloseButton] setHidden:YES];
85-
[[nativeWindow standardWindowButton: NSWindowMiniaturizeButton] setHidden:YES];
86-
[[nativeWindow standardWindowButton: NSWindowZoomButton] setHidden:YES];
87-
NSRect contentViewBounds = nativeWindow.contentView.bounds;
88-
89-
DraggableTitleView *titleBarView = [[DraggableTitleView alloc] initWithFrame:NSMakeRect(0, 0, contentViewBounds.size.width, 22)];
90-
titleBarView.autoresizingMask = NSViewWidthSizable;
91-
titleBarView.wantsLayer = YES;
92-
titleBarView.layer.backgroundColor = [[NSColor clearColor] CGColor];
93-
94-
[nativeWindow.contentView addSubview:titleBarView];
95-
96-
[nativeWindow setTitleVisibility:NSWindowTitleHidden];
97-
[nativeWindow setStyleMask:[nativeWindow styleMask] | NSWindowStyleMaskFullSizeContentView];
98-
[nativeWindow setTitlebarAppearsTransparent:YES];
99-
}

pdf_viewer/main_widget.cpp

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,37 @@ extern "C" {
100100

101101
#ifdef Q_OS_MACOS
102102
extern "C" void changeTitlebarColor(WId, double, double, double, double);
103-
extern "C" void hideWindowTitleBar(WId);
104103
#endif
105104

105+
static void set_titlebar_visible(QWidget* widget, bool visible, bool should_show) {
106+
if (widget == nullptr) {
107+
return;
108+
}
109+
110+
Qt::WindowFlags flags = widget->windowFlags();
111+
if (visible) {
112+
flags &= ~Qt::CustomizeWindowHint;
113+
flags |= Qt::WindowContextHelpButtonHint;
114+
flags |= Qt::WindowSystemMenuHint;
115+
flags |= Qt::WindowMinMaxButtonsHint;
116+
flags |= Qt::WindowCloseButtonHint;
117+
flags |= Qt::WindowTitleHint;
118+
}
119+
else {
120+
flags |= Qt::CustomizeWindowHint;
121+
flags &= ~Qt::WindowContextHelpButtonHint;
122+
flags &= ~Qt::WindowSystemMenuHint;
123+
flags &= ~Qt::WindowMinMaxButtonsHint;
124+
flags &= ~Qt::WindowCloseButtonHint;
125+
flags &= ~Qt::WindowTitleHint;
126+
}
127+
128+
widget->setWindowFlags(flags);
129+
if (should_show) {
130+
widget->show();
131+
}
132+
}
133+
106134
extern int next_window_id;
107135

108136
extern bool SHOULD_USE_MULTIPLE_MONITORS;
@@ -1322,7 +1350,7 @@ MainWidget::MainWidget(fz_context* mupdf_context,
13221350
}
13231351

13241352
if (MACOS_HIDE_TITLEBAR) {
1325-
hideWindowTitleBar(winId());
1353+
set_titlebar_visible(this, false, false);
13261354
}
13271355
menu_bar = create_main_menu_bar();
13281356
setMenuBar(menu_bar);
@@ -4312,7 +4340,7 @@ void MainWidget::apply_window_params_for_two_window_mode() {
43124340

43134341
#ifdef Q_OS_MACOS
43144342
if (MACOS_HIDE_TITLEBAR) {
4315-
hideWindowTitleBar(helper_window->winId());
4343+
set_titlebar_visible(helper_window, false, false);
43164344
}
43174345
#endif
43184346
//int main_window_width = QApplication::desktop()->screenGeometry(0).width();
@@ -4957,28 +4985,7 @@ void MainWidget::toggle_statusbar() {
49574985
}
49584986

49594987
void MainWidget::toggle_titlebar() {
4960-
4961-
Qt::WindowFlags flags = windowFlags();
4962-
if (flags.testFlag(Qt::WindowTitleHint)) {
4963-
flags |= Qt::CustomizeWindowHint;
4964-
flags &= ~Qt::WindowContextHelpButtonHint;
4965-
flags &= ~Qt::WindowSystemMenuHint;
4966-
flags &= ~Qt::WindowMinMaxButtonsHint;
4967-
flags &= ~Qt::WindowCloseButtonHint;
4968-
flags &= ~Qt::WindowTitleHint;
4969-
setWindowFlags(flags);
4970-
4971-
}
4972-
else {
4973-
flags &= ~Qt::CustomizeWindowHint;
4974-
flags |= Qt::WindowContextHelpButtonHint;
4975-
flags |= Qt::WindowSystemMenuHint;
4976-
flags |= Qt::WindowMinMaxButtonsHint;
4977-
flags |= Qt::WindowCloseButtonHint;
4978-
flags |= Qt::WindowTitleHint;
4979-
setWindowFlags(flags);
4980-
}
4981-
show();
4988+
set_titlebar_visible(this, !windowFlags().testFlag(Qt::WindowTitleHint), true);
49824989
}
49834990

49844991

@@ -7839,6 +7846,13 @@ void MainWidget::on_configs_changed(std::vector<std::string>* config_names) {
78397846
if (confname == "macos_titlebar_color"){
78407847
changeTitlebarColor(winId(), MACOS_TITLEBAR_COLOR[0], MACOS_TITLEBAR_COLOR[1], MACOS_TITLEBAR_COLOR[2], 1.0f);
78417848
}
7849+
if (confname == "macos_hide_titlebar") {
7850+
set_titlebar_visible(this, !MACOS_HIDE_TITLEBAR, true);
7851+
if (helper_opengl_widget_ != nullptr) {
7852+
QWidget* helper_window = get_top_level_widget(helper_opengl_widget_);
7853+
set_titlebar_visible(helper_window, !MACOS_HIDE_TITLEBAR, helper_window->isVisible());
7854+
}
7855+
}
78427856
#endif
78437857
if (confname == "use_system_theme") {
78447858
set_color_mode_to_system_theme();
@@ -10301,7 +10315,7 @@ void MainWidget::initialize_helper(){
1030110315
#ifdef Q_OS_MACOS
1030210316
QWidget* helper_window = get_top_level_widget(helper_opengl_widget_);
1030310317
if (MACOS_HIDE_TITLEBAR) {
10304-
hideWindowTitleBar(helper_window->winId());
10318+
set_titlebar_visible(helper_window, false, false);
1030510319
}
1030610320
helper_opengl_widget_->show();
1030710321
helper_opengl_widget_->hide();

0 commit comments

Comments
 (0)