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

📄 wins.c

📁 The major functionality added in this release includes: - Rootless mode in X11 - Widget Templt
💻 C
字号:
/* X-Chat * Copyright (C) 1998 Peter Zelezny. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA *//* xchat's window/tab functions */#include <stdlib.h>#include <stdio.h>#include <string.h>#include "fe-gtk.h"#include "../common/xchat.h"#include "../common/fe.h"#include "pixmaps.h"#include "gtkutil.h"#include "maingui.h"#include "panel.h"#include "wins.h"#ifdef USE_XLIB#include <gdk/gdkx.h>#endiftypedef struct xchatwin{	GtkWidget *child;	/* GtkWindow or hbox for notebooktab */	GtkWidget *vbox;	/* main contents */	GtkWidget *notebooklabel;	GtkWidget *button_box;	GtkWidget *button_box_box;	GtkWidget **child_ret;	/* give the client changes (when linking) */	void (*close_callback) (void *userdata);	void *userdata;	void (*link_callback) (GtkWidget *win, void *userdata);	/* called when de/relinked */	void *link_userdata;	char *title;	char *name;	unsigned int is_toplevel:1;	unsigned int is_nonirc:1;} xchatwin;/* private functions - callbacks */static voidwins_free (xchatwin *xw){	free (xw->title);	free (xw->name);	free (xw);}static gintwins_destroy_cb (GtkWidget *win, xchatwin *xw){	if (xw->close_callback != NULL)		xw->close_callback (xw->userdata);	wins_free (xw);	return TRUE;}static voidwins_X_cb (GtkWidget *button, xchatwin *xw){	gtk_widget_destroy (xw->child);}/* delink a tab OR relink a window */static voidwins_link_cb (GtkWidget *button, xchatwin *xw){	GtkWidget *new_win;	GtkWidget *old_win;	xchatwin *new_xw;#ifdef USE_GNOME	GtkWidget *wid;#endif	old_win = xw->child;	/* make sure wins_destroy_cb isn't called */	gtk_signal_disconnect_by_data (GTK_OBJECT (old_win), xw);	/* do we need to create a main window? */	if (main_window == NULL && xw->is_toplevel)	{		gui_make_tab_window (NULL, old_win);		gtk_widget_show (main_window);	}	/* create a new tab/window */	new_win = wins_new (xw->name, xw->title, xw->close_callback,								xw->userdata, xw->link_callback,								xw->link_userdata, xw->is_toplevel, xw->is_nonirc,								xw->child_ret);	new_xw = gtk_object_get_user_data (GTK_OBJECT (new_win));	/* give the client the new window pointer */	if (xw->child_ret != NULL)		*xw->child_ret = new_win;	/* use the old vbox instead */	gtk_widget_destroy (new_xw->vbox);	new_xw->vbox = xw->vbox;#ifdef USE_GNOME	if (xw->is_toplevel)	{		gtk_widget_reparent (xw->vbox, new_win);	} else	{		wid = gtk_hbox_new (0, 0);		gtk_widget_reparent (xw->vbox, wid);		gnome_app_set_contents (GNOME_APP (new_win), wid);	}#else	gtk_widget_reparent (xw->vbox, new_win);#endif	if (xw->button_box != NULL)	{		/* buttons need to be re-created so that the parameters to the			callbacks are updated. */		gtk_widget_destroy (xw->button_box);		wins_create_linkbuttons (new_win, xw->button_box_box);	}	gtk_widget_destroy (old_win);	gtk_widget_show (new_win);	wins_free (xw);	/* this will call link_cb() in maingui.c */	if (new_xw->link_callback != NULL)		new_xw->link_callback (new_win, new_xw->link_userdata);	/* did we just remove the last page? if so, destroy the main window */	if (gtk_notebook_get_nth_page (GTK_NOTEBOOK (main_book), 0) == NULL)		gtk_widget_destroy (main_window);}static voidwins_moveright_cb (GtkWidget *button, xchatwin *xw){	wins_move_leftorright (xw->child, FALSE);}static voidwins_moveleft_cb (GtkWidget *button, xchatwin *xw){	wins_move_leftorright (xw->child, TRUE);}#ifdef USE_PANELstatic voidwins_panelize_cb (GtkWidget *button, xchatwin *xw){	maingui_panelize (xw->child);}#endif/* private functions */static xchatwin *wins_add_window (GtkWidget *win, char *title, char *name){	xchatwin *xw;	xw = malloc (sizeof (struct xchatwin));	memset (xw, 0, sizeof (struct xchatwin));	xw->title = strdup (title);	xw->name = strdup (name);	xw->child = win;	gtk_signal_connect (GTK_OBJECT (win), "destroy",								GTK_SIGNAL_FUNC (wins_destroy_cb), xw);	gtk_object_set_user_data (GTK_OBJECT (win), xw);	return xw;}static voidwins_addtabto_notebook (GtkWidget *tab, xchatwin *xw, char *name, int nonirc){	char *buf;	GtkWidget *label;	if (nonirc)	{		buf = malloc (strlen (name) + 3);		sprintf (buf, "(%s)", name);		label = gtk_label_new (buf);		free (buf);	} else	{		label = gtk_label_new (name);	}	gtk_widget_show (label);	xw->notebooklabel = label;	gtk_notebook_append_page (GTK_NOTEBOOK (main_book), tab, label);}static GtkWidget *wins_create_button (GtkWidget *box, char *stock, char *label, char *tip,							void *callback, void *userdata){	GtkWidget *wid;#ifdef USE_GNOME	wid = gtkutil_button (box, stock, 0, callback, userdata, 0);	gtk_box_pack_start (GTK_BOX (box), wid, 0, 0, 0);#else	wid = gtk_button_new_with_label (label);	gtk_box_pack_start (GTK_BOX (box), wid, 0, 0, 0);	gtk_signal_connect (GTK_OBJECT (wid), "clicked",							  GTK_SIGNAL_FUNC (callback), userdata);#endif	show_and_unfocus (wid);	add_tip (wid, tip);	return wid;}static GtkWidget *wins_create_tab (char *name, char *title, int nonirc, xchatwin **xw_ret){	GtkWidget *tab;	GtkWidget *vbox;	xchatwin *xw;	tab = gtk_hbox_new (0, 0);	vbox = gtk_vbox_new (0, 0);	gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);	gtk_container_add (GTK_CONTAINER (tab), vbox);	gtk_widget_show (vbox);	xw = wins_add_window (tab, title, name);	xw->is_toplevel = FALSE;	xw->vbox = vbox;	wins_addtabto_notebook (tab, xw, name, nonirc);	*xw_ret = xw;	return tab;}static GtkWidget *wins_create_win (char *name, char *title, xchatwin **xw_ret){	GtkWidget *win;	GtkWidget *vbox;	xchatwin *xw;#ifdef USE_GNOME	win = gnome_app_new ("X-Chat", title);#else	win = gtk_window_new (GTK_WINDOW_TOPLEVEL);	gtk_window_set_title (GTK_WINDOW (win), title);#endif	gtk_window_set_wmclass (GTK_WINDOW (win), name, "X-Chat");	wins_set_icon (win);	gtk_window_set_policy (GTK_WINDOW (win), TRUE, TRUE, FALSE);	vbox = gtk_vbox_new (0, 0);	gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);#ifdef USE_GNOME	gnome_app_set_contents (GNOME_APP (win), vbox);#else	gtk_container_add (GTK_CONTAINER (win), vbox);#endif	gtk_widget_show (vbox);	xw = wins_add_window (win, title, name);	xw->is_toplevel = TRUE;	xw->vbox = vbox;	*xw_ret = xw;	return win;}/* public functions */GtkWidget *wins_get_vbox (GtkWidget *win){	xchatwin *xw;	xw = (xchatwin *) gtk_object_get_user_data (GTK_OBJECT (win));	return xw->vbox;}GtkWidget *wins_get_notebooklabel (GtkWidget *win){	xchatwin *xw;	xw = (xchatwin *) gtk_object_get_user_data (GTK_OBJECT (win));	return xw->notebooklabel;}voidwins_create_linkbuttons (GtkWidget *win, GtkWidget *box){	GtkWidget *hbox;	xchatwin *xw;	xw = gtk_object_get_user_data (GTK_OBJECT (win));	hbox = gtk_hbox_new (0, 0);	gtk_box_pack_start (GTK_BOX (box), hbox, 0, 0, 0);	gtk_widget_show (hbox);	gtk_box_reorder_child (GTK_BOX (box), hbox, 0);	xw->button_box = hbox;	xw->button_box_box = box;	wins_create_button (hbox, GNOME_STOCK_BUTTON_CANCEL, "X",								_("Close this tab/window"), wins_X_cb, xw);	wins_create_button (hbox, GNOME_STOCK_PIXMAP_REMOVE, "^",								_("Link/DeLink this tab"), wins_link_cb, xw);#ifdef USE_PANEL	if (!nopanel)	{		GtkWidget *wid = gtkutil_button (win, GNOME_STOCK_PIXMAP_BOTTOM,									 0, wins_panelize_cb, xw, 0);		gtk_box_pack_start (GTK_BOX (hbox), wid, 0, 0, 0);		add_tip (wid, _("Panelize"));	}#endif	if (!xw->is_toplevel)	{		wins_create_button (hbox, GNOME_STOCK_PIXMAP_BACK, "<",								_("Move tab left"), wins_moveleft_cb, xw);		wins_create_button (hbox, GNOME_STOCK_PIXMAP_FORWARD, ">",								_("Move tab right"), wins_moveright_cb, xw);	}}GtkWidget *wins_new (char *name, char *title, void *close_callback, void *userdata,				void *link_callback, void *link_userdata,				int tab, int nonirc, GtkWidget **child_ret){	GtkWidget *win;	xchatwin *xw;	if (tab)		win = wins_create_tab (name, title, nonirc, &xw);	else		win = wins_create_win (name, title, &xw);	xw->close_callback = close_callback;	xw->userdata = userdata;	xw->link_callback = link_callback;	xw->link_userdata = link_userdata;	xw->is_nonirc = nonirc;	xw->child_ret = child_ret;	return win;}voidwins_update_notebooktitle (GtkWidget *fronttab){	xchatwin *xw;	xw = (xchatwin *) gtk_object_get_user_data (GTK_OBJECT (fronttab));	gtk_window_set_title (GTK_WINDOW (main_window), xw->title);}voidwins_set_name (GtkWidget *widget, char *new_name){	xchatwin *xw;	xw = (xchatwin *) gtk_object_get_user_data (GTK_OBJECT (widget));	free (xw->name);	xw->name = strdup (new_name);}voidwins_set_title (GtkWidget *widget, char *new_title){	xchatwin *xw;	int fpage;	xw = (xchatwin *) gtk_object_get_user_data (GTK_OBJECT (widget));	free (xw->title);	xw->title = strdup (new_title);	if (xw->is_toplevel)	{		gtk_window_set_title (GTK_WINDOW (xw->child), new_title);	} else	{		if (main_window)		{			/* set WINDOW title only if tab is the front one */			fpage = gtk_notebook_get_current_page (GTK_NOTEBOOK (main_book));			if (fpage == gtk_notebook_page_num (GTK_NOTEBOOK (main_book), widget))			{				gtk_window_set_title (GTK_WINDOW (main_window), new_title);			}		}	}}voidwins_bring_tofront (GtkWidget *widget){	xchatwin *xw;	int page;	xw = (xchatwin *) gtk_object_get_user_data (GTK_OBJECT (widget));	if (xw->is_toplevel)	{		gdk_window_show (widget->window);	} else	{		page = gtk_notebook_page_num (GTK_NOTEBOOK (main_book), widget);		gtk_notebook_set_page (GTK_NOTEBOOK (main_book), page);	}}voidwins_move_leftorright (GtkWidget *win, int left){	int pos;	xchatwin *xw;	xw = (xchatwin *) gtk_object_get_user_data (GTK_OBJECT (win));	pos = gtk_notebook_get_current_page (GTK_NOTEBOOK (main_book));	if (left)	{		if (pos > 0)			gtk_notebook_reorder_child (GTK_NOTEBOOK (main_book), xw->child, pos - 1);	} else	{		gtk_notebook_reorder_child (GTK_NOTEBOOK (main_book), xw->child, pos + 1);	}}voidwins_set_icon (GtkWidget *win){#ifdef USE_XLIB	GdkAtom icon_atom;	glong data[2];	gtk_widget_realize (win);	data[0] = GDK_WINDOW_XWINDOW (pix_xchat_mini);	data[1] = GDK_WINDOW_XWINDOW (mask_xchat_mini);	icon_atom = gdk_atom_intern ("KWM_WIN_ICON", FALSE);	gdk_property_change (win->window, icon_atom, icon_atom,								32, GDK_PROP_MODE_REPLACE, (guchar *) data, 2);	gdk_window_set_icon (win->window, NULL, pix_xchat, mask_xchat);	gdk_window_set_icon_name (win->window, PACKAGE);#endif}

⌨️ 快捷键说明

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