< prev index next >

src/java.desktop/unix/native/libawt_xawt/awt/gtk3_interface.c

Print this page




 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:


< prev index next >