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

📄 swfdec_debug_stack.c

📁 Swfdec still is development software, but has also followed a rigid no-crashes-allowed policy. I b
💻 C
字号:
/* Swfdec * Copyright (C) 2006 Benjamin Otte <otte@gnome.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. *  * This library 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 * Lesser General Public License for more details. *  * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor,  * Boston, MA  02110-1301  USA */#ifdef HAVE_CONFIG_H#include "config.h"#endif#include <libswfdec/swfdec_js.h>#include <libswfdec/js/jsdbgapi.h>#include <libswfdec/js/jsinterp.h>#include "swfdec_debug_stack.h"G_DEFINE_TYPE (SwfdecDebugStack, swfdec_debug_stack, GTK_TYPE_TREE_VIEW)enum {  COLUMN_LINE,  COLUMN_TYPE,  COLUMN_CONTENT,  N_COLUMNS};static const char *swfdec_get_jsval_type (JSContext *cx, jsval val){  if (JSVAL_IS_VOID (val))    return "undefined";  if (JSVAL_IS_NULL (val))    return "null";  if (JSVAL_IS_INT (val))    return "Integer";  if (JSVAL_IS_DOUBLE (val))    return "Double";  if (JSVAL_IS_BOOLEAN (val))    return "Boolean";  if (JSVAL_IS_STRING (val))    return "String";  g_assert (JSVAL_IS_OBJECT (val));  return JS_GetClass (JSVAL_TO_OBJECT (val))->name;}static voidswfdec_debug_stack_set_model (SwfdecDebugStack *debug){  JSStackFrame *frame = NULL;  guint i, min, max;  GtkListStore *store = gtk_list_store_new (N_COLUMNS, G_TYPE_UINT,       G_TYPE_STRING, G_TYPE_STRING);  GtkTreeIter iter;  JS_FrameIterator (debug->manager->player->jscx, &frame);  min = 1;  max = frame->sp - frame->spbase;  for (i = min; i <= max; i++) {    const char *s = swfdec_js_to_string (debug->manager->player->jscx, frame->sp[-i]);    gtk_list_store_append (store, &iter);    gtk_list_store_set (store, &iter, COLUMN_LINE, i,       COLUMN_TYPE, swfdec_get_jsval_type (debug->manager->player->jscx, frame->sp[-i]),      COLUMN_CONTENT, s, -1);  }  gtk_tree_view_set_model (GTK_TREE_VIEW (debug), GTK_TREE_MODEL (store));  g_object_unref (store);}static voidupdate_stack_cb (SwfdecPlayerManager *manager, GParamSpec *pspec, SwfdecDebugStack *debug){  if (swfdec_player_manager_get_interrupted (manager))    swfdec_debug_stack_set_model (debug);  else    gtk_tree_view_set_model (GTK_TREE_VIEW (debug), NULL);}static voidswfdec_debug_stack_set_manager (SwfdecDebugStack *debug, SwfdecPlayerManager *manager){  if (debug->manager) {    g_signal_handlers_disconnect_by_func (debug->manager, update_stack_cb, debug);    g_object_unref (debug->manager);  }  debug->manager = manager;  if (manager) {    g_object_ref (debug->manager);    g_signal_connect (manager, "notify::interrupted", G_CALLBACK (update_stack_cb), debug);    update_stack_cb (manager, NULL, debug);  } else {    gtk_tree_view_set_model (GTK_TREE_VIEW (debug), NULL);  }}static voidswfdec_debug_stack_dispose (GObject *object){  SwfdecDebugStack *debug = SWFDEC_DEBUG_STACK (object);  swfdec_debug_stack_set_manager (debug, NULL);  G_OBJECT_CLASS (swfdec_debug_stack_parent_class)->dispose (object);}static voidswfdec_debug_stack_class_init (SwfdecDebugStackClass * g_class){  GObjectClass *object_class = G_OBJECT_CLASS (g_class);  object_class->dispose = swfdec_debug_stack_dispose;}static voidswfdec_debug_stack_init (SwfdecDebugStack * debug){}static voidswfdec_debug_stack_add_columns (GtkTreeView *treeview){  GtkTreeViewColumn *column;  GtkCellRenderer *renderer;  renderer = gtk_cell_renderer_text_new ();  column = gtk_tree_view_column_new_with_attributes ("Depth", renderer,    "text", COLUMN_LINE, NULL);  gtk_tree_view_column_set_sort_column_id (column, COLUMN_LINE);  gtk_tree_view_column_set_resizable (column, TRUE);  gtk_tree_view_append_column (treeview, column);  renderer = gtk_cell_renderer_text_new ();  column = gtk_tree_view_column_new_with_attributes ("Type", renderer,    "text", COLUMN_TYPE, NULL);  gtk_tree_view_column_set_sort_column_id (column, COLUMN_TYPE);  gtk_tree_view_column_set_resizable (column, TRUE);  gtk_tree_view_append_column (treeview, column);  renderer = gtk_cell_renderer_text_new ();  column = gtk_tree_view_column_new_with_attributes ("Content", renderer,    "text", COLUMN_CONTENT, NULL);  gtk_tree_view_column_set_sort_column_id (column, COLUMN_CONTENT);  gtk_tree_view_column_set_resizable (column, TRUE);  gtk_tree_view_append_column (treeview, column);}GtkWidget *swfdec_debug_stack_new (SwfdecPlayerManager *manager){  SwfdecDebugStack *debug;    g_return_val_if_fail (SWFDEC_IS_PLAYER_MANAGER (manager), NULL);  debug = g_object_new (SWFDEC_TYPE_DEBUG_STACK, 0);  swfdec_debug_stack_add_columns (GTK_TREE_VIEW (debug));  swfdec_debug_stack_set_manager (debug, manager);  return GTK_WIDGET (debug);}

⌨️ 快捷键说明

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