LINUX.ORG.RU

Сообщения energyclab

 

Qt анимированное вращение

Форум — Development

Собственно необходимо сделать так. Естественно полоска должна крутиться.. Подскажите в какую сторону копать...

 

energyclab
()

ASM OS Определение Дисков, Теория

Форум — Development

Всем доброе утро!

Задача следующая. Есть флешка, на которую записан свой загрузчик и некоторое специфичное ПО. После того, как ПО выполнило все свои действия, оно начинает искать на текущем диске (флешке) все разделы, которые помечены как активные, и, если такой раздел существует, то его MBR грузится в память и туда передается управление. Диск, на котором ищутся активные разделы определяется из регистра dl (который заполнил BIOS). В доках сказано, что 0x00, 0x01 - это floppy А и B, 0x80 и 0x81 - это соответственно 1-й и 2-й хард (Primary и Secondary).

Необходимо сделать так, чтобы мое ПО искало активные разделы не только на диске, указанном в регистре dl но и на всех жестких дисках. Что будет если у меня несколько дисков, какие у них будут номера?

Еще пробовал установить grub (который в свою очередь уже бы загрузил ОС с других дисков) на primary раздел флешки (/dev/sdb3), но у меня не получилось его туда закатить...

energyclab
()

Qt5 анимация и qhboxlayout

Форум — Development

Все привет

Сделал анимацию по свойству size класса QFrame

QPropertyAnimation *animation = new QPropertyAnimation(bufferFrame, "size");
    animation -> setDuration(400);
    animation -> setEasingCurve(QEasingCurve(QEasingCurve::OutCubic));

    if(bufferButton -> arrowType() == Qt::LeftArrow) {
        animation -> setEndValue(QSize(bufferFrame -> minimumWidth(), bufferFrame -> height()));
        bufferButton -> setArrowType(Qt::RightArrow);
    }
    else {
        animation -> setEndValue(QSize(bufferFrame -> maximumWidth(), bufferFrame -> height()));
        bufferButton -> setArrowType(Qt::LeftArrow);
    }
    animation -> start(QAbstractAnimation::DeleteWhenStopped);
Здесь bufferFrame это QFrame, а bufferButton кнопка, по которой запускается анимация. Сам виджет bufferFrame добавляется в менеджер компоновки QHBoxLayout. Анимация работает превосходно, если бы не одно «НО». После завершения анимации, если, например, изменить размер окна программы (любое действие, которое приводит к перерисовке), bufferFrame сбрасывает свое состояние = состоянию до начала анимации. Ясно, что это делает менеджер компоновки. Я пошел дальше, унаследовал QFrame и переопределил метод sizeHint() а так же добавил метод setSizeHint.
class SizeHintFrame : public QFrame {
    public:
        SizeHintFrame(QWidget * = 0);
        virtual ~SizeHintFrame();
        void setSizeHint(QSize);
        void setSizeHint(int, int);

    protected:
        virtual QSize sizeHint();

    private:
        QSize   _sizeHint;
};

SizeHintFrame::SizeHintFrame(QWidget *parent)
    : QFrame(parent) {
    // setSizeHint(QFrame::sizeHint());
}

SizeHintFrame::~SizeHintFrame() {
}

void SizeHintFrame::setSizeHint(QSize s) {
    _sizeHint = s;
}

void SizeHintFrame::setSizeHint(int h, int w) {
    _sizeHint = QSize(h, w);
}

QSize SizeHintFrame::sizeHint() {
    return _sizeHint;
}

и добавил обработку завершения анимации

void MainWindow::bufferAnimationFinneshed() {
    bufferFrame -> setSizeHint(bufferFrame -> size());
}

В консоль, по завершении анимации размеры виджета выводятся такие, какие и должны быть до и после анимации. Однако поведение не изменилось, размер виджета все-равно сбрасывается в исходный. P.S. После проделанного пробовал выставлять политику размера в QSizePolicy::Fixed, но это не помогло

energyclab
()

Собственная ОС. EFI

Форум — Development

День добрый. Собственно вопрос в сабже. При разработке собственной ОС, сначала ядро было собрано в бинарном формате, чуть позже, сборка переехала на elf формат. Теперь же мне необходимо собрать свое ядро в формате efi. Подскажите технологию, а то в инете не ищется что то по теме ничего...М.Б. уже кто то собирал?

energyclab
()

С++ работа с библиотеками

Форум — Development

Всем привет.

Не могу никак понять, почему не видна функция в динамически подгруженной библиотеке (самописной), которая реализована в самом приложении

module.h:
class A() {
 public:
   static A* get_instance();
 private:
   A();
   static A    *ptr;
}
module.cpp:
A* A::ptr=0;

A* A::get_instance() {
  if(ptr==0) {
     ptr = new A();
  }
  return ptr;
}
A* instance() {
  return A::get_instance();
}

Теперь код библиотеки

#include "..../module.h"

extern "C" A* instance();
A *p = instance();

module.cpp линкуется только в приложение, там создается «одиночка» и ведется с ним работа. Далее в какой то момент времени подключается библиотека. Я хочу чтобы эта библиотека использовала этого же «одиночку». Все прекрасно компилится. Но когда я запускаю программу, то в момент подключения библиотеки выдает следующую ошибку:

./application: symbol lookup error: .../libplugin.so: undefined symbol: instance

P.S. Библиотека собиралась через механизм плагинов Qt. Однако проверял тоже самое штатными средствами ОС, ситуация та же.

energyclab
()

Qt5 Установочник приложения

Форум — Development

Всем привет.

Дано: - descktop приложение для распространения;

Задача: - создать установочный пакет для ОС Windows, Mac и Linux - установочник должен писать начальные настройки приложения (так же как это делает QSettings) - установочник должен распространяться в виде одного файла

Вопрос: Можно ли сие сделать стандартными средствами(ну хотябы большую часть)? Надоело писать скрипты для сборки дистрибутивы под различные платформы... Или мне все же придется писать свой инсталятор?

energyclab
()

Qt, статическая сборка с плагинами

Форум — Development

Всем привет!

Разрабатываю программу, которая должна автоматом обновляться при запуске. Решил делать так: Всем известна возможность в Qt создавать свои собственные плагины, чтобы потом их на лету подгружать. Хочу поместить всю логику приложения в такие плагины, а загружать их на стадии выполнения программы. Другими словами: UpdateManager выполняет функции проверки обновлений, скачивания плагинов и их запуск (плагины естественно графические, UpdateManager - нет). В документации Qt сказано что нельзя делать плагины на Qt используя статическую сборку Qt, а мне надо, чтобы либы(как системные так и Qt-шные), которые используют мои плагины, были статически слинкованы с самим плагином, но при этом эти плагины были бы динамически подгружаемыми библиотеками. Сам UpdateManager тоже должен быть одним неделимым файлом. В итоге хочу получить бинарник UpdateManager и библиотеки, которые он может подключить. Никаких зависимостей в релиз не хотелось бы формировать. Использую Qt5.2, релиз должен быть сделан на Linux, Win, Mac. И хотелось бы, чтобы меньше проблем, кто что посоветует или скажет...

energyclab
()

GCC и Макрос

Форум — Development

Все привет. Вообщем нужно следующее

Makefile

...
CFLAGS = ... -DARCH=intel
...

file.c

#define basef(p1, p2) p1##_p2
#define f1 basef(ARCH, f1)
#define f2 basef(ARCH, f2)
#define f3 basef(ARCH, f3)


void intel_f1() {
...
}
void intel_f2() {
...
}
void intel_f3() {
...
}

...
void init() {
   f1();
   f2();
   f3();

но что то у меня никак не получается сделать задуманное...Вместо подстановки intel_f1 я получаю ARCH_f1 и соответственно undefined reference to `ARCH_f1'

Кто что скажет

energyclab
()

Ассемблерные вставки

Форум — Development

Уважаемые знатоки, подскажите пожалуйста, в чем ошибка: Есть у меня две функции для чтения и записи секторов диска (IDE)

void ide_read_rep( IDE_Dev *dev, ui16 reg, ui16 count, ui16 *buf ) {
    // portio_inw_rep( ide_get_port( dev, reg ), count, buf );
    for(ui32 i = 0; i < count; ++i) {
        buf[i] = portio_inw(ide_get_port( dev, reg ));
    }
}

// Функция записи в порт с повторами
void ide_write_rep( IDE_Dev *dev, ui16 reg, ui16 count, ui16 *buf ) {
    // portio_outw_rep( ide_get_port( dev, reg ), count, buf );
    for(ui32 i = 0; i < count; ++i) {
        portio_outw(ide_get_port( dev, reg ), buf[i]);
    }
}
и есть функции работы с портами
// Чтение слова из порта
ui16 portio_inw( ui16 port ) {
    ui16 ret = 0;

    __asm __volatile__ ( "inw %%dx, %%ax\n\t" : "=a" ( ret ) : "d" ( port ) );

    return ret;
}

// Запись слова в порт
void portio_outw( ui16 port, ui16 value ) {
    __asm __volatile__( "outw %%ax, %%dx\n\t" : : "a"( value ), "d" ( port ) );
}

// Чтение слова из порта с повторами
void portio_inw_rep( ui16 port, ui32 count, ui16 *buf ) {
    __asm __volatile__ ( "rep insw\n\t" : "=D" ( buf ) : "d" ( port ), "c" (count) );
}

// Запись слова в порт с повторами
void portio_outw_rep( ui16 port, ui32 count, ui16 *buf ) {
    __asm __volatile__( " rep outsw\n\t" : : "S"( buf ), "d" ( port ), "c" (count) );
}

Так вот, если в функциях чтения и записи воспользоваться функциями чтения с повторениями (portio_inw_rep, portio_outw_rep - эти функции закомментированы) вместо циклов for, то передаваемые буферы не заполняются (в случае чтения) / не записываются (в случае записи)... Никак не могу понять в чем дело, подскажите, если кто знает почему... Заранее спасибо

З.Ы. Видимо с ассемблером в С у меня не очень, та же ситуация с чтением msr регистра

ui32    msr_high;
ui32    msr_low;
ui32    msr_offset = 0x0480;

//__asm volatile ( "rdmsr\n\t"
//                 : "=d" (msr_high), "=a" (msr_low)
//                 : "c" (msr_offset) );
__asm volatile ( "rdmsr\n\t"
                 "movl %%edx, %0\n\t"
                 "movl %%eax, %1\n\t"
                 : "=m" (msr_high), "=m" (msr_low)
                 : "c" (msr_offset) );

    printf("%x\n", msr_high);
    printf("%x\n", msr_low);

// На экране нули...

energyclab
()

Собственный менеджер памяти

Форум — Development

Вечер добрый!

Предлагаю провести небольшой мозговой штурм, дело в том, что мне необходимо реализовать для своей «ос» менеджер памяти. В идеале необходим интерфейс аля alloc, free. В моей ос уже реализован механизм виртуальных адресов (по 4кб страница), но я что то не могу определиться с тем, как этот менеджер организовать. Точнее сказать, нужно понять каким способом мне описать свободную «кучу», как из нее доставать свободные страницы, и, самое главное, как привести к минимуму фрагментацию памяти (видимо при освобождении памяти надо еще дефрагментировать «висячие» участки). Может кто подскажет или ткнет носом куда нужно...

Заранее всем спасибо!

energyclab
()

Использование глобальных переменных в С

Форум — Development

Все вечер добрый. Господа всея знающие, помогите пожалуйста разобраться с проблемой: есть код tty.h

#ifndef __TTY_H__
#define __TTY_H__

#include <types.h>

#define VIDEO_WIDTH     80          //ширина экрана
#define VIDEO_HEIGHT    25          //высота экрана
#define VIDEO_SIZE      VIDEO_WIDTH * VIDEO_HEIGHT * 2
#define VIDEO_RAM       0xb8000     //адрес видеопамяти

void init_tty();
extern void set_text_attribute(ui8);
extern void clrscr();
extern void putchar(ui8);
extern void puts(ui8*);

#endif // __TTY_H__

и tty.c
#include <tty.h>

volatile static ui32     cursor;          //положение курсора
volatile static ui8      attribute;       //текущий аттрибут символа

//Инициализация tty
void init_tty() {
    cursor = 0;
    attribute = 3;
}

//Смена текущего аттрибута символа
extern void set_text_attribute(ui8 c) {
    attribute = c;
}

//Очистка экрана
extern void clrscr() {
    ui8      *video = VIDEO_RAM;
    //attribute = 0x35;

    for( ui32 i = 0; i < VIDEO_SIZE; i += 2 ) {
        video[ i ] = attribute;
        video[ i + 1] = ' ';
        // video[ i ] = 0x0f;
        // video[ i + 1] = attribute;
    }
    
    cursor = 0;
}

//Вывод одного символа в режиме телетайпа
extern void putchar(ui8 ch) {
    ui8     *video = VIDEO_RAM;
    ui32    i;

    switch( ch ) {
        case '\n': //Если это символ новой строки
            cursor += VIDEO_WIDTH;
            cursor -= cursor % VIDEO_WIDTH;
            break;

        default:
            video[ cursor * 2 + 1 ] = ch;
            cursor += 1;
            break;
    }

    //Если курсор вышел за границу экрана, сдвинем экран вверх на одну строку
    if( cursor > VIDEO_WIDTH * VIDEO_HEIGHT ) {
        for( i = VIDEO_WIDTH * 2; i <= VIDEO_WIDTH * VIDEO_HEIGHT * 2 + VIDEO_WIDTH * 2; i++ ) {
            *( video + i - VIDEO_WIDTH * 2 ) = *( video + i );
        }
        cursor-=VIDEO_WIDTH;
    }
}

//Вывод строки, заканчивающейся нуль-символом
extern void puts(ui8 *s) {
    init_tty();
    while(*s) {
        putchar(*s);
        s++;
    }
}

Обе глобальные переменные (cursor и attribute) ну никак не хотят менять свои значения, в коде функции clrscr (закоментил) производил проверку присвоения значения переменной, но на экран все равно попадает '\0'

компилю с такими флагами:

-O0 -fomit-frame-pointer -ffreestanding -finline-functions -nostdinc -fno-builtin -nostdlib -std=c99
через gcc-4.8 (пробовал 4.6 и 4.4)

з. ы. Ах да, как вы уже наверное догадались, все это делается в программе, запущенной из-под самописного загрузчика, тестирую на vmware

energyclab
()

VmWare Workstation 10, com порт и putty

Форум — Admin

Привет всем. Никак не получается подключить putty к машине, запущенной на vmware через com порт. Делаю следующее: В настройках виртуальной машины добавил serial port, указал named pipe «/tmp/mypipe» from «Server» to «An Applcation». Запускаю виртуалку, pipe создается, пытаюсь подключиться к нему через putty с настройками serial, /tmp/mypipe, 115200, а она мне зараза «Unable to open connection to /tmp/mypipe:» и «Unable to open serial port».

не могу понять, в чем дело... Может кто решал эту проблему...

PS. Виртуалку запускаю, дожидаюсь, когда высветится меню загрузчика, и пробую подключиться через putty. VmWare Workstation 10 Заранее спасибо

energyclab
()

logrotate + dateext. Дата в имени файлы на 1 день больше чем данные в файле

Форум — Admin

Все привет. Собственно проблема представлена в сабже. Есть логи, которые содержат данные в формате дата

уровеь отладки ... сообщение
Когда происходит ротация файла, то
ls -l

-rw------- 1 root root 15968185 Oct 30 22:47 universe.log-20131031

tail universe.log-20131031

2013-10-30 22:47:14,768    INFO     ...
2013-10-30 22:47:14,769    INFO     ...
2013-10-30 22:47:14,769    INFO     ...
2013-10-30 22:47:14,769    INFO     ...
2013-10-30 22:47:14,769    INFO     ...

Дата в имени файла на один день больше, видимо из-за того, что ротируется после 00.00 часов Подскажите пожалуйста как избавиться от проблемы и дату сделать правильной

energyclab
()

Смена иконки в панели пуск setWindowIcon

Форум — Development

Господа, всем добрый день. Сразу прошу прощение за вопрос по винде, считаю, что это больше кутешный вопрос. Проблема: Для установки иконки приложения использую setWindowIcon (иконка берется из ресурсов) в процессе работы программы, в зависимости от количества новых событий, перерисовываю иконку использую painter (На иконке рисуется красный круг и цифра с числом новых сообщений). В трее все норм, в заголовке окна и при нажатии alt+tab (в иконке) тоже все норм, иконка постоянно меняется, а вот в панели ПУСК иконка меняться упорно не хочет, та, что в первый раз была установлена, больше не меняется. Неообходимо, чтобы было аля skype (цифра на желтом фоне - число новых сообщений)

...
icon = self.createIcon(status, unanswered_messages, Qt.Qt.AlignCenter)
self.tray.setIcon(icon)
icon = self.createIcon(':/general/app_icon', unanswered_messages, Qt.Qt.AlignCenter)
self.setWindowIcon(icon)

def createIcon(self, base, text='', textAlign=Qt.Qt.AlignCenter):
        pixmap = Qt.QPixmap(base)
        image = pixmap.toImage()
        painter = Qt.QPainter();
        painter.begin(image)

        bgrect = Qt.QRect(image.rect())
        if base == ':/general/app_icon':
            bgrect.setRect(bgrect.x() + 20, bgrect.y() + 20, bgrect.width() - 25, bgrect.height() - 20)
        else:
            bgrect.setRect(bgrect.x() + 2, bgrect.y() + 2, bgrect.width() - 5, bgrect.height() - 5)
        painter.setBrush( Qt.QBrush(Qt.Qt.red) )
        painter.drawEllipse(bgrect)

        if base == ':/general/app_icon':
            font = painter.font()
            font.setPixelSize(14)
            font.setBold(True)
            painter.setFont(font)
            painter.drawText(Qt.QRect(bgrect), textAlign, str(text))
        else:
            painter.drawText(image.rect(), textAlign, str(text))
        painter.end()
        return Qt.QIcon(Qt.QPixmap.fromImage(image))

 

energyclab
()

rsyslog и logrotate

Форум — Admin

Господа знатоки, всем доброе утро. Подскажите пожалуйста, в чем может быть проблема?В системе запущены три программы, которые ведут логирование через rsyslog. вот конфиги:

/etc/rsyslog.conf
...
############################
# Portal`s logging configs #
############################
$IncludeConfig /opt/comagic/cfg/comagic_rsyslog.cfg
$IncludeConfig /opt/upuis/cfg/uis_rsyslog.cfg
$IncludeConfig /opt/novomagic/cfg/novomagic_rsyslog.cfg

и соответственно конфиги проектов:

/opt/novomagic/cfg/novomagic_rsyslog.cfg 

# Устанавливает права доступа, владельца и группу по умолчанию для лог-файлов.
$FileOwner root
$FileGroup root
$FileCreateMode 0666
$DirCreateMode 0775

# Шаблоны для логирования
$template log_file_novomagic,"%$now% %timereported:8:15%,%timereported:1:3:date-subseconds%%msg:0:17%%msg:18:58%%msg:59:70%%msg:71:111%%msg:112:$%\n"

# Правила логирования
!novomagic
local6.* /opt/novomagic/log/universe.log;log_file_novomagic

/opt/comagic/cfg/comagic_rsyslog.cfg 
# Устанавливает права доступа, владельца и группу по умолчанию для лог-файлов.
$FileOwner root
$FileGroup root
$FileCreateMode 0666
$DirCreateMode 0775

# Шаблоны для логирования
$template log_file_comagic,"%$now% %timereported:8:15%,%timereported:1:3:date-subseconds%%msg:0:15%%msg:16:56%%msg:57:68%%msg:69:109%%msg:110:$%\n"

# Правила логирования
!comagic
local6.* /opt/comagic/log/universe.log;log_file_comagic
/opt/upuis/cfg/uis_rsyslog.cfg 
# Устанавливает права доступа, владельца и группу по умолчанию для лог-файлов.
$FileOwner root
$FileGroup root
$FileCreateMode 0666
$DirCreateMode 0775

# Шаблоны для логирования
$template log_file_upuis,"%$now% %timereported:8:15%,%timereported:1:3:date-subseconds%%msg:6:13%%msg:14:54%%msg:55:66%%msg:67:107%%msg:108:$%\n"

# Правила логирования
!upuis
local6.* /opt/upuis/log/universe.log;log_file_upuis

А так же настроен logrotate

/etc/logrotate.conf 
# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    minsize 1M
    create 0664 root utmp
    rotate 1
}

# system-specific logs may be also be configured here.

/opt/novomagic/log/universe.log
/opt/upuis/log/universe.log
/opt/comagic/log/universe.log {
    rotate	90
    create
    daily
    missingok
    postrotate
	/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

Проблема в следующем, когда происходит ротация логов (один раз в день) то:

  • Необходимо, чтобы имена ротированных логов были в формате universe.log.YYYY.MM.DD (а не universe.log.YYYYMMDD) - каприз начальства
  • После ротации проект upuis (и только он) начинает писать логи в universe.log.1, потом universe.log.2 и так далее. Такое ощущение, что дескрипторы перепутаны...

PS. Для записи в rsyslog используется SysLogHandler из состава модуля logging (python2.7)

HELP

energyclab
()

Маска для QLineEdit

Форум — Development

Всем привет, друзья на картинке собственно моя проблема. Сверху то, как реализовано сейчас, снизу - как необходимо. Там используется QLineEdit и установлена маска с заполнителем _, мне необходимо, чтобы маска осталась но заполнители были дд.мм.гггг и чч:мм. Кто что скажет по этому поводу

energyclab
()

Разделяемая память в проекте

Форум — Development

Добрый день господа, посоветуйте пожалуйста решение проблемы, а то что то у меня никак не получается

ДАНО: есть класс, который является своего рода средством организации вычислительного процесса, в нем могут выполняться разные сущности - юниты (все наследованы от Unit). Сам класс помимо предоставления средств регистрации, запуска, останова (и т.д.) юнитов еще инициализирует некоторую плату. Соответственно юниты через главный класс работают с различными сервисами платы. Главный класс содержит в себе реализацию паттерна «Одиночка». Так же базовый класс может назначить выполнение юнита в конкретном потоке, а может назначит его работу в своем потоке

Пример:

class A(Unit):
  def init(self):
    self.base = BASE()  

  # работает с сервисом А через self.base

class B(Unit):
  def init(self):
    self.base = BASE()

  # работает с сервисом Б через self.base

...

class BASE(object):
  def __new__(cls, *args, **kwargs):
    if cls.instance is None:
      cls.instance = super(BASE, cls).__new__(cls)
    return cls.instance

  def __init__(self):
    # инициализация платы
    self.plata = self.plata_init() # здесь поднимается плата ...

    # конект к БД
    self.db = self.connect_db()

    ...

Иногда требуется следующее, предположим сервис Б прислал юниту B сообщение, что обновился статус. Такое событие должно быть отправлено на сервер, и, чтобы в потоке юнита сама отправка не выполнялась, передается задание в task_manager (он тоже юнит и тоже одиночка) task_manager изначально порождал отдельный поток и создавал очередь, поток читал из очереди и создавал задания (опять же юниты, которые тоже могут пользоваться self.base из базового класса), однако из-за такой задницы как GIL, такие процедуры жутко тормозят работу базового класса и основных юнитов (таких как А и B). Я хотел было попробовать модуль multiprocessing, и через очередь передавать обработку заданий в дочерний процесс (хоть там GIL не подпортит мне жизнь), но в один момент времени с платой может работать только один процесс - значит надо базовый класс поместить в shared memory, но правильно это сделать у меня не получилось, подскажите советом друзья. Рассмотрю концептуально другие решения, заранее спасибо

 

energyclab
()

(Qt4) иконка в tskbar (windows 7)

Форум — Development

Всем хеллоу. Помогите пожалуйста вывести иконку в таскбаре (не путать с треем) windows 7. Как иконку в трее сделать я знаю, а как ее же отдублировать в таскбар - не в курсе, заранее спасибо

 ,

energyclab
()

Qt4, как узнать когда экран блокируется или появляется скринсейвер

Форум — Development

Собственно вопрос озвучил, добавлю только что нужно кроссплатформенное решение (хотя готов рассмотреть условное выполнение кода), ну а так же программа написана на PyQt4

energyclab
()

Qt, счетчик входящих сообщений в трее

Форум — Development

Всем привет! Значит стоит вопрос в следующем: Есть программа на Qt - аля чат. Неообходимо, чтобы количество новых сообщений отображалось в трее в иконке. Как сделать трей и иконку я знаю, однако не понимаю как мне в существующую иконку втыкнуть число новых месседжей. Кто что знает по этому поводу? Должно быть так же как например в скайпе

energyclab
()

RSS подписка на новые темы