Rethumbed init data, so Desktop::instance() call can be

called from DesktopIcon constructor. In previous case, Desktop constructor
wasn't finished, but Desktop::instance() was called in the mean time which
yields crashing.
This commit is contained in:
Sanel Zukan
2007-06-29 11:22:29 +00:00
parent 186b594f2d
commit 4521b56042
4 changed files with 40 additions and 34 deletions

View File

@@ -86,11 +86,26 @@ DesktopIcon::DesktopIcon(GlobalIconSettings* gs, IconSettings* is, int bg) :
} else } else
EDEBUG(ESTRLOC ": Got empty icon name ?!?\n"); EDEBUG(ESTRLOC ": Got empty icon name ?!?\n");
} }
/*
EDEBUG(ESTRLOC ": Got label: %s\n", label()); // make sure icons are visible on desktop
EDEBUG(ESTRLOC ": Got image: %s\n", settings->icon.c_str()); int dx = Desktop::instance()->x();
EDEBUG(ESTRLOC ": Got x/y : %i %i\n", x(), y()); int dy = Desktop::instance()->y();
*/ int dw = Desktop::instance()->w();
int dh = Desktop::instance()->h();
int ix = x();
int iy = y();
if(x() < dx)
ix = dx;
if(y() < dy)
iy = dy;
if(x() + w() > dw)
ix = (dx + dw) - w();
if(y() + h() > dh)
iy = (dy + dh) - h();
position(ix, iy);
//Use desktop color as color for icon background //Use desktop color as color for icon background
color(bg); color(bg);

View File

@@ -219,6 +219,7 @@ Pixmap create_xpixmap(Fl_Image* img, XImage* xim, Pixmap pix) {
r = *src++; r = *src++;
g = *src++; g = *src++;
b = *src++; b = *src++;
if(msb) { if(msb) {
// big endian // big endian
*destptr++ = b; *destptr++ = b;
@@ -319,19 +320,6 @@ bool create_tile(Fl_Image* orig, Fl_RGB_Image*& copied, int X, int Y, int W, int
// for bounds checks // for bounds checks
int imax = iw * ih * idepth; int imax = iw * ih * idepth;
#if 0
// funny effect :)
for(int j = 0, cj = 0; j < th; j++, cj++) {
for(int i = 0, ci = 0; i < tw * orig->d(); i++, ci++) {
if(ci >= iw) ci = 0;
if(cj >= ih) cj = 0;
ppos = pixel_pos(ci, cj, iw, orig->d());
*destptr = src[ppos];
destptr++;
}
}
#endif
if(idepth == 3 || idepth == 4) { if(idepth == 3 || idepth == 4) {
for(int j = 0, cj = 0; j < th; j++, cj++) { for(int j = 0, cj = 0; j < th; j++, cj++) {
if(cj > ih) cj = 0; if(cj > ih) cj = 0;

View File

@@ -38,7 +38,7 @@
#define SELECTION_SINGLE (Fl::event_button() == 1) #define SELECTION_SINGLE (Fl::event_button() == 1)
#define SELECTION_MULTI (Fl::event_button() == 1 && (Fl::event_key(FL_Shift_L) || Fl::event_key(FL_Shift_R))) #define SELECTION_MULTI (Fl::event_button() == 1 && (Fl::event_key(FL_Shift_L) || Fl::event_key(FL_Shift_R)))
#define MIN(x,y) ((x) < (y) ? (x) : (y)) #define MIN(x,y) ((x) < (y) ? (x) : (y))
#define MAX(x,y) ((x) > (y) ? (x) : (y)) #define MAX(x,y) ((x) > (y) ? (x) : (y))
@@ -115,7 +115,17 @@ Desktop::Desktop() : DESKTOP_WINDOW(0, 0, 100, 100, "") {
dsett = new DesktopSettings; dsett = new DesktopSettings;
dsett->color = FL_GRAY; dsett->color = FL_GRAY;
dsett->wp_use = false; dsett->wp_use = false;
}
Desktop::~Desktop() {
EDEBUG("Desktop::~Desktop()\n");
delete dsett;
delete selbox;
delete notify;
}
void Desktop::init_internals(void) {
init_atoms(); init_atoms();
update_workarea(); update_workarea();
@@ -130,32 +140,25 @@ Desktop::Desktop() : DESKTOP_WINDOW(0, 0, 100, 100, "") {
//wallpaper->set_tiled("/home/sanel/wallpapers/katesmall.jpg"); //wallpaper->set_tiled("/home/sanel/wallpapers/katesmall.jpg");
//wallpaper->set_tiled("/home/sanelz/walls/katesmall.jpg"); //wallpaper->set_tiled("/home/sanelz/walls/katesmall.jpg");
//wallpaper->set_tiled("/home/sanelz/walls/kate.jpg"); //wallpaper->set_tiled("/home/sanelz/walls/kate.jpg");
//wallpaper->set("/home/sanelz/walls/katebig.jpg"); wallpaper->set("/home/sanelz/walls/katebig.jpg");
//wallpaper->hide(); //wallpaper->hide();
wallpaper->set("/home/sanelz/walls/nin/1024x768-04.jpg"); //wallpaper->set("/home/sanelz/walls/katesmall.jpg");
//wallpaper->set("/home/sanelz/walls/nin/1024x768-04.jpg");
//wallpaper->set("/home/sanelz/walls/nin/1024x768-02.jpg"); //wallpaper->set("/home/sanelz/walls/nin/1024x768-02.jpg");
end(); end();
notify = new NotifyBox(w(), h()); notify = new NotifyBox(w(), h());
set_bg_color(dsett->color, false);
read_config(); read_config();
set_bg_color(dsett->color, false);
running = true; running = true;
} }
Desktop::~Desktop() {
EDEBUG("Desktop::~Desktop()\n");
delete dsett;
delete selbox;
delete notify;
}
void Desktop::init(void) { void Desktop::init(void) {
if(Desktop::pinstance != NULL) if(Desktop::pinstance != NULL)
return; return;
Desktop::pinstance = new Desktop(); Desktop::pinstance = new Desktop();
Desktop::pinstance->init_internals();
} }
void Desktop::shutdown(void) { void Desktop::shutdown(void) {
@@ -181,8 +184,6 @@ void Desktop::show(void) {
Fl_X::make_xid(this); Fl_X::make_xid(this);
net_make_me_desktop(this); net_make_me_desktop(this);
} }
//Fl::dnd_text_ops(1);
} }
/* /*

View File

@@ -77,7 +77,7 @@ class NotifyBox;
typedef edelib::vector<DesktopIcon*> DesktopIconList; typedef edelib::vector<DesktopIcon*> DesktopIconList;
#define DESKTOP_WINDOW Fl_Window #define DESKTOP_WINDOW Fl_Double_Window
class Desktop : public DESKTOP_WINDOW { class Desktop : public DESKTOP_WINDOW {
private: private:
@@ -97,6 +97,8 @@ class Desktop : public DESKTOP_WINDOW {
DesktopIconList icons; DesktopIconList icons;
DesktopIconList selectionbuff; DesktopIconList selectionbuff;
void init_internals(void);
void load_icons(const char* path, edelib::Config& conf); void load_icons(const char* path, edelib::Config& conf);
bool read_desktop_file(const char* path, IconSettings& is); bool read_desktop_file(const char* path, IconSettings& is);