[Share Experiences] 自动关闭PicGo自启动后的桌面小窗(一个小方框) Resolved
Tofloor
poster avatar
Beams
deepin
2023-11-19 00:47
Author

问题: 图床工具PicGo开机自启动后桌面会有一个小方框。

image.png

解决: 使用xdotool工具获取该窗口ID后在关闭该窗口。

代码如下:

include 
#include 
#include 

// 搜索PicGo的窗口
char superd[] = "xdotool search PicGo";
int main() {
    char result[1024] = {0};
    char buf[1024] = {0};
    FILE *fp = NULL;
    char windowNum[24] = {0};
    // 运行PicGo,自启动的话会捕捉不到PicGo需要关闭的窗口(会返回四个ID,需要关闭最后一个)
    system("/opt/durapps/a2d-packages/picgo/squashfs-root/AppRun &");
    // system("/home/beams/Downloads/PicGo-2.4.0-beta.5.AppImage &");
    // 等待PicGo启动,开启所有的窗口
    system("sleep 3");
    // 这个while其实可以不用,自启动可以使用,就是循环等待PicGo启动
    // 这里可以优化
    while(strlen(result)==0){
        // 运行xdotool,superd
        if( (fp = popen(superd, "r")) == NULL ) {
            printf("popen error!\n");
            return 0;
        }
        // 获取superd的执行结果
        while (fgets(buf, sizeof(buf), fp)) {
            strcat(result, buf);
        }
        pclose(fp);
        printf("result: %s\n", result);

    }
    int begin = 0;
    int end = strlen(result);
    // 获取需要关闭窗口的ID
    if (result[0]!= '\0') {
        printf("%d\n",sizeof(result));
        for(int i = 0; i < strlen(result); i++){
            if(result[i] == '\n' and result[i+1] != '\0'){
                printf("%d\n",i);
                begin = i;
            }
        }
    }
    for(int i = 0; i < end-begin; i++){
        windowNum[i] = result[begin+i+1];
    }
    printf("windowNum: %s\n", windowNum);
    // 可以选择windowminimize或windowclose,windowminimize会dock状态栏有显示图标
    // windowclose则不会显示图标
    char prefix[] = "xdotool windowclose ";
    strcat(prefix,windowNum);
    printf("windowNum: %s\n", prefix);
    system(prefix);

    // 旧方案:显示桌面
    // system("xdotool keydown super");
    // system("xdotool keydown d");
    // system("xdotool keyup d");
    // system("xdotool keyup super");
    return 0;
}

后面工作:

  1. 将代码编译得到可执行文件。

  2. mv path/可执行文件 /usr/local/bin

  3. 到阿里巴巴图标中心下载一个图标:https://www.iconfont.cn/

  4. 下载应用图标生成器:
    image.png

  5. 生成一个图标,图标内容如下:

    [Desktop Entry]
    Version=1.0
    Name=home
    Name[zh_CN]=home
    Comment=
    Type=Application
    Exec=/usr/local/bin/你的可执行文件名字
    Icon=/home/beams/Videos/appicons/你下载的图标名字,注意路径
    Categories=AudioVideo
    X-Deepin-CreatedBy=com.deepin.SessionManager
    X-Deepin-AppID=superd
    Hidden=false
    
  6. 将生成的图标放到路径:/usr/share/applications

    image.png

  7. 打开菜单,设置成为开机自启动就可以了。

PS: 该方法还可以关闭别的类似窗口,比如 [1] 坚果云的开机窗口。但我发现在相对应的路径下删掉坚果云的图标就可以了。这里还有一些细节,比如要获取应用的名称,可以打开对应的.desktop文件就可以查看到。.desktop文件就在 /usr/share/applications路径下。 [2] 创建一个显示桌面的图标。

Last: 上述资源已打包,可下载:https://wwcy.lanzouq.com/iPHsz1f81kmd 密码: absp

Reply Favorite View the author
All Replies
fax928
Moderator
2023-11-19 02:47
#1

感谢分享。like

Reply View the author
DebuggerX
deepin
2023-11-19 03:13
#2

没仔细看,只提一个小点吧,也是我用了xdotool很久之后才发现的一个特性,就是它可以把命令连着写的,比如原本

xdotool keydown ctrl

xdotool key d

xdotool keyup ctrl

这样的三行代码,实际只需要

xdotool keydown ctrl key d keyup ctrl

一行就行,而且还能把sleep, exec啥的都直接写进去,就很简洁。

p.s. 可惜了这么好的工具到wayland下就废了……

Reply View the author
Beams
deepin
2023-11-20 17:28
#3
DebuggerX

没仔细看,只提一个小点吧,也是我用了xdotool很久之后才发现的一个特性,就是它可以把命令连着写的,比如原本

xdotool keydown ctrl

xdotool key d

xdotool keyup ctrl

这样的三行代码,实际只需要

xdotool keydown ctrl key d keyup ctrl

一行就行,而且还能把sleep, exec啥的都直接写进去,就很简洁。

p.s. 可惜了这么好的工具到wayland下就废了……

xdotool的github下给出了在wayland下别的建议:https://github.com/jordansissel/xdotool
image.png

Reply View the author
DebuggerX
deepin
2023-11-20 17:44
#4
Beams

xdotool的github下给出了在wayland下别的建议:https://github.com/jordansissel/xdotool
image.png

嗯,这些我也都试过,都不是很好用,离xdotool的开发和使用体验差很多。

Reply View the author