Compare commits

..

8 commits

Author SHA1 Message Date
xiaoyifang 7626855556
Merge 15b918eb6a into 608016208b 2024-11-11 20:26:29 +08:00
shenleban tongying 608016208b
disable more staffs related to macOS trayicon -> dock icon
Some checks are pending
SonarCloud / Build and analyze (push) Waiting to run
2024-11-11 07:53:10 +00:00
shenleban tongying 1e3b22ebd0 fix: macOS -> replace the tray icon with a dock menu 2024-11-11 02:32:27 -05:00
shenleban tongying 720f66c781 clean: make toggleMainWindow reasonable
Some checks are pending
SonarCloud / Build and analyze (push) Waiting to run
2024-11-11 00:18:02 -05:00
shenleban tongying acbfef0870 opt: don't focus on the main window if word comes from headword dialog 2024-11-11 00:18:02 -05:00
shenleban tongying d4db51f278 opt: mdx -> avoid duplicated Adler-32 checksum in zlib decompression 2024-11-10 22:32:22 -05:00
shenleban tongying 160402e1d0 Consistently use README and no CRLF
Some checks are pending
SonarCloud / Build and analyze (push) Waiting to run
2024-11-10 17:39:43 -05:00
shenleban tongying fb48f66370 move audio files to src/audio
a
2024-11-10 17:39:43 -05:00
28 changed files with 147 additions and 136 deletions

View file

@ -26,6 +26,7 @@ Checks: >
-google-default-arguments,
-google-readability-casting,
-hicpp-deprecated-headers,
-hicpp-no-array-decay,
-misc-const-correctness,
-misc-include-cleaner,
-misc-non-private-member-variables-in-classes,

View file

@ -1,79 +1,79 @@
issue: https://github.com/goldendict/goldendict/issues/1441
http://tango.freedesktop.org/Tango_Desktop_Project GPLv3
list:
internet.svg
home.svg
configure.svg
fileopen.svg
addtab.svg
wizard.svg
fulltext
text2speech
reload
icons/print.svg
icons/programs.svg
error
star.svg
star_blue.svg
network.svg
hotkeys
previous
next
advanced
windows-list
filesave
playsound_color
interface
webdict
transliteration
closetab
folder
reload
menu.svg
https://packages.debian.org/bullseye/gnome-icon-theme GPLv3
lists:
clear
https://commons.wikimedia.org/wiki/File:Accessories-dictionary.svg
lists:
icon32_sdict.svg
https://freesvg.org/pushpin-vector-image public domain
lists:
pushbin
https://commons.wikimedia.org/wiki/File:Arrow_bottom_svg.svg license:public domain
lists:
1downarrow
these two icons from sertoli @ https://forum.freemdict.com/u/sertoli/summary
playsound.png
playsound_full.png
LGPL
icon32_zoombase.png https://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/128/Actions-page-zoom-icon.png
icon32_zoomout.png https://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/128/Actions-zoom-out-icon.png
icon32_zoomin.png https://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/128/Actions-zoom-in-icon.png
reload.png https://iconarchive.com/show/oxygen-icons-by-oxygen-icons.org/Actions-edit-redo-icon.html
advanced.png https://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/128/Actions-system-run-icon.png
sources.png https://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/128/Apps-plasma-icon.png
book.svg https://github.com/johnfactotum/foliate
lingualibre.svg https://en.m.wikipedia.org/wiki/File:Lingualibre-logo-no-text.svg
Apache License Version 2.0
1downarrow.svg
system-search.svg
Modified from https://github.com/google/material-design-icons
add-anki-icon.svg MIT license
issue: https://github.com/goldendict/goldendict/issues/1441
http://tango.freedesktop.org/Tango_Desktop_Project GPLv3
list:
internet.svg
home.svg
configure.svg
fileopen.svg
addtab.svg
wizard.svg
fulltext
text2speech
reload
icons/print.svg
icons/programs.svg
error
star.svg
star_blue.svg
network.svg
hotkeys
previous
next
advanced
windows-list
filesave
playsound_color
interface
webdict
transliteration
closetab
folder
reload
menu.svg
https://packages.debian.org/bullseye/gnome-icon-theme GPLv3
lists:
clear
https://commons.wikimedia.org/wiki/File:Accessories-dictionary.svg
lists:
icon32_sdict.svg
https://freesvg.org/pushpin-vector-image public domain
lists:
pushbin
https://commons.wikimedia.org/wiki/File:Arrow_bottom_svg.svg license:public domain
lists:
1downarrow
these two icons from sertoli @ https://forum.freemdict.com/u/sertoli/summary
playsound.png
playsound_full.png
LGPL
icon32_zoombase.png https://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/128/Actions-page-zoom-icon.png
icon32_zoomout.png https://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/128/Actions-zoom-out-icon.png
icon32_zoomin.png https://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/128/Actions-zoom-in-icon.png
reload.png https://iconarchive.com/show/oxygen-icons-by-oxygen-icons.org/Actions-edit-redo-icon.html
advanced.png https://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/128/Actions-system-run-icon.png
sources.png https://icons.iconarchive.com/icons/oxygen-icons.org/oxygen/128/Apps-plasma-icon.png
book.svg https://github.com/johnfactotum/foliate
lingualibre.svg https://en.m.wikipedia.org/wiki/File:Lingualibre-logo-no-text.svg
Apache License Version 2.0
1downarrow.svg
system-search.svg
Modified from https://github.com/google/material-design-icons
add-anki-icon.svg MIT license
https://www.svgrepo.com/svg/435992/add-card

3
src/audio/README.md Normal file
View file

@ -0,0 +1,3 @@
Code to support GD's internal/external audio players.
Only `audioplayerinterface.hh` is supposed to be used outside this folder.

View file

@ -197,9 +197,6 @@ Preferences::Preferences():
hideSingleTab( false ),
mruTabOrder( false ),
hideMenubar( false ),
enableTrayIcon( true ),
startToTray( false ),
closeToTray( true ),
autoStart( false ),
doubleClickTranslates( true ),
selectWordBySingleClick( false ),
@ -904,10 +901,11 @@ Class load()
c.preferences.hideSingleTab = ( preferences.namedItem( "hideSingleTab" ).toElement().text() == "1" );
c.preferences.mruTabOrder = ( preferences.namedItem( "mruTabOrder" ).toElement().text() == "1" );
c.preferences.hideMenubar = ( preferences.namedItem( "hideMenubar" ).toElement().text() == "1" );
#ifndef Q_OS_MACOS // // macOS uses the dock menu instead of the tray icon
c.preferences.enableTrayIcon = ( preferences.namedItem( "enableTrayIcon" ).toElement().text() == "1" );
c.preferences.startToTray = ( preferences.namedItem( "startToTray" ).toElement().text() == "1" );
c.preferences.closeToTray = ( preferences.namedItem( "closeToTray" ).toElement().text() == "1" );
#endif
c.preferences.autoStart = ( preferences.namedItem( "autoStart" ).toElement().text() == "1" );
c.preferences.alwaysOnTop = ( preferences.namedItem( "alwaysOnTop" ).toElement().text() == "1" );
c.preferences.searchInDock = ( preferences.namedItem( "searchInDock" ).toElement().text() == "1" );

View file

@ -341,9 +341,17 @@ struct Preferences
bool hideSingleTab;
bool mruTabOrder;
bool hideMenubar;
bool enableTrayIcon;
bool startToTray;
bool closeToTray;
#ifdef Q_OS_MACOS // macOS uses the dock menu instead of the tray icon
bool closeToTray = false;
bool enableTrayIcon = false;
bool startToTray = false;
#else
bool enableTrayIcon = true;
bool closeToTray = true;
bool startToTray = false;
#endif
bool autoStart;
bool doubleClickTranslates;
bool selectWordBySingleClick;

View file

@ -264,14 +264,12 @@ bool MdictParser::parseCompressedBlock( qint64 compressedBlockSize,
case 0x02000000:
// zlib compression
decompressedBlock = zlibDecompress( buf, size );
if ( !checkAdler32( decompressedBlock.constData(), decompressedBlock.size(), checksum ) ) {
gdWarning( "MDict: parseCompressedBlock: zlib: checksum does not match" );
decompressedBlock = zlibDecompress( buf, size, checksum );
if ( decompressedBlock.isEmpty() ) {
gdWarning( "MDict: parseCompressedBlock: zlib: failed to decompress or checksum does not match" );
return false;
}
break;
default:
gdWarning( "MDict: parseCompressedBlock: unknown type" );
return false;

View file

@ -3,20 +3,21 @@
#include <bzlib.h>
#include <lzma.h>
#define CHUNK_SIZE 2048
using std::string;
QByteArray zlibDecompress( const char * bufptr, unsigned length )
static constexpr qsizetype CHUNK_SIZE = 2048;
QByteArray zlibDecompress( const char * bufptr, unsigned length, uLong adler32_checksum )
{
z_stream zs;
char buf[ CHUNK_SIZE ];
z_stream zs{};
QByteArray str;
int res;
memset( &zs, 0, sizeof( zs ) );
int res = Z_OK;
zs.next_in = (Bytef *)bufptr;
zs.avail_in = length;
res = inflateInit( &zs );
if ( res == Z_OK ) {
char buf[ CHUNK_SIZE ];
while ( res != Z_STREAM_END ) {
zs.next_out = (Bytef *)buf;
zs.avail_out = CHUNK_SIZE;
@ -27,9 +28,7 @@ QByteArray zlibDecompress( const char * bufptr, unsigned length )
}
}
}
inflateEnd( &zs );
if ( res != Z_STREAM_END ) {
if ( inflateEnd( &zs ) != Z_OK || res != Z_STREAM_END || ( adler32_checksum != 0 && zs.adler != adler32_checksum ) ) {
str.clear();
}
return str;
@ -37,7 +36,7 @@ QByteArray zlibDecompress( const char * bufptr, unsigned length )
string decompressZlib( const char * bufptr, unsigned length )
{
QByteArray b = zlibDecompress( bufptr, length );
QByteArray b = zlibDecompress( bufptr, length, 0 );
return string( b.constData(), b.size() );
}

View file

@ -3,12 +3,11 @@
#include <QByteArray>
#include <string>
using std::string;
/// @param adler32_checksum 0 to skip checksum
QByteArray zlibDecompress( const char * bufptr, unsigned length, unsigned long adler32_checksum );
QByteArray zlibDecompress( const char * bufptr, unsigned length );
std::string decompressZlib( const char * bufptr, unsigned length );
string decompressZlib( const char * bufptr, unsigned length );
std::string decompressBzip2( const char * bufptr, unsigned length );
string decompressBzip2( const char * bufptr, unsigned length );
string decompressLzma2( const char * bufptr, unsigned length, bool raw_decoder = false );
std::string decompressLzma2( const char * bufptr, unsigned length, bool raw_decoder = false );

View file

@ -10,7 +10,7 @@
#include <QWebEngineView>
#include <list>
#include "article_netmgr.hh"
#include "audioplayerinterface.hh"
#include "audio/audioplayerinterface.hh"
#include "instances.hh"
#include "groupcombobox.hh"
#include "globalbroadcaster.hh"

View file

@ -401,15 +401,18 @@ MainWindow::MainWindow( Config::Class & cfg_ ):
connect( wordsZoomOut, &QAction::triggered, this, &MainWindow::doWordsZoomOut );
connect( wordsZoomBase, &QAction::triggered, this, &MainWindow::doWordsZoomBase );
// tray icon
connect( trayIconMenu.addAction( tr( "Show &Main Window" ) ),
&QAction::triggered,
this,
&MainWindow::showMainWindow );
// tray icon
#ifndef Q_OS_MACOS // macOS uses the dock menu instead of the tray icon
connect( trayIconMenu.addAction( tr( "Show &Main Window" ) ), &QAction::triggered, this, [ this ] {
this->toggleMainWindow( true );
} );
#endif
trayIconMenu.addAction( enableScanningAction );
#ifndef Q_OS_MACOS // macOS uses the dock menu instead of the tray icon
trayIconMenu.addSeparator();
connect( trayIconMenu.addAction( tr( "&Quit" ) ), &QAction::triggered, this, &MainWindow::quitApp );
#endif
addGlobalAction( &escAction, [ this ]() {
handleEsc();
@ -1421,6 +1424,11 @@ void MainWindow::updateAppearances( QString const & addonStyle,
void MainWindow::trayIconUpdateOrInit()
{
#ifdef Q_OS_MACOS
trayIconMenu.setAsDockMenu();
ui.actionCloseToTray->setVisible( false );
#else
if ( !cfg.preferences.enableTrayIcon ) {
if ( trayIcon ) {
delete trayIcon;
@ -1444,6 +1452,7 @@ void MainWindow::trayIconUpdateOrInit()
// The 'Close to tray' action is associated with the tray icon, so we hide
// or show it here.
ui.actionCloseToTray->setVisible( cfg.preferences.enableTrayIcon );
#endif
}
void MainWindow::wheelEvent( QWheelEvent * ev )
@ -2532,7 +2541,7 @@ void MainWindow::handleEsc()
}
if ( cfg.preferences.escKeyHidesMainWindow ) {
toggleMainWindow();
toggleMainWindow( false );
}
else {
focusTranslateLine();
@ -2873,7 +2882,7 @@ void MainWindow::showTranslationForDicts( QString const & inWord,
ignoreDiacritics );
}
void MainWindow::toggleMainWindow( bool onlyShow )
void MainWindow::toggleMainWindow( bool ensureShow )
{
bool shown = false;
@ -2906,7 +2915,7 @@ void MainWindow::toggleMainWindow( bool onlyShow )
}
shown = true;
}
else if ( !onlyShow ) {
else if ( !ensureShow ) {
// On Windows and Linux, a hidden window won't show a task bar icon
// When trayicon is enabled, the duplication is unneeded
@ -2990,7 +2999,7 @@ void MainWindow::installHotKeys()
void MainWindow::hotKeyActivated( int hk )
{
if ( !hk ) {
toggleMainWindow();
toggleMainWindow( false );
}
else if ( scanPopup ) {
#ifdef HAVE_X11
@ -3075,7 +3084,7 @@ void MainWindow::trayIconActivated( QSystemTrayIcon::ActivationReason r )
switch ( r ) {
case QSystemTrayIcon::Trigger:
// Left click toggles the visibility of main window
toggleMainWindow();
toggleMainWindow( false );
break;
case QSystemTrayIcon::MiddleClick:
@ -3088,10 +3097,6 @@ void MainWindow::trayIconActivated( QSystemTrayIcon::ActivationReason r )
}
}
void MainWindow::showMainWindow()
{
toggleMainWindow( true );
}
void MainWindow::visitHomepage()
{
@ -3730,13 +3735,6 @@ void MainWindow::wordReceived( const QString & word )
respondToTranslationRequest( word, false );
}
void MainWindow::headwordReceived( const QString & word, const QString & ID )
{
toggleMainWindow( true );
setInputLineText( word, WildcardPolicy::EscapeWildcards, NoPopupChange );
respondToTranslationRequest( word, false, ArticleView::scrollToFromDictionaryId( ID ), false );
}
void MainWindow::updateFavoritesMenu()
{
if ( ui.favoritesPane->isVisible() ) {
@ -4141,7 +4139,13 @@ void MainWindow::showDictionaryHeadwords( Dictionary::Class * dict )
headwordsDlg = new DictHeadwords( this, cfg, dict );
addGlobalActionsToDialog( headwordsDlg );
addGroupComboBoxActionsToDialog( headwordsDlg, groupList );
connect( headwordsDlg, &DictHeadwords::headwordSelected, this, &MainWindow::headwordReceived );
connect( headwordsDlg,
&DictHeadwords::headwordSelected,
this,
[ this ]( QString const & headword, QString const & dictID ) {
setInputLineText( headword, WildcardPolicy::EscapeWildcards, NoPopupChange );
respondToTranslationRequest( headword, false, ArticleView::scrollToFromDictionaryId( dictID ), false );
} );
connect( headwordsDlg,
&DictHeadwords::closeDialog,
this,

View file

@ -14,7 +14,7 @@
#include "config.hh"
#include "dict/dictionary.hh"
#include "article_netmgr.hh"
#include "audioplayerfactory.hh"
#include "audio/audioplayerfactory.hh"
#include "instances.hh"
#include "article_maker.hh"
#include "scanpopup.hh"
@ -67,7 +67,6 @@ public slots:
void messageFromAnotherInstanceReceived( QString const & );
void showStatusBarMessage( QString const &, int, QPixmap const & );
void wordReceived( QString const & );
void headwordReceived( QString const &, QString const & );
void headwordFromFavorites( QString const &, QString const & );
void quitApp();
@ -226,9 +225,8 @@ private:
/// group, or to all dictionaries if there are no groups.
vector< sptr< Dictionary::Class > > const & getActiveDicts();
/// Brings the main window to front if it's not currently, or hides it
/// otherwise. The hiding part is omitted if onlyShow is true.
void toggleMainWindow( bool onlyShow = false );
/// @param ensureShow only ensure the window will be shown and no "toggling"
void toggleMainWindow( bool ensureShow );
/// Creates hotkeyWrapper and hooks the currently set keys for it
void installHotKeys();
@ -398,8 +396,6 @@ private slots:
void setAutostart( bool );
void showMainWindow();
void visitHomepage();
void visitForum();
void openConfigFolder();

View file

@ -174,6 +174,11 @@ Preferences::Preferences( QWidget * parent, Config::Class & cfg_ ):
ui.hideSingleTab->setChecked( p.hideSingleTab );
ui.mruTabOrder->setChecked( p.mruTabOrder );
ui.enableTrayIcon->setChecked( p.enableTrayIcon );
#ifdef Q_OS_MACOS // macOS uses the dock menu instead of the tray icon
ui.enableTrayIcon->hide();
#endif
ui.startToTray->setChecked( p.startToTray );
ui.closeToTray->setChecked( p.closeToTray );
ui.cbAutostart->setChecked( p.autoStart );