< prev index next >

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

Print this page




 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;


< prev index next >