< prev index next >

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

Print this page




 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 


< prev index next >