📄 fe-picogui.c
字号:
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 + -