static void chartable_sync_active_char (GtkWidget *widget, GParamSpec *pspec, MucharmapCharmap *charmap) { MucharmapCharmapPrivate *priv = charmap->priv; GString *gs; const gchar *temp; const gchar **temps; gint i; gunichar wc; wc = mucharmap_chartable_get_active_character (priv->chartable); /* Forward the notification */ g_object_notify (G_OBJECT (charmap), "active-character"); if (priv->active_page == MUCHARMAP_CHARMAP_PAGE_DETAILS) set_details (charmap, wc); gs = g_string_sized_new (256); g_string_append_printf (gs, "U+%4.4X %s", wc, mucharmap_get_unicode_name (wc)); #if ENABLE_UNIHAN temp = mucharmap_get_unicode_kDefinition (wc); if (temp) g_string_append_printf (gs, " %s", temp); #endif temps = mucharmap_get_nameslist_equals (wc); if (temps) { g_string_append_printf (gs, " = %s", temps[0]); for (i = 1; temps[i]; i++) g_string_append_printf (gs, "; %s", temps[i]); g_free (temps); } temps = mucharmap_get_nameslist_stars (wc); if (temps) { g_string_append_printf (gs, " • %s", temps[0]); for (i = 1; temps[i]; i++) g_string_append_printf (gs, "; %s", temps[i]); g_free (temps); } chartable_status_message (charmap, gs->str); g_string_free (gs, TRUE); }
/* makes a nice string and makes it a link to the character */ static void insert_codepoint (MucharmapCharmap *charmap, GtkTextBuffer *buffer, GtkTextIter *iter, gunichar uc) { gchar *str; GtkTextTag *tag; str = g_strdup_printf ("U+%4.4X %s", uc, mucharmap_get_unicode_name (uc)); tag = gtk_text_buffer_create_tag (buffer, NULL, "foreground", "blue", "underline", PANGO_UNDERLINE_SINGLE, NULL); /* add one so that zero is the "nothing" value, since U+0000 is a character */ g_object_set_data (G_OBJECT (tag), "link-character", GUINT_TO_POINTER (uc + 1)); gtk_text_buffer_insert_with_tags (buffer, iter, str, -1, tag, NULL); g_free (str); }
static void set_details (MucharmapCharmap *charmap, gunichar uc) { MucharmapCharmapPrivate *priv = charmap->priv; GtkTextBuffer *buffer; GtkTextIter iter; GString *gstemp; gchar *temp; const gchar *csp; gchar buf[12]; guchar utf8[7]; gint n, i; const gchar **csarr; gunichar *ucs; gunichar2 *utf16; MucharmapUnicodeVersion version; buffer = gtk_text_view_get_buffer (priv->details_view); gtk_text_buffer_set_text (buffer, "", 0); gtk_text_buffer_get_start_iter (buffer, &iter); gtk_text_buffer_place_cursor (buffer, &iter); gtk_text_buffer_insert (buffer, &iter, "\n", -1); n = mucharmap_unichar_to_printable_utf8 (uc, buf); if (n == 0) gtk_text_buffer_insert ( buffer, &iter, _("[not a printable character]"), -1); else gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, buf, n, "gimongous", NULL); gtk_text_buffer_insert (buffer, &iter, "\n\n", -1); /* character name */ temp = g_strdup_printf ("U+%4.4X %s\n", uc, mucharmap_get_unicode_name (uc)); gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, temp, -1, "big", "bold", NULL); g_free (temp); insert_heading (charmap, buffer, &iter, _("General Character Properties")); /* Unicode version */ version = mucharmap_get_unicode_version (uc); if (version != MUCHARMAP_UNICODE_VERSION_UNASSIGNED) insert_vanilla_detail (charmap, buffer, &iter, _("In Unicode since:"), mucharmap_unicode_version_to_string (version)); /* character category */ insert_vanilla_detail (charmap, buffer, &iter, _("Unicode category:"), mucharmap_get_unicode_category_name (uc)); /* canonical decomposition */ conditionally_insert_canonical_decomposition (charmap, buffer, &iter, uc); /* representations */ if (g_unichar_break_type(uc) != G_UNICODE_BREAK_SURROGATE) { insert_heading (charmap, buffer, &iter, _("Various Useful Representations")); n = g_unichar_to_utf8 (uc, (gchar *)utf8); utf16 = g_ucs4_to_utf16 (&uc, 1, NULL, NULL, NULL); /* UTF-8 */ gstemp = g_string_new (NULL); for (i = 0; i < n; i++) g_string_append_printf (gstemp, "0x%2.2X ", utf8[i]); g_string_erase (gstemp, gstemp->len - 1, -1); insert_vanilla_detail (charmap, buffer, &iter, _("UTF-8:"), gstemp->str); g_string_free (gstemp, TRUE); /* UTF-16 */ gstemp = g_string_new (NULL); g_string_append_printf (gstemp, "0x%4.4X", utf16[0]); if (utf16[0] != '\0' && utf16[1] != '\0') g_string_append_printf (gstemp, " 0x%4.4X", utf16[1]); insert_vanilla_detail (charmap, buffer, &iter, _("UTF-16:"), gstemp->str); g_string_free (gstemp, TRUE); /* an empty line */ gtk_text_buffer_insert (buffer, &iter, "\n", -1); /* C octal \012\234 */ gstemp = g_string_new (NULL); for (i = 0; i < n; i++) g_string_append_printf (gstemp, "\\%3.3o", utf8[i]); insert_vanilla_detail (charmap, buffer, &iter, _("C octal escaped UTF-8:"), gstemp->str); g_string_free (gstemp, TRUE); /* XML decimal entity */ if ((0x0001 <= uc && uc <= 0xD7FF) || (0xE000 <= uc && uc <= 0xFFFD) || (0x10000 <= uc && uc <= 0x10FFFF)) { temp = g_strdup_printf ("&#%d;", uc); insert_vanilla_detail (charmap, buffer, &iter, _("XML decimal entity:"), temp); g_free (temp); } g_free(utf16); } /* annotations */ if (_mucharmap_unicode_has_nameslist_entry (uc)) { insert_heading (charmap, buffer, &iter, _("Annotations and Cross References")); /* nameslist equals (alias names) */ csarr = mucharmap_get_nameslist_equals (uc); if (csarr != NULL) { insert_chocolate_detail (charmap, buffer, &iter, _("Alias names:"), csarr, FALSE); g_free (csarr); } /* nameslist stars (notes) */ csarr = mucharmap_get_nameslist_stars (uc); if (csarr != NULL) { insert_chocolate_detail (charmap, buffer, &iter, _("Notes:"), csarr, TRUE); g_free (csarr); } /* nameslist exes (see also) */ ucs = mucharmap_get_nameslist_exes (uc); if (ucs != NULL) { insert_chocolate_detail_codepoints (charmap, buffer, &iter, _("See also:"), ucs); g_free (ucs); } /* nameslist pounds (approximate equivalents) */ csarr = mucharmap_get_nameslist_pounds (uc); if (csarr != NULL) { insert_chocolate_detail (charmap, buffer, &iter, _("Approximate equivalents:"), csarr, TRUE); g_free (csarr); } /* nameslist colons (equivalents) */ csarr = mucharmap_get_nameslist_colons (uc); if (csarr != NULL) { insert_chocolate_detail (charmap, buffer, &iter, _("Equivalents:"), csarr, TRUE); g_free (csarr); } } #if ENABLE_UNIHAN /* this isn't so bad efficiency-wise */ if (mucharmap_get_unicode_kDefinition (uc) || mucharmap_get_unicode_kCantonese (uc) || mucharmap_get_unicode_kMandarin (uc) || mucharmap_get_unicode_kJapaneseOn (uc) || mucharmap_get_unicode_kJapaneseKun (uc) || mucharmap_get_unicode_kTang (uc) || mucharmap_get_unicode_kKorean (uc)) { insert_heading (charmap, buffer, &iter, _("CJK Ideograph Information")); csp = mucharmap_get_unicode_kDefinition (uc); if (csp) insert_vanilla_detail (charmap, buffer, &iter, _("Definition in English:"), csp); csp = mucharmap_get_unicode_kMandarin (uc); if (csp) insert_vanilla_detail (charmap, buffer, &iter, _("Mandarin Pronunciation:"), csp); csp = mucharmap_get_unicode_kCantonese (uc); if (csp) insert_vanilla_detail (charmap, buffer, &iter, _("Cantonese Pronunciation:"), csp); csp = mucharmap_get_unicode_kJapaneseOn (uc); if (csp) insert_vanilla_detail (charmap, buffer, &iter, _("Japanese On Pronunciation:"), csp); csp = mucharmap_get_unicode_kJapaneseKun (uc); if (csp) insert_vanilla_detail (charmap, buffer, &iter, _("Japanese Kun Pronunciation:"), csp); csp = mucharmap_get_unicode_kTang (uc); if (csp) insert_vanilla_detail (charmap, buffer, &iter, _("Tang Pronunciation:"), csp); csp = mucharmap_get_unicode_kKorean (uc); if (csp) insert_vanilla_detail (charmap, buffer, &iter, _("Korean Pronunciation:"), csp); } #endif /* #if ENABLE_UNIHAN */ }
void build_table(charpick_data *p_curr_data) { GtkWidget *box, *button_box, **row_box; GtkWidget *button, *arrow; gint i = 0, len = g_utf8_strlen (p_curr_data->charlist, -1); GtkWidget **toggle_button; gchar *charlist; gint max_width=1, max_height=1; gint size_ratio; toggle_button = g_new (GtkWidget *, len); if (p_curr_data->box) gtk_widget_destroy(p_curr_data->box); if (p_curr_data->panel_vertical) box = gtk_vbox_new (FALSE, 0); else box = gtk_hbox_new (FALSE, 0); gtk_widget_show (box); p_curr_data->box = box; button = gtk_button_new (); if (g_list_length (p_curr_data->chartable) != 1) { gtk_widget_set_tooltip_text (button, _("Available palettes")); switch (mate_panel_applet_get_orient (MATE_PANEL_APPLET (p_curr_data->applet))) { case MATE_PANEL_APPLET_ORIENT_DOWN: arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_OUT); break; case MATE_PANEL_APPLET_ORIENT_UP: arrow = gtk_arrow_new (GTK_ARROW_UP, GTK_SHADOW_OUT); break; case MATE_PANEL_APPLET_ORIENT_LEFT: arrow = gtk_arrow_new (GTK_ARROW_LEFT, GTK_SHADOW_OUT); break; case MATE_PANEL_APPLET_ORIENT_RIGHT: arrow = gtk_arrow_new (GTK_ARROW_RIGHT, GTK_SHADOW_OUT); break; default: g_assert_not_reached (); } gtk_container_add (GTK_CONTAINER (button), arrow); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); /* FIXME : evil hack (see force_no_focus_padding) */ force_no_focus_padding (button); gtk_box_pack_start (GTK_BOX (box), button, TRUE, TRUE, 0); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (chooser_button_clicked), p_curr_data); g_signal_connect (G_OBJECT (button), "button_press_event", G_CALLBACK (button_press_hack), p_curr_data->applet); } charlist = g_strdup (p_curr_data->charlist); for (i = 0; i < len; i++) { gchar label[7]; GtkRequisition req; gchar *atk_desc; gchar *name; g_utf8_strncpy (label, charlist, 1); charlist = g_utf8_next_char (charlist); #ifdef HAVE_MUCHARMAP /* TRANSLATOR: This sentance reads something like 'Insert "PILCROW SIGN"' * hopefully, the name of the unicode character has already * been translated. */ name = g_strdup_printf (_("Insert \"%s\""), mucharmap_get_unicode_name (g_utf8_get_char (label))); #else name = g_strdup (_("Insert special character")); #endif toggle_button[i] = gtk_toggle_button_new_with_label (label); atk_desc = g_strdup_printf (_("insert special character %s"), label); set_atk_name_description (toggle_button[i], NULL, atk_desc); g_free (atk_desc); gtk_widget_show (toggle_button[i]); gtk_button_set_relief(GTK_BUTTON(toggle_button[i]), GTK_RELIEF_NONE); /* FIXME : evil hack (see force_no_focus_padding) */ force_no_focus_padding (toggle_button[i]); gtk_widget_set_tooltip_text (toggle_button[i], name); g_free (name); gtk_widget_size_request (toggle_button[i], &req); max_width = MAX (max_width, req.width); max_height = MAX (max_height, req.height-2); g_object_set_data (G_OBJECT (toggle_button[i]), "unichar", GINT_TO_POINTER(g_utf8_get_char (label))); g_signal_connect (GTK_OBJECT (toggle_button[i]), "toggled", G_CALLBACK (toggle_button_toggled_cb), p_curr_data); g_signal_connect (GTK_OBJECT (toggle_button[i]), "button_press_event", G_CALLBACK (button_press_hack), p_curr_data->applet); } if (p_curr_data->panel_vertical) { size_ratio = p_curr_data->panel_size / max_width; button_box = gtk_hbox_new (TRUE, 0); } else { size_ratio = p_curr_data->panel_size / max_height; button_box = gtk_vbox_new (TRUE, 0); } gtk_box_pack_start (GTK_BOX (box), button_box, TRUE, TRUE, 0); size_ratio = MAX (size_ratio, 1); row_box = g_new0 (GtkWidget *, size_ratio); for (i=0; i < size_ratio; i++) { if (!p_curr_data->panel_vertical) row_box[i] = gtk_hbox_new (TRUE, 0); else row_box[i] = gtk_vbox_new (TRUE, 0); gtk_box_pack_start (GTK_BOX (button_box), row_box[i], TRUE, TRUE, 0); } for (i = 0; i <len; i++) { int delta = len/size_ratio; int index; if (delta > 0) index = i / delta; else index = i; index = CLAMP (index, 0, size_ratio-1); gtk_box_pack_start (GTK_BOX (row_box[index]), toggle_button[i], TRUE, TRUE, 0); } g_free (toggle_button); gtk_container_add (GTK_CONTAINER(p_curr_data->applet), box); gtk_widget_show_all (p_curr_data->box); p_curr_data->last_index = NO_LAST_INDEX; p_curr_data->last_toggle_button = NULL; }