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

📄 uicommon.c

📁 Linux下的飞鸽传书
💻 C
字号:
/* *  Copyright (C) 2006 Takeharu KATO * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#ifdef HAVE_CONFIG_H#  include <config.h>#endif#include <gnome.h>#include <glib.h>#include <gconf/gconf-client.h>#include "callbacks.h"#include "interface.h"#include "support.h"#include "common.h"#define HOOKUP_ID(component,id) \  g_object_set_data (G_OBJECT (component), "ID", (gpointer)id)#define GET_ID(component)       \  ((int)g_object_get_data (G_OBJECT (component),"ID"))#define GLADE_HOOKUP_OBJECT_NO_REF(component,widget,name) \  g_object_set_data (G_OBJECT (component), name, widget)#define GLADE_HOOKUP_OBJECT(component,widget,name) \  g_object_set_data_full (G_OBJECT (component), name, \    gtk_widget_ref (widget), (GDestroyNotify) gtk_widget_unref)static intrelease_user_entry(GtkTreeView *view) {  GtkTreePath *path;  GtkTreeIter iter;  GtkTreeModel *model;  model = gtk_tree_view_get_model(view);    if (!model)    return -EINVAL;  path=gtk_tree_path_new_first ();  g_assert(path);  if (gtk_tree_model_get_iter(model,&iter,path)) {    while(gtk_list_store_remove(GTK_LIST_STORE(model), &iter))      dbg_out("Remove OK\n");  }  gtk_tree_path_free (path);  return 0;}static voidon_messageUserTree_user_clicked(GtkTreeViewColumn *treeviewcolumn,				gpointer user_data) {  dbg_out("Here");  g_assert(treeviewcolumn);  gtk_tree_view_column_set_sort_column_id(treeviewcolumn,0);}static voidon_messageUserTree_group_clicked(GtkTreeViewColumn *treeviewcolumn,				 gpointer user_data) {  dbg_out("Here");  g_assert(treeviewcolumn);  gtk_tree_view_column_set_sort_column_id(treeviewcolumn,1);}static voidon_messageUserTree_host_clicked(GtkTreeViewColumn *treeviewcolumn,				gpointer user_data) {  dbg_out("Here");  g_assert(treeviewcolumn);  gtk_tree_view_column_set_sort_column_id(treeviewcolumn,2);}static voidon_messageUserTree_ipaddr_clicked(GtkTreeViewColumn *treeviewcolumn,				  gpointer user_data) {  dbg_out("Here");  g_assert(treeviewcolumn);  gtk_tree_view_column_set_sort_column_id(treeviewcolumn,3);}static voidon_messageUserTree_logon_clicked(GtkTreeViewColumn *treeviewcolumn,				 gpointer user_data) {  dbg_out("Here");  g_assert(treeviewcolumn);  gtk_tree_view_column_set_sort_column_id(treeviewcolumn,4);}static voidon_messageUserTree_priority_clicked(GtkTreeViewColumn *treeviewcolumn,				 gpointer user_data) {  dbg_out("Here");  g_assert(treeviewcolumn);  gtk_tree_view_column_set_sort_column_id(treeviewcolumn,5);}static GtkWidget *create_group_menu(GtkWidget *window) {  GtkWidget *menu;  GtkWidget *new_item;  GList *groups,*node;  menu=gtk_menu_new();   groups=get_group_list();  for(node=g_list_first(groups);node;node=g_list_next (node)) {    if (node->data){      dbg_out("Group:%s(%x)\n",node->data,node->data);      new_item=create_menu_item(node->data,node->data,NULL,on_usermenu_group_item);      gtk_menu_append( GTK_MENU(menu), new_item);      GLADE_HOOKUP_OBJECT(new_item,window,"messageWindow");      g_free(node->data);    }  }  g_list_free(groups);  return menu;}voidon_usermenu_group_item (gpointer data){  GtkMenuItem *menuitem=(GtkMenuItem *)data;  GtkWidget *child;  dbg_out("Here:0x%x\n",menuitem);  if (menuitem) {    child=GTK_BIN (menuitem)->child;    if (GTK_IS_LABEL (child)) {        gchar *text;	GtkWidget *window;	GtkWidget *view;	GtkTreeSelection *sel;	GtkTreeModel *model;	GtkTreeIter iter;	gboolean valid;	gchar *groupname;        text=(gchar *)gtk_label_get_text (GTK_LABEL (child));	window=lookup_widget(GTK_WIDGET(menuitem),"messageWindow");        g_assert(window);	view=lookup_widget(window,"messageUserTree");        g_assert(view);	sel=gtk_tree_view_get_selection(GTK_TREE_VIEW(view));	gtk_tree_selection_unselect_all(sel);	model=gtk_tree_view_get_model(GTK_TREE_VIEW(view));	valid=gtk_tree_model_get_iter_first (model,&iter);	while(valid){	  gtk_tree_model_get (model, &iter, 			      USER_VIEW_GROUP_ID, &groupname,			      -1);	  if (!strcmp(groupname,text)) {	    dbg_out("Select:%s\n",groupname);	    sel=gtk_tree_view_get_selection(GTK_TREE_VIEW(view));	    gtk_tree_selection_select_iter(sel,&iter);	  }	  g_free(groupname);	  valid = gtk_tree_model_iter_next (model, &iter);	}      }  }}static GtkWidget *internal_create_view_config_menu(GtkWidget *view){  GtkWidget *menu;  GtkWidget *window;  GtkWidget *selectGroupMenu=NULL;  window=lookup_widget(GTK_WIDGET(view),"messageWindow");  g_assert(window);  menu=create_userlistPopUpMenu ();  selectGroupMenu=lookup_widget(menu,"groupselection");  g_assert(selectGroupMenu);  gtk_menu_item_set_submenu (GTK_MENU_ITEM (selectGroupMenu),create_group_menu(window));    GLADE_HOOKUP_OBJECT_NO_REF (menu, window, "messageWindow");  return menu;}static gbooleanon_message_view_event_button_press_event (GtkWidget       *widget,                                        GdkEventButton  *event,                                        gpointer         user_data){  dbg_out("messageWin: button press: %d\n", event->button);  switch (event->button) {  case 3:    gtk_menu_popup(GTK_MENU(internal_create_view_config_menu(widget)), NULL, NULL, NULL, NULL,		   event->button, event->time);      default:					/* main menu */    return FALSE;    break;  }  return TRUE;}static GtkTreeViewColumn   *create_user_view_column(int id,const char *title, GCallback callback){  GtkTreeViewColumn   *col;  GtkCellRenderer     *renderer;  if ( (id<0) || (id>=MAX_VIEW_ID) || (!title) )    return NULL;  /* --- Column #1 --- */  col = gtk_tree_view_column_new();  gtk_tree_view_column_set_title(col, title);  renderer = gtk_cell_renderer_text_new();  /* pack cell renderer into tree view column */  gtk_tree_view_column_pack_start(col, renderer, TRUE);  /* connect 'text' property of the cell renderer to   *  model column that contains the first name */  gtk_tree_view_column_add_attribute(col, renderer, "text", id);  gtk_tree_view_column_set_resizable (col,TRUE);  gtk_tree_view_column_set_clickable(col,TRUE);  gtk_tree_view_column_set_reorderable(col, TRUE);  g_signal_connect ((gpointer) col, "clicked",                    G_CALLBACK (callback),		    NULL);  HOOKUP_ID(col,id);  return col;}static voiduserview_set_new_view_priority(GtkTreeModel *model,			       GtkTreeIter *iter,			       int prio,			       gboolean need_notify){  int rc;  gchar *ipaddr=NULL;  if ( (prio < USERLIST_PRIO_MIN) ||        (prio > USERLIST_PRIO_MAX) )     return;  dbg_out("Here: prio %d\n",prio);    gtk_tree_model_get(model, iter, 		     USER_VIEW_IPADDR_ID, &ipaddr,		     -1);  g_assert(ipaddr);  userdb_replace_prio_by_addr(ipaddr,prio,need_notify);  g_free(ipaddr);  return;}voidsetup_message_tree_view(GtkWidget *view) {  GtkTreeViewColumn   *col;  GtkCellRenderer     *renderer;  guint state;  GList *cols,*node;  GtkTreeViewColumn  *view_cols[MAX_VIEW_ID];  int col_id;  int i;  state=hostinfo_refer_header_state();  /*   * タイトル設定      */  /* --- Column #1 --- */  col=create_user_view_column(USER_VIEW_NICKNAME_ID, _("User"), G_CALLBACK(on_messageUserTree_user_clicked));  view_cols[USER_VIEW_NICKNAME_ID]=col;  g_assert(GET_ID(col)==USER_VIEW_NICKNAME_ID);    /* --- Column #2 --- */  col=create_user_view_column(USER_VIEW_GROUP_ID, _("Group"), G_CALLBACK(on_messageUserTree_group_clicked));  view_cols[USER_VIEW_GROUP_ID]=col;  g_assert(GET_ID(col)==USER_VIEW_GROUP_ID);  if (state & HEADER_VISUAL_GROUP_ID)    gtk_tree_view_column_set_visible(col,TRUE);  else    gtk_tree_view_column_set_visible(col,FALSE);  /* --- Column #3 --- */  col=create_user_view_column(USER_VIEW_HOST_ID, _("Host"), G_CALLBACK(on_messageUserTree_host_clicked));  view_cols[USER_VIEW_HOST_ID]=col;  g_assert(GET_ID(col)==USER_VIEW_HOST_ID);  if (state & HEADER_VISUAL_HOST_ID)    gtk_tree_view_column_set_visible(col,TRUE);  else    gtk_tree_view_column_set_visible(col,FALSE);  /* --- Column #4 --- */  col=create_user_view_column(USER_VIEW_IPADDR_ID, _("IP Address"), G_CALLBACK(on_messageUserTree_ipaddr_clicked));  view_cols[USER_VIEW_IPADDR_ID]=col;  g_assert(GET_ID(col)==USER_VIEW_IPADDR_ID);  if (state & HEADER_VISUAL_IPADDR_ID)    gtk_tree_view_column_set_visible(col,TRUE);  else    gtk_tree_view_column_set_visible(col,FALSE);  /* --- Column #5 --- */  col=create_user_view_column(USER_VIEW_LOGON_ID, _("LogOn"), G_CALLBACK(on_messageUserTree_logon_clicked));  view_cols[USER_VIEW_LOGON_ID]=col;  g_assert(GET_ID(col)==USER_VIEW_LOGON_ID);  if (state & HEADER_VISUAL_LOGON_ID)    gtk_tree_view_column_set_visible(col,TRUE);  else    gtk_tree_view_column_set_visible(col,FALSE);  /* --- Column #6 --- */  col=create_user_view_column(USER_VIEW_PRIO_ID, _("Priority"), G_CALLBACK(on_messageUserTree_priority_clicked));  view_cols[USER_VIEW_PRIO_ID]=col;  g_assert(GET_ID(col)==USER_VIEW_PRIO_ID);  if (state & HEADER_VISUAL_PRIO_ID)    gtk_tree_view_column_set_visible(col,TRUE);  else    gtk_tree_view_column_set_visible(col,FALSE);  /* Append all columns  */  for(i=0;i<MAX_VIEW_ID;++i) {    if (!hostinfo_get_header_order(i,&col_id)) {      dbg_out("append:%d->%d\n",i,col_id);      gtk_tree_view_append_column(GTK_TREE_VIEW(view), view_cols[col_id]);    }  }  gtk_signal_connect (GTK_OBJECT (view), "button_press_event",		      GTK_SIGNAL_FUNC (on_message_view_event_button_press_event),		      NULL);}voidupdate_user_entry(GList *top,GtkWidget *view,gboolean is_forced) {  GtkListStore        *liststore;  GtkTreeIter         toplevel;  GtkWidget *usersEntry;  GtkTreeViewColumn   *col=NULL;  userdb_t *current_user;  int i;  int users_count=0;  gchar num_str[32];  int prio;  guint state;  int id;  if ( (!top) || (!view) )    return;  state=hostinfo_refer_header_state();  release_user_entry(GTK_TREE_VIEW(view));  liststore = gtk_list_store_new(MAX_VIEW_ID,                                 G_TYPE_STRING,                                 G_TYPE_STRING,                                 G_TYPE_STRING,                                 G_TYPE_STRING,                                 G_TYPE_STRING,				 G_TYPE_STRING);  for(i=0;(current_user=g_list_nth_data(top,i));++i) {    g_assert(current_user);        dbg_out("Update\n");    dbg_out("NickName: %s\n",current_user->nickname);    dbg_out("Group: %s\n",current_user->group);    dbg_out("User: %s\n",current_user->user);    dbg_out("Host: %s\n",current_user->host);    dbg_out("IP Addr: %s\n",current_user->ipaddr);    dbg_out("Priority: %d\n",current_user->prio);    prio=current_user->prio;    memset(num_str,0,32);    if (prio>0)      snprintf(num_str,31,"%d",prio);    else      snprintf(num_str,31,"-");    num_str[31]='\0';    if ( (prio>=0) || (is_forced) ){      /* Append a top level row and leave it empty */      gtk_list_store_append(liststore, &toplevel);      gtk_list_store_set(liststore, &toplevel,			 USER_VIEW_NICKNAME_ID, current_user->nickname,			 USER_VIEW_GROUP_ID,current_user->group,			 USER_VIEW_HOST_ID,current_user->host,			 USER_VIEW_IPADDR_ID,current_user->ipaddr,			 USER_VIEW_LOGON_ID,current_user->user,			 USER_VIEW_PRIO_ID,num_str,			 -1);    }    ++users_count;    fflush(stdout);  }  gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(liststore));  g_object_unref(liststore); /* destroy model automatically with view */  gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)),                             GTK_SELECTION_MULTIPLE );  /*   * ユーザ数更新   */  usersEntry=lookup_widget(GTK_WIDGET(view),"messageWinUsersEntry");  g_assert(usersEntry);  snprintf(num_str,31,"%d",users_count);  gtk_entry_set_text(GTK_ENTRY(usersEntry), num_str);#if GTK_CHECK_VERSION(2,10,0)  gtk_tree_view_set_rubber_banding (GTK_TREE_VIEW(view),TRUE);  if (GTK_WIDGET_REALIZED(view)) {#if GTK_CHECK_VERSION(2,10,6)    gtk_tree_view_set_enable_tree_lines(GTK_TREE_VIEW(view),TRUE);    if (state & HEADER_VISUAL_GRID_ID)      gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(view),GTK_TREE_VIEW_GRID_LINES_BOTH);#endif  }#endif  return;}voidipmsg_update_ui(void){  while (gtk_events_pending ())    gtk_main_iteration ();}voidipmsg_update_ui_user_list(void){  userdb_invalidate_userdb();  ipmsg_send_br_entry(udp_con,0);}voiduserview_set_view_priority(GtkTreeModel *model,	       GtkTreePath *path,	       GtkTreeIter *iter,	       int prio){  userview_set_new_view_priority(model, iter, prio, TRUE);  return;}voiduserview_set_view_priority_without_update(GtkTreeModel *model,					  GtkTreePath *path, 					  GtkTreeIter *iter,					  int prio){  /* path はNULLになりうることに注意(on_set_all_as_default_activate 参照) */  userview_set_new_view_priority(model, iter, prio, FALSE);  return;}intremind_headers_state(GtkWidget *window){  GtkWidget *view;  GList *cols,*node;  int count;  GtkTreeViewColumn *col;  dbg_out("here\n");  g_assert(window);  view=lookup_widget(GTK_WIDGET(window),"messageUserTree");  cols=gtk_tree_view_get_columns(GTK_TREE_VIEW(view));    for(node=g_list_first(cols),count=0;node;node=g_list_next (node),++count) {    g_assert(node->data);    col=node->data;    dbg_out("%d : %d\n",count,GET_ID(col));    hostinfo_set_ipmsg_header_order(count,GET_ID(col));  }  return 0;}

⌨️ 快捷键说明

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