On Sun, 2020-06-28 at 12:54 +0200, Mauro Carvalho Chehab wrote:
> Em Sun, 28 Jun 2020 11:37:08 +0300
> Maxim Levitsky <mlevi...@redhat.com> escreveu:
> 
> > On Thu, 2020-06-25 at 17:05 +0200, Mauro Carvalho Chehab wrote:
> > > Em Thu, 25 Jun 2020 15:53:46 +0300
> > > Maxim Levitsky <mlevi...@redhat.com> escreveu:
> > >   
> > > > On Thu, 2020-06-25 at 13:17 +0200, Mauro Carvalho Chehab wrote:  
> > > > > Em Thu, 25 Jun 2020 12:59:15 +0200
> > > > > Mauro Carvalho Chehab <mchehab+hua...@kernel.org> escreveu:
> > > > >     
> > > > > > Hi Maxim,
> > > > > > 
> > > > > > Em Thu, 25 Jun 2020 12:25:10 +0300
> > > > > > Maxim Levitsky <mlevi...@redhat.com> escreveu:
> > > > > >     
> > > > > > > Hi!
> > > > > > > 
> > > > > > > I noticed that on recent kernels the search function in xconfig 
> > > > > > > is partially broken.
> > > > > > > This means that when you select a found entry, it is not selected 
> > > > > > > in the main window,
> > > > > > > something that I often do to find some entry near the area I 
> > > > > > > would like to modify,
> > > > > > > and then use main window to navigate/explore that area.
> > > > > > > 
> > > > > > > Reverting these commits helps restore the original behavier:
> > > > > > > 
> > > > > > > b311142fcfd37b58dfec72e040ed04949eb1ac86 - kconfig: qconf: fix 
> > > > > > > support for the split view mode
> > > > > > > cce1faba82645fee899ccef5b7d3050fed3a3d10 - kconfig: qconf: fix 
> > > > > > > the content of the main widget
> > > > > > > 
> > > > > > > I have Qt5 5.13.2 from fedora 31 (5.13.2-1.fc31)
> > > > > > > 
> > > > > > > Could you explain what these commits are supposed to fix?
> > > > > > > I mostly use the split view mode too and it does appear to work 
> > > > > > > for me with these commits reverted as well.
> > > > > > >     
> > > > > > 
> > > > > > There are three view modes for qconf:
> > > > > > 
> > > > > >     - Single
> > > > > >     - Split
> > > > > >     - Full
> > > > > > 
> > > > > > those got broken when gconf was converted to use Qt5, back on 
> > > > > > Kernel 3.14.
> > > > > > Those patches restore the original behavior.    
> > > > You mean xconfig/qconf? (gconf is another program that is GTK based as 
> > > > far as I know).  
> > > 
> > > Yeah, I meant the Qt one (qconfig).
> > >   
> > > > Could you expalin though what was broken? What exactly didn't work?  
> > > 
> > > Try to switch between the several modes and switch back. There used to
> > > have several broken things there, because the Qt5 port was incomplete.
> > > 
> > > One of the things that got fixed on the Qt5 fixup series is the helper
> > > window at the bottom. It should now have the same behavior as with the
> > > old Qt3/Qt4 version.
> > > 
> > > Basically, on split mode, it should have 3 screen areas:
> > > 
> > >   +------------+-------+
> > >   |            |       |
> > >   | Config     |  menu |
> > >   |            |       |
> > >   +------------+-------+
> > >   |                    |
> > >   | Config description +
> > >   |                    |
> > >   +--------------------+
> > > 
> > > The contents of the config description should follow up any changes at 
> > > the "menu" part of the split mode, when an item is selected from "menu",
> > > or follow what's selected at "config", when the active window is 
> > > "config".  
> > 
> > Dunno. with the 2 b311142fcfd37b58dfec72e040ed04949eb1ac86 and 
> > cce1faba82645fee899ccef5b7d3050fed3a3d10,
> > in split view, I wasn't able to make the 'config description' show anything 
> > wrong,
> > in regard to currently selected item in 'config' and in 'menu'
> 
> Well, the problem was related to how the code calls those 3 areas
> internally: configView, menuView and configInfoView. 
> 
> When it is outside the split view, it should hide the
> menuView, in order to show just the configView and the configInfoView.
> 
> There were lots of weird stuff there. I suspect that, after the
> half-done Qt5 conversion (that handled badly the menuView hiding
> logic), some hacks were added, assuming the wrong window hiding 
> logic. When I fixed it, other things stopped working. So, additional
> fixup patches were needed.
> 
> > At that point this is mostly an academic interset for me since,
> > the patch that you sent fixes search. Thank you very much!
> 
> Anytime!
> 
> > BTW, I re-discovered another bug (I have seen it already but it didn't 
> > bother me that much),
> > while trying to break the version with these commits reverted (but it 
> > happens 
> > with them not reverted as well):
> > 
> > When I enable 'show debug info' to understand why I can't enable/disable 
> > some config
> > option, the hyperlinks in the config description don't work - they make the 
> > config
> > window to be empty.
> 
> It sounds that the creation of the search list for the QTextBrowser 
> instantiated class (e. g. configInfoView) is not fine.
> 
> It sounds that it was supposed to call either setInfo() or
> setMenuLink() when a debug info hyperlink is clicked:
> 
>       info = new ConfigInfoView(split, name);
>       connect(list->list, SIGNAL(menuChanged(struct menu *)),
>               info, SLOT(setInfo(struct menu *)));
> 
> But this is not happening. Perhaps this also broke with the Qt5
> conversion?
> 
> I suspect it should, instead, use a different signal to handle it.
> 
> See, with the enclosed patch, clicking on a link will now show:
> 
>       Clicked on URL QUrl("s0x21c3f10")
>       QTextBrowser: No document for s0x21c3f10
> 
> Which helps to explain what's happening here.
> 
> See, when debug is turned on, it will create hyperlinks like:
> 
>       head += QString().sprintf("<a href=\"s%p\">", sym);
> 
> It seems that the code needs something like:
> 
>       connect (helpText, SIGNAL (anchorClicked (const QUrl &)),
>                        helpText, SLOT (clicked (const QUrl &)) );
> 
> and a handler for this signal that would translate "s%p"
> back into sym, using such value to update the menus.
> 
> Do you know if this used to work after Kernel 3.14?

I don't know yet, but I can test it. 

I didn't do much kernel developement for lot of time, so I only vaguely
remember that once upon a time it did work. I don't use this feature much,
so it might as well be broken back when conversion to Qt5 happened.
Also worth noting that I probably used Qt4 untill recently when I updated
to fedora 31, which looks like dropped Qt4 developement packages.

I used to know a thing or two about Qt, long long ago, so on next weekend or so,
I can also take a look at this.

Best regards,
        Maxim Levitsky

> 
> Thanks,
> Mauro
> 
> diff --git a/scripts/kconfig/qconf.cc b/scripts/kconfig/qconf.cc
> index b8f577c6e8aa..4d9bf9330c73 100644
> --- a/scripts/kconfig/qconf.cc
> +++ b/scripts/kconfig/qconf.cc
> @@ -4,27 +4,19 @@
>   * Copyright (C) 2015 Boris Barbulovski <bbarbulov...@gmail.com>
>   */
>  
> -#include <qglobal.h>
> -
> -#include <QMainWindow>
> -#include <QList>
> -#include <qtextbrowser.h>
>  #include <QAction>
> +#include <QApplication>
> +#include <QCloseEvent>
> +#include <QDebug>
> +#include <QDesktopWidget>
>  #include <QFileDialog>
> +#include <QLabel>
> +#include <QLayout>
> +#include <QList>
>  #include <QMenu>
> -
> -#include <qapplication.h>
> -#include <qdesktopwidget.h>
> -#include <qtoolbar.h>
> -#include <qlayout.h>
> -#include <qsplitter.h>
> -#include <qlineedit.h>
> -#include <qlabel.h>
> -#include <qpushbutton.h>
> -#include <qmenubar.h>
> -#include <qmessagebox.h>
> -#include <qregexp.h>
> -#include <qevent.h>
> +#include <QMenuBar>
> +#include <QMessageBox>
> +#include <QToolBar>
>  
>  #include <stdlib.h>
>  
> @@ -400,6 +392,8 @@ void ConfigList::updateSelection(void)
>       struct menu *menu;
>       enum prop_type type;
>  
> +qInfo() << __FUNCTION__;
> +
>       if (mode == symbolMode)
>               setHeaderLabels(QStringList() << "Item" << "Name" << "N" << "M" 
> << "Y" << "Value");
>       else
> @@ -536,6 +530,8 @@ void ConfigList::setRootMenu(struct menu *menu)
>  {
>       enum prop_type type;
>  
> +
> +qInfo() << __FUNCTION__ << "menu:" << menu;
>       if (rootEntry == menu)
>               return;
>       type = menu && menu->prompt ? menu->prompt->type : P_UNKNOWN;
> @@ -1020,6 +1016,7 @@ void ConfigView::updateListAll(void)
>  ConfigInfoView::ConfigInfoView(QWidget* parent, const char *name)
>       : Parent(parent), sym(0), _menu(0)
>  {
> +qInfo() << __FUNCTION__;
>       setObjectName(name);
>  
>  
> @@ -1033,6 +1030,7 @@ ConfigInfoView::ConfigInfoView(QWidget* parent, const 
> char *name)
>  
>  void ConfigInfoView::saveSettings(void)
>  {
> +qInfo() << __FUNCTION__;
>       if (!objectName().isEmpty()) {
>               configSettings->beginGroup(objectName());
>               configSettings->setValue("/showDebug", showDebug());
> @@ -1042,6 +1040,7 @@ void ConfigInfoView::saveSettings(void)
>  
>  void ConfigInfoView::setShowDebug(bool b)
>  {
> +qInfo() << __FUNCTION__;
>       if (_showDebug != b) {
>               _showDebug = b;
>               if (_menu)
> @@ -1054,6 +1053,8 @@ void ConfigInfoView::setShowDebug(bool b)
>  
>  void ConfigInfoView::setInfo(struct menu *m)
>  {
> +qInfo() << __FUNCTION__ << "menu:" << m;
> +
>       if (_menu == m)
>               return;
>       _menu = m;
> @@ -1068,6 +1069,8 @@ void ConfigInfoView::symbolInfo(void)
>  {
>       QString str;
>  
> +qInfo() << __FUNCTION__;
> +
>       str += "<big>Symbol: <b>";
>       str += print_filter(sym->name);
>       str += "</b></big><br><br>value: ";
> @@ -1085,6 +1088,8 @@ void ConfigInfoView::menuInfo(void)
>       struct symbol* sym;
>       QString head, debug, help;
>  
> +qInfo() << __FUNCTION__;
> +
>       sym = _menu->sym;
>       if (sym) {
>               if (_menu->prompt) {
> @@ -1140,6 +1145,7 @@ QString ConfigInfoView::debug_info(struct symbol *sym)
>  {
>       QString debug;
>  
> +qInfo() << __FUNCTION__;
>       debug += "type: ";
>       debug += print_filter(sym_type_name(sym->type));
>       if (sym_is_choice(sym))
> @@ -1191,6 +1197,7 @@ QString ConfigInfoView::debug_info(struct symbol *sym)
>  
>  QString ConfigInfoView::print_filter(const QString &str)
>  {
> +qInfo() << __FUNCTION__;
>       QRegExp re("[<>&\"\\n]");
>       QString res = str;
>       for (int i = 0; (i = res.indexOf(re, i)) >= 0;) {
> @@ -1225,6 +1232,7 @@ void ConfigInfoView::expr_print_help(void *data, struct 
> symbol *sym, const char
>       QString* text = reinterpret_cast<QString*>(data);
>       QString str2 = print_filter(str);
>  
> +qInfo() << __FUNCTION__;
>       if (sym && sym->name && !(sym->flags & SYMBOL_CONST)) {
>               *text += QString().sprintf("<a href=\"s%p\">", sym);
>               *text += str2;
> @@ -1233,11 +1241,17 @@ void ConfigInfoView::expr_print_help(void *data, 
> struct symbol *sym, const char
>               *text += str2;
>  }
>  
> +void ConfigInfoView::clicked(const QUrl &url)
> +{
> +     qInfo() << "Clicked on URL" << url;
> +}
> +
>  QMenu* ConfigInfoView::createStandardContextMenu(const QPoint & pos)
>  {
>       QMenu* popup = Parent::createStandardContextMenu(pos);
>       QAction* action = new QAction("Show Debug Info", popup);
>  
> +qInfo() << __FUNCTION__;
>       action->setCheckable(true);
>       connect(action, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool)));
>       connect(this, SIGNAL(showDebugChanged(bool)), action, 
> SLOT(setOn(bool)));
> @@ -1249,6 +1263,7 @@ QMenu* ConfigInfoView::createStandardContextMenu(const 
> QPoint & pos)
>  
>  void ConfigInfoView::contextMenuEvent(QContextMenuEvent *e)
>  {
> +qInfo() << __FUNCTION__;
>       Parent::contextMenuEvent(e);
>  }
>  
> @@ -1258,6 +1273,8 @@ 
> ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char 
> *nam
>       setObjectName(name);
>       setWindowTitle("Search Config");
>  
> +qInfo() << __FUNCTION__ << "name:" << name;
> +
>       QVBoxLayout* layout1 = new QVBoxLayout(this);
>       layout1->setContentsMargins(11, 11, 11, 11);
>       layout1->setSpacing(6);
> @@ -1506,6 +1523,9 @@ ConfigMainWindow::ConfigMainWindow(void)
>       helpMenu->addAction(showIntroAction);
>       helpMenu->addAction(showAboutAction);
>  
> +     connect (helpText, SIGNAL (anchorClicked (const QUrl &)),
> +              helpText, SLOT (clicked (const QUrl &)) );
> +
>       connect(configList, SIGNAL(menuChanged(struct menu *)),
>               helpText, SLOT(setInfo(struct menu *)));
>       connect(configList, SIGNAL(menuSelected(struct menu *)),
> @@ -1603,6 +1623,7 @@ void ConfigMainWindow::saveConfigAs(void)
>  
>  void ConfigMainWindow::searchConfig(void)
>  {
> +qInfo() << __FUNCTION__;
>       if (!searchWindow)
>               searchWindow = new ConfigSearchWindow(this, "search");
>       searchWindow->show();
> @@ -1610,6 +1631,11 @@ void ConfigMainWindow::searchConfig(void)
>  
>  void ConfigMainWindow::changeItens(struct menu *menu)
>  {
> +qInfo() << __FUNCTION__ << "Changing to menu" << menu;
> +
> +     if (menu->flags & MENU_ROOT)
> +             qInfo() << "Wrong type when changing item";
> +
>       configList->setRootMenu(menu);
>  
>       if (configList->rootEntry->parent == &rootmenu)
> @@ -1620,6 +1646,11 @@ void ConfigMainWindow::changeItens(struct menu *menu)
>  
>  void ConfigMainWindow::changeMenu(struct menu *menu)
>  {
> +qInfo() << __FUNCTION__ << "Changing to menu" << menu;
> +
> +     if (!(menu->flags & MENU_ROOT))
> +             qInfo() << "Wrong type when changing menu";
> +
>       menuList->setRootMenu(menu);
>  
>       if (menuList->rootEntry->parent == &rootmenu)
> @@ -1633,6 +1664,7 @@ void ConfigMainWindow::setMenuLink(struct menu *menu)
>       struct menu *parent;
>       ConfigList* list = NULL;
>       ConfigItem* item;
> +qInfo() << __FUNCTION__ << "Changing to menu" << menu;
>  
>       if (configList->menuSkip(menu))
>               return;
> @@ -1681,6 +1713,7 @@ void ConfigMainWindow::setMenuLink(struct menu *menu)
>  
>  void ConfigMainWindow::listFocusChanged(void)
>  {
> +qInfo() << __FUNCTION__;
>       if (menuList->mode == menuMode)
>               configList->clearSelection();
>  }
> @@ -1689,6 +1722,7 @@ void ConfigMainWindow::goBack(void)
>  {
>       ConfigItem* item, *oldSelection;
>  
> +qInfo() << __FUNCTION__;
>       configList->setParentMenu();
>       if (configList->rootEntry == &rootmenu)
>               backAction->setEnabled(false);
> diff --git a/scripts/kconfig/qconf.h b/scripts/kconfig/qconf.h
> index c879d79ce817..a193137f2314 100644
> --- a/scripts/kconfig/qconf.h
> +++ b/scripts/kconfig/qconf.h
> @@ -3,17 +3,17 @@
>   * Copyright (C) 2002 Roman Zippel <zip...@linux-m68k.org>
>   */
>  
> -#include <QTextBrowser>
> -#include <QTreeWidget>
> -#include <QMainWindow>
> +#include <QCheckBox>
> +#include <QDialog>
>  #include <QHeaderView>
> -#include <qsettings.h>
> +#include <QLineEdit>
> +#include <QMainWindow>
>  #include <QPushButton>
>  #include <QSettings>
> -#include <QLineEdit>
>  #include <QSplitter>
> -#include <QCheckBox>
> -#include <QDialog>
> +#include <QTextBrowser>
> +#include <QTreeWidget>
> +
>  #include "expr.h"
>  
>  class ConfigView;
> @@ -250,6 +250,7 @@ public slots:
>       void setInfo(struct menu *menu);
>       void saveSettings(void);
>       void setShowDebug(bool);
> +     void clicked (const QUrl &url);
>  
>  signals:
>       void showDebugChanged(bool);
> 
> 
> 


Reply via email to