From 4c0f7c3dd4eb800ba9e5aa89e64e72fdd75db6c3 Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Wed, 14 Apr 2021 19:50:38 +0200 Subject: [PATCH] Add commandline option to resize window --- src/core/commandlineoptions.cpp | 26 +++++++++++++++------ src/core/commandlineoptions.h | 6 +++-- src/core/mainwindow.cpp | 40 +++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 9 deletions(-) diff --git a/src/core/commandlineoptions.cpp b/src/core/commandlineoptions.cpp index beb722407..b6a54103b 100644 --- a/src/core/commandlineoptions.cpp +++ b/src/core/commandlineoptions.cpp @@ -71,10 +71,11 @@ const char *CommandlineOptions::kHelpText = " -o, --show-osd %27\n" " -y, --toggle-pretty-osd %28\n" " -g, --language %29\n" - " --quiet %30\n" - " --verbose %31\n" - " --log-levels %32\n" - " --version %33\n"; + " -w, --resize-window %30\n" + " --quiet %31\n" + " --verbose %32\n" + " --log-levels %33\n" + " --version %34\n"; const char *CommandlineOptions::kVersionText = "Strawberry %1"; @@ -143,6 +144,7 @@ bool CommandlineOptions::Parse() { {"show-osd", no_argument, nullptr, 'o'}, {"toggle-pretty-osd", no_argument, nullptr, 'y'}, {"language", required_argument, nullptr, 'g'}, + {"resize-window", required_argument, nullptr, 'w'}, {"quiet", no_argument, nullptr, Quiet}, {"verbose", no_argument, nullptr, Verbose}, {"log-levels", required_argument, nullptr, LogLevels}, @@ -152,7 +154,7 @@ bool CommandlineOptions::Parse() { // Parse the arguments bool ok = false; forever { - int c = getopt_long(argc_, argv_, "hptusqrfv:c:alk:i:oyg:", kOptions, nullptr); + int c = getopt_long(argc_, argv_, "hptusqrfv:c:alk:i:oyg:w:", kOptions, nullptr); // End of the options if (c == -1) break; @@ -186,6 +188,7 @@ bool CommandlineOptions::Parse() { .arg(tr("Other options"), tr("Display the on-screen-display"), tr("Toggle visibility for the pretty on-screen-display"), tr("Change the language"), + tr("Resize the window"), tr("Equivalent to --log-levels *:1"), tr("Equivalent to --log-levels *:3"), tr("Comma separated list of class:level, level is 0-3")) @@ -293,6 +296,11 @@ bool CommandlineOptions::Parse() { if (!ok) play_track_at_ = -1; break; + case 'w': + window_size_ = QString(optarg); + player_action_ = Player_ResizeWindow; + break; + case '?': default: return false; @@ -370,7 +378,8 @@ QDataStream& operator<<(QDataStream &s, const CommandlineOptions &a) { << a.urls_ << a.log_levels_ << a.toggle_pretty_osd_ - << a.playlist_name_; + << a.playlist_name_ + << a.window_size_; return s; @@ -380,6 +389,7 @@ QDataStream& operator>>(QDataStream &s, CommandlineOptions &a) { quint32 player_action = 0; quint32 url_list_action = 0; + s >> player_action >> url_list_action >> a.set_volume_ @@ -391,7 +401,9 @@ QDataStream& operator>>(QDataStream &s, CommandlineOptions &a) { >> a.urls_ >> a.log_levels_ >> a.toggle_pretty_osd_ - >> a.playlist_name_; + >> a.playlist_name_ + >> a.window_size_; + a.player_action_ = CommandlineOptions::PlayerAction(player_action); a.url_list_action_ = CommandlineOptions::UrlListAction(url_list_action); diff --git a/src/core/commandlineoptions.h b/src/core/commandlineoptions.h index a529196c7..6c870ec78 100644 --- a/src/core/commandlineoptions.h +++ b/src/core/commandlineoptions.h @@ -58,6 +58,7 @@ class CommandlineOptions { Player_RestartOrPrevious = 7, Player_StopAfterCurrent = 8, Player_PlayPlaylist = 9, + Player_ResizeWindow = 10 }; bool Parse(); @@ -78,13 +79,13 @@ class CommandlineOptions { QString language() const { return language_; } QString log_levels() const { return log_levels_; } QString playlist_name() const { return playlist_name_; } + QString window_size() const { return window_size_; } QByteArray Serialize() const; void Load(const QByteArray &serialized); private: - // These are "invalid" characters to pass to getopt_long for options that - // shouldn't have a short (single character) option. + // These are "invalid" characters to pass to getopt_long for options that shouldn't have a short (single character) option. enum LongOptions { VolumeUp = 256, VolumeDown, @@ -120,6 +121,7 @@ class CommandlineOptions { QString language_; QString log_levels_; QString playlist_name_; + QString window_size_; QList urls_; }; diff --git a/src/core/mainwindow.cpp b/src/core/mainwindow.cpp index 67de53064..e8298d4c6 100644 --- a/src/core/mainwindow.cpp +++ b/src/core/mainwindow.cpp @@ -31,6 +31,8 @@ #include #include #include +#include +#include #include #include #include @@ -2312,8 +2314,46 @@ void MainWindow::CommandlineOptionsReceived(const CommandlineOptions &options) { app_->player()->RestartOrPrevious(); break; + case CommandlineOptions::Player_ResizeWindow:{ + if (options.window_size().contains('x') && options.window_size().length() >= 4) { + QString str_w = options.window_size().left(options.window_size().indexOf('x')); + QString str_h = options.window_size().right(options.window_size().length() - options.window_size().indexOf('x') - 1); + bool w_ok = false; + bool h_ok = false; + int w = str_w.toInt(&w_ok); + int h = str_h.toInt(&h_ok); + if (w_ok && h_ok) { + QSize window_size(w, h); + if (window_size.isValid()) { +#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) + QScreen *screen = QWidget::screen(); +#else + QScreen *screen = (window() && window()->windowHandle() ? window()->windowHandle()->screen() : nullptr); +#endif + if (screen) { + const QRect sr = screen->availableGeometry(); + window_size = window_size.boundedTo(sr.size()); + if (window_size.width() >= sr.width() && window_size.height() >= sr.height()) { + resize(window_size); + showMaximized(); + } + else { + showNormal(); + resize(window_size); + const QRect wr({}, size().boundedTo(sr.size())); + resize(wr.size()); + move(sr.center() - wr.center()); + } + } + } + } + } + break; + } + case CommandlineOptions::Player_None: break; + } if (!options.urls().empty()) {