< prev index next >

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

Print this page




 754         dlclose(gtk2_libhandle);
 755         gtk2_libhandle = NULL;
 756 
 757         dlclose(gthread_libhandle);
 758         gthread_libhandle = NULL;
 759 
 760         return FALSE;
 761     }
 762 
 763     /*
 764      * Strip the AT-SPI GTK_MODULES if present
 765      */
 766     gtk_modules_env = getenv ("GTK_MODULES");
 767     if ((gtk_modules_env && strstr(gtk_modules_env, "atk-bridge")) ||
 768         (gtk_modules_env && strstr(gtk_modules_env, "gail"))) {
 769         /* careful, strtok modifies its args */
 770         gchar *tmp_env = strdup(gtk_modules_env);
 771         if (tmp_env) {
 772             /* the new env will be smaller than the old one */
 773             gchar *s, *new_env = SAFE_SIZE_STRUCT_ALLOC(malloc,
 774                     sizeof(ENV_PREFIX), 1, strlen (gtk_modules_env));
 775 
 776             if (new_env) {
 777                 strcpy(new_env, ENV_PREFIX);
 778 
 779                 /* strip out 'atk-bridge' and 'gail' */
 780                 size_t PREFIX_LENGTH = strlen(ENV_PREFIX);
 781                 gchar *tmp_ptr = NULL;
 782                 for (s = strtok_r(tmp_env, ":", &tmp_ptr); s;
 783                      s = strtok_r(NULL, ":", &tmp_ptr)) {
 784                     if ((!strstr(s, "atk-bridge")) && (!strstr(s, "gail"))) {
 785                         if (strlen(new_env) > PREFIX_LENGTH) {
 786                             new_env = strcat(new_env, ":");
 787                         }
 788                         new_env = strcat(new_env, s);
 789                     }
 790                 }
 791                 if (putenv(new_env) != 0) {
 792                     /* no free() on success, putenv() doesn't copy string */
 793                     free(new_env);
 794                 }


1074 /*
1075  * Initializes the widget to correct state for some engines.
1076  * This is a pure empirical method.
1077  */
1078 static void init_toggle_widget(WidgetType widget_type, gint synth_state)
1079 {
1080     gboolean is_active = ((synth_state & SELECTED) != 0);
1081 
1082     if (widget_type == RADIO_BUTTON ||
1083         widget_type == CHECK_BOX ||
1084         widget_type == TOGGLE_BUTTON) {
1085         ((GtkToggleButton*)gtk2_widget)->active = is_active;
1086     }
1087 
1088     if ((synth_state & FOCUSED) != 0) {
1089         ((GtkObject*)gtk2_widget)->flags |= GTK_HAS_FOCUS;
1090     } else {
1091         ((GtkObject*)gtk2_widget)->flags &= ~GTK_HAS_FOCUS;
1092     }
1093 
1094     if ((synth_state & MOUSE_OVER) != 0 && (synth_state & PRESSED) == 0 ||
1095            (synth_state & FOCUSED) != 0 && (synth_state & PRESSED) != 0) {
1096         gtk2_widget->state = GTK_STATE_PRELIGHT;
1097     } else if ((synth_state & DISABLED) != 0) {
1098         gtk2_widget->state = GTK_STATE_INSENSITIVE;
1099     } else {
1100         gtk2_widget->state = is_active ? GTK_STATE_ACTIVE : GTK_STATE_NORMAL;
1101     }
1102 }
1103 
1104 /* GTK state_type filter */
1105 static GtkStateType get_gtk_state_type(WidgetType widget_type, gint synth_state)
1106 {
1107     GtkStateType result = GTK_STATE_NORMAL;
1108 
1109     if ((synth_state & DISABLED) != 0) {
1110         result = GTK_STATE_INSENSITIVE;
1111     } else if ((synth_state & PRESSED) != 0) {
1112         result = GTK_STATE_ACTIVE;
1113     } else if ((synth_state & MOUSE_OVER) != 0) {
1114         result = GTK_STATE_PRELIGHT;
1115     }


1144 }
1145 
1146 static GtkAdjustment* create_adjustment()
1147 {
1148     return (GtkAdjustment *)
1149             (*fp_gtk_adjustment_new)(50.0, 0.0, 100.0, 10.0, 20.0, 20.0);
1150 }
1151 
1152 /**
1153  * Returns a pointer to the cached native widget for the specified widget
1154  * type.
1155  */
1156 static GtkWidget *gtk2_get_widget(WidgetType widget_type)
1157 {
1158     gboolean init_result = FALSE;
1159     GtkWidget *result = NULL;
1160     switch (widget_type)
1161     {
1162         case BUTTON:
1163         case TABLE_HEADER:
1164             if (init_result = (NULL == gtk2_widgets[_GTK_BUTTON_TYPE]))
1165             {
1166                 gtk2_widgets[_GTK_BUTTON_TYPE] = (*fp_gtk_button_new)();
1167             }
1168             result = gtk2_widgets[_GTK_BUTTON_TYPE];
1169             break;
1170         case CHECK_BOX:
1171             if (init_result = (NULL == gtk2_widgets[_GTK_CHECK_BUTTON_TYPE]))
1172             {
1173                 gtk2_widgets[_GTK_CHECK_BUTTON_TYPE] =
1174                     (*fp_gtk_check_button_new)();
1175             }
1176             result = gtk2_widgets[_GTK_CHECK_BUTTON_TYPE];
1177             break;
1178         case CHECK_BOX_MENU_ITEM:
1179             if (init_result = (NULL == gtk2_widgets[_GTK_CHECK_MENU_ITEM_TYPE]))
1180             {
1181                 gtk2_widgets[_GTK_CHECK_MENU_ITEM_TYPE] =
1182                     (*fp_gtk_check_menu_item_new)();
1183             }
1184             result = gtk2_widgets[_GTK_CHECK_MENU_ITEM_TYPE];
1185             break;
1186         /************************************************************
1187          *    Creation a dedicated color chooser is dangerous because
1188          * it deadlocks the EDT
1189          ************************************************************/
1190 /*        case COLOR_CHOOSER:
1191             if (init_result =
1192                     (NULL == gtk2_widgets[_GTK_COLOR_SELECTION_DIALOG_TYPE]))
1193             {
1194                 gtk2_widgets[_GTK_COLOR_SELECTION_DIALOG_TYPE] =
1195                     (*fp_gtk_color_selection_dialog_new)(NULL);
1196             }
1197             result = gtk2_widgets[_GTK_COLOR_SELECTION_DIALOG_TYPE];
1198             break;*/
1199         case COMBO_BOX:
1200             if (init_result = (NULL == gtk2_widgets[_GTK_COMBO_BOX_TYPE]))
1201             {
1202                 gtk2_widgets[_GTK_COMBO_BOX_TYPE] =
1203                     (*fp_gtk_combo_box_new)();
1204             }
1205             result = gtk2_widgets[_GTK_COMBO_BOX_TYPE];
1206             break;
1207         case COMBO_BOX_ARROW_BUTTON:
1208             if (init_result =
1209                     (NULL == gtk2_widgets[_GTK_COMBO_BOX_ARROW_BUTTON_TYPE]))
1210             {
1211                 gtk2_widgets[_GTK_COMBO_BOX_ARROW_BUTTON_TYPE] =
1212                      (*fp_gtk_toggle_button_new)();
1213             }
1214             result = gtk2_widgets[_GTK_COMBO_BOX_ARROW_BUTTON_TYPE];
1215             break;
1216         case COMBO_BOX_TEXT_FIELD:
1217             if (init_result =
1218                     (NULL == gtk2_widgets[_GTK_COMBO_BOX_TEXT_FIELD_TYPE]))
1219             {
1220                 result = gtk2_widgets[_GTK_COMBO_BOX_TEXT_FIELD_TYPE] =
1221                      (*fp_gtk_entry_new)();
1222             }
1223             result = gtk2_widgets[_GTK_COMBO_BOX_TEXT_FIELD_TYPE];
1224             break;
1225         case DESKTOP_ICON:
1226         case INTERNAL_FRAME_TITLE_PANE:
1227         case LABEL:
1228             if (init_result = (NULL == gtk2_widgets[_GTK_LABEL_TYPE]))
1229             {
1230                 gtk2_widgets[_GTK_LABEL_TYPE] =
1231                     (*fp_gtk_label_new)(NULL);
1232             }
1233             result = gtk2_widgets[_GTK_LABEL_TYPE];
1234             break;
1235         case DESKTOP_PANE:
1236         case PANEL:
1237         case ROOT_PANE:
1238             if (init_result = (NULL == gtk2_widgets[_GTK_CONTAINER_TYPE]))
1239             {
1240                 /* There is no constructor for a container type.  I've
1241                  * chosen GtkFixed container since it has a default
1242                  * constructor.
1243                  */
1244                 gtk2_widgets[_GTK_CONTAINER_TYPE] =
1245                     (*fp_gtk_fixed_new)();
1246             }
1247             result = gtk2_widgets[_GTK_CONTAINER_TYPE];
1248             break;
1249         case EDITOR_PANE:
1250         case TEXT_AREA:
1251         case TEXT_PANE:
1252             if (init_result = (NULL == gtk2_widgets[_GTK_TEXT_VIEW_TYPE]))
1253             {
1254                 gtk2_widgets[_GTK_TEXT_VIEW_TYPE] =
1255                     (*fp_gtk_text_view_new)();
1256             }
1257             result = gtk2_widgets[_GTK_TEXT_VIEW_TYPE];
1258             break;
1259         case FORMATTED_TEXT_FIELD:
1260         case PASSWORD_FIELD:
1261         case TEXT_FIELD:
1262             if (init_result = (NULL == gtk2_widgets[_GTK_ENTRY_TYPE]))
1263             {
1264                 gtk2_widgets[_GTK_ENTRY_TYPE] =
1265                     (*fp_gtk_entry_new)();
1266             }
1267             result = gtk2_widgets[_GTK_ENTRY_TYPE];
1268             break;
1269         case HANDLE_BOX:
1270             if (init_result = (NULL == gtk2_widgets[_GTK_HANDLE_BOX_TYPE]))
1271             {
1272                 gtk2_widgets[_GTK_HANDLE_BOX_TYPE] =
1273                     (*fp_gtk_handle_box_new)();
1274             }
1275             result = gtk2_widgets[_GTK_HANDLE_BOX_TYPE];
1276             break;
1277         case HSCROLL_BAR:
1278         case HSCROLL_BAR_BUTTON_LEFT:
1279         case HSCROLL_BAR_BUTTON_RIGHT:
1280         case HSCROLL_BAR_TRACK:
1281         case HSCROLL_BAR_THUMB:
1282             if (init_result = (NULL == gtk2_widgets[_GTK_HSCROLLBAR_TYPE]))
1283             {
1284                 gtk2_widgets[_GTK_HSCROLLBAR_TYPE] =
1285                     (*fp_gtk_hscrollbar_new)(create_adjustment());
1286             }
1287             result = gtk2_widgets[_GTK_HSCROLLBAR_TYPE];
1288             break;
1289         case HSEPARATOR:
1290             if (init_result = (NULL == gtk2_widgets[_GTK_HSEPARATOR_TYPE]))
1291             {
1292                 gtk2_widgets[_GTK_HSEPARATOR_TYPE] =
1293                     (*fp_gtk_hseparator_new)();
1294             }
1295             result = gtk2_widgets[_GTK_HSEPARATOR_TYPE];
1296             break;
1297         case HSLIDER:
1298         case HSLIDER_THUMB:
1299         case HSLIDER_TRACK:
1300             if (init_result = (NULL == gtk2_widgets[_GTK_HSCALE_TYPE]))
1301             {
1302                 gtk2_widgets[_GTK_HSCALE_TYPE] =
1303                     (*fp_gtk_hscale_new)(NULL);
1304             }
1305             result = gtk2_widgets[_GTK_HSCALE_TYPE];
1306             break;
1307         case HSPLIT_PANE_DIVIDER:
1308         case SPLIT_PANE:
1309             if (init_result = (NULL == gtk2_widgets[_GTK_HPANED_TYPE]))
1310             {
1311                 gtk2_widgets[_GTK_HPANED_TYPE] = (*fp_gtk_hpaned_new)();
1312             }
1313             result = gtk2_widgets[_GTK_HPANED_TYPE];
1314             break;
1315         case IMAGE:
1316             if (init_result = (NULL == gtk2_widgets[_GTK_IMAGE_TYPE]))
1317             {
1318                 gtk2_widgets[_GTK_IMAGE_TYPE] = (*fp_gtk_image_new)();
1319             }
1320             result = gtk2_widgets[_GTK_IMAGE_TYPE];
1321             break;
1322         case INTERNAL_FRAME:
1323             if (init_result = (NULL == gtk2_widgets[_GTK_WINDOW_TYPE]))
1324             {
1325                 gtk2_widgets[_GTK_WINDOW_TYPE] =
1326                     (*fp_gtk_window_new)(GTK_WINDOW_TOPLEVEL);
1327             }
1328             result = gtk2_widgets[_GTK_WINDOW_TYPE];
1329             break;
1330         case TOOL_TIP:
1331             if (init_result = (NULL == gtk2_widgets[_GTK_TOOLTIP_TYPE]))
1332             {
1333                 result = (*fp_gtk_window_new)(GTK_WINDOW_TOPLEVEL);
1334                 (*fp_gtk_widget_set_name)(result, "gtk-tooltips");
1335                 gtk2_widgets[_GTK_TOOLTIP_TYPE] = result;
1336             }
1337             result = gtk2_widgets[_GTK_TOOLTIP_TYPE];
1338             break;
1339         case LIST:
1340         case TABLE:
1341         case TREE:
1342         case TREE_CELL:
1343             if (init_result = (NULL == gtk2_widgets[_GTK_TREE_VIEW_TYPE]))
1344             {
1345                 gtk2_widgets[_GTK_TREE_VIEW_TYPE] =
1346                     (*fp_gtk_tree_view_new)();
1347             }
1348             result = gtk2_widgets[_GTK_TREE_VIEW_TYPE];
1349             break;
1350         case TITLED_BORDER:
1351             if (init_result = (NULL == gtk2_widgets[_GTK_FRAME_TYPE]))
1352             {
1353                 gtk2_widgets[_GTK_FRAME_TYPE] = fp_gtk_frame_new(NULL);
1354             }
1355             result = gtk2_widgets[_GTK_FRAME_TYPE];
1356             break;
1357         case POPUP_MENU:
1358             if (init_result = (NULL == gtk2_widgets[_GTK_MENU_TYPE]))
1359             {
1360                 gtk2_widgets[_GTK_MENU_TYPE] =
1361                     (*fp_gtk_menu_new)();
1362             }
1363             result = gtk2_widgets[_GTK_MENU_TYPE];
1364             break;
1365         case MENU:
1366         case MENU_ITEM:
1367         case MENU_ITEM_ACCELERATOR:
1368             if (init_result = (NULL == gtk2_widgets[_GTK_MENU_ITEM_TYPE]))
1369             {
1370                 gtk2_widgets[_GTK_MENU_ITEM_TYPE] =
1371                     (*fp_gtk_menu_item_new)();
1372             }
1373             result = gtk2_widgets[_GTK_MENU_ITEM_TYPE];
1374             break;
1375         case MENU_BAR:
1376             if (init_result = (NULL == gtk2_widgets[_GTK_MENU_BAR_TYPE]))
1377             {
1378                 gtk2_widgets[_GTK_MENU_BAR_TYPE] =
1379                     (*fp_gtk_menu_bar_new)();
1380             }
1381             result = gtk2_widgets[_GTK_MENU_BAR_TYPE];
1382             break;
1383         case COLOR_CHOOSER:
1384         case OPTION_PANE:
1385             if (init_result = (NULL == gtk2_widgets[_GTK_DIALOG_TYPE]))
1386             {
1387                 gtk2_widgets[_GTK_DIALOG_TYPE] =
1388                     (*fp_gtk_dialog_new)();
1389             }
1390             result = gtk2_widgets[_GTK_DIALOG_TYPE];
1391             break;
1392         case POPUP_MENU_SEPARATOR:
1393             if (init_result =
1394                     (NULL == gtk2_widgets[_GTK_SEPARATOR_MENU_ITEM_TYPE]))
1395             {
1396                 gtk2_widgets[_GTK_SEPARATOR_MENU_ITEM_TYPE] =
1397                     (*fp_gtk_separator_menu_item_new)();
1398             }
1399             result = gtk2_widgets[_GTK_SEPARATOR_MENU_ITEM_TYPE];
1400             break;
1401         case HPROGRESS_BAR:
1402             if (init_result = (NULL == gtk2_widgets[_GTK_HPROGRESS_BAR_TYPE]))
1403             {
1404                 gtk2_widgets[_GTK_HPROGRESS_BAR_TYPE] =
1405                     (*fp_gtk_progress_bar_new)();
1406             }
1407             result = gtk2_widgets[_GTK_HPROGRESS_BAR_TYPE];
1408             break;
1409         case VPROGRESS_BAR:
1410             if (init_result = (NULL == gtk2_widgets[_GTK_VPROGRESS_BAR_TYPE]))
1411             {
1412                 gtk2_widgets[_GTK_VPROGRESS_BAR_TYPE] =
1413                     (*fp_gtk_progress_bar_new)();
1414                 /*
1415                  * Vertical JProgressBars always go bottom-to-top,
1416                  * regardless of the ComponentOrientation.
1417                  */
1418                 (*fp_gtk_progress_bar_set_orientation)(
1419                     (GtkProgressBar *)gtk2_widgets[_GTK_VPROGRESS_BAR_TYPE],
1420                     GTK_PROGRESS_BOTTOM_TO_TOP);
1421             }
1422             result = gtk2_widgets[_GTK_VPROGRESS_BAR_TYPE];
1423             break;
1424         case RADIO_BUTTON:
1425             if (init_result = (NULL == gtk2_widgets[_GTK_RADIO_BUTTON_TYPE]))
1426             {
1427                 gtk2_widgets[_GTK_RADIO_BUTTON_TYPE] =
1428                     (*fp_gtk_radio_button_new)(NULL);
1429             }
1430             result = gtk2_widgets[_GTK_RADIO_BUTTON_TYPE];
1431             break;
1432         case RADIO_BUTTON_MENU_ITEM:
1433             if (init_result =
1434                     (NULL == gtk2_widgets[_GTK_RADIO_MENU_ITEM_TYPE]))
1435             {
1436                 gtk2_widgets[_GTK_RADIO_MENU_ITEM_TYPE] =
1437                     (*fp_gtk_radio_menu_item_new)(NULL);
1438             }
1439             result = gtk2_widgets[_GTK_RADIO_MENU_ITEM_TYPE];
1440             break;
1441         case SCROLL_PANE:
1442             if (init_result =
1443                     (NULL == gtk2_widgets[_GTK_SCROLLED_WINDOW_TYPE]))
1444             {
1445                 gtk2_widgets[_GTK_SCROLLED_WINDOW_TYPE] =
1446                     (*fp_gtk_scrolled_window_new)(NULL, NULL);
1447             }
1448             result = gtk2_widgets[_GTK_SCROLLED_WINDOW_TYPE];
1449             break;
1450         case SPINNER:
1451         case SPINNER_ARROW_BUTTON:
1452         case SPINNER_TEXT_FIELD:
1453             if (init_result = (NULL == gtk2_widgets[_GTK_SPIN_BUTTON_TYPE]))
1454             {
1455                 result = gtk2_widgets[_GTK_SPIN_BUTTON_TYPE] =
1456                     (*fp_gtk_spin_button_new)(NULL, 0, 0);
1457             }
1458             result = gtk2_widgets[_GTK_SPIN_BUTTON_TYPE];
1459             break;
1460         case TABBED_PANE:
1461         case TABBED_PANE_TAB_AREA:
1462         case TABBED_PANE_CONTENT:
1463         case TABBED_PANE_TAB:
1464             if (init_result = (NULL == gtk2_widgets[_GTK_NOTEBOOK_TYPE]))
1465             {
1466                 gtk2_widgets[_GTK_NOTEBOOK_TYPE] =
1467                     (*fp_gtk_notebook_new)(NULL);
1468             }
1469             result = gtk2_widgets[_GTK_NOTEBOOK_TYPE];
1470             break;
1471         case TOGGLE_BUTTON:
1472             if (init_result = (NULL == gtk2_widgets[_GTK_TOGGLE_BUTTON_TYPE]))
1473             {
1474                 gtk2_widgets[_GTK_TOGGLE_BUTTON_TYPE] =
1475                     (*fp_gtk_toggle_button_new)(NULL);
1476             }
1477             result = gtk2_widgets[_GTK_TOGGLE_BUTTON_TYPE];
1478             break;
1479         case TOOL_BAR:
1480         case TOOL_BAR_DRAG_WINDOW:
1481             if (init_result = (NULL == gtk2_widgets[_GTK_TOOLBAR_TYPE]))
1482             {
1483                 gtk2_widgets[_GTK_TOOLBAR_TYPE] =
1484                     (*fp_gtk_toolbar_new)(NULL);
1485             }
1486             result = gtk2_widgets[_GTK_TOOLBAR_TYPE];
1487             break;
1488         case TOOL_BAR_SEPARATOR:
1489             if (init_result =
1490                     (NULL == gtk2_widgets[_GTK_SEPARATOR_TOOL_ITEM_TYPE]))
1491             {
1492                 gtk2_widgets[_GTK_SEPARATOR_TOOL_ITEM_TYPE] =
1493                     (*fp_gtk_separator_tool_item_new)();
1494             }
1495             result = gtk2_widgets[_GTK_SEPARATOR_TOOL_ITEM_TYPE];
1496             break;
1497         case VIEWPORT:
1498             if (init_result = (NULL == gtk2_widgets[_GTK_VIEWPORT_TYPE]))
1499             {
1500                 GtkAdjustment *adjustment = create_adjustment();
1501                 gtk2_widgets[_GTK_VIEWPORT_TYPE] =
1502                     (*fp_gtk_viewport_new)(adjustment, adjustment);
1503             }
1504             result = gtk2_widgets[_GTK_VIEWPORT_TYPE];
1505             break;
1506         case VSCROLL_BAR:
1507         case VSCROLL_BAR_BUTTON_UP:
1508         case VSCROLL_BAR_BUTTON_DOWN:
1509         case VSCROLL_BAR_TRACK:
1510         case VSCROLL_BAR_THUMB:
1511             if (init_result = (NULL == gtk2_widgets[_GTK_VSCROLLBAR_TYPE]))
1512             {
1513                 gtk2_widgets[_GTK_VSCROLLBAR_TYPE] =
1514                     (*fp_gtk_vscrollbar_new)(create_adjustment());
1515             }
1516             result = gtk2_widgets[_GTK_VSCROLLBAR_TYPE];
1517             break;
1518         case VSEPARATOR:
1519             if (init_result = (NULL == gtk2_widgets[_GTK_VSEPARATOR_TYPE]))
1520             {
1521                 gtk2_widgets[_GTK_VSEPARATOR_TYPE] =
1522                     (*fp_gtk_vseparator_new)();
1523             }
1524             result = gtk2_widgets[_GTK_VSEPARATOR_TYPE];
1525             break;
1526         case VSLIDER:
1527         case VSLIDER_THUMB:
1528         case VSLIDER_TRACK:
1529             if (init_result = (NULL == gtk2_widgets[_GTK_VSCALE_TYPE]))
1530             {
1531                 gtk2_widgets[_GTK_VSCALE_TYPE] =
1532                     (*fp_gtk_vscale_new)(NULL);
1533             }
1534             result = gtk2_widgets[_GTK_VSCALE_TYPE];
1535             /*
1536              * Vertical JSliders start at the bottom, while vertical
1537              * GtkVScale widgets start at the top (by default), so to fix
1538              * this we set the "inverted" flag to get the Swing behavior.
1539              */
1540             ((GtkRange*)result)->inverted = 1;
1541             break;
1542         case VSPLIT_PANE_DIVIDER:
1543             if (init_result = (NULL == gtk2_widgets[_GTK_VPANED_TYPE]))
1544             {
1545                 gtk2_widgets[_GTK_VPANED_TYPE] = (*fp_gtk_vpaned_new)();
1546             }
1547             result = gtk2_widgets[_GTK_VPANED_TYPE];
1548             break;
1549         default:
1550             result = NULL;
1551             break;
1552     }
1553 
1554     if (result != NULL && init_result)
1555     {
1556         if (widget_type == RADIO_BUTTON_MENU_ITEM ||
1557                 widget_type == CHECK_BOX_MENU_ITEM ||
1558                 widget_type == MENU_ITEM ||
1559                 widget_type == MENU ||
1560                 widget_type == POPUP_MENU_SEPARATOR)
1561         {
1562             GtkWidget *menu = gtk2_get_widget(POPUP_MENU);
1563             (*fp_gtk_menu_shell_append)((GtkMenuShell *)menu, result);


2434     }
2435 
2436     return result;
2437 }
2438 
2439 /***********************************************/
2440 static jobject get_string_property(JNIEnv *env, GtkSettings* settings, const gchar* key)
2441 {
2442     jobject result = NULL;
2443     gchar*  strval = NULL;
2444 
2445     (*fp_g_object_get)(settings, key, &strval, NULL);
2446     result = (*env)->NewStringUTF(env, strval);
2447     (*fp_g_free)(strval);
2448 
2449     return result;
2450 }
2451 
2452 static jobject get_integer_property(JNIEnv *env, GtkSettings* settings, const gchar* key)
2453 {
2454     gint intval = NULL;
2455     (*fp_g_object_get)(settings, key, &intval, NULL);
2456     return create_Integer(env, intval);
2457 }
2458 
2459 static jobject get_boolean_property(JNIEnv *env, GtkSettings* settings, const gchar* key)
2460 {
2461     gint intval = NULL;
2462     (*fp_g_object_get)(settings, key, &intval, NULL);
2463     return create_Boolean(env, intval);
2464 }
2465 
2466 static jobject gtk2_get_setting(JNIEnv *env, Setting property)
2467 {
2468     GtkSettings* settings = (*fp_gtk_settings_get_default)();
2469 
2470     switch (property)
2471     {
2472         case GTK_FONT_NAME:
2473             return get_string_property(env, settings, "gtk-font-name");
2474         case GTK_ICON_SIZES:
2475             return get_string_property(env, settings, "gtk-icon-sizes");
2476         case GTK_CURSOR_BLINK:
2477             return get_boolean_property(env, settings, "gtk-cursor-blink");
2478         case GTK_CURSOR_BLINK_TIME:
2479             return get_integer_property(env, settings, "gtk-cursor-blink-time");
2480     }
2481 




 754         dlclose(gtk2_libhandle);
 755         gtk2_libhandle = NULL;
 756 
 757         dlclose(gthread_libhandle);
 758         gthread_libhandle = NULL;
 759 
 760         return FALSE;
 761     }
 762 
 763     /*
 764      * Strip the AT-SPI GTK_MODULES if present
 765      */
 766     gtk_modules_env = getenv ("GTK_MODULES");
 767     if ((gtk_modules_env && strstr(gtk_modules_env, "atk-bridge")) ||
 768         (gtk_modules_env && strstr(gtk_modules_env, "gail"))) {
 769         /* careful, strtok modifies its args */
 770         gchar *tmp_env = strdup(gtk_modules_env);
 771         if (tmp_env) {
 772             /* the new env will be smaller than the old one */
 773             gchar *s, *new_env = SAFE_SIZE_STRUCT_ALLOC(malloc,
 774                     (int)sizeof(ENV_PREFIX), 1, (int)strlen (gtk_modules_env));
 775 
 776             if (new_env) {
 777                 strcpy(new_env, ENV_PREFIX);
 778 
 779                 /* strip out 'atk-bridge' and 'gail' */
 780                 size_t PREFIX_LENGTH = strlen(ENV_PREFIX);
 781                 gchar *tmp_ptr = NULL;
 782                 for (s = strtok_r(tmp_env, ":", &tmp_ptr); s;
 783                      s = strtok_r(NULL, ":", &tmp_ptr)) {
 784                     if ((!strstr(s, "atk-bridge")) && (!strstr(s, "gail"))) {
 785                         if (strlen(new_env) > PREFIX_LENGTH) {
 786                             new_env = strcat(new_env, ":");
 787                         }
 788                         new_env = strcat(new_env, s);
 789                     }
 790                 }
 791                 if (putenv(new_env) != 0) {
 792                     /* no free() on success, putenv() doesn't copy string */
 793                     free(new_env);
 794                 }


1074 /*
1075  * Initializes the widget to correct state for some engines.
1076  * This is a pure empirical method.
1077  */
1078 static void init_toggle_widget(WidgetType widget_type, gint synth_state)
1079 {
1080     gboolean is_active = ((synth_state & SELECTED) != 0);
1081 
1082     if (widget_type == RADIO_BUTTON ||
1083         widget_type == CHECK_BOX ||
1084         widget_type == TOGGLE_BUTTON) {
1085         ((GtkToggleButton*)gtk2_widget)->active = is_active;
1086     }
1087 
1088     if ((synth_state & FOCUSED) != 0) {
1089         ((GtkObject*)gtk2_widget)->flags |= GTK_HAS_FOCUS;
1090     } else {
1091         ((GtkObject*)gtk2_widget)->flags &= ~GTK_HAS_FOCUS;
1092     }
1093 
1094     if (((synth_state & MOUSE_OVER) != 0 && (synth_state & PRESSED) == 0) ||
1095            ((synth_state & FOCUSED) != 0 && (synth_state & PRESSED) != 0)) {
1096         gtk2_widget->state = GTK_STATE_PRELIGHT;
1097     } else if ((synth_state & DISABLED) != 0) {
1098         gtk2_widget->state = GTK_STATE_INSENSITIVE;
1099     } else {
1100         gtk2_widget->state = is_active ? GTK_STATE_ACTIVE : GTK_STATE_NORMAL;
1101     }
1102 }
1103 
1104 /* GTK state_type filter */
1105 static GtkStateType get_gtk_state_type(WidgetType widget_type, gint synth_state)
1106 {
1107     GtkStateType result = GTK_STATE_NORMAL;
1108 
1109     if ((synth_state & DISABLED) != 0) {
1110         result = GTK_STATE_INSENSITIVE;
1111     } else if ((synth_state & PRESSED) != 0) {
1112         result = GTK_STATE_ACTIVE;
1113     } else if ((synth_state & MOUSE_OVER) != 0) {
1114         result = GTK_STATE_PRELIGHT;
1115     }


1144 }
1145 
1146 static GtkAdjustment* create_adjustment()
1147 {
1148     return (GtkAdjustment *)
1149             (*fp_gtk_adjustment_new)(50.0, 0.0, 100.0, 10.0, 20.0, 20.0);
1150 }
1151 
1152 /**
1153  * Returns a pointer to the cached native widget for the specified widget
1154  * type.
1155  */
1156 static GtkWidget *gtk2_get_widget(WidgetType widget_type)
1157 {
1158     gboolean init_result = FALSE;
1159     GtkWidget *result = NULL;
1160     switch (widget_type)
1161     {
1162         case BUTTON:
1163         case TABLE_HEADER:
1164             if ((init_result = (NULL == gtk2_widgets[_GTK_BUTTON_TYPE])))
1165             {
1166                 gtk2_widgets[_GTK_BUTTON_TYPE] = (*fp_gtk_button_new)();
1167             }
1168             result = gtk2_widgets[_GTK_BUTTON_TYPE];
1169             break;
1170         case CHECK_BOX:
1171             if ((init_result = (NULL == gtk2_widgets[_GTK_CHECK_BUTTON_TYPE])))
1172             {
1173                 gtk2_widgets[_GTK_CHECK_BUTTON_TYPE] =
1174                     (*fp_gtk_check_button_new)();
1175             }
1176             result = gtk2_widgets[_GTK_CHECK_BUTTON_TYPE];
1177             break;
1178         case CHECK_BOX_MENU_ITEM:
1179             if ((init_result = (NULL == gtk2_widgets[_GTK_CHECK_MENU_ITEM_TYPE])))
1180             {
1181                 gtk2_widgets[_GTK_CHECK_MENU_ITEM_TYPE] =
1182                     (*fp_gtk_check_menu_item_new)();
1183             }
1184             result = gtk2_widgets[_GTK_CHECK_MENU_ITEM_TYPE];
1185             break;
1186         /************************************************************
1187          *    Creation a dedicated color chooser is dangerous because
1188          * it deadlocks the EDT
1189          ************************************************************/
1190 /*        case COLOR_CHOOSER:
1191             if (init_result =
1192                     (NULL == gtk2_widgets[_GTK_COLOR_SELECTION_DIALOG_TYPE]))
1193             {
1194                 gtk2_widgets[_GTK_COLOR_SELECTION_DIALOG_TYPE] =
1195                     (*fp_gtk_color_selection_dialog_new)(NULL);
1196             }
1197             result = gtk2_widgets[_GTK_COLOR_SELECTION_DIALOG_TYPE];
1198             break;*/
1199         case COMBO_BOX:
1200             if ((init_result = (NULL == gtk2_widgets[_GTK_COMBO_BOX_TYPE])))
1201             {
1202                 gtk2_widgets[_GTK_COMBO_BOX_TYPE] =
1203                     (*fp_gtk_combo_box_new)();
1204             }
1205             result = gtk2_widgets[_GTK_COMBO_BOX_TYPE];
1206             break;
1207         case COMBO_BOX_ARROW_BUTTON:
1208             if ((init_result =
1209                     (NULL == gtk2_widgets[_GTK_COMBO_BOX_ARROW_BUTTON_TYPE])))
1210             {
1211                 gtk2_widgets[_GTK_COMBO_BOX_ARROW_BUTTON_TYPE] =
1212                      (*fp_gtk_toggle_button_new)();
1213             }
1214             result = gtk2_widgets[_GTK_COMBO_BOX_ARROW_BUTTON_TYPE];
1215             break;
1216         case COMBO_BOX_TEXT_FIELD:
1217             if ((init_result =
1218                     (NULL == gtk2_widgets[_GTK_COMBO_BOX_TEXT_FIELD_TYPE])))
1219             {
1220                 result = gtk2_widgets[_GTK_COMBO_BOX_TEXT_FIELD_TYPE] =
1221                      (*fp_gtk_entry_new)();
1222             }
1223             result = gtk2_widgets[_GTK_COMBO_BOX_TEXT_FIELD_TYPE];
1224             break;
1225         case DESKTOP_ICON:
1226         case INTERNAL_FRAME_TITLE_PANE:
1227         case LABEL:
1228             if ((init_result = (NULL == gtk2_widgets[_GTK_LABEL_TYPE])))
1229             {
1230                 gtk2_widgets[_GTK_LABEL_TYPE] =
1231                     (*fp_gtk_label_new)(NULL);
1232             }
1233             result = gtk2_widgets[_GTK_LABEL_TYPE];
1234             break;
1235         case DESKTOP_PANE:
1236         case PANEL:
1237         case ROOT_PANE:
1238             if ((init_result = (NULL == gtk2_widgets[_GTK_CONTAINER_TYPE])))
1239             {
1240                 /* There is no constructor for a container type.  I've
1241                  * chosen GtkFixed container since it has a default
1242                  * constructor.
1243                  */
1244                 gtk2_widgets[_GTK_CONTAINER_TYPE] =
1245                     (*fp_gtk_fixed_new)();
1246             }
1247             result = gtk2_widgets[_GTK_CONTAINER_TYPE];
1248             break;
1249         case EDITOR_PANE:
1250         case TEXT_AREA:
1251         case TEXT_PANE:
1252             if ((init_result = (NULL == gtk2_widgets[_GTK_TEXT_VIEW_TYPE])))
1253             {
1254                 gtk2_widgets[_GTK_TEXT_VIEW_TYPE] =
1255                     (*fp_gtk_text_view_new)();
1256             }
1257             result = gtk2_widgets[_GTK_TEXT_VIEW_TYPE];
1258             break;
1259         case FORMATTED_TEXT_FIELD:
1260         case PASSWORD_FIELD:
1261         case TEXT_FIELD:
1262             if ((init_result = (NULL == gtk2_widgets[_GTK_ENTRY_TYPE])))
1263             {
1264                 gtk2_widgets[_GTK_ENTRY_TYPE] =
1265                     (*fp_gtk_entry_new)();
1266             }
1267             result = gtk2_widgets[_GTK_ENTRY_TYPE];
1268             break;
1269         case HANDLE_BOX:
1270             if ((init_result = (NULL == gtk2_widgets[_GTK_HANDLE_BOX_TYPE])))
1271             {
1272                 gtk2_widgets[_GTK_HANDLE_BOX_TYPE] =
1273                     (*fp_gtk_handle_box_new)();
1274             }
1275             result = gtk2_widgets[_GTK_HANDLE_BOX_TYPE];
1276             break;
1277         case HSCROLL_BAR:
1278         case HSCROLL_BAR_BUTTON_LEFT:
1279         case HSCROLL_BAR_BUTTON_RIGHT:
1280         case HSCROLL_BAR_TRACK:
1281         case HSCROLL_BAR_THUMB:
1282             if ((init_result = (NULL == gtk2_widgets[_GTK_HSCROLLBAR_TYPE])))
1283             {
1284                 gtk2_widgets[_GTK_HSCROLLBAR_TYPE] =
1285                     (*fp_gtk_hscrollbar_new)(create_adjustment());
1286             }
1287             result = gtk2_widgets[_GTK_HSCROLLBAR_TYPE];
1288             break;
1289         case HSEPARATOR:
1290             if ((init_result = (NULL == gtk2_widgets[_GTK_HSEPARATOR_TYPE])))
1291             {
1292                 gtk2_widgets[_GTK_HSEPARATOR_TYPE] =
1293                     (*fp_gtk_hseparator_new)();
1294             }
1295             result = gtk2_widgets[_GTK_HSEPARATOR_TYPE];
1296             break;
1297         case HSLIDER:
1298         case HSLIDER_THUMB:
1299         case HSLIDER_TRACK:
1300             if ((init_result = (NULL == gtk2_widgets[_GTK_HSCALE_TYPE])))
1301             {
1302                 gtk2_widgets[_GTK_HSCALE_TYPE] =
1303                     (*fp_gtk_hscale_new)(NULL);
1304             }
1305             result = gtk2_widgets[_GTK_HSCALE_TYPE];
1306             break;
1307         case HSPLIT_PANE_DIVIDER:
1308         case SPLIT_PANE:
1309             if ((init_result = (NULL == gtk2_widgets[_GTK_HPANED_TYPE])))
1310             {
1311                 gtk2_widgets[_GTK_HPANED_TYPE] = (*fp_gtk_hpaned_new)();
1312             }
1313             result = gtk2_widgets[_GTK_HPANED_TYPE];
1314             break;
1315         case IMAGE:
1316             if ((init_result = (NULL == gtk2_widgets[_GTK_IMAGE_TYPE])))
1317             {
1318                 gtk2_widgets[_GTK_IMAGE_TYPE] = (*fp_gtk_image_new)();
1319             }
1320             result = gtk2_widgets[_GTK_IMAGE_TYPE];
1321             break;
1322         case INTERNAL_FRAME:
1323             if ((init_result = (NULL == gtk2_widgets[_GTK_WINDOW_TYPE])))
1324             {
1325                 gtk2_widgets[_GTK_WINDOW_TYPE] =
1326                     (*fp_gtk_window_new)(GTK_WINDOW_TOPLEVEL);
1327             }
1328             result = gtk2_widgets[_GTK_WINDOW_TYPE];
1329             break;
1330         case TOOL_TIP:
1331             if ((init_result = (NULL == gtk2_widgets[_GTK_TOOLTIP_TYPE])))
1332             {
1333                 result = (*fp_gtk_window_new)(GTK_WINDOW_TOPLEVEL);
1334                 (*fp_gtk_widget_set_name)(result, "gtk-tooltips");
1335                 gtk2_widgets[_GTK_TOOLTIP_TYPE] = result;
1336             }
1337             result = gtk2_widgets[_GTK_TOOLTIP_TYPE];
1338             break;
1339         case LIST:
1340         case TABLE:
1341         case TREE:
1342         case TREE_CELL:
1343             if ((init_result = (NULL == gtk2_widgets[_GTK_TREE_VIEW_TYPE])))
1344             {
1345                 gtk2_widgets[_GTK_TREE_VIEW_TYPE] =
1346                     (*fp_gtk_tree_view_new)();
1347             }
1348             result = gtk2_widgets[_GTK_TREE_VIEW_TYPE];
1349             break;
1350         case TITLED_BORDER:
1351             if ((init_result = (NULL == gtk2_widgets[_GTK_FRAME_TYPE])))
1352             {
1353                 gtk2_widgets[_GTK_FRAME_TYPE] = fp_gtk_frame_new(NULL);
1354             }
1355             result = gtk2_widgets[_GTK_FRAME_TYPE];
1356             break;
1357         case POPUP_MENU:
1358             if ((init_result = (NULL == gtk2_widgets[_GTK_MENU_TYPE])))
1359             {
1360                 gtk2_widgets[_GTK_MENU_TYPE] =
1361                     (*fp_gtk_menu_new)();
1362             }
1363             result = gtk2_widgets[_GTK_MENU_TYPE];
1364             break;
1365         case MENU:
1366         case MENU_ITEM:
1367         case MENU_ITEM_ACCELERATOR:
1368             if ((init_result = (NULL == gtk2_widgets[_GTK_MENU_ITEM_TYPE])))
1369             {
1370                 gtk2_widgets[_GTK_MENU_ITEM_TYPE] =
1371                     (*fp_gtk_menu_item_new)();
1372             }
1373             result = gtk2_widgets[_GTK_MENU_ITEM_TYPE];
1374             break;
1375         case MENU_BAR:
1376             if ((init_result = (NULL == gtk2_widgets[_GTK_MENU_BAR_TYPE])))
1377             {
1378                 gtk2_widgets[_GTK_MENU_BAR_TYPE] =
1379                     (*fp_gtk_menu_bar_new)();
1380             }
1381             result = gtk2_widgets[_GTK_MENU_BAR_TYPE];
1382             break;
1383         case COLOR_CHOOSER:
1384         case OPTION_PANE:
1385             if ((init_result = (NULL == gtk2_widgets[_GTK_DIALOG_TYPE])))
1386             {
1387                 gtk2_widgets[_GTK_DIALOG_TYPE] =
1388                     (*fp_gtk_dialog_new)();
1389             }
1390             result = gtk2_widgets[_GTK_DIALOG_TYPE];
1391             break;
1392         case POPUP_MENU_SEPARATOR:
1393             if ((init_result =
1394                     (NULL == gtk2_widgets[_GTK_SEPARATOR_MENU_ITEM_TYPE])))
1395             {
1396                 gtk2_widgets[_GTK_SEPARATOR_MENU_ITEM_TYPE] =
1397                     (*fp_gtk_separator_menu_item_new)();
1398             }
1399             result = gtk2_widgets[_GTK_SEPARATOR_MENU_ITEM_TYPE];
1400             break;
1401         case HPROGRESS_BAR:
1402             if ((init_result = (NULL == gtk2_widgets[_GTK_HPROGRESS_BAR_TYPE])))
1403             {
1404                 gtk2_widgets[_GTK_HPROGRESS_BAR_TYPE] =
1405                     (*fp_gtk_progress_bar_new)();
1406             }
1407             result = gtk2_widgets[_GTK_HPROGRESS_BAR_TYPE];
1408             break;
1409         case VPROGRESS_BAR:
1410             if ((init_result = (NULL == gtk2_widgets[_GTK_VPROGRESS_BAR_TYPE])))
1411             {
1412                 gtk2_widgets[_GTK_VPROGRESS_BAR_TYPE] =
1413                     (*fp_gtk_progress_bar_new)();
1414                 /*
1415                  * Vertical JProgressBars always go bottom-to-top,
1416                  * regardless of the ComponentOrientation.
1417                  */
1418                 (*fp_gtk_progress_bar_set_orientation)(
1419                     (GtkProgressBar *)gtk2_widgets[_GTK_VPROGRESS_BAR_TYPE],
1420                     GTK_PROGRESS_BOTTOM_TO_TOP);
1421             }
1422             result = gtk2_widgets[_GTK_VPROGRESS_BAR_TYPE];
1423             break;
1424         case RADIO_BUTTON:
1425             if ((init_result = (NULL == gtk2_widgets[_GTK_RADIO_BUTTON_TYPE])))
1426             {
1427                 gtk2_widgets[_GTK_RADIO_BUTTON_TYPE] =
1428                     (*fp_gtk_radio_button_new)(NULL);
1429             }
1430             result = gtk2_widgets[_GTK_RADIO_BUTTON_TYPE];
1431             break;
1432         case RADIO_BUTTON_MENU_ITEM:
1433             if ((init_result =
1434                     (NULL == gtk2_widgets[_GTK_RADIO_MENU_ITEM_TYPE])))
1435             {
1436                 gtk2_widgets[_GTK_RADIO_MENU_ITEM_TYPE] =
1437                     (*fp_gtk_radio_menu_item_new)(NULL);
1438             }
1439             result = gtk2_widgets[_GTK_RADIO_MENU_ITEM_TYPE];
1440             break;
1441         case SCROLL_PANE:
1442             if ((init_result =
1443                     (NULL == gtk2_widgets[_GTK_SCROLLED_WINDOW_TYPE])))
1444             {
1445                 gtk2_widgets[_GTK_SCROLLED_WINDOW_TYPE] =
1446                     (*fp_gtk_scrolled_window_new)(NULL, NULL);
1447             }
1448             result = gtk2_widgets[_GTK_SCROLLED_WINDOW_TYPE];
1449             break;
1450         case SPINNER:
1451         case SPINNER_ARROW_BUTTON:
1452         case SPINNER_TEXT_FIELD:
1453             if ((init_result = (NULL == gtk2_widgets[_GTK_SPIN_BUTTON_TYPE])))
1454             {
1455                 result = gtk2_widgets[_GTK_SPIN_BUTTON_TYPE] =
1456                     (*fp_gtk_spin_button_new)(NULL, 0, 0);
1457             }
1458             result = gtk2_widgets[_GTK_SPIN_BUTTON_TYPE];
1459             break;
1460         case TABBED_PANE:
1461         case TABBED_PANE_TAB_AREA:
1462         case TABBED_PANE_CONTENT:
1463         case TABBED_PANE_TAB:
1464             if ((init_result = (NULL == gtk2_widgets[_GTK_NOTEBOOK_TYPE])))
1465             {
1466                 gtk2_widgets[_GTK_NOTEBOOK_TYPE] =
1467                     (*fp_gtk_notebook_new)(NULL);
1468             }
1469             result = gtk2_widgets[_GTK_NOTEBOOK_TYPE];
1470             break;
1471         case TOGGLE_BUTTON:
1472             if ((init_result = (NULL == gtk2_widgets[_GTK_TOGGLE_BUTTON_TYPE])))
1473             {
1474                 gtk2_widgets[_GTK_TOGGLE_BUTTON_TYPE] =
1475                     (*fp_gtk_toggle_button_new)(NULL);
1476             }
1477             result = gtk2_widgets[_GTK_TOGGLE_BUTTON_TYPE];
1478             break;
1479         case TOOL_BAR:
1480         case TOOL_BAR_DRAG_WINDOW:
1481             if ((init_result = (NULL == gtk2_widgets[_GTK_TOOLBAR_TYPE])))
1482             {
1483                 gtk2_widgets[_GTK_TOOLBAR_TYPE] =
1484                     (*fp_gtk_toolbar_new)(NULL);
1485             }
1486             result = gtk2_widgets[_GTK_TOOLBAR_TYPE];
1487             break;
1488         case TOOL_BAR_SEPARATOR:
1489             if ((init_result =
1490                     (NULL == gtk2_widgets[_GTK_SEPARATOR_TOOL_ITEM_TYPE])))
1491             {
1492                 gtk2_widgets[_GTK_SEPARATOR_TOOL_ITEM_TYPE] =
1493                     (*fp_gtk_separator_tool_item_new)();
1494             }
1495             result = gtk2_widgets[_GTK_SEPARATOR_TOOL_ITEM_TYPE];
1496             break;
1497         case VIEWPORT:
1498             if ((init_result = (NULL == gtk2_widgets[_GTK_VIEWPORT_TYPE])))
1499             {
1500                 GtkAdjustment *adjustment = create_adjustment();
1501                 gtk2_widgets[_GTK_VIEWPORT_TYPE] =
1502                     (*fp_gtk_viewport_new)(adjustment, adjustment);
1503             }
1504             result = gtk2_widgets[_GTK_VIEWPORT_TYPE];
1505             break;
1506         case VSCROLL_BAR:
1507         case VSCROLL_BAR_BUTTON_UP:
1508         case VSCROLL_BAR_BUTTON_DOWN:
1509         case VSCROLL_BAR_TRACK:
1510         case VSCROLL_BAR_THUMB:
1511             if ((init_result = (NULL == gtk2_widgets[_GTK_VSCROLLBAR_TYPE])))
1512             {
1513                 gtk2_widgets[_GTK_VSCROLLBAR_TYPE] =
1514                     (*fp_gtk_vscrollbar_new)(create_adjustment());
1515             }
1516             result = gtk2_widgets[_GTK_VSCROLLBAR_TYPE];
1517             break;
1518         case VSEPARATOR:
1519             if ((init_result = (NULL == gtk2_widgets[_GTK_VSEPARATOR_TYPE])))
1520             {
1521                 gtk2_widgets[_GTK_VSEPARATOR_TYPE] =
1522                     (*fp_gtk_vseparator_new)();
1523             }
1524             result = gtk2_widgets[_GTK_VSEPARATOR_TYPE];
1525             break;
1526         case VSLIDER:
1527         case VSLIDER_THUMB:
1528         case VSLIDER_TRACK:
1529             if ((init_result = (NULL == gtk2_widgets[_GTK_VSCALE_TYPE])))
1530             {
1531                 gtk2_widgets[_GTK_VSCALE_TYPE] =
1532                     (*fp_gtk_vscale_new)(NULL);
1533             }
1534             result = gtk2_widgets[_GTK_VSCALE_TYPE];
1535             /*
1536              * Vertical JSliders start at the bottom, while vertical
1537              * GtkVScale widgets start at the top (by default), so to fix
1538              * this we set the "inverted" flag to get the Swing behavior.
1539              */
1540             ((GtkRange*)result)->inverted = 1;
1541             break;
1542         case VSPLIT_PANE_DIVIDER:
1543             if ((init_result = (NULL == gtk2_widgets[_GTK_VPANED_TYPE])))
1544             {
1545                 gtk2_widgets[_GTK_VPANED_TYPE] = (*fp_gtk_vpaned_new)();
1546             }
1547             result = gtk2_widgets[_GTK_VPANED_TYPE];
1548             break;
1549         default:
1550             result = NULL;
1551             break;
1552     }
1553 
1554     if (result != NULL && init_result)
1555     {
1556         if (widget_type == RADIO_BUTTON_MENU_ITEM ||
1557                 widget_type == CHECK_BOX_MENU_ITEM ||
1558                 widget_type == MENU_ITEM ||
1559                 widget_type == MENU ||
1560                 widget_type == POPUP_MENU_SEPARATOR)
1561         {
1562             GtkWidget *menu = gtk2_get_widget(POPUP_MENU);
1563             (*fp_gtk_menu_shell_append)((GtkMenuShell *)menu, result);


2434     }
2435 
2436     return result;
2437 }
2438 
2439 /***********************************************/
2440 static jobject get_string_property(JNIEnv *env, GtkSettings* settings, const gchar* key)
2441 {
2442     jobject result = NULL;
2443     gchar*  strval = NULL;
2444 
2445     (*fp_g_object_get)(settings, key, &strval, NULL);
2446     result = (*env)->NewStringUTF(env, strval);
2447     (*fp_g_free)(strval);
2448 
2449     return result;
2450 }
2451 
2452 static jobject get_integer_property(JNIEnv *env, GtkSettings* settings, const gchar* key)
2453 {
2454     gint intval = (intptr_t)NULL;
2455     (*fp_g_object_get)(settings, key, &intval, NULL);
2456     return create_Integer(env, intval);
2457 }
2458 
2459 static jobject get_boolean_property(JNIEnv *env, GtkSettings* settings, const gchar* key)
2460 {
2461     gint intval = (intptr_t)NULL;
2462     (*fp_g_object_get)(settings, key, &intval, NULL);
2463     return create_Boolean(env, intval);
2464 }
2465 
2466 static jobject gtk2_get_setting(JNIEnv *env, Setting property)
2467 {
2468     GtkSettings* settings = (*fp_gtk_settings_get_default)();
2469 
2470     switch (property)
2471     {
2472         case GTK_FONT_NAME:
2473             return get_string_property(env, settings, "gtk-font-name");
2474         case GTK_ICON_SIZES:
2475             return get_string_property(env, settings, "gtk-icon-sizes");
2476         case GTK_CURSOR_BLINK:
2477             return get_boolean_property(env, settings, "gtk-cursor-blink");
2478         case GTK_CURSOR_BLINK_TIME:
2479             return get_integer_property(env, settings, "gtk-cursor-blink-time");
2480     }
2481 


< prev index next >