diff --git a/ChangeLog b/ChangeLog index 239e849a..0898de61 100644 --- a/ChangeLog +++ b/ChangeLog @@ -32,6 +32,19 @@ Changes since version 0.64.0: - Added a hint that Window Maker crashed, to allow windows to be placed in their correct previous positions after a crash situation and also to preserve their state before the crash (minimized, shaded, hidden, ...) +- Fixed wrong mapping position of the "Docked Applications Panel" for some + icons. +- Smoother animation for the smiley =) +- Added retain/release mechanism for RImages. RDestroyImage() has become + obsolete. More about this can be found in wrlib/Changelog and wrlib/NEWS. +- Small API change in WINGs to allow images with alpha blending set as the + application icons be shown correctly. More about this in WINGs/Changelog + and WINGs/NEWS. +- Made images with alpha blending be shown correctly in the panels and the + icon chooser. +- The icon image set to be shown in panels ("Logo.WMPanel") will be + automatically updated if its entry in WMWindowAttributes changes (without + a need to restart as until now). Changes since version 0.63.1: diff --git a/NEWS b/NEWS index 60c5a1cd..ff4ee336 100644 --- a/NEWS +++ b/NEWS @@ -4,12 +4,14 @@ NEWS for veteran Window Maker users --- 0.65.0 +Single AppIcon +-------------- + Removed --single-appicon patch and replaced it with a application specific collapsing option. Check inspector panel and appicon menu. - ---- 0.63.2 +--- 0.64.0 No Polling of Configuration Files --------------------------------- diff --git a/WINGs/ChangeLog b/WINGs/ChangeLog index 03fd6ce7..f541457b 100644 --- a/WINGs/ChangeLog +++ b/WINGs/ChangeLog @@ -29,6 +29,23 @@ Changes since wmaker 0.64.0: performance a bit. - replaced some recursive code with iterative code in selection.c - added WMCreateBlendedPixmapFromRImage() +- Small API change: + 1. Renamed WMSetApplicationIconImage(), WMGetApplicationIconImage() and + WMSetWindowMiniwindowImage() to respectively WMSetApplicationIconPixmap(), + WMGetApplicationIconPixmap() and WMSetWindowMiniwindowPixmap() + They operate on a WMPixmap which is practically an X Pixmap with no alpha + channel information and the new name is more suggestive and also leaves + room for the new functions added for operating on images with alpha info. + 2. Added WMSetApplicationIconImage() and WMGetApplicationIconImage() which + operate on an RImage and store alpha information too. + 3. Added WMGetApplicationIconBlendedPixmap() which will take the image with + alpha set by WMSetApplicationIconImage() and will blend it with a color. + If color is NULL it will blend using the default panel color (#aeaaae) + All these changes will allow WINGs to handle images with alpha blending + correctly in panels and wherever else needed. More about in NEWS. +- updated panels to use the newly available RImages if present and fallback + to old WMPixmaps if not, to properly show alpha blended images. +- replaced some still left malloc's with wmalloc's. changes since wmaker 0.63.1: diff --git a/WINGs/NEWS b/WINGs/NEWS new file mode 100644 index 00000000..a2f54293 --- /dev/null +++ b/WINGs/NEWS @@ -0,0 +1,77 @@ + +*** Sat Apr 21 09:12:09 EEST 2001 -Dan + +API change +---------- + +To allow a correct display of icon images with alpha blending in panels and +other places where a WINGs based application may use them the following +changes took place: + +1. The following functions were renamed: + - WMSetApplicationIconImage() --> WMSetApplicationIconPixmap() + - WMGetApplicationIconImage() --> WMGetApplicationIconPixmap() + - WMSetWindowMiniwindowImage() --> WMSetWindowMiniwindowPixmap() +2. The following functions were added: + - WMSetApplicationIconImage(WMScreen *scr, RImage *image) + - RImage* WMGetApplicationIconImage(WMScreen *scr) + - WMPixmap* WMGetApplicationIconBlendedPixmap(WMScreen *scr, RColor *color) + +As you can see the old functions that operated on WMPixmap images (which are +basically X Pixmaps that lack alpha information) were renamed to ...Pixmap() +to make them more suggestive about what they do and to make room for the +new functions that operate on RImages (that hold alpha information). + +Since the corresponding WMGet... functions only retrieve the stored +image/pixmap from the application, I'll outline how the WMSet... +functions operate: + +All WM...IconPixmap() functions operate on WMPixmaps +All WM...IconImage() functions operate on RImages + + +- WMSetApplicationIconImage() will set the RImage to be used in panels + and will also convert the RImage to a WMPixmap with a threshold of 128 + and will use that pixmap for the appicon image. If that doesn't satisfy + you, you can make a call to WMSetApplicationIconPixmap() on your own to + set whatever WMPixmap you see fit for the appicon. + +- WMSetApplicationIconPixmap() will set the WMPixmap to be used for the + appicon and for the panels + + +If you use only one of the above functions, the corresponding image/pixmap +will be used everywhere where needed (panels and appicon), but the pixmap +version will not be able to handle alpha blending correctly. + +If you use both WMSetApplicationIconImage() and WMSetApplicationIconPixmap() +then the RImage will have priority in panels, and the WMPixmap will only be +used for the appicon. This allows you to better control what icon is +displayed in the appicon, in case the default conversion of the RImage to a +pixmap with a threshold of 128 is not good enough, or in case you want a +different icon to be shown in the appicon than in panels. + + +Also this new function was added: + +- WMGetApplicationIconBlendedPixmap() will use the RImage set with + WMSetApplicationIconImage() if available and will blend it with the color + you passed. This will make the image show well on a background of that + color. If the RImage was not set it will return NULL. You need to call + WMReleasePixmap() on it after you finish with it. Passing a NULL pointer + instead of a color will make the RImage be blended with the default color + of the WINGs widgets: '#aeaaae' making it suitable to be assigned to any + WINGs widget. + + +To make your existing code work as before all you need to do is to rename +the following functions: + + - WMSetApplicationIconImage() --> WMSetApplicationIconPixmap() + - WMGetApplicationIconImage() --> WMGetApplicationIconPixmap() + - WMSetWindowMiniwindowImage() --> WMSetWindowMiniwindowPixmap() + +But if you want to take advantage of the new abilities to show alpha +blended images you need to start using the new functions. + + diff --git a/WINGs/Tests/wmfile.c b/WINGs/Tests/wmfile.c index 9b74669e..500cf49b 100644 --- a/WINGs/Tests/wmfile.c +++ b/WINGs/Tests/wmfile.c @@ -102,7 +102,7 @@ int main(int argc, char **argv) pixmap = WMCreatePixmapFromXPMData(scr, GNUSTEP_XPM); - WMSetApplicationIconImage(scr, pixmap); + WMSetApplicationIconPixmap(scr, pixmap); WMReleasePixmap(pixmap); if (panelType == SAVE_PANEL_TYPE) { sPanel = WMGetSavePanel(scr); diff --git a/WINGs/Tests/wmquery.c b/WINGs/Tests/wmquery.c index 6f91655c..f46ad78e 100644 --- a/WINGs/Tests/wmquery.c +++ b/WINGs/Tests/wmquery.c @@ -88,8 +88,8 @@ int main(int argc, char **argv) scr = WMCreateSimpleApplicationScreen(dpy); pixmap = WMCreatePixmapFromXPMData(scr, GNUSTEP_XPM); - - WMSetApplicationIconImage(scr, pixmap); WMReleasePixmap(pixmap); + + WMSetApplicationIconPixmap(scr, pixmap); WMReleasePixmap(pixmap); if ((result = WMRunInputPanel(scr, NULL, title, prompt, initial, "OK", "Cancel")) != NULL) printf("%s\n", result); diff --git a/WINGs/Tests/wtest.c b/WINGs/Tests/wtest.c index 23bd119e..14d4ae50 100644 --- a/WINGs/Tests/wtest.c +++ b/WINGs/Tests/wtest.c @@ -357,12 +357,12 @@ testGradientButtons(WMScreen *scr) back = RRenderGradient(60, 24, &dark, &light, RGRD_DIAGONAL); RBevelImage(back, RBEV_RAISED2); pix1 = WMCreatePixmapFromRImage(scr, back, 0); - RDestroyImage(back); + RReleaseImage(back); back = RRenderGradient(60, 24, &dark, &light, RGRD_DIAGONAL); RBevelImage(back, RBEV_SUNKEN); pix2 = WMCreatePixmapFromRImage(scr, back, 0); - RDestroyImage(back); + RReleaseImage(back); color = WMWhiteColor(scr); altColor = WMCreateNamedColor(scr, "red", True); @@ -1283,7 +1283,7 @@ main(int argc, char **argv) /* * Makes the logo be used in standard dialog panels. */ - WMSetApplicationIconImage(scr, pixmap); WMReleasePixmap(pixmap); + WMSetApplicationIconPixmap(scr, pixmap); WMReleasePixmap(pixmap); /* * Do some test stuff. diff --git a/WINGs/WINGs/WINGs.h b/WINGs/WINGs/WINGs.h index 5d6b4170..64d337de 100644 --- a/WINGs/WINGs/WINGs.h +++ b/WINGs/WINGs/WINGs.h @@ -467,7 +467,7 @@ typedef void WMSplitViewResizeSubviewsProc(WMSplitView *sPtr, typedef void WMSplitViewConstrainProc(WMSplitView *sPtr, int dividerIndex, int *minSize, int *maxSize); -typedef WMWidget *WMMatrixCreateCellProc(WMMatrix *mPtr); +typedef WMWidget* WMMatrixCreateCellProc(WMMatrix *mPtr); @@ -595,20 +595,20 @@ void WMInitializeApplication(char *applicationName, int *argc, char **argv); void WMSetResourcePath(char *path); /* don't free the returned string */ -char *WMGetApplicationName(); +char* WMGetApplicationName(); /* Try to locate resource file. ext may be NULL */ -char *WMPathForResourceOfType(char *resource, char *ext); +char* WMPathForResourceOfType(char *resource, char *ext); -WMScreen *WMOpenScreen(const char *display); +WMScreen* WMOpenScreen(const char *display); -WMScreen *WMCreateScreenWithRContext(Display *display, int screen, +WMScreen* WMCreateScreenWithRContext(Display *display, int screen, RContext *context); -WMScreen *WMCreateScreen(Display *display, int screen); +WMScreen* WMCreateScreen(Display *display, int screen); -WMScreen *WMCreateSimpleApplicationScreen(Display *display); +WMScreen* WMCreateSimpleApplicationScreen(Display *display); void WMScreenMainLoop(WMScreen *scr); @@ -616,23 +616,30 @@ void WMBreakModalLoop(WMScreen *scr); void WMRunModalLoop(WMScreen *scr, WMView *view); -RContext *WMScreenRContext(WMScreen *scr); +RContext* WMScreenRContext(WMScreen *scr); -Display *WMScreenDisplay(WMScreen *scr); +Display* WMScreenDisplay(WMScreen *scr); int WMScreenDepth(WMScreen *scr); -void WMSetApplicationIconImage(WMScreen *app, WMPixmap *icon); +void WMSetApplicationIconImage(WMScreen *app, RImage *image); -WMPixmap *WMGetApplicationIconImage(WMScreen *app); +RImage* WMGetApplicationIconImage(WMScreen *app); + +void WMSetApplicationIconPixmap(WMScreen *app, WMPixmap *icon); + +WMPixmap* WMGetApplicationIconPixmap(WMScreen *app); + +/* If color==NULL it will use the default color for panels: ae/aa/ae */ +WMPixmap* WMGetApplicationIconBlendedPixmap(WMScreen *scr, RColor *color); void WMSetApplicationIconWindow(WMScreen *scr, Window window); void WMSetFocusToWidget(WMWidget *widget); -WMEventHook *WMHookEventHandler(WMEventHook *handler); +WMEventHook* WMHookEventHandler(WMEventHook *handler); int WMHandleEvent(XEvent *event); @@ -682,22 +689,22 @@ WMPoint WMGetDraggingInfoImageLocation(WMDraggingInfo *info); /* ....................................................................... */ -WMFont *WMCreateFontSet(WMScreen *scrPtr, char *fontName); +WMFont* WMCreateFontSet(WMScreen *scrPtr, char *fontName); -WMFont *WMCreateNormalFont(WMScreen *scrPtr, char *fontName); +WMFont* WMCreateNormalFont(WMScreen *scrPtr, char *fontName); -WMFont *WMCreateFont(WMScreen *scrPtr, char *fontName); +WMFont* WMCreateFont(WMScreen *scrPtr, char *fontName); -WMFont *WMRetainFont(WMFont *font); +WMFont* WMRetainFont(WMFont *font); void WMReleaseFont(WMFont *font); unsigned int WMFontHeight(WMFont *font); /* -WMFont *WMUserFontOfSize(WMScreen *scrPtr, int size); +WMFont* WMUserFontOfSize(WMScreen *scrPtr, int size); -WMFont *WMUserFixedPitchFontOfSize(WMScreen *scrPtr, int size); +WMFont* WMUserFixedPitchFontOfSize(WMScreen *scrPtr, int size); */ @@ -705,50 +712,50 @@ void WMSetWidgetDefaultFont(WMScreen *scr, WMFont *font); void WMSetWidgetDefaultBoldFont(WMScreen *scr, WMFont *font); -WMFont *WMSystemFontOfSize(WMScreen *scrPtr, int size); +WMFont* WMSystemFontOfSize(WMScreen *scrPtr, int size); -WMFont *WMBoldSystemFontOfSize(WMScreen *scrPtr, int size); +WMFont* WMBoldSystemFontOfSize(WMScreen *scrPtr, int size); XFontSet WMGetFontFontSet(WMFont *font); -WMFont *WMNormalizeFont(WMScreen *scr, WMFont *font); +WMFont* WMNormalizeFont(WMScreen *scr, WMFont *font); -WMFont *WMStrengthenFont(WMScreen *scr, WMFont *font); +WMFont* WMStrengthenFont(WMScreen *scr, WMFont *font); -WMFont *WMUnstrengthenFont(WMScreen *scr, WMFont *font); +WMFont* WMUnstrengthenFont(WMScreen *scr, WMFont *font); -WMFont *WMEmphasizeFont(WMScreen *scr, WMFont *font); +WMFont* WMEmphasizeFont(WMScreen *scr, WMFont *font); -WMFont *WMUnemphasizeFont(WMScreen *scr, WMFont *font); +WMFont* WMUnemphasizeFont(WMScreen *scr, WMFont *font); -WMFont *WMGetFontOfSize(WMScreen *scr, WMFont *font, int size); +WMFont* WMGetFontOfSize(WMScreen *scr, WMFont *font, int size); /* ....................................................................... */ -WMPixmap *WMRetainPixmap(WMPixmap *pixmap); +WMPixmap* WMRetainPixmap(WMPixmap *pixmap); void WMReleasePixmap(WMPixmap *pixmap); -WMPixmap *WMCreatePixmap(WMScreen *scrPtr, int width, int height, int depth, +WMPixmap* WMCreatePixmap(WMScreen *scrPtr, int width, int height, int depth, Bool masked); -WMPixmap *WMCreatePixmapFromXPixmaps(WMScreen *scrPtr, Pixmap pixmap, +WMPixmap* WMCreatePixmapFromXPixmaps(WMScreen *scrPtr, Pixmap pixmap, Pixmap mask, int width, int height, int depth); -WMPixmap *WMCreatePixmapFromRImage(WMScreen *scrPtr, RImage *image, +WMPixmap* WMCreatePixmapFromRImage(WMScreen *scrPtr, RImage *image, int threshold); -WMPixmap *WMCreatePixmapFromXPMData(WMScreen *scrPtr, char **data); +WMPixmap* WMCreatePixmapFromXPMData(WMScreen *scrPtr, char **data); WMSize WMGetPixmapSize(WMPixmap *pixmap); -WMPixmap *WMCreatePixmapFromFile(WMScreen *scrPtr, char *fileName); +WMPixmap* WMCreatePixmapFromFile(WMScreen *scrPtr, char *fileName); WMPixmap* WMCreateBlendedPixmapFromRImage(WMScreen *scrPtr, RImage *image, RColor *color); -WMPixmap *WMCreateBlendedPixmapFromFile(WMScreen *scrPtr, char *fileName, +WMPixmap* WMCreateBlendedPixmapFromFile(WMScreen *scrPtr, char *fileName, RColor *color); void WMDrawPixmap(WMPixmap *pixmap, Drawable d, int x, int y); @@ -757,18 +764,18 @@ Pixmap WMGetPixmapXID(WMPixmap *pixmap); Pixmap WMGetPixmapMaskXID(WMPixmap *pixmap); -WMPixmap *WMGetSystemPixmap(WMScreen *scr, int image); +WMPixmap* WMGetSystemPixmap(WMScreen *scr, int image); /* ....................................................................... */ -WMColor *WMDarkGrayColor(WMScreen *scr); +WMColor* WMDarkGrayColor(WMScreen *scr); -WMColor *WMGrayColor(WMScreen *scr); +WMColor* WMGrayColor(WMScreen *scr); -WMColor *WMBlackColor(WMScreen *scr); +WMColor* WMBlackColor(WMScreen *scr); -WMColor *WMWhiteColor(WMScreen *scr); +WMColor* WMWhiteColor(WMScreen *scr); void WMSetColorInGC(WMColor *color, GC gc); @@ -781,13 +788,13 @@ void WMPaintColorSwatch(WMColor *color, Drawable d, int x, int y, void WMReleaseColor(WMColor *color); -WMColor *WMRetainColor(WMColor *color); +WMColor* WMRetainColor(WMColor *color); -WMColor *WMCreateRGBColor(WMScreen *scr, unsigned short red, +WMColor* WMCreateRGBColor(WMScreen *scr, unsigned short red, unsigned short green, unsigned short blue, Bool exact); -WMColor *WMCreateNamedColor(WMScreen *scr, char *name, Bool exact); +WMColor* WMCreateNamedColor(WMScreen *scr, char *name, Bool exact); unsigned short WMRedComponentOfColor(WMColor *color); @@ -795,7 +802,7 @@ unsigned short WMGreenComponentOfColor(WMColor *color); unsigned short WMBlueComponentOfColor(WMColor *color); -char *WMGetColorRGBDescription(WMColor *color); +char* WMGetColorRGBDescription(WMColor *color); /* ....................................................................... */ @@ -812,7 +819,7 @@ int WMWidthOfString(WMFont *font, char *text, int length); /* ....................................................................... */ -WMScreen *WMWidgetScreen(WMWidget *w); +WMScreen* WMWidgetScreen(WMWidget *w); unsigned int WMScreenWidth(WMScreen *scr); @@ -844,7 +851,7 @@ void WMDestroyWidget(WMWidget *widget); void WMHangData(WMWidget *widget, void *data); -void *WMGetHangedData(WMWidget *widget); +void* WMGetHangedData(WMWidget *widget); unsigned int WMWidgetWidth(WMWidget *w); @@ -867,7 +874,7 @@ WMPoint WMGetViewPosition(WMView *view); WMPoint WMGetViewScreenPosition(WMView *view); -WMWidget *WMWidgetOfView(WMView *view); +WMWidget* WMWidgetOfView(WMView *view); void WMSetViewNextResponder(WMView *view, WMView *responder); @@ -898,14 +905,14 @@ void WMSetBalloonEnabled(WMScreen *scr, Bool flag); /* ....................................................................... */ -WMWindow *WMCreateWindow(WMScreen *screen, char *name); +WMWindow* WMCreateWindow(WMScreen *screen, char *name); -WMWindow *WMCreateWindowWithStyle(WMScreen *screen, char *name, int style); +WMWindow* WMCreateWindowWithStyle(WMScreen *screen, char *name, int style); -WMWindow *WMCreatePanelWithStyleForWindow(WMWindow *owner, char *name, +WMWindow* WMCreatePanelWithStyleForWindow(WMWindow *owner, char *name, int style); -WMWindow *WMCreatePanelForWindow(WMWindow *owner, char *name); +WMWindow* WMCreatePanelForWindow(WMWindow *owner, char *name); void WMChangePanelOwner(WMWindow *win, WMWindow *newOwner); @@ -913,7 +920,7 @@ void WMSetWindowTitle(WMWindow *wPtr, char *title); void WMSetWindowMiniwindowTitle(WMWindow *win, char *title); -void WMSetWindowMiniwindowImage(WMWindow *win, WMPixmap *pixmap); +void WMSetWindowMiniwindowPixmap(WMWindow *win, WMPixmap *pixmap); void WMSetWindowCloseAction(WMWindow *win, WMAction *action, void *clientData); @@ -954,9 +961,9 @@ void WMSetButtonAction(WMButton *bPtr, WMAction *action, void *clientData); #define WMCreateSwitchButton(parent) \ WMCreateButton((parent), WBTSwitch) -WMButton *WMCreateButton(WMWidget *parent, WMButtonType type); +WMButton* WMCreateButton(WMWidget *parent, WMButtonType type); -WMButton *WMCreateCustomButton(WMWidget *parent, int behaviourMask); +WMButton* WMCreateCustomButton(WMWidget *parent, int behaviourMask); void WMSetButtonImageDefault(WMButton *bPtr); @@ -1002,15 +1009,15 @@ void WMSetButtonPeriodicDelay(WMButton *bPtr, float delay, float interval); /* ....................................................................... */ -WMLabel *WMCreateLabel(WMWidget *parent); +WMLabel* WMCreateLabel(WMWidget *parent); void WMSetLabelWraps(WMLabel *lPtr, Bool flag); void WMSetLabelImage(WMLabel *lPtr, WMPixmap *image); -WMPixmap *WMGetLabelImage(WMLabel *lPtr); +WMPixmap* WMGetLabelImage(WMLabel *lPtr); -char *WMGetLabelText(WMLabel *lPtr); +char* WMGetLabelText(WMLabel *lPtr); void WMSetLabelImagePosition(WMLabel *lPtr, WMImagePosition position); @@ -1028,7 +1035,7 @@ void WMSetLabelTextColor(WMLabel *lPtr, WMColor *color); /* ....................................................................... */ -WMFrame *WMCreateFrame(WMWidget *parent); +WMFrame* WMCreateFrame(WMWidget *parent); void WMSetFrameTitlePosition(WMFrame *fPtr, WMTitlePosition position); @@ -1038,14 +1045,14 @@ void WMSetFrameTitle(WMFrame *fPtr, char *title); /* ....................................................................... */ -WMTextField *WMCreateTextField(WMWidget *parent); +WMTextField* WMCreateTextField(WMWidget *parent); void WMInsertTextFieldText(WMTextField *tPtr, char *text, int position); void WMDeleteTextFieldRange(WMTextField *tPtr, WMRange range); /* you can free the returned string */ -char *WMGetTextFieldText(WMTextField *tPtr); +char* WMGetTextFieldText(WMTextField *tPtr); void WMSetTextFieldText(WMTextField *tPtr, char *text); @@ -1053,7 +1060,7 @@ void WMSetTextFieldAlignment(WMTextField *tPtr, WMAlignment alignment); void WMSetTextFieldFont(WMTextField *tPtr, WMFont *font); -WMFont *WMGetTextFieldFont(WMTextField *tPtr); +WMFont* WMGetTextFieldFont(WMTextField *tPtr); void WMSetTextFieldBordered(WMTextField *tPtr, Bool bordered); @@ -1082,7 +1089,7 @@ extern char *WMTextDidEndEditingNotification; /* ....................................................................... */ -WMScroller *WMCreateScroller(WMWidget *parent); +WMScroller* WMCreateScroller(WMWidget *parent); void WMSetScrollerParameters(WMScroller *sPtr, float floatValue, float knobProportion); @@ -1102,7 +1109,7 @@ extern char *WMScrollerDidScrollNotification; /* ....................................................................... */ -WMList *WMCreateList(WMWidget *parent); +WMList* WMCreateList(WMWidget *parent); void WMSetListAllowMultipleSelection(WMList *lPtr, Bool flag); @@ -1110,7 +1117,7 @@ void WMSetListAllowEmptySelection(WMList *lPtr, Bool flag); #define WMAddListItem(lPtr, text) WMInsertListItem((lPtr), -1, (text)) -WMListItem *WMInsertListItem(WMList *lPtr, int row, char *text); +WMListItem* WMInsertListItem(WMList *lPtr, int row, char *text); void WMSortListItems(WMList *lPtr); @@ -1118,9 +1125,9 @@ void WMSortListItemsWithComparer(WMList *lPtr, WMCompareDataProc *func); int WMFindRowOfListItemWithTitle(WMList *lPtr, char *title); -WMListItem *WMGetListItem(WMList *lPtr, int row); +WMListItem* WMGetListItem(WMList *lPtr, int row); -WMArray *WMGetListItems(WMList *lPtr); +WMArray* WMGetListItems(WMList *lPtr); void WMRemoveListItem(WMList *lPtr, int row); @@ -1182,7 +1189,7 @@ extern char *WMListSelectionDidChangeNotification; /* ....................................................................... */ -WMBrowser *WMCreateBrowser(WMWidget *parent); +WMBrowser* WMCreateBrowser(WMWidget *parent); void WMSetBrowserAllowMultipleSelection(WMBrowser *bPtr, Bool flag); @@ -1202,7 +1209,7 @@ void WMSetBrowserMaxVisibleColumns(WMBrowser *bPtr, int columns); void WMSetBrowserColumnTitle(WMBrowser *bPtr, int column, char *title); -WMListItem *WMInsertBrowserItem(WMBrowser *bPtr, int column, int row, char *text, Bool isBranch); +WMListItem* WMInsertBrowserItem(WMBrowser *bPtr, int column, int row, char *text, Bool isBranch); void WMSortBrowserColumn(WMBrowser *bPtr, int column); @@ -1213,10 +1220,10 @@ void WMSortBrowserColumnWithComparer(WMBrowser *bPtr, int column, char* WMSetBrowserPath(WMBrowser *bPtr, char *path); /* free the returned string */ -char *WMGetBrowserPath(WMBrowser *bPtr); +char* WMGetBrowserPath(WMBrowser *bPtr); /* free the returned string */ -char *WMGetBrowserPathToColumn(WMBrowser *bPtr, int column); +char* WMGetBrowserPathToColumn(WMBrowser *bPtr, int column); /* free the returned array */ WMArray* WMGetBrowserPaths(WMBrowser *bPtr); @@ -1226,7 +1233,7 @@ void WMSetBrowserAction(WMBrowser *bPtr, WMAction *action, void *clientData); void WMSetBrowserDoubleAction(WMBrowser *bPtr, WMAction *action, void *clientData); -WMListItem *WMGetBrowserSelectedItemInColumn(WMBrowser *bPtr, int column); +WMListItem* WMGetBrowserSelectedItemInColumn(WMBrowser *bPtr, int column); int WMGetBrowserFirstVisibleColumn(WMBrowser *bPtr); @@ -1238,7 +1245,7 @@ int WMGetBrowserNumberOfColumns(WMBrowser *bPtr); int WMGetBrowserMaxVisibleColumns(WMBrowser *bPtr); -WMList *WMGetBrowserListInColumn(WMBrowser *bPtr, int column); +WMList* WMGetBrowserListInColumn(WMBrowser *bPtr, int column); void WMSetBrowserDelegate(WMBrowser *bPtr, WMBrowserDelegate *delegate); @@ -1253,7 +1260,7 @@ void WMSetBrowserHasScroller(WMBrowser *bPtr, int hasScroller); Bool WMMenuItemIsSeparator(WMMenuItem *item); -WMMenuItem *WMCreateMenuItem(void); +WMMenuItem* WMCreateMenuItem(void); void WMDestroyMenuItem(WMMenuItem *item); @@ -1261,7 +1268,7 @@ Bool WMGetMenuItemEnabled(WMMenuItem *item); void WMSetMenuItemEnabled(WMMenuItem *item, Bool flag); -char *WMGetMenuItemShortcut(WMMenuItem *item); +char* WMGetMenuItemShortcut(WMMenuItem *item); unsigned WMGetMenuItemShortcutModifierMask(WMMenuItem *item); @@ -1269,19 +1276,19 @@ void WMSetMenuItemShortcut(WMMenuItem *item, char *shortcut); void WMSetMenuItemShortcutModifierMask(WMMenuItem *item, unsigned mask); -void *WMGetMenuItemRepresentedObject(WMMenuItem *item); +void* WMGetMenuItemRepresentedObject(WMMenuItem *item); void WMSetMenuItemRepresentedObject(WMMenuItem *item, void *object); void WMSetMenuItemAction(WMMenuItem *item, WMAction *action, void *data); -WMAction *WMGetMenuItemAction(WMMenuItem *item); +WMAction* WMGetMenuItemAction(WMMenuItem *item); -void *WMGetMenuItemData(WMMenuItem *item); +void* WMGetMenuItemData(WMMenuItem *item); void WMSetMenuItemTitle(WMMenuItem *item, char *title); -char *WMGetMenuItemTitle(WMMenuItem *item); +char* WMGetMenuItemTitle(WMMenuItem *item); void WMSetMenuItemState(WMMenuItem *item, int state); @@ -1289,40 +1296,40 @@ int WMGetMenuItemState(WMMenuItem *item); void WMSetMenuItemPixmap(WMMenuItem *item, WMPixmap *pixmap); -WMPixmap *WMGetMenuItemPixmap(WMMenuItem *item); +WMPixmap* WMGetMenuItemPixmap(WMMenuItem *item); void WMSetMenuItemOnStatePixmap(WMMenuItem *item, WMPixmap *pixmap); -WMPixmap *WMGetMenuItemOnStatePixmap(WMMenuItem *item); +WMPixmap* WMGetMenuItemOnStatePixmap(WMMenuItem *item); void WMSetMenuItemOffStatePixmap(WMMenuItem *item, WMPixmap *pixmap); -WMPixmap *WMGetMenuItemOffStatePixmap(WMMenuItem *item); +WMPixmap* WMGetMenuItemOffStatePixmap(WMMenuItem *item); void WMSetMenuItemMixedStatePixmap(WMMenuItem *item, WMPixmap *pixmap); -WMPixmap *WMGetMenuItemMixedStatePixmap(WMMenuItem *item); +WMPixmap* WMGetMenuItemMixedStatePixmap(WMMenuItem *item); /*void WMSetMenuItemSubmenu(WMMenuItem *item, WMMenu *submenu); -WMMenu *WMGetMenuItemSubmenu(WMMenuItem *item); +WMMenu* WMGetMenuItemSubmenu(WMMenuItem *item); Bool WMGetMenuItemHasSubmenu(WMMenuItem *item); */ /* ....................................................................... */ -WMPopUpButton *WMCreatePopUpButton(WMWidget *parent); +WMPopUpButton* WMCreatePopUpButton(WMWidget *parent); void WMSetPopUpButtonAction(WMPopUpButton *sPtr, WMAction *action, void *clientData); void WMSetPopUpButtonPullsDown(WMPopUpButton *bPtr, Bool flag); -WMMenuItem *WMAddPopUpButtonItem(WMPopUpButton *bPtr, char *title); +WMMenuItem* WMAddPopUpButtonItem(WMPopUpButton *bPtr, char *title); -WMMenuItem *WMInsertPopUpButtonItem(WMPopUpButton *bPtr, int index, +WMMenuItem* WMInsertPopUpButtonItem(WMPopUpButton *bPtr, int index, char *title); void WMRemovePopUpButtonItem(WMPopUpButton *bPtr, int index); @@ -1338,9 +1345,9 @@ int WMGetPopUpButtonSelectedItem(WMPopUpButton *bPtr); void WMSetPopUpButtonText(WMPopUpButton *bPtr, char *text); /* don't free the returned data */ -char *WMGetPopUpButtonItem(WMPopUpButton *bPtr, int index); +char* WMGetPopUpButtonItem(WMPopUpButton *bPtr, int index); -WMMenuItem *WMGetPopUpButtonMenuItem(WMPopUpButton *bPtr, int index); +WMMenuItem* WMGetPopUpButtonMenuItem(WMPopUpButton *bPtr, int index); int WMGetPopUpButtonNumberOfItems(WMPopUpButton *bPtr); @@ -1351,7 +1358,7 @@ Bool WMGetPopUpButtonEnabled(WMPopUpButton *bPtr); /* ....................................................................... */ -WMProgressIndicator *WMCreateProgressIndicator(WMWidget *parent); +WMProgressIndicator* WMCreateProgressIndicator(WMWidget *parent); void WMSetProgressIndicatorMinValue(WMProgressIndicator *progressindicator, int value); @@ -1368,7 +1375,7 @@ int WMGetProgressIndicatorValue(WMProgressIndicator *progressindicator); /* ....................................................................... */ -WMColorPanel *WMGetColorPanel(WMScreen *scrPtr); +WMColorPanel* WMGetColorPanel(WMScreen *scrPtr); void WMFreeColorPanel(WMColorPanel *panel); @@ -1378,7 +1385,7 @@ void WMCloseColorPanel(WMColorPanel *panel); void WMSetColorPanelColor(WMColorPanel *panel, WMColor *color); -WMColor *WMGetColorPanelColor(WMColorPanel *panel); +WMColor* WMGetColorPanelColor(WMColorPanel *panel); void WMSetColorPanelPickerMode(WMColorPanel *panel, WMColorPanelMode mode); @@ -1388,11 +1395,11 @@ extern char *WMColorPanelColorChangedNotification; /* ....................................................................... */ -WMColorWell *WMCreateColorWell(WMWidget *parent); +WMColorWell* WMCreateColorWell(WMWidget *parent); void WMSetColorWellColor(WMColorWell *cPtr, WMColor *color); -WMColor *WMGetColorWellColor(WMColorWell *cPtr); +WMColor* WMGetColorWellColor(WMColorWell *cPtr); void WSetColorWellBordered(WMColorWell *cPtr, Bool flag); @@ -1402,7 +1409,7 @@ extern char *WMColorWellDidChangeNotification; /* ...................................................................... */ -WMScrollView *WMCreateScrollView(WMWidget *parent); +WMScrollView* WMCreateScrollView(WMWidget *parent); void WMResizeScrollViewContent(WMScrollView *sPtr, unsigned int width, unsigned int height); @@ -1419,9 +1426,9 @@ void WMSetScrollViewContentView(WMScrollView *sPtr, WMView *view); WMRect WMGetScrollViewVisibleRect(WMScrollView *sPtr); -WMScroller *WMGetScrollViewHorizontalScroller(WMScrollView *sPtr); +WMScroller* WMGetScrollViewHorizontalScroller(WMScrollView *sPtr); -WMScroller *WMGetScrollViewVerticalScroller(WMScrollView *sPtr); +WMScroller* WMGetScrollViewVerticalScroller(WMScrollView *sPtr); void WMSetScrollViewLineScroll(WMScrollView *sPtr, int amount); @@ -1429,7 +1436,7 @@ void WMSetScrollViewPageScroll(WMScrollView *sPtr, int amount); /* ....................................................................... */ -WMSlider *WMCreateSlider(WMWidget *parent); +WMSlider* WMCreateSlider(WMWidget *parent); int WMGetSliderMinValue(WMSlider *slider); @@ -1454,13 +1461,15 @@ void WMSetSliderImage(WMSlider *sPtr, WMPixmap *pixmap); /* ....................................................................... */ -WMSplitView *WMCreateSplitView(WMWidget *parent); +WMSplitView* WMCreateSplitView(WMWidget *parent); + Bool WMGetSplitViewVertical(WMSplitView *sPtr); + void WMSetSplitViewVertical(WMSplitView *sPtr, Bool flag); int WMGetSplitViewSubviewsCount(WMSplitView *sPtr); /* ??? remove ??? */ -WMView *WMGetSplitViewSubviewAt(WMSplitView *sPtr, int index); +WMView* WMGetSplitViewSubviewAt(WMSplitView *sPtr, int index); /* remove the first subview == view */ void WMRemoveSplitViewSubview(WMSplitView *sPtr, WMView *view); @@ -1484,14 +1493,13 @@ int WMGetSplitViewDividerThickness(WMSplitView *sPtr); /* ...................................................................... */ -WMRuler *WMCreateRuler (WMWidget *parent); +WMRuler* WMCreateRuler (WMWidget *parent); -WMRulerMargins *WMGetRulerMargins(WMRuler *rPtr); +WMRulerMargins* WMGetRulerMargins(WMRuler *rPtr); void WMSetRulerMargins(WMRuler *rPtr, WMRulerMargins margins); -Bool WMIsMarginEqualToMargin(WMRulerMargins *aMargin, - WMRulerMargins *anotherMargin); +Bool WMIsMarginEqualToMargin(WMRulerMargins *aMargin, WMRulerMargins *anotherMargin); int WMGetGrabbedRulerMargin(WMRuler *rPtr); @@ -1511,8 +1519,8 @@ void WMSetRulerReleaseAction(WMRuler *rPtr, WMAction *action, void *clientData); #define WMCreateText(parent) WMCreateTextForDocumentType \ ((parent), (NULL), (NULL)) -WMText *WMCreateTextForDocumentType(WMWidget *parent, - WMAction *parser, WMAction *writer); +WMText* WMCreateTextForDocumentType(WMWidget *parent, WMAction *parser, + WMAction *writer); void WMSetTextDelegate(WMText *tPtr, WMTextDelegate *delegate); @@ -1552,11 +1560,11 @@ int WMGetTextIgnoresNewline(WMText *tPtr); void WMSetTextDefaultFont(WMText *tPtr, WMFont *font); -WMFont * WMGetTextDefaultFont(WMText *tPtr); +WMFont* WMGetTextDefaultFont(WMText *tPtr); void WMSetTextDefaultColor(WMText *tPtr, WMColor *color); -WMColor * WMGetTextDefaultColor(WMText *tPtr); +WMColor* WMGetTextDefaultColor(WMText *tPtr); void WMSetTextRelief(WMText *tPtr, WMReliefType relief); @@ -1574,24 +1582,24 @@ void WMAppendTextStream(WMText *tPtr, char *text); ((tPtr), (NULL)) /* free the text */ -char * WMGetTextStream(WMText *tPtr); +char* WMGetTextStream(WMText *tPtr); /* free the text */ -char * WMGetTextSelectedStream(WMText *tPtr); +char* WMGetTextSelectedStream(WMText *tPtr); /* destroy the array */ -WMArray * WMGetTextObjects(WMText *tPtr); +WMArray* WMGetTextObjects(WMText *tPtr); /* destroy the array */ WMArray* WMGetTextSelectedObjects(WMText *tPtr); void WMSetTextSelectionColor(WMText *tPtr, WMColor *color); -WMColor *WMGetTextSelectionColor(WMText *tPtr); +WMColor* WMGetTextSelectionColor(WMText *tPtr); void WMSetTextSelectionFont(WMText *tPtr, WMFont *font); -WMFont *WMGetTextSelectionFont(WMText *tPtr); +WMFont* WMGetTextSelectionFont(WMText *tPtr); void WMSetTextSelectionUnderlined(WMText *tPtr, int underlined); @@ -1600,30 +1608,33 @@ int WMGetTextSelectionUnderlined(WMText *tPtr); void WMSetTextAlignment(WMText *tPtr, WMAlignment alignment); Bool WMFindInTextStream(WMText *tPtr, char *needle, Bool direction, - Bool caseSensitive); + Bool caseSensitive); Bool WMReplaceTextSelection(WMText *tPtr, char *replacement); /* parser related stuff... use only if implementing a new parser */ -void *WMCreateTextBlockWithObject(WMText *tPtr, WMWidget *w, char *description, - WMColor *color, unsigned short first, unsigned short extraInfo); - -void *WMCreateTextBlockWithPixmap(WMText *tPtr, WMPixmap *p, char *description, - WMColor *color, unsigned short first, unsigned short extraInfo); +void* WMCreateTextBlockWithObject(WMText *tPtr, WMWidget *w, char *description, + WMColor *color, unsigned short first, + unsigned short extraInfo); + +void* WMCreateTextBlockWithPixmap(WMText *tPtr, WMPixmap *p, char *description, + WMColor *color, unsigned short first, + unsigned short extraInfo); + +void* WMCreateTextBlockWithText(WMText *tPtr, char *text, WMFont *font, + WMColor *color, unsigned short first, + unsigned short length); -void *WMCreateTextBlockWithText(WMText *tPtr, char *text, WMFont *font, - WMColor *color, unsigned short first, unsigned short length); - void WMSetTextBlockProperties(WMText *tPtr, void *vtb, unsigned int first, - unsigned int kanji, unsigned int underlined, int script, - WMRulerMargins *margins); - + unsigned int kanji, unsigned int underlined, + int script, WMRulerMargins *margins); + /* do NOT free the margins */ void WMGetTextBlockProperties(WMText *tPtr, void *vtb, unsigned int *first, - unsigned int *kanji, unsigned int *underlined, int *script, - WMRulerMargins *margins); + unsigned int *kanji, unsigned int *underlined, + int *script, WMRulerMargins *margins); int WMGetTextInsertType(WMText *tPtr); @@ -1637,14 +1648,14 @@ void WMPrependTextBlock(WMText *tPtr, void *vtb); void WMAppendTextBlock(WMText *tPtr, void *vtb); -void *WMRemoveTextBlock(WMText *tPtr); +void* WMRemoveTextBlock(WMText *tPtr); void WMDestroyTextBlock(WMText *tPtr, void *vtb); /* ....................................................................... */ -WMTabView *WMCreateTabView(WMWidget *parent); +WMTabView* WMCreateTabView(WMWidget *parent); void WMSetTabViewType(WMTabView *tPtr, WMTabViewType type); @@ -1658,10 +1669,10 @@ void WMInsertItemInTabView(WMTabView *tPtr, int index, WMTabViewItem *item); void WMRemoveTabViewItem(WMTabView *tPtr, WMTabViewItem *item); -WMTabViewItem *WMAddTabViewItemWithView(WMTabView *tPtr, WMView *view, +WMTabViewItem* WMAddTabViewItemWithView(WMTabView *tPtr, WMView *view, int identifier, char *label); -WMTabViewItem *WMTabViewItemAtPoint(WMTabView *tPtr, int x, int y); +WMTabViewItem* WMTabViewItemAtPoint(WMTabView *tPtr, int x, int y); void WMSelectFirstTabViewItem(WMTabView *tPtr); @@ -1671,7 +1682,7 @@ void WMSelectNextTabViewItem(WMTabView *tPtr); void WMSelectPreviousTabViewItem(WMTabView *tPtr); -WMTabViewItem *WMGetSelectedTabViewItem(WMTabView *tPtr); +WMTabViewItem* WMGetSelectedTabViewItem(WMTabView *tPtr); void WMSelectTabViewItem(WMTabView *tPtr, WMTabViewItem *item); @@ -1680,24 +1691,24 @@ void WMSelectTabViewItemAtIndex(WMTabView *tPtr, int index); void WMSetTabViewDelegate(WMTabView *tPtr, WMTabViewDelegate *delegate); -WMTabViewItem *WMCreateTabViewItemWithIdentifier(int identifier); +WMTabViewItem* WMCreateTabViewItemWithIdentifier(int identifier); int WMGetTabViewItemIdentifier(WMTabViewItem *item); void WMSetTabViewItemLabel(WMTabViewItem *item, char *label); -char *WMGetTabViewItemLabel(WMTabViewItem *item); +char* WMGetTabViewItemLabel(WMTabViewItem *item); void WMSetTabViewItemView(WMTabViewItem *item, WMView *view); -WMView *WMGetTabViewItemView(WMTabViewItem *item); +WMView* WMGetTabViewItemView(WMTabViewItem *item); void WMDestroyTabViewItem(WMTabViewItem *item); /* ....................................................................... */ -WMBox *WMCreateBox(WMWidget *parent); +WMBox* WMCreateBox(WMWidget *parent); void WMSetBoxBorderWidth(WMBox *box, unsigned width); @@ -1718,19 +1729,19 @@ int WMRunAlertPanel(WMScreen *app, WMWindow *owner, char *title, char *msg, char *otherButton); /* you can free the returned string */ -char *WMRunInputPanel(WMScreen *app, WMWindow *owner, char *title, char *msg, +char* WMRunInputPanel(WMScreen *app, WMWindow *owner, char *title, char *msg, char *defaultText, char *okButton, char *cancelButton); -WMAlertPanel *WMCreateAlertPanel(WMScreen *app, WMWindow *owner, char *title, +WMAlertPanel* WMCreateAlertPanel(WMScreen *app, WMWindow *owner, char *title, char *msg, char *defaultButton, char *alternateButton, char *otherButton); -WMInputPanel *WMCreateInputPanel(WMScreen *app, WMWindow *owner, char *title, +WMInputPanel* WMCreateInputPanel(WMScreen *app, WMWindow *owner, char *title, char *msg, char *defaultText, char *okButton, char *cancelButton); -WMGenericPanel *WMCreateGenericPanel(WMScreen *scrPtr, WMWindow *owner, +WMGenericPanel* WMCreateGenericPanel(WMScreen *scrPtr, WMWindow *owner, char *title, char *defaultButton, char *alternateButton); @@ -1743,9 +1754,9 @@ void WMDestroyGenericPanel(WMGenericPanel *panel); /* ....................................................................... */ /* only 1 instance per WMScreen */ -WMOpenPanel *WMGetOpenPanel(WMScreen *scrPtr); +WMOpenPanel* WMGetOpenPanel(WMScreen *scrPtr); -WMSavePanel *WMGetSavePanel(WMScreen *scrPtr); +WMSavePanel* WMGetSavePanel(WMScreen *scrPtr); void WMSetFilePanelCanChooseDirectories(WMFilePanel *panel, Bool flag); @@ -1756,7 +1767,7 @@ void WMSetFilePanelAutoCompletion(WMFilePanel *panel, Bool flag); void WMSetFilePanelDirectory(WMFilePanel *panel, char *path); /* you can free the returned string */ -char *WMGetFilePanelFileName(WMFilePanel *panel); +char* WMGetFilePanelFileName(WMFilePanel *panel); void WMFreeFilePanel(WMFilePanel *panel); @@ -1765,13 +1776,13 @@ int WMRunModalFilePanelForDirectory(WMFilePanel *panel, WMWindow *owner, void WMSetFilePanelAccessoryView(WMFilePanel *panel, WMView *view); -WMView *WMGetFilePanelAccessoryView(WMFilePanel *panel); +WMView* WMGetFilePanelAccessoryView(WMFilePanel *panel); /* ...................................................................... */ /* only 1 instance per WMScreen */ -WMFontPanel *WMGetFontPanel(WMScreen *scr); +WMFontPanel* WMGetFontPanel(WMScreen *scr); void WMShowFontPanel(WMFontPanel *panel); @@ -1780,9 +1791,9 @@ void WMHideFontPanel(WMFontPanel *panel); void WMSetFontPanelFont(WMFontPanel *panel, WMFont *font); /* you can free the returned string */ -char *WMGetFontPanelFontName(WMFontPanel *panel); +char* WMGetFontPanelFontName(WMFontPanel *panel); -WMFont *WMGetFontPanelFont(WMFontPanel *panel); +WMFont* WMGetFontPanelFont(WMFontPanel *panel); #ifdef __cplusplus } diff --git a/WINGs/WINGs/WINGsP.h b/WINGs/WINGs/WINGsP.h index 5916320b..2ec68e6d 100644 --- a/WINGs/WINGs/WINGsP.h +++ b/WINGs/WINGs/WINGsP.h @@ -136,7 +136,8 @@ typedef struct W_Screen { W_FocusInfo *focusInfo; - struct W_Pixmap *applicationIcon; + RImage *applicationIconImage; /* image (can have alpha channel) */ + struct W_Pixmap *applicationIconPixmap; /* pixmap - no alpha channel */ Window applicationIconWindow; struct W_Window *windowList; /* list of windows in the app */ diff --git a/WINGs/wappresource.c b/WINGs/wappresource.c index de413893..b8f15268 100644 --- a/WINGs/wappresource.c +++ b/WINGs/wappresource.c @@ -27,16 +27,16 @@ extern struct W_Application WMApplication; void WMSetApplicationIconWindow(WMScreen *scr, Window window) -{ +{ scr->applicationIconWindow = window; - + if (scr->groupLeader) { XWMHints *hints; hints = XGetWMHints(scr->display, scr->groupLeader); hints->flags |= IconWindowHint; hints->icon_window = window; - + XSetWMHints(scr->display, scr->groupLeader, hints); XFree(hints); } @@ -44,21 +44,52 @@ WMSetApplicationIconWindow(WMScreen *scr, Window window) void -WMSetApplicationIconImage(WMScreen *scr, WMPixmap *icon) -{ - if (scr->applicationIcon) - WMReleasePixmap(scr->applicationIcon); - - scr->applicationIcon = WMRetainPixmap(icon); - +WMSetApplicationIconImage(WMScreen *scr, RImage *image) +{ + WMPixmap *icon; + + if (scr->applicationIconImage == image) + return; + + if (scr->applicationIconImage) + RReleaseImage(scr->applicationIconImage); + + scr->applicationIconImage = RRetainImage(image); + + /* TODO: check whether we should set the pixmap only if there's none yet */ + if (image!=NULL && (icon=WMCreatePixmapFromRImage(scr, image, 128))!=NULL) { + WMSetApplicationIconPixmap(scr, icon); + WMReleasePixmap(icon); + } +} + + +RImage* +WMGetApplicationIconImage(WMScreen *scr) +{ + return scr->applicationIconImage; +} + + +void +WMSetApplicationIconPixmap(WMScreen *scr, WMPixmap *icon) +{ + if (scr->applicationIconPixmap == icon) + return; + + if (scr->applicationIconPixmap) + WMReleasePixmap(scr->applicationIconPixmap); + + scr->applicationIconPixmap = WMRetainPixmap(icon); + if (scr->groupLeader) { XWMHints *hints; hints = XGetWMHints(scr->display, scr->groupLeader); hints->flags |= IconPixmapHint|IconMaskHint; - hints->icon_pixmap = icon->pixmap; - hints->icon_mask = icon->mask; - + hints->icon_pixmap = (icon!=NULL ? icon->pixmap : None); + hints->icon_mask = (icon!=NULL ? icon->mask : None); + XSetWMHints(scr->display, scr->groupLeader, hints); XFree(hints); } @@ -66,9 +97,35 @@ WMSetApplicationIconImage(WMScreen *scr, WMPixmap *icon) WMPixmap* -WMGetApplicationIconImage(WMScreen *scr) +WMGetApplicationIconPixmap(WMScreen *scr) { - return scr->applicationIcon; + return scr->applicationIconPixmap; +} + + +WMPixmap* +WMGetApplicationIconBlendedPixmap(WMScreen *scr, RColor *color) +{ + WMPixmap *pix; + + if (scr->applicationIconImage) { + RColor gray; + + gray.red = 0xae; + gray.green = 0xaa; + gray.blue = 0xae; + gray.alpha = 0; + + if (!color) + color = &gray; + + pix = WMCreateBlendedPixmapFromRImage(scr, scr->applicationIconImage, + color); + } else { + pix = NULL; + } + + return pix; } @@ -104,12 +161,17 @@ W_InitApplication(WMScreen *scr) hints->flags = WindowGroupHint; hints->window_group = leader; - if (scr->applicationIcon) { - hints->flags |= IconPixmapHint; - hints->icon_pixmap = scr->applicationIcon->pixmap; - if (scr->applicationIcon->mask) { + /* This code will never actually be reached, because to have + * scr->applicationIconPixmap set we need to have a screen first, + * but this function is called in the screen creation process. + * -Dan + */ + if (scr->applicationIconPixmap) { + hints->flags |= IconPixmapHint; + hints->icon_pixmap = scr->applicationIconPixmap->pixmap; + if (scr->applicationIconPixmap->mask) { hints->flags |= IconMaskHint; - hints->icon_mask = scr->applicationIcon->mask; + hints->icon_mask = scr->applicationIconPixmap->mask; } } diff --git a/WINGs/wcolorpanel.c b/WINGs/wcolorpanel.c index 3d7df1db..ddb6c9dc 100644 --- a/WINGs/wcolorpanel.c +++ b/WINGs/wcolorpanel.c @@ -604,7 +604,7 @@ makeColorPanel(WMScreen *scrPtr, char *name) image = RRenderGradient(141, 16, &from, &to, RGRD_HORIZONTAL); pixmap = WMCreatePixmapFromRImage(scrPtr, image, 0); - RDestroyImage(image); + RReleaseImage(image); if (pixmap) W_PaintText(W_VIEW(panel->grayBrightnessS), pixmap->pixmap, @@ -680,7 +680,7 @@ makeColorPanel(WMScreen *scrPtr, char *name) image = RRenderGradient(141, 16, &from, &to, RGRD_HORIZONTAL); pixmap = WMCreatePixmapFromRImage(scrPtr, image, 0); - RDestroyImage(image); + RReleaseImage(image); if (pixmap) W_PaintText(W_VIEW(panel->rgbRedS), pixmap->pixmap, panel->font12, @@ -713,7 +713,7 @@ makeColorPanel(WMScreen *scrPtr, char *name) image = RRenderGradient(141, 16, &from, &to, RGRD_HORIZONTAL); pixmap = WMCreatePixmapFromRImage(scrPtr, image, 0); - RDestroyImage(image); + RReleaseImage(image); if (pixmap) W_PaintText(W_VIEW(panel->rgbGreenS), pixmap->pixmap, panel->font12, @@ -747,7 +747,7 @@ makeColorPanel(WMScreen *scrPtr, char *name) image = RRenderGradient(141, 16, &from, &to, RGRD_HORIZONTAL); pixmap = WMCreatePixmapFromRImage(scrPtr, image, 0); - RDestroyImage(image); + RReleaseImage(image); if (pixmap) W_PaintText(W_VIEW(panel->rgbBlueS), pixmap->pixmap, panel->font12, @@ -807,7 +807,7 @@ makeColorPanel(WMScreen *scrPtr, char *name) image = RRenderGradient(141, 16, &from, &to, RGRD_HORIZONTAL); pixmap = WMCreatePixmapFromRImage(scrPtr, image, 0); - RDestroyImage(image); + RReleaseImage(image); if (pixmap) W_PaintText(W_VIEW(panel->cmykCyanS), pixmap->pixmap, panel->font12, @@ -841,7 +841,7 @@ makeColorPanel(WMScreen *scrPtr, char *name) image = RRenderGradient(141, 16, &from, &to, RGRD_HORIZONTAL); pixmap = WMCreatePixmapFromRImage(scrPtr, image, 0); - RDestroyImage(image); + RReleaseImage(image); if (pixmap) W_PaintText(W_VIEW(panel->cmykMagentaS), pixmap->pixmap, panel->font12, @@ -875,7 +875,7 @@ makeColorPanel(WMScreen *scrPtr, char *name) image = RRenderGradient(141, 16, &from, &to, RGRD_HORIZONTAL); pixmap = WMCreatePixmapFromRImage(scrPtr, image, 0); - RDestroyImage(image); + RReleaseImage(image); if (pixmap) W_PaintText(W_VIEW(panel->cmykYellowS), pixmap->pixmap, panel->font12, @@ -910,7 +910,7 @@ makeColorPanel(WMScreen *scrPtr, char *name) image = RRenderGradient(141, 16, &from, &to, RGRD_HORIZONTAL); pixmap = WMCreatePixmapFromRImage(scrPtr, image, 0); - RDestroyImage(image); + RReleaseImage(image); if (pixmap) W_PaintText(W_VIEW(panel->cmykBlackS), pixmap->pixmap, panel->font12, @@ -1175,7 +1175,7 @@ WMFreeColorPanel(WMColorPanel *panel) XFreePixmap(scr->display, panel->selectionImg); if (panel->selectionBackImg) XFreePixmap(scr->display, panel->selectionBackImg); - RDestroyImage(panel->customPaletteImg); + RReleaseImage(panel->customPaletteImg); /* structs */ if (panel->lastBrowseDir) @@ -2202,7 +2202,7 @@ wheelRender(W_ColorPanel *panel) XFreePixmap(scr->display, panel->wheelImg); RConvertImage(scr->rcontext, image, &panel->wheelImg); - RDestroyImage(image); + RReleaseImage(image); /* Check if backimage exists. If it doesn't, allocate and fill it */ if (!panel->selectionBackImg) { @@ -2477,7 +2477,7 @@ wheelUpdateBrightnessGradient(W_ColorPanel *panel, CPColor topColor) sliderImg = RRenderGradient(16, 153, &(topColor.rgb), &to, RGRD_VERTICAL); sliderPxmp = WMCreatePixmapFromRImage(WMWidgetScreen(panel->win), sliderImg, 0); - RDestroyImage(sliderImg); + RReleaseImage(sliderImg); WMSetSliderImage(panel->wheelBrightnessS, sliderPxmp); WMReleasePixmap(sliderPxmp); } @@ -2823,7 +2823,7 @@ hsbUpdateBrightnessGradient(W_ColorPanel *panel) sliderImg = RRenderGradient(141, 16, &from, &(to.rgb), RGRD_HORIZONTAL); sliderPxmp = WMCreatePixmapFromRImage(scr, sliderImg, 0); - RDestroyImage(sliderImg); + RReleaseImage(sliderImg); if (sliderPxmp) W_PaintText(W_VIEW(panel->hsbBrightnessS), sliderPxmp->pixmap, @@ -2858,7 +2858,7 @@ hsbUpdateSaturationGradient(W_ColorPanel *panel) sliderImg = RRenderGradient(141, 16, &(from.rgb), &(to.rgb), RGRD_HORIZONTAL); sliderPxmp = WMCreatePixmapFromRImage(scr, sliderImg, 0); - RDestroyImage(sliderImg); + RReleaseImage(sliderImg); if (sliderPxmp) W_PaintText(W_VIEW(panel->hsbSaturationS), sliderPxmp->pixmap, @@ -2894,7 +2894,7 @@ hsbUpdateHueGradient(W_ColorPanel *panel) sliderImg = RRenderMultiGradient(141, 16, colors, RGRD_HORIZONTAL); sliderPxmp = WMCreatePixmapFromRImage(scr, sliderImg, 0); - RDestroyImage(sliderImg); + RReleaseImage(sliderImg); if (sliderPxmp) W_PaintText(W_VIEW(panel->hsbHueS), sliderPxmp->pixmap, @@ -2948,7 +2948,7 @@ customRenderSpectrum(W_ColorPanel *panel) } } if (panel->customPaletteImg) { - RDestroyImage(panel->customPaletteImg); + RReleaseImage(panel->customPaletteImg); panel->customPaletteImg = NULL; } panel->customPaletteImg = spectrum; @@ -2969,7 +2969,7 @@ customSetPalette(W_ColorPanel *panel) scaledImg = RScaleImage(panel->customPaletteImg, customPaletteWidth, customPaletteHeight); RConvertImage(scr->rcontext, scaledImg, &image); - RDestroyImage(scaledImg); + RReleaseImage(scaledImg); XCopyArea(scr->display, image, panel->customPaletteContentView->window, scr->copyGC, 0, 0, customPaletteWidth, customPaletteHeight, 0, 0); @@ -3195,7 +3195,7 @@ customPaletteMenuNewFromFile(W_ColorPanel *panel) tmpImg = RLoadImage(scr->rcontext, filepath, 0); if (tmpImg) { if (panel->customPaletteImg) - RDestroyImage(panel->customPaletteImg); + RReleaseImage(panel->customPaletteImg); panel->customPaletteImg = tmpImg; customSetPalette(panel); @@ -3399,7 +3399,7 @@ customPaletteHistoryCallback(WMWidget *w, void *data) tmp = RLoadImage(scr->rcontext, filename, 0); if (tmp) { if (panel->customPaletteImg) { - RDestroyImage(panel->customPaletteImg); + RReleaseImage(panel->customPaletteImg); panel->customPaletteImg = NULL; } panel->customPaletteImg = tmp; diff --git a/WINGs/wfilepanel.c b/WINGs/wfilepanel.c index 03ebd714..1bde060a 100644 --- a/WINGs/wfilepanel.c +++ b/WINGs/wfilepanel.c @@ -179,7 +179,8 @@ makeFilePanel(WMScreen *scrPtr, char *name, char *title) { WMFilePanel *fPtr; WMFont *largeFont; - + WMPixmap *icon; + fPtr = wmalloc(sizeof(WMFilePanel)); memset(fPtr, 0, sizeof(WMFilePanel)); @@ -197,7 +198,13 @@ makeFilePanel(WMScreen *scrPtr, char *name, char *title) WMResizeWidget(fPtr->iconLabel, 64, 64); WMMoveWidget(fPtr->iconLabel, 0, 0); WMSetLabelImagePosition(fPtr->iconLabel, WIPImageOnly); - WMSetLabelImage(fPtr->iconLabel, scrPtr->applicationIcon); + icon = WMGetApplicationIconBlendedPixmap(scrPtr, (RColor*)NULL); + if (icon) { + WMSetLabelImage(fPtr->iconLabel, icon); + WMReleasePixmap(icon); + } else { + WMSetLabelImage(fPtr->iconLabel, scrPtr->applicationIconPixmap); + } fPtr->titleLabel = WMCreateLabel(fPtr->win); WMResizeWidget(fPtr->titleLabel, PWIDTH-64, 64); diff --git a/WINGs/widgets.c b/WINGs/widgets.c index dda50776..489782eb 100644 --- a/WINGs/widgets.c +++ b/WINGs/widgets.c @@ -419,85 +419,85 @@ loadPixmaps(WMScreen *scr) tmp = RGetSubImage(image, 0, 0, 24, 24); RCombineImageWithColor(tmp, &gray); scr->homeIcon = WMCreatePixmapFromRImage(scr, tmp, 128); - RDestroyImage(tmp); + RReleaseImage(tmp); /* make it have a white background */ tmp = RGetSubImage(image, 0, 0, 24, 24); RCombineImageWithColor(tmp, &white); scr->altHomeIcon = WMCreatePixmapFromRImage(scr, tmp, 128); - RDestroyImage(tmp); + RReleaseImage(tmp); /* trash can */ tmp = RGetSubImage(image, 104, 0, 24, 24); RCombineImageWithColor(tmp, &white); scr->trashcanIcon = WMCreatePixmapFromRImage(scr, tmp, 128); - RDestroyImage(tmp); + RReleaseImage(tmp); tmp = RGetSubImage(image, 104, 0, 24, 24); RCombineImageWithColor(tmp, &white); scr->altTrashcanIcon = WMCreatePixmapFromRImage(scr, tmp, 128); - RDestroyImage(tmp); + RReleaseImage(tmp); /* create dir */ tmp = RGetSubImage(image, 104, 24, 24, 24); RCombineImageWithColor(tmp, &white); scr->createDirIcon = WMCreatePixmapFromRImage(scr, tmp, 128); - RDestroyImage(tmp); + RReleaseImage(tmp); tmp = RGetSubImage(image, 104, 24, 24, 24); RCombineImageWithColor(tmp, &white); scr->altCreateDirIcon = WMCreatePixmapFromRImage(scr, tmp, 128); - RDestroyImage(tmp); + RReleaseImage(tmp); /* diskettes */ tmp = RGetSubImage(image, 24, 80, 24, 24); RCombineImageWithColor(tmp, &white); scr->disketteIcon = WMCreatePixmapFromRImage(scr, tmp, 128); - RDestroyImage(tmp); + RReleaseImage(tmp); tmp = RGetSubImage(image, 24, 80, 24, 24); RCombineImageWithColor(tmp, &white); scr->altDisketteIcon = WMCreatePixmapFromRImage(scr, tmp, 128); - RDestroyImage(tmp); + RReleaseImage(tmp); /* unmount */ tmp = RGetSubImage(image, 0, 80, 24, 24); RCombineImageWithColor(tmp, &white); scr->unmountIcon = WMCreatePixmapFromRImage(scr, tmp, 128); - RDestroyImage(tmp); + RReleaseImage(tmp); tmp = RGetSubImage(image, 0, 80, 24, 24); RCombineImageWithColor(tmp, &white); scr->altUnmountIcon = WMCreatePixmapFromRImage(scr, tmp, 128); - RDestroyImage(tmp); + RReleaseImage(tmp); /* Magnifying Glass Icon for ColorPanel */ tmp = RGetSubImage(image, 24, 0, 40, 32); RCombineImageWithColor(tmp, &gray); scr->magnifyIcon = WMCreatePixmapFromRImage(scr, tmp, 128); - RDestroyImage(tmp); + RReleaseImage(tmp); /* ColorWheel Icon for ColorPanel */ tmp = RGetSubImage(image, 0, 25, 24, 24); scr->wheelIcon = WMCreatePixmapFromRImage(scr, tmp, 128); - RDestroyImage(tmp); + RReleaseImage(tmp); /* GrayScale Icon for ColorPanel */ tmp = RGetSubImage(image, 65, 0, 40, 24); scr->grayIcon = WMCreatePixmapFromRImage(scr, tmp, 128); - RDestroyImage(tmp); + RReleaseImage(tmp); /* RGB Icon for ColorPanel */ tmp = RGetSubImage(image, 25, 33, 40, 24); scr->rgbIcon = WMCreatePixmapFromRImage(scr, tmp, 128); - RDestroyImage(tmp); + RReleaseImage(tmp); /* CMYK Icon for ColorPanel */ tmp = RGetSubImage(image, 65, 25, 40, 24); scr->cmykIcon = WMCreatePixmapFromRImage(scr, tmp, 128); - RDestroyImage(tmp); + RReleaseImage(tmp); /* HSB Icon for ColorPanel */ tmp = RGetSubImage(image, 0, 57, 40, 24); scr->hsbIcon = WMCreatePixmapFromRImage(scr, tmp, 128); - RDestroyImage(tmp); + RReleaseImage(tmp); /* CustomColorPalette Icon for ColorPanel */ tmp = RGetSubImage(image, 81, 57, 40, 24); scr->customPaletteIcon = WMCreatePixmapFromRImage(scr, tmp, 128); - RDestroyImage(tmp); + RReleaseImage(tmp); /* ColorList Icon for ColorPanel */ tmp = RGetSubImage(image, 41, 57, 40, 24); scr->colorListIcon = WMCreatePixmapFromRImage(scr, tmp, 128); - RDestroyImage(tmp); + RReleaseImage(tmp); - RDestroyImage(image); + RReleaseImage(image); #if 0 scr->defaultObjectIcon = diff --git a/WINGs/wpanel.c b/WINGs/wpanel.c index 102b04be..2938c383 100644 --- a/WINGs/wpanel.c +++ b/WINGs/wpanel.c @@ -103,8 +103,9 @@ WMCreateAlertPanel(WMScreen *scrPtr, WMWindow *owner, WMAlertPanel *panel; int dw=0, aw=0, ow=0, w; WMBox *hbox; - - + WMPixmap *icon; + + panel = wmalloc(sizeof(WMAlertPanel)); memset(panel, 0, sizeof(WMAlertPanel)); @@ -137,9 +138,12 @@ WMCreateAlertPanel(WMScreen *scrPtr, WMWindow *owner, WMSetLabelImagePosition(panel->iLbl, WIPImageOnly); WMMapWidget(panel->iLbl); WMAddBoxSubview(hbox, WMWidgetView(panel->iLbl), False, True, 64, 0, 10); - - if (scrPtr->applicationIcon) { - WMSetLabelImage(panel->iLbl, scrPtr->applicationIcon); + icon = WMGetApplicationIconBlendedPixmap(scrPtr, (RColor*)NULL); + if (icon) { + WMSetLabelImage(panel->iLbl, icon); + WMReleasePixmap(icon); + } else { + WMSetLabelImage(panel->iLbl, scrPtr->applicationIconPixmap); } if (title) { @@ -521,8 +525,9 @@ WMCreateGenericPanel(WMScreen *scrPtr, WMWindow *owner, WMGenericPanel *panel; int dw=0, aw=0, w; WMBox *hbox; - - + WMPixmap *icon; + + panel = wmalloc(sizeof(WMGenericPanel)); memset(panel, 0, sizeof(WMGenericPanel)); @@ -555,9 +560,12 @@ WMCreateGenericPanel(WMScreen *scrPtr, WMWindow *owner, WMSetLabelImagePosition(panel->iLbl, WIPImageOnly); WMMapWidget(panel->iLbl); WMAddBoxSubview(hbox, WMWidgetView(panel->iLbl), False, True, 64, 0, 10); - - if (scrPtr->applicationIcon) { - WMSetLabelImage(panel->iLbl, scrPtr->applicationIcon); + icon = WMGetApplicationIconBlendedPixmap(scrPtr, (RColor*)NULL); + if (icon) { + WMSetLabelImage(panel->iLbl, icon); + WMReleasePixmap(icon); + } else { + WMSetLabelImage(panel->iLbl, scrPtr->applicationIconPixmap); } if (title) { diff --git a/WINGs/wpixmap.c b/WINGs/wpixmap.c index a879a463..cecfc82c 100644 --- a/WINGs/wpixmap.c +++ b/WINGs/wpixmap.c @@ -36,10 +36,7 @@ WMCreatePixmap(WMScreen *scrPtr, int width, int height, int depth, Bool masked) { WMPixmap *pixPtr; - pixPtr = malloc(sizeof(WMPixmap)); - if (!pixPtr) { - return NULL; - } + pixPtr = wmalloc(sizeof(WMPixmap)); pixPtr->screen = scrPtr; pixPtr->width = width; pixPtr->height = height; @@ -65,10 +62,7 @@ WMCreatePixmapFromXPixmaps(WMScreen *scrPtr, Pixmap pixmap, Pixmap mask, { WMPixmap *pixPtr; - pixPtr = malloc(sizeof(WMPixmap)); - if (!pixPtr) { - return NULL; - } + pixPtr = wmalloc(sizeof(WMPixmap)); pixPtr->screen = scrPtr; pixPtr->pixmap = pixmap; pixPtr->mask = mask; @@ -81,8 +75,6 @@ WMCreatePixmapFromXPixmaps(WMScreen *scrPtr, Pixmap pixmap, Pixmap mask, } - - WMPixmap* WMCreatePixmapFromFile(WMScreen *scrPtr, char *fileName) { @@ -95,7 +87,7 @@ WMCreatePixmapFromFile(WMScreen *scrPtr, char *fileName) pixPtr = WMCreatePixmapFromRImage(scrPtr, image, 127); - RDestroyImage(image); + RReleaseImage(image); return pixPtr; } @@ -112,10 +104,7 @@ WMCreatePixmapFromRImage(WMScreen *scrPtr, RImage *image, int threshold) return NULL; } - pixPtr = malloc(sizeof(WMPixmap)); - if (!pixPtr) { - return NULL; - } + pixPtr = wmalloc(sizeof(WMPixmap)); pixPtr->screen = scrPtr; pixPtr->pixmap = pixmap; pixPtr->mask = mask; @@ -135,9 +124,12 @@ WMCreateBlendedPixmapFromRImage(WMScreen *scrPtr, RImage *image, RColor *color) RImage *copy; copy = RCloneImage(image); + if (!copy) + return NULL; + RCombineImageWithColor(copy, color); pixPtr = WMCreatePixmapFromRImage(scrPtr, copy, 0); - RDestroyImage(copy); + RReleaseImage(copy); return pixPtr; } @@ -158,7 +150,7 @@ WMCreateBlendedPixmapFromFile(WMScreen *scrPtr, char *fileName, RColor *color) pixPtr = WMCreatePixmapFromRImage(scrPtr, image, 0); - RDestroyImage(image); + RReleaseImage(image); return pixPtr; } @@ -176,7 +168,7 @@ WMCreatePixmapFromXPMData(WMScreen *scrPtr, char **data) pixPtr = WMCreatePixmapFromRImage(scrPtr, image, 127); - RDestroyImage(image); + RReleaseImage(image); return pixPtr; } diff --git a/WINGs/wwindow.c b/WINGs/wwindow.c index 60e130c7..6f773f82 100644 --- a/WINGs/wwindow.c +++ b/WINGs/wwindow.c @@ -563,7 +563,7 @@ WMSetWindowDocumentEdited(WMWindow *win, Bool flag) void -WMSetWindowMiniwindowImage(WMWindow *win, WMPixmap *pixmap) +WMSetWindowMiniwindowPixmap(WMWindow *win, WMPixmap *pixmap) { if ((win->miniImage && !pixmap) || (!win->miniImage && pixmap)) { if (win->miniImage) diff --git a/WPrefs.app/Appearance.c b/WPrefs.app/Appearance.c index 65c715f9..86ea0485 100644 --- a/WPrefs.app/Appearance.c +++ b/WPrefs.app/Appearance.c @@ -618,12 +618,12 @@ renderTexture(WMScreen *scr, proplist_t texture, int width, int height, grad = RRenderGradient(width, height, &rcolor, &rcolor2, style); image = RMakeTiledImage(timage, width, height); - RDestroyImage(timage); + RReleaseImage(timage); i = atoi(PLGetString(PLGetArrayElement(texture, 2))); RCombineImagesWithOpaqueness(image, grad, i); - RDestroyImage(grad); + RReleaseImage(grad); } } else if (strcasecmp(&type[2], "gradient")==0 && toupper(type[0])=='M') { int style; @@ -681,18 +681,18 @@ renderTexture(WMScreen *scr, proplist_t texture, int width, int height, switch (toupper(type[0])) { case 'T': image = RMakeTiledImage(timage, width, height); - RDestroyImage(timage); + RReleaseImage(timage); timage = image; break; case 'C': image = RMakeCenteredImage(timage, width, height, &color); - RDestroyImage(timage); + RReleaseImage(timage); timage = image; break; case 'S': case 'M': image = RScaleImage(timage, width, height); - RDestroyImage(timage); + RReleaseImage(timage); timage = image; break; } @@ -720,7 +720,7 @@ renderTexture(WMScreen *scr, proplist_t texture, int width, int height, } RConvertImage(rc, image, &pixmap); - RDestroyImage(image); + RReleaseImage(image); return pixmap; } @@ -1363,7 +1363,7 @@ loadRImage(WMScreen *scr, char *path) fclose(f); RConvertImage(WMScreenRContext(scr), image, &pixmap); - RDestroyImage(image); + RReleaseImage(image); return pixmap; } diff --git a/WPrefs.app/Configurations.c b/WPrefs.app/Configurations.c index b691a670..e4c0d459 100644 --- a/WPrefs.app/Configurations.c +++ b/WPrefs.app/Configurations.c @@ -163,7 +163,7 @@ createImages(WMScreen *scr, RContext *rc, RImage *xis, char *file, if (!(*icon2 = WMCreatePixmapFromRImage(scr, icon, 127))) wwarning(_("could not process icon %s:"), file, RMessageForError(RErrorCode)); } - RDestroyImage(icon); + RReleaseImage(icon); wfree(path); } @@ -287,7 +287,7 @@ createPanel(Panel *p) scaled = RScaleImage(image, 61, 61); icon = WMCreatePixmapFromRImage(scr, scaled, 128); - RDestroyImage(scaled); + RReleaseImage(scaled); if (icon) { WMSetButtonImage(panel->smoB, icon); WMReleasePixmap(icon); @@ -295,13 +295,13 @@ createPanel(Panel *p) scaled = RSmoothScaleImage(image, 61, 61); icon = WMCreatePixmapFromRImage(scr, scaled, 128); - RDestroyImage(scaled); + RReleaseImage(scaled); if (icon) { WMSetButtonAltImage(panel->smoB, icon); WMReleasePixmap(icon); } - RDestroyImage(image); + RReleaseImage(image); } WMMapSubwidgets(panel->smoF); @@ -471,7 +471,7 @@ createPanel(Panel *p) WMMapSubwidgets(panel->box); if (xis) - RDestroyImage(xis); + RReleaseImage(xis); WMReleaseFont(font); showData(panel); diff --git a/WPrefs.app/TexturePanel.c b/WPrefs.app/TexturePanel.c index 04e652d8..b5793955 100644 --- a/WPrefs.app/TexturePanel.c +++ b/WPrefs.app/TexturePanel.c @@ -173,21 +173,21 @@ updateGradButtons(TexturePanel *panel) image = RRenderMultiGradient(80, 30, colors, RHorizontalGradient); pixmap = WMCreatePixmapFromRImage(WMWidgetScreen(panel->gcolL), image, 128); - RDestroyImage(image); + RReleaseImage(image); WMSetButtonImage(panel->dirhB, pixmap); WMReleasePixmap(pixmap); image = RRenderMultiGradient(80, 30, colors, RVerticalGradient); pixmap = WMCreatePixmapFromRImage(WMWidgetScreen(panel->gcolL), image, 128); - RDestroyImage(image); + RReleaseImage(image); WMSetButtonImage(panel->dirvB, pixmap); WMReleasePixmap(pixmap); image = RRenderMultiGradient(80, 30, colors, RDiagonalGradient); pixmap = WMCreatePixmapFromRImage(WMWidgetScreen(panel->gcolL), image, 128); - RDestroyImage(image); + RReleaseImage(image); WMSetButtonImage(panel->dirdB, pixmap); WMReleasePixmap(pixmap); @@ -238,14 +238,14 @@ updateTGradImage(TexturePanel *panel) RCombineImagesWithOpaqueness(image, gradient, WMGetSliderValue(panel->topaS)); - RDestroyImage(gradient); + RReleaseImage(gradient); pixmap = WMCreatePixmapFromRImage(WMWidgetScreen(panel->win), image, 128); WMSetLabelImage(panel->imageL, pixmap); WMReleasePixmap(pixmap); WMResizeWidget(panel->imageL, image->width, image->height); - RDestroyImage(image); + RReleaseImage(image); } @@ -271,21 +271,21 @@ updateSGradButtons(TexturePanel *panel) image = RRenderGradient(80, 30, &from, &to, RHorizontalGradient); pixmap = WMCreatePixmapFromRImage(WMWidgetScreen(panel->gcolL), image, 128); - RDestroyImage(image); + RReleaseImage(image); WMSetButtonImage(panel->dirhB, pixmap); WMReleasePixmap(pixmap); image = RRenderGradient(80, 30, &from, &to, RVerticalGradient); pixmap = WMCreatePixmapFromRImage(WMWidgetScreen(panel->gcolL), image, 128); - RDestroyImage(image); + RReleaseImage(image); WMSetButtonImage(panel->dirvB, pixmap); WMReleasePixmap(pixmap); image = RRenderGradient(80, 30, &from, &to, RDiagonalGradient); pixmap = WMCreatePixmapFromRImage(WMWidgetScreen(panel->gcolL), image, 128); - RDestroyImage(image); + RReleaseImage(image); WMSetButtonImage(panel->dirdB, pixmap); WMReleasePixmap(pixmap); } @@ -316,7 +316,7 @@ updateSVSlider(WMSlider *sPtr, Bool saturation, WMFont *font, RHSVColor *hsv) } image = RRenderGradient(130, 16, &from, &to, RHorizontalGradient); pixmap = WMCreatePixmapFromRImage(scr, image, 128); - RDestroyImage(image); + RReleaseImage(image); if (hsv->value < 128 || !saturation) { WMColor *col = WMWhiteColor(scr); @@ -358,7 +358,7 @@ updateHueSlider(WMSlider *sPtr, WMFont *font, RHSVColor *hsv) image = RRenderMultiGradient(130, 16, colors, RGRD_HORIZONTAL); pixmap = WMCreatePixmapFromRImage(scr, image, 128); - RDestroyImage(image); + RReleaseImage(image); if (hsv->value < 128) { WMColor *col = WMWhiteColor(scr); @@ -442,7 +442,7 @@ sliderChangeCallback(WMWidget *w, void *data) image = RRenderMultiGradient(30, i*WMGetListItemHeight(panel->gcolL), colors, RVerticalGradient); RConvertImage(WMScreenRContext(scr), image, &panel->gimage); - RDestroyImage(image); + RReleaseImage(image); wfree(colors); @@ -616,7 +616,7 @@ updateImage(TexturePanel *panel, char *path) WMSetButtonEnabled(panel->okB, True); if (panel->image) - RDestroyImage(panel->image); + RReleaseImage(panel->image); panel->image = image; } else { image = panel->image; diff --git a/WPrefs.app/WPrefs.c b/WPrefs.app/WPrefs.c index 7d1e3694..a2ceb4e8 100644 --- a/WPrefs.app/WPrefs.c +++ b/WPrefs.app/WPrefs.c @@ -261,7 +261,7 @@ createMainWindow(WMScreen *scr) WMSetWindowMaxSize(WPrefs.win, 520, 390); WMSetWindowMinSize(WPrefs.win, 520, 390); WMSetWindowMiniwindowTitle(WPrefs.win, "Preferences"); - WMSetWindowMiniwindowImage(WPrefs.win, WMGetApplicationIconImage(scr)); + WMSetWindowMiniwindowPixmap(WPrefs.win, WMGetApplicationIconPixmap(scr)); WPrefs.scrollV = WMCreateScrollView(WPrefs.win); WMResizeWidget(WPrefs.scrollV, 500, 87); @@ -670,9 +670,9 @@ Initialize(WMScreen *scr) RMessageForError(RErrorCode)); } else { icon = WMCreatePixmapFromRImage(scr, tmp, 0); - RDestroyImage(tmp); + RReleaseImage(tmp); if (icon) { - WMSetApplicationIconImage(scr, icon); + WMSetApplicationIconPixmap(scr, icon); WMReleasePixmap(icon); } } diff --git a/WPrefs.app/Workspace.c b/WPrefs.app/Workspace.c index 4a887942..2e4430c8 100644 --- a/WPrefs.app/Workspace.c +++ b/WPrefs.app/Workspace.c @@ -110,7 +110,7 @@ createImages(WMScreen *scr, RContext *rc, RImage *xis, char *file, *icon2 = NULL; } } - RDestroyImage(icon); + RReleaseImage(icon); } @@ -328,7 +328,7 @@ createPanel(Panel *p) WMMapSubwidgets(panel->dockF); if (xis) - RDestroyImage(xis); + RReleaseImage(xis); WMRealizeWidget(panel->box); WMMapSubwidgets(panel->box); diff --git a/plugins/libwmfun/fade.c b/plugins/libwmfun/fade.c index d0a5b266..36ae3ec1 100644 --- a/plugins/libwmfun/fade.c +++ b/plugins/libwmfun/fade.c @@ -22,6 +22,57 @@ * $Id$ * * $Log$ + * Revision 1.2 2001/04/21 07:12:30 dan + * For libwraster: + * --------------- + * + * - Added retain/release mechanism to RImage by adding RRetainImage() and + * RReleaseImage(). RDestroyImage() is an alias to RReleaseImage() now, but + * will be removed in a future release because it no longer fits with the + * semantics. Will be kept for a while to allow a smoother transition. + * More about in wrlib/NEWS + * + * + * For WINGs: + * ---------- + * + * - Small API change: + * 1. Renamed WMSetApplicationIconImage(), WMGetApplicationIconImage() and + * WMSetWindowMiniwindowImage() to respectively WMSetApplicationIconPixmap(), + * WMGetApplicationIconPixmap() and WMSetWindowMiniwindowPixmap() + * They operate on a WMPixmap which is practically an X Pixmap with no alpha + * channel information and the new name is more suggestive and also leaves + * room for the new functions added for operating on images with alpha info. + * 2. Added WMSetApplicationIconImage() and WMGetApplicationIconImage() which + * operate on an RImage and store alpha information too. + * 3. Added WMGetApplicationIconBlendedPixmap() which will take the image with + * alpha set by WMSetApplicationIconImage() and will blend it with a color. + * If color is NULL it will blend using the default panel color (#aeaaae) + * All these changes will allow WINGs to handle images with alpha blending + * correctly in panels and wherever else needed. More about in WINGs/NEWS. + * - updated panels to use the newly available RImages if present and fallback + * to old WMPixmaps if not, to properly show alpha blended images. + * - replaced some still left malloc's with wmalloc's. + * + * + * For Window Maker: + * ----------------- + * - Fixed wrong mapping position of the "Docked Applications Panel" for some + * icons. + * - Smoother animation for the smiley =) + * - Made images with alpha blending be shown correctly in the panels and the + * icon chooser. + * - The icon image set to be shown in panels ("Logo.WMPanel") will be + * automatically updated if its entry in WMWindowAttributes changes (without + * a need to restart as until now). + * + * + * *** Note!!! *** + * + * If you are developing applications with one of libwraster or libWINGs + * then you should look to wrlib/NEWS and WINGs/NEWS to see what changed + * and how should you update your code. + * * Revision 1.1 2000/12/03 18:58:41 id * initiate plugins branch * @@ -92,7 +143,7 @@ RImage *fade (int argc, char **argv, int width, int height, int relief) { this = (int *) malloc (width * sizeof (int)); last = (int *) malloc (width * sizeof (int)); if (!this || !last) { - RDestroyImage (image); + RReleaseImage (image); free (this); free (last); return (RImage *)0; diff --git a/src/defaults.c b/src/defaults.c index bdfec858..fbd62fc3 100644 --- a/src/defaults.c +++ b/src/defaults.c @@ -1122,8 +1122,24 @@ wDefaultsCheckDomains(void *foo) WDWindowAttributes->dictionary = dict; for (i=0; iwmscreen, image); + RReleaseImage(image); + } + } } } } else { @@ -2431,7 +2447,7 @@ getRImages(WScreen *scr, WDefaultEntry *entry, proplist_t value, } if (*(RImage**)addr) { - RDestroyImage(*(RImage**)addr); + RReleaseImage(*(RImage**)addr); } if (addr) *(RImage**)addr = image; @@ -2787,7 +2803,7 @@ setIconTile(WScreen *scr, WDefaultEntry *entry, WTexture **texture, void *foo) if (scr->icon_tile) { reset = 1; - RDestroyImage(scr->icon_tile); + RReleaseImage(scr->icon_tile); XFreePixmap(dpy, scr->icon_tile_pixmap); } @@ -2800,7 +2816,7 @@ setIconTile(WScreen *scr, WDefaultEntry *entry, WTexture **texture, void *foo) if (!wPreferences.flags.noclip) { if (scr->clip_tile) { - RDestroyImage(scr->clip_tile); + RReleaseImage(scr->clip_tile); } scr->clip_tile = wClipMakeTile(scr, img); } @@ -2969,7 +2985,7 @@ setClipTitleColor(WScreen *scr, WDefaultEntry *entry, XColor *color, long index) image = RRenderGradient(as+1, as+1, &color1, &color2, RDiagonalGradient); RConvertImage(scr->rcontext, image, &scr->clip_arrow_gradient); - RDestroyImage(image); + RReleaseImage(image); } #endif /* GRADIENT_CLIP_ARROW */ diff --git a/src/dialog.c b/src/dialog.c index 3c0b38ee..2bf425ae 100644 --- a/src/dialog.c +++ b/src/dialog.c @@ -364,12 +364,13 @@ drawIconProc(WMList *lPtr, int index, Drawable d, char *text, IconPanel *panel = WMGetHangedData(lPtr); GC gc = panel->scr->draw_gc; GC copygc = panel->scr->copy_gc; - char *buffer, *dirfile; + char *file, *dirfile; WMPixmap *pixmap; WMColor *blackcolor; WMColor *whitecolor; WMSize size; - WMScreen *wmscr=WMWidgetScreen(panel->win); + WMScreen *wmscr = WMWidgetScreen(panel->win); + RColor gray; int width; if(!panel->preview) return; @@ -380,12 +381,15 @@ drawIconProc(WMList *lPtr, int index, Drawable d, char *text, whitecolor = WMWhiteColor(wmscr); dirfile = wexpandpath(WMGetListSelectedItem(panel->dirList)->text); - buffer = wmalloc(strlen(dirfile)+strlen(text)+4); - sprintf(buffer, "%s/%s", dirfile, text); + file = wmalloc(strlen(dirfile)+strlen(text)+4); + sprintf(file, "%s/%s", dirfile, text); wfree(dirfile); - pixmap = WMCreatePixmapFromFile(WMWidgetScreen(panel->win), buffer); - wfree(buffer); + gray.red = 0xae; gray.green = 0xaa; + gray.blue = 0xae; gray.alpha = 0; + pixmap = WMCreateBlendedPixmapFromFile(wmscr, file, &gray); + wfree(file); + if (!pixmap) { WMRemoveListItem(lPtr, index); return; @@ -812,10 +816,10 @@ destroyInfoPanel(WCoreWindow *foo, void *data, XEvent *event) WMReleaseFont(thePanel->oldFont); } if (thePanel->icon) { - RDestroyImage(thePanel->icon); + RReleaseImage(thePanel->icon); } if (thePanel->pic) { - RDestroyImage(thePanel->pic); + RReleaseImage(thePanel->pic); } #endif /* SILLYNESS */ WMUnmapWidget(thePanel); @@ -915,12 +919,16 @@ XChangeKeyboardControl(dpy,KBBellPitch|KBBellDuration|KBBellPercent,&kc); } } else if (panel->cycle < 30) { RImage *image; - WMPixmap *pix; + WMPixmap *pix; + RColor gray; + + gray.red = 0xae; gray.green = 0xaa; + gray.blue = 0xae; gray.alpha = 0; image = RScaleImage(panel->icon, panel->pic->width, panel->pic->height); RCombineImagesWithOpaqueness(image, panel->pic, panel->cycle*255/30); - pix = WMCreatePixmapFromRImage(panel->scr->wmscreen, image, 128); - RDestroyImage(image); + pix = WMCreateBlendedPixmapFromRImage(panel->scr->wmscreen, image, &gray); + RReleaseImage(image); WMSetLabelImage(panel->logoL, pix); WMReleasePixmap(pix); } @@ -1080,53 +1088,32 @@ handleLogoPush(XEvent *event, void *data) if (!panel->timer && !broken && clicks > 0) { WMFont *font; - char *file; - char *path; panel->x = 0; clicks = 0; if (!panel->icon) { - file = wDefaultGetIconFile(panel->scr, "Logo", "WMPanel", False); - if (!file) { - broken = 1; - return; - } - - path = FindImage(wPreferences.icon_path, file); - if (!path) { - broken = 1; - return; - } - - panel->icon = RLoadImage(panel->scr->rcontext, path, 0); - wfree(path); + panel->icon = WMGetApplicationIconImage(panel->scr->wmscreen); if (!panel->icon) { broken = 1; return; - } + } else { + RColor color; + + color.red = 0xae; color.green = 0xaa; + color.blue = 0xae; color.alpha = 0; + + panel->icon = RCloneImage(panel->icon); + RCombineImageWithColor(panel->icon, &color); + } } if (!panel->pic) { panel->pic = RGetImageFromXPMData(panel->scr->rcontext, pic_data); if (!panel->pic) { broken = 1; - RDestroyImage(panel->icon); + RReleaseImage(panel->icon); panel->icon = NULL; - if (panel->pic) { - RDestroyImage(panel->pic); - panel->pic = NULL; - } return; } - - { - RColor color; - color.red = 0xae; - color.green = 0xaa; - color.blue = 0xae; - color.alpha = 255; - RCombineImageWithColor(panel->icon, &color); - RCombineImageWithColor(panel->pic, &color); - } } panel->str = msgs[rand()%(sizeof(msgs)/sizeof(char*))]; @@ -1215,7 +1202,10 @@ wShowInfoPanel(WScreen *scr) panel->win = WMCreateWindow(scr->wmscreen, "info"); WMResizeWidget(panel->win, 382, 230); - logo = WMGetApplicationIconImage(scr->wmscreen); + logo = WMGetApplicationIconBlendedPixmap(scr->wmscreen, (RColor*)NULL); + if (!logo) { + logo = WMRetainPixmap(WMGetApplicationIconPixmap(scr->wmscreen)); + } if (logo) { size = WMGetPixmapSize(logo); panel->logoL = WMCreateLabel(panel->win); @@ -1227,6 +1217,7 @@ wShowInfoPanel(WScreen *scr) WMCreateEventHandler(WMWidgetView(panel->logoL), ButtonPressMask, handleLogoPush, panel); #endif + WMReleasePixmap(logo); } panel->name1L = WMCreateLabel(panel->win); @@ -1605,13 +1596,12 @@ getWindowMakerIconImage(WMScreen *scr) path = FindImage(wPreferences.icon_path, PLGetString(value)); if (path) { - RImage *image; + RColor gray; - image = RLoadImage(WMScreenRContext(scr), path, 0); - if (image) { - pix = WMCreatePixmapFromRImage(scr, image, 0); - RDestroyImage(image); - } + gray.red = 0xae; gray.green = 0xaa; + gray.blue = 0xae; gray.alpha = 0; + + pix = WMCreateBlendedPixmapFromFile(scr, path, &gray); wfree(path); } } diff --git a/src/dockedapp.c b/src/dockedapp.c index cd51478c..caa28dd0 100644 --- a/src/dockedapp.c +++ b/src/dockedapp.c @@ -393,14 +393,14 @@ ShowDockAppSettingsPanel(WAppIcon *aicon) y = aicon->y_pos; if (y < 0) y = 0; - else if (y + PWIDTH > scr->scr_height) + else if (y + PHEIGHT > scr->scr_height) y = scr->scr_height - PHEIGHT - 30; if (aicon->dock && aicon->dock->type == WM_DOCK) { if (aicon->dock->on_right_side) x = scr->scr_width/2; else - x = scr->scr_width/2 - PWIDTH; + x = scr->scr_width/2 - PWIDTH - 2; } else { x = (scr->scr_width - PWIDTH)/2; } diff --git a/src/framewin.c b/src/framewin.c index b7868c69..57e1b400 100644 --- a/src/framewin.c +++ b/src/framewin.c @@ -673,7 +673,7 @@ renderTexture(WScreen *scr, WTexture *texture, int width, int height, } x += limg->width; w -= limg->width; - RDestroyImage(limg); + RReleaseImage(limg); } #ifdef XKB_BUTTON_HINT @@ -684,7 +684,7 @@ renderTexture(WScreen *scr, WTexture *texture, int width, int height, } x += timg->width; w -= timg->width; - RDestroyImage(timg); + RReleaseImage(timg); } #endif @@ -699,7 +699,7 @@ renderTexture(WScreen *scr, WTexture *texture, int width, int height, wwarning(_("error rendering image:%s"), RMessageForError(RErrorCode)); } w -= rimg->width; - RDestroyImage(rimg); + RReleaseImage(rimg); } if (w!=width) { @@ -709,7 +709,7 @@ renderTexture(WScreen *scr, WTexture *texture, int width, int height, if (!RConvertImage(scr->rcontext, mimg, title)) { wwarning(_("error rendering image:%s"), RMessageForError(RErrorCode)); } - RDestroyImage(mimg); + RReleaseImage(mimg); } else { RBevelImage(img, RBEV_RAISED2); @@ -725,7 +725,7 @@ renderTexture(WScreen *scr, WTexture *texture, int width, int height, } } - RDestroyImage(img); + RReleaseImage(img); } @@ -777,7 +777,7 @@ renderResizebarTexture(WScreen *scr, WTexture *texture, int width, int height, wwarning(_("error rendering image: %s"), RMessageForError(RErrorCode)); } - RDestroyImage(img); + RReleaseImage(img); } diff --git a/src/icon.c b/src/icon.c index 283e3534..9598ebf4 100644 --- a/src/icon.c +++ b/src/icon.c @@ -279,7 +279,7 @@ wIconDestroy(WIcon *icon) wfree(icon->file); if (icon->image!=NULL) - RDestroyImage(icon->image); + RReleaseImage(icon->image); wCoreDestroy(icon->core); wfree(icon); @@ -349,7 +349,7 @@ makeIcon(WScreen *scr, RImage *icon, int titled, int shadowed, int tileType) if (!RConvertImage(scr->rcontext, tile, &pixmap)) { wwarning(_("error rendering image:%s"), RMessageForError(RErrorCode)); } - RDestroyImage(tile); + RReleaseImage(tile); if (titled) drawIconTitle(scr, pixmap, theight); @@ -383,7 +383,7 @@ wIconChangeImage(WIcon *icon, RImage *new_image) assert(icon != NULL); if (icon->image) - RDestroyImage(icon->image); + RReleaseImage(icon->image); icon->image = wIconValidateIconSize(icon->core->screen_ptr, new_image); @@ -405,7 +405,7 @@ wIconValidateIconSize(WScreen *scr, RImage *icon) h = wPreferences.icon_size * icon->height / 64; tmp = RScaleImage(icon, w, h); - RDestroyImage(icon); + RReleaseImage(icon); icon = tmp; } #endif @@ -420,7 +420,7 @@ wIconValidateIconSize(WScreen *scr, RImage *icon) w = h*icon->width/icon->height; } tmp = RScaleImage(icon, w, h); - RDestroyImage(icon); + RReleaseImage(icon); icon = tmp; } #endif @@ -547,7 +547,7 @@ wIconStore(WIcon *icon) wfree(path); path = NULL; } - RDestroyImage(image); + RReleaseImage(image); return path; } @@ -780,7 +780,7 @@ wIconUpdate(WIcon *icon) scr->def_ticon_pixmap = makeIcon(scr, image, True, False, icon->tile_type); if (image) - RDestroyImage(image); + RReleaseImage(image); } if (icon->show_title) { diff --git a/src/menu.c b/src/menu.c index dc3048ad..af69cabc 100644 --- a/src/menu.c +++ b/src/menu.c @@ -484,7 +484,7 @@ renderTexture(WMenu *menu) if (!RConvertImage(scr->rcontext, img, &pix)) { wwarning(_("error rendering image:%s"), RMessageForError(RErrorCode)); } - RDestroyImage(img); + RReleaseImage(img); return pix; } diff --git a/src/pixmap.c b/src/pixmap.c index ec19d262..cf6f095f 100644 --- a/src/pixmap.c +++ b/src/pixmap.c @@ -65,7 +65,7 @@ wPixmapCreateFromXPMData(WScreen *scr, char **data) pix->height = image->height; pix->depth = scr->w_depth; - RDestroyImage(image); + RReleaseImage(image); return pix; } diff --git a/src/screen.c b/src/screen.c index 1eaf8f65..5a28378f 100644 --- a/src/screen.c +++ b/src/screen.c @@ -402,9 +402,7 @@ static void createPixmaps(WScreen *scr) { WPixmap *pix; - WMPixmap *wmpix; RImage *image; - Pixmap p, m; /* load pixmaps */ pix = wPixmapCreateFromXBMData(scr, (char*)MENU_RADIO_INDICATOR_XBM_DATA, @@ -413,7 +411,7 @@ createPixmaps(WScreen *scr) MENU_RADIO_INDICATOR_XBM_SIZE, scr->black_pixel, scr->white_pixel); if (pix!=NULL) - pix->shared = 1; + pix->shared = 1; scr->menu_radio_indicator = pix; @@ -423,7 +421,7 @@ createPixmaps(WScreen *scr) MENU_CHECK_INDICATOR_XBM_SIZE, scr->black_pixel, scr->white_pixel); if (pix!=NULL) - pix->shared = 1; + pix->shared = 1; scr->menu_check_indicator = pix; pix = wPixmapCreateFromXBMData(scr, (char*)MENU_MINI_INDICATOR_XBM_DATA, @@ -432,25 +430,25 @@ createPixmaps(WScreen *scr) MENU_MINI_INDICATOR_XBM_SIZE, scr->black_pixel, scr->white_pixel); if (pix!=NULL) - pix->shared = 1; + pix->shared = 1; scr->menu_mini_indicator = pix; pix = wPixmapCreateFromXBMData(scr, (char*)MENU_HIDE_INDICATOR_XBM_DATA, - (char*)MENU_HIDE_INDICATOR_XBM_DATA, - MENU_HIDE_INDICATOR_XBM_SIZE, - MENU_HIDE_INDICATOR_XBM_SIZE, - scr->black_pixel, scr->white_pixel); + (char*)MENU_HIDE_INDICATOR_XBM_DATA, + MENU_HIDE_INDICATOR_XBM_SIZE, + MENU_HIDE_INDICATOR_XBM_SIZE, + scr->black_pixel, scr->white_pixel); if (pix!=NULL) - pix->shared = 1; + pix->shared = 1; scr->menu_hide_indicator = pix; pix = wPixmapCreateFromXBMData(scr, (char*)MENU_SHADE_INDICATOR_XBM_DATA, - (char*)MENU_SHADE_INDICATOR_XBM_DATA, - MENU_SHADE_INDICATOR_XBM_SIZE, - MENU_SHADE_INDICATOR_XBM_SIZE, - scr->black_pixel, scr->white_pixel); + (char*)MENU_SHADE_INDICATOR_XBM_DATA, + MENU_SHADE_INDICATOR_XBM_SIZE, + MENU_SHADE_INDICATOR_XBM_SIZE, + scr->black_pixel, scr->white_pixel); if (pix!=NULL) - pix->shared = 1; + pix->shared = 1; scr->menu_shade_indicator = pix; @@ -460,16 +458,8 @@ createPixmaps(WScreen *scr) wwarning(_("could not load logo image for panels: %s"), RMessageForError(RErrorCode)); } else { - if (!RConvertImageMask(scr->rcontext, image, &p, &m, 128)) { - wwarning(_("error making logo image for panel:%s"), RMessageForError(RErrorCode)); - } else { - wmpix = WMCreatePixmapFromXPixmaps(scr->wmscreen, p, m, - image->width, image->height, - scr->depth); - WMSetApplicationIconImage(scr->wmscreen, wmpix); - WMReleasePixmap(wmpix); - } - RDestroyImage(image); + WMSetApplicationIconImage(scr->wmscreen, image); + RReleaseImage(image); } scr->dock_dots = make3Dots(scr); diff --git a/src/superfluous.c b/src/superfluous.c index 0cc36903..3e26468c 100644 --- a/src/superfluous.c +++ b/src/superfluous.c @@ -107,7 +107,7 @@ DoKaboom(WScreen *scr, Window win, int x, int y) back = RCreateImageFromXImage(scr->rcontext, ximage, NULL); XDestroyImage(ximage); if (!back) { - RDestroyImage(icon); + RReleaseImage(icon); return; } @@ -134,8 +134,8 @@ DoKaboom(WScreen *scr, Window win, int x, int y) XUngrabServer(dpy); XFreeGC(dpy, gc); - RDestroyImage(icon); - RDestroyImage(back); + RReleaseImage(icon); + RReleaseImage(back); } #endif /* DEMATERIALIZE_ICON */ @@ -346,7 +346,7 @@ MakeGhostDock(WDock *dock, int sx, int dx, int y) AllPlanes, ZPixmap); if (!img){ - RDestroyImage(back); + RReleaseImage(back); return None; } img->red_mask = red_mask; @@ -356,20 +356,20 @@ MakeGhostDock(WDock *dock, int sx, int dx, int y) dock_image = RCreateImageFromXImage(scr->rcontext, img, NULL); XDestroyImage(img); if (!dock_image) { - RDestroyImage(back); + RReleaseImage(back); return None; } RCombineAreaWithOpaqueness(back, dock_image, 0, 0, wPreferences.icon_size, n, 0, j, 30 * 256 / 100); - RDestroyImage(dock_image); + RReleaseImage(dock_image); } } RConvertImage(scr->rcontext, back, &pixmap); - RDestroyImage(back); + RReleaseImage(back); return pixmap; } @@ -398,7 +398,7 @@ MakeGhostIcon(WScreen *scr, Drawable drawable) RClearImage(back, &color); RConvertImage(scr->rcontext, back, &pixmap); - RDestroyImage(back); + RReleaseImage(back); return pixmap; } @@ -487,7 +487,7 @@ loadData(WScreen *scr) goto error; } } - RDestroyImage(image); + RReleaseImage(image); fclose(f); @@ -499,7 +499,7 @@ loadData(WScreen *scr) return True; error: - RDestroyImage(image); + RReleaseImage(image); fclose(f); diff --git a/src/texture.c b/src/texture.c index 2e9b5efd..08be67ba 100644 --- a/src/texture.c +++ b/src/texture.c @@ -162,7 +162,7 @@ wTextureDestroy(WScreen *scr, WTexture *texture) break; case WTEX_PIXMAP: - RDestroyImage(texture->pixmap.pixmap); + RReleaseImage(texture->pixmap.pixmap); break; case WTEX_MHGRADIENT: @@ -177,7 +177,7 @@ wTextureDestroy(WScreen *scr, WTexture *texture) case WTEX_THGRADIENT: case WTEX_TVGRADIENT: case WTEX_TDGRADIENT: - RDestroyImage(texture->tgradient.pixmap); + RReleaseImage(texture->tgradient.pixmap); break; #ifdef TEXTURE_PLUGIN @@ -556,14 +556,14 @@ wTextureRenderImage(WTexture *texture, int width, int height, grad = RRenderGradient(width, height, &texture->tgradient.color1, &texture->tgradient.color2, subtype); if (!grad) { - RDestroyImage(image); + RReleaseImage(image); image = NULL; break; } RCombineImagesWithOpaqueness(image, grad, texture->tgradient.opacity); - RDestroyImage(grad); + RReleaseImage(grad); } break; diff --git a/src/window.c b/src/window.c index 7c4a6662..c56c5483 100644 --- a/src/window.c +++ b/src/window.c @@ -431,7 +431,7 @@ wWindowSetupInitialAttributes(WWindow *wwin, int *level, int *workspace) #endif /* OLWM_HINTS */ /* window levels are between INT_MIN+1 and INT_MAX, so if we still - * have INT_MIN that means that no window level was requested. --Dan + * have INT_MIN that means that no window level was requested. -Dan */ if (tmp_level == INT_MIN) { if (WFLAGP(wwin, floating)) diff --git a/src/workspace.c b/src/workspace.c index 6499d8f0..1dadb037 100644 --- a/src/workspace.c +++ b/src/workspace.c @@ -253,8 +253,8 @@ hideWorkpaceName(void *data) XUnmapWindow(dpy, scr->workspace_name); if (scr->workspace_name_data) { - RDestroyImage(scr->workspace_name_data->back); - RDestroyImage(scr->workspace_name_data->text); + RReleaseImage(scr->workspace_name_data->back); + RReleaseImage(scr->workspace_name_data->text); wfree(scr->workspace_name_data); scr->workspace_name_data = NULL; @@ -273,7 +273,7 @@ hideWorkpaceName(void *data) RConvertImage(scr->rcontext, img, &pix); - RDestroyImage(img); + RReleaseImage(img); XSetWindowBackgroundPixmap(dpy, scr->workspace_name, pix); XClearWindow(dpy, scr->workspace_name); @@ -311,8 +311,8 @@ showWorkspaceName(WScreen *scr, int workspace) hideWorkpaceName, scr); if (scr->workspace_name_data) { - RDestroyImage(scr->workspace_name_data->back); - RDestroyImage(scr->workspace_name_data->text); + RReleaseImage(scr->workspace_name_data->back); + RReleaseImage(scr->workspace_name_data->text); wfree(scr->workspace_name_data); } @@ -428,9 +428,9 @@ erro: WMDeleteTimerHandler(scr->workspace_name_timer); if (data->text) - RDestroyImage(data->text); + RReleaseImage(data->text); if (data->back) - RDestroyImage(data->back); + RReleaseImage(data->back); wfree(data); scr->workspace_name_data = NULL; diff --git a/util/wmsetbg.c b/util/wmsetbg.c index 10822367..a42458e8 100644 --- a/util/wmsetbg.c +++ b/util/wmsetbg.c @@ -235,13 +235,13 @@ parseTexture(RContext *rc, char *text) if (!RConvertImage(rc, image, &pixmap)) { wwarning("could not convert texture:%s", RMessageForError(RErrorCode)); - RDestroyImage(image); + RReleaseImage(image); goto error; } texture->width = image->width; texture->height = image->height; - RDestroyImage(image); + RReleaseImage(image); texture->pixmap = pixmap; } else if (strcasecmp(type, "mvgradient")==0 @@ -332,13 +332,13 @@ parseTexture(RContext *rc, char *text) if (!RConvertImage(rc, image, &pixmap)) { wwarning("could not convert texture:%s", RMessageForError(RErrorCode)); - RDestroyImage(image); + RReleaseImage(image); goto error; } texture->width = image->width; texture->height = image->height; - RDestroyImage(image); + RReleaseImage(image); texture->pixmap = pixmap; } else if (strcasecmp(type, "cpixmap")==0 @@ -372,7 +372,7 @@ parseTexture(RContext *rc, char *text) if (!XParseColor(dpy, DefaultColormap(dpy, scr), tmp, &color)) { wwarning("could not parse color %s in texture %s\n", tmp, text); - RDestroyImage(image); + RReleaseImage(image); goto error; } if (!XAllocColor(dpy, DefaultColormap(dpy, scr), &color)) { @@ -397,11 +397,11 @@ parseTexture(RContext *rc, char *text) if (!pixmap && !RConvertImage(rc, image, &pixmap)) { wwarning("could not convert texture:%s", RMessageForError(RErrorCode)); - RDestroyImage(image); + RReleaseImage(image); goto error; } if (image) - RDestroyImage(image); + RReleaseImage(image); break; case 'S': case 'M': @@ -427,10 +427,10 @@ parseTexture(RContext *rc, char *text) if (!simage) { wwarning("could not scale image:%s", RMessageForError(RErrorCode)); - RDestroyImage(image); + RReleaseImage(image); goto error; } - RDestroyImage(image); + RReleaseImage(image); image = simage; } iwidth = image->width; @@ -444,7 +444,7 @@ parseTexture(RContext *rc, char *text) if (!pixmap && !RConvertImage(rc, image, &pixmap)) { wwarning("could not convert texture:%s", RMessageForError(RErrorCode)); - RDestroyImage(image); + RReleaseImage(image); goto error; } @@ -483,7 +483,7 @@ parseTexture(RContext *rc, char *text) pixmap = cpixmap; } if (image) - RDestroyImage(image); + RReleaseImage(image); texture->width = scrWidth; texture->height = scrHeight; @@ -564,8 +564,8 @@ parseTexture(RContext *rc, char *text) if (!gradient) { wwarning("could not render texture:%s", RMessageForError(RErrorCode)); - RDestroyImage(gradient); - RDestroyImage(image); + RReleaseImage(gradient); + RReleaseImage(image); goto error; } @@ -573,25 +573,25 @@ parseTexture(RContext *rc, char *text) if (!tiled) { wwarning("could not render texture:%s", RMessageForError(RErrorCode)); - RDestroyImage(gradient); - RDestroyImage(image); + RReleaseImage(gradient); + RReleaseImage(image); goto error; } - RDestroyImage(image); + RReleaseImage(image); RCombineImagesWithOpaqueness(tiled, gradient, opaq); - RDestroyImage(gradient); + RReleaseImage(gradient); if (!RConvertImage(rc, tiled, &pixmap)) { wwarning("could not convert texture:%s", RMessageForError(RErrorCode)); - RDestroyImage(tiled); + RReleaseImage(tiled); goto error; } texture->width = tiled->width; texture->height = tiled->height; - RDestroyImage(tiled); + RReleaseImage(tiled); texture->pixmap = pixmap; } else if (strcasecmp(type, "function")==0) { @@ -665,7 +665,7 @@ function_cleanup: dlclose(handle); } if (image) { - RDestroyImage(image); + RReleaseImage(image); } if (!success) { goto error; diff --git a/wrlib/ChangeLog b/wrlib/ChangeLog index 819e14d8..76875e15 100644 --- a/wrlib/ChangeLog +++ b/wrlib/ChangeLog @@ -1,3 +1,9 @@ +- Added retain/release mechanism to RImage by adding RRetainImage() and + RReleaseImage(). RDestroyImage() is an alias to RReleaseImage() now, but + will be removed in a future release because it no longer fits with the + semantics. Will be kept for a while to allow a smoother transition. + More about in NEWS + - Fixed crashing for Pseudocolor visuals with BestMatchRendering - Small speed improvement for 24 and 32 bpp, if internal converter is used - Small speed improvement for generating gradients. diff --git a/wrlib/Makefile.am b/wrlib/Makefile.am index 263eac04..4bdc71be 100644 --- a/wrlib/Makefile.am +++ b/wrlib/Makefile.am @@ -4,7 +4,7 @@ AUTOMAKE_OPTIONS = no-dependencies lib_LTLIBRARIES = libwraster.la -libwraster_la_LDFLAGS = -version-info 3:0:1 +libwraster_la_LDFLAGS = -version-info 4:0:2 bin_SCRIPTS = get-wraster-flags diff --git a/wrlib/NEWS b/wrlib/NEWS index e69de29b..e5b71b0f 100644 --- a/wrlib/NEWS +++ b/wrlib/NEWS @@ -0,0 +1,28 @@ + +Sat Apr 21 09:12:09 EEST 2001 -Dan + +API change +---------- + +To allow a retain/release mechanism to be implemented for RImages, the +following new functions were introduced: + + RImage* RRetainImage(RImage* image); + void RReleaseImage(RImage* image); + +RDestroyImage() is now aliased to RReleaseImage(), but because it's no +longer compatible with the new semantics, it was only kept to allow a +smoother transition and the ability to run programs that were not updated +yet. + +Do _NOT_ continue to use RDestroyImage(), because it will be removed in a +future version. You should start using RReleaseImage() in your code, and +also update all your existing programs to use RReleaseImage(). + +Also keep in mind that its name is also misleading: RDestroyImage() no +longer destroys images, unless they are not retained in some other place. + +All existing code will continue to function with the new lib, even if not +recompiled, but you are encouraged to update your code to these changes + + diff --git a/wrlib/convolve.c b/wrlib/convolve.c index 58bbf761..0f315fcf 100644 --- a/wrlib/convolve.c +++ b/wrlib/convolve.c @@ -250,7 +250,7 @@ REdgeDetectImage(RImage *image) image2->data[1] = g; b = image->data[2]; image2->data[2] = b; - RDestroyImage(image2); + RReleaseImage(image2); } #undef MASK diff --git a/wrlib/gif.c b/wrlib/gif.c index e213d82a..c15f42c7 100644 --- a/wrlib/gif.c +++ b/wrlib/gif.c @@ -209,7 +209,7 @@ giferr: } bye: if (image) - RDestroyImage(image); + RReleaseImage(image); image = NULL; did_not_get_any_errors: diff --git a/wrlib/gradient.c b/wrlib/gradient.c index 010b8147..69e4b80d 100644 --- a/wrlib/gradient.c +++ b/wrlib/gradient.c @@ -256,7 +256,7 @@ renderDGradient(unsigned width, unsigned height, int r0, int g0, int b0, tmp = renderHGradient(2*width-1, 1, r0, g0, b0, rf, gf, bf); if (!tmp) { - RDestroyImage(image); + RReleaseImage(image); return NULL; } @@ -271,7 +271,7 @@ renderDGradient(unsigned width, unsigned height, int r0, int g0, int b0, offset += a; } - RDestroyImage(tmp); + RReleaseImage(tmp); return image; } @@ -472,7 +472,7 @@ renderMDGradient(unsigned width, unsigned height, RColor **colors, int count) colors[1]->blue<<8); if (!tmp) { - RDestroyImage(image); + RReleaseImage(image); return NULL; } ptr = tmp->data; @@ -485,16 +485,17 @@ renderMDGradient(unsigned width, unsigned height, RColor **colors, int count) memcpy(&(image->data[j]), &ptr[3*(int)offset], width); offset += a; } - RDestroyImage(tmp); + RReleaseImage(tmp); return image; } -RImage *RRenderInterwovenGradient(unsigned width, unsigned height, - RColor colors1[2], int thickness1, - RColor colors2[2], int thickness2) +RImage* +RRenderInterwovenGradient(unsigned width, unsigned height, + RColor colors1[2], int thickness1, + RColor colors2[2], int thickness2) { int i, j, k, l, ll; unsigned long r1, g1, b1, dr1, dg1, db1; diff --git a/wrlib/load.c b/wrlib/load.c index 041a36d3..dde6c5a3 100644 --- a/wrlib/load.c +++ b/wrlib/load.c @@ -184,7 +184,7 @@ RLoadImage(RContext *context, char *file, int index) } else { free(RImageCache[i].file); RImageCache[i].file = NULL; - RDestroyImage(RImageCache[i].image); + RReleaseImage(RImageCache[i].image); } } } @@ -264,7 +264,7 @@ RLoadImage(RContext *context, char *file, int index) /* if no slot available, dump least recently used one */ if (!done) { free(RImageCache[oldest_idx].file); - RDestroyImage(RImageCache[oldest_idx].image); + RReleaseImage(RImageCache[oldest_idx].image); RImageCache[oldest_idx].file = malloc(strlen(file)+1); strcpy(RImageCache[oldest_idx].file, file); RImageCache[oldest_idx].image = RCloneImage(image); diff --git a/wrlib/nxpm.c b/wrlib/nxpm.c index c3242e54..05c9bb54 100644 --- a/wrlib/nxpm.c +++ b/wrlib/nxpm.c @@ -223,7 +223,7 @@ RGetImageFromXPMData(RContext *context, char **data) alloca(0); #endif if (image) - RDestroyImage(image); + RReleaseImage(image); return NULL; } @@ -418,7 +418,7 @@ RLoadXPM(RContext *context, char *file, int index) alloca(0); #endif if (image) - RDestroyImage(image); + RReleaseImage(image); return NULL; bad_file: @@ -428,7 +428,7 @@ RLoadXPM(RContext *context, char *file, int index) alloca(0); #endif if (image) - RDestroyImage(image); + RReleaseImage(image); return NULL; } diff --git a/wrlib/png.c b/wrlib/png.c index d6c8183d..396a618a 100644 --- a/wrlib/png.c +++ b/wrlib/png.c @@ -101,7 +101,7 @@ RLoadPNG(RContext *context, char *file, int index) fclose(f); png_destroy_read_struct(&png, &pinfo, &einfo); if (image) - RDestroyImage(image); + RReleaseImage(image); return NULL; } @@ -177,7 +177,7 @@ RLoadPNG(RContext *context, char *file, int index) if (!png_rows) { RErrorCode = RERR_NOMEMORY; fclose(f); - RDestroyImage(image); + RReleaseImage(image); png_destroy_read_struct(&png, &pinfo, &einfo); #ifdef C_ALLOCA alloca(0); @@ -189,7 +189,7 @@ RLoadPNG(RContext *context, char *file, int index) if (!png_rows[y]) { RErrorCode = RERR_NOMEMORY; fclose(f); - RDestroyImage(image); + RReleaseImage(image); png_destroy_read_struct(&png, &pinfo, &einfo); #ifdef C_ALLOCA alloca(0); diff --git a/wrlib/raster.c b/wrlib/raster.c index 6c943247..5d376041 100644 --- a/wrlib/raster.c +++ b/wrlib/raster.c @@ -55,6 +55,7 @@ RCreateImage(unsigned width, unsigned height, int alpha) image->width = width; image->height = height; image->format = alpha ? RRGBAFormat : RRGBFormat; + image->refCount = 1; /* the +4 is to give extra bytes at the end of the buffer, * so that we can optimize image conversion for MMX(tm).. see convert.c @@ -70,6 +71,44 @@ RCreateImage(unsigned width, unsigned height, int alpha) } +RImage* +RRetainImage(RImage *image) +{ + if (image) + image->refCount++; + + return image; +} + + +void +RReleaseImage(RImage *image) +{ + assert(image!=NULL); + + image->refCount--; + + if (image->refCount < 1) { + free(image->data); + free(image); + } +} + + +/* Obsoleted function. Use RReleaseImage() instead. This was kept only to + * allow a smoother transition and to avoid breaking existing programs, but + * it will be removed in a future release. Right now is just an alias to + * RReleaseImage(). Do _NOT_ use RDestroyImage() anymore in your programs. + * Being an alias to RReleaseImage() this function no longer actually + * destroys the image, unless the image is no longer retained in some other + * place. + */ +void +RDestroyImage(RImage *image) +{ + RReleaseImage(image); +} + RImage* RCloneImage(RImage *image) @@ -126,16 +165,6 @@ RGetSubImage(RImage *image, int x, int y, unsigned width, unsigned height) } -void -RDestroyImage(RImage *image) -{ - assert(image!=NULL); - - free(image->data); - free(image); -} - - /* *---------------------------------------------------------------------- * RCombineImages- diff --git a/wrlib/rotate.c b/wrlib/rotate.c index 9f493d03..9d036a9a 100644 --- a/wrlib/rotate.c +++ b/wrlib/rotate.c @@ -37,7 +37,8 @@ static RImage *rotateImage(RImage *image, float angle); -RImage *RRotateImage(RImage *image, float angle) +RImage* +RRotateImage(RImage *image, float angle) { RImage *img; int nwidth, nheight; @@ -207,8 +208,9 @@ RImage *RRotateImage(RImage *image, float angle) */ -static void copyLine(int x1, int y1, int x2, int y2, int nwidth, int format, - unsigned char *dst, unsigned char **src) +static void +copyLine(int x1, int y1, int x2, int y2, int nwidth, int format, + unsigned char *dst, unsigned char **src) { unsigned char *s = *src; int dx, dy; @@ -283,7 +285,8 @@ static void copyLine(int x1, int y1, int x2, int y2, int nwidth, int format, } -static RImage *rotateImage(RImage *image, float angle) +static RImage* +rotateImage(RImage *image, float angle) { RImage *img; int nwidth, nheight; diff --git a/wrlib/scale.c b/wrlib/scale.c index 96217cb8..609937a8 100644 --- a/wrlib/scale.c +++ b/wrlib/scale.c @@ -617,7 +617,7 @@ RSmoothScaleImage(RImage *src, unsigned new_width, unsigned new_height) } free(contrib); - RDestroyImage(tmp); + RReleaseImage(tmp); return dst; } diff --git a/wrlib/testdraw.c b/wrlib/testdraw.c index dc8970cf..0e93786d 100644 --- a/wrlib/testdraw.c +++ b/wrlib/testdraw.c @@ -67,7 +67,7 @@ testDraw() exit(1); } RCombineArea(img, icon, 0, 0, icon->width, icon->height, 8, 8); - RDestroyImage(icon); + RReleaseImage(icon); tmp = img; RConvertImage(ctx, img, &pix); XCopyArea(dpy, pix, back, ctx->copy_gc, 0, 0, 64, 64, 64, 0); @@ -88,7 +88,7 @@ testDraw() RConvertImage(ctx, img, &pix); XCopyArea(dpy, pix, back, ctx->copy_gc, 0, 0, 64, 64, 0, 64); - RDestroyImage(img); + RReleaseImage(img); img = RCloneImage(tile); /* Alter random pixels in image with the same amount for r/g/b */ @@ -103,7 +103,7 @@ testDraw() RConvertImage(ctx, img, &pix); XCopyArea(dpy, pix, back, ctx->copy_gc, 0, 0, 64, 64, 64, 64); - RDestroyImage(img); + RReleaseImage(img); img = RCloneImage(tile); /* Draw lines in all directions to test different slopes */ @@ -133,7 +133,7 @@ testDraw() RConvertImage(ctx, img, &pix); XCopyArea(dpy, pix, back, ctx->copy_gc, 0, 0, 64, 64, 0, 128); - RDestroyImage(img); + RReleaseImage(img); img = RCloneImage(tile); /* Alter lines in all directions (test different slopes) */ @@ -144,7 +144,7 @@ testDraw() RConvertImage(ctx, img, &pix); XCopyArea(dpy, pix, back, ctx->copy_gc, 0, 0, 64, 64, 64, 128); - RDestroyImage(img); + RReleaseImage(img); /* Create a bevel around the icon, and save it for a later use */ img = tmp; @@ -156,7 +156,7 @@ testDraw() cdelta.alpha = 0; ROperateLine(img, RSubtractOperation, 8, 56, 56, 56, &cdelta); ROperateLine(img, RSubtractOperation, 56, 8, 56, 55, &cdelta); - RDestroyImage(tile); + RReleaseImage(tile); tmp = RCloneImage(img); /* Draw some solid lines over the icon */ @@ -177,7 +177,7 @@ testDraw() RConvertImage(ctx, img, &pix); XCopyArea(dpy, pix, back, ctx->copy_gc, 0, 0, 64, 64, 0, 192); - RDestroyImage(img); + RReleaseImage(img); /* Restore the image with the icon, and alter some lines */ img = tmp; @@ -247,7 +247,7 @@ testBevel() RClearImage(img, &color); RConvertImage(ctx, img, &pix); XCopyArea(dpy, pix, back, ctx->copy_gc, 0, 0, 140, 140, 0, 0); - RDestroyImage(img); + RReleaseImage(img); tile = RRenderGradient(64, 64, &from, &to, RGRD_DIAGONAL); @@ -255,25 +255,25 @@ testBevel() RBevelImage(img, RBEV_SUNKEN); RConvertImage(ctx, img, &pix); XCopyArea(dpy, pix, back, ctx->copy_gc, 0, 0, 64, 64, 3, 3); - RDestroyImage(img); + RReleaseImage(img); img = RCloneImage(tile); RBevelImage(img, RBEV_RAISED); RConvertImage(ctx, img, &pix); XCopyArea(dpy, pix, back, ctx->copy_gc, 0, 0, 64, 64, 73, 3); - RDestroyImage(img); + RReleaseImage(img); img = RCloneImage(tile); RBevelImage(img, RBEV_RAISED2); RConvertImage(ctx, img, &pix); XCopyArea(dpy, pix, back, ctx->copy_gc, 0, 0, 64, 64, 3, 73); - RDestroyImage(img); + RReleaseImage(img); img = RCloneImage(tile); RBevelImage(img, RBEV_RAISED3); RConvertImage(ctx, img, &pix); XCopyArea(dpy, pix, back, ctx->copy_gc, 0, 0, 64, 64, 73, 73); - RDestroyImage(img); + RReleaseImage(img); XSetWindowBackgroundPixmap(dpy, win, back); XMapRaised(dpy, win); @@ -306,7 +306,7 @@ void testScale() scaled = RScaleImage(image, 140, 140); - RDestroyImage(image); + RReleaseImage(image); RConvertImage(ctx, scaled, &pix); XSetWindowBackgroundPixmap(dpy, win, pix); XMapRaised(dpy, win); @@ -345,7 +345,7 @@ void testRotate() rotated = RRotateImage(image, 90.0); - RDestroyImage(image); + RReleaseImage(image); RConvertImage(ctx, rotated, &pix); XSetWindowBackgroundPixmap(dpy, win, pix); XMapRaised(dpy, win); @@ -478,7 +478,7 @@ drawClip() RConvertImage(ctx, img, &pix); XCopyArea(dpy, pix, back, ctx->copy_gc, 0, 0, 64, 64, 0, 0); - RDestroyImage(img); + RReleaseImage(img); XSetWindowBackgroundPixmap(dpy, win, back); XMapRaised(dpy, win); @@ -576,7 +576,7 @@ benchmark() } printf("Average: %f, %f, %f\n", d1/5, d2/5, d3/5); - RDestroyImage(img); + RReleaseImage(img); } diff --git a/wrlib/testrot.c b/wrlib/testrot.c index 97ab7c05..a2b82a8f 100644 --- a/wrlib/testrot.c +++ b/wrlib/testrot.c @@ -57,7 +57,7 @@ int main(int argc, char **argv) puts(RMessageForError(RErrorCode)); exit(1); } - RDestroyImage(tmp); + RReleaseImage(tmp); XSetWindowBackgroundPixmap(dpy, win, pix); XFreePixmap(dpy, pix); diff --git a/wrlib/view.c b/wrlib/view.c index 7c374301..97ff07a7 100644 --- a/wrlib/view.c +++ b/wrlib/view.c @@ -42,7 +42,7 @@ main(int argc, char **argv) img = RSmoothScaleImage(tmp, tmp->width*atol(argv[2]), tmp->height*atol(argv[2])); - RDestroyImage(tmp); + RReleaseImage(tmp); } */ #if 0 diff --git a/wrlib/wraster.h b/wrlib/wraster.h index b22586fc..0d8326db 100644 --- a/wrlib/wraster.h +++ b/wrlib/wraster.h @@ -191,10 +191,11 @@ enum RImageFormat { * internal 24bit+alpha image representation */ typedef struct RImage { - unsigned char *data; /* image data RGBA or RGB */ + unsigned char *data; /* image data RGBA or RGB */ int width, height; /* size of the image */ enum RImageFormat format; - RColor background; /* background color */ + RColor background; /* background color */ + int refCount; } RImage; @@ -322,7 +323,18 @@ RImage *RCreateImageFromDrawable(RContext *context, Drawable drawable, RImage *RLoadImage(RContext *context, char *file, int index); +RImage* RRetainImage(RImage *image); +void RReleaseImage(RImage *image); + +/* Obsoleted function. Use RReleaseImage() instead. This was kept only to + * allow a smoother transition and to avoid breaking existing programs, but + * it will be removed in a future release. Right now is just an alias to + * RReleaseImage(). Do _NOT_ use RDestroyImage() anymore in your programs. + * Being an alias to RReleaseImage() this function no longer actually + * destroys the image, unless the image is no longer retained in some other + * place. + */ void RDestroyImage(RImage *image); RImage *RGetImageFromXPMData(RContext *context, char **xpmData); diff --git a/wrlib/xpm.c b/wrlib/xpm.c index 664e4bd5..02a637fa 100644 --- a/wrlib/xpm.c +++ b/wrlib/xpm.c @@ -87,7 +87,7 @@ RGetImageFromXPMData(RContext *context, char **xpmData) if (color_table[i]) free(color_table[i]); } - RDestroyImage(image); + RReleaseImage(image); RErrorCode = RERR_NOMEMORY; XpmFreeXpmImage(&xpm); return NULL; @@ -210,7 +210,7 @@ RLoadXPM(RContext *context, char *file, int index) if (color_table[i]) free(color_table[i]); } - RDestroyImage(image); + RReleaseImage(image); RErrorCode = RERR_NOMEMORY; XpmFreeXpmImage(&xpm); return NULL;