@@ -166,9 +166,80 @@ std::shared_ptr<Window> WindowManager::GetCurrent() {
166166}
167167
168168std::shared_ptr<Window> WindowManager::Create (const WindowOptions& options) {
169- // TODO: Implement Linux window creation using GTK
170- // For now, return nullptr as this is a stub implementation
171- return nullptr ;
169+ // Check if GTK is available
170+ GdkDisplay* display = gdk_display_get_default ();
171+ if (!display) {
172+ std::cerr << " No display available for window creation" << std::endl;
173+ return nullptr ;
174+ }
175+
176+ // Create a new GTK window
177+ GtkWidget* gtk_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
178+ if (!gtk_window) {
179+ std::cerr << " Failed to create GTK window" << std::endl;
180+ return nullptr ;
181+ }
182+
183+ // Set window properties from options
184+ if (!options.title .empty ()) {
185+ gtk_window_set_title (GTK_WINDOW (gtk_window), options.title .c_str ());
186+ }
187+
188+ // Set window size
189+ if (options.size .width > 0 && options.size .height > 0 ) {
190+ gtk_window_set_default_size (GTK_WINDOW (gtk_window),
191+ options.size .width ,
192+ options.size .height );
193+ }
194+
195+ // Set minimum size if specified
196+ if (options.minimum_size .width > 0 && options.minimum_size .height > 0 ) {
197+ GdkGeometry geometry;
198+ geometry.min_width = options.minimum_size .width ;
199+ geometry.min_height = options.minimum_size .height ;
200+ gtk_window_set_geometry_hints (GTK_WINDOW (gtk_window), nullptr , &geometry, GDK_HINT_MIN_SIZE);
201+ }
202+
203+ // Set maximum size if specified
204+ if (options.maximum_size .width > 0 && options.maximum_size .height > 0 ) {
205+ GdkGeometry geometry;
206+ geometry.max_width = options.maximum_size .width ;
207+ geometry.max_height = options.maximum_size .height ;
208+ gtk_window_set_geometry_hints (GTK_WINDOW (gtk_window), nullptr , &geometry, GDK_HINT_MAX_SIZE);
209+ }
210+
211+ // Center the window if requested
212+ if (options.centered ) {
213+ gtk_window_set_position (GTK_WINDOW (gtk_window), GTK_WIN_POS_CENTER);
214+ }
215+
216+ // Show the window
217+ gtk_widget_show (gtk_window);
218+
219+ // Get the GdkWindow after the widget is realized
220+ GdkWindow* gdk_window = gtk_widget_get_window (gtk_window);
221+ if (!gdk_window) {
222+ // If window is not yet realized, realize it first
223+ gtk_widget_realize (gtk_window);
224+ gdk_window = gtk_widget_get_window (gtk_window);
225+ }
226+
227+ if (!gdk_window) {
228+ std::cerr << " Failed to get GdkWindow from GTK widget" << std::endl;
229+ gtk_widget_destroy (gtk_window);
230+ return nullptr ;
231+ }
232+
233+ // Create our Window wrapper
234+ auto window = std::make_shared<Window>((void *)gdk_window);
235+ WindowID window_id = (WindowID)gdk_window;
236+
237+ // Store in our cache
238+ windows_[window_id] = window;
239+
240+ std::cout << " Created window with ID: " << window_id << std::endl;
241+
242+ return window;
172243}
173244
174245bool WindowManager::Destroy (WindowID id) {
0 commit comments