summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Yuan <li.yuan@sun.com>2008-11-27 07:12:21 +0000
committerLi Yuan <liyuan@src.gnome.org>2008-11-27 07:12:21 +0000
commitba918c4caf279948eff09ccdff843d0bdde4a37b (patch)
treee7ebcd2634bfbd904265ea1a795c3b8620e1d4e7
parent5679edb2bdffcbb90d217f7eded1b3477f0298c6 (diff)
downloadatk-ba918c4caf279948eff09ccdff843d0bdde4a37b.tar.gz
Bug #505445. Patch from Christian Persch. Removed unnecessary memory
2008-11-27 Li Yuan <li.yuan@sun.com> * atk/atkobject.c: (atk_role_get_name), (atk_role_get_localized_name), (atk_role_for_name): * atk/atktext.c: (atk_text_attribute_get_value): Bug #505445. Patch from Christian Persch. Removed unnecessary memory relocations. svn path=/trunk/; revision=1303
-rw-r--r--ChangeLog8
-rwxr-xr-xatk/atkobject.c330
-rwxr-xr-xatk/atktext.c131
3 files changed, 302 insertions, 167 deletions
diff --git a/ChangeLog b/ChangeLog
index 8a0cfeb..f8d2cb8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-11-27 Li Yuan <li.yuan@sun.com>
+
+ * atk/atkobject.c: (atk_role_get_name),
+ (atk_role_get_localized_name), (atk_role_for_name):
+ * atk/atktext.c: (atk_text_attribute_get_value):
+ Bug #505445. Patch from Christian Persch. Removed unnecessary
+ memory relocations.
+
2008-11-14 Li Yuan <li.yuan@sun.com>
* atk/atkobject.c:
diff --git a/atk/atkobject.c b/atk/atkobject.c
index 14cd675..bea02d7 100755
--- a/atk/atkobject.c
+++ b/atk/atkobject.c
@@ -69,106 +69,206 @@ enum {
LAST_SIGNAL
};
-typedef struct _AtkRoleItem AtkRoleItem;
-
-struct _AtkRoleItem
-{
- AtkRole role;
- gchar *name;
-};
-
-static const AtkRoleItem role_items [] =
-{
- { ATK_ROLE_INVALID, N_("invalid")},
- { ATK_ROLE_ACCEL_LABEL, N_("accelerator label")},
- { ATK_ROLE_ALERT, N_("alert")},
- { ATK_ROLE_ANIMATION, N_("animation")},
- { ATK_ROLE_ARROW, N_("arrow")},
- { ATK_ROLE_CALENDAR, N_("calendar")},
- { ATK_ROLE_CANVAS, N_("canvas")},
- { ATK_ROLE_CHECK_BOX, N_("check box")},
- { ATK_ROLE_CHECK_MENU_ITEM, N_("check menu item")},
- { ATK_ROLE_COLOR_CHOOSER, N_("color chooser")},
- { ATK_ROLE_COLUMN_HEADER, N_("column header")},
- { ATK_ROLE_COMBO_BOX, N_("combo box")},
- { ATK_ROLE_DATE_EDITOR, N_("dateeditor")},
- { ATK_ROLE_DESKTOP_ICON, N_("desktop icon")},
- { ATK_ROLE_DESKTOP_FRAME, N_("desktop frame")},
- { ATK_ROLE_DIAL, N_("dial")},
- { ATK_ROLE_DIALOG, N_("dialog")},
- { ATK_ROLE_DIRECTORY_PANE, N_("directory pane")},
- { ATK_ROLE_DRAWING_AREA, N_("drawing area")},
- { ATK_ROLE_FILE_CHOOSER, N_("file chooser")},
- { ATK_ROLE_FILLER, N_("filler")},
+/* These are listed here for extraction by intltool */
+#if 0
+ N_("invalid")
+ N_("accelerator label")
+ N_("alert")
+ N_("animation")
+ N_("arrow")
+ N_("calendar")
+ N_("canvas")
+ N_("check box")
+ N_("check menu item")
+ N_("color chooser")
+ N_("column header")
+ N_("combo box")
+ N_("dateeditor")
+ N_("desktop icon")
+ N_("desktop frame")
+ N_("dial")
+ N_("dialog")
+ N_("directory pane")
+ N_("drawing area")
+ N_("file chooser")
+ N_("filler")
/* I know it looks wrong but that is what Java returns */
- { ATK_ROLE_FONT_CHOOSER, N_("fontchooser")},
- { ATK_ROLE_FRAME, N_("frame")},
- { ATK_ROLE_GLASS_PANE, N_("glass pane")},
- { ATK_ROLE_HTML_CONTAINER, N_("html container")},
- { ATK_ROLE_ICON, N_("icon")},
- { ATK_ROLE_IMAGE, N_("image")},
- { ATK_ROLE_INTERNAL_FRAME, N_("internal frame")},
- { ATK_ROLE_LABEL, N_("label")},
- { ATK_ROLE_LAYERED_PANE, N_("layered pane")},
- { ATK_ROLE_LIST, N_("list")},
- { ATK_ROLE_LIST_ITEM, N_("list item")},
- { ATK_ROLE_MENU, N_("menu")},
- { ATK_ROLE_MENU_BAR, N_("menu bar")},
- { ATK_ROLE_MENU_ITEM, N_("menu item")},
- { ATK_ROLE_OPTION_PANE, N_("option pane")},
- { ATK_ROLE_PAGE_TAB, N_("page tab")},
- { ATK_ROLE_PAGE_TAB_LIST, N_("page tab list")},
- { ATK_ROLE_PANEL, N_("panel")},
- { ATK_ROLE_PASSWORD_TEXT, N_("password text")},
- { ATK_ROLE_POPUP_MENU, N_("popup menu")},
- { ATK_ROLE_PROGRESS_BAR, N_("progress bar")},
- { ATK_ROLE_PUSH_BUTTON, N_("push button")},
- { ATK_ROLE_RADIO_BUTTON, N_("radio button")},
- { ATK_ROLE_RADIO_MENU_ITEM, N_("radio menu item")},
- { ATK_ROLE_ROOT_PANE, N_("root pane")},
- { ATK_ROLE_ROW_HEADER, N_("row header")},
- { ATK_ROLE_SCROLL_BAR, N_("scroll bar")},
- { ATK_ROLE_SCROLL_PANE, N_("scroll pane")},
- { ATK_ROLE_SEPARATOR, N_("separator")},
- { ATK_ROLE_SLIDER, N_("slider")},
- { ATK_ROLE_SPLIT_PANE, N_("split pane")},
- { ATK_ROLE_SPIN_BUTTON, N_("spin button")},
- { ATK_ROLE_STATUSBAR, N_("statusbar")},
- { ATK_ROLE_TABLE, N_("table")},
- { ATK_ROLE_TABLE_CELL, N_("table cell")},
- { ATK_ROLE_TABLE_COLUMN_HEADER, N_("table column header")},
- { ATK_ROLE_TABLE_ROW_HEADER, N_("table row header")},
- { ATK_ROLE_TEAR_OFF_MENU_ITEM, N_("tear off menu item")},
- { ATK_ROLE_TERMINAL, N_("terminal")},
- { ATK_ROLE_TEXT, N_("text")},
- { ATK_ROLE_TOGGLE_BUTTON, N_("toggle button")},
- { ATK_ROLE_TOOL_BAR, N_("tool bar")},
- { ATK_ROLE_TOOL_TIP, N_("tool tip")},
- { ATK_ROLE_TREE, N_("tree")},
- { ATK_ROLE_TREE_TABLE, N_("tree table")},
- { ATK_ROLE_UNKNOWN, N_("unknown")},
- { ATK_ROLE_VIEWPORT, N_("viewport")},
- { ATK_ROLE_WINDOW, N_("window")},
- { ATK_ROLE_HEADER, N_("header")},
- { ATK_ROLE_FOOTER, N_("footer")},
- { ATK_ROLE_PARAGRAPH, N_("paragraph")},
- { ATK_ROLE_APPLICATION, N_("application")},
- { ATK_ROLE_AUTOCOMPLETE, N_("autocomplete")},
- { ATK_ROLE_EDITBAR, N_("edit bar")},
- { ATK_ROLE_EMBEDDED, N_("embedded component")},
- { ATK_ROLE_ENTRY, N_("entry")},
- { ATK_ROLE_CHART, N_("chart")},
- { ATK_ROLE_CAPTION, N_("caption")},
- { ATK_ROLE_DOCUMENT_FRAME, N_("document frame")},
- { ATK_ROLE_HEADING, N_("heading")},
- { ATK_ROLE_PAGE, N_("page")},
- { ATK_ROLE_SECTION, N_("section")},
- { ATK_ROLE_REDUNDANT_OBJECT, N_("redundant object")},
- { ATK_ROLE_FORM, N_("form")},
- { ATK_ROLE_LINK, N_("link")},
- { ATK_ROLE_INPUT_METHOD_WINDOW, N_("input method window")}
+ N_("fontchooser")
+ N_("frame")
+ N_("glass pane")
+ N_("html container")
+ N_("icon")
+ N_("image")
+ N_("internal frame")
+ N_("label")
+ N_("layered pane")
+ N_("list")
+ N_("list item")
+ N_("menu")
+ N_("menu bar")
+ N_("menu item")
+ N_("option pane")
+ N_("page tab")
+ N_("page tab list")
+ N_("panel")
+ N_("password text")
+ N_("popup menu")
+ N_("progress bar")
+ N_("push button")
+ N_("radio button")
+ N_("radio menu item")
+ N_("root pane")
+ N_("row header")
+ N_("scroll bar")
+ N_("scroll pane")
+ N_("separator")
+ N_("slider")
+ N_("split pane")
+ N_("spin button")
+ N_("statusbar")
+ N_("table")
+ N_("table cell")
+ N_("table column header")
+ N_("table row header")
+ N_("tear off menu item")
+ N_("terminal")
+ N_("text")
+ N_("toggle button")
+ N_("tool bar")
+ N_("tool tip")
+ N_("tree")
+ N_("tree table")
+ N_("unknown")
+ N_("viewport")
+ N_("window")
+ N_("header")
+ N_("footer")
+ N_("paragraph")
+ N_("ruler")
+ N_("application")
+ N_("autocomplete")
+ N_("edit bar")
+ N_("embedded component")
+ N_("entry")
+ N_("chart")
+ N_("caption")
+ N_("document frame")
+ N_("heading")
+ N_("page")
+ N_("section")
+ N_("redundant object")
+ N_("form")
+ N_("link")
+ N_("input method window")
+#endif /* 0 */
+
+static const char roles[] =
+ "invalid\0"
+ "accelerator label\0"
+ "alert\0"
+ "animation\0"
+ "arrow\0"
+ "calendar\0"
+ "canvas\0"
+ "check box\0"
+ "check menu item\0"
+ "color chooser\0"
+ "column header\0"
+ "combo box\0"
+ "dateeditor\0"
+ "desktop icon\0"
+ "desktop frame\0"
+ "dial\0"
+ "dialog\0"
+ "directory pane\0"
+ "drawing area\0"
+ "file chooser\0"
+ "filler\0"
+ "fontchooser\0"
+ "frame\0"
+ "glass pane\0"
+ "html container\0"
+ "icon\0"
+ "image\0"
+ "internal frame\0"
+ "label\0"
+ "layered pane\0"
+ "list\0"
+ "list item\0"
+ "menu\0"
+ "menu bar\0"
+ "menu item\0"
+ "option pane\0"
+ "page tab\0"
+ "page tab list\0"
+ "panel\0"
+ "password text\0"
+ "popup menu\0"
+ "progress bar\0"
+ "push button\0"
+ "radio button\0"
+ "radio menu item\0"
+ "root pane\0"
+ "row header\0"
+ "scroll bar\0"
+ "scroll pane\0"
+ "separator\0"
+ "slider\0"
+ "split pane\0"
+ "spin button\0"
+ "statusbar\0"
+ "table\0"
+ "table cell\0"
+ "table column header\0"
+ "table row header\0"
+ "tear off menu item\0"
+ "terminal\0"
+ "text\0"
+ "toggle button\0"
+ "tool bar\0"
+ "tool tip\0"
+ "tree\0"
+ "tree table\0"
+ "unknown\0"
+ "viewport\0"
+ "window\0"
+ "header\0"
+ "footer\0"
+ "paragraph\0"
+ "ruler\0"
+ "application\0"
+ "autocomplete\0"
+ "edit bar\0"
+ "embedded component\0"
+ "entry\0"
+ "chart\0"
+ "caption\0"
+ "document frame\0"
+ "heading\0"
+ "page\0"
+ "section\0"
+ "redundant object\0"
+ "form\0"
+ "link\0"
+ "input method window";
+
+static const guint16 roles_offsets[] = {
+ 0, 8, 26, 32, 42, 48, 57, 64,
+ 74, 90, 104, 118, 128, 139, 152, 166,
+ 171, 178, 193, 206, 219, 226, 238, 244,
+ 255, 270, 275, 281, 296, 302, 315, 320,
+ 330, 335, 344, 354, 366, 375, 389, 395,
+ 409, 420, 433, 445, 458, 474, 484, 495,
+ 506, 518, 528, 535, 546, 558, 568, 574,
+ 585, 605, 622, 641, 650, 655, 669, 678,
+ 687, 692, 703, 711, 720, 727, 734, 741,
+ 751, 757, 769, 782, 791, 810, 816, 822,
+ 830, 845, 853, 858, 866, 883, 888, 893
};
+/* This is a static assertion */
+typedef int _assert_roles_num[(G_N_ELEMENTS (roles_offsets) == ATK_ROLE_LAST_DEFINED) ? 1 : -1];
+
static void atk_object_class_init (AtkObjectClass *klass);
static void atk_object_init (AtkObject *accessible,
AtkObjectClass *klass);
@@ -1390,14 +1490,8 @@ atk_object_notify (GObject *obj,
G_CONST_RETURN gchar*
atk_role_get_name (AtkRole role)
{
- gchar *name = NULL;
- gint i;
-
- for (i = 0; i < G_N_ELEMENTS (role_items); i++)
- {
- if (role == role_items[i].role)
- return role_items[i].name;
- }
+ if (role >= 0 && role < ATK_ROLE_LAST_DEFINED)
+ return roles + roles_offsets[role];
if (extra_roles)
{
@@ -1405,10 +1499,11 @@ atk_role_get_name (AtkRole role)
n -= ATK_ROLE_LAST_DEFINED + 1;
- if (n < extra_roles->len)
- name = g_ptr_array_index (extra_roles, n);
+ if (n >= 0 && n < extra_roles->len)
+ return g_ptr_array_index (extra_roles, n);
}
- return name;
+
+ return NULL;
}
/**
@@ -1422,19 +1517,12 @@ atk_role_get_name (AtkRole role)
G_CONST_RETURN gchar*
atk_role_get_localized_name (AtkRole role)
{
- G_CONST_RETURN gchar *name;
- gint i;
-
gettext_initialization ();
- for (i = 0; i < G_N_ELEMENTS (role_items); i++)
- {
- if (role == role_items[i].role)
- return dgettext (GETTEXT_PACKAGE, role_items[i].name);
- }
- name = atk_role_get_name (role);
+ if (role >= 0 && role < ATK_ROLE_LAST_DEFINED)
+ return dgettext (GETTEXT_PACKAGE, roles + roles_offsets[role]);
- return name;
+ return atk_role_get_name (role);
}
/**
@@ -1455,10 +1543,10 @@ atk_role_for_name (const gchar *name)
g_return_val_if_fail (name, ATK_ROLE_INVALID);
- for (i = 0; i < G_N_ELEMENTS (role_items); i++)
+ for (i = 0; i < G_N_ELEMENTS (roles_offsets); i++)
{
- if (strcmp (name, role_items[i].name) == 0)
- return role_items[i].role;
+ if (strcmp (name, roles + roles_offsets[i]) == 0)
+ return (AtkRole) i;
}
if (extra_roles)
diff --git a/atk/atktext.c b/atk/atktext.c
index 227b311..bb6b294 100755
--- a/atk/atktext.c
+++ b/atk/atktext.c
@@ -33,36 +33,75 @@ enum {
LAST_SIGNAL
};
-static const gchar * const bool[] = {"false",
- "true"};
-static const gchar * const style[] = {"normal",
- "oblique",
- "italic"};
-static const gchar * const variant[] = {"normal",
- "small_caps"};
-static const gchar * const stretch[] = {"ultra_condensed",
- "extra_condensed",
- "condensed",
- "semi_condensed",
- "normal",
- "semi_expanded",
- "expanded",
- "extra_expanded",
- "ultra_expanded"};
-static const gchar * const justification[] = {"left",
- "right",
- "center",
- "fill"};
-static const gchar * const direction[] = {"none",
- "ltr",
- "rtl"};
-static const gchar * const wrap_mode[] = {"none",
- "char",
- "word"};
-static const gchar * const underline[] = {"none",
- "single",
- "double",
- "low"};
+static const char boolean[] =
+ "false\0"
+ "true";
+static const guint8 boolean_offsets[] = {
+ 0, 6
+};
+
+static const char style[] =
+ "normal\0"
+ "oblique\0"
+ "italic";
+static const guint8 style_offsets[] = {
+ 0, 7, 15
+};
+
+static const char variant[] =
+ "normal\0"
+ "small_caps";
+static const guint8 variant_offsets[] = {
+ 0, 7
+};
+
+static const char stretch[] =
+ "ultra_condensed\0"
+ "extra_condensed\0"
+ "condensed\0"
+ "semi_condensed\0"
+ "normal\0"
+ "semi_expanded\0"
+ "expanded\0"
+ "extra_expanded\0"
+ "ultra_expanded";
+static const guint8 stretch_offsets[] = {
+ 0, 16, 32, 42, 57, 64, 78, 87, 102
+};
+
+static const char justification[] =
+ "left\0"
+ "right\0"
+ "center\0"
+ "fill";
+static const guint8 justification_offsets[] = {
+ 0, 5, 11, 18
+};
+
+static const char direction[] =
+ "none\0"
+ "ltr\0"
+ "rtl";
+static const guint8 direction_offsets[] = {
+ 0, 5, 9
+};
+
+static const char wrap_mode[] =
+ "none\0"
+ "char\0"
+ "word";
+static const guint8 wrap_mode_offsets[] = {
+ 0, 5, 10
+};
+
+static const char underline[] =
+ "none\0"
+ "single\0"
+ "double\0"
+ "low";
+static const guint8 underline_offsets[] = {
+ 0, 5, 12, 19
+};
static void atk_text_base_init (AtkTextIface *class);
@@ -1120,29 +1159,29 @@ atk_text_attribute_get_value (AtkTextAttribute attr,
case ATK_TEXT_ATTR_STRIKETHROUGH:
case ATK_TEXT_ATTR_BG_STIPPLE:
case ATK_TEXT_ATTR_FG_STIPPLE:
- g_assert (index >= 0 && index < 2);
- return bool[index];
+ g_assert (index >= 0 && index < G_N_ELEMENTS (boolean_offsets));
+ return boolean + boolean_offsets[index];
case ATK_TEXT_ATTR_UNDERLINE:
- g_assert (index >= 0 && index < 5);
- return underline[index];
+ g_assert (index >= 0 && index < G_N_ELEMENTS (underline_offsets));
+ return underline + underline_offsets[index];
case ATK_TEXT_ATTR_WRAP_MODE:
- g_assert (index >= 0 && index < 4);
- return wrap_mode[index];
+ g_assert (index >= 0 && index < G_N_ELEMENTS (wrap_mode_offsets));
+ return wrap_mode + wrap_mode_offsets[index];
case ATK_TEXT_ATTR_DIRECTION:
- g_assert (index >= 0 && index < 3);
- return direction[index];
+ g_assert (index >= 0 && index < G_N_ELEMENTS (direction_offsets));
+ return direction + direction_offsets[index];
case ATK_TEXT_ATTR_JUSTIFICATION:
- g_assert (index >= 0 && index < 3);
- return justification[index];
+ g_assert (index >= 0 && index < G_N_ELEMENTS (justification_offsets));
+ return justification + justification_offsets[index];
case ATK_TEXT_ATTR_STRETCH:
- g_assert (index >= 0 && index < 9);
- return stretch[index];
+ g_assert (index >= 0 && index < G_N_ELEMENTS (stretch_offsets));
+ return stretch + stretch_offsets[index];
case ATK_TEXT_ATTR_VARIANT:
- g_assert (index >= 0 && index < 2);
- return variant[index];
+ g_assert (index >= 0 && index < G_N_ELEMENTS (variant_offsets));
+ return variant + variant_offsets[index];
case ATK_TEXT_ATTR_STYLE:
- g_assert (index >= 0 && index < 3);
- return style[index];
+ g_assert (index >= 0 && index < G_N_ELEMENTS (style_offsets));
+ return style + style_offsets[index];
default:
return NULL;
}