testhittesting.c (4074B)
1#include <stdio.h> 2#include "SDL.h" 3 4/* !!! FIXME: rewrite this to be wired in to test framework. */ 5 6#define RESIZE_BORDER 20 7 8const SDL_Rect drag_areas[] = { 9 { 20, 20, 100, 100 }, 10 { 200, 70, 100, 100 }, 11 { 400, 90, 100, 100 } 12}; 13 14static const SDL_Rect *areas = drag_areas; 15static int numareas = SDL_arraysize(drag_areas); 16 17static SDL_HitTestResult 18hitTest(SDL_Window *window, const SDL_Point *pt, void *data) 19{ 20 int i; 21 int w, h; 22 23 for (i = 0; i < numareas; i++) { 24 if (SDL_PointInRect(pt, &areas[i])) { 25 SDL_Log("HIT-TEST: DRAGGABLE\n"); 26 return SDL_HITTEST_DRAGGABLE; 27 } 28 } 29 30 SDL_GetWindowSize(window, &w, &h); 31 32 #define REPORT_RESIZE_HIT(name) { \ 33 SDL_Log("HIT-TEST: RESIZE_" #name "\n"); \ 34 return SDL_HITTEST_RESIZE_##name; \ 35 } 36 37 if (pt->x < RESIZE_BORDER && pt->y < RESIZE_BORDER) { 38 REPORT_RESIZE_HIT(TOPLEFT); 39 } else if (pt->x > RESIZE_BORDER && pt->x < w - RESIZE_BORDER && pt->y < RESIZE_BORDER) { 40 REPORT_RESIZE_HIT(TOP); 41 } else if (pt->x > w - RESIZE_BORDER && pt->y < RESIZE_BORDER) { 42 REPORT_RESIZE_HIT(TOPRIGHT); 43 } else if (pt->x > w - RESIZE_BORDER && pt->y > RESIZE_BORDER && pt->y < h - RESIZE_BORDER) { 44 REPORT_RESIZE_HIT(RIGHT); 45 } else if (pt->x > w - RESIZE_BORDER && pt->y > h - RESIZE_BORDER) { 46 REPORT_RESIZE_HIT(BOTTOMRIGHT); 47 } else if (pt->x < w - RESIZE_BORDER && pt->x > RESIZE_BORDER && pt->y > h - RESIZE_BORDER) { 48 REPORT_RESIZE_HIT(BOTTOM); 49 } else if (pt->x < RESIZE_BORDER && pt->y > h - RESIZE_BORDER) { 50 REPORT_RESIZE_HIT(BOTTOMLEFT); 51 } else if (pt->x < RESIZE_BORDER && pt->y < h - RESIZE_BORDER && pt->y > RESIZE_BORDER) { 52 REPORT_RESIZE_HIT(LEFT); 53 } 54 55 SDL_Log("HIT-TEST: NORMAL\n"); 56 return SDL_HITTEST_NORMAL; 57} 58 59 60int main(int argc, char **argv) 61{ 62 int done = 0; 63 SDL_Window *window; 64 SDL_Renderer *renderer; 65 66 /* !!! FIXME: check for errors. */ 67 SDL_Init(SDL_INIT_VIDEO); 68 window = SDL_CreateWindow("Drag the red boxes", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_BORDERLESS | SDL_WINDOW_RESIZABLE); 69 renderer = SDL_CreateRenderer(window, -1, 0); 70 71 if (SDL_SetWindowHitTest(window, hitTest, NULL) == -1) { 72 SDL_Log("Enabling hit-testing failed!\n"); 73 SDL_Quit(); 74 return 1; 75 } 76 77 while (!done) 78 { 79 SDL_Event e; 80 int nothing_to_do = 1; 81 82 SDL_SetRenderDrawColor(renderer, 0, 0, 127, 255); 83 SDL_RenderClear(renderer); 84 SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); 85 SDL_RenderFillRects(renderer, areas, SDL_arraysize(drag_areas)); 86 SDL_RenderPresent(renderer); 87 88 while (SDL_PollEvent(&e)) { 89 nothing_to_do = 0; 90 91 switch (e.type) 92 { 93 case SDL_MOUSEBUTTONDOWN: 94 SDL_Log("button down!\n"); 95 break; 96 97 case SDL_MOUSEBUTTONUP: 98 SDL_Log("button up!\n"); 99 break; 100 101 case SDL_WINDOWEVENT: 102 if (e.window.event == SDL_WINDOWEVENT_MOVED) { 103 SDL_Log("Window event moved to (%d, %d)!\n", (int) e.window.data1, (int) e.window.data2); 104 } 105 break; 106 107 case SDL_KEYDOWN: 108 if (e.key.keysym.sym == SDLK_ESCAPE) { 109 done = 1; 110 } else if (e.key.keysym.sym == SDLK_x) { 111 if (!areas) { 112 areas = drag_areas; 113 numareas = SDL_arraysize(drag_areas); 114 } else { 115 areas = NULL; 116 numareas = 0; 117 } 118 } 119 break; 120 121 case SDL_QUIT: 122 done = 1; 123 break; 124 } 125 } 126 127 if (nothing_to_do) { 128 SDL_Delay(50); 129 } 130 } 131 132 SDL_Quit(); 133 return 0; 134}