Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use custom as dark mode #1023

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions pdf_viewer/config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ extern bool SHOULD_DRAW_UNRENDERED_PAGES;
extern bool HOVER_OVERVIEW;
//extern bool AUTO_EMBED_ANNOTATIONS;
extern bool DEFAULT_DARK_MODE;
extern bool USE_SYSTEM_THEME;
extern bool USE_CUSTOM_AS_DARK;
extern float HIGHLIGHT_COLORS[26 * 3];
extern std::wstring SEARCH_URLS[26];
extern std::wstring EXECUTE_COMMANDS[26];
Expand Down Expand Up @@ -707,6 +709,22 @@ ConfigManager::ConfigManager(const Path& default_path, const Path& auto_path, co
bool_deserializer,
bool_validator
});
configs.push_back({
L"use_system_theme",
ConfigType::Bool,
&USE_SYSTEM_THEME,
bool_serializer,
bool_deserializer,
bool_validator
});
configs.push_back({
L"use_custom_as_dark",
ConfigType::Bool,
&USE_CUSTOM_AS_DARK,
bool_serializer,
bool_deserializer,
bool_validator
});
configs.push_back({
L"render_freetext_borders",
ConfigType::Bool,
Expand Down
70 changes: 26 additions & 44 deletions pdf_viewer/macos_specific.mm
Original file line number Diff line number Diff line change
Expand Up @@ -17,74 +17,56 @@ @implementation DraggableTitleView

// Handle mouse click events
- (void)mouseDown:(NSEvent *)event {
// double-click to zoom
if ([event clickCount] == 2) {
[self.window zoom:nil];
} else {
// drag Window
[self.window performWindowDragWithEvent:event];
}
// double-click to zoom
if ([event clickCount] == 2) {
[self.window zoom:nil];
} else {
// drag Window
[self.window performWindowDragWithEvent:event];
}
}

- (void)updateTrackingAreas {
[self initTrackingArea];
[self initTrackingArea];
}

-(void) initTrackingArea {
NSTrackingAreaOptions options = (NSTrackingActiveAlways | NSTrackingInVisibleRect |
NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved);
NSTrackingAreaOptions options = (NSTrackingActiveAlways | NSTrackingInVisibleRect |
NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved);

NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self bounds]
options:options
owner:self
userInfo:nil];
NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self bounds]
options:options
owner:self
userInfo:nil];

[self addTrackingArea:area];
[self addTrackingArea:area];
}
-(void)mouseEntered:(NSEvent *)event {
if((self.window.styleMask & NSWindowStyleMaskFullScreen) == 0) {
[[self.window standardWindowButton: NSWindowCloseButton] setHidden:NO];
[[self.window standardWindowButton: NSWindowMiniaturizeButton] setHidden:NO];
[[self.window standardWindowButton: NSWindowZoomButton] setHidden:NO];
}
if((self.window.styleMask & NSWindowStyleMaskFullScreen) == 0) {
[[self.window standardWindowButton: NSWindowCloseButton] setHidden:NO];
[[self.window standardWindowButton: NSWindowMiniaturizeButton] setHidden:NO];
[[self.window standardWindowButton: NSWindowZoomButton] setHidden:NO];
}
}

-(void)mouseExited:(NSEvent *)event {
if((self.window.styleMask & NSWindowStyleMaskFullScreen) == 0) {
[[self.window standardWindowButton: NSWindowCloseButton] setHidden:YES];
[[self.window standardWindowButton: NSWindowMiniaturizeButton] setHidden:YES];
[[self.window standardWindowButton: NSWindowZoomButton] setHidden:YES];
}
if((self.window.styleMask & NSWindowStyleMaskFullScreen) == 0) {
[[self.window standardWindowButton: NSWindowCloseButton] setHidden:YES];
[[self.window standardWindowButton: NSWindowMiniaturizeButton] setHidden:YES];
[[self.window standardWindowButton: NSWindowZoomButton] setHidden:YES];
}
}

@end

extern "C" void showWindowTitleBarButtons(WId winId) {
if (winId == 0) return;
NSView* nativeView = reinterpret_cast<NSView*>(winId);
NSWindow* nativeWindow = [nativeView window];
[[nativeWindow standardWindowButton: NSWindowCloseButton] setHidden:NO];
[[nativeWindow standardWindowButton: NSWindowMiniaturizeButton] setHidden:NO];
[[nativeWindow standardWindowButton: NSWindowZoomButton] setHidden:NO];
}

extern "C" void hideWindowTitleBarButtons(WId winId) {
if (winId == 0) return;
NSView* nativeView = reinterpret_cast<NSView*>(winId);
NSWindow* nativeWindow = [nativeView window];
[[nativeWindow standardWindowButton: NSWindowCloseButton] setHidden:YES];
[[nativeWindow standardWindowButton: NSWindowMiniaturizeButton] setHidden:YES];
[[nativeWindow standardWindowButton: NSWindowZoomButton] setHidden:YES];
}

extern "C" void hideWindowTitleBar(WId winId) {
if (winId == 0) return;

NSView* nativeView = reinterpret_cast<NSView*>(winId);
NSWindow* nativeWindow = [nativeView window];

if(nativeWindow.titleVisibility == NSWindowTitleHidden){
return;
return;
}

[[nativeWindow standardWindowButton: NSWindowCloseButton] setHidden:YES];
Expand Down
4 changes: 3 additions & 1 deletion pdf_viewer/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,8 @@ bool FLAT_TABLE_OF_CONTENTS = false;
bool SHOULD_USE_MULTIPLE_MONITORS = false;
bool SHOULD_CHECK_FOR_LATEST_VERSION_ON_STARTUP = false;
bool DEFAULT_DARK_MODE = false;
bool USE_SYSTEM_THEME = false;
bool USE_CUSTOM_AS_DARK = false;
bool SORT_BOOKMARKS_BY_LOCATION = true;
std::wstring LIBGEN_ADDRESS = L"";
std::wstring GOOGLE_SCHOLAR_ADDRESS = L"";
Expand Down Expand Up @@ -1144,7 +1146,7 @@ int main(int argc, char* args[]) {
});
#endif

if (DEFAULT_DARK_MODE) {
if (DEFAULT_DARK_MODE && !USE_SYSTEM_THEME) {
main_widget->toggle_dark_mode();
}

Expand Down
91 changes: 80 additions & 11 deletions pdf_viewer/main_widget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@
#ifndef SIOYEK_QT6
#include <qdesktopwidget.h>
#endif
#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
#include <QStyleHints>
#endif

#include <qkeyevent.h>
#include <qlabel.h>
Expand Down Expand Up @@ -98,8 +101,6 @@ extern "C" {
#ifdef Q_OS_MACOS
extern "C" void changeTitlebarColor(WId, double, double, double, double);
extern "C" void hideWindowTitleBar(WId);
extern "C" void showWindowTitleBarButtons(WId);
extern "C" void hideWindowTitleBarButtons(WId);
#endif

extern int next_window_id;
Expand Down Expand Up @@ -201,6 +202,8 @@ extern ScratchPad global_scratchpad;
extern int NUM_CACHED_PAGES;
extern bool IGNORE_SCROLL_EVENTS;
extern bool DONT_FOCUS_IF_SYNCTEX_RECT_IS_VISIBLE;
extern bool USE_SYSTEM_THEME;
extern bool USE_CUSTOM_AS_DARK;

extern bool SHOW_RIGHT_CLICK_CONTEXT_MENU;
extern std::wstring CONTEXT_MENU_ITEMS;
Expand Down Expand Up @@ -1229,13 +1232,17 @@ MainWidget::MainWidget(fz_context* mupdf_context,
}

if (MACOS_HIDE_TITLEBAR) {
hideWindowTitleBar(winId());
hideWindowTitleBar(winId());
}
menu_bar = create_main_menu_bar();
setMenuBar(menu_bar);
menu_bar->stackUnder(text_command_line_edit_container);
#endif

#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
set_system_mode();
#endif

setFocus();
}

Expand Down Expand Up @@ -3741,10 +3748,14 @@ CommandManager* MainWidget::get_command_manager() {
}

void MainWidget::toggle_dark_mode() {
this->opengl_widget->toggle_dark_mode();
if (USE_CUSTOM_AS_DARK) {
toggle_custom_color_mode();
} else {
this->opengl_widget->toggle_dark_mode();

if (helper_opengl_widget_) {
helper_opengl_widget_->toggle_dark_mode();
if (helper_opengl_widget_) {
helper_opengl_widget_->toggle_dark_mode();
}
}
}

Expand Down Expand Up @@ -4075,7 +4086,7 @@ void MainWidget::apply_window_params_for_two_window_mode() {

#ifdef Q_OS_MACOS
if (MACOS_HIDE_TITLEBAR) {
hideWindowTitleBar(helper_window->winId());
hideWindowTitleBar(helper_window->winId());
}
#endif
//int main_window_width = QApplication::desktop()->screenGeometry(0).width();
Expand Down Expand Up @@ -4444,6 +4455,13 @@ void MainWidget::changeEvent(QEvent* event) {
//main_window_height = get_current_monitor_height();
}
}

#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
if (event->type() == QEvent::ThemeChange) {
set_system_mode();
}
#endif

QWidget::changeEvent(event);
}

Expand Down Expand Up @@ -6758,16 +6776,59 @@ int MainWidget::get_current_colorscheme_index() {
}

void MainWidget::set_dark_mode() {
opengl_widget->set_dark_mode(true);
if (USE_CUSTOM_AS_DARK) {
set_custom_color_mode();
} else{
if (opengl_widget->get_current_color_mode() != PdfViewOpenGLWidget::ColorPalette::Dark) {
opengl_widget->set_dark_mode(true);
}
if (helper_opengl_widget_) {
if (helper_opengl_widget_->get_current_color_mode() != PdfViewOpenGLWidget::ColorPalette::Dark) {
helper_opengl_widget_->set_dark_mode(true);
}
}
}
}

void MainWidget::set_light_mode() {
opengl_widget->set_dark_mode(false);
if (opengl_widget->get_current_color_mode() != PdfViewOpenGLWidget::ColorPalette::Normal) {
opengl_widget->set_dark_mode(false);
}
if (helper_opengl_widget_) {
if (helper_opengl_widget_->get_current_color_mode() != PdfViewOpenGLWidget::ColorPalette::Normal) {
helper_opengl_widget_->set_dark_mode(false);
}
}
}

void MainWidget::set_custom_color_mode() {
opengl_widget->set_custom_color_mode(true);
if (opengl_widget->get_current_color_mode() != PdfViewOpenGLWidget::ColorPalette::Custom) {
opengl_widget->set_custom_color_mode(true);
}
if (helper_opengl_widget_) {
if (helper_opengl_widget_->get_current_color_mode() != PdfViewOpenGLWidget::ColorPalette::Custom) {
helper_opengl_widget_->set_custom_color_mode(true);
}
}
}


#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
void MainWidget::set_system_mode() {
if (USE_SYSTEM_THEME) {
QStyleHints *styleHints = QGuiApplication::styleHints();
switch (styleHints->colorScheme()) {
case Qt::ColorScheme::Unknown:
case Qt::ColorScheme::Light:
set_light_mode();
break;
case Qt::ColorScheme::Dark:
set_dark_mode();
break;
}
}
}
#endif

void MainWidget::update_highlight_buttons_position() {
if (selected_highlight_index != -1) {
Expand Down Expand Up @@ -7380,6 +7441,9 @@ void MainWidget::on_configs_changed(std::vector<std::string>* config_names) {
changeTitlebarColor(winId(), MACOS_TITLEBAR_COLOR[0], MACOS_TITLEBAR_COLOR[1], MACOS_TITLEBAR_COLOR[2], 1.0f);
}
#endif
if (confname == "use_system_theme") {
set_system_mode();
}

if (confname == "tts_rate") {
if (is_reading) {
Expand Down Expand Up @@ -9767,11 +9831,16 @@ void MainWidget::initialize_helper(){
#ifdef Q_OS_MACOS
QWidget* helper_window = get_top_level_widget(helper_opengl_widget_);
if (MACOS_HIDE_TITLEBAR) {
hideWindowTitleBar(helper_window->winId());
hideWindowTitleBar(helper_window->winId());
}
helper_opengl_widget_->show();
helper_opengl_widget_->hide();
#endif

#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
set_system_mode();
#endif

helper_opengl_widget_->register_on_link_edit_listener([this](OpenedBookState state) {
this->update_closest_link_with_opened_book_state(state);
});
Expand Down
1 change: 1 addition & 0 deletions pdf_viewer/main_widget.h
Original file line number Diff line number Diff line change
Expand Up @@ -389,6 +389,7 @@ class MainWidget : public QMainWindow {
void set_dark_mode();
void set_light_mode();
void set_custom_color_mode();
void set_system_mode();
void toggle_statusbar();
void toggle_titlebar();

Expand Down
Loading