欢迎您使用《汉王简》中文输入引擎    江毅 二OO四年九月    www.hanwj.com    hanwj178@gmail.com


Linux源码及编程交流



(声明:本处所登程序仅供参考,不能保证百分之百正确。欢迎各位寄电邮给我(hanwj178@gmail.com),对程序评论、指正、增添功能,以及增添小程序。)版权要求:程序随便用,但务请保留作者名和作者网址。谢谢。Copyright: Free to copy/use, but please keep author name and author website name intact. Thanks.


在应用程序中打开html文件。

int FindInstalledWebBrowser(char *buf);
void OpenHtml(LPSTR htmlfilepath) 
{//Author: Jiang,Yi HanWJ.com
  char browserPath[512];
  if(!FindInstalledWebBrowser(browserPath) || 0 == browserPath[0])
      return;
  char cmd[1024];
  sprintf(cmd, "%s %s", browserPath, htmlfilepath);
  pid_t pid = fork();
  if(0==pid)
     system(cmd);
}
int FindInstalledWebBrowser(char *buf);
{//Author: Jiang,Yi HanWJ.com
  char str[1024];
  char *veryPossibles[] = {"/usr/local/mozilla/mozilla", "/usr/local/mozilla/firefox", "/usr/local/netscape/netscape", 
                     "/usr/mozilla/mozilla", "/usr/mozilla/firefox", "/usr/netscape/netscape", 0, };
  char *possiblePaths[] = {"/usr/bin/", "/usr/local/bin/", "", };
  char *possibleNms[] = {"konqueror", "kfmbrowser", "mozilla", "firefox", "netscape", };
  int i=0, j;
  //try direct paths
  while(veryPossibles[i] && veryPossibles[i][0])
  {
    if(0 == _access(veryPossibles[i], X_OK) )
    {//if exist and executable
        strcpy(buf, veryPossibles[i]);
        return 1;
    }
    i++;
  }
  //try path/nm combinations
  for(i=0; i<2; i++)
  {
    for(j=0; j<4; j++)
    {//if exist and executable
      sprintf(str, "%s%s", possiblePaths[i], possibleNms[j]);
      if(0 == _access(str, X_OK) )
      {
        strcpy(buf, veryPossibles[i]);
        return 1;
      }
    }
  }
  return 0;
}
}


对于从微软视窗移植过来的程序,对于文件名的大小写常常是不加区别的。一下程序给定一个大小写随便的文件名,找到某一目录下相对应的真实文件名(假定在大小写不限情况下,该目录下文件名具有唯一性)。

int GetMatchingRealFileNameForCaseInSensitiveName(char * szPath, char * szCaseInsensitiveName, char *szResult)
{//Author: Jiang,Yi HanWJ.com
	struct dirent **nmlst;
	szResult[0] = 0;
	int ret=0, n = scandir(szPath, &nmlst, 0, alphasort);
	for(int i=0; id_name) )
            {
               strcpy(szResult, nmlst[i]->d_name);
               ret = 1;
		}
            free(nmlst[i]);
	}
	if(-1 < n)
         free(nmlst);
	return ret;
;
}

取系统时间。相当于微软视窗上的GetTickCount().

DWORD GetMiliSecCount()
{//Author: Jiang,Yi HanWJ.com
	timeval tv;
	gettimeofday(&tv, NULL);
	return tv.tv_sec*1000L+tv.tv_usec/1000L;
}


检查自己程序是否是第一个运行实例。(instance here means app process)

int IsFirstInstance()
{//Author: Jiang,Yi HanWJ.com
	char line[2048], *p;
	int myProcessId = getpid();
	FILE *fp = popen("ps -x", "r");
	if(fp)
	{
		int pid;
		while(fgets(line, sizeof(line), fp) ) 
		{
			if(strstr(line, szMyAppName) && 0!=(p = strstr(line, szMyAppPath) ) )
			{
				int m = p-line;
				if(0 < m && IsWhiteSpace(line[m-1]) && m<100)
				{
					pid = 0;
					sscanf(line, "%d ", &pid);
					if(0 < pid)
					{

						if(pid < myProcessId)//1st instance has smallest pid
						{
							return 0;
						}
					}
				}
			}
		}
		pclose(fp);//fclose(fp);
	}
	return 1;
}


取桌面尺寸。

void GetWindowsWorkArea(Rect *prc)
{//Author: Jiang,Yi HanWJ.com
   prc->left = prc->top = 0;
  prc->right = DisplayWidth (dsply, 0);
  prc->bottom= DisplayHeight(dsply, 0);
}


取视窗尺寸。

Size GetWinSize(Window win)
{//Author: Jiang,Yi HanWJ.com
	XWindowAttributes attr;
	Status retStatus = XGetWindowAttributes(dsply, win, &attr);
	if(!retStatus)
  	  return 0;
	Size siz;
	siz.cx = attr.width;
	siz.cy = attr.height;
	return siz;
}


察看视窗显示状态。

BOOL IsWinShown(Window win)
{//Author: Jiang,Yi HanWJ.com
	XWindowAttributes attr;
	Status ret = XGetWindowAttributes(dsply, win, &attr);
	return 1==ret && IsUnmapped != attr.map_state;
}


取视窗大小。

int GetWinRect(Window win, CRect*rc)
{//Author: Jiang,Yi HanWJ.com
	XWindowAttributes attr;
	Window wParent;
	Status retStatus = XGetWindowAttributes(dsply, win, &attr);
	if(!retStatus)
		return 0;
	rc->left = attr.x;
	rc->top = attr.y;
	rc->right = rc->left+ attr.width;
	rc->bottom = rc->top+ attr.height;
	Window rt = DefaultRootWindow(dsply);
	while(0!=(wParent=GetWinParent(win) ) &&  wParent != rt )
	{
		retStatus = XGetWindowAttributes(dsply, wParent, &attr);
		if(!retStatus)
			return 0;
		win = wParent;
		rc->OffsetRect(attr.x, attr.y);
	}
	return 1;
}


取父视窗。

Window GetWinParent(Window w)
{//Author: Jiang,Yi HanWJ.com
	Window root_return;
	Window parent_return;
	Window *children_return;
	unsigned int nchildren_return;
	Status retStatus = XQueryTree(dsply, w, &root_return, &parent_return, &children_return, &nchildren_return);
	if(!retStatus)
		return 0;
	return parent_return;
}


汉王简中文输入工具