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