574 dlclose(gtk3_libhandle);
575 gtk3_libhandle = NULL;
576
577 dlclose(gthread_libhandle);
578 gthread_libhandle = NULL;
579
580 return NULL;
581 }
582
583 /*
584 * Strip the AT-SPI GTK_MODULES if present
585 */
586 gtk_modules_env = getenv ("GTK_MODULES");
587 if ((gtk_modules_env && strstr(gtk_modules_env, "atk-bridge")) ||
588 (gtk_modules_env && strstr(gtk_modules_env, "gail"))) {
589 /* careful, strtok modifies its args */
590 gchar *tmp_env = strdup(gtk_modules_env);
591 if (tmp_env) {
592 /* the new env will be smaller than the old one */
593 gchar *s, *new_env = SAFE_SIZE_STRUCT_ALLOC(malloc,
594 sizeof(ENV_PREFIX), 1, strlen (gtk_modules_env));
595
596 if (new_env) {
597 strcpy(new_env, ENV_PREFIX);
598
599 /* strip out 'atk-bridge' and 'gail' */
600 size_t PREFIX_LENGTH = strlen(ENV_PREFIX);
601 gchar *tmp_ptr = NULL;
602 for (s = strtok_r(tmp_env, ":", &tmp_ptr); s;
603 s = strtok_r(NULL, ":", &tmp_ptr)) {
604 if ((!strstr(s, "atk-bridge")) && (!strstr(s, "gail"))) {
605 if (strlen(new_env) > PREFIX_LENGTH) {
606 new_env = strcat(new_env, ":");
607 }
608 new_env = strcat(new_env, s);
609 }
610 }
611 if (putenv(new_env) != 0) {
612 /* no free() on success, putenv() doesn't copy string */
613 free(new_env);
614 }
905 }
906
907 static GtkAdjustment* create_adjustment()
908 {
909 return (GtkAdjustment *)
910 (*fp_gtk_adjustment_new)(50.0, 0.0, 100.0, 10.0, 20.0, 20.0);
911 }
912
913 /**
914 * Returns a pointer to the cached native widget for the specified widget
915 * type.
916 */
917 static GtkWidget *gtk3_get_widget(WidgetType widget_type)
918 {
919 gboolean init_result = FALSE;
920 GtkWidget *result = NULL;
921 switch (widget_type)
922 {
923 case BUTTON:
924 case TABLE_HEADER:
925 if (init_result = (NULL == gtk3_widgets[_GTK_BUTTON_TYPE]))
926 {
927 gtk3_widgets[_GTK_BUTTON_TYPE] = (*fp_gtk_button_new)();
928 }
929 result = gtk3_widgets[_GTK_BUTTON_TYPE];
930 break;
931 case CHECK_BOX:
932 if (init_result = (NULL == gtk3_widgets[_GTK_CHECK_BUTTON_TYPE]))
933 {
934 gtk3_widgets[_GTK_CHECK_BUTTON_TYPE] =
935 (*fp_gtk_check_button_new)();
936 }
937 result = gtk3_widgets[_GTK_CHECK_BUTTON_TYPE];
938 break;
939 case CHECK_BOX_MENU_ITEM:
940 if (init_result = (NULL == gtk3_widgets[_GTK_CHECK_MENU_ITEM_TYPE]))
941 {
942 gtk3_widgets[_GTK_CHECK_MENU_ITEM_TYPE] =
943 (*fp_gtk_check_menu_item_new)();
944 }
945 result = gtk3_widgets[_GTK_CHECK_MENU_ITEM_TYPE];
946 break;
947 /************************************************************
948 * Creation a dedicated color chooser is dangerous because
949 * it deadlocks the EDT
950 ************************************************************/
951 /* case COLOR_CHOOSER:
952 if (init_result =
953 (NULL == gtk3_widgets[_GTK_COLOR_SELECTION_DIALOG_TYPE]))
954 {
955 gtk3_widgets[_GTK_COLOR_SELECTION_DIALOG_TYPE] =
956 (*fp_gtk_color_selection_dialog_new)(NULL);
957 }
958 result = gtk3_widgets[_GTK_COLOR_SELECTION_DIALOG_TYPE];
959 break;*/
960 case COMBO_BOX:
961 if (init_result = (NULL == gtk3_widgets[_GTK_COMBO_BOX_TYPE]))
962 {
963 gtk3_widgets[_GTK_COMBO_BOX_TYPE] =
964 (*fp_gtk_combo_box_new)();
965 }
966 result = gtk3_widgets[_GTK_COMBO_BOX_TYPE];
967 break;
968 case COMBO_BOX_ARROW_BUTTON:
969 if (init_result =
970 (NULL == gtk3_widgets[_GTK_COMBO_BOX_ARROW_BUTTON_TYPE]))
971 {
972 gtk3_widgets[_GTK_COMBO_BOX_ARROW_BUTTON_TYPE] =
973 (*fp_gtk_toggle_button_new)();
974 }
975 result = gtk3_widgets[_GTK_COMBO_BOX_ARROW_BUTTON_TYPE];
976 break;
977 case COMBO_BOX_TEXT_FIELD:
978 if (init_result =
979 (NULL == gtk3_widgets[_GTK_COMBO_BOX_TEXT_FIELD_TYPE]))
980 {
981 result = gtk3_widgets[_GTK_COMBO_BOX_TEXT_FIELD_TYPE] =
982 (*fp_gtk_entry_new)();
983 }
984 result = gtk3_widgets[_GTK_COMBO_BOX_TEXT_FIELD_TYPE];
985 break;
986 case DESKTOP_ICON:
987 case INTERNAL_FRAME_TITLE_PANE:
988 case LABEL:
989 if (init_result = (NULL == gtk3_widgets[_GTK_LABEL_TYPE]))
990 {
991 gtk3_widgets[_GTK_LABEL_TYPE] =
992 (*fp_gtk_label_new)(NULL);
993 }
994 result = gtk3_widgets[_GTK_LABEL_TYPE];
995 break;
996 case DESKTOP_PANE:
997 case PANEL:
998 case ROOT_PANE:
999 if (init_result = (NULL == gtk3_widgets[_GTK_CONTAINER_TYPE]))
1000 {
1001 /* There is no constructor for a container type. I've
1002 * chosen GtkFixed container since it has a default
1003 * constructor.
1004 */
1005 gtk3_widgets[_GTK_CONTAINER_TYPE] =
1006 (*fp_gtk_fixed_new)();
1007 }
1008 result = gtk3_widgets[_GTK_CONTAINER_TYPE];
1009 break;
1010 case EDITOR_PANE:
1011 case TEXT_AREA:
1012 case TEXT_PANE:
1013 if (init_result = (NULL == gtk3_widgets[_GTK_TEXT_VIEW_TYPE]))
1014 {
1015 gtk3_widgets[_GTK_TEXT_VIEW_TYPE] =
1016 (*fp_gtk_text_view_new)();
1017 }
1018 result = gtk3_widgets[_GTK_TEXT_VIEW_TYPE];
1019 break;
1020 case FORMATTED_TEXT_FIELD:
1021 case PASSWORD_FIELD:
1022 case TEXT_FIELD:
1023 if (init_result = (NULL == gtk3_widgets[_GTK_ENTRY_TYPE]))
1024 {
1025 gtk3_widgets[_GTK_ENTRY_TYPE] =
1026 (*fp_gtk_entry_new)();
1027 }
1028 result = gtk3_widgets[_GTK_ENTRY_TYPE];
1029 break;
1030 case HANDLE_BOX:
1031 if (init_result = (NULL == gtk3_widgets[_GTK_HANDLE_BOX_TYPE]))
1032 {
1033 gtk3_widgets[_GTK_HANDLE_BOX_TYPE] =
1034 (*fp_gtk_handle_box_new)();
1035 }
1036 result = gtk3_widgets[_GTK_HANDLE_BOX_TYPE];
1037 break;
1038 case HSCROLL_BAR:
1039 case HSCROLL_BAR_BUTTON_LEFT:
1040 case HSCROLL_BAR_BUTTON_RIGHT:
1041 case HSCROLL_BAR_TRACK:
1042 case HSCROLL_BAR_THUMB:
1043 if (init_result = (NULL == gtk3_widgets[_GTK_HSCROLLBAR_TYPE]))
1044 {
1045 gtk3_widgets[_GTK_HSCROLLBAR_TYPE] =
1046 (*fp_gtk_hscrollbar_new)(create_adjustment());
1047 }
1048 result = gtk3_widgets[_GTK_HSCROLLBAR_TYPE];
1049 break;
1050 case HSEPARATOR:
1051 if (init_result = (NULL == gtk3_widgets[_GTK_HSEPARATOR_TYPE]))
1052 {
1053 gtk3_widgets[_GTK_HSEPARATOR_TYPE] =
1054 (*fp_gtk_hseparator_new)();
1055 }
1056 result = gtk3_widgets[_GTK_HSEPARATOR_TYPE];
1057 break;
1058 case HSLIDER:
1059 case HSLIDER_THUMB:
1060 case HSLIDER_TRACK:
1061 if (init_result = (NULL == gtk3_widgets[_GTK_HSCALE_TYPE]))
1062 {
1063 gtk3_widgets[_GTK_HSCALE_TYPE] =
1064 (*fp_gtk_scale_new)(GTK_ORIENTATION_HORIZONTAL, NULL);
1065 }
1066 result = gtk3_widgets[_GTK_HSCALE_TYPE];
1067 break;
1068 case HSPLIT_PANE_DIVIDER:
1069 case SPLIT_PANE:
1070 if (init_result = (NULL == gtk3_widgets[_GTK_HPANED_TYPE]))
1071 {
1072 gtk3_widgets[_GTK_HPANED_TYPE] = (*fp_gtk_hpaned_new)();
1073 }
1074 result = gtk3_widgets[_GTK_HPANED_TYPE];
1075 break;
1076 case IMAGE:
1077 if (init_result = (NULL == gtk3_widgets[_GTK_IMAGE_TYPE]))
1078 {
1079 gtk3_widgets[_GTK_IMAGE_TYPE] = (*fp_gtk_image_new)();
1080 }
1081 result = gtk3_widgets[_GTK_IMAGE_TYPE];
1082 break;
1083 case INTERNAL_FRAME:
1084 if (init_result = (NULL == gtk3_widgets[_GTK_WINDOW_TYPE]))
1085 {
1086 gtk3_widgets[_GTK_WINDOW_TYPE] =
1087 (*fp_gtk_window_new)(GTK_WINDOW_TOPLEVEL);
1088 }
1089 result = gtk3_widgets[_GTK_WINDOW_TYPE];
1090 break;
1091 case TOOL_TIP:
1092 if (init_result = (NULL == gtk3_widgets[_GTK_TOOLTIP_TYPE]))
1093 {
1094 result = (*fp_gtk_window_new)(GTK_WINDOW_TOPLEVEL);
1095 gtk3_widgets[_GTK_TOOLTIP_TYPE] = result;
1096 }
1097 result = gtk3_widgets[_GTK_TOOLTIP_TYPE];
1098 break;
1099 case LIST:
1100 case TABLE:
1101 case TREE:
1102 case TREE_CELL:
1103 if (init_result = (NULL == gtk3_widgets[_GTK_TREE_VIEW_TYPE]))
1104 {
1105 gtk3_widgets[_GTK_TREE_VIEW_TYPE] =
1106 (*fp_gtk_tree_view_new)();
1107 }
1108 result = gtk3_widgets[_GTK_TREE_VIEW_TYPE];
1109 break;
1110 case TITLED_BORDER:
1111 if (init_result = (NULL == gtk3_widgets[_GTK_FRAME_TYPE]))
1112 {
1113 gtk3_widgets[_GTK_FRAME_TYPE] = fp_gtk_frame_new(NULL);
1114 }
1115 result = gtk3_widgets[_GTK_FRAME_TYPE];
1116 break;
1117 case POPUP_MENU:
1118 if (init_result = (NULL == gtk3_widgets[_GTK_MENU_TYPE]))
1119 {
1120 gtk3_widgets[_GTK_MENU_TYPE] =
1121 (*fp_gtk_menu_new)();
1122 }
1123 result = gtk3_widgets[_GTK_MENU_TYPE];
1124 break;
1125 case MENU:
1126 case MENU_ITEM:
1127 case MENU_ITEM_ACCELERATOR:
1128 if (init_result = (NULL == gtk3_widgets[_GTK_MENU_ITEM_TYPE]))
1129 {
1130 gtk3_widgets[_GTK_MENU_ITEM_TYPE] =
1131 (*fp_gtk_menu_item_new)();
1132 }
1133 result = gtk3_widgets[_GTK_MENU_ITEM_TYPE];
1134 break;
1135 case MENU_BAR:
1136 if (init_result = (NULL == gtk3_widgets[_GTK_MENU_BAR_TYPE]))
1137 {
1138 gtk3_widgets[_GTK_MENU_BAR_TYPE] =
1139 (*fp_gtk_menu_bar_new)();
1140 }
1141 result = gtk3_widgets[_GTK_MENU_BAR_TYPE];
1142 break;
1143 case COLOR_CHOOSER:
1144 case OPTION_PANE:
1145 if (init_result = (NULL == gtk3_widgets[_GTK_DIALOG_TYPE]))
1146 {
1147 gtk3_widgets[_GTK_DIALOG_TYPE] =
1148 (*fp_gtk_dialog_new)();
1149 }
1150 result = gtk3_widgets[_GTK_DIALOG_TYPE];
1151 break;
1152 case POPUP_MENU_SEPARATOR:
1153 if (init_result =
1154 (NULL == gtk3_widgets[_GTK_SEPARATOR_MENU_ITEM_TYPE]))
1155 {
1156 gtk3_widgets[_GTK_SEPARATOR_MENU_ITEM_TYPE] =
1157 (*fp_gtk_separator_menu_item_new)();
1158 }
1159 result = gtk3_widgets[_GTK_SEPARATOR_MENU_ITEM_TYPE];
1160 break;
1161 case HPROGRESS_BAR:
1162 if (init_result = (NULL == gtk3_widgets[_GTK_HPROGRESS_BAR_TYPE]))
1163 {
1164 gtk3_widgets[_GTK_HPROGRESS_BAR_TYPE] =
1165 (*fp_gtk_progress_bar_new)();
1166 }
1167 result = gtk3_widgets[_GTK_HPROGRESS_BAR_TYPE];
1168 break;
1169 case VPROGRESS_BAR:
1170 if (init_result = (NULL == gtk3_widgets[_GTK_VPROGRESS_BAR_TYPE]))
1171 {
1172 gtk3_widgets[_GTK_VPROGRESS_BAR_TYPE] =
1173 (*fp_gtk_progress_bar_new)();
1174 /*
1175 * Vertical JProgressBars always go bottom-to-top,
1176 * regardless of the ComponentOrientation.
1177 */
1178 (*fp_gtk_progress_bar_set_orientation)(
1179 (GtkProgressBar *)gtk3_widgets[_GTK_VPROGRESS_BAR_TYPE],
1180 GTK_PROGRESS_BOTTOM_TO_TOP);
1181 }
1182 result = gtk3_widgets[_GTK_VPROGRESS_BAR_TYPE];
1183 break;
1184 case RADIO_BUTTON:
1185 if (init_result = (NULL == gtk3_widgets[_GTK_RADIO_BUTTON_TYPE]))
1186 {
1187 gtk3_widgets[_GTK_RADIO_BUTTON_TYPE] =
1188 (*fp_gtk_radio_button_new)(NULL);
1189 }
1190 result = gtk3_widgets[_GTK_RADIO_BUTTON_TYPE];
1191 break;
1192 case RADIO_BUTTON_MENU_ITEM:
1193 if (init_result =
1194 (NULL == gtk3_widgets[_GTK_RADIO_MENU_ITEM_TYPE]))
1195 {
1196 gtk3_widgets[_GTK_RADIO_MENU_ITEM_TYPE] =
1197 (*fp_gtk_radio_menu_item_new)(NULL);
1198 }
1199 result = gtk3_widgets[_GTK_RADIO_MENU_ITEM_TYPE];
1200 break;
1201 case SCROLL_PANE:
1202 if (init_result =
1203 (NULL == gtk3_widgets[_GTK_SCROLLED_WINDOW_TYPE]))
1204 {
1205 gtk3_widgets[_GTK_SCROLLED_WINDOW_TYPE] =
1206 (*fp_gtk_scrolled_window_new)(NULL, NULL);
1207 }
1208 result = gtk3_widgets[_GTK_SCROLLED_WINDOW_TYPE];
1209 break;
1210 case SPINNER:
1211 case SPINNER_ARROW_BUTTON:
1212 case SPINNER_TEXT_FIELD:
1213 if (init_result = (NULL == gtk3_widgets[_GTK_SPIN_BUTTON_TYPE]))
1214 {
1215 result = gtk3_widgets[_GTK_SPIN_BUTTON_TYPE] =
1216 (*fp_gtk_spin_button_new)(NULL, 0, 0);
1217 }
1218 result = gtk3_widgets[_GTK_SPIN_BUTTON_TYPE];
1219 break;
1220 case TABBED_PANE:
1221 case TABBED_PANE_TAB_AREA:
1222 case TABBED_PANE_CONTENT:
1223 case TABBED_PANE_TAB:
1224 if (init_result = (NULL == gtk3_widgets[_GTK_NOTEBOOK_TYPE]))
1225 {
1226 gtk3_widgets[_GTK_NOTEBOOK_TYPE] =
1227 (*fp_gtk_notebook_new)(NULL);
1228 }
1229 result = gtk3_widgets[_GTK_NOTEBOOK_TYPE];
1230 break;
1231 case TOGGLE_BUTTON:
1232 if (init_result = (NULL == gtk3_widgets[_GTK_TOGGLE_BUTTON_TYPE]))
1233 {
1234 gtk3_widgets[_GTK_TOGGLE_BUTTON_TYPE] =
1235 (*fp_gtk_toggle_button_new)(NULL);
1236 }
1237 result = gtk3_widgets[_GTK_TOGGLE_BUTTON_TYPE];
1238 break;
1239 case TOOL_BAR:
1240 case TOOL_BAR_DRAG_WINDOW:
1241 if (init_result = (NULL == gtk3_widgets[_GTK_TOOLBAR_TYPE]))
1242 {
1243 gtk3_widgets[_GTK_TOOLBAR_TYPE] =
1244 (*fp_gtk_toolbar_new)(NULL);
1245 }
1246 result = gtk3_widgets[_GTK_TOOLBAR_TYPE];
1247 break;
1248 case TOOL_BAR_SEPARATOR:
1249 if (init_result =
1250 (NULL == gtk3_widgets[_GTK_SEPARATOR_TOOL_ITEM_TYPE]))
1251 {
1252 gtk3_widgets[_GTK_SEPARATOR_TOOL_ITEM_TYPE] =
1253 (*fp_gtk_separator_tool_item_new)();
1254 }
1255 result = gtk3_widgets[_GTK_SEPARATOR_TOOL_ITEM_TYPE];
1256 break;
1257 case VIEWPORT:
1258 if (init_result = (NULL == gtk3_widgets[_GTK_VIEWPORT_TYPE]))
1259 {
1260 GtkAdjustment *adjustment = create_adjustment();
1261 gtk3_widgets[_GTK_VIEWPORT_TYPE] =
1262 (*fp_gtk_viewport_new)(adjustment, adjustment);
1263 }
1264 result = gtk3_widgets[_GTK_VIEWPORT_TYPE];
1265 break;
1266 case VSCROLL_BAR:
1267 case VSCROLL_BAR_BUTTON_UP:
1268 case VSCROLL_BAR_BUTTON_DOWN:
1269 case VSCROLL_BAR_TRACK:
1270 case VSCROLL_BAR_THUMB:
1271 if (init_result = (NULL == gtk3_widgets[_GTK_VSCROLLBAR_TYPE]))
1272 {
1273 gtk3_widgets[_GTK_VSCROLLBAR_TYPE] =
1274 (*fp_gtk_vscrollbar_new)(create_adjustment());
1275 }
1276 result = gtk3_widgets[_GTK_VSCROLLBAR_TYPE];
1277 break;
1278 case VSEPARATOR:
1279 if (init_result = (NULL == gtk3_widgets[_GTK_VSEPARATOR_TYPE]))
1280 {
1281 gtk3_widgets[_GTK_VSEPARATOR_TYPE] =
1282 (*fp_gtk_vseparator_new)();
1283 }
1284 result = gtk3_widgets[_GTK_VSEPARATOR_TYPE];
1285 break;
1286 case VSLIDER:
1287 case VSLIDER_THUMB:
1288 case VSLIDER_TRACK:
1289 if (init_result = (NULL == gtk3_widgets[_GTK_VSCALE_TYPE]))
1290 {
1291 gtk3_widgets[_GTK_VSCALE_TYPE] =
1292 (*fp_gtk_scale_new)(GTK_ORIENTATION_VERTICAL, NULL);
1293 }
1294 result = gtk3_widgets[_GTK_VSCALE_TYPE];
1295 /*
1296 * Vertical JSliders start at the bottom, while vertical
1297 * GtkVScale widgets start at the top (by default), so to fix
1298 * this we set the "inverted" flag to get the Swing behavior.
1299 */
1300 fp_gtk_range_set_inverted((GtkRange*)result, TRUE);
1301 break;
1302 case VSPLIT_PANE_DIVIDER:
1303 if (init_result = (NULL == gtk3_widgets[_GTK_VPANED_TYPE]))
1304 {
1305 gtk3_widgets[_GTK_VPANED_TYPE] = (*fp_gtk_vpaned_new)();
1306 }
1307 result = gtk3_widgets[_GTK_VPANED_TYPE];
1308 break;
1309 default:
1310 result = NULL;
1311 break;
1312 }
1313
1314 if (result != NULL && init_result)
1315 {
1316 if (widget_type == RADIO_BUTTON_MENU_ITEM ||
1317 widget_type == CHECK_BOX_MENU_ITEM ||
1318 widget_type == MENU_ITEM ||
1319 widget_type == MENU ||
1320 widget_type == POPUP_MENU_SEPARATOR)
1321 {
1322 GtkWidget *menu = gtk3_get_widget(POPUP_MENU);
1323 (*fp_gtk_menu_shell_append)((GtkMenuShell *)menu, result);
2000 return 0;
2001 }
2002
2003 static gint gtk3_get_ythickness(JNIEnv *env, WidgetType widget_type)
2004 {
2005 init_containers();
2006
2007 gtk3_widget = gtk3_get_widget(widget_type);
2008 GtkStyleContext* context = fp_gtk_widget_get_style_context (gtk3_widget);
2009 if (context) {
2010 GtkBorder padding;
2011 fp_gtk_style_context_get_padding(context, 0, &padding);
2012 return padding.top + 1;
2013 }
2014 return 0;
2015 }
2016
2017 /*************************************************/
2018 static guint8 recode_color(gdouble channel)
2019 {
2020 guint16 result = (guint16)(channel * 65535);
2021 if (result > 65535) {
2022 result = 65535;
2023 }
2024 return (guint8)( result >> 8);
2025 }
2026
2027 static GtkStateFlags gtk3_get_state_flags(GtkStateType state_type) {
2028 switch (state_type)
2029 {
2030 case GTK_STATE_NORMAL:
2031 return GTK_STATE_FLAG_NORMAL;
2032 case GTK_STATE_ACTIVE:
2033 return GTK_STATE_FLAG_ACTIVE;
2034 case GTK_STATE_PRELIGHT:
2035 return GTK_STATE_FLAG_PRELIGHT;
2036 case GTK_STATE_SELECTED:
2037 return GTK_STATE_FLAG_SELECTED;
2038 case GTK_STATE_INSENSITIVE:
2039 return GTK_STATE_FLAG_INSENSITIVE;
2040 case GTK_STATE_INCONSISTENT:
|
574 dlclose(gtk3_libhandle);
575 gtk3_libhandle = NULL;
576
577 dlclose(gthread_libhandle);
578 gthread_libhandle = NULL;
579
580 return NULL;
581 }
582
583 /*
584 * Strip the AT-SPI GTK_MODULES if present
585 */
586 gtk_modules_env = getenv ("GTK_MODULES");
587 if ((gtk_modules_env && strstr(gtk_modules_env, "atk-bridge")) ||
588 (gtk_modules_env && strstr(gtk_modules_env, "gail"))) {
589 /* careful, strtok modifies its args */
590 gchar *tmp_env = strdup(gtk_modules_env);
591 if (tmp_env) {
592 /* the new env will be smaller than the old one */
593 gchar *s, *new_env = SAFE_SIZE_STRUCT_ALLOC(malloc,
594 (int)sizeof(ENV_PREFIX), 1, (int)strlen (gtk_modules_env));
595
596 if (new_env) {
597 strcpy(new_env, ENV_PREFIX);
598
599 /* strip out 'atk-bridge' and 'gail' */
600 size_t PREFIX_LENGTH = strlen(ENV_PREFIX);
601 gchar *tmp_ptr = NULL;
602 for (s = strtok_r(tmp_env, ":", &tmp_ptr); s;
603 s = strtok_r(NULL, ":", &tmp_ptr)) {
604 if ((!strstr(s, "atk-bridge")) && (!strstr(s, "gail"))) {
605 if (strlen(new_env) > PREFIX_LENGTH) {
606 new_env = strcat(new_env, ":");
607 }
608 new_env = strcat(new_env, s);
609 }
610 }
611 if (putenv(new_env) != 0) {
612 /* no free() on success, putenv() doesn't copy string */
613 free(new_env);
614 }
905 }
906
907 static GtkAdjustment* create_adjustment()
908 {
909 return (GtkAdjustment *)
910 (*fp_gtk_adjustment_new)(50.0, 0.0, 100.0, 10.0, 20.0, 20.0);
911 }
912
913 /**
914 * Returns a pointer to the cached native widget for the specified widget
915 * type.
916 */
917 static GtkWidget *gtk3_get_widget(WidgetType widget_type)
918 {
919 gboolean init_result = FALSE;
920 GtkWidget *result = NULL;
921 switch (widget_type)
922 {
923 case BUTTON:
924 case TABLE_HEADER:
925 if ((init_result = (NULL == gtk3_widgets[_GTK_BUTTON_TYPE])))
926 {
927 gtk3_widgets[_GTK_BUTTON_TYPE] = (*fp_gtk_button_new)();
928 }
929 result = gtk3_widgets[_GTK_BUTTON_TYPE];
930 break;
931 case CHECK_BOX:
932 if ((init_result = (NULL == gtk3_widgets[_GTK_CHECK_BUTTON_TYPE])))
933 {
934 gtk3_widgets[_GTK_CHECK_BUTTON_TYPE] =
935 (*fp_gtk_check_button_new)();
936 }
937 result = gtk3_widgets[_GTK_CHECK_BUTTON_TYPE];
938 break;
939 case CHECK_BOX_MENU_ITEM:
940 if ((init_result = (NULL == gtk3_widgets[_GTK_CHECK_MENU_ITEM_TYPE])))
941 {
942 gtk3_widgets[_GTK_CHECK_MENU_ITEM_TYPE] =
943 (*fp_gtk_check_menu_item_new)();
944 }
945 result = gtk3_widgets[_GTK_CHECK_MENU_ITEM_TYPE];
946 break;
947 /************************************************************
948 * Creation a dedicated color chooser is dangerous because
949 * it deadlocks the EDT
950 ************************************************************/
951 /* case COLOR_CHOOSER:
952 if (init_result =
953 (NULL == gtk3_widgets[_GTK_COLOR_SELECTION_DIALOG_TYPE]))
954 {
955 gtk3_widgets[_GTK_COLOR_SELECTION_DIALOG_TYPE] =
956 (*fp_gtk_color_selection_dialog_new)(NULL);
957 }
958 result = gtk3_widgets[_GTK_COLOR_SELECTION_DIALOG_TYPE];
959 break;*/
960 case COMBO_BOX:
961 if ((init_result = (NULL == gtk3_widgets[_GTK_COMBO_BOX_TYPE])))
962 {
963 gtk3_widgets[_GTK_COMBO_BOX_TYPE] =
964 (*fp_gtk_combo_box_new)();
965 }
966 result = gtk3_widgets[_GTK_COMBO_BOX_TYPE];
967 break;
968 case COMBO_BOX_ARROW_BUTTON:
969 if ((init_result =
970 (NULL == gtk3_widgets[_GTK_COMBO_BOX_ARROW_BUTTON_TYPE])))
971 {
972 gtk3_widgets[_GTK_COMBO_BOX_ARROW_BUTTON_TYPE] =
973 (*fp_gtk_toggle_button_new)();
974 }
975 result = gtk3_widgets[_GTK_COMBO_BOX_ARROW_BUTTON_TYPE];
976 break;
977 case COMBO_BOX_TEXT_FIELD:
978 if ((init_result =
979 (NULL == gtk3_widgets[_GTK_COMBO_BOX_TEXT_FIELD_TYPE])))
980 {
981 result = gtk3_widgets[_GTK_COMBO_BOX_TEXT_FIELD_TYPE] =
982 (*fp_gtk_entry_new)();
983 }
984 result = gtk3_widgets[_GTK_COMBO_BOX_TEXT_FIELD_TYPE];
985 break;
986 case DESKTOP_ICON:
987 case INTERNAL_FRAME_TITLE_PANE:
988 case LABEL:
989 if ((init_result = (NULL == gtk3_widgets[_GTK_LABEL_TYPE])))
990 {
991 gtk3_widgets[_GTK_LABEL_TYPE] =
992 (*fp_gtk_label_new)(NULL);
993 }
994 result = gtk3_widgets[_GTK_LABEL_TYPE];
995 break;
996 case DESKTOP_PANE:
997 case PANEL:
998 case ROOT_PANE:
999 if ((init_result = (NULL == gtk3_widgets[_GTK_CONTAINER_TYPE])))
1000 {
1001 /* There is no constructor for a container type. I've
1002 * chosen GtkFixed container since it has a default
1003 * constructor.
1004 */
1005 gtk3_widgets[_GTK_CONTAINER_TYPE] =
1006 (*fp_gtk_fixed_new)();
1007 }
1008 result = gtk3_widgets[_GTK_CONTAINER_TYPE];
1009 break;
1010 case EDITOR_PANE:
1011 case TEXT_AREA:
1012 case TEXT_PANE:
1013 if ((init_result = (NULL == gtk3_widgets[_GTK_TEXT_VIEW_TYPE])))
1014 {
1015 gtk3_widgets[_GTK_TEXT_VIEW_TYPE] =
1016 (*fp_gtk_text_view_new)();
1017 }
1018 result = gtk3_widgets[_GTK_TEXT_VIEW_TYPE];
1019 break;
1020 case FORMATTED_TEXT_FIELD:
1021 case PASSWORD_FIELD:
1022 case TEXT_FIELD:
1023 if ((init_result = (NULL == gtk3_widgets[_GTK_ENTRY_TYPE])))
1024 {
1025 gtk3_widgets[_GTK_ENTRY_TYPE] =
1026 (*fp_gtk_entry_new)();
1027 }
1028 result = gtk3_widgets[_GTK_ENTRY_TYPE];
1029 break;
1030 case HANDLE_BOX:
1031 if ((init_result = (NULL == gtk3_widgets[_GTK_HANDLE_BOX_TYPE])))
1032 {
1033 gtk3_widgets[_GTK_HANDLE_BOX_TYPE] =
1034 (*fp_gtk_handle_box_new)();
1035 }
1036 result = gtk3_widgets[_GTK_HANDLE_BOX_TYPE];
1037 break;
1038 case HSCROLL_BAR:
1039 case HSCROLL_BAR_BUTTON_LEFT:
1040 case HSCROLL_BAR_BUTTON_RIGHT:
1041 case HSCROLL_BAR_TRACK:
1042 case HSCROLL_BAR_THUMB:
1043 if ((init_result = (NULL == gtk3_widgets[_GTK_HSCROLLBAR_TYPE])))
1044 {
1045 gtk3_widgets[_GTK_HSCROLLBAR_TYPE] =
1046 (*fp_gtk_hscrollbar_new)(create_adjustment());
1047 }
1048 result = gtk3_widgets[_GTK_HSCROLLBAR_TYPE];
1049 break;
1050 case HSEPARATOR:
1051 if ((init_result = (NULL == gtk3_widgets[_GTK_HSEPARATOR_TYPE])))
1052 {
1053 gtk3_widgets[_GTK_HSEPARATOR_TYPE] =
1054 (*fp_gtk_hseparator_new)();
1055 }
1056 result = gtk3_widgets[_GTK_HSEPARATOR_TYPE];
1057 break;
1058 case HSLIDER:
1059 case HSLIDER_THUMB:
1060 case HSLIDER_TRACK:
1061 if ((init_result = (NULL == gtk3_widgets[_GTK_HSCALE_TYPE])))
1062 {
1063 gtk3_widgets[_GTK_HSCALE_TYPE] =
1064 (*fp_gtk_scale_new)(GTK_ORIENTATION_HORIZONTAL, NULL);
1065 }
1066 result = gtk3_widgets[_GTK_HSCALE_TYPE];
1067 break;
1068 case HSPLIT_PANE_DIVIDER:
1069 case SPLIT_PANE:
1070 if ((init_result = (NULL == gtk3_widgets[_GTK_HPANED_TYPE])))
1071 {
1072 gtk3_widgets[_GTK_HPANED_TYPE] = (*fp_gtk_hpaned_new)();
1073 }
1074 result = gtk3_widgets[_GTK_HPANED_TYPE];
1075 break;
1076 case IMAGE:
1077 if ((init_result = (NULL == gtk3_widgets[_GTK_IMAGE_TYPE])))
1078 {
1079 gtk3_widgets[_GTK_IMAGE_TYPE] = (*fp_gtk_image_new)();
1080 }
1081 result = gtk3_widgets[_GTK_IMAGE_TYPE];
1082 break;
1083 case INTERNAL_FRAME:
1084 if ((init_result = (NULL == gtk3_widgets[_GTK_WINDOW_TYPE])))
1085 {
1086 gtk3_widgets[_GTK_WINDOW_TYPE] =
1087 (*fp_gtk_window_new)(GTK_WINDOW_TOPLEVEL);
1088 }
1089 result = gtk3_widgets[_GTK_WINDOW_TYPE];
1090 break;
1091 case TOOL_TIP:
1092 if ((init_result = (NULL == gtk3_widgets[_GTK_TOOLTIP_TYPE])))
1093 {
1094 result = (*fp_gtk_window_new)(GTK_WINDOW_TOPLEVEL);
1095 gtk3_widgets[_GTK_TOOLTIP_TYPE] = result;
1096 }
1097 result = gtk3_widgets[_GTK_TOOLTIP_TYPE];
1098 break;
1099 case LIST:
1100 case TABLE:
1101 case TREE:
1102 case TREE_CELL:
1103 if ((init_result = (NULL == gtk3_widgets[_GTK_TREE_VIEW_TYPE])))
1104 {
1105 gtk3_widgets[_GTK_TREE_VIEW_TYPE] =
1106 (*fp_gtk_tree_view_new)();
1107 }
1108 result = gtk3_widgets[_GTK_TREE_VIEW_TYPE];
1109 break;
1110 case TITLED_BORDER:
1111 if ((init_result = (NULL == gtk3_widgets[_GTK_FRAME_TYPE])))
1112 {
1113 gtk3_widgets[_GTK_FRAME_TYPE] = fp_gtk_frame_new(NULL);
1114 }
1115 result = gtk3_widgets[_GTK_FRAME_TYPE];
1116 break;
1117 case POPUP_MENU:
1118 if ((init_result = (NULL == gtk3_widgets[_GTK_MENU_TYPE])))
1119 {
1120 gtk3_widgets[_GTK_MENU_TYPE] =
1121 (*fp_gtk_menu_new)();
1122 }
1123 result = gtk3_widgets[_GTK_MENU_TYPE];
1124 break;
1125 case MENU:
1126 case MENU_ITEM:
1127 case MENU_ITEM_ACCELERATOR:
1128 if ((init_result = (NULL == gtk3_widgets[_GTK_MENU_ITEM_TYPE])))
1129 {
1130 gtk3_widgets[_GTK_MENU_ITEM_TYPE] =
1131 (*fp_gtk_menu_item_new)();
1132 }
1133 result = gtk3_widgets[_GTK_MENU_ITEM_TYPE];
1134 break;
1135 case MENU_BAR:
1136 if ((init_result = (NULL == gtk3_widgets[_GTK_MENU_BAR_TYPE])))
1137 {
1138 gtk3_widgets[_GTK_MENU_BAR_TYPE] =
1139 (*fp_gtk_menu_bar_new)();
1140 }
1141 result = gtk3_widgets[_GTK_MENU_BAR_TYPE];
1142 break;
1143 case COLOR_CHOOSER:
1144 case OPTION_PANE:
1145 if ((init_result = (NULL == gtk3_widgets[_GTK_DIALOG_TYPE])))
1146 {
1147 gtk3_widgets[_GTK_DIALOG_TYPE] =
1148 (*fp_gtk_dialog_new)();
1149 }
1150 result = gtk3_widgets[_GTK_DIALOG_TYPE];
1151 break;
1152 case POPUP_MENU_SEPARATOR:
1153 if ((init_result =
1154 (NULL == gtk3_widgets[_GTK_SEPARATOR_MENU_ITEM_TYPE])))
1155 {
1156 gtk3_widgets[_GTK_SEPARATOR_MENU_ITEM_TYPE] =
1157 (*fp_gtk_separator_menu_item_new)();
1158 }
1159 result = gtk3_widgets[_GTK_SEPARATOR_MENU_ITEM_TYPE];
1160 break;
1161 case HPROGRESS_BAR:
1162 if ((init_result = (NULL == gtk3_widgets[_GTK_HPROGRESS_BAR_TYPE])))
1163 {
1164 gtk3_widgets[_GTK_HPROGRESS_BAR_TYPE] =
1165 (*fp_gtk_progress_bar_new)();
1166 }
1167 result = gtk3_widgets[_GTK_HPROGRESS_BAR_TYPE];
1168 break;
1169 case VPROGRESS_BAR:
1170 if ((init_result = (NULL == gtk3_widgets[_GTK_VPROGRESS_BAR_TYPE])))
1171 {
1172 gtk3_widgets[_GTK_VPROGRESS_BAR_TYPE] =
1173 (*fp_gtk_progress_bar_new)();
1174 /*
1175 * Vertical JProgressBars always go bottom-to-top,
1176 * regardless of the ComponentOrientation.
1177 */
1178 (*fp_gtk_progress_bar_set_orientation)(
1179 (GtkProgressBar *)gtk3_widgets[_GTK_VPROGRESS_BAR_TYPE],
1180 GTK_PROGRESS_BOTTOM_TO_TOP);
1181 }
1182 result = gtk3_widgets[_GTK_VPROGRESS_BAR_TYPE];
1183 break;
1184 case RADIO_BUTTON:
1185 if ((init_result = (NULL == gtk3_widgets[_GTK_RADIO_BUTTON_TYPE])))
1186 {
1187 gtk3_widgets[_GTK_RADIO_BUTTON_TYPE] =
1188 (*fp_gtk_radio_button_new)(NULL);
1189 }
1190 result = gtk3_widgets[_GTK_RADIO_BUTTON_TYPE];
1191 break;
1192 case RADIO_BUTTON_MENU_ITEM:
1193 if ((init_result =
1194 (NULL == gtk3_widgets[_GTK_RADIO_MENU_ITEM_TYPE])))
1195 {
1196 gtk3_widgets[_GTK_RADIO_MENU_ITEM_TYPE] =
1197 (*fp_gtk_radio_menu_item_new)(NULL);
1198 }
1199 result = gtk3_widgets[_GTK_RADIO_MENU_ITEM_TYPE];
1200 break;
1201 case SCROLL_PANE:
1202 if ((init_result =
1203 (NULL == gtk3_widgets[_GTK_SCROLLED_WINDOW_TYPE])))
1204 {
1205 gtk3_widgets[_GTK_SCROLLED_WINDOW_TYPE] =
1206 (*fp_gtk_scrolled_window_new)(NULL, NULL);
1207 }
1208 result = gtk3_widgets[_GTK_SCROLLED_WINDOW_TYPE];
1209 break;
1210 case SPINNER:
1211 case SPINNER_ARROW_BUTTON:
1212 case SPINNER_TEXT_FIELD:
1213 if ((init_result = (NULL == gtk3_widgets[_GTK_SPIN_BUTTON_TYPE])))
1214 {
1215 result = gtk3_widgets[_GTK_SPIN_BUTTON_TYPE] =
1216 (*fp_gtk_spin_button_new)(NULL, 0, 0);
1217 }
1218 result = gtk3_widgets[_GTK_SPIN_BUTTON_TYPE];
1219 break;
1220 case TABBED_PANE:
1221 case TABBED_PANE_TAB_AREA:
1222 case TABBED_PANE_CONTENT:
1223 case TABBED_PANE_TAB:
1224 if ((init_result = (NULL == gtk3_widgets[_GTK_NOTEBOOK_TYPE])))
1225 {
1226 gtk3_widgets[_GTK_NOTEBOOK_TYPE] =
1227 (*fp_gtk_notebook_new)(NULL);
1228 }
1229 result = gtk3_widgets[_GTK_NOTEBOOK_TYPE];
1230 break;
1231 case TOGGLE_BUTTON:
1232 if ((init_result = (NULL == gtk3_widgets[_GTK_TOGGLE_BUTTON_TYPE])))
1233 {
1234 gtk3_widgets[_GTK_TOGGLE_BUTTON_TYPE] =
1235 (*fp_gtk_toggle_button_new)(NULL);
1236 }
1237 result = gtk3_widgets[_GTK_TOGGLE_BUTTON_TYPE];
1238 break;
1239 case TOOL_BAR:
1240 case TOOL_BAR_DRAG_WINDOW:
1241 if ((init_result = (NULL == gtk3_widgets[_GTK_TOOLBAR_TYPE])))
1242 {
1243 gtk3_widgets[_GTK_TOOLBAR_TYPE] =
1244 (*fp_gtk_toolbar_new)(NULL);
1245 }
1246 result = gtk3_widgets[_GTK_TOOLBAR_TYPE];
1247 break;
1248 case TOOL_BAR_SEPARATOR:
1249 if ((init_result =
1250 (NULL == gtk3_widgets[_GTK_SEPARATOR_TOOL_ITEM_TYPE])))
1251 {
1252 gtk3_widgets[_GTK_SEPARATOR_TOOL_ITEM_TYPE] =
1253 (*fp_gtk_separator_tool_item_new)();
1254 }
1255 result = gtk3_widgets[_GTK_SEPARATOR_TOOL_ITEM_TYPE];
1256 break;
1257 case VIEWPORT:
1258 if ((init_result = (NULL == gtk3_widgets[_GTK_VIEWPORT_TYPE])))
1259 {
1260 GtkAdjustment *adjustment = create_adjustment();
1261 gtk3_widgets[_GTK_VIEWPORT_TYPE] =
1262 (*fp_gtk_viewport_new)(adjustment, adjustment);
1263 }
1264 result = gtk3_widgets[_GTK_VIEWPORT_TYPE];
1265 break;
1266 case VSCROLL_BAR:
1267 case VSCROLL_BAR_BUTTON_UP:
1268 case VSCROLL_BAR_BUTTON_DOWN:
1269 case VSCROLL_BAR_TRACK:
1270 case VSCROLL_BAR_THUMB:
1271 if ((init_result = (NULL == gtk3_widgets[_GTK_VSCROLLBAR_TYPE])))
1272 {
1273 gtk3_widgets[_GTK_VSCROLLBAR_TYPE] =
1274 (*fp_gtk_vscrollbar_new)(create_adjustment());
1275 }
1276 result = gtk3_widgets[_GTK_VSCROLLBAR_TYPE];
1277 break;
1278 case VSEPARATOR:
1279 if ((init_result = (NULL == gtk3_widgets[_GTK_VSEPARATOR_TYPE])))
1280 {
1281 gtk3_widgets[_GTK_VSEPARATOR_TYPE] =
1282 (*fp_gtk_vseparator_new)();
1283 }
1284 result = gtk3_widgets[_GTK_VSEPARATOR_TYPE];
1285 break;
1286 case VSLIDER:
1287 case VSLIDER_THUMB:
1288 case VSLIDER_TRACK:
1289 if ((init_result = (NULL == gtk3_widgets[_GTK_VSCALE_TYPE])))
1290 {
1291 gtk3_widgets[_GTK_VSCALE_TYPE] =
1292 (*fp_gtk_scale_new)(GTK_ORIENTATION_VERTICAL, NULL);
1293 }
1294 result = gtk3_widgets[_GTK_VSCALE_TYPE];
1295 /*
1296 * Vertical JSliders start at the bottom, while vertical
1297 * GtkVScale widgets start at the top (by default), so to fix
1298 * this we set the "inverted" flag to get the Swing behavior.
1299 */
1300 fp_gtk_range_set_inverted((GtkRange*)result, TRUE);
1301 break;
1302 case VSPLIT_PANE_DIVIDER:
1303 if ((init_result = (NULL == gtk3_widgets[_GTK_VPANED_TYPE])))
1304 {
1305 gtk3_widgets[_GTK_VPANED_TYPE] = (*fp_gtk_vpaned_new)();
1306 }
1307 result = gtk3_widgets[_GTK_VPANED_TYPE];
1308 break;
1309 default:
1310 result = NULL;
1311 break;
1312 }
1313
1314 if (result != NULL && init_result)
1315 {
1316 if (widget_type == RADIO_BUTTON_MENU_ITEM ||
1317 widget_type == CHECK_BOX_MENU_ITEM ||
1318 widget_type == MENU_ITEM ||
1319 widget_type == MENU ||
1320 widget_type == POPUP_MENU_SEPARATOR)
1321 {
1322 GtkWidget *menu = gtk3_get_widget(POPUP_MENU);
1323 (*fp_gtk_menu_shell_append)((GtkMenuShell *)menu, result);
2000 return 0;
2001 }
2002
2003 static gint gtk3_get_ythickness(JNIEnv *env, WidgetType widget_type)
2004 {
2005 init_containers();
2006
2007 gtk3_widget = gtk3_get_widget(widget_type);
2008 GtkStyleContext* context = fp_gtk_widget_get_style_context (gtk3_widget);
2009 if (context) {
2010 GtkBorder padding;
2011 fp_gtk_style_context_get_padding(context, 0, &padding);
2012 return padding.top + 1;
2013 }
2014 return 0;
2015 }
2016
2017 /*************************************************/
2018 static guint8 recode_color(gdouble channel)
2019 {
2020 guint32 result = (guint32)(channel * 65535);
2021 if (result > 65535) {
2022 result = 65535;
2023 }
2024 return (guint8)( result >> 8);
2025 }
2026
2027 static GtkStateFlags gtk3_get_state_flags(GtkStateType state_type) {
2028 switch (state_type)
2029 {
2030 case GTK_STATE_NORMAL:
2031 return GTK_STATE_FLAG_NORMAL;
2032 case GTK_STATE_ACTIVE:
2033 return GTK_STATE_FLAG_ACTIVE;
2034 case GTK_STATE_PRELIGHT:
2035 return GTK_STATE_FLAG_PRELIGHT;
2036 case GTK_STATE_SELECTED:
2037 return GTK_STATE_FLAG_SELECTED;
2038 case GTK_STATE_INSENSITIVE:
2039 return GTK_STATE_FLAG_INSENSITIVE;
2040 case GTK_STATE_INCONSISTENT:
|