#include <interface/Alert.h>
#include <interface/Button.h>
#include <interface/ControlLook.h>
+#include <interface/Deskbar.h>
#include <locale/UnicodeChar.h>
BRect pre_zoom_rect;
int x_before_zoom = INT_MIN;
int y_before_zoom = INT_MIN;
- int fullscreen_p = 0;
- int zoomed_p = 0;
- int shown_flag = 0;
+ bool fullscreen_p = false;
+ bool zoomed_p = false;
+ bool shown_flag = false;
volatile int was_shown_p = 0;
bool menu_bar_active_p = false;
bool override_redirect_p = false;
pthread_mutex_destroy (&menu_update_mutex);
}
+ BRect
+ CalculateZoomRect (void)
+ {
+ BScreen screen (this);
+ BDeskbar deskbar;
+ BRect screen_frame;
+ BRect frame;
+ BRect deskbar_frame;
+ BRect window_frame;
+ BRect decorator_frame;
+
+ if (!screen.IsValid ())
+ gui_abort ("Failed to calculate screen rect");
+
+ screen_frame = frame = screen.Frame ();
+ deskbar_frame = deskbar.Frame ();
+
+ if (!(modifiers () & B_SHIFT_KEY)
+ && !deskbar.IsAutoHide ())
+ {
+ switch (deskbar.Location ())
+ {
+ case B_DESKBAR_TOP:
+ frame.top = deskbar_frame.bottom + 2;
+ break;
+
+ case B_DESKBAR_BOTTOM:
+ case B_DESKBAR_LEFT_BOTTOM:
+ case B_DESKBAR_RIGHT_BOTTOM:
+ frame.bottom = deskbar_frame.bottom - 2;
+ break;
+
+ case B_DESKBAR_LEFT_TOP:
+ if (deskbar.IsExpanded ())
+ frame.top = deskbar_frame.bottom + 2;
+ else
+ frame.left = deskbar_frame.right + 2;
+ break;
+
+ default:
+ if (deskbar.IsExpanded ()
+ && !deskbar.IsAlwaysOnTop ()
+ && !deskbar.IsAutoRaise ())
+ frame.right = deskbar_frame.left - 2;
+ }
+ }
+
+ window_frame = Frame ();
+ decorator_frame = DecoratorFrame ();
+
+ frame.top += (window_frame.top
+ - decorator_frame.top);
+ frame.bottom -= (decorator_frame.bottom
+ - window_frame.bottom);
+ frame.left += (window_frame.left
+ - decorator_frame.left);
+ frame.right -= (decorator_frame.right
+ - window_frame.right);
+
+ if (frame.top > deskbar_frame.bottom
+ || frame.bottom < deskbar_frame.top)
+ {
+ frame.left = screen_frame.left + (window_frame.left
+ - decorator_frame.left);
+ frame.right = screen_frame.right - (decorator_frame.right
+ - window_frame.left);
+ }
+
+ return frame;
+ }
+
void
UpwardsSubset (EmacsWindow *w)
{
Zoom (BPoint o, float w, float h)
{
struct haiku_zoom_event rq;
+ BRect rect;
rq.window = this;
- rq.x = o.x;
- rq.y = o.y;
-
- rq.width = w + 1;
- rq.height = h + 1;
-
if (fullscreen_p)
MakeFullscreen (0);
- if (o.x != x_before_zoom ||
- o.y != y_before_zoom)
+ if (!zoomed_p)
{
- x_before_zoom = Frame ().left;
- y_before_zoom = Frame ().top;
pre_zoom_rect = Frame ();
- zoomed_p = 1;
- haiku_write (ZOOM_EVENT, &rq);
+ zoomed_p = true;
+ rect = CalculateZoomRect ();
}
else
{
- zoomed_p = 0;
- x_before_zoom = y_before_zoom = INT_MIN;
+ zoomed_p = false;
+ rect = pre_zoom_rect;
}
- BWindow::Zoom (o, w, h);
+ rq.zoomed = zoomed_p;
+ haiku_write (ZOOM_EVENT, &rq);
+
+ BWindow::Zoom (rect.LeftTop (), BE_RECT_WIDTH (rect) - 1,
+ BE_RECT_HEIGHT (rect) - 1);
}
void
{
if (!zoomed_p)
return;
- zoomed_p = 0;
- EmacsMoveTo (pre_zoom_rect.left, pre_zoom_rect.top);
- ResizeTo (BE_RECT_WIDTH (pre_zoom_rect) - 1,
- BE_RECT_HEIGHT (pre_zoom_rect) - 1);
+ BWindow::Zoom ();
}
void
if (!screen.IsValid ())
gui_abort ("Trying to make a window fullscreen without a screen");
+ UnZoom ();
+
if (make_fullscreen_p == fullscreen_p)
return;
f->output_method = output_haiku;
f->output_data.haiku = xzalloc (sizeof *f->output_data.haiku);
- f->output_data.haiku->pending_zoom_x = INT_MIN;
- f->output_data.haiku->pending_zoom_y = INT_MIN;
- f->output_data.haiku->pending_zoom_width = INT_MIN;
- f->output_data.haiku->pending_zoom_height = INT_MIN;
-
fset_icon_name (f, gui_display_get_arg (dpyinfo, parms, Qicon_name,
"iconName", "Title",
RES_TYPE_STRING));
f->output_method = output_haiku;
f->output_data.haiku = xzalloc (sizeof *f->output_data.haiku);
- f->output_data.haiku->pending_zoom_x = INT_MIN;
- f->output_data.haiku->pending_zoom_y = INT_MIN;
- f->output_data.haiku->pending_zoom_width = INT_MIN;
- f->output_data.haiku->pending_zoom_height = INT_MIN;
-
f->tooltip = true;
fset_icon_name (f, Qnil);
FRAME_DISPLAY_INFO (f) = dpyinfo;
cancel_mouse_face (f);
haiku_clear_under_internal_border (f);
}
-
- if (FRAME_OUTPUT_DATA (f)->pending_zoom_width != width ||
- FRAME_OUTPUT_DATA (f)->pending_zoom_height != height)
- {
- FRAME_OUTPUT_DATA (f)->zoomed_p = 0;
- haiku_make_fullscreen_consistent (f);
- }
- else
- {
- FRAME_OUTPUT_DATA (f)->zoomed_p = 1;
- FRAME_OUTPUT_DATA (f)->pending_zoom_width = INT_MIN;
- FRAME_OUTPUT_DATA (f)->pending_zoom_height = INT_MIN;
- }
break;
}
case FRAME_EXPOSED:
if (!f)
continue;
- if (FRAME_OUTPUT_DATA (f)->pending_zoom_x != b->x ||
- FRAME_OUTPUT_DATA (f)->pending_zoom_y != b->y)
- FRAME_OUTPUT_DATA (f)->zoomed_p = 0;
- else
- {
- FRAME_OUTPUT_DATA (f)->zoomed_p = 1;
- FRAME_OUTPUT_DATA (f)->pending_zoom_x = INT_MIN;
- FRAME_OUTPUT_DATA (f)->pending_zoom_y = INT_MIN;
- }
-
if (FRAME_PARENT_FRAME (f))
haiku_coords_from_parent (f, &b->x, &b->y);
if (!f)
continue;
- FRAME_OUTPUT_DATA (f)->pending_zoom_height = b->height;
- FRAME_OUTPUT_DATA (f)->pending_zoom_width = b->width;
- FRAME_OUTPUT_DATA (f)->pending_zoom_x = b->x;
- FRAME_OUTPUT_DATA (f)->pending_zoom_y = b->y;
-
- FRAME_OUTPUT_DATA (f)->zoomed_p = 1;
+ FRAME_OUTPUT_DATA (f)->zoomed_p = b->zoomed;
haiku_make_fullscreen_consistent (f);
break;
}
return;
if (f->want_fullscreen == FULLSCREEN_MAXIMIZED)
- {
- EmacsWindow_make_fullscreen (FRAME_HAIKU_WINDOW (f), 0);
- BWindow_zoom (FRAME_HAIKU_WINDOW (f));
- }
+ BWindow_zoom (FRAME_HAIKU_WINDOW (f));
else if (f->want_fullscreen == FULLSCREEN_BOTH)
EmacsWindow_make_fullscreen (FRAME_HAIKU_WINDOW (f), 1);
- else if (f->want_fullscreen == FULLSCREEN_NONE)
+ else
{
EmacsWindow_make_fullscreen (FRAME_HAIKU_WINDOW (f), 0);
EmacsWindow_unzoom (FRAME_HAIKU_WINDOW (f));