void xfwmPixmapCreate (ScreenInfo * screen_info, xfwmPixmap * pm, gint width, gint height) { TRACE ("entering xfwmPixmapCreate, width=%i, height=%i", width, height); g_return_if_fail (screen_info != NULL); if ((width < 1) || (height < 1)) { xfwmPixmapInit (screen_info, pm); } else { pm->screen_info = screen_info; pm->pixmap = XCreatePixmap (myScreenGetXDisplay (screen_info), screen_info->xroot, width, height, screen_info->depth); pm->mask = XCreatePixmap (myScreenGetXDisplay (screen_info), pm->pixmap, width, height, 1); pm->width = width; pm->height = height; #ifdef HAVE_RENDER pm->pict_format = XRenderFindVisualFormat (myScreenGetXDisplay (screen_info), screen_info->visual); pm->pict = None; #endif } }
gboolean xfwmPixmapLoad (ScreenInfo * screen_info, xfwmPixmap * pm, const gchar * dir, const gchar * file, xfwmColorSymbol * cs) { gchar *filename; gchar *filexpm; GdkPixbuf *pixbuf; TRACE ("entering xfwmPixmapLoad"); g_return_val_if_fail (pm != NULL, FALSE); g_return_val_if_fail (dir != NULL, FALSE); g_return_val_if_fail (file != NULL, FALSE); xfwmPixmapInit (screen_info, pm); /* * Always try to load the XPM first, using our own routine * that supports XPM color symbol susbstitution (used to * apply the gtk+ colors to the pixmaps). */ filexpm = g_strdup_printf ("%s.%s", file, "xpm"); filename = g_build_filename (dir, filexpm, NULL); g_free (filexpm); pixbuf = xpm_image_load (filename, cs); g_free (filename); /* Compose with other image formats, if any available. */ pixbuf = xfwmPixmapCompose (pixbuf, dir, file); if (!pixbuf) { /* * Cannot find a suitable image format for some part, * it's not critical though as most themes are missing * buttons */ return FALSE; } xfwmPixmapCreate (screen_info, pm, gdk_pixbuf_get_width (pixbuf), gdk_pixbuf_get_height (pixbuf)); xfwmPixmapDrawFromGdkPixbuf (pm, pixbuf); #ifdef HAVE_RENDER xfwmPixmapRefreshPict (pm); #endif g_object_unref (pixbuf); return TRUE; }
ScreenInfo * myScreenInit (DisplayInfo *display_info, GdkScreen *gscr, unsigned long event_mask, gboolean replace_wm) { #ifdef ENABLE_KDE_SYSTRAY_PROXY gchar selection[32]; #endif ScreenInfo *screen_info; GdkWindow *event_win; PangoLayout *layout; long desktop_visible; int i, j; g_return_val_if_fail (display_info, NULL); g_return_val_if_fail (GDK_IS_SCREEN (gscr), NULL); TRACE ("entering myScreenInit"); screen_info = g_new0 (ScreenInfo, 1); screen_info->params = g_new0 (XfwmParams, 1); screen_info->display_info = display_info; screen_info->gscr = gscr; desktop_visible = 0; layout = NULL; /* Create a GTK window so that we are just like any other GTK application */ screen_info->gtk_win = gtk_window_new (GTK_WINDOW_POPUP); gtk_window_set_screen (GTK_WINDOW (screen_info->gtk_win), gscr); gtk_window_resize (GTK_WINDOW (screen_info->gtk_win), 5, 5); gtk_window_move (GTK_WINDOW (screen_info->gtk_win), -1000, -1000); gtk_widget_set_name (screen_info->gtk_win, "xfwm"); gtk_widget_show_now (screen_info->gtk_win); /* * The first time the first Gtk application on a display uses pango, * pango grabs the XServer while it creates the font cache window. * Therefore, force the cache window to be created now instead of * trying to do it while we have another grab and deadlocking the server. */ layout = gtk_widget_create_pango_layout (screen_info->gtk_win, "-"); pango_layout_get_pixel_extents (layout, NULL, NULL); g_object_unref (G_OBJECT (layout)); screen_info->xscreen = gdk_x11_screen_get_xscreen (gscr); screen_info->xroot = (Window) GDK_DRAWABLE_XID(gdk_screen_get_root_window (gscr)); screen_info->screen = gdk_screen_get_number (gscr); screen_info->cmap = GDK_COLORMAP_XCOLORMAP(gdk_screen_get_rgb_colormap (gscr)); screen_info->depth = DefaultDepth (display_info->dpy, screen_info->screen); screen_info->visual = DefaultVisual (display_info->dpy, screen_info->screen); screen_info->shape_win = (Window) None; myScreenComputeSize (screen_info); screen_info->xfwm4_win = GDK_WINDOW_XWINDOW (screen_info->gtk_win->window); if (!myScreenSetWMAtom (screen_info, replace_wm)) { gtk_widget_destroy (screen_info->gtk_win); g_free (screen_info); return NULL; } event_win = eventFilterAddWin (gscr, event_mask); if (!event_win) { gtk_widget_destroy (screen_info->gtk_win); g_free (screen_info); return NULL; } gdk_window_set_user_data (event_win, screen_info->gtk_win); screen_info->current_ws = 0; screen_info->previous_ws = 0; screen_info->current_ws = 0; screen_info->previous_ws = 0; screen_info->margins[STRUTS_TOP] = screen_info->gnome_margins[STRUTS_TOP] = 0; screen_info->margins[STRUTS_LEFT] = screen_info->gnome_margins[STRUTS_LEFT] = 0; screen_info->margins[STRUTS_RIGHT] = screen_info->gnome_margins[STRUTS_RIGHT] = 0; screen_info->margins[STRUTS_BOTTOM] = screen_info->gnome_margins[STRUTS_BOTTOM] = 0; screen_info->workspace_count = 0; screen_info->workspace_names = NULL; screen_info->workspace_names_items = 0; screen_info->windows_stack = NULL; screen_info->last_raise = NULL; screen_info->windows = NULL; screen_info->clients = NULL; screen_info->client_count = 0; screen_info->client_serial = 0L; screen_info->button_handler_id = 0L; screen_info->key_grabs = 0; screen_info->pointer_grabs = 0; getHint (display_info, screen_info->xroot, NET_SHOWING_DESKTOP, &desktop_visible); screen_info->show_desktop = (desktop_visible != 0); /* Create the side windows to detect edge movement */ /*left*/ xfwmWindowTemp (screen_info, NULL, 0, screen_info->xroot, &screen_info->sidewalk[0], 0, 0, 1, screen_info->height, EnterWindowMask, TRUE); /*right*/ xfwmWindowTemp (screen_info, NULL, 0, screen_info->xroot, &screen_info->sidewalk[1], screen_info->width - 1, 0, 1, screen_info->height, EnterWindowMask, TRUE); /*top*/ xfwmWindowTemp (screen_info, NULL, 0, screen_info->xroot, &screen_info->sidewalk[2], 0, 0, screen_info->width, 1, EnterWindowMask, TRUE); /*bottom*/ xfwmWindowTemp (screen_info, NULL, 0, screen_info->xroot, &screen_info->sidewalk[3], 0, screen_info->height - 1, screen_info->width, 1, EnterWindowMask, TRUE); #ifdef ENABLE_KDE_SYSTRAY_PROXY g_snprintf (selection, sizeof (selection), "_NET_SYSTEM_TRAY_S%d", screen_info->screen); screen_info->net_system_tray_selection = XInternAtom (display_info->dpy, selection, FALSE); screen_info->systray = getSystrayWindow (display_info, screen_info->net_system_tray_selection); #endif screen_info->font_height = 0; screen_info->box_gc = None; screen_info->black_gc = NULL; screen_info->white_gc = NULL; screen_info->title_colors[ACTIVE].gc = NULL; screen_info->title_colors[ACTIVE].allocated = FALSE; screen_info->title_colors[INACTIVE].gc = NULL; screen_info->title_colors[INACTIVE].allocated = FALSE; screen_info->title_shadow_colors[ACTIVE].gc = NULL; screen_info->title_shadow_colors[ACTIVE].allocated = FALSE; screen_info->title_shadow_colors[INACTIVE].gc = NULL; screen_info->title_shadow_colors[INACTIVE].allocated = FALSE; for (i = 0; i < SIDE_COUNT; i++) { xfwmPixmapInit (screen_info, &screen_info->sides[i][ACTIVE]); xfwmPixmapInit (screen_info, &screen_info->sides[i][INACTIVE]); } for (i = 0; i < CORNER_COUNT; i++) { xfwmPixmapInit (screen_info, &screen_info->corners[i][ACTIVE]); xfwmPixmapInit (screen_info, &screen_info->corners[i][INACTIVE]); } for (i = 0; i < BUTTON_COUNT; i++) { for (j = 0; j < STATE_COUNT; j++) { xfwmPixmapInit (screen_info, &screen_info->buttons[i][j]); } } for (i = 0; i < TITLE_COUNT; i++) { xfwmPixmapInit (screen_info, &screen_info->title[i][ACTIVE]); xfwmPixmapInit (screen_info, &screen_info->title[i][INACTIVE]); xfwmPixmapInit (screen_info, &screen_info->top[i][ACTIVE]); xfwmPixmapInit (screen_info, &screen_info->top[i][INACTIVE]); } screen_info->monitors_index = NULL; myScreenInvalidateMonitorCache (screen_info); myScreenRebuildMonitorIndex (screen_info); return (screen_info); }