diff options
| author | Victor Kareh <[email protected]> | 2018-03-21 15:52:13 -0400 | 
|---|---|---|
| committer | raveit65 <[email protected]> | 2018-03-22 11:37:10 +0100 | 
| commit | f6e3326a361afcbdec9aeff018b786bf4e346fea (patch) | |
| tree | 35afd277cf21e4c1c37cd5685926bcb06dbccc6b /src | |
| parent | 3c2f9856d82f42a42732e1c813ac2ff339077ea6 (diff) | |
| download | marco-f6e3326a361afcbdec9aeff018b786bf4e346fea.tar.bz2 marco-f6e3326a361afcbdec9aeff018b786bf4e346fea.tar.xz  | |
Support HiDPI window decorations
Diffstat (limited to 'src')
| -rw-r--r-- | src/ui/frames.c | 99 | ||||
| -rw-r--r-- | src/ui/menu.c | 6 | ||||
| -rw-r--r-- | src/ui/tabpopup.c | 28 | ||||
| -rw-r--r-- | src/ui/tile-preview.c | 7 | ||||
| -rw-r--r-- | src/ui/ui.c | 5 | 
5 files changed, 96 insertions, 49 deletions
diff --git a/src/ui/frames.c b/src/ui/frames.c index 2cee5192..9e67bfc4 100644 --- a/src/ui/frames.c +++ b/src/ui/frames.c @@ -524,11 +524,13 @@ meta_frames_calc_geometry (MetaFrames        *frames,                             MetaUIFrame       *frame,                             MetaFrameGeometry *fgeom)  { -  int width, height; +  int width, height, scale;    MetaFrameFlags flags;    MetaFrameType type;    MetaButtonLayout button_layout; +  scale = gdk_window_get_scale_factor (frame->window); +    meta_core_get (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), frame->xwindow,                   META_CORE_GET_CLIENT_WIDTH, &width,                   META_CORE_GET_CLIENT_HEIGHT, &height, @@ -544,9 +546,14 @@ meta_frames_calc_geometry (MetaFrames        *frames,                              type,                              frame->text_height,                              flags, -                            width, height, +                            width / scale, height / scale,                              &button_layout,                              fgeom); + +  fgeom->top_height *= scale; +  fgeom->bottom_height *= scale; +  fgeom->left_width *= scale; +  fgeom->right_width *= scale;  }  MetaFrames* @@ -695,8 +702,10 @@ meta_frames_get_geometry (MetaFrames *frames,    MetaFrameFlags flags;    MetaUIFrame *frame;    MetaFrameType type; +  gint scale;    frame = meta_frames_lookup_window (frames, xwindow); +  scale = gdk_window_get_scale_factor (frame->window);    if (frame == NULL)      meta_bug ("No such frame 0x%lx\n", xwindow); @@ -721,6 +730,12 @@ meta_frames_get_geometry (MetaFrames *frames,                                  flags,                                  top_height, bottom_height,                                  left_width, right_width); + +  /* Scale frame geometry to ensure proper frame position */ +  *top_height *= scale; +  *bottom_height *= scale; +  *left_width *= scale; +  *right_width *= scale;  }  void @@ -783,6 +798,7 @@ meta_frames_apply_shapes (MetaFrames *frames,    XRectangle xrect;    Region corners_xregion;    Region window_xregion; +  gint scale;    frame = meta_frames_lookup_window (frames, xwindow);    g_return_if_fail (frame != NULL); @@ -816,10 +832,11 @@ meta_frames_apply_shapes (MetaFrames *frames,      }    corners_xregion = XCreateRegion (); +  scale = gdk_window_get_scale_factor (frame->window);    if (fgeom.top_left_corner_rounded_radius != 0)      { -      const int corner = fgeom.top_left_corner_rounded_radius; +      const int corner = fgeom.top_left_corner_rounded_radius * scale;        const float radius = sqrt(corner) + corner;        int i; @@ -837,7 +854,7 @@ meta_frames_apply_shapes (MetaFrames *frames,    if (fgeom.top_right_corner_rounded_radius != 0)      { -      const int corner = fgeom.top_right_corner_rounded_radius; +      const int corner = fgeom.top_right_corner_rounded_radius * scale;        const float radius = sqrt(corner) + corner;        int i; @@ -855,7 +872,7 @@ meta_frames_apply_shapes (MetaFrames *frames,    if (fgeom.bottom_left_corner_rounded_radius != 0)      { -      const int corner = fgeom.bottom_left_corner_rounded_radius; +      const int corner = fgeom.bottom_left_corner_rounded_radius * scale;        const float radius = sqrt(corner) + corner;        int i; @@ -873,7 +890,7 @@ meta_frames_apply_shapes (MetaFrames *frames,    if (fgeom.bottom_right_corner_rounded_radius != 0)      { -      const int corner = fgeom.bottom_right_corner_rounded_radius; +      const int corner = fgeom.bottom_right_corner_rounded_radius * scale;        const float radius = sqrt(corner) + corner;        int i; @@ -1006,11 +1023,14 @@ meta_frames_move_resize_frame (MetaFrames *frames,  {    MetaUIFrame *frame = meta_frames_lookup_window (frames, xwindow);    int old_width, old_height; +  gint scale;    old_width = gdk_window_get_width (frame->window);    old_height = gdk_window_get_height (frame->window); -  gdk_window_move_resize (frame->window, x, y, width, height); +  scale = gdk_window_get_scale_factor (gdk_get_default_root_window ()); + +  gdk_window_move_resize (frame->window, x / scale, y / scale, width / scale, height / scale);    if (old_width != width || old_height != height)      invalidate_whole_window (frames, frame); @@ -1153,15 +1173,16 @@ show_tip_now (MetaFrames *frames)      {        MetaFrameGeometry fgeom;        GdkRectangle *rect; -      int dx, dy; +      int dx, dy, scale;        meta_frames_calc_geometry (frames, frame, &fgeom);        rect = control_rect (control, &fgeom); +      scale = gdk_window_get_scale_factor (frame->window);        /* get conversion delta for root-to-frame coords */ -      dx = root_x - x; -      dy = root_y - y; +      dx = (root_x - x) / scale; +      dy = (root_y - y) / scale;        /* Align the tooltip to the button right end if RTL */        if (meta_ui_get_direction() == META_UI_DIRECTION_RTL) @@ -1920,10 +1941,13 @@ meta_frames_motion_notify_event     (GtkWidget           *widget,      case META_GRAB_OP_CLICKING_UNSTICK:        {          MetaFrameControl control; -        int x, y; +        int x, y, scale;          gdk_window_get_device_position (frame->window, event->device,                                          &x, &y, NULL); +        scale = gdk_window_get_scale_factor (frame->window); +        x *= scale; +        y *= scale;          /* Control is set to none unless it matches           * the current grab @@ -1966,10 +1990,13 @@ meta_frames_motion_notify_event     (GtkWidget           *widget,      case META_GRAB_OP_NONE:        {          MetaFrameControl control; -        int x, y; +        int x, y, scale;          gdk_window_get_device_position (frame->window, event->device,                                          &x, &y, NULL); +        scale = gdk_window_get_scale_factor (frame->window); +        x *= scale; +        y *= scale;          control = get_control (frames, frame, x, y); @@ -2063,6 +2090,7 @@ populate_cache (MetaFrames *frames,    int top, bottom, left, right;    int width, height;    int frame_width, frame_height, screen_width, screen_height; +  gint scale;    CachedPixels *pixels;    MetaFrameType frame_type;    MetaFrameFlags frame_flags; @@ -2093,28 +2121,29 @@ populate_cache (MetaFrames *frames,                                  &top, &bottom, &left, &right);    pixels = get_cache (frames, frame); +  scale = gdk_window_get_scale_factor (frame->window);    /* Setup the rectangles for the four frame borders. First top, then       left, right and bottom. */    pixels->piece[0].rect.x = 0;    pixels->piece[0].rect.y = 0; -  pixels->piece[0].rect.width = left + width + right; -  pixels->piece[0].rect.height = top; +  pixels->piece[0].rect.width = (left + width + right) * scale; +  pixels->piece[0].rect.height = top * scale;    pixels->piece[1].rect.x = 0; -  pixels->piece[1].rect.y = top; -  pixels->piece[1].rect.width = left; -  pixels->piece[1].rect.height = height; +  pixels->piece[1].rect.y = top / scale; +  pixels->piece[1].rect.width = left * scale; +  pixels->piece[1].rect.height = height * scale; -  pixels->piece[2].rect.x = left + width; -  pixels->piece[2].rect.y = top; -  pixels->piece[2].rect.width = right; -  pixels->piece[2].rect.height = height; +  pixels->piece[2].rect.x = (left + width) / scale; +  pixels->piece[2].rect.y = top / scale; +  pixels->piece[2].rect.width = right * scale; +  pixels->piece[2].rect.height = height * scale;    pixels->piece[3].rect.x = 0; -  pixels->piece[3].rect.y = top + height; -  pixels->piece[3].rect.width = left + width + right; -  pixels->piece[3].rect.height = bottom; +  pixels->piece[3].rect.y = (top + height) / scale; +  pixels->piece[3].rect.width = (left + width + right) * scale; +  pixels->piece[3].rect.height = bottom * scale;    for (i = 0; i < 4; i++)      { @@ -2196,8 +2225,10 @@ subtract_client_area (cairo_region_t *region, MetaUIFrame *frame)    MetaFrameType type;    cairo_region_t *tmp_region;    Display *display; +  gint scale;    display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); +  scale = gdk_window_get_scale_factor (frame->window);    meta_core_get (display, frame->xwindow,                   META_CORE_GET_FRAME_FLAGS, &flags, @@ -2205,10 +2236,16 @@ subtract_client_area (cairo_region_t *region, MetaUIFrame *frame)                   META_CORE_GET_CLIENT_WIDTH, &area.width,                   META_CORE_GET_CLIENT_HEIGHT, &area.height,                   META_CORE_GET_END); +    meta_theme_get_frame_borders (meta_theme_get_current (),                           type, frame->text_height, flags,                           &area.x, NULL, &area.y, NULL); +  area.width /= scale; +  area.height /= scale; +  area.x /= scale; +  area.y /= scale; +    tmp_region = cairo_region_create_rectangle (&area);    cairo_region_subtract (region, tmp_region);    cairo_region_destroy (tmp_region); @@ -2295,7 +2332,7 @@ meta_frames_paint_to_drawable (MetaFrames   *frames,    MetaFrameType type;    GdkPixbuf *mini_icon;    GdkPixbuf *icon; -  int w, h; +  int w, h, scale;    MetaButtonState button_states[META_BUTTON_TYPE_LAST];    Window grab_frame;    int i; @@ -2398,12 +2435,13 @@ meta_frames_paint_to_drawable (MetaFrames   *frames,    meta_prefs_get_button_layout (&button_layout); +  scale = gdk_window_get_scale_factor (frame->window);    meta_theme_draw_frame_with_style (meta_theme_get_current (),                                      frame->style,                                      cr,                                      type,                                      flags, -                                    w, h, +                                    w / scale, h / scale,                                      frame->layout,                                      frame->text_height,                                      &button_layout, @@ -2576,9 +2614,14 @@ get_control (MetaFrames *frames,    MetaFrameFlags flags;    gboolean has_vert, has_horiz;    GdkRectangle client; +  gint scale;    meta_frames_calc_geometry (frames, frame, &fgeom); +  scale = gdk_window_get_scale_factor (frame->window); +  x /= scale; +  y /= scale; +    client.x = fgeom.left_width;    client.y = fgeom.top_height;    client.width = fgeom.width - fgeom.left_width - fgeom.right_width; @@ -2605,7 +2648,7 @@ get_control (MetaFrames *frames,    if (POINT_IN_RECT (x, y, fgeom.title_rect))      { -      if (has_vert && y <= TOP_RESIZE_HEIGHT) +      if (has_vert && y <= TOP_RESIZE_HEIGHT * scale)          return META_FRAME_CONTROL_RESIZE_N;        else          return META_FRAME_CONTROL_TITLE; @@ -2698,7 +2741,7 @@ get_control (MetaFrames *frames,        if (has_vert)          return META_FRAME_CONTROL_RESIZE_S;      } -  else if (y <= TOP_RESIZE_HEIGHT) +  else if (y <= TOP_RESIZE_HEIGHT * scale)      {        if (has_vert)          return META_FRAME_CONTROL_RESIZE_N; diff --git a/src/ui/menu.c b/src/ui/menu.c index 1bea9232..aeba64fa 100644 --- a/src/ui/menu.c +++ b/src/ui/menu.c @@ -490,11 +490,13 @@ meta_window_menu_new   (MetaFrames         *frames,  void meta_window_menu_popup(MetaWindowMenu* menu, int root_x, int root_y, int button, guint32 timestamp)  {  	GdkPoint* pt = g_new(GdkPoint, 1); +	gint scale;  	g_object_set_data_full(G_OBJECT(menu->menu), "destroy-point", pt, g_free); -	pt->x = root_x; -	pt->y = root_y; +	scale = gtk_widget_get_scale_factor (menu->menu); +	pt->x = root_x / scale; +	pt->y = root_y / scale;  	gtk_menu_popup(GTK_MENU (menu->menu), NULL, NULL, popup_position_func, pt, button, timestamp); diff --git a/src/ui/tabpopup.c b/src/ui/tabpopup.c index f3d14240..933f6cb0 100644 --- a/src/ui/tabpopup.c +++ b/src/ui/tabpopup.c @@ -148,8 +148,8 @@ dimm_icon (GdkPixbuf *pixbuf)  static TabEntry*  tab_entry_new (const MetaTabEntry *entry, -               gint                screen_width, -               gboolean            outline) +               gboolean            outline, +               gint                scale)  {    TabEntry *te; @@ -200,15 +200,15 @@ tab_entry_new (const MetaTabEntry *entry,    if (outline)      { -      te->rect.x = entry->rect.x; -      te->rect.y = entry->rect.y; -      te->rect.width = entry->rect.width; -      te->rect.height = entry->rect.height; - -      te->inner_rect.x = entry->inner_rect.x; -      te->inner_rect.y = entry->inner_rect.y; -      te->inner_rect.width = entry->inner_rect.width; -      te->inner_rect.height = entry->inner_rect.height; +      te->rect.x = entry->rect.x / scale; +      te->rect.y = entry->rect.y / scale; +      te->rect.width = entry->rect.width / scale; +      te->rect.height = entry->rect.height / scale; + +      te->inner_rect.x = entry->inner_rect.x / scale; +      te->inner_rect.y = entry->inner_rect.y / scale; +      te->inner_rect.width = entry->inner_rect.width / scale; +      te->inner_rect.height = entry->inner_rect.height / scale;      }    return te;  } @@ -229,7 +229,7 @@ meta_ui_tab_popup_new (const MetaTabEntry *entries,    int max_label_width; /* the actual max width of the labels we create */    AtkObject *obj;    GdkScreen *screen; -  int screen_width; +  int screen_width, scale;    popup = g_new (MetaTabPopup, 1); @@ -260,11 +260,11 @@ meta_ui_tab_popup_new (const MetaTabEntry *entries,    popup->current_selected_entry = NULL;    popup->border = border; +  scale = gtk_widget_get_scale_factor (GTK_WIDGET (popup->window));    screen_width = WidthOfScreen (gdk_x11_screen_get_xscreen (screen));    for (i = 0; i < entry_count; ++i)      { -      TabEntry* new_entry = tab_entry_new (&entries[i], screen_width, -        border & BORDER_OUTLINE_WINDOW); +      TabEntry* new_entry = tab_entry_new (&entries[i], border & BORDER_OUTLINE_WINDOW, scale);        popup->entries = g_list_prepend (popup->entries, new_entry);      } diff --git a/src/ui/tile-preview.c b/src/ui/tile-preview.c index d99529ff..f98713b4 100644 --- a/src/ui/tile-preview.c +++ b/src/ui/tile-preview.c @@ -175,6 +175,13 @@ meta_tile_preview_show (MetaTilePreview *preview,  {    GdkWindow *window;    GdkRectangle old_rect; +  gint scale; + +  scale = gtk_widget_get_scale_factor (preview->preview_window); +  tile_rect->x /= scale; +  tile_rect->y /= scale; +  tile_rect->width /= scale; +  tile_rect->height /= scale;    if (gtk_widget_get_visible (preview->preview_window)        && preview->tile_rect.x == tile_rect->x diff --git a/src/ui/ui.c b/src/ui/ui.c index c8b7e93e..5cb03a88 100644 --- a/src/ui/ui.c +++ b/src/ui/ui.c @@ -62,11 +62,6 @@ void meta_ui_init(int* argc, char*** argv)  	{  		meta_fatal ("Unable to open X display %s\n", XDisplayName (NULL));  	} - -  /* We need to be able to fully trust that the window and monitor sizes -   * that GDK reports corresponds to the X ones, so we disable the automatic -   * scale handling */ -  gdk_x11_display_set_window_scale (gdk_display_get_default (), 1);  }  Display* meta_ui_get_display(void)  | 
