void expr_name_unref (GnmNamedExpr *nexpr) { g_return_if_fail (nexpr != NULL); if (nexpr->ref_count-- > 1) return; if (gnm_debug_flag ("names")) g_printerr ("Finalizing name %s\n", nexpr->name->str); g_return_if_fail (nexpr->scope == NULL); if (nexpr->name) { go_string_unref (nexpr->name); nexpr->name = NULL; } if (nexpr->texpr != NULL) expr_name_set_expr (nexpr, NULL); if (nexpr->dependents != NULL) { g_hash_table_destroy (nexpr->dependents); nexpr->dependents = NULL; } nexpr->pos.wb = NULL; nexpr->pos.sheet = NULL; g_free (nexpr); }
static void resize_columns (Sheet *sheet) { GnmRange r; if (gnm_debug_flag ("stf")) g_printerr ("Auto-fitting columns...\n"); /* If we have lots of rows, auto-fitting will take a very long time. It is probably better to look at only, say, 1000 rows of data. */ range_init_full_sheet (&r, sheet); r.end.row = MIN (r.end.row, 1000); colrow_autofit (sheet, &r, TRUE, TRUE, /* Ignore strings */ TRUE, /* Don't shrink */ TRUE, /* Don't shrink */ NULL, NULL); if (gnm_debug_flag ("stf")) g_printerr ("Auto-fitting columns... done\n"); sheet_queue_respan (sheet, 0, gnm_sheet_get_last_row (sheet)); }
/** * expr_name_remove : * @nexpr : * * Remove a @nexpr from its container and deactivate it. * NOTE : @nexpr may continue to exist if things still have references to it, * but they will evaluate to #REF! **/ void expr_name_remove (GnmNamedExpr *nexpr) { g_return_if_fail (nexpr != NULL); g_return_if_fail (nexpr->scope != NULL); if (gnm_debug_flag ("names")) { g_printerr ("Removing name %s from its container%s\n", nexpr->name->str, nexpr->is_placeholder ? " as a placeholder" : ""); } g_hash_table_remove ( nexpr->is_placeholder ? nexpr->scope->placeholders : nexpr->scope->names, nexpr->name->str); }
static void walk_resource_path (const char *path, int level, int size) { char **children = g_resources_enumerate_children (path, 0, NULL); int i; if (!children) return; for (i = 0; children[i]; i++) { const char *child = children[i]; char *subpath; GBytes *data; if (level == 0) { size = atol (child); if (size <= 0) continue; } subpath = g_build_path ("/", path, child, NULL); data = g_resources_lookup_data (subpath, 0, NULL); if (data) { GdkPixbuf *pixbuf = gdk_pixbuf_new_from_resource (subpath, NULL); if (pixbuf && size > 0 && strchr (child, '.')) { char *iconname = g_strdup (child); strchr(iconname, '.')[0] = 0; if (gnm_debug_flag ("icons")) g_printerr ("Defining icon %s at size %d\n", iconname, size); gtk_icon_theme_add_builtin_icon (iconname, size, pixbuf); g_object_unref (pixbuf); g_free (iconname); } g_bytes_unref (data); } else walk_resource_path (subpath, level + 1, size); g_free (subpath); } g_strfreev (children); }
static void gnm_named_expr_collection_insert (GnmNamedExprCollection *scope, GnmNamedExpr *nexpr) { if (gnm_debug_flag ("names")) { char *scope_name = nexpr->pos.sheet ? g_strdup_printf ("sheet %s", nexpr->pos.sheet->name_quoted) : g_strdup ("workbook"); g_printerr ("Inserting name %s into its %s container%s\n", nexpr->name->str, scope_name, nexpr->is_placeholder ? " as a placeholder" : ""); g_free (scope_name); } /* name can be active at this point, eg we are converting a * placeholder, or changing a scope */ nexpr->scope = scope; g_hash_table_replace (nexpr->is_placeholder ? scope->placeholders : scope->names, (gpointer)nexpr->name->str, nexpr); }
/** * expr_name_new : * * Creates a new name without linking it into any container. **/ GnmNamedExpr * expr_name_new (char const *name) { GnmNamedExpr *nexpr; g_return_val_if_fail (name != NULL, NULL); nexpr = g_new0 (GnmNamedExpr,1); nexpr->ref_count = 1; nexpr->name = go_string_new (name); nexpr->texpr = NULL; nexpr->dependents = NULL; nexpr->is_placeholder = TRUE; nexpr->is_hidden = FALSE; nexpr->is_permanent = FALSE; nexpr->is_editable = TRUE; nexpr->scope = NULL; if (gnm_debug_flag ("names")) g_printerr ("Created new name %s\n", name); return nexpr; }
int main (int argc, char const **argv) { gboolean opened_workbook = FALSE; gboolean with_gui; GOIOContext *ioc; WorkbookView *wbv; GSList *wbcgs_to_kill = NULL; GOCmdContext *cc; #ifdef G_OS_WIN32 gboolean has_console; #endif /* No code before here, we need to init threads */ argv = gnm_pre_parse_init (argc, argv); /* * Attempt to disable Ubuntu's funky, non-working scroll * bars. This needs to be done before gtk starts loading * modules. Note: the following call will not replace * an existing setting, so you can run with =1 if you like. */ g_setenv ("LIBOVERLAY_SCROLLBAR", "0", FALSE); #ifdef G_OS_WIN32 has_console = FALSE; { typedef BOOL (CALLBACK* LPFNATTACHCONSOLE)(DWORD); LPFNATTACHCONSOLE MyAttachConsole; HMODULE hmod; if ((hmod = GetModuleHandle("kernel32.dll"))) { MyAttachConsole = (LPFNATTACHCONSOLE) GetProcAddress(hmod, "AttachConsole"); if (MyAttachConsole && MyAttachConsole(ATTACH_PARENT_PROCESS)) { freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); dup2(fileno(stdout), 1); dup2(fileno(stderr), 2); has_console = TRUE; } } } #endif gnumeric_arg_parse (argc, (char **)argv); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); bind_textdomain_codeset (GETTEXT_PACKAGE "-functions", "UTF-8"); with_gui = !func_def_file && !func_state_file && !split_funcdocs; if (with_gui) { gnm_session_init (argv[0]); } gnm_init (); /* These are useful for the build process only. */ if (func_state_file) return gnm_dump_func_defs (func_state_file, 0); if (func_def_file) return gnm_dump_func_defs (func_def_file, 1); if (split_funcdocs) return gnm_dump_func_defs (NULL, 2); if (ext_refs_file) return gnm_dump_func_defs (ext_refs_file, 4); if (with_gui) { go_component_set_default_command_context (cc = cmd_context_stderr_new ()); g_object_unref (cc); cc = g_object_new (GNM_TYPE_IO_CONTEXT_GTK, "show-splash", !gnumeric_no_splash, "show-warnings", !gnumeric_no_warnings, NULL); ioc = GO_IO_CONTEXT (g_object_ref (cc)); handle_paint_events (); pathetic_qt_workaround (); } else { /* TODO: Make this inconsistency go away */ cc = cmd_context_stderr_new (); ioc = go_io_context_new (cc); go_component_set_default_command_context (cc); } /* Keep in sync with .desktop file */ g_set_application_name (_("Gnumeric Spreadsheet")); gnm_plugins_init (GO_CMD_CONTEXT (ioc)); if (startup_files) { int i; for (i = 0; startup_files [i]; i++) ; go_io_context_set_num_files (ioc, i); for (i = 0; startup_files [i] && !initial_workbook_open_complete; i++) { char *uri = go_shell_arg_to_uri (startup_files[i]); if (uri == NULL) { g_warning ("Ignoring invalid URI."); continue; } go_io_context_processing_file (ioc, uri); wbv = workbook_view_new_from_uri (uri, NULL, ioc, NULL); g_free (uri); if (go_io_error_occurred (ioc) || go_io_warning_occurred (ioc)) { go_io_error_display (ioc); go_io_error_clear (ioc); } if (wbv != NULL) { WBCGtk *wbcg; workbook_update_history (wb_view_get_workbook (wbv), GNM_FILE_SAVE_AS_STYLE_SAVE); wbcg = wbc_gtk_new (wbv, NULL, NULL, geometry); geometry = NULL; sheet_update (wb_view_cur_sheet (wbv)); opened_workbook = TRUE; gnm_io_context_gtk_set_transient_for (GNM_IO_CONTEXT_GTK (ioc), wbcg_toplevel (wbcg)); if (immediate_exit_flag) wbcgs_to_kill = g_slist_prepend (wbcgs_to_kill, wbcg); } /* cheesy attempt to keep the ui from freezing during load */ handle_paint_events (); if (gnm_io_context_gtk_get_interrupted (GNM_IO_CONTEXT_GTK (ioc))) break; /* Don't load any more workbooks */ } } g_object_unref (cc); cc = NULL; /* FIXME: Maybe we should quit here if we were asked to open files and failed to do so. */ /* If we were intentionally short circuited exit now */ if (!initial_workbook_open_complete) { initial_workbook_open_complete = TRUE; if (!opened_workbook) { gint n_of_sheets = gnm_conf_get_core_workbook_n_sheet (); wbc_gtk_new (NULL, workbook_new_with_sheets (n_of_sheets), NULL, geometry); } if (immediate_exit_flag) { GSList *l; for (l = wbcgs_to_kill; l; l = l->next) g_idle_add ((GSourceFunc)cb_kill_wbcg, l->data); } g_signal_connect (gnm_app_get_app (), "workbook_removed", G_CALLBACK (cb_workbook_removed), NULL); gnm_io_context_gtk_discharge_splash (GNM_IO_CONTEXT_GTK (ioc)); g_object_unref (ioc); g_idle_add ((GSourceFunc)pathetic_qt_workaround, NULL); gtk_main (); } else { g_object_unref (ioc); g_slist_foreach (wbcgs_to_kill, (GFunc)cb_kill_wbcg, NULL); } g_slist_free (wbcgs_to_kill); gnumeric_arg_shutdown (); store_plugin_state (); gnm_shutdown (); #if defined(G_OS_WIN32) if (has_console) { close(1); close(2); FreeConsole(); } #endif gnm_pre_parse_shutdown (); go_component_set_default_command_context (NULL); /* * This helps finding leaks. We might want it in developent * only. */ if (with_gui && gnm_debug_flag ("close-displays")) { GSList *displays; gdk_flush(); while (g_main_context_iteration (NULL, FALSE)) ;/* nothing */ displays = gdk_display_manager_list_displays (gdk_display_manager_get ()); g_slist_foreach (displays, (GFunc)gdk_display_close, NULL); g_slist_free (displays); } return 0; }