Relative vs Global Mouse Coordinates

What's the difference between relative and global mouse coordinates? When should I use each?

SDL provides two main ways to get mouse coordinates through SDL_GetMouseState() and SDL_GetGlobalMouseState(). The key difference lies in their frame of reference and typical use cases.

Relative Coordinates

Relative coordinates are reported by SDL_GetMouseState() and are measured relative to the top-left corner of your window. These coordinates start at (0,0) at your window's top-left corner and increase as you move right and down. They're most useful when you need to:

  • Handle mouse interactions within your window's UI elements
  • Implement window-specific features like buttons or drag handles
  • Calculate if the mouse is within specific regions of your window

Here's an example showing how to use relative coordinates:

#include <SDL.h>
#include <iostream>

int main(int argc, char** argv) {
  SDL_Init(SDL_INIT_VIDEO);
  SDL_Window* window =
    SDL_CreateWindow("Relative Coordinates",
                     SDL_WINDOWPOS_CENTERED,
                     SDL_WINDOWPOS_CENTERED,
                     800, 600,
                     SDL_WINDOW_SHOWN);

  bool running = true;
  while (running) {
    SDL_Event event;
    while (SDL_PollEvent(&event)) {
      if (event.type == SDL_QUIT) {
        running = false;
      }
    }

    int x, y;
    SDL_GetMouseState(&x, &y); 

    // Check if mouse is in top-left quadrant
    if (x < 400 && y < 300) {
      std::cout <<
        "Mouse in top-left quadrant at "
        << x << "," << y << "\n";
    }
  }

  SDL_DestroyWindow(window);
  SDL_Quit();
  return 0;
}

Global Coordinates

Global coordinates are reported by SDL_GetGlobalMouseState() and are measured relative to the top-left corner of the primary display. These coordinates can be negative in multi-monitor setups. They're most useful when you need to:

  • Track mouse movement across multiple windows
  • Implement drag-and-drop between windows
  • Handle multi-monitor scenarios
  • Position windows relative to the mouse cursor

Here's an example demonstrating global coordinates:

#include <SDL.h>
#include <iostream>

int main(int argc, char** argv) {
  SDL_Init(SDL_INIT_VIDEO);

  // Create two windows side by side
  SDL_Window* window1 =
    SDL_CreateWindow("Window 1", 100, 100, 400,
                     300, SDL_WINDOW_SHOWN);
  SDL_Window* window2 =
    SDL_CreateWindow("Window 2", 550, 100, 400,
                     300, SDL_WINDOW_SHOWN);

  bool running = true;
  while (running) {
    SDL_Event event;
    while (SDL_PollEvent(&event)) {
      if (event.type == SDL_QUIT) {
        running = false;
      }
    }

    int globalX, globalY;
    SDL_GetGlobalMouseState(&globalX, &globalY);

    std::cout << "Mouse at global position: "
      << globalX << "," << globalY << "\n";
  }

  SDL_DestroyWindow(window1);
  SDL_DestroyWindow(window2);
  SDL_Quit();
  return 0;
}

When choosing between relative and global coordinates, consider your specific needs:

  • Use relative coordinates when working within a single window
  • Use global coordinates when dealing with multi-window or multi-monitor scenarios
  • Consider using both if you need to implement features like drag-and-drop between windows

Mouse Capture and Global Mouse State

Learn how to track mouse movements and button states across your entire application, even when the mouse leaves your window.

Questions & Answers

Answers are generated by AI models and may not have been reviewed. Be mindful when running any code on your device.

Mouse Capture and Focus Loss
Why does mouse capture get disabled when my window loses focus? How can I prevent this?
Selective Mouse Button Auto-Capture
Is there a way to disable auto-capture for specific mouse buttons but keep it for others?
Out-of-Window Selection Rectangle
How can I implement a selection rectangle that works even if the user drags outside the window?
Or Ask your Own Question
Get an immediate answer to your specific question using our AI assistant