663 }
664
665 gtk_widget_destroy(gtk_widget);
666 }
667
668 ////////////////////////////// WindowContextTop /////////////////////////////////
669
670
671 WindowContextTop::WindowContextTop(jobject _jwindow, WindowContext* _owner, long _screen,
672 WindowFrameType _frame_type, WindowType type, GdkWMFunction wmf) :
673 WindowContextBase(),
674 screen(_screen),
675 frame_type(_frame_type),
676 owner(_owner),
677 geometry(),
678 resizable(),
679 frame_extents_initialized(),
680 map_received(false),
681 location_assigned(false),
682 size_assigned(false),
683 on_top(false)
684 {
685 jwindow = mainEnv->NewGlobalRef(_jwindow);
686
687 gtk_widget = gtk_window_new(type == POPUP ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL);
688
689 if (gchar* app_name = get_application_name()) {
690 gtk_window_set_wmclass(GTK_WINDOW(gtk_widget), app_name, app_name);
691 g_free(app_name);
692 }
693
694 if (owner) {
695 owner->add_child(this);
696 if (on_top_inherited()) {
697 gtk_window_set_keep_above(GTK_WINDOW(gtk_widget), TRUE);
698 }
699 }
700
701 if (type == UTILITY) {
702 gtk_window_set_type_hint(GTK_WINDOW(gtk_widget), GDK_WINDOW_TYPE_HINT_UTILITY);
703 }
965 gdk_window_get_geometry(gdk_window, NULL, NULL, &w, &h, NULL);
966 #endif
967 x = frame.x;
968 y = frame.y;
969 geometry.current_width = frame.width;
970 geometry.current_height = frame.height;
971
972 top = contentY - frame.y;
973 left = contentX - frame.x;
974 bottom = frame.y + frame.height - (contentY + h);
975 right = frame.x + frame.width - (contentX + w);
976 if (geometry.extents.top != top
977 || geometry.extents.left != left
978 || geometry.extents.bottom != bottom
979 || geometry.extents.right != right) {
980 updateWindowConstraints = true;
981 geometry.extents.top = top;
982 geometry.extents.left = left;
983 geometry.extents.bottom = bottom;
984 geometry.extents.right = right;
985 }
986 } else {
987 x = event->x;
988 y = event->y;
989 w = event->width;
990 h = event->height;
991 }
992
993 if (size_assigned && w <= 1 && h <= 1 && (geometry.final_width.value > 1 ||
994 geometry.final_height.value > 1)) {
995 // skip artifact
996 return;
997 }
998
999 geometry.final_width.value = w;
1000 geometry.final_width.type = BOUNDSTYPE_CONTENT;
1001 geometry.final_height.value = h;
1002 geometry.final_height.type = BOUNDSTYPE_CONTENT;
1003 geometry_set_window_x(&geometry, x);
1004 geometry_set_window_y(&geometry, y);
1092 } else {
1093 //Since window is not ready yet set only request for change of resizable.
1094 resizable.request = res ? REQUEST_RESIZABLE : REQUEST_NOT_RESIZABLE;
1095 }
1096 }
1097
1098 void WindowContextTop::set_visible(bool visible)
1099 {
1100 if (visible) {
1101 if (!size_assigned) {
1102 set_bounds(0, 0, false, false, 320, 200, -1, -1);
1103 }
1104 if (!location_assigned) {
1105 set_bounds(0, 0, true, true, -1, -1, -1, -1);
1106 }
1107 }
1108 WindowContextBase::set_visible(visible);
1109 }
1110
1111 void WindowContextTop::set_bounds(int x, int y, bool xSet, bool ySet, int w, int h, int cw, int ch) {
1112 if (!frame_extents_initialized && frame_type == TITLED) {
1113 initialize_frame_extents();
1114 frame_extents_initialized = true;
1115 }
1116
1117 XWindowChanges windowChanges;
1118 unsigned int windowChangesMask = 0;
1119 if (w > 0) {
1120 geometry.final_width.value = w;
1121 geometry.final_width.type = BOUNDSTYPE_WINDOW;
1122 geometry.current_width = geometry_get_window_width(&geometry);
1123 windowChanges.width = geometry_get_content_width(&geometry);
1124 windowChangesMask |= CWWidth;
1125 } else if (cw > 0) {
1126 geometry.final_width.value = cw;
1127 geometry.final_width.type = BOUNDSTYPE_CONTENT;
1128 geometry.current_width = geometry_get_window_width(&geometry);
1129 windowChanges.width = geometry_get_content_width(&geometry);
1130 windowChangesMask |= CWWidth;
1131 }
1132
1133 if (h > 0) {
1134 geometry.final_height.value = h;
1135 geometry.final_height.type = BOUNDSTYPE_WINDOW;
|
663 }
664
665 gtk_widget_destroy(gtk_widget);
666 }
667
668 ////////////////////////////// WindowContextTop /////////////////////////////////
669
670
671 WindowContextTop::WindowContextTop(jobject _jwindow, WindowContext* _owner, long _screen,
672 WindowFrameType _frame_type, WindowType type, GdkWMFunction wmf) :
673 WindowContextBase(),
674 screen(_screen),
675 frame_type(_frame_type),
676 owner(_owner),
677 geometry(),
678 resizable(),
679 frame_extents_initialized(),
680 map_received(false),
681 location_assigned(false),
682 size_assigned(false),
683 on_top(false),
684 requested_bounds()
685 {
686 jwindow = mainEnv->NewGlobalRef(_jwindow);
687
688 gtk_widget = gtk_window_new(type == POPUP ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL);
689
690 if (gchar* app_name = get_application_name()) {
691 gtk_window_set_wmclass(GTK_WINDOW(gtk_widget), app_name, app_name);
692 g_free(app_name);
693 }
694
695 if (owner) {
696 owner->add_child(this);
697 if (on_top_inherited()) {
698 gtk_window_set_keep_above(GTK_WINDOW(gtk_widget), TRUE);
699 }
700 }
701
702 if (type == UTILITY) {
703 gtk_window_set_type_hint(GTK_WINDOW(gtk_widget), GDK_WINDOW_TYPE_HINT_UTILITY);
704 }
966 gdk_window_get_geometry(gdk_window, NULL, NULL, &w, &h, NULL);
967 #endif
968 x = frame.x;
969 y = frame.y;
970 geometry.current_width = frame.width;
971 geometry.current_height = frame.height;
972
973 top = contentY - frame.y;
974 left = contentX - frame.x;
975 bottom = frame.y + frame.height - (contentY + h);
976 right = frame.x + frame.width - (contentX + w);
977 if (geometry.extents.top != top
978 || geometry.extents.left != left
979 || geometry.extents.bottom != bottom
980 || geometry.extents.right != right) {
981 updateWindowConstraints = true;
982 geometry.extents.top = top;
983 geometry.extents.left = left;
984 geometry.extents.bottom = bottom;
985 geometry.extents.right = right;
986 if (!frame_extents_initialized && !is_null_extents()) {
987 set_bounds(0, 0, false, false,
988 requested_bounds.width, requested_bounds.height,
989 requested_bounds.client_width, requested_bounds.client_height
990 );
991 frame_extents_initialized = true;
992 }
993 }
994 } else {
995 x = event->x;
996 y = event->y;
997 w = event->width;
998 h = event->height;
999 }
1000
1001 if (size_assigned && w <= 1 && h <= 1 && (geometry.final_width.value > 1 ||
1002 geometry.final_height.value > 1)) {
1003 // skip artifact
1004 return;
1005 }
1006
1007 geometry.final_width.value = w;
1008 geometry.final_width.type = BOUNDSTYPE_CONTENT;
1009 geometry.final_height.value = h;
1010 geometry.final_height.type = BOUNDSTYPE_CONTENT;
1011 geometry_set_window_x(&geometry, x);
1012 geometry_set_window_y(&geometry, y);
1100 } else {
1101 //Since window is not ready yet set only request for change of resizable.
1102 resizable.request = res ? REQUEST_RESIZABLE : REQUEST_NOT_RESIZABLE;
1103 }
1104 }
1105
1106 void WindowContextTop::set_visible(bool visible)
1107 {
1108 if (visible) {
1109 if (!size_assigned) {
1110 set_bounds(0, 0, false, false, 320, 200, -1, -1);
1111 }
1112 if (!location_assigned) {
1113 set_bounds(0, 0, true, true, -1, -1, -1, -1);
1114 }
1115 }
1116 WindowContextBase::set_visible(visible);
1117 }
1118
1119 void WindowContextTop::set_bounds(int x, int y, bool xSet, bool ySet, int w, int h, int cw, int ch) {
1120 requested_bounds.width = w;
1121 requested_bounds.height = h;
1122 requested_bounds.client_width = cw;
1123 requested_bounds.client_height = ch;
1124
1125 if (!frame_extents_initialized && frame_type == TITLED) {
1126 initialize_frame_extents();
1127 if (!is_null_extents()) {
1128 frame_extents_initialized = true;
1129 }
1130 }
1131
1132 XWindowChanges windowChanges;
1133 unsigned int windowChangesMask = 0;
1134 if (w > 0) {
1135 geometry.final_width.value = w;
1136 geometry.final_width.type = BOUNDSTYPE_WINDOW;
1137 geometry.current_width = geometry_get_window_width(&geometry);
1138 windowChanges.width = geometry_get_content_width(&geometry);
1139 windowChangesMask |= CWWidth;
1140 } else if (cw > 0) {
1141 geometry.final_width.value = cw;
1142 geometry.final_width.type = BOUNDSTYPE_CONTENT;
1143 geometry.current_width = geometry_get_window_width(&geometry);
1144 windowChanges.width = geometry_get_content_width(&geometry);
1145 windowChangesMask |= CWWidth;
1146 }
1147
1148 if (h > 0) {
1149 geometry.final_height.value = h;
1150 geometry.final_height.type = BOUNDSTYPE_WINDOW;
|