判断程序实例是否已经运行的N种方法(判断窗口已经运行)

对于某些情况,我们可以通过判断窗口是否正在运行来保证只有一个程序实例运行。

下面是判断窗口是否正在运行的代码段:

 

#define MYWINDOW_SELECTION_FMT  "MYWINDOW_SELECTION_DISPLAY_%d"

gboolean
mywindow_check_is_running(Window *xid)
{
    const gchar *display = g_getenv("DISPLAY");
    gchar *p;
    gint xscreen = -1;
    gchar selection_name[100];
    Atom selection_atom;

    if(display) {
        if((p=g_strrstr(display, ".")))
            xscreen = atoi(p);
    }
    if(xscreen == -1)
        xscreen = 0;

    g_snprintf(selection_name, 100, MYWINDOW_SELECTION_FMT, xscreen);
    g_print("selection_name:%s\n",selection_name);
    selection_atom = XInternAtom(GDK_DISPLAY(), selection_name, False);

    if((*xid = XGetSelectionOwner(GDK_DISPLAY(), selection_atom)))
        return TRUE;

    return FALSE;
}

static void screen_set_selection()
{
   Window xwin;
   gint xscreen;
   gchar selection_name[100];
   Atom selection_atom, manager_atom;
   GtkWidget           *invisible;

   invisible = gtk_invisible_new ();
   gtk_widget_realize (invisible);

   xwin = GDK_WINDOW_XWINDOW (invisible->window);;
   xscreen = gdk_screen_get_number(gdk_screen_get_default());

   g_snprintf(selection_name, 100, MYWINDOW_SELECTION_FMT, xscreen);
   selection_atom = XInternAtom(GDK_DISPLAY(), selection_name, False);
   manager_atom = XInternAtom(GDK_DISPLAY(), "MANAGER", False);


   XSelectInput(GDK_DISPLAY(), xwin, PropertyChangeMask | ButtonPressMask);
   XSetSelectionOwner(GDK_DISPLAY(), selection_atom, xwin, GDK_CURRENT_TIME);

   if(XGetSelectionOwner(GDK_DISPLAY(), selection_atom) == xwin) {
      XClientMessageEvent xev;

      xev.type = ClientMessage;
      xev.window = GDK_ROOT_WINDOW();
      xev.message_type = manager_atom;
      xev.format = 32;
      xev.data.l[0] = GDK_CURRENT_TIME;
      xev.data.l[1] = selection_atom;
      xev.data.l[2] = xwin;
      xev.data.l[3] = 0;    /* manager specific data */
      xev.data.l[4] = 0;    /* manager specific data */

      XSendEvent(GDK_DISPLAY(), GDK_ROOT_WINDOW(), False, StructureNotifyMask, (XEvent *)&xev);
   } else {
      g_error(" could not set selection ownership\n");
      exit(1);
   }
}

int
main (int argc, char *argv[])
{
     Window xid;
     gtk_init(&argc, &argv);

     ...

       if(mywindow_check_is_running(&xid))
       {
               g_debug("mywindow is already running!");
               return 0;
       }
       else
     {
             screen_set_selection();
              g_debug("run mywindow first time");
     }

    ...

}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值