#include #include #include #include #include #include int main(int argc, char **argv) { std::cout << "Hello working!" << std::endl; glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); glfwWindowHint(GLFW_DECORATED, GLFW_FALSE); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // make the window GLFWwindow *window = glfwCreateWindow(640, 480, "OpenGL Demo", NULL, NULL); if (!window) { std::cout << "Failed to create GLFW window." << std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); // d // load graphics if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cerr << "Failed to initialize OpenGL loader!" << std::endl; return -1; } glViewport(0, 0, 640, 480); // d // now make ImGui IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO &io = ImGui::GetIO(); (void)io; io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; ImGui::StyleColorsDark(); ImGui_ImplGlfw_InitForOpenGL(window, true); ImGui_ImplOpenGL3_Init("#version 130"); /// im a dumbass /// // program while (!glfwWindowShouldClose(window)) { ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); static bool dragging_window = false; static double drag_start_global_x, drag_start_global_y; static int drag_start_window_x, drag_start_window_y; glClearColor(1.0f, .5f, .2f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glfwPollEvents(); if (ImGui::BeginMainMenuBar()) { // --- DRAG LOGIC FIRST --- bool is_hovered = ImGui::IsWindowHovered(); bool is_clicked = ImGui::IsMouseClicked(0); bool is_held = ImGui::IsMouseDown(0); // Get current window position int window_x, window_y; glfwGetWindowPos(window, &window_x, &window_y); // Get current mouse position relative to window double local_mouse_x, local_mouse_y; glfwGetCursorPos(window, &local_mouse_x, &local_mouse_y); // Convert to global mouse position double global_mouse_x = window_x + local_mouse_x; double global_mouse_y = window_y + local_mouse_y; // ✅ Only start dragging if not over any ImGui menu item if (is_hovered && is_clicked && !ImGui::IsAnyItemHovered()) { dragging_window = true; drag_start_global_x = global_mouse_x; drag_start_global_y = global_mouse_y; drag_start_window_x = window_x; drag_start_window_y = window_y; } static bool is_maximized = false; static int restore_x, restore_y, restore_w, restore_h; if (dragging_window) { if (is_held) { double dx = global_mouse_x - drag_start_global_x; double dy = global_mouse_y - drag_start_global_y; int new_x = drag_start_window_x + static_cast(dx); int new_y = drag_start_window_y + static_cast(dy); glfwSetWindowPos(window, new_x, new_y); GLFWmonitor* primaryMonitor = glfwGetPrimaryMonitor(); int monitor_x, monitor_y, monitor_w, monitor_h; if (glfwGetMonitorWorkarea) { glfwGetMonitorWorkarea(primaryMonitor, &monitor_x, &monitor_y, &monitor_w, &monitor_h); } const int tolerance = 2; if (!is_maximized && abs(new_y - monitor_y) <= tolerance) { glfwGetWindowPos(window, &restore_x, &restore_y); glfwGetWindowSize(window, &restore_w, &restore_h); glfwSetWindowPos(window, monitor_x, monitor_y); glfwSetWindowSize(window, monitor_w, monitor_h); is_maximized = true; dragging_window = false; } } else { dragging_window = false; } if (!dragging_window && is_maximized) { double mx, my; glfwGetCursorPos(window, &mx, &my); if (ImGui::IsMouseDown(0) && my < 10.0) { // Start unmaximize drag is_maximized = false; glfwSetWindowSize(window, restore_w, restore_h); glfwSetWindowPos(window, static_cast(global_mouse_x - restore_w / 2), static_cast(global_mouse_y - 10)); dragging_window = true; drag_start_global_x = global_mouse_x; drag_start_global_y = global_mouse_y; drag_start_window_x = static_cast(global_mouse_x - restore_w / 2); drag_start_window_y = static_cast(global_mouse_y - 10); } } } // --- MENU ITEMS ALWAYS RENDERED --- if (ImGui::BeginMenu("File")) { if (ImGui::MenuItem("Quit")) { glfwSetWindowShouldClose(window, true); } ImGui::EndMenu(); } float window_widthA = ImGui::GetWindowWidth(); ImVec2 size = ImGui::CalcTextSize("x"); float button_width = size.x + ImGui::GetStyle().FramePadding.x * 2; ImGui::SameLine(window_widthA - button_width - ImGui::GetStyle().ItemSpacing.x); if (ImGui::Button("x")) { std::cout << "Exiting..." << std::endl; glfwSetWindowShouldClose(window, true); } ImGui::EndMainMenuBar(); } GLFWmonitor* primaryMonitor = glfwGetPrimaryMonitor(); int monitor_x, monitor_y, monitor_width, monitor_height; if (glfwGetMonitorWorkarea) { glfwGetMonitorWorkarea(primaryMonitor, &monitor_x, &monitor_y, &monitor_width, &monitor_height); } else { // Fallback const GLFWvidmode* mode = glfwGetVideoMode(primaryMonitor); glfwGetMonitorPos(primaryMonitor, &monitor_x, &monitor_y); monitor_width = mode->width; monitor_height = mode->height; } int win_x, win_y; glfwGetWindowPos(window, &win_x, &win_y); const int tolerance = 5; if (abs(win_y - monitor_y) <= tolerance) { std::cout << "Window is at the top of the main screen!" << std::endl; } ImGui::Begin("Editor"); ImGui::Text("Hello from editor"); ImGui::End(); ImGui::Render(); ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); glfwSwapBuffers(window); } glfwDestroyWindow(window); glfwTerminate(); return 0; }