sgtk-util.c

来自「linux下网络收音机的源码」· C语言 代码 · 共 368 行

C
368
字号
/* * Copyright (c) 2003, 2004 Jean-Yves Lefort * All rights reserved. * * 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. * 3. Neither the name of Jean-Yves Lefort nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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. */#include "config.h"#include <glib/gi18n.h>#include <gtk/gtk.h>#include "sgtk-util.h"/*** cpp *********************************************************************/#define COUNT_KEY		"sgtk-tree-model-count"#define COUNTABLE_KEY		"sgtk-tree-model-countable"#define MENU_KEY		"sgtk-widget-menu"#define NEXT_WIDGET_KEY		"sgtk-entry-next-widget"/*** type definitions ********************************************************/typedef struct{  int *width;  int *height;} LinkWindowInfo;/*** function declarations ***************************************************/static void sgtk_entry_activate_h (GtkEntry *entry, gpointer data);static gboolean sgtk_widget_popup_menu_h (GtkWidget *widget,					  gpointer user_data);static gboolean sgtk_widget_button_press_event_h (GtkWidget *widget,						  GdkEventButton *event,						  gpointer user_data);static void sgtk_tree_model_set_count (GtkTreeModel *model, unsigned int count);static void sgtk_tree_model_row_inserted_h (GtkTreeModel *model,					    GtkTreePath *arg1,					    GtkTreeIter *arg2,					    gpointer user_data);static void sgtk_tree_model_row_deleted_h (GtkTreeModel *model,					   GtkTreePath *arg1,					   gpointer user_data);static gboolean sgtk_window_link_size_event_configure_h (GtkWidget *widget,							 GdkEventConfigure *event,							 gpointer user_data);/*** implementation **********************************************************/voidsgtk_flush (void){  while (gtk_events_pending())    gtk_main_iteration();}char *sgtk_translate_func (const char *path, gpointer data){  return _(path);}GdkPixbuf *sgtk_pixbuf_scale (GdkPixbuf *pixbuf, GtkIconSize size){  int width;  int height;  gboolean status;  g_return_val_if_fail(GDK_IS_PIXBUF(pixbuf), NULL);  status = gtk_icon_size_lookup(size, &width, &height);  g_return_val_if_fail(status == TRUE, NULL);  return gdk_pixbuf_scale_simple(pixbuf, width, height, GDK_INTERP_BILINEAR);}voidsgtk_entry_set_next_widget (GtkEntry *entry, GtkWidget *next){  g_return_if_fail(GTK_IS_ENTRY(entry));  g_return_if_fail(GTK_IS_WIDGET(next));  g_return_if_fail((GtkWidget *) entry != next);  g_object_set_data(G_OBJECT(entry), NEXT_WIDGET_KEY, next);  g_signal_connect(entry, "activate", G_CALLBACK(sgtk_entry_activate_h), next);}static voidsgtk_entry_activate_h (GtkEntry *entry, gpointer user_data){  GtkWidget *next = user_data;  while (! GTK_WIDGET_IS_SENSITIVE(next))    {      next = g_object_get_data(G_OBJECT(next), NEXT_WIDGET_KEY);      if (! next || next == (GtkWidget *) entry)	return;    }  gtk_widget_grab_focus(next);}voidsgtk_widget_set_popup_menu (GtkWidget *widget, GtkMenu *menu){  GtkMenu *old_menu;  g_return_if_fail(GTK_IS_WIDGET(widget));  old_menu = g_object_get_data(G_OBJECT(widget), MENU_KEY);  if (old_menu)    g_object_disconnect(widget,			"any-signal", sgtk_widget_popup_menu_h, old_menu,			"any-signal", sgtk_widget_button_press_event_h, old_menu,			NULL);  g_object_set_data(G_OBJECT(widget), MENU_KEY, menu);  if (menu)    g_object_connect(widget,		     "signal::popup-menu", sgtk_widget_popup_menu_h, menu,		     "signal::button-press-event", sgtk_widget_button_press_event_h, menu,		     NULL);}static gbooleansgtk_widget_popup_menu_h (GtkWidget *widget, gpointer user_data){  GtkMenu *menu = user_data;  gtk_menu_popup(menu, NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time());    return TRUE;			/* a menu was activated */}static gbooleansgtk_widget_button_press_event_h (GtkWidget *widget,				  GdkEventButton *event,				  gpointer user_data){  if (event->button == 3 && event->type == GDK_BUTTON_PRESS)    {      GtkMenu *menu = user_data;      gtk_menu_popup(menu,		     NULL,		     NULL,		     NULL,		     NULL,		     event->button,		     event->time);    }  return FALSE;			/* propagate event */}voidsgtk_tree_model_make_countable (GtkTreeModel *model){  g_return_if_fail(GTK_IS_TREE_MODEL(model));    g_object_set_data(G_OBJECT(model), COUNTABLE_KEY, GINT_TO_POINTER(TRUE));  g_object_connect(model,		   "signal::row-inserted", sgtk_tree_model_row_inserted_h, NULL,		   "signal::row-deleted", sgtk_tree_model_row_deleted_h, NULL,		   NULL);}gbooleansgtk_tree_model_is_countable (GtkTreeModel *model){  g_return_val_if_fail(GTK_IS_TREE_MODEL(model), FALSE);  return GPOINTER_TO_INT(g_object_get_data(G_OBJECT(model), COUNTABLE_KEY));}static voidsgtk_tree_model_set_count (GtkTreeModel *model, unsigned int count){  g_return_if_fail(GTK_IS_TREE_MODEL(model));  g_object_set_data(G_OBJECT(model), COUNT_KEY, GUINT_TO_POINTER(count));}unsigned intsgtk_tree_model_get_count (GtkTreeModel *model){  g_return_val_if_fail(GTK_IS_TREE_MODEL(model), 0);  g_return_val_if_fail(sgtk_tree_model_is_countable(model), 0);  return GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(model), COUNT_KEY));}static voidsgtk_tree_model_row_inserted_h (GtkTreeModel *model,				GtkTreePath *arg1,				GtkTreeIter *arg2,				gpointer user_data){  sgtk_tree_model_set_count(model, sgtk_tree_model_get_count(model) + 1);}static voidsgtk_tree_model_row_deleted_h (GtkTreeModel *model,			       GtkTreePath *arg1,			       gpointer user_data){  sgtk_tree_model_set_count(model, sgtk_tree_model_get_count(model) - 1);}gbooleansgtk_tree_model_get_iter_last (GtkTreeModel *model, GtkTreeIter *iter){  gboolean status;  gboolean valid;  GtkTreeIter tmp_iter;  g_return_val_if_fail(GTK_IS_TREE_MODEL(model), FALSE);  g_return_val_if_fail(iter != NULL, FALSE);  status = valid = gtk_tree_model_get_iter_first(model, &tmp_iter);  while (valid)    {      *iter = tmp_iter;      valid = gtk_tree_model_iter_next(model, &tmp_iter);    }  return status;}gbooleansgtk_tree_model_iter_prev (GtkTreeModel *model, GtkTreeIter *iter){  GtkTreePath *path;  gboolean status;  g_return_val_if_fail(GTK_IS_TREE_MODEL(model), FALSE);  g_return_val_if_fail(iter != NULL, FALSE);    path = gtk_tree_model_get_path(model, iter);  status = gtk_tree_path_prev(path);  if (status)    {      status = gtk_tree_model_get_iter(model, iter, path);      g_return_val_if_fail(status == TRUE, FALSE);    }  gtk_tree_path_free(path);  return status;}gbooleansgtk_tree_model_iter_move (GtkTreeModel *model,			   GtkTreeIter *iter,			   sGtkDirection direction){  g_return_val_if_fail(GTK_IS_TREE_MODEL(model), FALSE);  g_return_val_if_fail(iter != NULL, FALSE);    switch (direction)    {    case SGTK_PREVIOUS:      return sgtk_tree_model_iter_prev(model, iter);    case SGTK_NEXT:      return gtk_tree_model_iter_next(model, iter);    default:      g_return_val_if_reached(FALSE);    }}voidsgtk_accel_map_add_entry (const char *accel_path, const char *accelerator){  unsigned int key;  GdkModifierType mods;  g_return_if_fail(accel_path != NULL);  g_return_if_fail(accelerator != NULL);  gtk_accelerator_parse(accelerator, &key, &mods);  gtk_accel_map_add_entry(accel_path, key, mods);}gbooleansgtk_accel_map_change_entry (const char *accel_path,			     const char *accelerator,			     gboolean replace){  unsigned int key;  GdkModifierType mods;  g_return_val_if_fail(accel_path != NULL, FALSE);  g_return_val_if_fail(accelerator != NULL, FALSE);  gtk_accelerator_parse(accelerator, &key, &mods);  return gtk_accel_map_change_entry(accel_path, key, mods, replace);}voidsgtk_window_link_size (GtkWindow *window, int *width, int *height){  LinkWindowInfo *info;  g_return_if_fail(GTK_IS_WINDOW(window));  gtk_window_set_default_size(GTK_WINDOW(window),			      width ? *width : -1,			      height ? *height : -1);  info = g_new(LinkWindowInfo, 1);  info->width = width;  info->height = height;  g_signal_connect_data(window,			"configure-event",			G_CALLBACK(sgtk_window_link_size_event_configure_h),			info,			(GClosureNotify) g_free,			0);}static gbooleansgtk_window_link_size_event_configure_h (GtkWidget *widget,					 GdkEventConfigure *event,					 gpointer user_data){  LinkWindowInfo *info = user_data;  if (info->width)    *info->width = event->width;  if (info->height)    *info->height = event->height;  return FALSE;			/* propagate event */}

⌨️ 快捷键说明

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