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