func (app *RuntimeApp) updateIcon(xid xproto.Window) { core := app.createDesktopAppInfo() if core != nil { defer core.Unref() icon := getAppIcon(core.DesktopAppInfo) if icon != "" { app.xids[xid].Icon = icon return } } logger.Info(app.Id, "using icon from X") icon, err := xgraphics.FindIcon(XU, xid, 48, 48) // logger.Info(icon, err) // FIXME: gets empty icon for minecraft if err == nil { buf := bytes.NewBuffer(nil) icon.WritePng(buf) app.xids[xid].Icon = "data:image/png;base64," + base64.StdEncoding.EncodeToString(buf.Bytes()) return } logger.Debug("get icon from X failed:", err) logger.Debug("get icon name from _NET_WM_ICON_NAME") name, _ := ewmh.WmIconNameGet(XU, xid) if name != "" { app.xids[xid].Icon = name } else { app.xids[xid].Icon = "application-default-icon" } }
func find_app_id_by_xid(xid xproto.Window, displayMode DisplayModeType) string { var appId string if displayMode == DisplayModeModernMode { if id, err := xprop.PropValStr(xprop.GetProperty(XU, xid, "_DDE_DOCK_APP_ID")); err == nil { appId = getAppIDFromDesktopID(normalizeAppID(id)) logger.Debug("get app id from _DDE_DOCK_APP_ID", appId) return appId } } wmClass, _ := icccm.WmClassGet(XU, xid) var wmInstance, wmClassName string if wmClass != nil { wmInstance = wmClass.Instance wmClassName = wmClass.Class } name, _ := ewmh.WmNameGet(XU, xid) pid, err := ewmh.WmPidGet(XU, xid) if err != nil { logger.Info("get pid failed, ", name) if name != "" { pid = lookthroughProc(name) } else { appId = getAppIDFromDesktopID(normalizeAppID(wmClassName)) logger.Debug("get Pid failed, using wm class name as app id", appId) return appId } } iconName, _ := ewmh.WmIconNameGet(XU, xid) if pid == 0 { appId = normalizeAppID(wmClassName) logger.Debug("get window name failed, using wm class name as app id", appId) return appId } else { } appId = find_app_id(pid, name, wmInstance, wmClassName, iconName) appId = getAppIDFromDesktopID(normalizeAppID(appId)) logger.Debug(fmt.Sprintf("get appid %q", appId)) return appId }