diff options
| author | Po Lu | 2022-03-22 11:26:46 +0000 |
|---|---|---|
| committer | Po Lu | 2022-03-22 11:27:42 +0000 |
| commit | 8757551da09bdccc0080208bfec7116f4330b3c5 (patch) | |
| tree | c217f7c873a423e50d47115b9876830a8a0696d1 /src | |
| parent | 0094dde11d97a0e69b053851a87f2934ef0e00aa (diff) | |
| download | emacs-8757551da09bdccc0080208bfec7116f4330b3c5.tar.gz emacs-8757551da09bdccc0080208bfec7116f4330b3c5.zip | |
Simplify fullscreen management on Haiku
* src/haiku_support.cc (class EmacsWindow, Zoom, UnZoom): Track
zoom state manually instead of guessing what the system
currently thinks it is.
(MakeFullscreen): Always unzoom first.
* src/haiku_support.h (struct haiku_zoom_event): Remove all
fields and add a single field `zoomed'.
* src/haikufns.c (haiku_create_frame, haiku_create_tip_frame):
Remove use of pending_zoom fields.
* src/haikuterm.c (haiku_read_socket): Simplify handling of zoom
events.
(haiku_fullscreen): Simplify handling of different zoom states.
* src/haikuterm.h (struct haiku_output): Remove all pending_zoom
fields since they are no longer required.
Diffstat (limited to 'src')
| -rw-r--r-- | src/haiku_support.cc | 111 | ||||
| -rw-r--r-- | src/haiku_support.h | 6 | ||||
| -rw-r--r-- | src/haikufns.c | 10 | ||||
| -rw-r--r-- | src/haikuterm.c | 37 | ||||
| -rw-r--r-- | src/haikuterm.h | 5 |
5 files changed, 94 insertions, 75 deletions
diff --git a/src/haiku_support.cc b/src/haiku_support.cc index 5d0385f6d9d..3ded7a80f4d 100644 --- a/src/haiku_support.cc +++ b/src/haiku_support.cc | |||
| @@ -37,6 +37,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 37 | #include <interface/Alert.h> | 37 | #include <interface/Alert.h> |
| 38 | #include <interface/Button.h> | 38 | #include <interface/Button.h> |
| 39 | #include <interface/ControlLook.h> | 39 | #include <interface/ControlLook.h> |
| 40 | #include <interface/Deskbar.h> | ||
| 40 | 41 | ||
| 41 | #include <locale/UnicodeChar.h> | 42 | #include <locale/UnicodeChar.h> |
| 42 | 43 | ||
| @@ -403,9 +404,9 @@ public: | |||
| 403 | BRect pre_zoom_rect; | 404 | BRect pre_zoom_rect; |
| 404 | int x_before_zoom = INT_MIN; | 405 | int x_before_zoom = INT_MIN; |
| 405 | int y_before_zoom = INT_MIN; | 406 | int y_before_zoom = INT_MIN; |
| 406 | int fullscreen_p = 0; | 407 | bool fullscreen_p = false; |
| 407 | int zoomed_p = 0; | 408 | bool zoomed_p = false; |
| 408 | int shown_flag = 0; | 409 | bool shown_flag = false; |
| 409 | volatile int was_shown_p = 0; | 410 | volatile int was_shown_p = 0; |
| 410 | bool menu_bar_active_p = false; | 411 | bool menu_bar_active_p = false; |
| 411 | bool override_redirect_p = false; | 412 | bool override_redirect_p = false; |
| @@ -446,6 +447,77 @@ public: | |||
| 446 | pthread_mutex_destroy (&menu_update_mutex); | 447 | pthread_mutex_destroy (&menu_update_mutex); |
| 447 | } | 448 | } |
| 448 | 449 | ||
| 450 | BRect | ||
| 451 | CalculateZoomRect (void) | ||
| 452 | { | ||
| 453 | BScreen screen (this); | ||
| 454 | BDeskbar deskbar; | ||
| 455 | BRect screen_frame; | ||
| 456 | BRect frame; | ||
| 457 | BRect deskbar_frame; | ||
| 458 | BRect window_frame; | ||
| 459 | BRect decorator_frame; | ||
| 460 | |||
| 461 | if (!screen.IsValid ()) | ||
| 462 | gui_abort ("Failed to calculate screen rect"); | ||
| 463 | |||
| 464 | screen_frame = frame = screen.Frame (); | ||
| 465 | deskbar_frame = deskbar.Frame (); | ||
| 466 | |||
| 467 | if (!(modifiers () & B_SHIFT_KEY) | ||
| 468 | && !deskbar.IsAutoHide ()) | ||
| 469 | { | ||
| 470 | switch (deskbar.Location ()) | ||
| 471 | { | ||
| 472 | case B_DESKBAR_TOP: | ||
| 473 | frame.top = deskbar_frame.bottom + 2; | ||
| 474 | break; | ||
| 475 | |||
| 476 | case B_DESKBAR_BOTTOM: | ||
| 477 | case B_DESKBAR_LEFT_BOTTOM: | ||
| 478 | case B_DESKBAR_RIGHT_BOTTOM: | ||
| 479 | frame.bottom = deskbar_frame.bottom - 2; | ||
| 480 | break; | ||
| 481 | |||
| 482 | case B_DESKBAR_LEFT_TOP: | ||
| 483 | if (deskbar.IsExpanded ()) | ||
| 484 | frame.top = deskbar_frame.bottom + 2; | ||
| 485 | else | ||
| 486 | frame.left = deskbar_frame.right + 2; | ||
| 487 | break; | ||
| 488 | |||
| 489 | default: | ||
| 490 | if (deskbar.IsExpanded () | ||
| 491 | && !deskbar.IsAlwaysOnTop () | ||
| 492 | && !deskbar.IsAutoRaise ()) | ||
| 493 | frame.right = deskbar_frame.left - 2; | ||
| 494 | } | ||
| 495 | } | ||
| 496 | |||
| 497 | window_frame = Frame (); | ||
| 498 | decorator_frame = DecoratorFrame (); | ||
| 499 | |||
| 500 | frame.top += (window_frame.top | ||
| 501 | - decorator_frame.top); | ||
| 502 | frame.bottom -= (decorator_frame.bottom | ||
| 503 | - window_frame.bottom); | ||
| 504 | frame.left += (window_frame.left | ||
| 505 | - decorator_frame.left); | ||
| 506 | frame.right -= (decorator_frame.right | ||
| 507 | - window_frame.right); | ||
| 508 | |||
| 509 | if (frame.top > deskbar_frame.bottom | ||
| 510 | || frame.bottom < deskbar_frame.top) | ||
| 511 | { | ||
| 512 | frame.left = screen_frame.left + (window_frame.left | ||
| 513 | - decorator_frame.left); | ||
| 514 | frame.right = screen_frame.right - (decorator_frame.right | ||
| 515 | - window_frame.left); | ||
| 516 | } | ||
| 517 | |||
| 518 | return frame; | ||
| 519 | } | ||
| 520 | |||
| 449 | void | 521 | void |
| 450 | UpwardsSubset (EmacsWindow *w) | 522 | UpwardsSubset (EmacsWindow *w) |
| 451 | { | 523 | { |
| @@ -989,33 +1061,29 @@ public: | |||
| 989 | Zoom (BPoint o, float w, float h) | 1061 | Zoom (BPoint o, float w, float h) |
| 990 | { | 1062 | { |
| 991 | struct haiku_zoom_event rq; | 1063 | struct haiku_zoom_event rq; |
| 1064 | BRect rect; | ||
| 992 | rq.window = this; | 1065 | rq.window = this; |
| 993 | 1066 | ||
| 994 | rq.x = o.x; | ||
| 995 | rq.y = o.y; | ||
| 996 | |||
| 997 | rq.width = w + 1; | ||
| 998 | rq.height = h + 1; | ||
| 999 | |||
| 1000 | if (fullscreen_p) | 1067 | if (fullscreen_p) |
| 1001 | MakeFullscreen (0); | 1068 | MakeFullscreen (0); |
| 1002 | 1069 | ||
| 1003 | if (o.x != x_before_zoom || | 1070 | if (!zoomed_p) |
| 1004 | o.y != y_before_zoom) | ||
| 1005 | { | 1071 | { |
| 1006 | x_before_zoom = Frame ().left; | ||
| 1007 | y_before_zoom = Frame ().top; | ||
| 1008 | pre_zoom_rect = Frame (); | 1072 | pre_zoom_rect = Frame (); |
| 1009 | zoomed_p = 1; | 1073 | zoomed_p = true; |
| 1010 | haiku_write (ZOOM_EVENT, &rq); | 1074 | rect = CalculateZoomRect (); |
| 1011 | } | 1075 | } |
| 1012 | else | 1076 | else |
| 1013 | { | 1077 | { |
| 1014 | zoomed_p = 0; | 1078 | zoomed_p = false; |
| 1015 | x_before_zoom = y_before_zoom = INT_MIN; | 1079 | rect = pre_zoom_rect; |
| 1016 | } | 1080 | } |
| 1017 | 1081 | ||
| 1018 | BWindow::Zoom (o, w, h); | 1082 | rq.zoomed = zoomed_p; |
| 1083 | haiku_write (ZOOM_EVENT, &rq); | ||
| 1084 | |||
| 1085 | BWindow::Zoom (rect.LeftTop (), BE_RECT_WIDTH (rect) - 1, | ||
| 1086 | BE_RECT_HEIGHT (rect) - 1); | ||
| 1019 | } | 1087 | } |
| 1020 | 1088 | ||
| 1021 | void | 1089 | void |
| @@ -1023,11 +1091,8 @@ public: | |||
| 1023 | { | 1091 | { |
| 1024 | if (!zoomed_p) | 1092 | if (!zoomed_p) |
| 1025 | return; | 1093 | return; |
| 1026 | zoomed_p = 0; | ||
| 1027 | 1094 | ||
| 1028 | EmacsMoveTo (pre_zoom_rect.left, pre_zoom_rect.top); | 1095 | BWindow::Zoom (); |
| 1029 | ResizeTo (BE_RECT_WIDTH (pre_zoom_rect) - 1, | ||
| 1030 | BE_RECT_HEIGHT (pre_zoom_rect) - 1); | ||
| 1031 | } | 1096 | } |
| 1032 | 1097 | ||
| 1033 | void | 1098 | void |
| @@ -1083,6 +1148,8 @@ public: | |||
| 1083 | if (!screen.IsValid ()) | 1148 | if (!screen.IsValid ()) |
| 1084 | gui_abort ("Trying to make a window fullscreen without a screen"); | 1149 | gui_abort ("Trying to make a window fullscreen without a screen"); |
| 1085 | 1150 | ||
| 1151 | UnZoom (); | ||
| 1152 | |||
| 1086 | if (make_fullscreen_p == fullscreen_p) | 1153 | if (make_fullscreen_p == fullscreen_p) |
| 1087 | return; | 1154 | return; |
| 1088 | 1155 | ||
diff --git a/src/haiku_support.h b/src/haiku_support.h index 9c21a80e20d..c978926e735 100644 --- a/src/haiku_support.h +++ b/src/haiku_support.h | |||
| @@ -220,10 +220,8 @@ struct haiku_menu_bar_help_event | |||
| 220 | struct haiku_zoom_event | 220 | struct haiku_zoom_event |
| 221 | { | 221 | { |
| 222 | void *window; | 222 | void *window; |
| 223 | int x; | 223 | |
| 224 | int y; | 224 | bool zoomed; |
| 225 | int width; | ||
| 226 | int height; | ||
| 227 | }; | 225 | }; |
| 228 | 226 | ||
| 229 | #define FSPEC_FAMILY 1 | 227 | #define FSPEC_FAMILY 1 |
diff --git a/src/haikufns.c b/src/haikufns.c index 7bb613af6e2..14d4c870c1f 100644 --- a/src/haikufns.c +++ b/src/haikufns.c | |||
| @@ -631,11 +631,6 @@ haiku_create_frame (Lisp_Object parms) | |||
| 631 | f->output_method = output_haiku; | 631 | f->output_method = output_haiku; |
| 632 | f->output_data.haiku = xzalloc (sizeof *f->output_data.haiku); | 632 | f->output_data.haiku = xzalloc (sizeof *f->output_data.haiku); |
| 633 | 633 | ||
| 634 | f->output_data.haiku->pending_zoom_x = INT_MIN; | ||
| 635 | f->output_data.haiku->pending_zoom_y = INT_MIN; | ||
| 636 | f->output_data.haiku->pending_zoom_width = INT_MIN; | ||
| 637 | f->output_data.haiku->pending_zoom_height = INT_MIN; | ||
| 638 | |||
| 639 | fset_icon_name (f, gui_display_get_arg (dpyinfo, parms, Qicon_name, | 634 | fset_icon_name (f, gui_display_get_arg (dpyinfo, parms, Qicon_name, |
| 640 | "iconName", "Title", | 635 | "iconName", "Title", |
| 641 | RES_TYPE_STRING)); | 636 | RES_TYPE_STRING)); |
| @@ -961,11 +956,6 @@ haiku_create_tip_frame (Lisp_Object parms) | |||
| 961 | f->output_method = output_haiku; | 956 | f->output_method = output_haiku; |
| 962 | f->output_data.haiku = xzalloc (sizeof *f->output_data.haiku); | 957 | f->output_data.haiku = xzalloc (sizeof *f->output_data.haiku); |
| 963 | 958 | ||
| 964 | f->output_data.haiku->pending_zoom_x = INT_MIN; | ||
| 965 | f->output_data.haiku->pending_zoom_y = INT_MIN; | ||
| 966 | f->output_data.haiku->pending_zoom_width = INT_MIN; | ||
| 967 | f->output_data.haiku->pending_zoom_height = INT_MIN; | ||
| 968 | |||
| 969 | f->tooltip = true; | 959 | f->tooltip = true; |
| 970 | fset_icon_name (f, Qnil); | 960 | fset_icon_name (f, Qnil); |
| 971 | FRAME_DISPLAY_INFO (f) = dpyinfo; | 961 | FRAME_DISPLAY_INFO (f) = dpyinfo; |
diff --git a/src/haikuterm.c b/src/haikuterm.c index efaafbfac20..b0bbee9e3bc 100644 --- a/src/haikuterm.c +++ b/src/haikuterm.c | |||
| @@ -2851,19 +2851,6 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit) | |||
| 2851 | cancel_mouse_face (f); | 2851 | cancel_mouse_face (f); |
| 2852 | haiku_clear_under_internal_border (f); | 2852 | haiku_clear_under_internal_border (f); |
| 2853 | } | 2853 | } |
| 2854 | |||
| 2855 | if (FRAME_OUTPUT_DATA (f)->pending_zoom_width != width || | ||
| 2856 | FRAME_OUTPUT_DATA (f)->pending_zoom_height != height) | ||
| 2857 | { | ||
| 2858 | FRAME_OUTPUT_DATA (f)->zoomed_p = 0; | ||
| 2859 | haiku_make_fullscreen_consistent (f); | ||
| 2860 | } | ||
| 2861 | else | ||
| 2862 | { | ||
| 2863 | FRAME_OUTPUT_DATA (f)->zoomed_p = 1; | ||
| 2864 | FRAME_OUTPUT_DATA (f)->pending_zoom_width = INT_MIN; | ||
| 2865 | FRAME_OUTPUT_DATA (f)->pending_zoom_height = INT_MIN; | ||
| 2866 | } | ||
| 2867 | break; | 2854 | break; |
| 2868 | } | 2855 | } |
| 2869 | case FRAME_EXPOSED: | 2856 | case FRAME_EXPOSED: |
| @@ -3249,16 +3236,6 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit) | |||
| 3249 | if (!f) | 3236 | if (!f) |
| 3250 | continue; | 3237 | continue; |
| 3251 | 3238 | ||
| 3252 | if (FRAME_OUTPUT_DATA (f)->pending_zoom_x != b->x || | ||
| 3253 | FRAME_OUTPUT_DATA (f)->pending_zoom_y != b->y) | ||
| 3254 | FRAME_OUTPUT_DATA (f)->zoomed_p = 0; | ||
| 3255 | else | ||
| 3256 | { | ||
| 3257 | FRAME_OUTPUT_DATA (f)->zoomed_p = 1; | ||
| 3258 | FRAME_OUTPUT_DATA (f)->pending_zoom_x = INT_MIN; | ||
| 3259 | FRAME_OUTPUT_DATA (f)->pending_zoom_y = INT_MIN; | ||
| 3260 | } | ||
| 3261 | |||
| 3262 | if (FRAME_PARENT_FRAME (f)) | 3239 | if (FRAME_PARENT_FRAME (f)) |
| 3263 | haiku_coords_from_parent (f, &b->x, &b->y); | 3240 | haiku_coords_from_parent (f, &b->x, &b->y); |
| 3264 | 3241 | ||
| @@ -3570,12 +3547,7 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit) | |||
| 3570 | if (!f) | 3547 | if (!f) |
| 3571 | continue; | 3548 | continue; |
| 3572 | 3549 | ||
| 3573 | FRAME_OUTPUT_DATA (f)->pending_zoom_height = b->height; | 3550 | FRAME_OUTPUT_DATA (f)->zoomed_p = b->zoomed; |
| 3574 | FRAME_OUTPUT_DATA (f)->pending_zoom_width = b->width; | ||
| 3575 | FRAME_OUTPUT_DATA (f)->pending_zoom_x = b->x; | ||
| 3576 | FRAME_OUTPUT_DATA (f)->pending_zoom_y = b->y; | ||
| 3577 | |||
| 3578 | FRAME_OUTPUT_DATA (f)->zoomed_p = 1; | ||
| 3579 | haiku_make_fullscreen_consistent (f); | 3551 | haiku_make_fullscreen_consistent (f); |
| 3580 | break; | 3552 | break; |
| 3581 | } | 3553 | } |
| @@ -3821,13 +3793,10 @@ haiku_fullscreen (struct frame *f) | |||
| 3821 | return; | 3793 | return; |
| 3822 | 3794 | ||
| 3823 | if (f->want_fullscreen == FULLSCREEN_MAXIMIZED) | 3795 | if (f->want_fullscreen == FULLSCREEN_MAXIMIZED) |
| 3824 | { | 3796 | BWindow_zoom (FRAME_HAIKU_WINDOW (f)); |
| 3825 | EmacsWindow_make_fullscreen (FRAME_HAIKU_WINDOW (f), 0); | ||
| 3826 | BWindow_zoom (FRAME_HAIKU_WINDOW (f)); | ||
| 3827 | } | ||
| 3828 | else if (f->want_fullscreen == FULLSCREEN_BOTH) | 3797 | else if (f->want_fullscreen == FULLSCREEN_BOTH) |
| 3829 | EmacsWindow_make_fullscreen (FRAME_HAIKU_WINDOW (f), 1); | 3798 | EmacsWindow_make_fullscreen (FRAME_HAIKU_WINDOW (f), 1); |
| 3830 | else if (f->want_fullscreen == FULLSCREEN_NONE) | 3799 | else |
| 3831 | { | 3800 | { |
| 3832 | EmacsWindow_make_fullscreen (FRAME_HAIKU_WINDOW (f), 0); | 3801 | EmacsWindow_make_fullscreen (FRAME_HAIKU_WINDOW (f), 0); |
| 3833 | EmacsWindow_unzoom (FRAME_HAIKU_WINDOW (f)); | 3802 | EmacsWindow_unzoom (FRAME_HAIKU_WINDOW (f)); |
diff --git a/src/haikuterm.h b/src/haikuterm.h index 65fd51e237c..bce1c627eb2 100644 --- a/src/haikuterm.h +++ b/src/haikuterm.h | |||
| @@ -150,11 +150,6 @@ struct haiku_output | |||
| 150 | int menu_up_to_date_p; | 150 | int menu_up_to_date_p; |
| 151 | int zoomed_p; | 151 | int zoomed_p; |
| 152 | 152 | ||
| 153 | int pending_zoom_x; | ||
| 154 | int pending_zoom_y; | ||
| 155 | int pending_zoom_width; | ||
| 156 | int pending_zoom_height; | ||
| 157 | |||
| 158 | int menu_bar_open_p; | 153 | int menu_bar_open_p; |
| 159 | 154 | ||
| 160 | struct font *font; | 155 | struct font *font; |