欢迎您使用《汉王简》中文输入引擎 江毅 二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;
}