рдбреЗрд╕реНрдХрдЯреЙрдк рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд░реБрдЭрд╛рдиреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЧреЛрджреА рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЗрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдХрдо рд╕реЗ рдХрдо рддреАрди рд▓реЛрдХрдкреНрд░рд┐рдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ: рдорд╛рдХреЛрд╡рд╕реНрдХреА рдЧреЛрджреА, рд╡рд┐рдВрдбреАрдЬ 7 рд╕реЗ рдЯрд╛рд╕реНрдХрдмрд╛рд░ рдФрд░ рдПрдХрддрд╛ рд╕реЗ рдкреНрд░рдХреНрд╖реЗрдкрдХред 4.8 рдореЗрдВ рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдЖрдЗрдХрди рдХрд╛рд░реНрдп рднреА рдЬреЛрдбрд╝реЗ рдЬрд╛рдПрдВрдЧреЗред
рдПрдХ рд╢рдмреНрдж рдореЗрдВ, рдЗрд╕ рд╕рднреА рд╡рд┐рд╡рд┐рдзрддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдорд┐рд▓реЛ qtdocktile
рд╕рднреА рдбреЙрдХ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╕рднреА рдбреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ:
- рдмреИрдЬ
- рдкреНрд░рдЧрддрд┐ рд╕реВрдЪрдХ
- рдореЗрдиреНрдпреВ
- рд╕рдВрдХреЗрддрди
рдпрд╣ рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмреБрдирд┐рдпрд╛рджреА рд╣реИ рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рд╕рд╛рдд рдореЗрдВ, рдореЗрдХреЛрд╢реА рдореЗрдВ рдФрд░ рдЙрдмрдВрдЯ рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд╣реИред рдпрд╣ рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рд╣реИ рдХрд┐ рдореВрд▓ qtdocktile API рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рдирд┐рд░реНрднрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред
рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд╛рд╕реНрддреБрдХрд▓рд╛
рдЕрдзрд┐рдХрддрдо рд▓рдЪреАрд▓реЗрдкрди рдФрд░ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЙрдХ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рдпрдорд┐рдд рдХреНрдпреВрдЯреА рдкреНрд▓рдЧрдЗрдиреНрд╕ рд╣реЛрдЧрд╛ - рдпрд╣ рдЖрдкрдХреЛ рдкреВрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдирдП рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдПрдХ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рддреЛ рдкреНрд▓рдЧрдЗрди рдмрд╕ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдкреНрд▓рдЧрдЗрдиреНрд╕ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рд┐рдВрдЧрд▓рдЯрди рдкреНрд░рдмрдВрдзрдХ рджреНрд╡рд╛рд░рд╛ рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд▓рдЧрдЗрди рдкреНрд░рдмрдВрдзрдХ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдЗрд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкреНрд░рдмрдВрдзрдХ рдХреЗрд╡рд▓ рдЙрди рдкреНрд▓рдЧрдЗрдиреНрд╕ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рд╕рд░рд▓ QtDockTile рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рд╣реИред рдирддреАрдЬрддрди, рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ QtDockTile рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ - рд╡реЗ рдбреЙрдХ рдХреЛ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
рдбреЙрдХ рдореЗрдиреВ рдХреЗ рд▓рд┐рдП, рд╕рд╛рдорд╛рдиреНрдп Qtshnoe QMenu рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреЗрд╡рд▓ рдЙрди рд╕реАрдорд╛рдУрдВ рдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ рдпрд╣ рдпрд╛ рд╡рд╣ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
рдирдореВрдирд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЙрдкрдпреЛрдЧ
m_tile->setMenu(ui->menu); connect(ui->pushButton, SIGNAL(clicked()), m_tile, SLOT(alert())); connect(ui->lineEdit, SIGNAL(textChanged(QString)), m_tile, SLOT(setBadge(QString))); connect(ui->horizontalSlider, SIGNAL(valueChanged(int)), m_tile, SLOT(setProgress(int)));
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ! рд▓реЗрдХрд┐рди рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрдкреАрдЖрдИ рд▓рд┐рдЦрдирд╛ рдЖрдзреА рдкрд░реЗрд╢рд╛рдиреА рд╣реИ, рдЕрдм рдЖрдкрдХреЛ рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
рдЪреЗрддрд╛рд╡рдиреА! рдЖрдЧреЗ рдХрдИ рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг рд╣реЛрдВрдЧреЗ, рдпрджрд┐ рдЖрдк рдЙрдирдореЗрдВ рд░реБрдЪрд┐ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рддреБрд░рдВрдд рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рдФрд░ рд▓реИрдХреЛрдирд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд┐рдХрд▓рд╛ред рд╕рднреА рдПрдкреАрдЖрдИ рдХрд╛рдлреА рд╕рд░рд▓ рдбрдм рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ:
void UnityLauncher::sendMessage(const QVariantMap &map) { QDBusMessage message = QDBusMessage::createSignal(appUri(), "com.canonical.Unity.LauncherEntry", "Update"); QVariantList args; args << appDesktopUri() << map; message.setArguments(args); if (!QDBusConnection::sessionBus().send(message)) qWarning("Unable to send message"); }
рдЬрд╣рд╛рдВ appUri рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо рд╣реИ, рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдпрд╣ рдХреЗрд╡рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдФрд░ appDesktopUri рдкреНрд░рдкрддреНрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣реИ: //$appUri.desktopред
рдмреИрдЬ рдкрд░ рдорд╛рди рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдирд┐рдореНрди рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
QVariantMap map; map.insert(QLatin1String("count"), count); map.insert(QLatin1String("count-visible"), count > 0); sendMessage(map);
рдЗрд╕реА рддрд░рд╣, рдкреНрд░рдЧрддрд┐ рд╕рдВрдХреЗрддрдХ рдФрд░ рд╕рд┐рдЧреНрдирд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдореЗрдиреВ рдереЛрдбрд╝рд╛ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ: рдЖрдкрдХреЛ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП DBusMenuExporter рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрдм рдЗрд╕реЗ appUri рдФрд░ рдПрдХ рд╕реВрдЪрдХ QMenu рдкрд╛рд╕ рдХрд░рдХреЗ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ рд╕рдм рдПрдкреАрдЖрдИ рд╣реИ, рдЕрдм рд╕реАрдорд╛рдУрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ:
рдПрдХрддрд╛ рд▓рд╛рдВрдЪрд░ рдПрдкреАрдЖрдИ рд╕реАрдорд╛рдПрдБ
- рдмреИрдЬ рдХреЗрд╡рд▓ рдбрд┐рдЬрд┐рдЯрд▓ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ 0. рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдЕрдиреНрдпрдерд╛, 0 рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред
- рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдореЗрдиреВ рдореЗрдВ рд╕рдмрдореЗрдирд╕ рдирд╣реАрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдирд╕реЗ рдмрдЪрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
- рдпрджрд┐ рдореЗрдиреВ рдХреЛ рдПрдкрдореЗрдиреВ рдореЗрдВ рднреА рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЧреЛрджреА рдореЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдЧрд╛
- DBusMenuExporter рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХ рдмрдЧ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдореЗрдиреВ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЧрдИ рд╕реНрдерд┐рддрд┐ рдЙрд▓рдЯреА рд╣реИ
рдареАрдХ рд╣реИ, рдЕрдВрддрд┐рдо: рдПрдкреАрдЖрдИ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ / usr / рд╢реЗрдпрд░ / рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рдЖрдЗрдХрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡реИрд╕реЗ, рдПрдХрддрд╛ рдПрдкреАрдЖрдИ рдЖрдкрдХреЛ рдореЗрдиреВ рдореЗрдВ рд╕реНрдерд╛рдпреА рдЖрдЗрдЯрдо рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХрд╛рдо рддрдм рдХрд░рддрд╛ рд╣реИ рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
X-Ayatana-Desktop-Shortcuts=NewWindow; [NewWindow Shortcut Group] Name=Open a New Window Name[ast]=Abrir una ventana nueva Name[bn]=Abrir una ventana nueva Name[ca]=Obre una finestra nova Name[da]=├Еbn et nyt vindue Name[de]=Ein neues Fenster ├╢ffnen Name[es]=Abrir una ventana nueva Name[fi]=Avaa uusi ikkuna Name[fr]=Ouvrir une nouvelle fen├кtre Name[gl]=Abrir unha nova xanela Name[he]=╫д╫к╫Щ╫Ч╫к ╫Ч╫Ь╫Х╫Я ╫Ч╫У╫й Name[hr]=Otvori novi prozor Name[hu]=├Ъj ablak nyit├бsa Name[it]=Apri una nuova finestra Name[ja]=цЦ░уБЧуБДуВжуВгуГ│уГЙуВжуВТщЦЛуБПName[ku]=Paceyeke n├╗ veke Name[lt]=Atverti nauj─Е lang─Е Name[nl]=Nieuw venster openen Name[ro]=Deschide o fereastr─Г nou─Г Name[ru]= Name[sv]=├Цppna ett nytt f├╢nster Name[ug]=┘К█Р┌н┘Й ┘Г█Ж╪▓┘Ж█Х┘Г ╪ж█Р┌Ж┘Й╪┤ Name[uk]=╤Ц ╤Ц Name[zh_CN]=цЦ░х╗║чкЧхПгName[zh_TW]=щЦЛхХЯцЦ░шжЦчкЧExec=firefox -new-window TargetEnvironment=Unity
рдФрд░ рдПрдХ рдирд╛рд╢реНрддреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ:
рдПрдХрддрд╛:

KDE (рдЪрд┐рд╣реНрди рдХрд╛рд░реНрдп):

рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрддреЗ рд╕рдордп, рдореИрдВрдиреЗ
рдЯреБрдЯрд╡реЗ рдХреЗ рдХрд╛рдо рдХреЛ
рдХреНрдпреВрдЯреАрдЖрдИрдПрдо рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред
рдореИрдХреЛрд╕ рдПрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рднреА рдирд╣реАрдВ рдереАрдВ, рдХреНрдпреВрдЯреА рдХреЛ рдореЗрдиреВ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдпрд╣рд╛рдБ рдмрд╣реБрдд рдХреБрдЫ рдХрд╣рд╛ рдЧрдпрд╛
рд╣реИредрдХреЛрдХреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреИрдЬ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдмрд╕ QString рдХреЛ NSString рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдбреЙрдХ рдкрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВ рдФрд░ рдореЗрдореЛрд░реА рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВред
const char *utf8String = badge.toUtf8().constData(); NSString *cocoaString = [[NSString alloc] initWithUTF8String:utf8String]; [[NSApp dockTile] setBadgeLabel:cocoaString]; [cocoaString release];
рдкреНрд░рдЧрддрд┐ рд╕рдВрдХреЗрддрдХ рдмрдирд╛рдирд╛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛ рдЧрдпрд╛ рд╣реИ: рдбреЙрдХ рдПрдкреАрдЖрдИ рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдбреЙрдХ рдЖрдЗрдХрди рдореЗрдВ рдЖрдкрдХреА рдЫрд╡рд┐ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рд╣реИред рдЬреНрдпрд╛рджрд╛ рдкрд░реЗрд╢рд╛рди рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА QtCreator рд╕реЗ рдЗрдВрдбрд┐рдХреЗрдЯрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ LGPL рд▓рд╛рдЗрд╕реЗрдВрд╕ рдЪреБрдкрдЪрд╛рдк рдореЗрд░реЗ рдХрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рдХреЗ рдЭрдЧрдбрд╝реЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ

рд╡рд┐рдВрдбреЛрдЬ 7 рдЯрд╛рд╕реНрдХрдмрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╕рдмрд╕реЗ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ! рдпрджрд┐ рдЕрдиреНрдп рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рдкреНрд▓рдЧрдЗрдиреНрд╕ рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдЪрд▓реА рдЧрдИ, рддреЛ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдбреЗрд╕реНрдХрдЯреЙрдк рдУрдПрд╕ рдХреЗ рд▓рд┐рдП, рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдмрд╛рджрд▓ рд░рд╣рд┐рдд рдирд╣реАрдВ рдирд┐рдХрд▓рд╛, рдореБрдЭреЗ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдмреБрд░реЗ рд╢рдмреНрджреЛрдВ рдмрд┐рд▓ рдЧреЗрдЯреНрд╕, рд╕реНрдЯреАрд╡ рдмрд╛рд▓реНрдорд░ рдФрд░ рдирд╛рдорд╣реАрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд╕рд╛рде рдпрд╛рдж рд░рдЦрдирд╛ рдкрдбрд╝рд╛, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди рд░реЗрдХ рдХреЛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд░рдЦрд╛! рд▓рд┐рдЦрдиреЗ рдХреЗ рджреМрд░рд╛рди, рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреЛ рдорд░рдирд╛ рдЪрд╛рд╣рд┐рдП, wtf рдФрд░ рдЬреИрд╕реЗ рдХрд┐ рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рд╡рд┐рдВрдбреЛрд╕ рддрдХ рдХрдИ рдмрд╛рд░ рдЙрдарддрд╛ рд╣реИред
Wchar_t * рдХреЗ рдмрдЬрд╛рдп LPCSTR рдЬреИрд╕реЗ рдЕрдЬреАрдм рдЕрдкрдардиреАрдп рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдФрд░ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╣рдВрдЧреЗрд░рд┐рдпрди рд╕рдВрдХреЗрддрди рдФрд░ рдорд╣рд╛рди рдФрд░ рднрдпрд╛рдирдХ COM, рдПрдХ рд╢рдмреНрдж рдореЗрдВ, рдХреЛрдб рд╢реИрд▓реА рдмрд╕ рднрдпрд╛рдирдХ рд╣реИред рдФрд░ рдПрдмреАрдЖрдИ рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рднреА рд╣реИ рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдордПрд╕ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рд╕реА + + рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ minGW рджреНрд╡рд╛рд░рд╛ рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдЦреИрд░, рдПрдкреАрдЖрдИ рдХреБрдЫ рдЕрдЬреАрдм рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдХреБрдЫ рдмреИрд╕рд╛рдЦрд┐рдпреЛрдВ рдореЗрдВ рдЬрд╛рдирд╛ рдкрдбрд╝рд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреВрдж рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдПрдЯреАрдПрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рднреБрдЧрддрд╛рди рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ рдФрд░ рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред
ABI рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
dtf рдФрд░
рдореИрдВрдиреЗ рдЯрд╛рд╕реНрдХрдмрд╛рд░ рдХреА COM рдПрдкреАрдЖрдИ рдкрд░ рдПрдХ рдиреНрдпреВрдирддрдо C рдЖрд╡рд░рдг рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рддрд╛рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕рдВрдХрд▓рдХ рд╕реЗ рдЗрд╕реЗ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХреЗред
рдПрдкреАрдЖрдИ рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рдирд┐рдХрд▓рд╛, рд░реИрдкрд░ рд╕реНрд╡рдпрдВ рдХреНрдпреВрдЯреА рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд╣реАрдВ рд╕реЗ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ winAPI рдХреА рд╢реИрд▓реА рдореЗрдВ рдирд╣реАрдВ рд╣реИред
... EXPORT void setApplicationId(const wchar_t *appId); EXPORT void setOverlayIcon(HWND winId, HICON icon, wchar_t *description = 0); EXPORT void clearOverlayIcon(HWND winId); EXPORT void setProgressValue(HWND winId, int percents); EXPORT void setProgressState(HWND winId, ProgressState state); ...
рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛: рдореИрдВрдиреЗ рдПрдХ рдкреНрд░рдЧрддрд┐ рд╕рдВрдХреЗрддрдХ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЙрдорд░реЗрдб
рдбреАрдЯреАрдПрдл рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рдирд╣реАрдВ рдереАрдВред
// static ITaskbarList3 *windowsTaskBar() { ITaskbarList3 *taskbar; if(S_OK != CoCreateInstance(CLSID_TaskbarList, 0, CLSCTX_INPROC_SERVER, IID_ITaskbarList3, (void**)&taskbar)) return 0; return taskbar; } ... // void setProgressValue(HWND winId, int progress) { ITaskbarList3 *taskbar = windowsTaskBar(); if (!taskbar) return; taskbar->HrInit(); taskbar->SetProgressValue(winId, progress, 100); taskbar->SetProgressState(winId, progress ? TBPF_NORMAL : TBPF_NOPROGRESS); taskbar->Release(); } // void setProgressState(HWND winId, ProgressState state) { TBPFLAG flags; ITaskbarList3 *taskbar = windowsTaskBar(); if (!taskbar) return; taskbar->HrInit(); switch (state) { default: case ProgressStateNone : flags = TBPF_NOPROGRESS; break; case ProgressStateNormal : flags = TBPF_NORMAL; break; case ProgressStatePaused : flags = TBPF_PAUSED; break; case ProgressStateError : flags = TBPF_ERROR; break; case ProgressStateIndeterminate : flags = TBPF_INDETERMINATE; break; } taskbar->SetProgressState(winId, flags); taskbar->Release(); }
рдореИрдВрдиреЗ setOverlayIcon рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреИрдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рдФрд░ рдореИрдВрдиреЗ рдЖрдЗрдХрди рдХреЛ рд╕реНрд╡рдпрдВ рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ HtON рдореЗрдВ Qt рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрджрд▓ рджрд┐рдпрд╛
QPixmap WindowsTaskBar::createBadge(const QString &badge) const { QPixmap pixmap(overlayIconSize()); QRect rect = pixmap.rect(); rect.adjust(1, 1, -1, -1); pixmap.fill(Qt::transparent); QPainter painter(&pixmap); painter.setRenderHint(QPainter::Antialiasing); QPalette palette = window()->palette(); painter.setBrush(palette.toolTipBase()); QPen pen = painter.pen(); pen.setColor(palette.color(QPalette::ToolTipText)); painter.setPen(pen); QString label = QFontMetrics(painter.font()).elidedText(badge, Qt::ElideMiddle, rect.width()); painter.drawRoundedRect(rect, 5, 5); painter.drawText(rect, Qt::AlignCenter | Qt::TextSingleLine, label); return pixmap; }
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХреЗрд╡рд▓ 2 рд╡рд░реНрдг рдмреИрдЬ рдореЗрдВ рдбрд╛рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдХрди рдХрд╛ рдЖрдХрд╛рд░ QStyle :: pixelMetrics рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдУрд╡рд░рд▓реЗрдЖрдИрдХреЙрди рдХреЗ рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд┐рд░реНрдл 16x16 рдЖрдЗрдХрди рдЦреАрдВрдЪрддреЗ рд╣реИрдВ рдФрд░ рдбреАрдкреАрдЖрдИ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдореЙрдирд┐рдЯрд░ рдкрд░ рдЖрдЗрдХрди рдзреБрдВрдзрд▓рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдФрд░ рдЕрдм рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдХреВрдж рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдмреВрдврд╝реЗ рдмрд┐рд▓реА рдиреЗ рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реБрдирд╛, рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реНрдиреЗрд╣ рднрд░реЗ рд╢рдмреНрдж рдЙрд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдП!
рдкрд░реАрдХреНрд╖рдг рд╕рдВрдЦреНрдпрд╛ 1 - рдПрдкреАрдЖрдИ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ QAction рдХреНрд░рдорд╛рдВрдХрди
рдкреНрд░рддреНрдпреЗрдХ рдПрдХреНрд╢рди рдореЗрдВ рдПрдХ рдирд╛рдо, рдПрдХ рдХрдорд╛рдВрдб рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХреНрд╢рди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЗрдХреЛ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЖрдЗрдХрди рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдФрд░ рдПрдХ рд╡рд┐рд╡рд░рдгред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рдм рд╡реНрдпрд╛рдкрдХ рдЪреМрдбрд╝реЗ рддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рдЬреАрд╡рди рд╕рдордп рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИред рдЦреИрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдкрдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдХреЙрд▓рдмреИрдХ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рднреА рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдХреНрдпреВрдПрд╢рди рдкрд░ рдЯреНрд░рд┐рдЧрд░ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рднреА рд╕рд░рд▓ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред
рд╣рдо рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рд░рдгреА рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рд░реИрдкрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ:
struct ActionInfo ; typedef void ;
рдЕрдм рд╢реВрдиреНрдп * рдбреЗрдЯрд╛ рдХреЗ рд░рд╣рд╕реНрдп рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рддреЗ рд╣реИрдВ:
typedef QVector<ActionInfo> ActionInfoList; // ++, typedef QVector<wchar_t> WCharArray; // wchar_t * static WCharArray toWCharArray(const QString &str) { WCharArray array(str.length() + 1); str.toWCharArray(array.data()); return array; } struct Data { Data(QAction *action) : action(action), icon(action->icon()), id(QUuid::createUuid().toByteArray()), name(toWCharArray(action->text())), description(toWCharArray(action->toolTip())), iconPath(toWCharArray(icon.filePath())) { } QWeakPointer<QAction> action; TemporaryIcon icon; QByteArray id; WCharArray name; WCharArray description; WCharArray iconPath; }; void invokeQAction(void *pointer) { Data *data = reinterpret_cast<Data*>(pointer); if (data->action) { qDebug() << data->action.data(); data->action.data()->trigger(); } }
рдпрд╣рд╛рдБ рдЗрд╕ рддрд░рд╣ рдХреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдХреНрд░рдордмрджреНрдз рд╡рд░реНрдгрди рд╣реИред рдореИрдВрдиреЗ рдореИрдиреНрдпреБрдЕрд▓ рдирдИ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА - рд╕рдм рдХреБрдЫ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдРрд╕рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдЬреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдмрд╛рд▓ рдЪрд┐рдХрдиреЗ рдФрд░ рд░реЗрд╢рдореА рд╣реЛрдВрдЧреЗ!
рдЕрдм рдордВрдЪ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХрд┐рди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рддреЛ, рдЬрдВрдк рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ рдХреЛрдИ рд╕рдмрдореЗрдирд╕ рдирд╣реАрдВ рд╣реИрдВ, рдпрд╣рд╛рдВ рдХреЛрдИ рдЕрдХреНрд╖рдо рдФрд░ рдЬрд╛рдВрдЪ рдпреЛрдЧреНрдп рдЖрдЗрдЯрдо рдирд╣реАрдВ рд╣реИрдВ, рдХреБрд▓ рдорджреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 20 рддрдХ рд╕реАрдорд┐рдд рд╣реИред рд▓реЗрдХрд┐рди рд╡рд┐рднрд╛рдЬрдХ рд╣реИрдВ, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рдХрд▓рддрд╛ рд╣реИ:
if (!action->menu() && action->isVisible() && action->isEnabled() && !action->isCheckable()) list.append(serialize(action)); ... ActionInfo JumpListsMenuExporterPrivate::serialize(QAction *action) { Data *data = new Data(action); ActionType type = action->isSeparator() ? ActionTypeSeparator : ActionTypeNormal; ActionInfo info = { data->id.constData(), data->name.data(), data->description.data(), data->iconPath.data(), type, data }; return info; }
рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЖрдЗрдХрди рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдирд╛ рдерд╛, рдХреНрдпреВрдЯреЗрдореЛрдЧреНрд░рд╛рдлреАрдлрд╛рдЗрд▓ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдЕрд▓рдЧ рд╕реЗ рдирд╣реАрдВ рдорд╛рдиреВрдВрдЧрд╛: рд╡рд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ 2 - рдЬрдВрдкрд┐рдВрдЧ рдкреЙрдкрд▓рд┐рд╕реНрдЯ
рдХреВрдж рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╢реБрд░реБрдЖрддреА рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
void JumpListsManager::beginList() { if (m_destList) return; ICustomDestinationList *list; HRESULT res = CoCreateInstance(CLSID_DestinationList, 0, CLSCTX_INPROC_SERVER, IID_ICustomDestinationList, (void**)&list); if (FAILED(res)) { return; } UINT maxSlots; m_destList = list; m_destList->SetAppID(m_appId); m_destList->BeginList(&maxSlots, IID_IObjectArray, (void**)&m_destListContent); m_destListContent->Release(); IObjectArray *objArray; CoCreateInstance(CLSID_EnumerableObjectCollection, 0, CLSCTX_INPROC_SERVER, IID_IObjectArray, (void**)&objArray); objArray->QueryInterface(IID_IObjectCollection, (void**)&m_destListContent); objArray->Release(); }
рдлрд┐рд░ рдЗрд╕ рд╕реВрдЪреА рдХреЛ рднрд░реЗрдВ
void JumpListsManager::addTask(ActionInfo *info) { if (!m_destList) return; IShellLinkW *task; HRESULT res = CoCreateInstance(CLSID_ShellLink, 0, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (void**)&task); if (FAILED(res)) return; task->SetDescription(info->description); task->SetPath(L"rundll32.exe"); task->SetArguments(makeArgs(info).c_str()); if (info->iconPath) task->SetIconLocation(info->iconPath, 0); IPropertyStore *title; PROPVARIANT titlepv; res = task->QueryInterface(IID_IPropertyStore, (void**)&title); if (FAILED(res)) { task->Release(); return; } InitPropVariantFromString(info->name, &titlepv); title->SetValue(PKEY_Title, titlepv); title->Commit(); PropVariantClear(&titlepv); res = m_destListContent->AddObject(task); title->Release(); task->Release(); m_actionInfoMap.insert(std::make_pair(info->id, info)); // : id . } ... void JumpListsManager::addSeparator() { IShellLinkW *separator; IPropertyStore *propStore; PROPVARIANT pv; HRESULT res = CoCreateInstance(CLSID_ShellLink, 0, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (void**)&separator); if (FAILED(res)) return; res = separator->QueryInterface(IID_IPropertyStore, (void**)&propStore); if (FAILED(res)) { separator->Release(); return; } InitPropVariantFromBoolean(TRUE, &pv); propStore->SetValue(PKEY_AppUserModel_IsDestListSeparator, pv); PropVariantClear(&pv); propStore->Commit(); propStore->Release(); res = m_destListContent->AddObject(separator); separator->Release(); }
рдФрд░ рдХрдорд┐рдЯрдореЗрдВрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдУ
void JumpListsManager::commitList() { if (!m_destList) return; m_destList->AddUserTasks(m_destListContent); m_destList->CommitList(); m_destList->Release(); m_destListContent->Release(); m_destList = 0; m_destListContent = 0; }
Verbose, рдХреНрдпрд╛ рдЖрдкрдХреЛ рдирд╣реАрдВ рдорд┐рд▓рд╛? рд▓реЗрдХрд┐рди рдЕрдлрд╕реЛрд╕, рдЖрдкрдХреЛ рдмреБрд▓реЗрдЯ рдХреЛ рдХрд╛рдЯрдиреЗ рдФрд░ рдХреЛрдб рдХреЗ рд╕реИрдХрдбрд╝реЛрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕реНрдХреНрд░рд┐рдмрд▓ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЕрдиреНрдпрдерд╛ рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣рдо рдЕрд╕рд▓реА рдЖрджрдореА рд╣реИрдВ рдФрд░ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рд╕реЗ рдбрд░рддреЗ рдирд╣реАрдВ рд╣реИрдВ? рдФрд░ рдЕрдЧрд░ рд╣рдо рдбрд░рддреЗ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЪрд▓реЛ рдПрдХ рдХреЙрд▓рдмреИрдХ рд▓рд╛рдЧреВ рдХрд░реЗрдВ!
рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ 3 - рдХреЙрд▓рдмреИрдХ рд▓рд╛рдЧреВ рдХрд░рдирд╛
рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ? рдЬрдВрдкрд▓рд┐рд╕реНрдЯ рдореЗрдВ рдПрдХ рдЖрдЗрдЯрдо рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдирд╛ рдХреБрдЫ рдЖрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдХрдорд╛рдВрдб рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреИрд╕реЗ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдПрдХреНрд╢рдирдЗрдиреНрдлреЛ рдвреВрдВрдврдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдХреЙрд▓рдмреИрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?
Dtf рдФрд░
рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕реЛрдЪрд╛ рдФрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ rundll рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдм рдХреБрдЫ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрд╛, рдЬреЛ рджрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред
рдирддреАрдЬрддрди, рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЬрдиреНрдо рд╣реБрдЖ рдЬреЛ рдПрдХ рдПрдХреНрд╢рди рдЖрдИрдбреА рд▓реЗрддрд╛ рд╣реИ, 42042 рдкреЛрд░реНрдЯ рдкрд░ рдПрдХ рд╕реЙрдХреЗрдЯ рдЦреЛрд▓рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдЖрдИрдбреА рдХреЛ рдЗрд╕рдореЗрдВ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрд╕ рд╕реЙрдХреЗрдЯ рдХреЛ рд╕реБрдирддрд╛ рд╣реИ рдФрд░, рдЖрдИрдбреА рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░, рд╢рд╛рдВрддрд┐ рд╕реЗ рдХреЙрд▓рдмреИрдХ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рд╡рд╛рдВрдЫрд┐рдд QAction рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ!
std::wstring JumpListsManager::makeArgs(ActionInfo *info) { std::wstring args = m_wrapperPath; #ifdef _WIN64 args += L",_RundllCallback@28 "; // WARNING: TEST ME! // ptr├Ч3 + int #else args += L",_RundllCallback@16 "; #endif // Convert to a wchar_t* size_t origsize = strlen(info->id) + 1; const size_t newsize = 64; size_t convertedChars = 0; wchar_t buffer[newsize]; mbstowcs_s(&convertedChars, buffer, origsize, info->id, _TRUNCATE); args += buffer; return args; }
рдФрд░ рдЕрдВрддрд┐рдо рд╡рд┐рдзрд┐: рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЬреЛ рд░реИрдВрдбрд▓ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ
EXPORT void CALLBACK RundllCallback(HWND hwnd, HINSTANCE hinst, LPSTR cmdLine, int cmdShow); void CALLBACK RundllCallback(HWND, HINSTANCE, LPSTR cmdLine, int) { WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); SOCKET sk; sk = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sk == INVALID_SOCKET) { WSACleanup(); return; } sockaddr_in sai; sai.sin_family = AF_INET; sai.sin_addr.s_addr = inet_addr("127.0.0.1"); sai.sin_port = htons(Handler::port); if (connect(sk, reinterpret_cast<SOCKADDR*>(&sai), sizeof(sai)) == SOCKET_ERROR) { WSACleanup(); return; } std::string cmd = cmdLine; send(sk, cmd.c_str(), cmd.size(), 0); closesocket(sk); WSACleanup(); }
рдпрд╣ рд╕рдм рд╣реИ, рдЖрдЬ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдХреЛрдб рд╣реИ, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рд╛рдВрд╕ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЪрд▓рд┐рдП рд╕рдВрдХреНрд╖реЗрдк рдХрд░рддреЗ рд╣реИрдВ:
рд╡рд┐рдВрдбреЛрдЬрд╝ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реАрдорд╛рдПрдБ
- рдмреИрдЬ рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдмреИрдЬ
- рд╣рдорд╛рд░реЗ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХреВрдж рд╕реВрдЪрд┐рдпреЛрдВ рд╕реЗ рдЕрдВрддрд┐рдо рдлрд╛рдЗрд▓реЗрдВ рдЦреЛ рдЬрд╛рддреА рд╣реИрдВред
- рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╕реНрд╡рд┐рдЪ рдФрд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХреНрд░рд┐рдпрд╛рдПрдВ
- рд╕рдмрдореЗрдирд╕ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ
рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ:

рдирд┐рд╖реНрдХрд░реНрд╖
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЕрдм рддрдХ, рдпрд╣ рдХреЗрд╡рд▓ рдореВрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рд╣реИрдВред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╣рдо рд╕реЛрдЪреЗрдВрдЧреЗ рдХрд┐ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВред
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдореЗрдиреВ рдХреЛ рдбреЙрдХ рдкрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ, рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
- рдПрдХ рд╕рдмрдореЗрдиреВ рдирд╣реАрдВ рд╣реИ
- Switchable рдпрд╛ рдЕрдХреНрд╖рдо рдЖрдЗрдЯрдо рдирд╣реАрдВ рд╣реИ
- рдХреБрдЫ рдмрд┐рдВрджреБ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП
- рд╕реЗрдЯрдореЗрдиреВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдмрджрд▓рд╛ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА:
- рдбреЙрдХ рдХрд╛ рд╕рд╣реА рдХрд╛рдо рдХреЗрд╡рд▓ рдПрдХ рдЖрд╡реЗрджрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрднрд╡ рд╣реИ, рдХреНрдпреВрдЯреА рд╕рд┐рдВрдЧрд▓ рдПрдкреНрд▓реАрдХреЗрд╢рди рдпрд╛ рдЕрдиреНрдп рд╕рдорд╛рди рд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдбреЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
- рдмреИрдЬ рдореЗрдВ 100 рд╕реЗ рдХрдо рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ
рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдХреБрдЫ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдШрд╛рддрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕реЗ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ!
рдПрдХрддрд╛ рдкреНрд▓рдЧ-рдЗрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП
Torkve рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж, Macos X рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП Windows рдкреНрд▓рдЧ-рдЗрди рдФрд░ QtCreator рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдорджрдж рдХреЗ рд▓рд┐рдП
dtf ред
рд╕реНрд░реЛрдд рдХреЛрдб
github рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рд╕реБрдзрд╛рд░ рдФрд░ рд╕реБрдзрд╛рд░ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рдзрдордХреА
рдХреНрдпрд╛ рдбреЙрдХрдореИрдирдЧрд░ рдПрдкреАрдЖрдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддреИрдпрд╛рд░ рд╣реИ?