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

📄 maingui.c

📁 The major functionality added in this release includes: - Rootless mode in X11 - Widget Templt
💻 C
📖 第 1 页 / 共 4 页
字号:
{#ifndef USE_GNOME	GtkWidget *wid = NULL;#endif	sess->gui->window = win;	if (sess->is_tab)	{		sess->is_tab = FALSE;		if (sess->type == SESS_CHANNEL)		{			/* turned into a toplevel window, so create a menubar */#ifdef USE_GNOME			sess->gui->menu = createmenus (GNOME_APP (sess->gui->window), sess, 1);#else			wid = gtk_handle_box_new ();			gtk_box_pack_start (GTK_BOX (sess->gui->vbox), wid, FALSE, FALSE, 0);			gtk_box_reorder_child (GTK_BOX (sess->gui->vbox), wid, 0);			sess->gui->menu = createmenus (0, sess, 1);			gtk_container_add (GTK_CONTAINER (wid), sess->gui->menu);			gtk_widget_show_all (wid);#endif		}		gtk_signal_connect (GTK_OBJECT (win), "focus_in_event",								  GTK_SIGNAL_FUNC (focus_in), sess);		gtk_signal_connect_object (GTK_OBJECT (win), "configure_event",											GTK_SIGNAL_FUNC (maingui_configure),											GTK_OBJECT (sess));		/* toplevel windows can't use the notebook label as changad */		maingui_make_changad (sess);		/* Hide menu if it is turned off */		if (prefs.hidemenu)#ifdef USE_GNOME			menu_showhide ();#else			if (wid)				gtk_widget_hide (wid);#endif#ifdef USE_ZVT		if (sess->type == SESS_SHELL)			menu_newshell_set_palette (sess);		else#endif			gtk_xtext_refresh (GTK_XTEXT (sess->gui->textgad), 1);	} else	{		sess->is_tab = TRUE;		if (sess->gui->menu)		{#ifndef USE_GNOME			/* this will destroy the HandleBox and its children */			gtk_widget_destroy (sess->gui->menu->parent);#else			/* causes GTK_IS_WIDGET failed warning */			/*gtk_widget_destroy (sess->gui->menu);*/#endif			sess->gui->menu = NULL;		}		/* tabs don't have the changad near the topic bar */		if (sess->gui->changad != NULL)			gtk_widget_destroy (sess->gui->changad);		sess->gui->changad = wins_get_notebooklabel (sess->gui->window);#ifdef USE_GNOME		/* why does only gnome need this ?? */		/* dialog windows don't have this box */		if (sess->gui->userlistbox && sess->type != SESS_DIALOG)		{			gtk_widget_realize (sess->gui->userlistbox);			gdk_window_set_background (sess->gui->userlistbox->window,												&sess->gui->userlistbox->												style->bg[GTK_STATE_NORMAL]);			gdk_window_set_back_pixmap (main_book->window, 0, 0);		}		menu_showhide ();#endif	}}/* called when sess->gui->window is destroyed */static voidwindow_destroy_cb (session *sess){	kill_session_callback (sess);	/* xchat.c */	if (main_window != NULL)	{		/* if no tabs left, destroy main window */		if (gtk_notebook_get_nth_page (GTK_NOTEBOOK (main_book), 0) == NULL)		{			gtk_widget_destroy (main_window);			main_window = NULL;		}	}}voidcreate_window (struct session *sess){	GtkWidget *leftpane, *rightpane;	GtkWidget *vbox, *tbox, *bbox, *nlbox, *wid, *infbox;	int justopened = FALSE;	if (sess->type == SESS_DIALOG)	{		new_dialog (sess);		if (prefs.treeview)			tree_update ();		return;	}	if (!sess->server->front_session)		sess->server->front_session = sess;	if (prefs.tabchannels)	{		sess->is_tab = TRUE;		if (!main_window)		{			justopened = TRUE;			gui_make_tab_window (sess, NULL);		}		sess->gui->window = wins_new (_("<none>"), "",									window_destroy_cb, sess, link_cb, sess,									TRUE, FALSE, NULL);		if (!current_tab)			current_tab = sess;	} else	{		sess->gui->window = wins_new (_("<none>"), "",									window_destroy_cb, sess, link_cb, sess,									FALSE, FALSE, NULL);		gtk_widget_set_usize (sess->gui->window, prefs.mainwindow_width,										prefs.mainwindow_height);		gtk_signal_connect ((GtkObject *) sess->gui->window, "focus_in_event",								  GTK_SIGNAL_FUNC (focus_in), sess);	}	fe_set_title (sess);	palette_alloc (sess->gui->window);	sess->gui->vbox = vbox = wins_get_vbox (sess->gui->window);	if (!prefs.tabchannels)	{#ifdef USE_GNOME		sess->gui->menu = createmenus (sess->gui->window, sess, 1);#else		sess->gui->menu = createmenus (0, sess, 1);		gtk_widget_show (sess->gui->menu);		wid = gtk_handle_box_new ();		gtk_container_add (GTK_CONTAINER (wid), sess->gui->menu);		gtk_box_pack_start (GTK_BOX (vbox), wid, FALSE, TRUE, 0);		if (!prefs.hidemenu)			gtk_widget_show (wid);#endif	}	sess->gui->tbox = tbox = gtk_hbox_new (FALSE, 0);	gtk_box_pack_start (GTK_BOX (vbox), tbox, FALSE, FALSE, 2);	if (prefs.topicbar)		gtk_widget_show (tbox);	wins_create_linkbuttons (sess->gui->window, tbox);	if (!prefs.tabchannels)		maingui_make_changad (sess);	sess->gui->topicgad = gtk_entry_new ();	gtk_signal_connect (GTK_OBJECT (sess->gui->topicgad), "activate",							  GTK_SIGNAL_FUNC (handle_topicgad), sess);	gtk_container_add (GTK_CONTAINER (tbox), sess->gui->topicgad);	if (prefs.inputgad_superfocus)		show_and_unfocus (sess->gui->topicgad);	else		gtk_widget_show (sess->gui->topicgad);	add_tip (sess->gui->topicgad, _("The channel topic"));#ifdef USE_GNOMEE	wid = gtkutil_button (sess->gui->window, GNOME_STOCK_PIXMAP_FORWARD, 0,								 userlist_hide, sess, 0);#else	if (prefs.hideuserlist)		wid = gtk_button_new_with_label ("<");	else		wid = gtk_button_new_with_label (">");	gtk_signal_connect (GTK_OBJECT (wid), "clicked",							  GTK_SIGNAL_FUNC (userlist_hide), (gpointer) sess);#endif	gtk_box_pack_end (GTK_BOX (tbox), wid, 0, 0, 0);	show_and_unfocus (wid);	add_tip (wid, _("Hide/Show Userlist"));	if (prefs.chanmodebuttons)	{		sess->gui->key_entry = gtk_entry_new_with_max_length (16);		gtk_widget_set_usize (sess->gui->key_entry, 30, -1);		gtk_box_pack_end (GTK_BOX (tbox), sess->gui->key_entry, 0, 0, 0);		gtk_signal_connect (GTK_OBJECT (sess->gui->key_entry), "activate",								  GTK_SIGNAL_FUNC (key_entry), (gpointer) sess);		if (prefs.inputgad_superfocus)			show_and_unfocus (sess->gui->key_entry);		else			gtk_widget_show (sess->gui->key_entry);		sess->gui->flag_k = add_flag_wid (_("Keyword"), tbox, _("K"), sess);		sess->gui->limit_entry = gtk_entry_new_with_max_length (10);		gtk_widget_set_usize (sess->gui->limit_entry, 30, -1);		gtk_box_pack_end (GTK_BOX (tbox), sess->gui->limit_entry, 0, 0, 0);		gtk_signal_connect (GTK_OBJECT (sess->gui->limit_entry), "activate",								  GTK_SIGNAL_FUNC (limit_entry), (gpointer) sess);		if (prefs.inputgad_superfocus)			show_and_unfocus (sess->gui->limit_entry);		else			gtk_widget_show (sess->gui->limit_entry);		sess->gui->flag_l = add_flag_wid (_("User Limit"), tbox, "L", sess);		sess->gui->flag_b = add_flag_wid (_("Ban List"), tbox, "B", sess);		sess->gui->flag_m = add_flag_wid (_("Moderated"), tbox, "M", sess);		sess->gui->flag_p = add_flag_wid (_("Private"), tbox, "P", sess);		sess->gui->flag_i = add_flag_wid (_("Invite Only"), tbox, "I", sess);		sess->gui->flag_s = add_flag_wid (_("Secret"), tbox, "S", sess);		sess->gui->flag_n = add_flag_wid (_("No outside messages"), tbox, "N", sess);		sess->gui->flag_t = add_flag_wid (_("Topic Protection"), tbox, "T", sess);	} else		sess->gui->flag_wid[0] = 0;	leftpane = gtk_hbox_new (FALSE, 0);	gtk_widget_show (leftpane);	if (prefs.paned_userlist)	{		sess->gui->paned = gtk_hpaned_new ();		gtk_container_add (GTK_CONTAINER (vbox), sess->gui->paned);		gtk_widget_show (sess->gui->paned);	}	rightpane = gtk_hbox_new (FALSE, 0);	gtk_widget_show (rightpane);	sess->gui->userlistbox = rightpane;	if (prefs.paned_userlist)	{		gtk_paned_pack1 (GTK_PANED (sess->gui->paned), leftpane, TRUE, TRUE);		gtk_paned_pack2 (GTK_PANED (sess->gui->paned), rightpane, FALSE, TRUE);#ifndef WIN32	/* not available in gtk 1.3 */		gtk_paned_set_gutter_size (GTK_PANED (sess->gui->paned), 4);#endif	} else	{		wid = gtk_hbox_new (0, 2);		gtk_container_add (GTK_CONTAINER (vbox), wid);		gtk_widget_show (wid);		gtk_container_add (GTK_CONTAINER (wid), leftpane);		gtk_box_pack_end (GTK_BOX (wid), rightpane, 0, 0, 0);	}	sess->gui->nl_box = nlbox = gtk_vbox_new (FALSE, 1);	gtk_container_add (GTK_CONTAINER (rightpane), nlbox);	gtk_widget_show (nlbox);	sess->gui->namelistinfo = infbox = gtk_hbox_new (0, 0);	gtk_box_pack_start (GTK_BOX (nlbox), infbox, 0, 0, 0);	sess->gui->namelistinfo_o = create_infoframe (pix_op, mask_op, infbox);	sess->gui->namelistinfo_v = create_infoframe (pix_voice, mask_voice, infbox);	sess->gui->namelistinfo_t = create_infoframe (0, 0, infbox);	maingui_create_textlist (sess, leftpane);	sess->gui->leftpane = leftpane;	if (prefs.showhostname_in_userlist)	{		sess->gui->namelistgad =			gtkutil_clist_new (2, 0, nlbox, GTK_POLICY_AUTOMATIC,									 maingui_userlist_selected, sess, 0, 0,									 GTK_SELECTION_MULTIPLE);		gtk_clist_set_column_auto_resize ((GtkCList *) sess->gui->namelistgad,													 0, TRUE);		gtk_clist_set_column_auto_resize ((GtkCList *) sess->gui->namelistgad,													 1, TRUE);	} else	{		sess->gui->namelistgad =			gtkutil_clist_new (1, 0, nlbox, GTK_POLICY_AUTOMATIC,									 maingui_userlist_selected, sess, 0, 0,									 GTK_SELECTION_MULTIPLE);	}	GTK_WIDGET_UNSET_FLAGS (sess->gui->namelistgad, GTK_CAN_FOCUS);	if (prefs.style_namelistgad)		gtk_widget_set_style (sess->gui->namelistgad, inputgad_style);#ifdef USE_GNOME	/* set up drops */	gtk_drag_dest_set (sess->gui->namelistgad, GTK_DEST_DEFAULT_ALL,							 dnd_targets, 1,							 GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK);	gtk_signal_connect (GTK_OBJECT (sess->gui->namelistgad), "drag_motion",							  GTK_SIGNAL_FUNC (userlist_dnd_motion), 0);	gtk_signal_connect (GTK_OBJECT (sess->gui->namelistgad), "drag_leave",							  GTK_SIGNAL_FUNC (userlist_dnd_leave), 0);	gtk_signal_connect (GTK_OBJECT (sess->gui->namelistgad),							  "drag_data_received",							  GTK_SIGNAL_FUNC (userlist_dnd_drop), sess);#endif	gtk_clist_set_selection_mode (GTK_CLIST (sess->gui->namelistgad),											GTK_SELECTION_MULTIPLE);	gtk_clist_set_column_width (GTK_CLIST (sess->gui->namelistgad), 0, 10);	gtk_widget_set_usize (sess->gui->namelistgad->parent, 115, 0);	gtk_signal_connect (GTK_OBJECT (sess->gui->namelistgad),							  "button_press_event", GTK_SIGNAL_FUNC (ul_button_rel),							  sess);	/*gtk_signal_connect (GTK_OBJECT (sess->gui->namelistgad),							  "key_press_event", GTK_SIGNAL_FUNC (ul_keypress_cb),							  sess);*/	if ((prefs.lagometer & 2) || (prefs.throttlemeter & 2))	{		infbox = gtk_hbox_new (0, 0);		gtk_box_pack_start (GTK_BOX (nlbox), infbox, 0, 0, 0);		gtk_widget_show (infbox);	}	if (prefs.lagometer & 1)	{		sess->gui->lagometer = wid = gtk_progress_bar_new ();		gtk_widget_set_usize (wid, 1, 8);		gtk_box_pack_start (GTK_BOX (nlbox), wid, 0, 0, 0);		gtk_widget_show (wid);	}	if (prefs.lagometer & 2)	{		sess->gui->laginfo = wid = create_infoframe (0, 0, infbox);		gtk_label_set_text ((GtkLabel *) wid, "Lag");	}	if (prefs.throttlemeter & 1)	{		sess->gui->throttlemeter = wid = gtk_progress_bar_new ();		gtk_widget_set_usize (wid, 1, 8);		gtk_box_pack_start (GTK_BOX (nlbox), wid, 0, 0, 0);		gtk_widget_show (wid);	}	if (prefs.throttlemeter & 2)	{		sess->gui->throttleinfo = wid = create_infoframe (0, 0, infbox);		gtk_label_set_text ((GtkLabel *) wid, "Throttle");	}	if (prefs.userlistbuttons)		maingui_createbuttons (sess);	else		sess->gui->button_box = 0;	/* bottom hbox */	bbox = gtk_hbox_new (FALSE, 0);	gtk_container_set_border_width (GTK_CONTAINER (bbox), 0);	gtk_box_pack_end (GTK_BOX (vbox), bbox, FALSE, TRUE, 2);	gtk_widget_show (bbox);	if (prefs.nickgad)	{		sess->gui->op_box = gtk_hbox_new (0, 0);		gtk_box_pack_start (GTK_BOX (bbox), sess->gui->op_box, FALSE, FALSE, 2);		gtk_widget_show (sess->gui->op_box);		sess->gui->nickgad = gtk_label_new (sess->server->nick);		gtk_box_pack_start (GTK_BOX (bbox), sess->gui->nickgad, FALSE, FALSE,								  4);		gtk_widget_show (sess->gui->nickgad);	}	sess->gui->inputgad = gtk_entry_new_with_max_length (2048);	gtk_container_add (GTK_CONTAINER (bbox), sess->gui->inputgad);	gtk_signal_connect (GTK_OBJECT (sess->gui->inputgad), "key_press_event",							  GTK_SIGNAL_FUNC (key_handle_key_press), sess);	if (prefs.style_inputbox)		gtk_widget_set_style (sess->gui->inputgad, inputgad_style);	gtk_widget_show (sess->gui->inputgad);	if (prefs.newtabstofront || justopened)		gtk_widget_grab_focus (sess->gui->inputgad);	gui_create_toolbox (sess, bbox);	gtk_widget_show (sess->gui->window);	if (prefs.tabchannels)	{		sess->gui->changad = wins_get_notebooklabel (sess->gui->window);		gtk_widget_realize (sess->gui->textgad);		if (justopened)		{			gtk_widget_show (main_window);			if (prefs.mainwindow_left || prefs.mainwindow_top)				gdk_window_move (main_window->window,									  prefs.mainwindow_left, prefs.mainwindow_top);		}		if (!redtab_style)			maingui_init_styles (sess->gui->changad->style);		if (prefs.newtabstofront && !justopened)			wins_bring_tofront (sess->gui->window);		/* make switching tabs super smooth! */		gtk_widget_realize (rightpane);		gdk_window_set_background (rightpane->window,											&rightpane->style->bg[GTK_STATE_NORMAL]);		gdk_window_set_back_pixmap (main_book->window, 0, 0);		gdk_window_set_background (((GtkNotebook*)main_book)->panel,											&main_book->style->bg[GTK_STATE_NORMAL]);	} else	{		if (!redtab_style)			maingui_init_styles (gtk_widget_get_style (sess->gui->changad));		if (prefs.mainwindow_left || prefs.mainwindow_top)			gdk_window_move (sess->gui->window->window,								  prefs.mainwindow_left, prefs.mainwindow_top);	}	if (prefs.hideuserlist)	{		userlist_hide (0, sess);		if (sess->gui->paned)			sess->userlisthidden = GTK_PANED (sess->gui->paned)->handle_xpos;	}#ifdef USE_GNOME	if (!sess->is_tab || justopened)		menu_showhide ();#endif	fe_set_nonchannel (sess, FALSE);}voidfe_session_callback (struct session *sess){	tree_update ();#ifdef USE_PANEL	if (sess->gui->panel_button)		gtk_widget_destroy (sess->gui->panel_button);#endif	if (sess->gui->bar)		fe_progressbar_end (sess);	if (menu_sess == sess && sess_list)		menu_sess = (struct session *) sess_list->data;}/*voidfe_server_callback (struct server *serv){	if (serv->gui->rawlog_window)	{ 		we don't want the "destroy" callback to be called		gtk_signal_disconnect_by_data (GTK_OBJECT (serv->gui->rawlog_window), serv);		gtk_widget_destroy (serv->gui->rawlog_window);	} }*/static voidmy_gtk_togglebutton_state (GtkWidget *wid, int state){	gpointer udata;	/* remove the userdata so the callback ignores this event */	udata = gtk_object_get_user_data (GTK_OBJECT (wid));	gtk_object_set_user_data (GTK_OBJECT (wid), 0);	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wid), state);	/* now put it back */	gtk_object_set_user_data (GTK_OBJECT (wid), udata);}voidfe_update_mode_buttons (struct session *sess, char mode, char sign){	int state, i;	if (sign == '+')		state = TRUE;	else		state = FALSE;	if (sess->gui->flag_wid[0])	{		for (i = 0; i < NUM_FLAG_WIDS - 1; i++)		{			if (chan_flags[i] == mode)			{				if (GTK_TOGGLE_BUTTON (sess->gui->flag_wid[i])->active != state)					my_gtk_togglebutton_state (sess->gui->flag_wid[i], state);			}		}	}/*	fe_set_title (sess);*/}voidhandle_inputgad (GtkWidget * igad, struct session *sess){	char *cmd = gtk_entry_get_text (GTK_ENTRY (igad));	if (cmd[0] == 0)		return;	handle_multiline (sess, cmd, TRUE, FALSE);	gtk_entry_set_text (GTK_ENTRY (igad), "");}

⌨️ 快捷键说明

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