void NumericalEntry::get_preferred_width_vfunc(int &minimum_width, int &natural_width) const { Glib::RefPtr<Gtk::StyleContext> style_context = get_style_context(); Glib::RefPtr<const Pango::Layout> layout = get_layout(); Glib::RefPtr<Pango::Layout> layout_copy = Pango::Layout::create(layout->get_context()); // measure width of a string containing the upper value string upper_str = format_for_value(_adjustment->get_upper()); int upper_width = measure_string_width(layout_copy, upper_str); int width = max(upper_width, MIN_WIDTH); // measure width of a string containing the lower value string lower_str = format_for_value(_adjustment->get_lower()); int lower_width = measure_string_width(layout_copy, lower_str); width = max(width, lower_width); // add borders Gtk::Border border = style_context->get_border(); width += border.get_left() + border.get_right(); // add paddings Gtk::Border padding = style_context->get_padding(); width += padding.get_left() + padding.get_right(); minimum_width = width; natural_width = width; }
static void bt_sighandler (int sig, siginfo_t *info, gpointer data) { void *trace[35]; char **messages = (char **) NULL; int i, trace_size = 0; g_print ("Got signal %d\n", sig); /* Do something useful with siginfo_t */ if (sig == SIGSEGV) { g_printerr ("Got signal %d, faulty address is %p\n", sig, (gpointer) info->si_addr); } else if (sig == SIGKILL || sig == SIGINT) { /* since we connect to a signal handler, asynchronous management might */ /* might happen so we need to set an idle handler to exit the main loop */ /* in the mainloop context. */ Glib::RefPtr<Glib::IdleSource> idle_source = Glib::IdleSource::create (); idle_source->connect (sigc::ptr_fun (&quit_loop) ); idle_source->attach (loop->get_context() ); return; } trace_size = backtrace (trace, 35); /* overwrite sigaction with caller's address */ messages = backtrace_symbols (trace, trace_size); /* skip first stack frame (points here) */ g_print ("\t[bt] Execution path:\n"); for (i = 1; i < trace_size; ++i) { g_print ("\t[bt] #%d %s\n", i, messages[i]); char syscom[256]; gchar **strs; const gchar *exe; strs = g_strsplit (messages[i], "(", 2); if (strs[1] == NULL) { exe = getExecutableName (); } else { exe = strs[0]; } sprintf (syscom, "echo -n \"\t[bt]\t\t\"; addr2line %p -s -e %s", trace[i], exe); g_strfreev (strs); if (system (syscom) == -1) { g_printerr ("Error calling addr2line\n"); } } if (sig == SIGPIPE) { GST_DEBUG ("Ignore sigpipe"); } else { exit (sig); } }