751 } 752 /* Now we have only one kind of exceptions: NO_SYMBOL_EXCEPTION 753 * Otherwise we can check the return value of setjmp method. 754 */ 755 else 756 { 757 dlclose(gtk2_libhandle); 758 gtk2_libhandle = NULL; 759 760 dlclose(gthread_libhandle); 761 gthread_libhandle = NULL; 762 763 return FALSE; 764 } 765 766 /* 767 * Strip the AT-SPI GTK_MODULEs if present 768 */ 769 gtk_modules_env = getenv ("GTK_MODULES"); 770 771 if (gtk_modules_env && strstr (gtk_modules_env, "atk-bridge") || 772 gtk_modules_env && strstr (gtk_modules_env, "gail")) 773 { 774 /* the new env will be smaller than the old one */ 775 gchar *s, *new_env = SAFE_SIZE_STRUCT_ALLOC(malloc, 776 sizeof(ENV_PREFIX), 1, strlen (gtk_modules_env)); 777 778 if (new_env != NULL ) 779 { 780 /* careful, strtok modifies its args */ 781 gchar *tmp_env = strdup (gtk_modules_env); 782 strcpy(new_env, ENV_PREFIX); 783 784 /* strip out 'atk-bridge' and 'gail' */ 785 size_t PREFIX_LENGTH = strlen(ENV_PREFIX); 786 while (s = strtok(tmp_env, ":")) 787 { 788 if ((!strstr (s, "atk-bridge")) && (!strstr (s, "gail"))) 789 { 790 if (strlen (new_env) > PREFIX_LENGTH) { 791 new_env = strcat (new_env, ":"); 792 } 793 new_env = strcat(new_env, s); 794 } 795 if (tmp_env) 796 { 797 free (tmp_env); 798 tmp_env = NULL; /* next call to strtok arg1==NULL */ 799 } 800 } 801 putenv (new_env); 802 free (new_env); 803 free (tmp_env); 804 } 805 } 806 1082 /* 1083 * Initializes the widget to correct state for some engines. 1084 * This is a pure empirical method. 1085 */ 1086 static void init_toggle_widget(WidgetType widget_type, gint synth_state) 1087 { 1088 gboolean is_active = ((synth_state & SELECTED) != 0); 1089 1090 if (widget_type == RADIO_BUTTON || 1091 widget_type == CHECK_BOX || 1092 widget_type == TOGGLE_BUTTON) { 1093 ((GtkToggleButton*)gtk2_widget)->active = is_active; 1094 } 1095 1096 if ((synth_state & FOCUSED) != 0) { 1097 ((GtkObject*)gtk2_widget)->flags |= GTK_HAS_FOCUS; 1098 } else { 1099 ((GtkObject*)gtk2_widget)->flags &= ~GTK_HAS_FOCUS; 1100 } 1101 1102 if ((synth_state & MOUSE_OVER) != 0 && (synth_state & PRESSED) == 0 || 1103 (synth_state & FOCUSED) != 0 && (synth_state & PRESSED) != 0) { 1104 gtk2_widget->state = GTK_STATE_PRELIGHT; 1105 } else if ((synth_state & DISABLED) != 0) { 1106 gtk2_widget->state = GTK_STATE_INSENSITIVE; 1107 } else { 1108 gtk2_widget->state = is_active ? GTK_STATE_ACTIVE : GTK_STATE_NORMAL; 1109 } 1110 } 1111 1112 /* GTK state_type filter */ 1113 static GtkStateType get_gtk_state_type(WidgetType widget_type, gint synth_state) 1114 { 1115 GtkStateType result = GTK_STATE_NORMAL; 1116 1117 if ((synth_state & DISABLED) != 0) { 1118 result = GTK_STATE_INSENSITIVE; 1119 } else if ((synth_state & PRESSED) != 0) { 1120 result = GTK_STATE_ACTIVE; 1121 } else if ((synth_state & MOUSE_OVER) != 0) { 1122 result = GTK_STATE_PRELIGHT; 1123 } 1152 } 1153 1154 static GtkAdjustment* create_adjustment() 1155 { 1156 return (GtkAdjustment *) 1157 (*fp_gtk_adjustment_new)(50.0, 0.0, 100.0, 10.0, 20.0, 20.0); 1158 } 1159 1160 /** 1161 * Returns a pointer to the cached native widget for the specified widget 1162 * type. 1163 */ 1164 static GtkWidget *gtk2_get_widget(WidgetType widget_type) 1165 { 1166 gboolean init_result = FALSE; 1167 GtkWidget *result = NULL; 1168 switch (widget_type) 1169 { 1170 case BUTTON: 1171 case TABLE_HEADER: 1172 if (init_result = (NULL == gtk2_widgets[_GTK_BUTTON_TYPE])) 1173 { 1174 gtk2_widgets[_GTK_BUTTON_TYPE] = (*fp_gtk_button_new)(); 1175 } 1176 result = gtk2_widgets[_GTK_BUTTON_TYPE]; 1177 break; 1178 case CHECK_BOX: 1179 if (init_result = (NULL == gtk2_widgets[_GTK_CHECK_BUTTON_TYPE])) 1180 { 1181 gtk2_widgets[_GTK_CHECK_BUTTON_TYPE] = 1182 (*fp_gtk_check_button_new)(); 1183 } 1184 result = gtk2_widgets[_GTK_CHECK_BUTTON_TYPE]; 1185 break; 1186 case CHECK_BOX_MENU_ITEM: 1187 if (init_result = (NULL == gtk2_widgets[_GTK_CHECK_MENU_ITEM_TYPE])) 1188 { 1189 gtk2_widgets[_GTK_CHECK_MENU_ITEM_TYPE] = 1190 (*fp_gtk_check_menu_item_new)(); 1191 } 1192 result = gtk2_widgets[_GTK_CHECK_MENU_ITEM_TYPE]; 1193 break; 1194 /************************************************************ 1195 * Creation a dedicated color chooser is dangerous because 1196 * it deadlocks the EDT 1197 ************************************************************/ 1198 /* case COLOR_CHOOSER: 1199 if (init_result = 1200 (NULL == gtk2_widgets[_GTK_COLOR_SELECTION_DIALOG_TYPE])) 1201 { 1202 gtk2_widgets[_GTK_COLOR_SELECTION_DIALOG_TYPE] = 1203 (*fp_gtk_color_selection_dialog_new)(NULL); 1204 } 1205 result = gtk2_widgets[_GTK_COLOR_SELECTION_DIALOG_TYPE]; 1206 break;*/ 1207 case COMBO_BOX: 1208 if (init_result = (NULL == gtk2_widgets[_GTK_COMBO_BOX_TYPE])) 1209 { 1210 gtk2_widgets[_GTK_COMBO_BOX_TYPE] = 1211 (*fp_gtk_combo_box_new)(); 1212 } 1213 result = gtk2_widgets[_GTK_COMBO_BOX_TYPE]; 1214 break; 1215 case COMBO_BOX_ARROW_BUTTON: 1216 if (init_result = 1217 (NULL == gtk2_widgets[_GTK_COMBO_BOX_ARROW_BUTTON_TYPE])) 1218 { 1219 gtk2_widgets[_GTK_COMBO_BOX_ARROW_BUTTON_TYPE] = 1220 (*fp_gtk_toggle_button_new)(); 1221 } 1222 result = gtk2_widgets[_GTK_COMBO_BOX_ARROW_BUTTON_TYPE]; 1223 break; 1224 case COMBO_BOX_TEXT_FIELD: 1225 if (init_result = 1226 (NULL == gtk2_widgets[_GTK_COMBO_BOX_TEXT_FIELD_TYPE])) 1227 { 1228 result = gtk2_widgets[_GTK_COMBO_BOX_TEXT_FIELD_TYPE] = 1229 (*fp_gtk_entry_new)(); 1230 } 1231 result = gtk2_widgets[_GTK_COMBO_BOX_TEXT_FIELD_TYPE]; 1232 break; 1233 case DESKTOP_ICON: 1234 case INTERNAL_FRAME_TITLE_PANE: 1235 case LABEL: 1236 if (init_result = (NULL == gtk2_widgets[_GTK_LABEL_TYPE])) 1237 { 1238 gtk2_widgets[_GTK_LABEL_TYPE] = 1239 (*fp_gtk_label_new)(NULL); 1240 } 1241 result = gtk2_widgets[_GTK_LABEL_TYPE]; 1242 break; 1243 case DESKTOP_PANE: 1244 case PANEL: 1245 case ROOT_PANE: 1246 if (init_result = (NULL == gtk2_widgets[_GTK_CONTAINER_TYPE])) 1247 { 1248 /* There is no constructor for a container type. I've 1249 * chosen GtkFixed container since it has a default 1250 * constructor. 1251 */ 1252 gtk2_widgets[_GTK_CONTAINER_TYPE] = 1253 (*fp_gtk_fixed_new)(); 1254 } 1255 result = gtk2_widgets[_GTK_CONTAINER_TYPE]; 1256 break; 1257 case EDITOR_PANE: 1258 case TEXT_AREA: 1259 case TEXT_PANE: 1260 if (init_result = (NULL == gtk2_widgets[_GTK_TEXT_VIEW_TYPE])) 1261 { 1262 gtk2_widgets[_GTK_TEXT_VIEW_TYPE] = 1263 (*fp_gtk_text_view_new)(); 1264 } 1265 result = gtk2_widgets[_GTK_TEXT_VIEW_TYPE]; 1266 break; 1267 case FORMATTED_TEXT_FIELD: 1268 case PASSWORD_FIELD: 1269 case TEXT_FIELD: 1270 if (init_result = (NULL == gtk2_widgets[_GTK_ENTRY_TYPE])) 1271 { 1272 gtk2_widgets[_GTK_ENTRY_TYPE] = 1273 (*fp_gtk_entry_new)(); 1274 } 1275 result = gtk2_widgets[_GTK_ENTRY_TYPE]; 1276 break; 1277 case HANDLE_BOX: 1278 if (init_result = (NULL == gtk2_widgets[_GTK_HANDLE_BOX_TYPE])) 1279 { 1280 gtk2_widgets[_GTK_HANDLE_BOX_TYPE] = 1281 (*fp_gtk_handle_box_new)(); 1282 } 1283 result = gtk2_widgets[_GTK_HANDLE_BOX_TYPE]; 1284 break; 1285 case HSCROLL_BAR: 1286 case HSCROLL_BAR_BUTTON_LEFT: 1287 case HSCROLL_BAR_BUTTON_RIGHT: 1288 case HSCROLL_BAR_TRACK: 1289 case HSCROLL_BAR_THUMB: 1290 if (init_result = (NULL == gtk2_widgets[_GTK_HSCROLLBAR_TYPE])) 1291 { 1292 gtk2_widgets[_GTK_HSCROLLBAR_TYPE] = 1293 (*fp_gtk_hscrollbar_new)(create_adjustment()); 1294 } 1295 result = gtk2_widgets[_GTK_HSCROLLBAR_TYPE]; 1296 break; 1297 case HSEPARATOR: 1298 if (init_result = (NULL == gtk2_widgets[_GTK_HSEPARATOR_TYPE])) 1299 { 1300 gtk2_widgets[_GTK_HSEPARATOR_TYPE] = 1301 (*fp_gtk_hseparator_new)(); 1302 } 1303 result = gtk2_widgets[_GTK_HSEPARATOR_TYPE]; 1304 break; 1305 case HSLIDER: 1306 case HSLIDER_THUMB: 1307 case HSLIDER_TRACK: 1308 if (init_result = (NULL == gtk2_widgets[_GTK_HSCALE_TYPE])) 1309 { 1310 gtk2_widgets[_GTK_HSCALE_TYPE] = 1311 (*fp_gtk_hscale_new)(NULL); 1312 } 1313 result = gtk2_widgets[_GTK_HSCALE_TYPE]; 1314 break; 1315 case HSPLIT_PANE_DIVIDER: 1316 case SPLIT_PANE: 1317 if (init_result = (NULL == gtk2_widgets[_GTK_HPANED_TYPE])) 1318 { 1319 gtk2_widgets[_GTK_HPANED_TYPE] = (*fp_gtk_hpaned_new)(); 1320 } 1321 result = gtk2_widgets[_GTK_HPANED_TYPE]; 1322 break; 1323 case IMAGE: 1324 if (init_result = (NULL == gtk2_widgets[_GTK_IMAGE_TYPE])) 1325 { 1326 gtk2_widgets[_GTK_IMAGE_TYPE] = (*fp_gtk_image_new)(); 1327 } 1328 result = gtk2_widgets[_GTK_IMAGE_TYPE]; 1329 break; 1330 case INTERNAL_FRAME: 1331 if (init_result = (NULL == gtk2_widgets[_GTK_WINDOW_TYPE])) 1332 { 1333 gtk2_widgets[_GTK_WINDOW_TYPE] = 1334 (*fp_gtk_window_new)(GTK_WINDOW_TOPLEVEL); 1335 } 1336 result = gtk2_widgets[_GTK_WINDOW_TYPE]; 1337 break; 1338 case TOOL_TIP: 1339 if (init_result = (NULL == gtk2_widgets[_GTK_TOOLTIP_TYPE])) 1340 { 1341 result = (*fp_gtk_window_new)(GTK_WINDOW_TOPLEVEL); 1342 (*fp_gtk_widget_set_name)(result, "gtk-tooltips"); 1343 gtk2_widgets[_GTK_TOOLTIP_TYPE] = result; 1344 } 1345 result = gtk2_widgets[_GTK_TOOLTIP_TYPE]; 1346 break; 1347 case LIST: 1348 case TABLE: 1349 case TREE: 1350 case TREE_CELL: 1351 if (init_result = (NULL == gtk2_widgets[_GTK_TREE_VIEW_TYPE])) 1352 { 1353 gtk2_widgets[_GTK_TREE_VIEW_TYPE] = 1354 (*fp_gtk_tree_view_new)(); 1355 } 1356 result = gtk2_widgets[_GTK_TREE_VIEW_TYPE]; 1357 break; 1358 case TITLED_BORDER: 1359 if (init_result = (NULL == gtk2_widgets[_GTK_FRAME_TYPE])) 1360 { 1361 gtk2_widgets[_GTK_FRAME_TYPE] = fp_gtk_frame_new(NULL); 1362 } 1363 result = gtk2_widgets[_GTK_FRAME_TYPE]; 1364 break; 1365 case POPUP_MENU: 1366 if (init_result = (NULL == gtk2_widgets[_GTK_MENU_TYPE])) 1367 { 1368 gtk2_widgets[_GTK_MENU_TYPE] = 1369 (*fp_gtk_menu_new)(); 1370 } 1371 result = gtk2_widgets[_GTK_MENU_TYPE]; 1372 break; 1373 case MENU: 1374 case MENU_ITEM: 1375 case MENU_ITEM_ACCELERATOR: 1376 if (init_result = (NULL == gtk2_widgets[_GTK_MENU_ITEM_TYPE])) 1377 { 1378 gtk2_widgets[_GTK_MENU_ITEM_TYPE] = 1379 (*fp_gtk_menu_item_new)(); 1380 } 1381 result = gtk2_widgets[_GTK_MENU_ITEM_TYPE]; 1382 break; 1383 case MENU_BAR: 1384 if (init_result = (NULL == gtk2_widgets[_GTK_MENU_BAR_TYPE])) 1385 { 1386 gtk2_widgets[_GTK_MENU_BAR_TYPE] = 1387 (*fp_gtk_menu_bar_new)(); 1388 } 1389 result = gtk2_widgets[_GTK_MENU_BAR_TYPE]; 1390 break; 1391 case COLOR_CHOOSER: 1392 case OPTION_PANE: 1393 if (init_result = (NULL == gtk2_widgets[_GTK_DIALOG_TYPE])) 1394 { 1395 gtk2_widgets[_GTK_DIALOG_TYPE] = 1396 (*fp_gtk_dialog_new)(); 1397 } 1398 result = gtk2_widgets[_GTK_DIALOG_TYPE]; 1399 break; 1400 case POPUP_MENU_SEPARATOR: 1401 if (init_result = 1402 (NULL == gtk2_widgets[_GTK_SEPARATOR_MENU_ITEM_TYPE])) 1403 { 1404 gtk2_widgets[_GTK_SEPARATOR_MENU_ITEM_TYPE] = 1405 (*fp_gtk_separator_menu_item_new)(); 1406 } 1407 result = gtk2_widgets[_GTK_SEPARATOR_MENU_ITEM_TYPE]; 1408 break; 1409 case HPROGRESS_BAR: 1410 if (init_result = (NULL == gtk2_widgets[_GTK_HPROGRESS_BAR_TYPE])) 1411 { 1412 gtk2_widgets[_GTK_HPROGRESS_BAR_TYPE] = 1413 (*fp_gtk_progress_bar_new)(); 1414 } 1415 result = gtk2_widgets[_GTK_HPROGRESS_BAR_TYPE]; 1416 break; 1417 case VPROGRESS_BAR: 1418 if (init_result = (NULL == gtk2_widgets[_GTK_VPROGRESS_BAR_TYPE])) 1419 { 1420 gtk2_widgets[_GTK_VPROGRESS_BAR_TYPE] = 1421 (*fp_gtk_progress_bar_new)(); 1422 /* 1423 * Vertical JProgressBars always go bottom-to-top, 1424 * regardless of the ComponentOrientation. 1425 */ 1426 (*fp_gtk_progress_bar_set_orientation)( 1427 (GtkProgressBar *)gtk2_widgets[_GTK_VPROGRESS_BAR_TYPE], 1428 GTK_PROGRESS_BOTTOM_TO_TOP); 1429 } 1430 result = gtk2_widgets[_GTK_VPROGRESS_BAR_TYPE]; 1431 break; 1432 case RADIO_BUTTON: 1433 if (init_result = (NULL == gtk2_widgets[_GTK_RADIO_BUTTON_TYPE])) 1434 { 1435 gtk2_widgets[_GTK_RADIO_BUTTON_TYPE] = 1436 (*fp_gtk_radio_button_new)(NULL); 1437 } 1438 result = gtk2_widgets[_GTK_RADIO_BUTTON_TYPE]; 1439 break; 1440 case RADIO_BUTTON_MENU_ITEM: 1441 if (init_result = 1442 (NULL == gtk2_widgets[_GTK_RADIO_MENU_ITEM_TYPE])) 1443 { 1444 gtk2_widgets[_GTK_RADIO_MENU_ITEM_TYPE] = 1445 (*fp_gtk_radio_menu_item_new)(NULL); 1446 } 1447 result = gtk2_widgets[_GTK_RADIO_MENU_ITEM_TYPE]; 1448 break; 1449 case SCROLL_PANE: 1450 if (init_result = 1451 (NULL == gtk2_widgets[_GTK_SCROLLED_WINDOW_TYPE])) 1452 { 1453 gtk2_widgets[_GTK_SCROLLED_WINDOW_TYPE] = 1454 (*fp_gtk_scrolled_window_new)(NULL, NULL); 1455 } 1456 result = gtk2_widgets[_GTK_SCROLLED_WINDOW_TYPE]; 1457 break; 1458 case SPINNER: 1459 case SPINNER_ARROW_BUTTON: 1460 case SPINNER_TEXT_FIELD: 1461 if (init_result = (NULL == gtk2_widgets[_GTK_SPIN_BUTTON_TYPE])) 1462 { 1463 result = gtk2_widgets[_GTK_SPIN_BUTTON_TYPE] = 1464 (*fp_gtk_spin_button_new)(NULL, 0, 0); 1465 } 1466 result = gtk2_widgets[_GTK_SPIN_BUTTON_TYPE]; 1467 break; 1468 case TABBED_PANE: 1469 case TABBED_PANE_TAB_AREA: 1470 case TABBED_PANE_CONTENT: 1471 case TABBED_PANE_TAB: 1472 if (init_result = (NULL == gtk2_widgets[_GTK_NOTEBOOK_TYPE])) 1473 { 1474 gtk2_widgets[_GTK_NOTEBOOK_TYPE] = 1475 (*fp_gtk_notebook_new)(NULL); 1476 } 1477 result = gtk2_widgets[_GTK_NOTEBOOK_TYPE]; 1478 break; 1479 case TOGGLE_BUTTON: 1480 if (init_result = (NULL == gtk2_widgets[_GTK_TOGGLE_BUTTON_TYPE])) 1481 { 1482 gtk2_widgets[_GTK_TOGGLE_BUTTON_TYPE] = 1483 (*fp_gtk_toggle_button_new)(NULL); 1484 } 1485 result = gtk2_widgets[_GTK_TOGGLE_BUTTON_TYPE]; 1486 break; 1487 case TOOL_BAR: 1488 case TOOL_BAR_DRAG_WINDOW: 1489 if (init_result = (NULL == gtk2_widgets[_GTK_TOOLBAR_TYPE])) 1490 { 1491 gtk2_widgets[_GTK_TOOLBAR_TYPE] = 1492 (*fp_gtk_toolbar_new)(NULL); 1493 } 1494 result = gtk2_widgets[_GTK_TOOLBAR_TYPE]; 1495 break; 1496 case TOOL_BAR_SEPARATOR: 1497 if (init_result = 1498 (NULL == gtk2_widgets[_GTK_SEPARATOR_TOOL_ITEM_TYPE])) 1499 { 1500 gtk2_widgets[_GTK_SEPARATOR_TOOL_ITEM_TYPE] = 1501 (*fp_gtk_separator_tool_item_new)(); 1502 } 1503 result = gtk2_widgets[_GTK_SEPARATOR_TOOL_ITEM_TYPE]; 1504 break; 1505 case VIEWPORT: 1506 if (init_result = (NULL == gtk2_widgets[_GTK_VIEWPORT_TYPE])) 1507 { 1508 GtkAdjustment *adjustment = create_adjustment(); 1509 gtk2_widgets[_GTK_VIEWPORT_TYPE] = 1510 (*fp_gtk_viewport_new)(adjustment, adjustment); 1511 } 1512 result = gtk2_widgets[_GTK_VIEWPORT_TYPE]; 1513 break; 1514 case VSCROLL_BAR: 1515 case VSCROLL_BAR_BUTTON_UP: 1516 case VSCROLL_BAR_BUTTON_DOWN: 1517 case VSCROLL_BAR_TRACK: 1518 case VSCROLL_BAR_THUMB: 1519 if (init_result = (NULL == gtk2_widgets[_GTK_VSCROLLBAR_TYPE])) 1520 { 1521 gtk2_widgets[_GTK_VSCROLLBAR_TYPE] = 1522 (*fp_gtk_vscrollbar_new)(create_adjustment()); 1523 } 1524 result = gtk2_widgets[_GTK_VSCROLLBAR_TYPE]; 1525 break; 1526 case VSEPARATOR: 1527 if (init_result = (NULL == gtk2_widgets[_GTK_VSEPARATOR_TYPE])) 1528 { 1529 gtk2_widgets[_GTK_VSEPARATOR_TYPE] = 1530 (*fp_gtk_vseparator_new)(); 1531 } 1532 result = gtk2_widgets[_GTK_VSEPARATOR_TYPE]; 1533 break; 1534 case VSLIDER: 1535 case VSLIDER_THUMB: 1536 case VSLIDER_TRACK: 1537 if (init_result = (NULL == gtk2_widgets[_GTK_VSCALE_TYPE])) 1538 { 1539 gtk2_widgets[_GTK_VSCALE_TYPE] = 1540 (*fp_gtk_vscale_new)(NULL); 1541 } 1542 result = gtk2_widgets[_GTK_VSCALE_TYPE]; 1543 /* 1544 * Vertical JSliders start at the bottom, while vertical 1545 * GtkVScale widgets start at the top (by default), so to fix 1546 * this we set the "inverted" flag to get the Swing behavior. 1547 */ 1548 ((GtkRange*)result)->inverted = 1; 1549 break; 1550 case VSPLIT_PANE_DIVIDER: 1551 if (init_result = (NULL == gtk2_widgets[_GTK_VPANED_TYPE])) 1552 { 1553 gtk2_widgets[_GTK_VPANED_TYPE] = (*fp_gtk_vpaned_new)(); 1554 } 1555 result = gtk2_widgets[_GTK_VPANED_TYPE]; 1556 break; 1557 default: 1558 result = NULL; 1559 break; 1560 } 1561 1562 if (result != NULL && init_result) 1563 { 1564 if (widget_type == RADIO_BUTTON_MENU_ITEM || 1565 widget_type == CHECK_BOX_MENU_ITEM || 1566 widget_type == MENU_ITEM || 1567 widget_type == MENU || 1568 widget_type == POPUP_MENU_SEPARATOR) 1569 { 1570 GtkWidget *menu = gtk2_get_widget(POPUP_MENU); 1571 (*fp_gtk_menu_shell_append)((GtkMenuShell *)menu, result); 2442 } 2443 2444 return result; 2445 } 2446 2447 /***********************************************/ 2448 static jobject get_string_property(JNIEnv *env, GtkSettings* settings, const gchar* key) 2449 { 2450 jobject result = NULL; 2451 gchar* strval = NULL; 2452 2453 (*fp_g_object_get)(settings, key, &strval, NULL); 2454 result = (*env)->NewStringUTF(env, strval); 2455 (*fp_g_free)(strval); 2456 2457 return result; 2458 } 2459 2460 static jobject get_integer_property(JNIEnv *env, GtkSettings* settings, const gchar* key) 2461 { 2462 gint intval = NULL; 2463 (*fp_g_object_get)(settings, key, &intval, NULL); 2464 return create_Integer(env, intval); 2465 } 2466 2467 static jobject get_boolean_property(JNIEnv *env, GtkSettings* settings, const gchar* key) 2468 { 2469 gint intval = NULL; 2470 (*fp_g_object_get)(settings, key, &intval, NULL); 2471 return create_Boolean(env, intval); 2472 } 2473 2474 static jobject gtk2_get_setting(JNIEnv *env, Setting property) 2475 { 2476 GtkSettings* settings = (*fp_gtk_settings_get_default)(); 2477 2478 switch (property) 2479 { 2480 case GTK_FONT_NAME: 2481 return get_string_property(env, settings, "gtk-font-name"); 2482 case GTK_ICON_SIZES: 2483 return get_string_property(env, settings, "gtk-icon-sizes"); 2484 case GTK_CURSOR_BLINK: 2485 return get_boolean_property(env, settings, "gtk-cursor-blink"); 2486 case GTK_CURSOR_BLINK_TIME: 2487 return get_integer_property(env, settings, "gtk-cursor-blink-time"); 2488 } 2489 | 751 } 752 /* Now we have only one kind of exceptions: NO_SYMBOL_EXCEPTION 753 * Otherwise we can check the return value of setjmp method. 754 */ 755 else 756 { 757 dlclose(gtk2_libhandle); 758 gtk2_libhandle = NULL; 759 760 dlclose(gthread_libhandle); 761 gthread_libhandle = NULL; 762 763 return FALSE; 764 } 765 766 /* 767 * Strip the AT-SPI GTK_MODULEs if present 768 */ 769 gtk_modules_env = getenv ("GTK_MODULES"); 770 771 if ((gtk_modules_env && strstr (gtk_modules_env, "atk-bridge")) || 772 (gtk_modules_env && strstr (gtk_modules_env, "gail"))) 773 { 774 /* the new env will be smaller than the old one */ 775 gchar *s, *new_env = SAFE_SIZE_STRUCT_ALLOC(malloc, 776 sizeof(ENV_PREFIX), 1, strlen (gtk_modules_env)); 777 778 if (new_env != NULL ) 779 { 780 /* careful, strtok modifies its args */ 781 gchar *tmp_env = strdup (gtk_modules_env); 782 strcpy(new_env, ENV_PREFIX); 783 784 /* strip out 'atk-bridge' and 'gail' */ 785 size_t PREFIX_LENGTH = strlen(ENV_PREFIX); 786 while ((s = strtok(tmp_env, ":"))) 787 { 788 if ((!strstr (s, "atk-bridge")) && (!strstr (s, "gail"))) 789 { 790 if (strlen (new_env) > PREFIX_LENGTH) { 791 new_env = strcat (new_env, ":"); 792 } 793 new_env = strcat(new_env, s); 794 } 795 if (tmp_env) 796 { 797 free (tmp_env); 798 tmp_env = NULL; /* next call to strtok arg1==NULL */ 799 } 800 } 801 putenv (new_env); 802 free (new_env); 803 free (tmp_env); 804 } 805 } 806 1082 /* 1083 * Initializes the widget to correct state for some engines. 1084 * This is a pure empirical method. 1085 */ 1086 static void init_toggle_widget(WidgetType widget_type, gint synth_state) 1087 { 1088 gboolean is_active = ((synth_state & SELECTED) != 0); 1089 1090 if (widget_type == RADIO_BUTTON || 1091 widget_type == CHECK_BOX || 1092 widget_type == TOGGLE_BUTTON) { 1093 ((GtkToggleButton*)gtk2_widget)->active = is_active; 1094 } 1095 1096 if ((synth_state & FOCUSED) != 0) { 1097 ((GtkObject*)gtk2_widget)->flags |= GTK_HAS_FOCUS; 1098 } else { 1099 ((GtkObject*)gtk2_widget)->flags &= ~GTK_HAS_FOCUS; 1100 } 1101 1102 if (((synth_state & MOUSE_OVER) != 0 && (synth_state & PRESSED) == 0) || 1103 ((synth_state & FOCUSED) != 0 && (synth_state & PRESSED) != 0)) { 1104 gtk2_widget->state = GTK_STATE_PRELIGHT; 1105 } else if ((synth_state & DISABLED) != 0) { 1106 gtk2_widget->state = GTK_STATE_INSENSITIVE; 1107 } else { 1108 gtk2_widget->state = is_active ? GTK_STATE_ACTIVE : GTK_STATE_NORMAL; 1109 } 1110 } 1111 1112 /* GTK state_type filter */ 1113 static GtkStateType get_gtk_state_type(WidgetType widget_type, gint synth_state) 1114 { 1115 GtkStateType result = GTK_STATE_NORMAL; 1116 1117 if ((synth_state & DISABLED) != 0) { 1118 result = GTK_STATE_INSENSITIVE; 1119 } else if ((synth_state & PRESSED) != 0) { 1120 result = GTK_STATE_ACTIVE; 1121 } else if ((synth_state & MOUSE_OVER) != 0) { 1122 result = GTK_STATE_PRELIGHT; 1123 } 1152 } 1153 1154 static GtkAdjustment* create_adjustment() 1155 { 1156 return (GtkAdjustment *) 1157 (*fp_gtk_adjustment_new)(50.0, 0.0, 100.0, 10.0, 20.0, 20.0); 1158 } 1159 1160 /** 1161 * Returns a pointer to the cached native widget for the specified widget 1162 * type. 1163 */ 1164 static GtkWidget *gtk2_get_widget(WidgetType widget_type) 1165 { 1166 gboolean init_result = FALSE; 1167 GtkWidget *result = NULL; 1168 switch (widget_type) 1169 { 1170 case BUTTON: 1171 case TABLE_HEADER: 1172 init_result = (NULL == gtk2_widgets[_GTK_BUTTON_TYPE]); 1173 if (init_result) 1174 { 1175 gtk2_widgets[_GTK_BUTTON_TYPE] = (*fp_gtk_button_new)(); 1176 } 1177 result = gtk2_widgets[_GTK_BUTTON_TYPE]; 1178 break; 1179 case CHECK_BOX: 1180 init_result = (NULL == gtk2_widgets[_GTK_CHECK_BUTTON_TYPE]); 1181 if (init_result) 1182 { 1183 gtk2_widgets[_GTK_CHECK_BUTTON_TYPE] = 1184 (*fp_gtk_check_button_new)(); 1185 } 1186 result = gtk2_widgets[_GTK_CHECK_BUTTON_TYPE]; 1187 break; 1188 case CHECK_BOX_MENU_ITEM: 1189 init_result = (NULL == gtk2_widgets[_GTK_CHECK_MENU_ITEM_TYPE]); 1190 if (init_result) 1191 { 1192 gtk2_widgets[_GTK_CHECK_MENU_ITEM_TYPE] = 1193 (*fp_gtk_check_menu_item_new)(); 1194 } 1195 result = gtk2_widgets[_GTK_CHECK_MENU_ITEM_TYPE]; 1196 break; 1197 /************************************************************ 1198 * Creation a dedicated color chooser is dangerous because 1199 * it deadlocks the EDT 1200 ************************************************************/ 1201 /* case COLOR_CHOOSER: 1202 if (init_result = 1203 (NULL == gtk2_widgets[_GTK_COLOR_SELECTION_DIALOG_TYPE])) 1204 { 1205 gtk2_widgets[_GTK_COLOR_SELECTION_DIALOG_TYPE] = 1206 (*fp_gtk_color_selection_dialog_new)(NULL); 1207 } 1208 result = gtk2_widgets[_GTK_COLOR_SELECTION_DIALOG_TYPE]; 1209 break;*/ 1210 case COMBO_BOX: 1211 init_result = (NULL == gtk2_widgets[_GTK_COMBO_BOX_TYPE]); 1212 if (init_result) 1213 { 1214 gtk2_widgets[_GTK_COMBO_BOX_TYPE] = 1215 (*fp_gtk_combo_box_new)(); 1216 } 1217 result = gtk2_widgets[_GTK_COMBO_BOX_TYPE]; 1218 break; 1219 case COMBO_BOX_ARROW_BUTTON: 1220 init_result = 1221 (NULL == gtk2_widgets[_GTK_COMBO_BOX_ARROW_BUTTON_TYPE]); 1222 if (init_result) 1223 { 1224 gtk2_widgets[_GTK_COMBO_BOX_ARROW_BUTTON_TYPE] = 1225 (*fp_gtk_toggle_button_new)(); 1226 } 1227 result = gtk2_widgets[_GTK_COMBO_BOX_ARROW_BUTTON_TYPE]; 1228 break; 1229 case COMBO_BOX_TEXT_FIELD: 1230 init_result = 1231 (NULL == gtk2_widgets[_GTK_COMBO_BOX_TEXT_FIELD_TYPE]); 1232 if (init_result) 1233 { 1234 result = gtk2_widgets[_GTK_COMBO_BOX_TEXT_FIELD_TYPE] = 1235 (*fp_gtk_entry_new)(); 1236 } 1237 result = gtk2_widgets[_GTK_COMBO_BOX_TEXT_FIELD_TYPE]; 1238 break; 1239 case DESKTOP_ICON: 1240 case INTERNAL_FRAME_TITLE_PANE: 1241 case LABEL: 1242 init_result = (NULL == gtk2_widgets[_GTK_LABEL_TYPE]); 1243 if (init_result) 1244 { 1245 gtk2_widgets[_GTK_LABEL_TYPE] = 1246 (*fp_gtk_label_new)(NULL); 1247 } 1248 result = gtk2_widgets[_GTK_LABEL_TYPE]; 1249 break; 1250 case DESKTOP_PANE: 1251 case PANEL: 1252 case ROOT_PANE: 1253 init_result = (NULL == gtk2_widgets[_GTK_CONTAINER_TYPE]); 1254 if (init_result) 1255 { 1256 /* There is no constructor for a container type. I've 1257 * chosen GtkFixed container since it has a default 1258 * constructor. 1259 */ 1260 gtk2_widgets[_GTK_CONTAINER_TYPE] = 1261 (*fp_gtk_fixed_new)(); 1262 } 1263 result = gtk2_widgets[_GTK_CONTAINER_TYPE]; 1264 break; 1265 case EDITOR_PANE: 1266 case TEXT_AREA: 1267 case TEXT_PANE: 1268 init_result = (NULL == gtk2_widgets[_GTK_TEXT_VIEW_TYPE]); 1269 if (init_result) 1270 { 1271 gtk2_widgets[_GTK_TEXT_VIEW_TYPE] = 1272 (*fp_gtk_text_view_new)(); 1273 } 1274 result = gtk2_widgets[_GTK_TEXT_VIEW_TYPE]; 1275 break; 1276 case FORMATTED_TEXT_FIELD: 1277 case PASSWORD_FIELD: 1278 case TEXT_FIELD: 1279 init_result = (NULL == gtk2_widgets[_GTK_ENTRY_TYPE]); 1280 if (init_result) 1281 { 1282 gtk2_widgets[_GTK_ENTRY_TYPE] = 1283 (*fp_gtk_entry_new)(); 1284 } 1285 result = gtk2_widgets[_GTK_ENTRY_TYPE]; 1286 break; 1287 case HANDLE_BOX: 1288 init_result = (NULL == gtk2_widgets[_GTK_HANDLE_BOX_TYPE]); 1289 if (init_result) 1290 { 1291 gtk2_widgets[_GTK_HANDLE_BOX_TYPE] = 1292 (*fp_gtk_handle_box_new)(); 1293 } 1294 result = gtk2_widgets[_GTK_HANDLE_BOX_TYPE]; 1295 break; 1296 case HSCROLL_BAR: 1297 case HSCROLL_BAR_BUTTON_LEFT: 1298 case HSCROLL_BAR_BUTTON_RIGHT: 1299 case HSCROLL_BAR_TRACK: 1300 case HSCROLL_BAR_THUMB: 1301 init_result = (NULL == gtk2_widgets[_GTK_HSCROLLBAR_TYPE]); 1302 if (init_result) 1303 { 1304 gtk2_widgets[_GTK_HSCROLLBAR_TYPE] = 1305 (*fp_gtk_hscrollbar_new)(create_adjustment()); 1306 } 1307 result = gtk2_widgets[_GTK_HSCROLLBAR_TYPE]; 1308 break; 1309 case HSEPARATOR: 1310 init_result = (NULL == gtk2_widgets[_GTK_HSEPARATOR_TYPE]); 1311 if (init_result) 1312 { 1313 gtk2_widgets[_GTK_HSEPARATOR_TYPE] = 1314 (*fp_gtk_hseparator_new)(); 1315 } 1316 result = gtk2_widgets[_GTK_HSEPARATOR_TYPE]; 1317 break; 1318 case HSLIDER: 1319 case HSLIDER_THUMB: 1320 case HSLIDER_TRACK: 1321 init_result = (NULL == gtk2_widgets[_GTK_HSCALE_TYPE]); 1322 if (init_result) 1323 { 1324 gtk2_widgets[_GTK_HSCALE_TYPE] = 1325 (*fp_gtk_hscale_new)(NULL); 1326 } 1327 result = gtk2_widgets[_GTK_HSCALE_TYPE]; 1328 break; 1329 case HSPLIT_PANE_DIVIDER: 1330 case SPLIT_PANE: 1331 init_result = (NULL == gtk2_widgets[_GTK_HPANED_TYPE]); 1332 if (init_result) 1333 { 1334 gtk2_widgets[_GTK_HPANED_TYPE] = (*fp_gtk_hpaned_new)(); 1335 } 1336 result = gtk2_widgets[_GTK_HPANED_TYPE]; 1337 break; 1338 case IMAGE: 1339 init_result = (NULL == gtk2_widgets[_GTK_IMAGE_TYPE]); 1340 if (init_result) 1341 { 1342 gtk2_widgets[_GTK_IMAGE_TYPE] = (*fp_gtk_image_new)(); 1343 } 1344 result = gtk2_widgets[_GTK_IMAGE_TYPE]; 1345 break; 1346 case INTERNAL_FRAME: 1347 init_result = (NULL == gtk2_widgets[_GTK_WINDOW_TYPE]); 1348 if (init_result) 1349 { 1350 gtk2_widgets[_GTK_WINDOW_TYPE] = 1351 (*fp_gtk_window_new)(GTK_WINDOW_TOPLEVEL); 1352 } 1353 result = gtk2_widgets[_GTK_WINDOW_TYPE]; 1354 break; 1355 case TOOL_TIP: 1356 init_result = (NULL == gtk2_widgets[_GTK_TOOLTIP_TYPE]); 1357 if (init_result) 1358 { 1359 result = (*fp_gtk_window_new)(GTK_WINDOW_TOPLEVEL); 1360 (*fp_gtk_widget_set_name)(result, "gtk-tooltips"); 1361 gtk2_widgets[_GTK_TOOLTIP_TYPE] = result; 1362 } 1363 result = gtk2_widgets[_GTK_TOOLTIP_TYPE]; 1364 break; 1365 case LIST: 1366 case TABLE: 1367 case TREE: 1368 case TREE_CELL: 1369 init_result = (NULL == gtk2_widgets[_GTK_TREE_VIEW_TYPE]); 1370 if (init_result) 1371 { 1372 gtk2_widgets[_GTK_TREE_VIEW_TYPE] = 1373 (*fp_gtk_tree_view_new)(); 1374 } 1375 result = gtk2_widgets[_GTK_TREE_VIEW_TYPE]; 1376 break; 1377 case TITLED_BORDER: 1378 init_result = (NULL == gtk2_widgets[_GTK_FRAME_TYPE]); 1379 if (init_result) 1380 { 1381 gtk2_widgets[_GTK_FRAME_TYPE] = fp_gtk_frame_new(NULL); 1382 } 1383 result = gtk2_widgets[_GTK_FRAME_TYPE]; 1384 break; 1385 case POPUP_MENU: 1386 init_result = (NULL == gtk2_widgets[_GTK_MENU_TYPE]); 1387 if (init_result) 1388 { 1389 gtk2_widgets[_GTK_MENU_TYPE] = 1390 (*fp_gtk_menu_new)(); 1391 } 1392 result = gtk2_widgets[_GTK_MENU_TYPE]; 1393 break; 1394 case MENU: 1395 case MENU_ITEM: 1396 case MENU_ITEM_ACCELERATOR: 1397 init_result = (NULL == gtk2_widgets[_GTK_MENU_ITEM_TYPE]); 1398 if (init_result) 1399 { 1400 gtk2_widgets[_GTK_MENU_ITEM_TYPE] = 1401 (*fp_gtk_menu_item_new)(); 1402 } 1403 result = gtk2_widgets[_GTK_MENU_ITEM_TYPE]; 1404 break; 1405 case MENU_BAR: 1406 init_result = (NULL == gtk2_widgets[_GTK_MENU_BAR_TYPE]); 1407 if (init_result) 1408 { 1409 gtk2_widgets[_GTK_MENU_BAR_TYPE] = 1410 (*fp_gtk_menu_bar_new)(); 1411 } 1412 result = gtk2_widgets[_GTK_MENU_BAR_TYPE]; 1413 break; 1414 case COLOR_CHOOSER: 1415 case OPTION_PANE: 1416 init_result = (NULL == gtk2_widgets[_GTK_DIALOG_TYPE]); 1417 if (init_result) 1418 { 1419 gtk2_widgets[_GTK_DIALOG_TYPE] = 1420 (*fp_gtk_dialog_new)(); 1421 } 1422 result = gtk2_widgets[_GTK_DIALOG_TYPE]; 1423 break; 1424 case POPUP_MENU_SEPARATOR: 1425 init_result = 1426 (NULL == gtk2_widgets[_GTK_SEPARATOR_MENU_ITEM_TYPE]); 1427 if (init_result) 1428 { 1429 gtk2_widgets[_GTK_SEPARATOR_MENU_ITEM_TYPE] = 1430 (*fp_gtk_separator_menu_item_new)(); 1431 } 1432 result = gtk2_widgets[_GTK_SEPARATOR_MENU_ITEM_TYPE]; 1433 break; 1434 case HPROGRESS_BAR: 1435 init_result = (NULL == gtk2_widgets[_GTK_HPROGRESS_BAR_TYPE]); 1436 if (init_result) 1437 { 1438 gtk2_widgets[_GTK_HPROGRESS_BAR_TYPE] = 1439 (*fp_gtk_progress_bar_new)(); 1440 } 1441 result = gtk2_widgets[_GTK_HPROGRESS_BAR_TYPE]; 1442 break; 1443 case VPROGRESS_BAR: 1444 init_result = (NULL == gtk2_widgets[_GTK_VPROGRESS_BAR_TYPE]); 1445 if (init_result) 1446 { 1447 gtk2_widgets[_GTK_VPROGRESS_BAR_TYPE] = 1448 (*fp_gtk_progress_bar_new)(); 1449 /* 1450 * Vertical JProgressBars always go bottom-to-top, 1451 * regardless of the ComponentOrientation. 1452 */ 1453 (*fp_gtk_progress_bar_set_orientation)( 1454 (GtkProgressBar *)gtk2_widgets[_GTK_VPROGRESS_BAR_TYPE], 1455 GTK_PROGRESS_BOTTOM_TO_TOP); 1456 } 1457 result = gtk2_widgets[_GTK_VPROGRESS_BAR_TYPE]; 1458 break; 1459 case RADIO_BUTTON: 1460 init_result = (NULL == gtk2_widgets[_GTK_RADIO_BUTTON_TYPE]); 1461 if (init_result) 1462 { 1463 gtk2_widgets[_GTK_RADIO_BUTTON_TYPE] = 1464 (*fp_gtk_radio_button_new)(NULL); 1465 } 1466 result = gtk2_widgets[_GTK_RADIO_BUTTON_TYPE]; 1467 break; 1468 case RADIO_BUTTON_MENU_ITEM: 1469 init_result = 1470 (NULL == gtk2_widgets[_GTK_RADIO_MENU_ITEM_TYPE]); 1471 if (init_result) 1472 { 1473 gtk2_widgets[_GTK_RADIO_MENU_ITEM_TYPE] = 1474 (*fp_gtk_radio_menu_item_new)(NULL); 1475 } 1476 result = gtk2_widgets[_GTK_RADIO_MENU_ITEM_TYPE]; 1477 break; 1478 case SCROLL_PANE: 1479 init_result = 1480 (NULL == gtk2_widgets[_GTK_SCROLLED_WINDOW_TYPE]); 1481 if (init_result) 1482 { 1483 gtk2_widgets[_GTK_SCROLLED_WINDOW_TYPE] = 1484 (*fp_gtk_scrolled_window_new)(NULL, NULL); 1485 } 1486 result = gtk2_widgets[_GTK_SCROLLED_WINDOW_TYPE]; 1487 break; 1488 case SPINNER: 1489 case SPINNER_ARROW_BUTTON: 1490 case SPINNER_TEXT_FIELD: 1491 init_result = (NULL == gtk2_widgets[_GTK_SPIN_BUTTON_TYPE]); 1492 if (init_result) 1493 { 1494 result = gtk2_widgets[_GTK_SPIN_BUTTON_TYPE] = 1495 (*fp_gtk_spin_button_new)(NULL, 0, 0); 1496 } 1497 result = gtk2_widgets[_GTK_SPIN_BUTTON_TYPE]; 1498 break; 1499 case TABBED_PANE: 1500 case TABBED_PANE_TAB_AREA: 1501 case TABBED_PANE_CONTENT: 1502 case TABBED_PANE_TAB: 1503 init_result = (NULL == gtk2_widgets[_GTK_NOTEBOOK_TYPE]); 1504 if (init_result) 1505 { 1506 gtk2_widgets[_GTK_NOTEBOOK_TYPE] = 1507 (*fp_gtk_notebook_new)(NULL); 1508 } 1509 result = gtk2_widgets[_GTK_NOTEBOOK_TYPE]; 1510 break; 1511 case TOGGLE_BUTTON: 1512 init_result = (NULL == gtk2_widgets[_GTK_TOGGLE_BUTTON_TYPE]); 1513 if (init_result) 1514 { 1515 gtk2_widgets[_GTK_TOGGLE_BUTTON_TYPE] = 1516 (*fp_gtk_toggle_button_new)(NULL); 1517 } 1518 result = gtk2_widgets[_GTK_TOGGLE_BUTTON_TYPE]; 1519 break; 1520 case TOOL_BAR: 1521 case TOOL_BAR_DRAG_WINDOW: 1522 init_result = (NULL == gtk2_widgets[_GTK_TOOLBAR_TYPE]); 1523 if (init_result) 1524 { 1525 gtk2_widgets[_GTK_TOOLBAR_TYPE] = 1526 (*fp_gtk_toolbar_new)(NULL); 1527 } 1528 result = gtk2_widgets[_GTK_TOOLBAR_TYPE]; 1529 break; 1530 case TOOL_BAR_SEPARATOR: 1531 init_result = 1532 (NULL == gtk2_widgets[_GTK_SEPARATOR_TOOL_ITEM_TYPE]); 1533 if (init_result) 1534 { 1535 gtk2_widgets[_GTK_SEPARATOR_TOOL_ITEM_TYPE] = 1536 (*fp_gtk_separator_tool_item_new)(); 1537 } 1538 result = gtk2_widgets[_GTK_SEPARATOR_TOOL_ITEM_TYPE]; 1539 break; 1540 case VIEWPORT: 1541 init_result = (NULL == gtk2_widgets[_GTK_VIEWPORT_TYPE]); 1542 if (init_result) 1543 { 1544 GtkAdjustment *adjustment = create_adjustment(); 1545 gtk2_widgets[_GTK_VIEWPORT_TYPE] = 1546 (*fp_gtk_viewport_new)(adjustment, adjustment); 1547 } 1548 result = gtk2_widgets[_GTK_VIEWPORT_TYPE]; 1549 break; 1550 case VSCROLL_BAR: 1551 case VSCROLL_BAR_BUTTON_UP: 1552 case VSCROLL_BAR_BUTTON_DOWN: 1553 case VSCROLL_BAR_TRACK: 1554 case VSCROLL_BAR_THUMB: 1555 init_result = (NULL == gtk2_widgets[_GTK_VSCROLLBAR_TYPE]); 1556 if (init_result) 1557 { 1558 gtk2_widgets[_GTK_VSCROLLBAR_TYPE] = 1559 (*fp_gtk_vscrollbar_new)(create_adjustment()); 1560 } 1561 result = gtk2_widgets[_GTK_VSCROLLBAR_TYPE]; 1562 break; 1563 case VSEPARATOR: 1564 init_result = (NULL == gtk2_widgets[_GTK_VSEPARATOR_TYPE]); 1565 if (init_result) 1566 { 1567 gtk2_widgets[_GTK_VSEPARATOR_TYPE] = 1568 (*fp_gtk_vseparator_new)(); 1569 } 1570 result = gtk2_widgets[_GTK_VSEPARATOR_TYPE]; 1571 break; 1572 case VSLIDER: 1573 case VSLIDER_THUMB: 1574 case VSLIDER_TRACK: 1575 init_result = (NULL == gtk2_widgets[_GTK_VSCALE_TYPE]); 1576 if (init_result) 1577 { 1578 gtk2_widgets[_GTK_VSCALE_TYPE] = 1579 (*fp_gtk_vscale_new)(NULL); 1580 } 1581 result = gtk2_widgets[_GTK_VSCALE_TYPE]; 1582 /* 1583 * Vertical JSliders start at the bottom, while vertical 1584 * GtkVScale widgets start at the top (by default), so to fix 1585 * this we set the "inverted" flag to get the Swing behavior. 1586 */ 1587 ((GtkRange*)result)->inverted = 1; 1588 break; 1589 case VSPLIT_PANE_DIVIDER: 1590 init_result = (NULL == gtk2_widgets[_GTK_VPANED_TYPE]); 1591 if (init_result) 1592 { 1593 gtk2_widgets[_GTK_VPANED_TYPE] = (*fp_gtk_vpaned_new)(); 1594 } 1595 result = gtk2_widgets[_GTK_VPANED_TYPE]; 1596 break; 1597 default: 1598 result = NULL; 1599 break; 1600 } 1601 1602 if (result != NULL && init_result) 1603 { 1604 if (widget_type == RADIO_BUTTON_MENU_ITEM || 1605 widget_type == CHECK_BOX_MENU_ITEM || 1606 widget_type == MENU_ITEM || 1607 widget_type == MENU || 1608 widget_type == POPUP_MENU_SEPARATOR) 1609 { 1610 GtkWidget *menu = gtk2_get_widget(POPUP_MENU); 1611 (*fp_gtk_menu_shell_append)((GtkMenuShell *)menu, result); 2482 } 2483 2484 return result; 2485 } 2486 2487 /***********************************************/ 2488 static jobject get_string_property(JNIEnv *env, GtkSettings* settings, const gchar* key) 2489 { 2490 jobject result = NULL; 2491 gchar* strval = NULL; 2492 2493 (*fp_g_object_get)(settings, key, &strval, NULL); 2494 result = (*env)->NewStringUTF(env, strval); 2495 (*fp_g_free)(strval); 2496 2497 return result; 2498 } 2499 2500 static jobject get_integer_property(JNIEnv *env, GtkSettings* settings, const gchar* key) 2501 { 2502 gint intval = 0; 2503 (*fp_g_object_get)(settings, key, &intval, NULL); 2504 return create_Integer(env, intval); 2505 } 2506 2507 static jobject get_boolean_property(JNIEnv *env, GtkSettings* settings, const gchar* key) 2508 { 2509 gint intval = 0; 2510 (*fp_g_object_get)(settings, key, &intval, NULL); 2511 return create_Boolean(env, intval); 2512 } 2513 2514 static jobject gtk2_get_setting(JNIEnv *env, Setting property) 2515 { 2516 GtkSettings* settings = (*fp_gtk_settings_get_default)(); 2517 2518 switch (property) 2519 { 2520 case GTK_FONT_NAME: 2521 return get_string_property(env, settings, "gtk-font-name"); 2522 case GTK_ICON_SIZES: 2523 return get_string_property(env, settings, "gtk-icon-sizes"); 2524 case GTK_CURSOR_BLINK: 2525 return get_boolean_property(env, settings, "gtk-cursor-blink"); 2526 case GTK_CURSOR_BLINK_TIME: 2527 return get_integer_property(env, settings, "gtk-cursor-blink-time"); 2528 } 2529 |