src/video/SDL_video.c
changeset 1956 ba0d62354872
parent 1952 420716272158
child 1963 2590b68531ef
equal deleted inserted replaced
1955:8c6106e45fc1 1956:ba0d62354872
   612 
   612 
   613     /* Move any fullscreen windows into position */
   613     /* Move any fullscreen windows into position */
   614     for (i = 0; i < display->num_windows; ++i) {
   614     for (i = 0; i < display->num_windows; ++i) {
   615         SDL_Window *window = &display->windows[i];
   615         SDL_Window *window = &display->windows[i];
   616         if (FULLSCREEN_VISIBLE(window)) {
   616         if (FULLSCREEN_VISIBLE(window)) {
   617             SDL_SetWindowPosition(window->id,
   617             SDL_SetWindowPosition(window->id, SDL_WINDOWPOS_CENTERED,
   618                                   ((display_mode.w - window->w) / 2),
   618                                   SDL_WINDOWPOS_CENTERED);
   619                                   ((display_mode.h - window->h) / 2));
       
   620         }
   619         }
   621     }
   620     }
   622 
   621 
   623     return 0;
   622     return 0;
   624 }
   623 }
   716 SDL_WindowID
   715 SDL_WindowID
   717 SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags)
   716 SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags)
   718 {
   717 {
   719     const Uint32 allowed_flags = (SDL_WINDOW_FULLSCREEN |
   718     const Uint32 allowed_flags = (SDL_WINDOW_FULLSCREEN |
   720                                   SDL_WINDOW_OPENGL |
   719                                   SDL_WINDOW_OPENGL |
   721                                   SDL_WINDOW_SHOWN |
       
   722                                   SDL_WINDOW_BORDERLESS |
   720                                   SDL_WINDOW_BORDERLESS |
   723                                   SDL_WINDOW_RESIZABLE |
   721                                   SDL_WINDOW_RESIZABLE);
   724                                   SDL_WINDOW_MAXIMIZED |
       
   725                                   SDL_WINDOW_MINIMIZED |
       
   726                                   SDL_WINDOW_INPUT_GRABBED);
       
   727     SDL_VideoDisplay *display;
   722     SDL_VideoDisplay *display;
   728     SDL_Window window;
   723     SDL_Window window;
   729     int num_windows;
   724     int num_windows;
   730     SDL_Window *windows;
   725     SDL_Window *windows;
   731 
   726 
   737     if ((flags & SDL_WINDOW_OPENGL) && !_this->GL_CreateContext) {
   732     if ((flags & SDL_WINDOW_OPENGL) && !_this->GL_CreateContext) {
   738         SDL_SetError("No OpenGL support in video driver");
   733         SDL_SetError("No OpenGL support in video driver");
   739         return 0;
   734         return 0;
   740     }
   735     }
   741 
   736 
       
   737     /* Fullscreen windows don't have any window decorations */
       
   738     if (flags & SDL_WINDOW_FULLSCREEN) {
       
   739         flags |= SDL_WINDOW_BORDERLESS;
       
   740         flags &= ~SDL_WINDOW_RESIZABLE;
       
   741     }
       
   742 
   742     SDL_zero(window);
   743     SDL_zero(window);
   743     window.id = _this->next_object_id++;
   744     window.id = _this->next_object_id++;
   744     window.title = title ? SDL_strdup(title) : NULL;
       
   745     window.x = x;
   745     window.x = x;
   746     window.y = y;
   746     window.y = y;
   747     window.w = w;
   747     window.w = w;
   748     window.h = h;
   748     window.h = h;
   749     window.flags = (flags & allowed_flags);
   749     window.flags = (flags & allowed_flags);
   750     window.display = _this->current_display;
   750     window.display = _this->current_display;
   751 
   751 
   752     if (_this->CreateWindow && _this->CreateWindow(_this, &window) < 0) {
   752     if (_this->CreateWindow && _this->CreateWindow(_this, &window) < 0) {
   753         if (window.title) {
       
   754             SDL_free(window.title);
       
   755         }
       
   756         return 0;
   753         return 0;
   757     }
   754     }
   758 
   755 
   759     display = &SDL_CurrentDisplay;
   756     display = &SDL_CurrentDisplay;
   760     num_windows = display->num_windows;
   757     num_windows = display->num_windows;
   762         SDL_realloc(display->windows, (num_windows + 1) * sizeof(*windows));
   759         SDL_realloc(display->windows, (num_windows + 1) * sizeof(*windows));
   763     if (!windows) {
   760     if (!windows) {
   764         if (_this->DestroyWindow) {
   761         if (_this->DestroyWindow) {
   765             _this->DestroyWindow(_this, &window);
   762             _this->DestroyWindow(_this, &window);
   766         }
   763         }
   767         if (window.title) {
       
   768             SDL_free(window.title);
       
   769         }
       
   770         return 0;
   764         return 0;
   771     }
   765     }
   772     windows[num_windows] = window;
   766     windows[num_windows] = window;
   773     display->windows = windows;
   767     display->windows = windows;
   774     display->num_windows++;
   768     display->num_windows++;
   775 
   769 
   776     if (FULLSCREEN_VISIBLE(&window)) {
   770     if (title) {
   777         /* Hide any other fullscreen windows */
   771         SDL_SetWindowTitle(window.id, title);
   778         int i;
   772     }
   779         for (i = 0; i < display->num_windows; ++i) {
   773     if (flags & SDL_WINDOW_MAXIMIZED) {
   780             SDL_Window *other = &display->windows[i];
   774         SDL_MaximizeWindow(window.id);
   781             if (other->id != window.id && FULLSCREEN_VISIBLE(other)) {
   775     }
   782                 SDL_MinimizeWindow(other->id);
   776     if (flags & SDL_WINDOW_MINIMIZED) {
   783             }
   777         SDL_MinimizeWindow(window.id);
   784         }
   778     }
   785         SDL_SetDisplayMode(display->fullscreen_mode);
   779     if (flags & SDL_WINDOW_SHOWN) {
   786     }
   780         SDL_ShowWindow(window.id);
   787 
   781     }
       
   782     if (flags & SDL_WINDOW_INPUT_GRABBED) {
       
   783         SDL_SetWindowGrab(window.id, 1);
       
   784     }
   788     return window.id;
   785     return window.id;
   789 }
   786 }
   790 
   787 
   791 SDL_WindowID
   788 SDL_WindowID
   792 SDL_CreateWindowFrom(const void *data)
   789 SDL_CreateWindowFrom(const void *data)
   831 }
   828 }
   832 
   829 
   833 int
   830 int
   834 SDL_RecreateWindow(SDL_Window * window, Uint32 flags)
   831 SDL_RecreateWindow(SDL_Window * window, Uint32 flags)
   835 {
   832 {
       
   833     char *title = window->title;
       
   834 
   836     if ((flags & SDL_WINDOW_OPENGL) && !_this->GL_CreateContext) {
   835     if ((flags & SDL_WINDOW_OPENGL) && !_this->GL_CreateContext) {
   837         SDL_SetError("No OpenGL support in video driver");
   836         SDL_SetError("No OpenGL support in video driver");
   838         return -1;
   837         return -1;
   839     }
   838     }
       
   839 
   840     if (_this->DestroyWindow) {
   840     if (_this->DestroyWindow) {
   841         _this->DestroyWindow(_this, window);
   841         _this->DestroyWindow(_this, window);
   842     }
   842     }
   843     window->flags = flags;
   843 
   844     return _this->CreateWindow(_this, window);
   844     window->title = NULL;
       
   845     window->flags =
       
   846         (flags &
       
   847          ~(SDL_WINDOW_MAXIMIZED | SDL_WINDOW_MINIMIZED | SDL_WINDOW_SHOWN |
       
   848            SDL_WINDOW_INPUT_GRABBED));
       
   849 
       
   850     if (_this->CreateWindow && _this->CreateWindow(_this, window) < 0) {
       
   851         return -1;
       
   852     }
       
   853 
       
   854     if (title) {
       
   855         SDL_SetWindowTitle(window->id, title);
       
   856         SDL_free(title);
       
   857     }
       
   858     if (flags & SDL_WINDOW_MAXIMIZED) {
       
   859         SDL_MaximizeWindow(window->id);
       
   860     }
       
   861     if (flags & SDL_WINDOW_MINIMIZED) {
       
   862         SDL_MinimizeWindow(window->id);
       
   863     }
       
   864     if (flags & SDL_WINDOW_SHOWN) {
       
   865         SDL_ShowWindow(window->id);
       
   866     }
       
   867     if (flags & SDL_WINDOW_INPUT_GRABBED) {
       
   868         SDL_SetWindowGrab(window->id, 1);
       
   869     }
       
   870     return 0;
   845 }
   871 }
   846 
   872 
   847 SDL_Window *
   873 SDL_Window *
   848 SDL_GetWindowFromID(SDL_WindowID windowID)
   874 SDL_GetWindowFromID(SDL_WindowID windowID)
   849 {
   875 {
   871 {
   897 {
   872     if (!_this) {
   898     if (!_this) {
   873         SDL_UninitializedVideo();
   899         SDL_UninitializedVideo();
   874         return NULL;
   900         return NULL;
   875     }
   901     }
       
   902     if (!window) {
       
   903         return NULL;
       
   904     }
   876     return &_this->displays[window->display];
   905     return &_this->displays[window->display];
   877 }
   906 }
   878 
   907 
   879 Uint32
   908 Uint32
   880 SDL_GetWindowFlags(SDL_WindowID windowID)
   909 SDL_GetWindowFlags(SDL_WindowID windowID)
   889 
   918 
   890 void
   919 void
   891 SDL_SetWindowTitle(SDL_WindowID windowID, const char *title)
   920 SDL_SetWindowTitle(SDL_WindowID windowID, const char *title)
   892 {
   921 {
   893     SDL_Window *window = SDL_GetWindowFromID(windowID);
   922     SDL_Window *window = SDL_GetWindowFromID(windowID);
   894 
   923     const char *last_title;
   895     if (!window) {
   924 
   896         return;
   925     if (!window || title == window->title) {
   897     }
   926         return;
       
   927     }
       
   928 
   898     if (window->title) {
   929     if (window->title) {
   899         SDL_free(window->title);
   930         SDL_free(window->title);
   900     }
   931     }
   901     window->title = SDL_strdup(title);
   932     if (title) {
       
   933         window->title = SDL_strdup(title);
       
   934     } else {
       
   935         window->title = NULL;
       
   936     }
   902 
   937 
   903     if (_this->SetWindowTitle) {
   938     if (_this->SetWindowTitle) {
   904         _this->SetWindowTitle(_this, window);
   939         _this->SetWindowTitle(_this, window);
   905     }
   940     }
   906 }
   941 }
   940 
   975 
   941 void
   976 void
   942 SDL_SetWindowPosition(SDL_WindowID windowID, int x, int y)
   977 SDL_SetWindowPosition(SDL_WindowID windowID, int x, int y)
   943 {
   978 {
   944     SDL_Window *window = SDL_GetWindowFromID(windowID);
   979     SDL_Window *window = SDL_GetWindowFromID(windowID);
       
   980     SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
   945 
   981 
   946     if (!window) {
   982     if (!window) {
   947         return;
   983         return;
   948     }
   984     }
   949 
   985 
   950     if (x != SDL_WINDOWPOS_UNDEFINED) {
   986     if (x == SDL_WINDOWPOS_CENTERED) {
       
   987         window->x = (display->current_mode.w - window->w) / 2;
       
   988     } else if (x != SDL_WINDOWPOS_UNDEFINED) {
   951         window->x = x;
   989         window->x = x;
   952     }
   990     }
   953     if (y != SDL_WINDOWPOS_UNDEFINED) {
   991     if (y == SDL_WINDOWPOS_CENTERED) {
       
   992         window->y = (display->current_mode.h - window->h) / 2;
       
   993     } else if (y != SDL_WINDOWPOS_UNDEFINED) {
   954         window->y = y;
   994         window->y = y;
   955     }
   995     }
   956 
   996 
   957     if (_this->SetWindowPosition) {
   997     if (_this->SetWindowPosition) {
   958         _this->SetWindowPosition(_this, window);
   998         _this->SetWindowPosition(_this, window);
  1043 void
  1083 void
  1044 SDL_RaiseWindow(SDL_WindowID windowID)
  1084 SDL_RaiseWindow(SDL_WindowID windowID)
  1045 {
  1085 {
  1046     SDL_Window *window = SDL_GetWindowFromID(windowID);
  1086     SDL_Window *window = SDL_GetWindowFromID(windowID);
  1047 
  1087 
  1048     if (!window) {
  1088     if (!window || !(window->flags & SDL_WINDOW_SHOWN)) {
  1049         return;
  1089         return;
  1050     }
  1090     }
  1051 
  1091 
  1052     if (_this->RaiseWindow) {
  1092     if (_this->RaiseWindow) {
  1053         _this->RaiseWindow(_this, window);
  1093         _this->RaiseWindow(_this, window);