⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fe-picogui.c

📁 The major functionality added in this release includes: - Rootless mode in X11 - Widget Templt
💻 C
📖 第 1 页 / 共 2 页
字号:
				fe_timeout_remove (te->tag);			} else			{				te->next_call = now.tv_sec * 1000 + (now.tv_usec / 1000) + te->interval;			}		}	}	last=now.tv_sec;}voidfe_exit (void){	pgExitEventLoop();}voidfe_new_server (struct server *serv){	serv->gui = malloc (sizeof(struct server_gui));}voidfe_message (char *msg, int wait){	if(wait)		pgMessageDialog("X-Chat", msg, 0);	else	{		pghandle text;		pgRegisterApp(PG_APP_NORMAL, "X-Chat message", 0);		pgBind(0, PG_WE_CLOSE, evtCloseMessage, NULL);		pgNewWidget(PG_WIDGET_TEXTBOX, 0, 0);		pgSetWidget(0, PG_WP_TEXT, text=pgNewString(msg), 0);		pgDelete(text);	}}voidfe_close_window (struct session *sess){	int i;	if(sess->gui->userlistinfo)		sess->gui->userlistinfo=pgGetWidget(sess->gui->userlistinfo,PG_WP_TEXT);	if(sess->gui->topic)		sess->gui->topic=pgGetWidget(sess->gui->app, PG_WP_TEXT);	for(i=0;i<sess->gui->buttons;i++)		sess->gui->userbutton[i].h=			pgGetWidget(sess->gui->userbutton[i].h, PG_WP_TEXT);	for(i=0;i<sess->gui->users;i++)		sess->gui->uhmap[i].handle=			pgGetWidget(sess->gui->uhmap[i].handle, PG_WP_TEXT);	pgDelete(sess->gui->app);	for(i=0;i<sess->gui->buttons;i++)		pgDelete(sess->gui->userbutton[i].h);	if(sess->gui->userbutton)		free(sess->gui->userbutton);	for(i=0;i<sess->gui->users;i++)		pgDelete(sess->gui->uhmap[i].handle);	if(sess->gui->uhmap)		free(sess->gui->uhmap);	if(sess->gui->topic)		pgDelete(sess->gui->topic);	if(sess->gui->userlistinfo)		pgDelete(sess->gui->userlistinfo);	kill_session_callback (sess);}voidfe_beep (void){	pgDriverMessage(PGDM_SOUNDFX, PG_SND_BEEP);}voidfe_add_rawlog (struct server *serv, char *text, int outbound){}static intsetTopic(struct pgEvent *evt){	struct session *sess=evt->extra;	pghandle topichandle;	char *topic, *cmd;	topichandle=pgGetWidget(evt->from, PG_WP_TEXT);	if(topichandle)	{		topic=pgGetString(topichandle);		cmd=malloc(strlen(topic)+8);		if(cmd)		{			sprintf(cmd, "/topic %s", topic);			handle_command (cmd, sess, FALSE, FALSE);			free(cmd);		}	}	return 0;}voidfe_set_topic (struct session *sess, char *topic){	pghandle str;	if(!sess->gui->topic)	{		sess->gui->topic = pgNewWidget(PG_WIDGET_FIELD, PG_DERIVE_BEFORE,				sess->gui->input);		pgSetWidget(0, PG_WP_SIDE, PG_S_TOP, 0);		pgBind(0, PG_WE_ACTIVATE, setTopic, sess);	}	str=pgNewString(topic);	pgSetWidget(sess->gui->topic, PG_WP_TEXT, str, 0);	pgDelete(str);}voidfe_cleanup (void){	pgDelete(pgPlusHTML);	pgDelete(pgEmptyString);}voidfe_set_hilight (struct session *sess){}voidfe_update_mode_buttons (struct session *sess, char mode, char sign){}voidfe_update_channel_key (struct session *sess){}voidfe_update_channel_limit (struct session *sess){}intfe_is_chanwindow (struct server *serv){	return 0;}voidfe_add_chan_list (struct server *serv, char *chan, char *users, char *topic){}voidfe_chan_list_end (struct server *serv){}intfe_is_banwindow (struct session *sess){	return 0;}voidfe_add_ban_list (struct session *sess, char *chan, char *users, char *topic){}               voidfe_ban_list_end (struct session *sess){}voidfe_notify_update (char *name){}voidfe_text_clear (struct session *sess){}voidfe_progressbar_start (struct session *sess){}voidfe_progressbar_end (struct session *sess){}voidfe_userlist_insert (struct session *sess, struct User *newuser, int row){	int i;	pghandle item;	sess->gui->uhmap=realloc(sess->gui->uhmap,			++sess->gui->users*sizeof(struct uhmapping));	if(row==-1)		row=sess->gui->users-1;	else		for(i=sess->gui->users-1;i>row;i--)			sess->gui->uhmap[i]=sess->gui->uhmap[i-1];	item=pgNewWidget(PG_WIDGET_LISTITEM, row?PG_DERIVE_AFTER:			PG_DERIVE_INSIDE, row?sess->gui->uhmap[row-1].handle:			sess->gui->userlist);	pgSetWidget(0, PG_WP_EXTDEVENTS, pgGetWidget(0, PG_WP_EXTDEVENTS) &			~PG_EXEV_EXCLUSIVE, 0);	pgReplaceTextFmt(0, "%c%s", newuser->prefix, newuser->nick);	sess->gui->uhmap[row].user=newuser;	sess->gui->uhmap[row].handle=item;}voidfe_userlist_remove (struct session *sess, struct User *user){	int i;	for(i=0;i<sess->gui->users;i++)		if(sess->gui->uhmap[i].user==user)		{			pgDelete(pgGetWidget(sess->gui->uhmap[i].handle,						PG_WP_TEXT));			pgDelete(sess->gui->uhmap[i].handle);			--sess->gui->users;			while(i<sess->gui->users)			{				sess->gui->uhmap[i]=sess->gui->uhmap[i+1];				i++;			}			sess->gui->uhmap=realloc(sess->gui->uhmap,				sess->gui->users*sizeof(struct uhmapping));			break;		}}voidfe_userlist_move (struct session *sess, struct User *user, int new_row){	struct uhmapping tmp;	int i;	if(new_row==-1)		new_row=sess->gui->users-1;	for(i=0;i<sess->gui->users;i++)		if(sess->gui->uhmap[i].user==user)		{			tmp=sess->gui->uhmap[i];			break;		}	if(i==sess->gui->users)		return;		/* should never happen */	while(i<new_row)	{		sess->gui->uhmap[i]=sess->gui->uhmap[i+1];		i++;	}	while(i>new_row)	{		sess->gui->uhmap[i]=sess->gui->uhmap[i-1];		i--;	}	sess->gui->uhmap[new_row]=tmp;	pgReplaceTextFmt(tmp.handle, "%c%s", tmp.user->prefix, tmp.user->nick);	pgAttachWidget(new_row?sess->gui->uhmap[new_row-1].handle:			sess->gui->userlist, new_row?PG_DERIVE_AFTER:			PG_DERIVE_INSIDE, tmp.handle);}voidfe_userlist_numbers (struct session *sess){	pgReplaceTextFmt(sess->gui->userlistinfo, "User List - @%d +%d %d",			sess->ops, sess->voices, sess->total);}voidfe_userlist_clear (struct session *sess){	int i=sess->gui->users;	pghandle h;	if(!sess->gui->uhmap)		return;	while(i--)	{		h=pgGetWidget(sess->gui->uhmap[i].handle, PG_WP_TEXT);		if(h)			pgDelete(h);		pgDelete(sess->gui->uhmap[i].handle);	}	sess->gui->users=0;	free(sess->gui->uhmap);	sess->gui->uhmap=NULL;}voidfe_dcc_update_recv_win (void){}voidfe_dcc_update_send_win (void){}voidfe_dcc_update_chat_win (void){}voidfe_dcc_update_send (struct DCC *dcc){}voidfe_dcc_update_recv (struct DCC *dcc){}voidfe_clear_channel (struct session *sess){}voidfe_session_callback (struct session *sess){}voidfe_server_callback (struct server *serv){}voidfe_checkurl (char *text){}voidfe_pluginlist_update (void){}static intevtUserButton (struct pgEvent *evt){	struct session *sess=evt->extra;	char *cmdtemplate=NULL, *p, *cmd;	int i, size, didit=0;	for(i=0;i<sess->gui->buttons;i++)		if(sess->gui->userbutton[i].h==evt->from)		{			/* I know about the warning, but otherwise strcpy()			 * gives that warning a _lot_ below */			cmdtemplate=sess->gui->userbutton[i].cmd;			break;		}	if(!cmdtemplate)		return 0;	size=strlen(cmdtemplate);	if(p=strstr(cmdtemplate, "%s"))	{	/* one nick at a time */		cmd=malloc(size+NICKLEN);	/* wasting at least 2 bytes */		memcpy(cmd, cmdtemplate, size=p-cmdtemplate);		p+=2;		for(i=0;i<sess->gui->users;i++)		{			if(pgGetWidget(sess->gui->uhmap[i].handle, PG_WP_ON))			{				strcpy(cmd+size,sess->gui->uhmap[i].user->nick);				strcat(cmd+size, p);				handle_command (cmd, sess, FALSE, FALSE);				didit=1;			}		}		if(!didit)		{			strcpy(cmd+size, p);			handle_command (cmd, sess, FALSE, FALSE);		}		free(cmd);	}	else if(p=strstr(cmdtemplate, "%a"))	{	/* multinick command */		/* wasting at least sess->gui->users+1 bytes */		cmd=malloc(size+sess->gui->users*NICKLEN);		memcpy(cmd, cmdtemplate, size=p-cmdtemplate);		p+=2;		for(i=0;i<sess->gui->users;i++)		{			if(pgGetWidget(sess->gui->uhmap[i].handle, PG_WP_ON))			{				if(didit)					cmd[size++]=' ';				strcpy(cmd+size,sess->gui->uhmap[i].user->nick);				size+=strlen(cmd+size);				didit=1;			}		}		strcpy(cmd+size, p);		handle_command (cmd, sess, FALSE, FALSE);		free(cmd);	}	else		handle_command (cmdtemplate, sess, FALSE, FALSE);	return 1;}voidfe_buttons_update (struct session *sess){	GSList *list;	struct popup *pop;	pghandle h;	if(sess->gui->userbutton)	{		while(--sess->gui->buttons>=0)		{			h=sess->gui->userbutton[sess->gui->buttons].h;			pgDelete(pgGetWidget(h, PG_WP_TEXT));			pgDelete(h);		}		free(sess->gui->userbutton);		sess->gui->userbutton=NULL;	}	sess->gui->buttons=0;	list=button_list;	while(list)	{		pop = (struct popup *) list->data;		if(pop->cmd[0])		{			sess->gui->userbutton=realloc(sess->gui->userbutton,					sizeof(struct userbut) *					++sess->gui->buttons);			sess->gui->userbutton[sess->gui->buttons-1].cmd=				pop->cmd;			sess->gui->userbutton[sess->gui->buttons-1].h=				pgNewWidget(PG_WIDGET_BUTTON, 					    sess->gui->buttons-1?0:					    PG_DERIVE_INSIDE,					    sess->gui->buttons-1?0:					    sess->gui->buttonbox);			pgSetWidget(0, PG_WP_TEXT, pgNewString(pop->name),					PG_WP_SIDE, PG_S_BOTTOM, 0);			pgBind(0, PG_WE_ACTIVATE, evtUserButton, sess);		}		list=list->next;	}}voidfe_dlgbuttons_update (struct session *sess){}voidfe_dcc_send_filereq (struct session *sess, char *nick){}voidfe_set_channel (struct session *sess){}voidfe_set_title (struct session *sess){	int type=sess->type;	if(sess->server->connected == FALSE && sess->type != SESS_DIALOG)		type = SESS_SHELL;	/* force default */	switch (type)	{		case SESS_DIALOG:			pgReplaceTextFmt(sess->gui->app,					"%s @ %s : X-Chat",					sess->channel, sess->server->servername);			break;		case SESS_SERVER:			pgReplaceTextFmt(sess->gui->app, "%s @ %s : X-Chat",					sess->server->nick, sess->server->servername);			break;		case SESS_CHANNEL:			pgReplaceTextFmt(sess->gui->app,					"%s @ %s : X-Chat",					 sess->server->nick,					 sess->channel);			break;		case SESS_NOTICES:		case SESS_SNOTICES:			pgReplaceTextFmt(sess->gui->app,					"%s @ %s (notices) : X-Chat",					sess->server->nick, sess->server->servername);			break;		default:			pgReplaceText(sess->gui->app, "X-Chat ["VERSION"]");	}}voidfe_set_nonchannel (struct session *sess, int state){}voidfe_set_nick (struct server *serv, char *newnick){	strcpy (serv->nick, newnick);}voidfe_change_nick (struct server *serv, char *nick, char *newnick){	struct session *sess = find_dialog (serv, nick);	if (sess)	{		safe_strcpy (sess->channel, newnick, CHANLEN);		fe_set_title (sess);	}}voidfe_ignore_update (int level){}voidfe_dcc_open_recv_win (int passive){}voidfe_dcc_open_send_win (int passive){}voidfe_dcc_open_chat_win (int passive){}intfe_is_confmode (struct session *sess){	return 0;}intfe_is_beep (struct session *sess){	return 0;}voidfe_userlist_hide (session * sess){}voidfe_lastlog (session * sess, session * lastlog_sess, char *sstr){}voidfe_set_lag (server * serv, int lag){}voidfe_set_throttle (server * serv){}voidfe_set_away (server *serv){}intfe_open_serverlist (session *sess, int auto_connect, int dont_show){	return FALSE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -