aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPo Lu2022-03-22 11:26:46 +0000
committerPo Lu2022-03-22 11:27:42 +0000
commit8757551da09bdccc0080208bfec7116f4330b3c5 (patch)
treec217f7c873a423e50d47115b9876830a8a0696d1 /src
parent0094dde11d97a0e69b053851a87f2934ef0e00aa (diff)
downloademacs-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.cc111
-rw-r--r--src/haiku_support.h6
-rw-r--r--src/haikufns.c10
-rw-r--r--src/haikuterm.c37
-rw-r--r--src/haikuterm.h5
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
220struct haiku_zoom_event 220struct 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;