Hello community,

here is the log from the commit of package icecream-monitor for 
openSUSE:Factory checked in at 2019-09-18 13:09:29
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/icecream-monitor (Old)
 and      /work/SRC/openSUSE:Factory/.icecream-monitor.new.7948 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "icecream-monitor"

Wed Sep 18 13:09:29 2019 rev:30 rq:730434 version:3.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/icecream-monitor/icecream-monitor.changes        
2019-04-17 10:10:12.438903797 +0200
+++ 
/work/SRC/openSUSE:Factory/.icecream-monitor.new.7948/icecream-monitor.changes  
    2019-09-18 13:09:31.440714079 +0200
@@ -1,0 +2,14 @@
+Thu Sep 12 14:49:53 UTC 2019 - Lubos Lunak <[email protected]>
+
+- Update to version 3.3:
+ - Display node protocol version and features in detailed host view
+ - Several more icecream flavors added
+ - Add --port option to specify the scheduler port
+ - Remote hardcoded background color (#39)
+ - Fix data loss when switching views
+ - Avoid a possible QSocketNotifier crash (#47)
+ - Improve column widths in views
+ - Require extra-cmake-modules for building
+ - Fix finding icecc pkgconfig file
+
+-------------------------------------------------------------------

Old:
----
  icemon-3.2.0.tar.xz

New:
----
  icemon-3.3.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ icecream-monitor.spec ++++++
--- /var/tmp/diff_new_pack.XR42uk/_old  2019-09-18 13:09:32.836713786 +0200
+++ /var/tmp/diff_new_pack.XR42uk/_new  2019-09-18 13:09:32.876713778 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           icecream-monitor
-Version:        3.2.0
+Version:        3.3
 Release:        0
 Summary:        Monitor Program for the icecream Compile Farm
 License:        GPL-2.0-or-later
@@ -26,6 +26,7 @@
 Source0:        icemon-%{version}.tar.xz
 BuildRequires:  cmake
 BuildRequires:  docbook2x
+BuildRequires:  extra-cmake-modules
 BuildRequires:  hicolor-icon-theme
 BuildRequires:  lzo-devel
 BuildRequires:  pkgconfig

++++++ _service ++++++
--- /var/tmp/diff_new_pack.XR42uk/_old  2019-09-18 13:09:33.188713712 +0200
+++ /var/tmp/diff_new_pack.XR42uk/_new  2019-09-18 13:09:33.228713704 +0200
@@ -1,8 +1,8 @@
 <services>
   <service name="tar_scm" mode="disabled">
-    <param name="versionformat">3.2.0</param>
+    <param name="versionformat">3.3</param>
     <param name="url">http://github.com/icecc/icemon.git</param>
-    <param name="revision">refs/tags/v3.2.0</param>
+    <param name="revision">refs/tags/v3.3</param>
     <param name="scm">git</param>
   </service>
   <service name="recompress" mode="disabled">

++++++ icemon-3.2.0.tar.xz -> icemon-3.3.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/.gitignore new/icemon-3.3/.gitignore
--- old/icemon-3.2.0/.gitignore 1970-01-01 01:00:00.000000000 +0100
+++ new/icemon-3.3/.gitignore   2019-09-11 19:37:46.000000000 +0200
@@ -0,0 +1,87 @@
+# This file is used to ignore files which are generated
+# ----------------------------------------------------------------------------
+
+*~
+*.a
+*.core
+*.moc
+*.o
+*.obj
+*.orig
+*.rej
+*.so
+*_pch.h.cpp
+*_resource.rc
+*.part
+*.qm
+.#*
+*.*#
+core
+!core/
+tags
+.DS_Store
+*.debug
+Makefile*
+*.prl
+*.app
+moc_*.cpp
+ui_*.h
+qrc_*.cpp
+Thumbs.db
+*.user*
+
+# xemacs temporary files
+# ---------------------
+*.flc
+
+# Vim temporary files
+# ---------------------
+.*.swp
+
+# KDevelop
+# ---------------------
+*.kdev4
+.kdev4/
+
+# Visual Studio generated files
+# ---------------------
+*.ib_pdb_index
+*.idb
+*.ilk
+*.pdb
+*.sln
+*.suo
+*.vcproj
+*vcproj.*.*.user
+*.ncb
+
+# MinGW generated files
+# ---------------------
+*.Debug
+*.Release
+
+# Directories to ignore
+# ---------------------
+debug
+lib/*
+lib64/*
+release
+doc/html/*
+doc/html-dev/*
+doc/api/html/*
+doc/pluginhowto/html/*
+.rcc
+.pch
+
+# Binaries
+# --------
+*.dll
+*.exe
+icemon
+
+# From Git merge
+# --------------
+*.BACKUP.*
+*.BASE.*
+*.LOCAL.*
+*.REMOTE.*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/.travis.yml new/icemon-3.3/.travis.yml
--- old/icemon-3.2.0/.travis.yml        2018-12-10 10:04:43.000000000 +0100
+++ new/icemon-3.3/.travis.yml  2019-09-11 19:37:46.000000000 +0200
@@ -1,5 +1,5 @@
 sudo: required
-dist: trusty
+dist: xenial
 
 language: cpp
 
@@ -7,16 +7,32 @@
 - gcc
 - clang
 
-before_install:
-- sudo apt-get update -qq
-- sudo apt-get install -qq cmake qtbase5-dev libicecc-dev
-
 before_script:
+- |
+    git clone --depth=50 --branch=master https://github.com/icecc/icecream.git 
icecream
+    pushd icecream
+    autoreconf -fiv
+    ./configure --prefix=$(pwd)
+    make install -C services -s -j $(getconf _NPROCESSORS_ONLN)
+    popd
+
 - cmake --version
 - qtchooser -run-tool=qmake -qt=qt5 --version
 
 - mkdir build
 - cd build
-- cmake ..
+- PKG_CONFIG_PATH=../icecream/lib/pkgconfig cmake ..
 
 script: make
+
+addons:
+  apt:
+    packages:
+    - cmake
+    - qtbase5-dev
+    - extra-cmake-modules
+    # for icecream
+    - libcap-ng-dev
+    - liblzo2-dev
+    - libzstd1-dev
+    - libarchive-dev
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/CHANGELOG.md new/icemon-3.3/CHANGELOG.md
--- old/icemon-3.2.0/CHANGELOG.md       2018-12-10 10:04:43.000000000 +0100
+++ new/icemon-3.3/CHANGELOG.md 2019-09-11 19:37:46.000000000 +0200
@@ -1,3 +1,20 @@
+## 3.3.0 (2019-09-11)
+
+Features:
+- Display node protocol version and features in detailed host view
+- Several more icecream flavors added
+- Add --port option to specify the scheduler port
+
+Bugfixes:
+- Remote hardcoded background color (#39)
+- Fix data loss when switching views
+- Avoid a possible QSocketNotifier crash (#47)
+- Improve column widths in views
+
+Internal Changes:
+- Require extra-cmake-modules for building
+- Fix finding icecc pkgconfig file
+
 ## 3.2.0 (2018-12-10)
 
 Bugfixes:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/CMakeLists.txt 
new/icemon-3.3/CMakeLists.txt
--- old/icemon-3.2.0/CMakeLists.txt     2018-12-10 10:04:43.000000000 +0100
+++ new/icemon-3.3/CMakeLists.txt       2019-09-11 19:37:46.000000000 +0200
@@ -1,24 +1,20 @@
-project(icemon)
+cmake_minimum_required(VERSION 3.1.0)
+project(icemon VERSION 3.3)
 
-cmake_minimum_required(VERSION 2.8.9)
+find_package(ECM REQUIRED NO_MODULE)
 
-set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} 
${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules)
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} 
${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules ${ECM_MODULE_PATH})
 set(CMAKE_AUTOMOC ON)
 set(CMAKE_INCLUDE_CURRENT_DIR ON)
 
 include(CheckCXXCompilerFlag)
 include(CheckCXXSourceCompiles)
 include(GNUInstallDirs)
-include(KDE4Macros-Icecream)
 include(CheckIncludeFileCXX)
 include(FeatureSummary)
+include(ECMInstallIcons)
 
-# version info
-set(ICEMON_VERSION_MAJOR "3")
-set(ICEMON_VERSION_MINOR "2")
-set(ICEMON_VERSION_PATCH "0")
-set(ICEMON_VERSION 
"${ICEMON_VERSION_MAJOR}.${ICEMON_VERSION_MINOR}.${ICEMON_VERSION_PATCH}")
-set(ICEMON_VERSION_STRING "${ICEMON_VERSION}")
+set(ICEMON_VERSION_STRING "${PROJECT_VERSION}")
 
 if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
   find_package(Git)
@@ -33,7 +29,7 @@
   endif()
 endif()
 
-set(QT_MIN_VERSION "5.2.0")
+set(QT_MIN_VERSION "5.4.0") # Because of QByteArray::fromStdString
 find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED Core Widgets)
 find_package(Icecream)
 set_package_properties(Icecream PROPERTIES
@@ -64,11 +60,11 @@
   )
 endif()
 
-if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR 
CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
+if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR 
CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
 endif()
 
-if(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+if(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
   check_cxx_compiler_flag(-Wunused-but-set-variable HAVE_GCC_UNUSED_BUT_SET)
   check_cxx_compiler_flag(-Wlogical-op HAVE_GCC_LOGICAL_OP)
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated -Wextra 
-Woverloaded-virtual -Winit-self -Wmissing-include-dirs -Wunused 
-Wno-div-by-zero -Wundef -Wpointer-arith -Wcast-qual -Wcast-align 
-Wmissing-noreturn -Werror=return-type -pedantic")
@@ -138,3 +134,9 @@
 add_subdirectory(doc)
 
 feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
+
+set(ARCHIVE_NAME ${CMAKE_PROJECT_NAME}-${PROJECT_VERSION})
+add_custom_target(dist
+    COMMAND git archive --prefix=${ARCHIVE_NAME}/ HEAD
+        | xz -T0 > ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar.xz
+    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/README.md new/icemon-3.3/README.md
--- old/icemon-3.2.0/README.md  2018-12-10 10:04:43.000000000 +0100
+++ new/icemon-3.3/README.md    2019-09-11 19:37:46.000000000 +0200
@@ -18,9 +18,9 @@
 
     $ apt-get install pkg-config libicecc-dev
 
-Finally, make sure you have g++, Qt and cmake installed
+Finally, make sure you have g++, Qt, cmake and ECM installed
 
-    $ apt-get install build-essential qtbase5-dev cmake
+    $ apt-get install build-essential qtbase5-dev cmake extra-cmake-modules
 
 Finally, compile and install the application:
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/cmake/modules/FindIcecream.cmake 
new/icemon-3.3/cmake/modules/FindIcecream.cmake
--- old/icemon-3.2.0/cmake/modules/FindIcecream.cmake   2018-12-10 
10:04:43.000000000 +0100
+++ new/icemon-3.3/cmake/modules/FindIcecream.cmake     2019-09-11 
19:37:46.000000000 +0200
@@ -27,7 +27,7 @@
     # use pkg-config to get the directories and then use these values
     # in the FIND_PATH() and FIND_LIBRARY() calls
     find_package(PkgConfig REQUIRED)
-    pkg_check_modules(PC_ICECC icecc)
+    pkg_check_modules(PC_ICECC icecc>=1.3 REQUIRED)
     # The icecream lib may optionally need linking to -lcap-ng, so dig it out
     # of pkg-config data.
     # Somewhat hackish, but I can't find a simpler way to do this with CMake.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/cmake/modules/KDE4Macros-Icecream.cmake 
new/icemon-3.3/cmake/modules/KDE4Macros-Icecream.cmake
--- old/icemon-3.2.0/cmake/modules/KDE4Macros-Icecream.cmake    2018-12-10 
10:04:43.000000000 +0100
+++ new/icemon-3.3/cmake/modules/KDE4Macros-Icecream.cmake      1970-01-01 
01:00:00.000000000 +0100
@@ -1,136 +0,0 @@
-# for documentation look at FindKDE4Internal.cmake
-
-# this file contains the following macros (or functions):
-# KDE4_UPDATE_ICONCACHE
-# KDE4_INSTALL_ICONS
-
-# Copyright (c) 2006-2009 Alexander Neundorf, <[email protected]>
-# Copyright (c) 2006, 2007, Laurent Montel, <[email protected]>
-# Copyright (c) 2007 Matthias Kretz <[email protected]>
-#
-# Redistribution and use is allowed according to the terms of the BSD license.
-# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
-
-macro (KDE4_UPDATE_ICONCACHE)
-    # Update mtime of hicolor icon theme dir.
-    # We don't always have touch command (e.g. on Windows), so instead create
-    #  and delete a temporary file in the theme dir.
-   install(CODE "
-    set(DESTDIR_VALUE \"\$ENV{DESTDIR}\")
-    if (NOT DESTDIR_VALUE)
-        file(WRITE \"${ICON_INSTALL_DIR}/hicolor/temp.txt\" \"update\")
-        file(REMOVE \"${ICON_INSTALL_DIR}/hicolor/temp.txt\")
-    endif (NOT DESTDIR_VALUE)
-    ")
-endmacro (KDE4_UPDATE_ICONCACHE)
-
-# a "map" of short type names to the directories
-# unknown names should give empty results
-# KDE 3 compatibility
-set(_KDE4_ICON_GROUP_mime       "mimetypes")
-set(_KDE4_ICON_GROUP_filesys    "places")
-set(_KDE4_ICON_GROUP_device     "devices")
-set(_KDE4_ICON_GROUP_app        "apps")
-set(_KDE4_ICON_GROUP_action     "actions")
-# KDE 4 / icon naming specification compatibility
-set(_KDE4_ICON_GROUP_mimetypes  "mimetypes")
-set(_KDE4_ICON_GROUP_places     "places")
-set(_KDE4_ICON_GROUP_devices    "devices")
-set(_KDE4_ICON_GROUP_apps       "apps")
-set(_KDE4_ICON_GROUP_actions    "actions")
-set(_KDE4_ICON_GROUP_categories "categories")
-set(_KDE4_ICON_GROUP_status     "status")
-set(_KDE4_ICON_GROUP_emblems    "emblems")
-set(_KDE4_ICON_GROUP_emotes     "emotes")
-set(_KDE4_ICON_GROUP_animations "animations")
-set(_KDE4_ICON_GROUP_intl       "intl")
-
-# a "map" of short theme names to the theme directory
-set(_KDE4_ICON_THEME_ox "oxygen")
-set(_KDE4_ICON_THEME_cr "crystalsvg")
-set(_KDE4_ICON_THEME_lo "locolor")
-set(_KDE4_ICON_THEME_hi "hicolor")
-
-
-# only used internally by KDE4_INSTALL_ICONS
-macro (_KDE4_ADD_ICON_INSTALL_RULE _install_SCRIPT _install_PATH _group 
_orig_NAME _install_NAME _l10n_SUBDIR)
-
-   # if the string doesn't match the pattern, the result is the full string, 
so all three have the same content
-   if (NOT ${_group} STREQUAL ${_install_NAME} )
-      set(_icon_GROUP  ${_KDE4_ICON_GROUP_${_group}})
-      if(NOT _icon_GROUP)
-         set(_icon_GROUP "actions")
-      endif(NOT _icon_GROUP)
-#      message(STATUS "icon: ${_current_ICON} size: ${_size} group: ${_group} 
name: ${_name} l10n: ${_l10n_SUBDIR}")
-      install(FILES ${_orig_NAME} DESTINATION 
${_install_PATH}/${_icon_GROUP}/${_l10n_SUBDIR}/ RENAME ${_install_NAME} )
-   endif (NOT ${_group} STREQUAL ${_install_NAME} )
-
-endmacro (_KDE4_ADD_ICON_INSTALL_RULE)
-
-
-macro (KDE4_INSTALL_ICONS _defaultpath )
-
-   # the l10n-subdir if language given as second argument (localized icon)
-   set(_lang ${ARGV1})
-   if(_lang)
-      set(_l10n_SUBDIR l10n/${_lang})
-   else(_lang)
-      set(_l10n_SUBDIR ".")
-   endif(_lang)
-
-   # first the png icons
-   file(GLOB _icons *.png)
-   foreach (_current_ICON ${_icons} )
-      # since CMake 2.6 regex matches are stored in special variables 
CMAKE_MATCH_x, if it didn't match, they are empty
-      string(REGEX MATCH "^.*/([a-zA-Z]+)([0-9]+)\\-([a-z]+)\\-(.+\\.png)$" 
_dummy  "${_current_ICON}")
-      set(_type  "${CMAKE_MATCH_1}")
-      set(_size  "${CMAKE_MATCH_2}")
-      set(_group "${CMAKE_MATCH_3}")
-      set(_name  "${CMAKE_MATCH_4}")
-
-      set(_theme_GROUP ${_KDE4_ICON_THEME_${_type}})
-      if( _theme_GROUP)
-         
_KDE4_ADD_ICON_INSTALL_RULE(${CMAKE_CURRENT_BINARY_DIR}/install_icons.cmake
-                    ${_defaultpath}/${_theme_GROUP}/${_size}x${_size}
-                    ${_group} ${_current_ICON} ${_name} ${_l10n_SUBDIR})
-      endif( _theme_GROUP)
-   endforeach (_current_ICON)
-
-   # mng icons
-   file(GLOB _icons *.mng)
-   foreach (_current_ICON ${_icons} )
-      # since CMake 2.6 regex matches are stored in special variables 
CMAKE_MATCH_x, if it didn't match, they are empty
-      string(REGEX MATCH "^.*/([a-zA-Z]+)([0-9]+)\\-([a-z]+)\\-(.+\\.mng)$" 
_dummy  "${_current_ICON}")
-      set(_type  "${CMAKE_MATCH_1}")
-      set(_size  "${CMAKE_MATCH_2}")
-      set(_group "${CMAKE_MATCH_3}")
-      set(_name  "${CMAKE_MATCH_4}")
-
-      set(_theme_GROUP ${_KDE4_ICON_THEME_${_type}})
-      if( _theme_GROUP)
-         
_KDE4_ADD_ICON_INSTALL_RULE(${CMAKE_CURRENT_BINARY_DIR}/install_icons.cmake
-                ${_defaultpath}/${_theme_GROUP}/${_size}x${_size}
-                ${_group} ${_current_ICON} ${_name} ${_l10n_SUBDIR})
-      endif( _theme_GROUP)
-   endforeach (_current_ICON)
-
-   # and now the svg icons
-   file(GLOB _icons *.svgz)
-   foreach (_current_ICON ${_icons} )
-      # since CMake 2.6 regex matches are stored in special variables 
CMAKE_MATCH_x, if it didn't match, they are empty
-      string(REGEX MATCH "^.*/([a-zA-Z]+)sc\\-([a-z]+)\\-(.+\\.svgz)$" _dummy 
"${_current_ICON}")
-      set(_type  "${CMAKE_MATCH_1}")
-      set(_group "${CMAKE_MATCH_2}")
-      set(_name  "${CMAKE_MATCH_3}")
-
-      set(_theme_GROUP ${_KDE4_ICON_THEME_${_type}})
-      if( _theme_GROUP)
-          
_KDE4_ADD_ICON_INSTALL_RULE(${CMAKE_CURRENT_BINARY_DIR}/install_icons.cmake
-                            ${_defaultpath}/${_theme_GROUP}/scalable
-                            ${_group} ${_current_ICON} ${_name} 
${_l10n_SUBDIR})
-      endif( _theme_GROUP)
-   endforeach (_current_ICON)
-
-   kde4_update_iconcache()
-
-endmacro (KDE4_INSTALL_ICONS)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/CMakeLists.txt 
new/icemon-3.3/src/CMakeLists.txt
--- old/icemon-3.2.0/src/CMakeLists.txt 2018-12-10 10:04:43.000000000 +0100
+++ new/icemon-3.3/src/CMakeLists.txt   2019-09-11 19:37:46.000000000 +0200
@@ -21,7 +21,6 @@
   views/hostlistview.cc
   views/joblistview.cc
   views/listview.cc
-  #views/poolview.cc
   views/starview.cc
   views/summaryview.cc
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/fakemonitor.cc 
new/icemon-3.3/src/fakemonitor.cc
--- old/icemon-3.2.0/src/fakemonitor.cc 2018-12-10 10:04:43.000000000 +0100
+++ new/icemon-3.3/src/fakemonitor.cc   2019-09-11 19:37:46.000000000 +0200
@@ -29,6 +29,8 @@
 #include <QTime>
 #include <QTimer>
 
+#include <icecc/comm.h>
+
 namespace {
 // counter variable
 int JOB_ID = 0;
@@ -83,6 +85,8 @@
     info.setOffline(false);
     info.setNoRemote(false);
     info.setPlatform(randomPlatform());
+    info.setProtocol(PROTOCOL_VERSION);
+    info.setFeatures(id % 2 == 0 ? QStringLiteral("env_xz") : 
QStringLiteral("env_zstd"));
     info.setServerLoad(1.0);
     info.setServerSpeed(10);
     hostInfoManager()->checkNode(info);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/hostinfo.cc 
new/icemon-3.3/src/hostinfo.cc
--- old/icemon-3.2.0/src/hostinfo.cc    2018-12-10 10:04:43.000000000 +0100
+++ new/icemon-3.3/src/hostinfo.cc      2019-09-11 19:37:46.000000000 +0200
@@ -39,6 +39,7 @@
     initColor(QStringLiteral("#db1230"), QApplication::tr("strawberry"));
     initColor(QStringLiteral("#a6ea5e"), QApplication::tr("apple"));
     initColor(QStringLiteral("#D6A3D8"), QApplication::tr("bubblegum"));
+
     initColor(QStringLiteral("#f2aa4d"), QApplication::tr("peach"));
     initColor(QStringLiteral("#aa1387"), QApplication::tr("plum"));
     initColor(QStringLiteral("#26c3f7"), QApplication::tr("polar sea"));
@@ -49,14 +50,17 @@
     initColor(QStringLiteral("#1e1407"), QApplication::tr("mocha"));
     initColor(QStringLiteral("#29B450"), QApplication::tr("kiwi"));
     initColor(QStringLiteral("#F8DD31"), QApplication::tr("lemon"));
+
     initColor(QStringLiteral("#fa7e91"), QApplication::tr("raspberry"));
     initColor(QStringLiteral("#c5a243"), QApplication::tr("caramel"));
     initColor(QStringLiteral("#b8bcff"), QApplication::tr("blueberry"));
+    initColor(QStringLiteral("#af3765"), QApplication::tr("blackcurrant"));
+    initColor(QStringLiteral("#f7d36f"), QApplication::tr("passionfruit"));
+    initColor(QStringLiteral("#d51013"), QApplication::tr("pomegranate"));
+    initColor(QStringLiteral("#C2C032"), QApplication::tr("pumpkin"));
+    initColor(QStringLiteral("#f0e8e3"), QApplication::tr("vanilla"));
+    initColor(QStringLiteral("#d8e0e3"), QApplication::tr("stracciatella"));
     // try to make the count a prime number (reminder: 19, 23, 29, 31)
-    // initColor( "#ffb8c0", QApplication::tr("blackcurrant"));
-    // initColor( "#f7d36f", QApplication::tr("passionfruit"));
-    // initColor( "#d51013", QApplication::tr("pomegranate"));
-    // initColor( "#C2C032", QApplication::tr("pumpkin" ) );
 }
 
 void HostInfo::initColor(const QString &value, const QString &name)
@@ -108,6 +112,8 @@
         mColor = createColor(mName);
         mIp = stats[QStringLiteral("IP")];
         mPlatform = stats[QStringLiteral("Platform")];
+        mProtocol = stats[QStringLiteral("Version")].toInt();
+        mFeatures = stats[QStringLiteral("Features")];
     }
 
     mNoRemote = 
(stats[QStringLiteral("NoRemote")].compare(QLatin1String("true"), 
Qt::CaseInsensitive) == 0);
@@ -188,6 +194,12 @@
     }
 
     hostInfo->updateFromStatsMap(stats);
+    if (hostInfo->isOffline()) {
+        mHostMap.remove(hostid);
+        delete hostInfo;
+        hostInfo = nullptr;
+    }
+
     emit hostMapChanged();
 
     return hostInfo;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/hostinfo.h 
new/icemon-3.3/src/hostinfo.h
--- old/icemon-3.2.0/src/hostinfo.h     2018-12-10 10:04:43.000000000 +0100
+++ new/icemon-3.3/src/hostinfo.h       2019-09-11 19:37:46.000000000 +0200
@@ -47,6 +47,9 @@
 
     void setMaxJobs(unsigned int jobs) { mMaxJobs = jobs; }
     unsigned int maxJobs() const { return mMaxJobs; }
+    void incJobs() { mNumJobs++; }
+    void decJobs() { if (mNumJobs) mNumJobs--; }
+    unsigned int numJobs() const { return mNumJobs; }
 
     void setOffline(bool offline) { mOffline = offline; }
     bool isOffline() const { return mOffline; }
@@ -66,6 +69,12 @@
     void setServerLoad(unsigned int load) { mServerLoad = load; }
     unsigned int serverLoad() const { return mServerLoad; }
 
+    void setProtocol(unsigned int protocol) { mProtocol = protocol; }
+    int protocol() const { return mProtocol; }
+
+    void setFeatures(const QString& features) { mFeatures = features; }
+    QString features() const { return mFeatures; }
+
     QString toolTip() const;
 
     bool operator==(const HostInfo &rhs) const { return mId == rhs.mId; }
@@ -89,11 +98,13 @@
     QString mIp;
 
     unsigned int mMaxJobs = 0;
+    unsigned int mNumJobs = 0;
     bool mOffline = false;
     bool mNoRemote = true;
+    int mProtocol = 0;
+    QString mFeatures;
 
     float mServerSpeed = 0.0;
-
     unsigned int mServerLoad = 0;
 
     static QVector<QColor> mColorTable;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/icecreammonitor.cc 
new/icemon-3.3/src/icecreammonitor.cc
--- old/icemon-3.2.0/src/icecreammonitor.cc     2018-12-10 10:04:43.000000000 
+0100
+++ new/icemon-3.3/src/icecreammonitor.cc       2019-09-11 19:37:46.000000000 
+0200
@@ -43,16 +43,6 @@
 
 using namespace std;
 
-namespace {
-
-// TODO: Just use QByteArray static methods when depending on Qt 5.4
-inline QByteArray QBA_fromStdString(const std::string& s)
-{ return QByteArray(s.data(), int(s.size())); }
-inline std::string QBA_toStdString(const QByteArray& s)
-{ return std::string(s.constData(), s.length()); }
-
-}
-
 IcecreamMonitor::IcecreamMonitor(HostInfoManager *manager, QObject *parent)
     : Monitor(manager, parent)
     , m_scheduler(nullptr)
@@ -96,11 +86,18 @@
 void IcecreamMonitor::registerNotify(int fd, QSocketNotifier::Type type, const 
char *slot)
 {
     if (m_fd_notify) {
+        if(m_fd_notify->socket() != fd || m_fd_notify->type() != type) {
+            m_fd_notify->disconnect(this);
+            m_fd_notify->deleteLater();
+            m_fd_notify = nullptr;
+        }
+        // Reuse, but the slot will change.
         m_fd_notify->disconnect(this);
-        m_fd_notify->deleteLater();
     }
-    m_fd_notify = new QSocketNotifier(fd, type, this);
-    m_fd_type = type;
+    if (!m_fd_notify) {
+        m_fd_notify = new QSocketNotifier(fd, type, this);
+        m_fd_type = type;
+    }
     QObject::connect(m_fd_notify, SIGNAL(activated(int)), slot);
 }
 
@@ -112,6 +109,7 @@
 
     const string hostname = currentSchedname().isEmpty() ? "" : 
currentSchedname().data();
     list<string> names;
+    const uint port = currentSchedport();
 
     if (!currentNetname().isEmpty()) {
         names.push_front(currentNetname().data());
@@ -122,13 +120,12 @@
     if (!qgetenv("USE_SCHEDULER").isEmpty()) {
         names.push_front(""); // try $USE_SCHEDULER
     }
-    for (list<string>::const_iterator it = names.begin(); it != names.end();
-         ++it) {
-        setCurrentNetname(QBA_fromStdString(*it));
+    for (auto it = names.begin(); it != names.end(); ++it) {
+        setCurrentNetname(QByteArray::fromStdString(*it));
         if (!m_discover
             || ((m_scheduler = m_discover->try_get_scheduler()) == NULL && 
m_discover->timed_out())) {
             delete m_discover;
-            m_discover = new DiscoverSched(QBA_toStdString(currentNetname()), 
2, hostname);
+            m_discover = new DiscoverSched(currentNetname().toStdString(), 2, 
hostname, port);
         }
 
         if (m_scheduler) {
@@ -288,7 +285,7 @@
 
     HostInfo *hostInfo = hostInfoManager()->checkNode(m->hostid, stats);
 
-    if (hostInfo->isOffline()) {
+    if (!hostInfo) {
         emit nodeRemoved(m->hostid);
     } else {
         emit nodeUpdated(m->hostid);
@@ -308,6 +305,10 @@
         return;
     }
 
+    HostInfo *hostInfo = hostInfoManager()->find(m->hostid);
+    if (hostInfo)
+        hostInfo->incJobs();
+
     (*it).server = m->hostid;
     (*it).startTime = m->stime;
     (*it).state = Job::Compiling;
@@ -328,6 +329,10 @@
         return;
     }
 
+    HostInfo *hostInfo = hostInfoManager()->find((*it).server);
+    if (hostInfo)
+        hostInfo->decJobs();
+
     (*it).exitcode = m->exitcode;
     if (m->exitcode) {
         (*it).state = Job::Failed;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/icemon.qrc 
new/icemon-3.3/src/icemon.qrc
--- old/icemon-3.2.0/src/icemon.qrc     2018-12-10 10:04:43.000000000 +0100
+++ new/icemon-3.3/src/icemon.qrc       2019-09-11 19:37:46.000000000 +0200
@@ -1,10 +1,10 @@
 <RCC>
     <qresource prefix="">
-        <file>images/hi128-app-icemon.png</file>
+        <file>images/128-apps-icemon.png</file>
         <file>images/icemonnode.png</file>
-        <file>images/hi16-app-icemon.png</file>
-        <file>images/hi48-app-icemon.png</file>
-        <file>images/hi22-app-icemon.png</file>
-        <file>images/hi32-app-icemon.png</file>
+        <file>images/16-apps-icemon.png</file>
+        <file>images/48-apps-icemon.png</file>
+        <file>images/22-apps-icemon.png</file>
+        <file>images/32-apps-icemon.png</file>
     </qresource>
 </RCC>
Binary files old/icemon-3.2.0/src/images/128-apps-icemon.png and 
new/icemon-3.3/src/images/128-apps-icemon.png differ
Binary files old/icemon-3.2.0/src/images/16-apps-icemon.png and 
new/icemon-3.3/src/images/16-apps-icemon.png differ
Binary files old/icemon-3.2.0/src/images/22-apps-icemon.png and 
new/icemon-3.3/src/images/22-apps-icemon.png differ
Binary files old/icemon-3.2.0/src/images/32-apps-icemon.png and 
new/icemon-3.3/src/images/32-apps-icemon.png differ
Binary files old/icemon-3.2.0/src/images/48-apps-icemon.png and 
new/icemon-3.3/src/images/48-apps-icemon.png differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/images/CMakeLists.txt 
new/icemon-3.3/src/images/CMakeLists.txt
--- old/icemon-3.2.0/src/images/CMakeLists.txt  2018-12-10 10:04:43.000000000 
+0100
+++ new/icemon-3.3/src/images/CMakeLists.txt    2019-09-11 19:37:46.000000000 
+0200
@@ -1 +1,12 @@
-kde4_install_icons(${ICON_INSTALL_DIR})
+set(icons
+  128-apps-icemon.png
+  16-apps-icemon.png
+  22-apps-icemon.png
+  32-apps-icemon.png
+  48-apps-icemon.png
+)
+ecm_install_icons(
+  ICONS ${icons}
+  DESTINATION ${ICON_INSTALL_DIR}
+  THEME hicolor
+)
Binary files old/icemon-3.2.0/src/images/hi128-app-icemon.png and 
new/icemon-3.3/src/images/hi128-app-icemon.png differ
Binary files old/icemon-3.2.0/src/images/hi16-app-icemon.png and 
new/icemon-3.3/src/images/hi16-app-icemon.png differ
Binary files old/icemon-3.2.0/src/images/hi22-app-icemon.png and 
new/icemon-3.3/src/images/hi22-app-icemon.png differ
Binary files old/icemon-3.2.0/src/images/hi32-app-icemon.png and 
new/icemon-3.3/src/images/hi32-app-icemon.png differ
Binary files old/icemon-3.2.0/src/images/hi48-app-icemon.png and 
new/icemon-3.3/src/images/hi48-app-icemon.png differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/main.cc new/icemon-3.3/src/main.cc
--- old/icemon-3.2.0/src/main.cc        2018-12-10 10:04:43.000000000 +0100
+++ new/icemon-3.3/src/main.cc  2019-09-11 19:37:46.000000000 +0200
@@ -47,6 +47,10 @@
         QCoreApplication::translate("main", "Icecream scheduler hostname"),
         QCoreApplication::translate("main", "hostname", "scheduler hostname"));
     parser.addOption(schednameOption);
+    QCommandLineOption schedportOption(QStringList() << QStringLiteral("p") << 
QStringLiteral("port"),
+        QCoreApplication::translate("main", "Icecream scheduler port"),
+        QCoreApplication::translate("main", "port", "scheduler port"));
+    parser.addOption(schedportOption);
     QCommandLineOption testmodeOption(QStringLiteral("testmode"),
         QCoreApplication::translate("main", "Testing mode."));
     parser.addOption(testmodeOption);
@@ -63,6 +67,10 @@
     if (!schedName.isEmpty()) {
         mainWindow.setCurrentSched(schedName);
     }
+    if (!parser.value(schedportOption).isEmpty())
+    {
+        mainWindow.setCurrentPort(parser.value(schedportOption).toUInt());
+    }
     if (parser.isSet(testmodeOption)) {
         mainWindow.setTestModeEnabled(true);
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/mainwindow.cc 
new/icemon-3.3/src/mainwindow.cc
--- old/icemon-3.2.0/src/mainwindow.cc  2018-12-10 10:04:43.000000000 +0100
+++ new/icemon-3.3/src/mainwindow.cc    2019-09-11 19:37:46.000000000 +0200
@@ -62,11 +62,11 @@
     , m_view(nullptr)
 {
     QIcon appIcon = QIcon();
-    appIcon.addFile(QStringLiteral(":/images/hi128-app-icemon.png"), 
QSize(128, 128));
-    appIcon.addFile(QStringLiteral(":/images/hi48-app-icemon.png"), QSize(48, 
48));
-    appIcon.addFile(QStringLiteral(":/images/hi32-app-icemon.png"), QSize(32, 
32));
-    appIcon.addFile(QStringLiteral(":/images/hi22-app-icemon.png"), QSize(22, 
22));
-    appIcon.addFile(QStringLiteral(":/images/hi16-app-icemon.png"), QSize(16, 
16));
+    appIcon.addFile(QStringLiteral(":/images/128-apps-icemon.png"), QSize(128, 
128));
+    appIcon.addFile(QStringLiteral(":/images/48-apps-icemon.png"), QSize(48, 
48));
+    appIcon.addFile(QStringLiteral(":/images/32-apps-icemon.png"), QSize(32, 
32));
+    appIcon.addFile(QStringLiteral(":/images/22-apps-icemon.png"), QSize(22, 
22));
+    appIcon.addFile(QStringLiteral(":/images/16-apps-icemon.png"), QSize(16, 
16));
     setWindowIcon(appIcon);
     setWindowTitle(QApplication::translate("appName", 
Icemon::Version::appName));
 
@@ -317,7 +317,7 @@
     }
     for (JobList::const_iterator i = m_activeJobs.constBegin(); i != 
m_activeJobs.constEnd(); ++i) {
         const HostInfo *server = hostMap[i.value().server != 0 ? 
i.value().server : i.value().client];
-        if (!server->isOffline() && !server->noRemote()) {
+        if (server && !server->isOffline() && !server->noRemote()) {
             ++perPlatformStats[server->platform()].jobs;
         }
     }
@@ -364,6 +364,11 @@
     m_monitor->setCurrentSchedname(schedname);
 }
 
+void MainWindow::setCurrentPort(uint schedport)
+{
+    m_monitor->setCurrentSchedport(schedport);
+}
+
 void MainWindow::handleViewModeActionTriggered(QAction *action)
 {
     const QString viewId = action->data().toString();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/mainwindow.h 
new/icemon-3.3/src/mainwindow.h
--- old/icemon-3.2.0/src/mainwindow.h   2018-12-10 10:04:43.000000000 +0100
+++ new/icemon-3.3/src/mainwindow.h     2019-09-11 19:37:46.000000000 +0200
@@ -47,6 +47,7 @@
 
     void setCurrentNet(const QByteArray &netname);
     void setCurrentSched(const QByteArray &schedname);
+    void setCurrentPort(uint schedport);
 
     Monitor *monitor() const;
     StatusView *view() const;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/models/hostlistmodel.cc 
new/icemon-3.3/src/models/hostlistmodel.cc
--- old/icemon-3.2.0/src/models/hostlistmodel.cc        2018-12-10 
10:04:43.000000000 +0100
+++ new/icemon-3.3/src/models/hostlistmodel.cc  2019-09-11 19:37:46.000000000 
+0200
@@ -76,6 +76,10 @@
             return tr("IP");
         case ColumnPlatform:
             return tr("Platform");
+        case ColumnProtocol:
+            return tr("Protocol");
+        case ColumnFeatures:
+            return tr("Features");
         case ColumnMaxJobs:
             return tr("Max Jobs");
         case ColumnSpeed:
@@ -114,6 +118,10 @@
             return info.ip();
         case ColumnPlatform:
             return info.platform();
+        case ColumnProtocol:
+            return info.protocol() > 0 ? QString::number(info.protocol()) : 
QStringLiteral("?");
+        case ColumnFeatures:
+            return info.features().isEmpty() ? QStringLiteral( " - " ) : 
info.features();
         case ColumnMaxJobs:
             return info.maxJobs();
         case ColumnSpeed:
@@ -129,6 +137,8 @@
             return Qt::AlignRight;
         case ColumnNoRemote:
             return Qt::AlignCenter;
+        case ColumnProtocol:
+            return Qt::AlignRight;
         case ColumnMaxJobs:
             return Qt::AlignRight;
         case ColumnSpeed:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/models/hostlistmodel.h 
new/icemon-3.3/src/models/hostlistmodel.h
--- old/icemon-3.2.0/src/models/hostlistmodel.h 2018-12-10 10:04:43.000000000 
+0100
+++ new/icemon-3.3/src/models/hostlistmodel.h   2019-09-11 19:37:46.000000000 
+0200
@@ -43,6 +43,8 @@
         ColumnColor,
         ColumnIP,
         ColumnPlatform,
+        ColumnProtocol,
+        ColumnFeatures,
         ColumnMaxJobs,
         ColumnSpeed,
         ColumnLoad,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/monitor.cc 
new/icemon-3.3/src/monitor.cc
--- old/icemon-3.2.0/src/monitor.cc     2018-12-10 10:04:43.000000000 +0100
+++ new/icemon-3.3/src/monitor.cc       2019-09-11 19:37:46.000000000 +0200
@@ -26,6 +26,7 @@
     : QObject(parent)
     , m_hostInfoManager(manager)
     , m_schedulerState(Offline)
+    , m_currentSchedport(0)
 {
 }
 
@@ -49,6 +50,15 @@
     m_currentSchedname = schedname;
 }
 
+uint Monitor::currentSchedport() const
+{
+    return m_currentSchedport;
+}
+void Monitor::setCurrentSchedport(uint port)
+{
+    m_currentSchedport = port;
+}
+
 Monitor::SchedulerState Monitor::schedulerState() const
 {
     return m_schedulerState;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/monitor.h 
new/icemon-3.3/src/monitor.h
--- old/icemon-3.2.0/src/monitor.h      2018-12-10 10:04:43.000000000 +0100
+++ new/icemon-3.3/src/monitor.h        2019-09-11 19:37:46.000000000 +0200
@@ -54,6 +54,9 @@
     QByteArray currentSchedname() const;
     void setCurrentSchedname(const QByteArray &);
 
+    uint currentSchedport() const;
+    void setCurrentSchedport(uint port);
+
     SchedulerState schedulerState() const;
 
     virtual QList<Job> jobHistory() const;
@@ -74,6 +77,7 @@
     HostInfoManager *m_hostInfoManager;
     QByteArray m_currentNetname;
     QByteArray m_currentSchedname;
+    uint m_currentSchedport;
     SchedulerState m_schedulerState;
 };
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/views/flowtableview.cc 
new/icemon-3.3/src/views/flowtableview.cc
--- old/icemon-3.2.0/src/views/flowtableview.cc 2018-12-10 10:04:43.000000000 
+0100
+++ new/icemon-3.3/src/views/flowtableview.cc   2019-09-11 19:37:46.000000000 
+0200
@@ -75,19 +75,22 @@
 
 FlowTableView::FlowTableView(QObject *parent)
     : StatusView(parent)
-    , m_updateTimer(new QTimer)
     , m_widget(new QTableWidget)
+    , m_updateTimer(new QTimer)
 {
     m_widget->setColumnCount(4);
     QStringList labels;
     labels << tr("Host") << tr("File") << tr("History") << tr("State");
     m_widget->setHorizontalHeaderLabels(labels);
     m_widget->horizontalHeader()->setSectionResizeMode(2, 
QHeaderView::Stretch);
+    m_widget->horizontalHeader()->setSectionResizeMode(0, 
QHeaderView::ResizeToContents);
     m_widget->verticalHeader()->hide();
     m_widget->setSelectionMode(QAbstractItemView::NoSelection);
 
     m_updateTimer->setInterval(50);
     m_updateTimer->start();
+
+    createKnownHosts();
 }
 
 void FlowTableView::update(const Job &job)
@@ -126,19 +129,12 @@
 
     // update the host column for the server requesting the job
     QTableWidgetItem *hostNameItem = m_widget->item(serverRow, 0);
-    int usageCount = hostNameItem->data(Qt::UserRole).toInt();
-    if (job.state == Job::LocalOnly || job.state == Job::Compiling) {
-        ++usageCount;
-    } else if (job.state == Job::Finished || job.state == Job::Failed) {
-        --usageCount;
-    }
-
-    hostNameItem->setData(Qt::UserRole, usageCount);
+    HostInfo *hostInfo = hostInfoManager()->find(serverId);
 
     QFont f = m_widget->font();
-    f.setBold(usageCount > 0);
+    f.setBold(hostInfo->numJobs() > 0);
     hostNameItem->setFont(f);
-    hostNameItem->setText(hostInfoText(hostInfoManager()->find(serverId), 
usageCount));
+    hostNameItem->setText(hostInfoText(hostInfo));
 }
 
 QWidget *FlowTableView::widget() const
@@ -146,14 +142,38 @@
     return m_widget.data();
 }
 
-QString FlowTableView::hostInfoText(HostInfo *hostInfo, int runningProcesses) {
-    if (hostInfo->serverSpeed() == 0) { // host disabled
+QString FlowTableView::hostInfoText(HostInfo *hostInfo) {
+    if ((hostInfo->serverSpeed() == 0) && (hostInfo->numJobs() == 0)) { // 
host disabled
         return tr("%1 (Disabled)").arg(hostInfo->name());
     } else {
-        return tr("%1 
(%2/%3)").arg(hostInfo->name()).arg(runningProcesses).arg(hostInfo->maxJobs());
+        return tr("%1 
(%2/%3)").arg(hostInfo->name()).arg(hostInfo->numJobs()).arg(hostInfo->maxJobs());
     }
 }
 
+void FlowTableView::createKnownHosts()
+{
+    if (!hostInfoManager()) {
+        return;
+    }
+
+    m_widget->setRowCount(0);
+    m_idToRowMap.clear();
+
+    const HostInfoManager::HostMap hosts(hostInfoManager()->hostMap());
+
+    foreach(int hostid, hosts.keys()) {
+        checkNode(hostid);
+    }
+}
+
+void FlowTableView::setMonitor(Monitor *monitor)
+{
+    StatusView::setMonitor(monitor);
+
+    if (monitor)
+           createKnownHosts();
+}
+
 void FlowTableView::checkNode(unsigned int hostId)
 {
     if (m_idToRowMap.contains(hostId)) {
@@ -165,8 +185,6 @@
     widgetItem->setIcon(QIcon(QStringLiteral(":/images/icemonnode.png")));
     widgetItem->setToolTip(hostInfo->toolTip());
     widgetItem->setBackgroundColor(hostInfo->color());
-    // usage count
-    widgetItem->setData(Qt::UserRole, 0);
     widgetItem->setFlags(Qt::ItemIsEnabled);
     int insertRow = m_widget->rowCount();
     m_widget->setRowCount(insertRow + 1);
@@ -191,6 +209,7 @@
 
 void FlowTableView::removeNode(unsigned int hostId)
 {
-    m_widget->removeRow(m_idToRowMap.value(hostId));
-    m_idToRowMap.remove(hostId);
+    Q_UNUSED(hostId);
+
+    createKnownHosts();
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/views/flowtableview.h 
new/icemon-3.3/src/views/flowtableview.h
--- old/icemon-3.2.0/src/views/flowtableview.h  2018-12-10 10:04:43.000000000 
+0100
+++ new/icemon-3.3/src/views/flowtableview.h    2019-09-11 19:37:46.000000000 
+0200
@@ -62,6 +62,8 @@
 
     QWidget *widget() const override;
 
+    void setMonitor(Monitor *monitor) override;
+
     void update(const Job &job) override;
     void checkNode(unsigned int hostid) override;
     void removeNode(unsigned int hostid) override;
@@ -76,9 +78,11 @@
 
 private:
     QScopedPointer<QTableWidget> m_widget;
-    QString hostInfoText(HostInfo *hostInfo, int runningProcesses = 0);
+    QString hostInfoText(HostInfo *hostInfo);
     HostIdRowMap m_idToRowMap;
     QTimer *m_updateTimer;
+
+    void createKnownHosts();
 };
 
 #endif // FLOWTABLEVIEW_H
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/views/ganttstatusview.cc 
new/icemon-3.3/src/views/ganttstatusview.cc
--- old/icemon-3.2.0/src/views/ganttstatusview.cc       2018-12-10 
10:04:43.000000000 +0100
+++ new/icemon-3.3/src/views/ganttstatusview.cc 2019-09-11 19:37:46.000000000 
+0200
@@ -40,6 +40,7 @@
 #include <QResizeEvent>
 #include <QPaintEvent>
 #include <QScrollBar>
+#include <QDialogButtonBox>
 
 GanttConfigDialog::GanttConfigDialog(QWidget *parent)
     : QDialog(parent)
@@ -62,9 +63,9 @@
 
     buttonLayout->addStretch(1);
 
-    QPushButton *button = new QPushButton(tr("&Close"), this);
-    buttonLayout->addWidget(button);
-    connect(button, SIGNAL(clicked()), SLOT(hide()));
+    QDialogButtonBox *buttonBox = new 
QDialogButtonBox(QDialogButtonBox::Close, this);
+    buttonLayout->addWidget(buttonBox);
+    connect(buttonBox, SIGNAL(rejected()), SLOT(hide()));
 
     setWindowTitle(tr("Configure Gantt View"));
     // apply some minimum size
@@ -381,6 +382,11 @@
     return m_widget.data();
 }
 
+void GanttStatusView::removeNode(unsigned int hostid)
+{
+       unregisterNode(hostid);
+}
+
 void GanttStatusView::checkNode(unsigned int hostid)
 {
     if (!mRunning) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/views/ganttstatusview.h 
new/icemon-3.3/src/views/ganttstatusview.h
--- old/icemon-3.2.0/src/views/ganttstatusview.h        2018-12-10 
10:04:43.000000000 +0100
+++ new/icemon-3.3/src/views/ganttstatusview.h  2019-09-11 19:37:46.000000000 
+0200
@@ -129,6 +129,7 @@
 
     QString id() const override { return QStringLiteral("gantt"); }
 
+    void removeNode(unsigned int hostid) override;
     void checkNode(unsigned int hostid) override;
 
     void start() override;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/views/hostlistview.cc 
new/icemon-3.3/src/views/hostlistview.cc
--- old/icemon-3.2.0/src/views/hostlistview.cc  2018-12-10 10:04:43.000000000 
+0100
+++ new/icemon-3.3/src/views/hostlistview.cc    2019-09-11 19:37:46.000000000 
+0200
@@ -23,6 +23,8 @@
 
 #include "models/hostlistmodel.h"
 
+#include <QHeaderView>
+
 HostListView::HostListView(QWidget *parent)
     : QTreeView(parent)
 {
@@ -34,9 +36,13 @@
 
 void HostListView::setModel(QAbstractItemModel *model)
 {
+    QTreeView::setModel(model);
     if (model) {
         sortByColumn(HostListModel::ColumnID);
+        header()->setStretchLastSection(false);
+        header()->setSectionResizeMode(HostListModel::ColumnName, 
QHeaderView::Stretch);
+        header()->setSectionResizeMode(HostListModel::ColumnColor, 
QHeaderView::ResizeToContents);
+        header()->setSectionResizeMode(HostListModel::ColumnIP, 
QHeaderView::ResizeToContents);
+        header()->setSectionResizeMode(HostListModel::ColumnPlatform, 
QHeaderView::ResizeToContents);
     }
-
-    QTreeView::setModel(model);
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/views/joblistview.cc 
new/icemon-3.3/src/views/joblistview.cc
--- old/icemon-3.2.0/src/views/joblistview.cc   2018-12-10 10:04:43.000000000 
+0100
+++ new/icemon-3.3/src/views/joblistview.cc     2019-09-11 19:37:46.000000000 
+0200
@@ -44,11 +44,14 @@
 
 void JobListView::setModel(QAbstractItemModel *model)
 {
+    QTreeView::setModel(model);
     if (model) {
         sortByColumn(JobListModel::JobColumnID);
+        header()->setStretchLastSection(false);
+        header()->setSectionResizeMode(JobListModel::JobColumnFilename, 
QHeaderView::Stretch);
+        header()->setSectionResizeMode(JobListModel::JobColumnClient, 
QHeaderView::ResizeToContents);
+        header()->setSectionResizeMode(JobListModel::JobColumnServer, 
QHeaderView::ResizeToContents);
     }
-
-    QTreeView::setModel(model);
 }
 
 bool JobListView::isClientColumnVisible() const
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/views/starview.cc 
new/icemon-3.3/src/views/starview.cc
--- old/icemon-3.2.0/src/views/starview.cc      2018-12-10 10:04:43.000000000 
+0100
+++ new/icemon-3.3/src/views/starview.cc        2019-09-11 19:37:46.000000000 
+0200
@@ -40,6 +40,7 @@
 #include <QResizeEvent>
 #include <QGraphicsScene>
 #include <QGraphicsView>
+#include <QDialogButtonBox>
 
 #include <math.h>
 
@@ -85,14 +86,14 @@
     hline->setFrameShape(QFrame::HLine);
     hline->setFrameShadow(QFrame::Sunken);
     topLayout->addWidget(hline);
-    QPushButton *closeButton = new QPushButton(tr("&Close"));
-    closeButton->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred);
-    topLayout->addWidget(closeButton, 0, Qt::AlignRight);
+
+    QDialogButtonBox *buttonBox = new 
QDialogButtonBox(QDialogButtonBox::Close, this);
+    topLayout->addWidget(buttonBox);
 
     connect(mSuppressDomainName, SIGNAL(toggled(bool)),
             SLOT(slotSuppressDomainName(bool)));
 
-    connect(closeButton, SIGNAL(clicked()), SLOT(accept()));
+    connect(buttonBox, SIGNAL(rejected()), SLOT(accept()));
 }
 
 void StarViewConfigDialog::slotNodesPerRingChanged(int nodes)
@@ -478,23 +479,10 @@
 
     HostItem *hostItem = findHostItem(hostid);
 
-    if (hostItem && hostItem->hostInfo()->isOffline()) {
-        removeItem(hostItem);
-    }
-}
-
-void StarView::forceRemoveNode(unsigned int hostid)
-{
-    HostItem *hostItem = findHostItem(hostid);
-
-    if (hostItem) {
-        removeItem(hostItem);
-    }
-}
+    if (!hostItem)
+           return;
 
-void StarView::removeItem(HostItem *hostItem)
-{
-    m_hostItems.remove(hostItem->hostInfo()->id());
+    m_hostItems.remove(hostid);
 
     QList<unsigned int> obsoleteJobs;
 
@@ -621,7 +609,7 @@
         if (filterArch(*it)) {
             checkNode(it.key());
         } else {
-            forceRemoveNode(it.key());
+            removeNode(it.key());
         }
     }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/views/starview.h 
new/icemon-3.3/src/views/starview.h
--- old/icemon-3.2.0/src/views/starview.h       2018-12-10 10:04:43.000000000 
+0100
+++ new/icemon-3.3/src/views/starview.h 2019-09-11 19:37:46.000000000 +0200
@@ -210,9 +210,6 @@
      */
     bool filterArch(HostInfo *);
 
-    void removeItem(HostItem *);
-    void forceRemoveNode(unsigned int hostid);
-
 protected slots:
     void slotConfigChanged();
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/views/summaryview.cc 
new/icemon-3.3/src/views/summaryview.cc
--- old/icemon-3.2.0/src/views/summaryview.cc   2018-12-10 10:04:43.000000000 
+0100
+++ new/icemon-3.3/src/views/summaryview.cc     2019-09-11 19:37:46.000000000 
+0200
@@ -274,7 +274,6 @@
     , m_widget(new SummaryViewScrollArea)
 {
     m_base = new QWidget;
-    m_base->setStyleSheet(QStringLiteral("QWidget { background-color: 'white'; 
}"));
     m_widget->setWidget(m_base);
 
     m_layout = new QGridLayout(m_base);
@@ -284,6 +283,7 @@
 
     m_widget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
     m_widget->setMinimumHeight(150);
+    createKnownHosts();
 }
 
 SummaryView::~SummaryView()
@@ -297,29 +297,47 @@
 
 void SummaryView::update(const Job &job)
 {
-    if (!job.server) {
+    if (!job.server)
         return;
-    }
 
     SummaryViewItem *i = m_items[job.server];
-    if (!i) {
-        i = new SummaryViewItem(job.server, m_base, this, m_layout);
-        m_items.insert(job.server, i);
-        
m_widget->widget()->setMinimumHeight(m_widget->widget()->sizeHint().height());
+    if (i)
+        i->update(job);
+
+    i= m_items[job.client];
+    if (i)
+       i->updateClient(job);
+}
+
+void SummaryView::createKnownHosts()
+{
+    if (!hostInfoManager()) {
+        return;
     }
-    i->update(job);
 
-    i = m_items[job.client];
-    if (i) {
-      i->updateClient(job);
+    qDeleteAll(m_items);
+    m_items.clear();
+
+    const HostInfoManager::HostMap hosts(hostInfoManager()->hostMap());
+
+    foreach(int hostid, hosts.keys()) {
+        checkNode(hostid);
     }
 }
 
+void SummaryView::setMonitor(Monitor *monitor)
+{
+    StatusView::setMonitor(monitor);
+
+    if (monitor)
+           createKnownHosts();
+}
+
 void SummaryView::checkNode(unsigned int hostid)
 {
     HostInfo *hostInfo = hostInfoManager()->find(hostid);
 
-    if (hostInfo && nameForHost(hostid).isNull()) {
+    if (!hostInfo) {
         delete m_items[hostid];
         m_items.remove(hostid);
     } else if (!m_items[hostid]) {
@@ -328,3 +346,8 @@
        
m_widget->widget()->setMinimumHeight(m_widget->widget()->sizeHint().height());
     }
 }
+void SummaryView::removeNode(unsigned int hostid)
+{
+        delete m_items[hostid];
+        m_items.remove(hostid);
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/icemon-3.2.0/src/views/summaryview.h 
new/icemon-3.3/src/views/summaryview.h
--- old/icemon-3.2.0/src/views/summaryview.h    2018-12-10 10:04:43.000000000 
+0100
+++ new/icemon-3.3/src/views/summaryview.h      2019-09-11 19:37:46.000000000 
+0200
@@ -85,7 +85,10 @@
     ~SummaryView() override;
 
     QWidget *widget() const override;
+
+    void setMonitor(Monitor *monitor) override;
     void update(const Job &job) override;
+    void removeNode(unsigned int hostid) override;
     void checkNode(unsigned int hostid) override;
     QString id() const override { return QStringLiteral("summary"); }
 
@@ -95,6 +98,8 @@
     QMap<unsigned int, SummaryViewItem *> m_items;
     QGridLayout *m_layout;
     QWidget *m_base;
+
+    void createKnownHosts();
 };
 
 #endif


Reply via email to