Git Product home page Git Product logo

dnfdragora's Introduction

dnfdragora

logo dnfdragora is a DNF frontend, based on rpmdragora from Mageia (originally rpmdrake) Perl code.

dnfdragora is written in Python 3 and uses libYui, the widget abstraction library written by SUSE, so that it can be run using Qt 5, GTK+ 3, or ncurses interfaces.

Example with Qt: dnfdragora with Qt UI

Example with GtK: dnfdragora with GtK UI

Example with ncurses: dnfdragora with ncurses UI

REQUIREMENTS

DNF

DNF Daemon

pystray >= 0.17.3

SUSE libyui >= 4.2.14

libyui-mga >= 1.2.1 - our widget extension

SUSE libyui-bindings (included into libyui)

python-manatools >= 0.0.4

at least one of the SUSE libyui plugins

at least one of the MGA libyui widget extension plugins (according to the one above)

INSTALLATION

Distribution packages:

  • Mageia:
    • dnfdragora: dnf install dnfdragora or urpmi dnfdragora
    • dnfdragora-gui: dnf install dnfdragora-<gui> or urpmi dnfdragora-<gui>
      • Replace <gui> with qt or gtk depending on desired toolkit
  • Fedora:
    • dnfdragora: dnf install dnfdragora (installs all needed for use on terminal)
    • dnfdragora-gui: dnf install dnfdragora-gui (installs all needed for use in desktop environment)

From sources:

  • Packages needed to build:
    • cmake >= 3.4.0
    • python3-devel >= 3.4.0
    • optional: gettext (for locales)
    • optional: python3-sphinx (for manpages)
  • Configure: mkdir build && cd build && cmake ..
    • -DCMAKE_INSTALL_PREFIX=/usr - Sets the install path, eg. /usr, /usr/local or /opt
    • -DCHECK_RUNTIME_DEPENDENCIES=ON - Checks if the needed runtime dependencies are met.
    • -DENABLE_COMPS=ON - Useful if your distribution uses COMPS for groups, eg. Fedora, RHEL, CentOS
  • Build: make
  • Install: make install
  • Run: dnfdragora

From sources (for developers and testers only):

  • Packages needed to build:
    • cmake >= 3.4.0
    • python3-devel >= 3.4.0
    • python3-virtualenv
    • optional: gettext (for locales)
    • optional: python3-sphinx (for manpages)
  • Setup your virtual environment
    • cd $DNFDRAGORA_PROJ_DIR # DNFDRAGORA_PROJ_DIR is the dnfdragora project directory
    • virtualenv --system-site-packages venv # create virtual environment under venv directory
    • . venv/bin/activate # activate virtual environment
  • Configure: mkdir build && cd build && cmake -D... .. && make install
    • needed cmake options are
      • -DCMAKE_INSTALL_PREFIX=$DNFDRAGORA_PROJ_DIR/venv - venv install prefix
      • -DCMAKE_INSTALL_FULL_SYSCONFDIR=$DNFDRAGORA_PROJ_DIR/venv/etc - venv sysconfig directory
    • useful cmake options are
      • -DCHECK_RUNTIME_DEPENDENCIES=ON - Checks if the needed runtime dependencies are met.
      • -DENABLE_COMPS=ON - Useful if your distribution uses COMPS for groups, eg. Fedora, RHEL, CentOS
  • Run: dnfdragora into virtual environment, add '--locales-dir' option if you want to test localization locally)
    • useful dnfdragora options are
      • --locales-dir - if you want to test localization locally
      • --images-path - local icons and images (set to $DNFDRAGORA_PROJ_DIR/venv/share/dnfdragora/images/)

CONTRIBUTE

ManaTools and dnfdragora developers (as well as some users and contributors) are on Matrix. They often discuss development issues there to get immediate feedback and develop ideas. The Matrix room is #manatools:matrix.org. The Matrix room is also bridged to the IRC channel #manatools on Libera Chat. Get in touch with us!

If you have any issues or ideas add or comment an issue.

Check also into our TODO file.

LICENSE AND COPYRIGHT

See license file.

dnfdragora's People

Contributors

adamwill avatar agrez avatar anaselli avatar asciiguy avatar besser82 avatar conan-kudo avatar coreyfarrell avatar fariascl avatar firefly-cpp avatar kakurasan avatar kkofler avatar morizzd avatar norby4ever avatar ntm avatar pontaoski avatar rbuj avatar s8321414 avatar termim avatar wojnilowicz avatar yurchor avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dnfdragora's Issues

dnfdragora doesn't keep in memory the packages source list

reported https://bugs.mageia.org/show_bug.cgi?id=21453

Description of problem:
open dnfdragora: a window opens, click on "files > package sources" : the window "packages sources manager" opens, displaying a list of sources: only two boxes are checked by default: mageia-x86_64 and updates-x86_64; I have selected mageia-i586, updates-i586 and a couple of others, then I have click on the "apply button" and quitted dnfdragora; it didn't keep my choice in memory, since after running successively as root, and in this order, the commands:

dnf upgrade
urpmi --auto-update

(which returns you'll find in the attached documents) shows that dnf took into account only updates-x86_64 and not upgrades-i586

Regarding "multiple instances"

When DNFDragora is already running, and a user opens a .rpm file from a file manager (Nautilus, Dolphin, etc.), it should pass the open event to the open instance, not try to open another instance only to give an error message and close the second instance.

[GTK GUI] User Experience: How does the GUI work?

I've been using yumex-dnf for a long time and I do not really understand how dnfdragora should work. Some issues:

Why are there dropdown menus on top left and top right? What does the "File" menu do?

What are the drowdown menus in the next line below for?

Why don't you use traditional menus or a GNOME-3ish look and feel with more buttons?

dnfdragora has no "Advanced" options in "User preferences"

Hi.

I would like here to suggest on you adding "Advanced Options" in dailog of "User Preferences".

These advanced options should be "front-end" to "dnf-conf". For example: today I set my dnf to use fastest mirror. I enforced to edit system file by:

sudo vi /etc/dnf/dnf.conf
then added following line:
fastestmirror=true

It will be more covenant if dnfdragora has such options like:

  • set fastest mirror
  • number of kernel to be stay on system
  • Check GPG
  • Remove unused dependencies/requirements
  • & other options (that I do not know about them)

Also, you can make "Advanced" options NOT a part of "User preferences" but a separate sections under "Options", so that, when user click on "Options" she/he will see (one under other):

  • "User Preferences"
  • "Advanced" (or you can call it "DNF Configuration"

Also, it is useful if you add in dailog of "User Preferences" (but not within advanced options) an option to activate new feature (that I think you are already added) to make dnfdragora manage install of local .rpm package by double click on this local .rpm package.

Best

Best.

Missing icons for comps categories and groups

Using revision bb6edcf.

Icons for the groups are AWOL on Fedora. The paths it tries to use are for Mageia. So I get only warnings on the console about not found icons and no icons.

https://fedorahosted.org/comps/ explains how icons for comps groups should be looked up:

Groups have an icon associated with them. These icons come from the comps-extras package; icons are read from /usr/share/pixmaps/comps/<group-id>.png. If an icon does not exist for a group id, the one for the category that the group is in is used.

I also have a /usr/share/pixmaps/comps/uncategorized.png that can be used as a fallback if the icon is missing.

Note, however, that to properly implement this, we need the internal IDs of the categories, which dnfdaemon currently does not return anywhere: manatools/dnfdaemon#9 .

Updater symlinked Icon

As Korora uses Numix-Circle as the default icon theme the developers of the theme were approached to provide a suitable icon. They decided to do as they have done for other package managers and use a symlink to their package manager icon, see numixproject/numix-core#3716 for details.

This works fine for menus and launchers etc.however it breaks the Notifier that appears in the systray area. When the symlink is in place the updated doesn't start. If the symlink is removed and the original icon used the updater will start and will appear in the systray area.

Tested on Korora 25 Xfce with dnfdragora version 1.0.1-5.git20170505.2a3b056.fc25

Display of GUI of dnfdragora is highly unlogical & need rebuilding ! Please your kind attention !

Hi. Currently, dnfdragora on Fedora has unlogical GUI due to:

  1. most importantly, size of individual columns are very wide make user unable to see enough amount of descriptions & data ! User need to scroll horizontally for that !

You need to decrease width of individual columns. It will be very great if you take yumex-dnf as an ideal because it has very logical GUI.

  1. currently, dnfdragora has no "package size" column ! In addition to "Arche", "Version", ....... there is need to add column for "Package size".

Users need to know exactly how much size of package(s) that she/he need to download .....

Best & thank you for your very hard efforts !

dnfdragora updater do not notify about new update from "Ring" repository !

Hi. I'm on Fedora 26 X64 bit Cinnamon edition.

I added external repository of "Ring" messenger:

sudo dnf config-manager --add-repo https://dl.ring.cx/ring-nightly/fedora_27/ring-nightly.repo
sudo dnf install ring
Please see:
https://ring.cx/en/download/gnu-linux

I noticed that dnfdragora do not notify me about new update from this repository, although it do well this for Fedora & RPMFusion repositories !!

Please your kind investigation about this issue.

Best.

Comps groups are shown with their internal ID as the name

Using revision bb6edcf.

The comps groups are shown only with their internal IDs in lieu of names. The user-displayable names are found in gl[1], but the code retains only gl[0], which is the ID.

Note that for categories, we get something more user-centric because dnfdaemon returns the name instead of the id in gl[0] (which causes other problems, see also #2 and manatools/dnfdaemon#9 ), but we still want gl[1], which is the ui_name.

The ui_name (gl[1]) should also be returned in already translated form, but this is not currently happening, I have not checked yet why. (Maybe you have to ask the session daemon rather than the system daemon for the groups? Maybe you should set the locale somewhere?)

Hide notification in KDE System tray when no updates are available

I would love to check for updates on a schedule, but have the tray icon 'hidden' when no updates are available.

KDE has 3 'modes' for system tray icons: Auto, Shown, Hidden.

When no updates are available, the tray icon should be in 'hidden' mode. When an update is available, it should be in 'shown' mode.

This way it becomes obvious when updates are available.

Tool tip Inconsistency

When dnfdragora update notifier is in the panel on KDE Plasma a tooltip appears on mouse over identifying dnfdragora. However when used on Xfce there is no such identification. Actually dnfdragora is the only item in my Xfce systray that doesn't display a tooltip on mouse over.

Both systems are Korora 25 running dndragora 1.0.1-5.git20170505.2a3b056.fc25, the latest version from the Fedora repos.

RFE: Support installing a local RPM from the command line

Please add support for installing a local RPM file passed on the command line, looking in the repositories for any missing dependencies, together with a file association for RPM files. That allows installing an RPM from a browser (e.g., the *-release RPM that configures a repository, to bootstrap a repository) without going through the CLI. (This is one of the features Apper had that dnfdragora is still missing.)

The required dnfdaemon support should already be there, because yumex-dnf -I /path/to/some.rpm works. As far as I can tell, you just have to pass the full path to the file instead of a package name to the dnf(daemon) install command.

Note that unlike yumex-dnf, I would suggest just treating any non-option argument as an RPM file (dnfdragora /path/to/some.rpm) instead of requiring -I, it makes the file association simpler.

Support for Sortable Size Column

On the old yum based yumex we had this capability for sorting RPM by size. Please advise if this could be implemented. Thanks.

Crash on update with a single packageโ€ฆ

This crash appears on all backendsโ€ฆ :/

dnf_backend.py:225:on_RPMProgress:KeyError: 10

Traceback (most recent call last):
  File "/usr/lib/python3.6/site-packages/dnfdaemon/client/__init__.py", line 187, in __call__
    return getattr(self.proxy, self.method)(*args)
  File "/usr/lib/python3.6/site-packages/dnfdaemon/client/__init__.py", line 228, in _on_g_signal
    self.handle_dbus_signals(proxy, sender, signal, args)
  File "/usr/lib/python3.6/site-packages/dnfdaemon/client/__init__.py", line 556, in handle_dbus_signals
    self.on_RPMProgress(*args)
  File "/usr/lib/python3.6/site-packages/dnfdragora/dnf_backend.py", line 225, in on_RPMProgress
    self.frontend.infobar.info_sub(const.RPM_ACTIONS[action] % name)
KeyError: 10

Local variables in innermost frame:
name: 'google-chrome-stable-57.0.2987.133-1.x86_64'
num: ' ( 1/2 )'
ts_total: 2
ts_current: 1
te_total: 100
te_current: 100
action: 10
package: 'google-chrome-stable,0,57.0.2987.133,1,x86_64,google-chrome'
self: <dnfdragora.dnf_backend.DnfRootBackend object at 0x7f8bc2953f60>

Cannot combine filters and name search

Using revision 7f94340.

Testing with an update not yet installed: youtube-dl, which is in the "Text-based Internet" group.

  1. Browsing to the "Text-based Internet" group, default "All" filter: youtube-dl appears in the list.
  2. Browsing to the "Text-based Internet" group, "To update" filter: youtube-dl appears (as the one result).
  3. Searching for youtube-dl by name, default "All" filter: youtube-dl appears (3 results, different versions of the package).
  4. Searching for youtube-dl by name, "To update" filter: empty search result.

Don't lock in Update mode

When starting with the '--update-only' dnfdragora is locked in that mode. When updating is complete or if no updates are found it should be possible to search or carry out any other function.

Reset the selection option doesn't work

As I understand it the option in File - Reset the selection should change the selection criteria to the previous state. However I can't get it to work. If I have searched for something and then choose that option nothing changes in the display.
Tested in Korora 26 with version 1.0.1.

Recognize and handle the installation of SRPMs

Often when I want to hack on a build that I come across I download the SRPM and run rpm -i <SRPM> as a normal user. This of course installs the files in the proper build directories in ~/rpmbuild/. dnfdragora seems to have been built with the predisposition that all rpms are to be installed as system packages, because presently it asks for root permissions when I click on an SRPM.

Expected results:

  1. When processing an SRPM with dnfdragora (whether clicking on one or otherwise) it should install it as a normal user and have the same effect as rpm -i.

Crash on F25 w/ 1.0.1-5

Package version:

dnfdragora-1.0.1-5.git20170505.2a3b056.fc25.noarch
dnfdragora-gui-1.0.1-5.git20170505.2a3b056.fc25.noarch

Error:

An orange dialog window shows and presents the following:

dnfdaemon client error occurred:
g-io-error-quark: GDBus.Error:org.baseurl.DnfSystem.LockedError: dnf is locked by another application (36)

Full console log:

Skipped exception: <[Errno 2] No such file or directory: './dnfdragora.yaml'> 
<_M_> [ui] YUILoader.cc:50 loadUI(): DISPLAY: ":0"
<_M_> [ui] YUILoader.cc:51 loadUI(): XDG_CURRENT_DESKTOP: "KDE"
<_M_> [ui] YUILoader.cc:52 loadUI(): YUI_PREFERED_BACKEND: ""
<_M_> [ui] YUILoader.cc:86 loadUI(): User-selected UI-plugin: ""
<_M_> [ui] YPath.cc:49 YPath(): Given filename: libyui-gtk.so.8
<_M_> [ui] YSettings.cc:74 progDir(): progDir: ""
<_M_> [ui] YPath.cc:65 YPath(): Preferring subdir: 
<_M_> [ui] YPath.cc:66 YPath(): Subdir given with filename: 
<_M_> [ui] YPath.cc:67 YPath(): Looking for: libyui-gtk.so.8
<_M_> [ui] YPath.cc:138 lsDir(): Looking in /usr/lib64/yui
<_M_> [ui] YPath.cc:118 YPath(): Found libyui-gtk.so.8 in /usr/lib64/yui
<_M_> [ui] YPath.cc:49 YPath(): Given filename: libyui-ncurses.so.8
<_M_> [ui] YSettings.cc:74 progDir(): progDir: ""
<_M_> [ui] YPath.cc:65 YPath(): Preferring subdir: 
<_M_> [ui] YPath.cc:66 YPath(): Subdir given with filename: 
<_M_> [ui] YPath.cc:67 YPath(): Looking for: libyui-ncurses.so.8
<_M_> [ui] YPath.cc:138 lsDir(): Looking in /usr/lib64/yui
<_M_> [ui] YPath.cc:118 YPath(): Found libyui-ncurses.so.8 in /usr/lib64/yui
<_M_> [ui] YPath.cc:49 YPath(): Given filename: libyui-qt.so.8
<_M_> [ui] YSettings.cc:74 progDir(): progDir: ""
<_M_> [ui] YPath.cc:65 YPath(): Preferring subdir: 
<_M_> [ui] YPath.cc:66 YPath(): Subdir given with filename: 
<_M_> [ui] YPath.cc:67 YPath(): Looking for: libyui-qt.so.8
<_M_> [ui] YPath.cc:138 lsDir(): Looking in /usr/lib64/yui
<_M_> [ui] YPath.cc:118 YPath(): Found libyui-qt.so.8 in /usr/lib64/yui
<_M_> [ui] YUILoader.cc:118 loadUI(): Using UI-plugin: "qt"
<_M_> [ui] YSettings.cc:179 loadedUI(): Set loadedUI to "qt"
<_M_> [ui] YSettings.cc:180 loadedUI(): loadedUI is now locked.
<_M_> [ui] YPath.cc:49 YPath(): Given filename: libyui-qt.so.8
<_M_> [ui] YSettings.cc:74 progDir(): progDir: ""
<_M_> [ui] YPath.cc:65 YPath(): Preferring subdir: 
<_M_> [ui] YPath.cc:66 YPath(): Subdir given with filename: 
<_M_> [ui] YPath.cc:67 YPath(): Looking for: libyui-qt.so.8
<_M_> [ui] YPath.cc:138 lsDir(): Looking in /usr/lib64/yui
<_M_> [ui] YPath.cc:118 YPath(): Found libyui-qt.so.8 in /usr/lib64/yui
<_M_> [ui] YUI.cc:76 YUI(): This is libyui 3.3.2
<_M_> [ui] YUI.cc:77 YUI(): Creating UI without threads
<_M_> [qt-ui] YQUI.cc:100 YQUI(): This is libyui-qt 2.47.1
<_M_> [ui] YUI.cc:230 topmostConstructorHasFinished(): Running without threads
<_M_> [qt-styler] QY2Styler.cc:141 loadStyleSheet(): Couldn't open style sheet "/usr/share/libyui/theme/current/wizard/style.qss"
<_M_> [qt-ui] YQUI.cc:296 processCommandLineArgs(): Qt argument: /usr/bin/python3
<_M_> [qt-ui] YQUI.cc:296 processCommandLineArgs(): Qt argument: /usr/bin/dnfdragora
<_M_> [qt-ui] YQUI.cc:439 calcDefaultSize(): Default size: 1344 x 723
<ERR> [qt-ui] YQUI.cc:262 initUI(): Forcing /libQtGui.so.5 open failed
<_M_> [qt-ui] YQApplication.cc:133 loadPredefinedQtTranslations(): Selected language: en_US
<WRN> [qt-ui] YQApplication.cc:137 loadPredefinedQtTranslations(): Qt locale directory not set - no translations for predefined Qt dialogs
<_M_> [qt-ui] YQUI.cc:273 initUI(): YQUI initialized. Thread ID: 0x0x7f3ec1db6700
<_M_> [ui] YSettings.cc:197 loadedUI(): loadedUI: "qt"
<_M_> [ui] YPath.cc:49 YPath(): Given filename: libyui-mga-qt.so.8
<_M_> [ui] YSettings.cc:74 progDir(): progDir: ""
<_M_> [ui] YPath.cc:65 YPath(): Preferring subdir:
<_M_> [ui] YPath.cc:66 YPath(): Subdir given with filename:
<_M_> [ui] YPath.cc:67 YPath(): Looking for: libyui-mga-qt.so.8
<_M_> [ui] YPath.cc:138 lsDir(): Looking in /usr/lib64/yui
<_M_> [ui] YPath.cc:118 YPath(): Found libyui-mga-qt.so.8 in /usr/lib64/yui
<_M_> [ui] YPath.cc:49 YPath(): Given filename: libyui-mga-qt.so.8
<_M_> [ui] YSettings.cc:74 progDir(): progDir: ""
<_M_> [ui] YPath.cc:65 YPath(): Preferring subdir:
<_M_> [ui] YPath.cc:66 YPath(): Subdir given with filename:
<_M_> [ui] YPath.cc:67 YPath(): Looking for: libyui-mga-qt.so.8
<_M_> [ui] YPath.cc:138 lsDir(): Looking in /usr/lib64/yui
<_M_> [ui] YPath.cc:118 YPath(): Found libyui-mga-qt.so.8 in /usr/lib64/yui
<_M_> [ew] YExternalWidgets.cc:37 YExternalWidgets(): Creating Libyui External Widgets object
<_M_> [mga-qt-ui] YMGA_QCBTable.cc:74 YMGA_QCBTable():  Slection mode 2
dnfdaemon client error: g-io-error-quark: GDBus.Error:org.baseurl.DnfSystem.LockedError: dnf is locked by another application (36)
<_M_> [ui] YUILoader.cc:163 deleteUI(): Shutting down UI
Closing dnfdragora
<_M_> [ew] YExternalWidgets.cc:116 ~YExternalWidgetsTerminator(): Shutting down mga External Widgets
<_M_> [ew] YMGAWidgetExtensionFactory.cc:49 ~YMGAWidgetFactory(): Factory removed

Temporary resolution:

systemctl stop dnfdaemon

Then start dnfdragora again, and it works ok.

Only error associated with dnfdaemon log (not sure if related or not)

May 07 07:54:10 icarus.net.overtmind.com dnfdaemon-system[23070]: The 'group_persistor' function is not a part of DNF API and will be removed in the upcoming DNF release. Please use only officially supported API functions. DNF API documentation is available at https://dnf.readthedocs.org/en/latest/api.html.

[Gtk GUI] User interface: dnfdragora freezes on start for a very long time

It seems like dnfdragora is freezing very often on start. Sometimes it does recover, sometimes it does not. This might be the result of some background operation going on, but since there is no busy indicator (except a spinning wheel) the ordinary user would not know if there is. After some time dnfdragora sometimes starts displaying information on the fact that it is updating repo metadata.

I'm running dnfdragora-1.0.1-1.fc26 with libyui-3.3.2-1.fc26 and dnfdaemon-0.3.17-1.fc26.

dnfdragora tracebacks and segfaults if dnf is locked by another application

Using revision bb6edcf.

Start looking for groups
Unexpected error: <class 'dnfdaemon.client.DaemonError'>
Traceback (most recent call last):
  File "/usr/bin/dnfdragora", line 33, in <module>
    main_gui = dnfdragora.ui.mainGui(options)
  File "/usr/lib/python3.5/site-packages/dnfdragora/ui.py", line 298, in __init__
    self._fillGroupTree()
  File "/usr/lib/python3.5/site-packages/dnfdragora/ui.py", line 467, in _fillGroupTree
    rpm_groups = self.backend.get_groups()
  File "/usr/lib/python3.5/site-packages/dnfdragora/basedragora.py", line 54, in backend
    return self.get_root_backend()
  File "/usr/lib/python3.5/site-packages/dnfdragora/basedragora.py", line 80, in get_root_backend
    self.backend.ExpireCache()
  File "/usr/lib/python3.5/site-packages/dnfdaemon/client/__init__.py", line 401, in ExpireCache
    rc = self._run_dbus_async('ExpireCache', '()')
  File "/usr/lib/python3.5/site-packages/dnfdaemon/client/__init__.py", line 293, in _run_dbus_async
    result = self._get_result(data)
  File "/usr/lib/python3.5/site-packages/dnfdaemon/client/__init__.py", line 277, in _get_result
    self._handle_dbus_error(user_data['error'])
  File "/usr/lib/python3.5/site-packages/dnfdaemon/client/__init__.py", line 250, in _handle_dbus_error
    raise DaemonError(str(err))
dnfdaemon.client.DaemonError: g-io-error-quark: GDBus.Error:org.baseurl.DnfSystem.LockedError: dnf is locked by another application (36)
<_M_> [ui] YUILoader.cc:104 deleteUI(): Shutting down UI
<ERR> [ui] YUI.cc:94 ~YUI(): 1 open dialogs left over
Segmentation fault (core dumped)

[Stability/security] Do not use the dnfdaemon running as root as long as possible

By default, dnfdragora invokes dnfdaemon, which is running as root. This even happens for simple package requests. Any programming error might cause the dnfdaemon to break the system. To make those errors less dangerous, I suggest that dnfdragora only runs dnfdaemon as root if it needs to do transactions (i.e. install/uninstall software) or accesses the history database (if this feature comes back from yumex-dnf).

Installed software:
gtk3-3.22.12-2.fc25.x86_64
dnfdragora-1.0.1-5.git20170505.2a3b056.fc25.noarch
libyui-gtk-2.44.9-2.fc25.x86_64

Change title from "Software Management" to "Package Management"

Hi. 1st I would like to thank you very much for your very hard efforts to evolute dnfdragora. Special thanks for your fix for issue62 (add column size).

Please open attached picture. It is screenshot from my PC.

screenshot

I put 2 markers: red line & blue line pointing on area where appear "Software manager". I think it will be better to change it into "Packages manager", since software managers (in GNOME, Mint, Ubuntu, ...... etc) do not show all packages. While program like symantic or Yum (DNF) Extender, dnfdragora, ..... show all packages.

Best.

Some already translated strings are displayed in English

Though some strings are already translated, they're displayed in English.

  • Command-line options
  • Strings in dnfdragora/const.py

Example:
dnfdragora-translated-text-displayed-in-english

The "Installing: ..." (msgid "Installing: %s") is already translated but displayed in English.

Improving arrengment of options inside "User preferences" dialog

Hi.

Currently (on my dnfdragora version 1.0.1) on Fedora 26, options inside "User preferences" dialog appearing one beside other like:

"Show updates next startup" "Do not show groups view next startup

I suggest on you to make them one under other to avoid confusion. This confusion may be not prominent in case of above example because there are check box before each of above 2 options which assist in recognition of them as 2. But for:

"Proceed without asking for conformation" ""Interval in minutes to check for updates"

confusion it will be more prominent & possible because no check box before "Interval in minutes to check for update" (it not need such check box off-course). There is no even a vertical separation line between these 2 options. Here it will be useful to put options (ALL options) one bellow other.

This will be more important for users using dark theme (especially when combined with low brightness due to long duty on laptop screen).

preferances

Comboboxes appear to be non-functional

Using revision bb6edcf.

I tried listing the available updates. But neither "All updates" in the first combobox nor "To update" in the filter combobox appear to do anything useful. (When I tried, I had 5 updates not installed yet according to plasma-pk-updates.)

Are those filters expected to do anything yet? If not, it may be worth hiding them until they work.

RFE. Add a startup preference

Please provide a startup preference to select the mode to start in. An option to check for updates of startup as per Yumex-dnf would be preferable. This would also provide a faster startup.

As an aside starting in Group mode adds additional overhead which slows the startup so that dnfdragora compares poorly to yumex-dnf. Group mode seems a poor choice for the default mode.

dnfdragora "Search" does not recognize "Ring" package !

Hi. I'm on Fedora 26 X64 bit Cinnamon edition. I added external repository (repository of "Ring" messenger) as following:
sudo dnf config-manager --add-repo https://dl.ring.cx/ring-nightly/fedora_27/ring-nightly.repo
sudo dnf install ring
Please see:
https://ring.cx/en/download/gnu-linux

Repository added O.K & I receiving updates ......

But I noticed that this package "ring" not appear in search result of dnfdragora when I searched it !!

Please your kind investigation about this strange phenomenon.

Best.

[GTK+ GUI] Some usability limitations

#Steps to reproduce:

  1. open dnfdragora (the Gtk+ GUI)
  2. use it

Please also have a look at timlau/yumex-dnf#74

package metadata widget

I don't know how it is called, but this is the YGtkRichText which shows package name, description, URL, dependencies (on click), file list (on click)

  • the package metadata widget cannot be resized to be larger and it does not auto-size to a reasonable size to make it easy to read. Users should be able to resize it
  • this text view flickers when clicking any link.
  • when expanding a section (such as "Requirements" or "File list"), it is unclear where the content of that section ends. Yumex-dnf had separate buttons for that reason. If you want to keep the text displayed in one text view, please add a frame or border and a hint that this is a section which can be collapsed and uncollapsed (such as a GtkFrame)

the left side YGtkTreeView

This is the widget containing the Item "All" by default and e.g. "Search results" after a search.

  • It is too wide by default, wasting much screen space. It should be auto-sizing and manually resizable.

the filter GtkComboBoxes

The widgets for selecting "All" or "Group", architecture, name:
When one of these comboboxes changes, it will immediately trigger a new search. This disturbes the user workflow since it blocks all UI.

Two possible solutions:

  • If you want to have immediate search, please make it non-blocking (this would be the ideal case). In this case, please get rid of the "Search" button.
  • If immediate search is too hard to do, please do only trigger search when pressing the search button.

the "Search" button

Most GNOME 3 applications use a style where buttons would have either icons or text. The "Search" button should use a different icon ('edit-find' icon name) and be visually connected to the search field and should only show an icon.

Also, this button does expand horizontally, which doesn't look nice.

the "Clear search" button

Gtk+ 3.x provides a GtkEntry which already has a "primary-icon" and "secondary-icon" property for adding a convenient delete button. This does not need extra text but can be shown inside the GtkEntry itself.

Also, this button does expand horizontally, which doesn't look nice.

the search field

If you'd use a GtkSearchEntry, you would get a nice shiny search icon.

the main YGtkTreeView

  • all columns miss a minimum size. Without a minimum size set, one might accidentially make a column so small that it cannot be seen any more, which breaks user experience.
  • columns should be auto-sized by default, so the user does not need to resize columns and there is an effective usage of screen width.
  • some columns should have a fixed size, such as the checkboxes , the "Arch" column and the "Status" column, since their content is known before display.

the "Apply", "Check all" and "Quit" buttons

These buttons expand horizontally, which doesn't look nice.

the windows

One can resize the windows (main window, "Repository Management" window, "User preferences" window) to be so small that it cannot be used any more and can barely seen at all. This is inconvenient. A window should always allocate the size it needs to show all its child widgets. If there is not enough space, think twice about your UI. If the widgets still don't fit the screen, use a GtkScrolledWindow.

Also, windows should not be larger than their content. If you resize the "Repository Management" or "User preferences" windows, they don't show more content.

the "User preferences" window

Putting the options below each other (instead of besides each other) would look nicer.

Installed software versions:

gtk3-3.22.12-2.fc25.x86_64
dnfdragora-1.0.1-5.git20170505.2a3b056.fc25.noarch
libyui-gtk-2.44.9-2.fc25.x86_64

RFE: Improvement to repositories management

Duplicated from Mageia downstream bug filed by @papoteur-mga:

Description of the problem:

A newbie can be lost with a long list of repositories, for example when he want enable tainted repository.

I suggest that the screen to enable/disable repositories can be of two levels, one standard and one advanced.
I suggest that the repositories are displayed according two skill levels, for chosing which will be enabled.
In the standard level, only the specific arch would be displayed, without debuginfo, nor source.
In expert level, all repositories would be displayed.
the display would be a table combined with tabs.

Add Column for Repository on Search Results

Using DNF on the command line to list of install an app will also indicate which repository it's pulling the app from. This would be nice to see in dnfdragora, particularly when the package is available from multiple repositories.

A "Repo." column is also present in Yumex, which dnfdragora will replace, and so I suggest that we should add it in order for dnfdragora to reach feature parity with Yum Extender.

dnfdragora-updater icon not appear at boot till complete update check !

Hi.
I'm on Fedora 26 X64 Cinnamon edition with dnfdragora version 1.0.1
I notice the following:
At booting system, when OS started & launched DE GUI of it, dnfdragora-updater icon not appear in panel till it finished from check for new update !
If no new update available & it is not time to refresh repositories, then it delayed seconds (about 10 sec.) before it appear. But if it is time to check for new update & refresh repositories, then it will delayed till this process is completed. This may last minutes depending on Internet speed. During this period "sudo dnf upgrade --refresh" command from terminal will be blocked till dnfdragora finish it's ongoing job.

I'm not programmer, & I do not know whether this behaviour is normal or bugy. Please if this thread is invalid, close it.

Best.

Crashed after selecting package to install

On Fedora 26.

on_TransactionEvent download
dnfdaemon client error: g-io-error-quark: GDBus.Error:org.freedesktop.DBus.Python.TypeError: Traceback (most recent call last):
File "/usr/lib64/python3.6/site-packages/dbus/service.py", line 707, in _message_cb
retval = candidate_method(self, *args, **keywords)
File "/usr/lib/python3.6/site-packages/dnfdaemon/server/init.py", line 83, in newFunc
rc = func(*args, **kwargs)
File "/usr/share/dnfdaemon/dnfdaemon-system", line 537, in RunTransaction
result = self.run_transaction()
File "/usr/lib/python3.6/site-packages/dnfdaemon/server/init.py", line 555, in run_transaction
self.base.download_packages(to_dnl, self.base.progress)
File "/usr/lib/python3.6/site-packages/dnf/base.py", line 1011, in download_packages
progress.start(len(payloads), est_remote_size, total_drpms=total_drpm)
TypeError: start() got an unexpected keyword argument 'total_drpms'
(36)
<M> [ui] YUILoader.cc:163 deleteUI(): Shutting down UI
Closing dnfdragora
<M> [ew] YExternalWidgets.cc:116 ~YExternalWidgetsTerminator(): Shutting down mga External Widgets
<M> [ew] YMGAWidgetExtensionFactory.cc:49 ~YMGAWidgetFactory(): Factory removed

User experience: Improve search and filter

Note: This issue has been created from #48.

#Steps to reproduce:

  1. open dnfdragora (the Gtk+ GUI)
  2. use it

the filter GtkComboBoxes

The widgets for selecting "All" or "Group", architecture, name:
When one of these comboboxes changes, it will immediately trigger a new search. This disturbes the user workflow since it blocks all UI.

Two possible solutions:

  • If you want to have immediate search, please make it non-blocking (this would be the ideal case). In this case, please get rid of the "Search" button.
  • If immediate search is too hard to do, please do only trigger search when pressing the search button.

Installed software versions:

gtk3-3.22.12-2.fc25.x86_64
dnfdragora-1.0.1-5.git20170505.2a3b056.fc25.noarch
libyui-gtk-2.44.9-2.fc25.x86_64

Add Ctrl+Q option to Quit

Alt+F -> Q works in a pinch, but Ctrl+Q or Ctrl+W as a hotkey for Quit is pretty universal in any app that has a Menu bar. It would be nice to see it implemented in dnfdragora.

RFE: Please support a 'userinstalled' view

Where there is currently All -> Installed I would also like All -> User Installed which would present those packages normally seen under sudo dnf history userinstalled - which are of course those packages explicitly installed by the user.

The goal would be to more easily comb through user installed package leaves in order to remove unwanted packages and their dependencies. I find that it's too difficult to do that from the All -> Installed screen because there are simply too many packages to go through, and there's no good indication of whether you're removing a leaf or a shared dependency.

I regularly use userinstalled information to build a makeshift "world file" (if you're familiar with gentoo) and then remove the lines of packages that I no longer want and use comm to basically show me only the packages that I removed from the list, which I then pass through xargs and then to sudo dnf remove - this way I can go through and quickly remove things I don't need and/or was just testing.

It would be really nice if I could replace doing that with functionality added by dnfdragora in such a way that I can view those packages that I've explicitly installed (mainly the point is to exclude deps) and easily uninstall them with the removal functionality that's already present.

Note: Those listed under userinstalled are not necessarily leaves but usually are, as you could have user-installed a package that then became a dependency, and there could be leaves on the system that weren't installed by the user. But, from experience I find that the userinstalled view is the best for managing what to remove.

Can you add "Update Notification" option, please ?

Hi. I tried dnfdragora from copr repositories on Fedora 24 X64 bit Cinnamon version. I noticed that it have no "Update Notification" option as that existing in Yum extender (DNF).

In Yum extender (DNF) there is "performance" icon. By clicking this icon, a windows will open & contain many tab, one of them called "Update Checker" It give option to activate it or disable it, & give option to determain time interval by minutes at which Yum extender (DNF) check for availability of new updates, like every 60 minutes.

Kindly can you add this feature please ?

Excessive logging

dnfdragora does excessive logging. An example:

$ LC_ALL=C dnfdragora
Skipped exception: <[Errno 2] No such file or directory: './dnfdragora.yaml'> 
<_M_> [ui] YUILoader.cc:50 loadUI(): DISPLAY: ":0"
<_M_> [ui] YUILoader.cc:51 loadUI(): XDG_CURRENT_DESKTOP: "GNOME"
<_M_> [ui] YUILoader.cc:52 loadUI(): YUI_PREFERED_BACKEND: ""
<_M_> [ui] YUILoader.cc:64 loadUI(): Detected a Gtk-based desktop environment.
<_M_> [ui] YUILoader.cc:64 loadUI(): Prefering Gtk-UI if available and no
<_M_> [ui] YUILoader.cc:64 loadUI(): user-selected override is present.
<_M_> [ui] YUILoader.cc:86 loadUI(): User-selected UI-plugin: ""
<_M_> [ui] YPath.cc:49 YPath(): Given filename: libyui-gtk.so.8
<_M_> [ui] YSettings.cc:74 progDir(): progDir: ""
<_M_> [ui] YPath.cc:65 YPath(): Preferring subdir: 
<_M_> [ui] YPath.cc:66 YPath(): Subdir given with filename: 
<_M_> [ui] YPath.cc:67 YPath(): Looking for: libyui-gtk.so.8
<_M_> [ui] YPath.cc:138 lsDir(): Looking in /usr/lib64/yui
<_M_> [ui] YPath.cc:118 YPath(): Found libyui-gtk.so.8 in /usr/lib64/yui
<_M_> [ui] YPath.cc:49 YPath(): Given filename: libyui-ncurses.so.8
<_M_> [ui] YSettings.cc:74 progDir(): progDir: ""
<_M_> [ui] YPath.cc:65 YPath(): Preferring subdir: 
<_M_> [ui] YPath.cc:66 YPath(): Subdir given with filename: 
<_M_> [ui] YPath.cc:67 YPath(): Looking for: libyui-ncurses.so.8
<_M_> [ui] YPath.cc:138 lsDir(): Looking in /usr/lib64/yui
<_M_> [ui] YPath.cc:118 YPath(): Found libyui-ncurses.so.8 in /usr/lib64/yui
<_M_> [ui] YPath.cc:49 YPath(): Given filename: libyui-qt.so.8
<_M_> [ui] YSettings.cc:74 progDir(): progDir: ""
<_M_> [ui] YPath.cc:65 YPath(): Preferring subdir: 
<_M_> [ui] YPath.cc:66 YPath(): Subdir given with filename: 
<_M_> [ui] YPath.cc:67 YPath(): Looking for: libyui-qt.so.8
<_M_> [ui] YPath.cc:138 lsDir(): Looking in /usr/lib64/yui
<_M_> [ui] YPath.cc:118 YPath(): Found libyui-qt.so.8 in /usr/lib64/yui
<_M_> [ui] YUILoader.cc:118 loadUI(): Using UI-plugin: "gtk"
<_M_> [ui] YSettings.cc:179 loadedUI(): Set loadedUI to "gtk"
<_M_> [ui] YSettings.cc:180 loadedUI(): loadedUI is now locked.
<_M_> [ui] YPath.cc:49 YPath(): Given filename: libyui-gtk.so.8
<_M_> [ui] YSettings.cc:74 progDir(): progDir: ""
<_M_> [ui] YPath.cc:65 YPath(): Preferring subdir: 
<_M_> [ui] YPath.cc:66 YPath(): Subdir given with filename: 
<_M_> [ui] YPath.cc:67 YPath(): Looking for: libyui-gtk.so.8
<_M_> [ui] YPath.cc:138 lsDir(): Looking in /usr/lib64/yui
<_M_> [ui] YPath.cc:118 YPath(): Found libyui-gtk.so.8 in /usr/lib64/yui
<_M_> [ui] YUI.cc:76 YUI(): This is libyui 3.3.2
<_M_> [ui] YUI.cc:77 YUI(): Creating UI without threads
<_M_> [gtk] YGUI.cc:48 YGUI(): This is libyui-gtk 2.44.9
<_M_> [gtk] YGUI.cc:166 checkInit(): Style "/usr/share/libyui/theme/current/wizard/style.css"
<_M_> [gtk] YGUI.cc:188 checkInit(): Style "/usr/share/libyui/theme/current/wizard/style.css" not found. Ignoring style
<WRN> [gtk] YGUtils.cc:543 loadPixbuf(): Could not load icon: /usr/share/libyui/theme/icons/32x32/apps/yast.png
<WRN> [gtk] YGUtils.cc:543 loadPixbuf(): Reason: Failed to open file '/usr/share/libyui/theme/icons/32x32/apps/yast.png': No such file or directory
<_M_> [ui] YUI.cc:230 topmostConstructorHasFinished(): Running without threads
<_M_> [ui] YSettings.cc:197 loadedUI(): loadedUI: "gtk"
<_M_> [ui] YPath.cc:49 YPath(): Given filename: libyui-mga-gtk.so.8
<_M_> [ui] YSettings.cc:74 progDir(): progDir: ""
<_M_> [ui] YPath.cc:65 YPath(): Preferring subdir: 
<_M_> [ui] YPath.cc:66 YPath(): Subdir given with filename: 
<_M_> [ui] YPath.cc:67 YPath(): Looking for: libyui-mga-gtk.so.8
<_M_> [ui] YPath.cc:138 lsDir(): Looking in /usr/lib64/yui
<_M_> [ui] YPath.cc:118 YPath(): Found libyui-mga-gtk.so.8 in /usr/lib64/yui
<_M_> [ui] YPath.cc:49 YPath(): Given filename: libyui-mga-gtk.so.8
<_M_> [ui] YSettings.cc:74 progDir(): progDir: ""
<_M_> [ui] YPath.cc:65 YPath(): Preferring subdir: 
<_M_> [ui] YPath.cc:66 YPath(): Subdir given with filename: 
<_M_> [ui] YPath.cc:67 YPath(): Looking for: libyui-mga-gtk.so.8
<_M_> [ui] YPath.cc:138 lsDir(): Looking in /usr/lib64/yui
<_M_> [ui] YPath.cc:118 YPath(): Found libyui-mga-gtk.so.8 in /usr/lib64/yui
<_M_> [ew] YExternalWidgets.cc:37 YExternalWidgets(): Creating Libyui External Widgets object
<_M_> [gtk] YMGA_GCBTable.cc:415 YMGA_GCBTable():  Slection mode 2
<_M_> [gtk] YMGA_GCBTable.cc:434 YMGA_GCBTable():  columns 7 tot 7
xkbcommon: ERROR: Key "<LFSH>" added to modifier map for multiple modifiers; Using Lock, ignoring Shift
Start looking for groups
End found 139 groups
not in cache
not in cache
not in cache
xkbcommon: ERROR: Key "<LFSH>" added to modifier map for multiple modifiers; Using Lock, ignoring Shift

(python3:12286): Gtk-WARNING **: Negative content width -2 (allocation 11, extents 6x7) while allocating gadget (node button, owner GtkButton)

(python3:12286): Gtk-WARNING **: Negative content width -11 (allocation 2, extents 6x7) while allocating gadget (node button, owner GtkButton)

(python3:12286): Gtk-WARNING **: Negative content width -12 (allocation 1, extents 6x7) while allocating gadget (node button, owner GtkButton)

(python3:12286): Gtk-WARNING **: Negative content width -9 (allocation 4, extents 6x7) while allocating gadget (node button, owner GtkButton)

(python3:12286): Gtk-WARNING **: Negative content width -2 (allocation 11, extents 6x7) while allocating gadget (node button, owner GtkButton)
Gdk-Message: Window 0x55f1529c44d0 is a temporary window without parent, application will not be able to position it on screen.
Gdk-Message: Window 0x55f1529c44d0 is a temporary window without parent, application will not be able to position it on screen.
<ERR> [Gdk] libyui-gtk:0 (): xdg_popup_configure: assertion 'impl->transient_for' failed
Gdk-Message: Window 0x55f1537bf010 is a temporary window without parent, application will not be able to position it on screen.
Gdk-Message: Window 0x55f1537bf010 is a temporary window without parent, application will not be able to position it on screen.
<ERR> [Gdk] libyui-gtk:0 (): xdg_popup_configure: assertion 'impl->transient_for' failed
<_M_> [gtk] YMGA_GCBTable.cc:415 YMGA_GCBTable():  Slection mode 3
<_M_> [gtk] YMGA_GCBTable.cc:434 YMGA_GCBTable():  columns 2 tot 2
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1

(python3:12286): Gtk-WARNING **: Negative content width -2 (allocation 22, extents 12x12) while allocating gadget (node label, owner GtkLabel)

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width -10 and height 20

(python3:12286): Gtk-WARNING **: Negative content width -23 (allocation 1, extents 12x12) while allocating gadget (node label, owner GtkLabel)

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width -12 and height 20

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width -14 and height 20

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width -18 and height 20

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width -46 and height 20

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width -16 and height 20
Gdk-Message: Window 0x55f1537bf010 is a temporary window without parent, application will not be able to position it on screen.
Gdk-Message: Window 0x55f1537bf010 is a temporary window without parent, application will not be able to position it on screen.
<ERR> [Gdk] libyui-gtk:0 (): xdg_popup_configure: assertion 'impl->transient_for' failed
<_M_> [gtk] YMGA_GCBTable.cc:415 YMGA_GCBTable():  Slection mode 3
<_M_> [gtk] YMGA_GCBTable.cc:434 YMGA_GCBTable():  columns 2 tot 2
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
<_M_> [gtk] YMGA_GCBTable.cc:530 doAddItem():  columns 1
Gdk-Message: Window 0x55f1537deb00 is a temporary window without parent, application will not be able to position it on screen.
Gdk-Message: Window 0x55f1537deb00 is a temporary window without parent, application will not be able to position it on screen.
<ERR> [Gdk] libyui-gtk:0 (): xdg_popup_configure: assertion 'impl->transient_for' failed
<ERR> [Gtk] libyui-gtk:0 (): gtk_box_pack: assertion '_gtk_widget_get_parent (child) == NULL' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width -32 and height 20

(python3:12286): Gtk-WARNING **: Negative content width -23 (allocation 1, extents 12x12) while allocating gadget (node label, owner GtkLabel)

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width -10 and height 20

(python3:12286): Gtk-WARNING **: Negative content height -3 (allocation 1, extents 2x2) while allocating gadget (node checkbutton, owner GtkCheckButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 14) while measuring gadget (node check, owner GtkCheckButton)

(python3:12286): Gtk-WARNING **: Negative content height -2 (allocation 0, extents 1x1) while allocating gadget (node check, owner GtkCheckButton)
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 200 and height -5

(python3:12286): Gtk-WARNING **: Negative content height -3 (allocation 1, extents 2x2) while allocating gadget (node checkbutton, owner GtkCheckButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 14) while measuring gadget (node check, owner GtkCheckButton)

(python3:12286): Gtk-WARNING **: Negative content height -2 (allocation 0, extents 1x1) while allocating gadget (node check, owner GtkCheckButton)
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 271 and height -5

(python3:12286): Gtk-WARNING **: Negative content height -3 (allocation 1, extents 2x2) while allocating gadget (node checkbutton, owner GtkCheckButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 14) while measuring gadget (node check, owner GtkCheckButton)

(python3:12286): Gtk-WARNING **: Negative content height -2 (allocation 0, extents 1x1) while allocating gadget (node check, owner GtkCheckButton)
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 281 and height -5

(python3:12286): Gtk-WARNING **: Negative content height -1 (allocation 1, extents 1x1) while allocating gadget (node spinbutton, owner GtkSpinButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 32) while measuring gadget (node entry, owner GtkSpinButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 16) while measuring gadget (node button, owner GtkSpinButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 16) while measuring gadget (node button, owner GtkSpinButton)
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 377 and height -5

(python3:12286): Gtk-WARNING **: Negative content height -8 (allocation 2, extents 5x5) while allocating gadget (node button, owner GtkButton)

(python3:12286): Gtk-WARNING **: Negative content height -8 (allocation 2, extents 5x5) while allocating gadget (node button, owner GtkButton)
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 491 and height -2

(python3:12286): Gtk-WARNING **: Negative content height -3 (allocation 1, extents 2x2) while allocating gadget (node checkbutton, owner GtkCheckButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 14) while measuring gadget (node check, owner GtkCheckButton)

(python3:12286): Gtk-WARNING **: Negative content height -2 (allocation 0, extents 1x1) while allocating gadget (node check, owner GtkCheckButton)
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 281 and height -5

(python3:12286): Gtk-WARNING **: Negative content height -1 (allocation 1, extents 1x1) while allocating gadget (node spinbutton, owner GtkSpinButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 32) while measuring gadget (node entry, owner GtkSpinButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 16) while measuring gadget (node button, owner GtkSpinButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 16) while measuring gadget (node button, owner GtkSpinButton)
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 377 and height -5

(python3:12286): Gtk-WARNING **: Negative content height -9 (allocation 1, extents 5x5) while allocating gadget (node button, owner GtkButton)
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 336 and height -3

(python3:12286): Gtk-WARNING **: Negative content height -9 (allocation 1, extents 5x5) while allocating gadget (node button, owner GtkButton)
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 336 and height -3
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 491 and height -5

(python3:12286): Gtk-WARNING **: Negative content height -3 (allocation 1, extents 2x2) while allocating gadget (node checkbutton, owner GtkCheckButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 14) while measuring gadget (node check, owner GtkCheckButton)

(python3:12286): Gtk-WARNING **: Negative content height -2 (allocation 0, extents 1x1) while allocating gadget (node check, owner GtkCheckButton)
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 281 and height -5

(python3:12286): Gtk-WARNING **: Negative content height -1 (allocation 1, extents 1x1) while allocating gadget (node spinbutton, owner GtkSpinButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 32) while measuring gadget (node entry, owner GtkSpinButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 16) while measuring gadget (node button, owner GtkSpinButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 16) while measuring gadget (node button, owner GtkSpinButton)
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 377 and height -5
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 678 and height -5

(python3:12286): Gtk-WARNING **: Negative content height -9 (allocation 1, extents 5x5) while allocating gadget (node button, owner GtkButton)
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 336 and height -5

(python3:12286): Gtk-WARNING **: Negative content height -9 (allocation 1, extents 5x5) while allocating gadget (node button, owner GtkButton)
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 336 and height -5
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 491 and height -2

(python3:12286): Gtk-WARNING **: Negative content height -3 (allocation 1, extents 2x2) while allocating gadget (node checkbutton, owner GtkCheckButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 14) while measuring gadget (node check, owner GtkCheckButton)

(python3:12286): Gtk-WARNING **: Negative content height -2 (allocation 0, extents 1x1) while allocating gadget (node check, owner GtkCheckButton)
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 281 and height -5

(python3:12286): Gtk-WARNING **: Negative content height -1 (allocation 1, extents 1x1) while allocating gadget (node spinbutton, owner GtkSpinButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 32) while measuring gadget (node entry, owner GtkSpinButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 16) while measuring gadget (node button, owner GtkSpinButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 16) while measuring gadget (node button, owner GtkSpinButton)
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 377 and height -5

(python3:12286): Gtk-WARNING **: Negative content height -9 (allocation 1, extents 5x5) while allocating gadget (node button, owner GtkButton)
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 336 and height -3

(python3:12286): Gtk-WARNING **: Negative content height -9 (allocation 1, extents 5x5) while allocating gadget (node button, owner GtkButton)
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 336 and height -3

(python3:12286): Gtk-WARNING **: Negative content height -3 (allocation 1, extents 2x2) while allocating gadget (node checkbutton, owner GtkCheckButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 14) while measuring gadget (node check, owner GtkCheckButton)

(python3:12286): Gtk-WARNING **: Negative content height -2 (allocation 0, extents 1x1) while allocating gadget (node check, owner GtkCheckButton)
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 281 and height -2

(python3:12286): Gtk-WARNING **: Negative content height -1 (allocation 1, extents 1x1) while allocating gadget (node spinbutton, owner GtkSpinButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 32) while measuring gadget (node entry, owner GtkSpinButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 16) while measuring gadget (node button, owner GtkSpinButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (0 < 16) while measuring gadget (node button, owner GtkSpinButton)
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 377 and height -2

(python3:12286): Gtk-WARNING **: Negative content height -6 (allocation 4, extents 5x5) while allocating gadget (node button, owner GtkButton)

(python3:12286): Gtk-WARNING **: Negative content height -6 (allocation 4, extents 5x5) while allocating gadget (node button, owner GtkButton)
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 200 and height -1
<ERR> [Gtk] libyui-gtk:0 (): gtk_widget_get_preferred_width_for_height: assertion 'height >= 0' failed

(python3:12286): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width 271 and height -1

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (6 < 14) while measuring gadget (node check, owner GtkCheckButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (8 < 32) while measuring gadget (node entry, owner GtkSpinButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (8 < 16) while measuring gadget (node button, owner GtkSpinButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (8 < 16) while measuring gadget (node button, owner GtkSpinButton)

(python3:12286): Gtk-WARNING **: Negative content height -2 (allocation 8, extents 5x5) while allocating gadget (node button, owner GtkButton)

(python3:12286): Gtk-WARNING **: Negative content height -2 (allocation 8, extents 5x5) while allocating gadget (node button, owner GtkButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (10 < 14) while measuring gadget (node check, owner GtkCheckButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (10 < 14) while measuring gadget (node check, owner GtkCheckButton)

(python3:12286): Gtk-WARNING **: for_size smaller than min-size (23 < 32) while measuring gadget (node entry, owner GtkSpinButton)
<_M_> [ui] YUILoader.cc:163 deleteUI(): Shutting down UI
Closing dnfdragora
<_M_> [ew] YExternalWidgets.cc:116 ~YExternalWidgetsTerminator(): Shutting down mga External Widgets
<_M_> [ew] YMGAWidgetExtensionFactory.cc:49 ~YMGAWidgetFactory(): Factory removed

Those Gtk warnings should not happen. Some of them are a result of issues described in #48

Installed software versions:
gtk3-3.22.12-2.fc25.x86_64
dnfdragora-1.0.1-5.git20170505.2a3b056.fc25.noarch
libyui-gtk-2.44.9-2.fc25.x86_64

Package list not always updating after selecting a group

Using revision bb6edcf and libyui-qt.

After selecting the first group, I have to click into the package list, then back into the group list to wake it up, then it usually works normally. If I don't do that, if I select another group, the package listing does not update (it still has the first list).

[GTK+ GUI] With Adwaita:dark theme, URLs are very hard to read

Steps to reproduce:

  1. switch your Gtk+ theme to Adwaita:dark, e.g. by using gnome-tweak-tool or adding the environment variable GTK_THEME=Adwaita:dark
  2. run dnfdragora (the Gtk+ GUI)
  3. have a look at any package info

What happens:
The theme is hard to read. Links look painful. See this screenshot:
dnfdragora-adwaita-dark

What should happen:
Links should be lighter.

Installed software versions:
gtk3-3.22.12-2.fc25.x86_64
dnfdragora-1.0.1-5.git20170505.2a3b056.fc25.noarch
libyui-gtk-2.44.9-2.fc25.x86_64

Can you make searching bringed about by hit "Enter" key ??

Hi. Currently, after user type a search item(s), she/he need to click on "search" within dnfdragora GUI to activate searching process. It will be very useful & convenient to make it possible to activate searching process by hit (click) the key "enter" of keyboard. This already a feature in yumex-dnf ....

Best.

Can't Close Panel Notification

Using on Korora 25 Xfce
dnfdragora.noarch 1.0.1-5.git20170505.2a3b056.fc25
dnfdragora-gui.noarch 1.0.1-5.git20170505.2a3b056.fc25
After running dnfdragora-updater from the menu an icon appears in the notification area. Right click on that icon gives a few options and all work except the final one "Exit". The icon doesn't disappear and remains active, i.e. the other options continue to work.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.