ã€ãŸãããã®å€æ§æ§ãã¹ãŠã«å¯Ÿå¿ãããŠãããŒãµã«ã©ã€ãã©ãªãäœæããå¿ èŠããããŸãã
qtdocktileã«äŒã
ãã¹ãŠã®ããã¯ã«å ±é
ãŸãããã¹ãŠã®ããã¯ã«å ±éããæ©èœã®ãªã¹ãã匷調衚瀺ããå¿ èŠããããŸãã
- ãããž
- é²æã€ã³ãžã±ãŒã¿
- ã¡ãã¥ãŒ
- ã¢ã©ãŒã
ãã®æ©èœã¯ãã¹ãŠåºæ¬çãªãã®ã§ããã7ããŸãããubuntã§äœããã®åœ¢ã§ãµããŒããããŠããŸãã ããã«åºã¥ããŠãããŒã¹ã®qtdocktile APIãæ§ç¯ããããã¹ãŠã®ãã©ãããã©ãŒã äŸåã®æ¡åŒµæ©èœãã©ã€ãã©ãªã®éçºæã«è¿œå ãããå¿ èŠãªããªããŸãã
å³æžé€šã®å»ºç¯
æ倧ã®æè»æ§ãšæ¡åŒµæ§ã®ããã«ãç¹å®ã®åããã¯ã®å®è£ ã¯éåžžã®Qtãã©ã°ã€ã³ã§ãããšæ±ºå®ããŸãã-ããã«ãããã©ã€ãã©ãªå šäœãåã³ã³ãã€ã«ããã«æ°ãã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)));
ã芧ã®ãšãããéåžžã«ç°¡åã§ãïŒ ããããåçŽãªAPIã®äœæã¯åé¡ã®ååã§ããããã¹ãŠã®ãã©ãããã©ãŒã ã®ãµããŒããå®è£ ããå¿ èŠããããŸãã
泚æïŒ ããã«ãå€ãã®æè¡çãªè©³çŽ°ããããŸããããããã«èå³ããªãå Žåã¯ãããã«çµè«ãèªãããšãã§ããŸãã
Unityã®ãã©ã°ã€ã³å®è£
å¥åŠãªããšã«ãUnityã®å Žåãæçã§ç°¡æœãªå®è£ ãè¡ãããŸããã ãã¹ãŠã®APIã¯ãéåžžã«åçŽãªdbusã¡ãã»ãŒãžã®éä¿¡ã«åºã¥ããŠããŸãã
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ã¯applicationïŒ//$appUri.desktopãšãããã©ãŒã ã®ãšã³ããªã§ãã
ãããžã®å€ãå€æŽããã«ã¯ã次ã®ã¡ãã»ãŒãžãéä¿¡ããã ãã§ååã§ãã
QVariantMap map; map.insert(QLatin1String("count"), count); map.insert(QLatin1String("count-visible"), count > 0); sendMessage(map);
åæ§ã«ãããã°ã¬ã¹ã€ã³ãžã±ãŒã¿ãŒãšã·ã°ããªã³ã°ã«ã€ããŠããã¡ãã¥ãŒã¯ããå°ãèå³æ·±ããã®ã§ããappUriãšQMenuãžã®ãã€ã³ã¿ãŒãæž¡ãããšã§äœæãããšãã«DBusMenuExporterã¯ã©ã¹ã䜿çšããå¿ èŠããããŸãã ããããã¹ãŠã®APIã§ãã次ã«ãå¶éããªã¹ãããŸãã
Unity Launcher APIã®å¶é
- ãããžã¯ããžã¿ã«ã®ã¿ã§ããã0ãã倧ããã®ã¿ã§ãããã以å€ã®å Žåã0ã衚瀺ãããŸãã
- ãšã¯ã¹ããŒããããã¡ãã¥ãŒã«ã¯ãµãã¡ãã¥ãŒã衚瀺ãããªãããããµãã¡ãã¥ãŒã¯é¿ããã»ããããã§ãããã
- ã¡ãã¥ãŒãappmenuã«ãšã¯ã¹ããŒããããå Žåãããã¯ã«è¡šç€ºãããŸãã
- DBusMenuExporterã®å®è£ ã«ã¯ãã°ãããããã®çµæãã¡ãã¥ãŒã®ãã§ãã¯ç¶æ ãå転ããŸã
æåŸã«ãAPIãæ©èœãããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®/usr/share/applications.desktopã«ã¢ã€ã³ã³ãå¿ èŠã§ãã ãšããã§ãUnity APIã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããŠããªããšãã«æ©èœããæ°žç¶çãªã¢ã€ãã ãã¡ãã¥ãŒã«è¿œå ã§ããŸããããã¯æ¬¡ã®ããã«ãªããŸãã
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ïŒã¢ã€ã³ã³ã¿ã¹ã¯ïŒïŒ

ãã©ã°ã€ã³ãäœæãããšãã QutIMã«Torkveã®äœæ¥ã䜿çšããŸããã
Macos Xã®ãã©ã°ã€ã³å®è£
ãŸããç¹å¥ãªå°é£ã¯ãããŸããã§ãããQtã«ã¡ãã¥ãŒããšã¯ã¹ããŒãããããã®ç¹å¥ãªæ¹æ³ããã§ã«ãããŸããããã«ã€ããŠã¯ã ããã§å€ãã®ããšãèšãããŠããŸãã
ãããžã¯Cocoaã䜿çšããŠç°¡åã«ã€ã³ã¹ããŒã«ã§ããŸããQStringãNSStringã«å€æããã¡ãã»ãŒãžãããã¯ã«éä¿¡ããã¡ã¢ãªãã¯ãªã¢ããã ãã§æžã¿ãŸãã
const char *utf8String = badge.toUtf8().constData(); NSString *cocoaString = [[NSString alloc] initWithUTF8String:utf8String]; [[NSApp dockTile] setBadgeLabel:cocoaString]; [cocoaString release];
é²è¡ç¶æ³ã€ã³ãžã±ãŒã¿ãŒãäœæããã®ãå°ãé£ãããªããŸãããDockAPIã«ã¯çµã¿èŸŒã¿ã®ã¡ãœããã¯ãããŸããããDockã¢ã€ã³ã³ã«ç»åãæç»ããã¡ãœããããããŸãã ããŸãæ°ã«ããªãããã«ãLGPLã©ã€ã»ã³ã¹ã¯è³ãããããªãããã®ãããªæ°çµ¶ãèš±å¯ããŠããã®ã§ãQtCreatorããã€ã³ãã£ã±ãŒã¿ã®å®è£ ãåããŸããã
ã¹ã¯ãªãŒã³ã·ã§ãã

Windows 7ã¿ã¹ã¯ããŒã®å®è£
ãããŠæåŸã«ãæãããããïŒ ä»ã®ã·ã¹ãã ã§ãã©ã°ã€ã³ã®äœæããã»ã¹ãå€å°ã¹ã ãŒãºã«ãªã£ãå Žåãæã人æ°ã®ãããã¹ã¯ãããOSã®å Žåããã¹ãŠãã¯ã©ãŠãã¬ã¹ã§ã¯ãªãããšãå€æããããããã«ã²ã€ããã¹ãã£ãŒããã«ããŒãããŸããŸãªã¬ãŒããæ éã«ã¬ã€ã¢ãŠãããç¡åã®ããã°ã©ããŒãªã©ãããŸããŸãªæªãèšèã§èªåèªèº«ãèŠããªããã°ãªããŸããã§ããïŒ å·çã®éçšã§ããã¬ãŒãºã¯æ»ãªãªããã°ãªããŸãããwtfãªã©ã¯å€ãè¯ããŠã£ã³ãã¹ãŸã§äœåºŠãçºçããŸããã
wchar_t *ã®ä»£ããã«LPCSTRã®ãããªå¥åŠãªèªã¿ã«ããåãããããã¹ãŠã®ãã£ãŒã«ãã«ãã³ã¬ãªãŒèªã®è¡šèšæ³ããããã²ã©ãã²ã©ãCOMããããŸããã€ãŸããã³ãŒãã¹ã¿ã€ã«ã¯ã²ã©ãã§ãã ãŸããABIã«ã¯åé¡ãããããã®çµæãMSã³ã³ãã€ã©ã«ãã£ãŠã³ã³ãã€ã«ãããC ++ã©ã€ãã©ãªãminGWã«ãã£ãŠã³ã³ãã€ã«ãããã³ãŒãã«ãªã³ã¯ããããšã¯äžå¯èœã§ãã ããŠãæŸèæã«è¡ããªããã°ãªããªãã£ããããAPIèªäœã¯ããå¥åŠã§ãã ããã«ããžã£ã³ããªã¹ãã®äŸã«ã¯ãATLã©ã€ãã©ãªã®äœ¿çšãå«ãŸããŠããŸããATLã©ã€ãã©ãªã¯ãææã®ã¹ã¿ãžãªã§ã®ã¿å©çšå¯èœã§ããããã®çç±ããç§ãã¡ã«ã¯é©ããŠããŸããã
ABIã®åé¡ã解決ããããã«ã dtfãšç§ã¯ãå°æ¥ã©ã®ã³ã³ãã€ã©ããã§ãåçã«ãªã³ã¯ã§ããããã«ãã¿ã¹ã¯ããŒã®COM APIã«æå°éã®Cã©ãããŒãäœæããããšã«ããŸããã
APIã¯éåžžã«ã·ã³ãã«ã§ããããšãå€æããŸãããã©ãããŒèªäœã¯Qtã«äŸåãããã©ãããã§ã䜿çšã§ããŸãããå®å šã«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); ...
ç§ã¯æãåçŽãªãã®ããå§ããŸããïŒé²è¡ç¶æ³ã€ã³ãžã±ãŒã¿ãŒãäœæããããšã«ããŸããããã®ã³ãŒãã¯åå¿dtfã«ãã£ãŠæ¢ã«æžãããŠããã®ã§ã転éã«ç¹å¥ãªå°é£ã¯ãããŸããã§ããã
// 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ã¡ãœããã䜿çšããŠãããžãå®è£ ããã¢ã€ã³ã³èªäœãæç»ããQtã䜿çšããŠHICONã«å€æããŸãã
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ãä»ããŠèšå®ãããŸããoverlayIconã®ä»ã®å®è£ ã¯16x16ã®ã¢ã€ã³ã³ãæç»ããã ãã§ãdpiãæ°ã«ããªããããã¢ãã¿ãŒã®ã¢ã€ã³ã³ã¯ãŒãããŠããããšãããããŸããã
ãããŠä»ãæãèå³æ·±ãã®ã¯ãžã£ã³ããªã¹ãã®å®è£ ã§ãã ããã¯å€ãããªãŒãäžåšã§åœŒã«å®ãŠãå€ãã®ææ æ·±ãèšèãèããå Žæã§ãïŒ
è©Šéšçªå·1-APIã®å¶éã«åºã¥ãQActionã®ã·ãªã¢ã«å
åã¢ã¯ã·ã§ã³ã«ã¯ãååãã¢ã¯ã·ã§ã³ãã¯ãªãã¯ãããšãã«å®è¡ãããã³ãã³ããããã³ãªãã·ã§ã³ã§ico圢åŒã®ã¢ã€ã³ã³ãžã®ãã¹ãšèª¬æããããŸãã ããã«ããããã¯ãã¹ãŠã¯ã€ãã¯ã€ãæååã®åœ¢åŒã§éä¿¡ããå¿ èŠãããããããã£ãŠããããã®å¯¿åœãç¬ç«ããŠç£èŠããå¿ èŠããããŸãã ãã¡ãããã³ãŒã«ããã¯ãäœããã®åœ¢ã§æŽçããå¿ èŠããããŸããããããæããã§ã¯ãããŸãããQActionã§ããªã¬ãŒã¡ãœãããåŒã³åºãå¿ èŠããããŸããããããäžèŠã·ã³ãã«ã«èŠããŸããã
ãã®ã³ã³ãã³ãã®æ§é ã®é åãã·ã¹ãã ã©ãããŒã«è»¢éããŸãã
struct ActionInfo { const char *id; wchar_t *name; wchar_t *description; wchar_t *iconPath; ActionType type; void *data; // - . }; typedef void (*ActionInvoker)(void*); // , void *data
次ã«ã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; }
ã¢ã€ã³ã³ã衚瀺ããã«ã¯ãäžæãã¡ã€ã«ã®ç¬èªã®å®è£ ãäœæããå¿ èŠããããŸãããQTemporaryFileã¯ãã¡ã€ã«ãç¬å çã«ææããŠãããããç§ãã¡ã«ã¯ããŸãé©ããŠããŸããã åå¥ã«æ€èšããã€ããã¯ãããŸããããã¹ãŠãéåžžã«ã·ã³ãã«ã§æ確ã§ãã
è©Šç·Žçªå·2-jumpListsã®çæ
ãžã£ã³ããªã¹ããå ¥åããã«ã¯ãbeginListã¡ãœãããåŒã³åºãå¿ èŠããããŸã
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(); }
ãããŠãcommitListã¡ãœãããåŒã³åºããŸã
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; }
åé·ãèŠã€ãããŸãããïŒ ããããæ²ããããªãããªãã¯åŒŸäžžããã¿ãäœçŸè¡ãã®ã³ãŒããèµ°ãæžããç¶ããªããã°ãªããŸããããããªããã°äœãæ©èœããŸããããç§ãã¡ã¯æ¬åœã®ç·æ§ã§ãããå°é£ãæããŠããŸãããïŒ ãããŠãæããªãã®ã§ããã°ãã³ãŒã«ããã¯ãå®è£ ããŸãããïŒ
è©Šç·Žçªå·3-ã³ãŒã«ããã¯ã®å®è£
ã§ã¯ãäœããããŸããïŒ jumpListã§ã¢ã€ãã ãã¢ã¯ãã£ãã«ãããšãåŒæ°ã®ã»ããã䜿çšããŠã³ãã³ããåŒã³åºãããŸãã ããããç¹å®ã®IDãæã€actionInfoãèŠã€ããŠã³ãŒã«ããã¯ãäœæããããšããããšãã©ã®ããã«äŒããããšãã§ããŸããïŒ
Dtfãšç§ã¯ããã«ã€ããŠé·ãéèããŠããŸãããã圌ã¯rundllã䜿çšããŠãã¹ãŠãå®è¡ããããšãææ¡ããŸãããrundllã¯ãæå®ãããåŒæ°ã§ã©ã€ãã©ãªããç¹å®ã®ã¡ãœãããåŒã³åºãããšãã§ããŸãã
ãã®çµæãã¢ã¯ã·ã§ã³IDãååŸããããŒã42042ã§ãœã±ãããéããåä¿¡ããIDãããã«æž¡ãã¡ãœãããçãŸããŸãããã©ã€ãã©ãªã¯ãã®ãœã±ããããªãã¹ã³ããIDãåä¿¡ãããšãå·éã«ã³ãŒã«ããã¯ãè¡ããç®çã®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; }
æåŸã®æ¹æ³ïŒrundllãåŒã³åºãé¢æ°ãå®è£ ãã
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(); }
ããã ãã§ããä»æ¥ã«ååãªã³ãŒãããããŸããç°¡åã«åŒåžã§ããŸããèŠçŽããŸãããã
Windowså®è£ ã®å¶é
- ãããžã«ã¯2ã€ã®ãããžã®ã¿
- æäœã®çµæããžã£ã³ããªã¹ãã®æåŸã®ãã¡ã€ã«ã¯å€±ãããŸãã
- ã¢ã¯ã·ã§ã³ã¯ãµããŒããããŠããŸãã-ã¹ã€ãããšéã¢ã¯ãã£ããªã¢ã¯ã·ã§ã³
- ãµãã¡ãã¥ãŒã¯ãµããŒããããŠããŸãã
ã¹ã¯ãªãŒã³ã·ã§ããïŒ

ãããã«
ã©ã€ãã©ãªã¯éåžžã«äœ¿ãããããæ¡åŒµãç°¡åã§ãã ãããŸã§ã®ãšããããã¹ãŠã®ãã©ãããã©ãŒã ã«ããåºæ¬çãªæ©èœã®ã¿ãã«ããŒããŠããŸãã å°æ¥çã«ã¯ããã©ãããã©ãŒã åºæã®æ¡åŒµæ©èœãè¿œå ããæ¹æ³ãæ€èšããŸãã
ã¡ãã¥ãŒãåé¡ãªãããã¯ã«ãšã¯ã¹ããŒããããããšãä¿èšŒããã«ã¯ã次ã®ç¹ãæºãããŠããå¿ èŠããããŸãã
- ãµãã¡ãã¥ãŒã¯ãããŸãã
- åãæ¿ãå¯èœãªã¢ã€ãã ãŸãã¯ç¡å¹ãªã¢ã€ãã ã¯ãããŸãã
- å°æ°ã®ãã€ã³ããããã¯ãã§ã
- setMenuã§èšå®ãããåŸã¯å€æŽããªãã§ãã ãã
ãããŠããã€ãã®ã³ã¡ã³ãïŒ
- ããã¯ã®æ£ããäœæ¥ã¯ãåäžã®ã¢ããªã±ãŒã·ã§ã³ã®å Žåã«ã®ã¿å¯èœã§ããããã¯ãQtã·ã³ã°ã«ã¢ããªã±ãŒã·ã§ã³ãŸãã¯ä»ã®åæ§ã®æ段ãšçµã¿åãããŠäœ¿çšââããŸã
- ãããžã§ã¯ã100æªæºã®æ£ã®æ°ã䜿çšããããšããå§ãããŸã
ãã®ä»ã®å Žåããã¹ãŠã®ãã©ãããã©ãŒã ã§äœããå©çšã§ãããšã¯éããŸããã ååãšããŠãããã¯èŽåœçã§ã¯ãããŸãããããããèŠããŠããå¿ èŠããããŸãïŒ
Unityãã©ã°ã€ã³ã®å®è£ ãæ¯æŽããŠãããTorkve ãWindowsãã©ã°ã€ã³ã®å®è£ ãæ¯æŽããŠãããdtf ãMacos XããŒãžã§ã³ã®å®è£ ãæ¯æŽããŠãããQtCreatoréçºè ã«æè¬ããŸãã
ãœãŒã¹ã³ãŒãã¯githubã§å ¥æã§ããŸãã ä¿®æ£ãšæ¹åãæè¿ããŸãã
è åš
Dockmanager APIãå®è£ ããã人ã¯ããŸããïŒ