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
|