descratch again reworked + icons, add agingtv plugin params, add alias chkbox in...
[goodguy/history.git] / cinelerra-5.1 / plugins / titler / titlerwindow.C
index 01cddf4f7d7c468b1d82a5bfc22ce295b2a67936..d3f20d2a651e2b46cc77cebc67285ccb61903cba 100644 (file)
@@ -32,7 +32,9 @@
 #include "edlsession.h"
 #include "keys.h"
 #include "language.h"
+#include "mainerror.h"
 #include "mwindow.h"
+#include "mwindowgui.h"
 #include "plugin.h"
 #include "pluginserver.h"
 #include "theme.h"
@@ -113,6 +115,7 @@ TitleWindow::TitleWindow(TitleMain *client)
        background = 0;
        background_path = 0;
        loop_playback = 0;
+       pending_config = 0;
 }
 
 void TitleWindow::done_event(int result)
@@ -255,10 +258,16 @@ void TitleWindow::create_objects()
        int w1 = italic->get_w();
        add_tool(bold = new TitleBold(client, this, x, y + 50));
        if( bold->get_w() > w1 ) w1 = bold->get_w();
+
        add_tool(drag = new TitleDrag(client, this, x, y + 80));
        if( drag->get_w() > w1 ) w1 = drag->get_w();
-       if( client->config.drag )
-               grab(client->server->mwindow->cwindow->gui);
+       if( client->config.drag ) {
+               if( !grab(client->server->mwindow->cwindow->gui) )
+                       eprintf("drag enabled, but compositor already grabbed\n");
+       }
+
+       add_tool(alias = new TitleAlias(client, this, x, y+110));
+       if( alias->get_w() > w1 ) w1 = drag->get_w();
 
        x += w1 + margin;
        add_tool(justify_title = new BC_Title(x, y, _("Justify:")));
@@ -309,7 +318,7 @@ void TitleWindow::create_objects()
        x1 += motion_title->get_w()+margin;
        motion = new TitleMotion(client, this, x1, y);
        motion->create_objects();
-       add_tool(loop = new TitleLoop(client, x, y1));
+       add_tool(loop = new TitleLoop(client, this, x, y1));
        x = margin;    y = y1 + loop->get_h()+20;
 
        add_tool(dropshadow_title = new BC_Title(x, y, _("Drop shadow:")));
@@ -331,9 +340,9 @@ void TitleWindow::create_objects()
        if( fade_out->get_w() > w1 ) w1 = fade_out->get_w();
        x += w1 + margin;
 
-       add_tool(speed_title = new BC_Title(x, y1=y, _("Speed:")));
+       add_tool(speed_title = new BC_Title(x, y, _("Speed:")));
        w1 = speed_title->get_w();
-       y += speed_title->get_h() + 5;
+       y += speed_title->get_h() + 5;  y1 = y;
        speed = new TitleSpeed(client, this, x, y);
        speed->create_objects();
        if( speed->get_w() > w1 ) w1 = speed->get_w();
@@ -364,9 +373,9 @@ void TitleWindow::create_objects()
        x += stroker->get_w() + margin;
 #endif
        y += outline_title->get_h() + margin;
-       add_tool(timecode = new TitleTimecode(client, x1=x, y));
+       add_tool(timecode = new TitleTimecode(client, this, x1=x, y));
        x += timecode->get_w() + margin;
-       add_tool(timecode_format = new TitleTimecodeFormat(client, x, y,
+       add_tool(timecode_format = new TitleTimecodeFormat(client, this, x, y,
                Units::print_time_format(client->config.timecode_format, string)));
        timecode_format->create_objects();
        y += timecode_format->get_h() + margin;
@@ -380,7 +389,7 @@ void TitleWindow::create_objects()
                client->server->mwindow->theme, this, background_path,
                x, y, "", _("background media"), _("Select background media path")));
        x += background_browse->get_w() + 3*margin;
-       add_tool(loop_playback = new TitleLoopPlayback(client, x, y));
+       add_tool(loop_playback = new TitleLoopPlayback(client, this, x, y));
        y += loop_playback->get_h() + 10;
 
        x = 10;
@@ -427,6 +436,7 @@ int TitleWindow::resize_event(int w, int h)
        italic->reposition_window(italic->get_x(), italic->get_y());
        bold->reposition_window(bold->get_x(), bold->get_y());
        drag->reposition_window(drag->get_x(), drag->get_y());
+       alias->reposition_window(alias->get_x(), alias->get_y());
        size_title->reposition_window(size_title->get_x(), size_title->get_y());
        size->reposition_window(size->get_x(), size->get_y());
        size_tumbler->reposition_window(size_tumbler->get_x(), size_tumbler->get_y());
@@ -463,29 +473,54 @@ int TitleWindow::resize_event(int w, int h)
        return 1;
 }
 
+void TitleWindow::send_configure_change()
+{
+       pending_config = 0;
+       client->send_configure_change();
+}
+int TitleWindow::check_configure_change(int ret)
+{
+       if( pending_config && !grab_event_count() )
+               send_configure_change();
+       return ret;
+}
+
 int TitleWindow::grab_event(XEvent *event)
 {
+       switch( event->type ) {
+       case ButtonPress: break;
+       case ButtonRelease: break;
+       case MotionNotify: break;
+       default:
+               return check_configure_change(0);
+       }
+
        MWindow *mwindow = client->server->mwindow;
        CWindowGUI *cwindow_gui = mwindow->cwindow->gui;
        CWindowCanvas *canvas = cwindow_gui->canvas;
-       int cx, cy;  canvas->get_canvas()->get_relative_cursor_xy(cx, cy);
-       if( cx < mwindow->theme->ccanvas_x ) return 0;
-       if( cx >= mwindow->theme->ccanvas_x+mwindow->theme->ccanvas_w ) return 0;
-       if( cy < mwindow->theme->ccanvas_y ) return 0;
-       if( cy >= mwindow->theme->ccanvas_y+mwindow->theme->ccanvas_h ) return 0;
+       int cx, cy;  cwindow_gui->get_relative_cursor(cx, cy);
+       cx -= mwindow->theme->ccanvas_x;
+       cy -= mwindow->theme->ccanvas_y;
+
+       if( !dragging ) {
+               if( cx < 0 || cx >= mwindow->theme->ccanvas_w ||
+                   cy < 0 || cy >= mwindow->theme->ccanvas_h )
+                       return check_configure_change(0);
+       }
 
        switch( event->type ) {
        case ButtonPress:
                if( !dragging ) break;
                return 1;
        case ButtonRelease:
-               if( !dragging ) return 0;
+               if( !dragging ) return check_configure_change(0);
                dragging = 0;
                return 1;
        case MotionNotify:
-               if( dragging ) break;
+               if( !dragging ) return check_configure_change(0);
+               break;
        default:
-               return 0;
+               return check_configure_change(0);
        }
 
        float cursor_x = cx, cursor_y = cy;
@@ -602,7 +637,10 @@ int TitleWindow::grab_event(XEvent *event)
                this->title_y->update((int64_t)(client->config.title_y += dy));
                }
        }
-       client->send_configure_change();
+       if( !grab_event_count() )
+               send_configure_change();
+       else
+               pending_config = 1;
        return 1;
 }
 
@@ -621,7 +659,7 @@ void TitleWindow::previous_font()
        font->update(fonts.values[current_font]->get_text());
        strcpy(client->config.font, fonts.values[current_font]->get_text());
        check_style(client->config.font,1);
-       client->send_configure_change();
+       send_configure_change();
 }
 
 void  TitleWindow::next_font()
@@ -639,7 +677,7 @@ void  TitleWindow::next_font()
        font->update(fonts.values[current_font]->get_text());
        strcpy(client->config.font, fonts.values[current_font]->get_text());
        check_style(client->config.font,1);
-       client->send_configure_change();
+       send_configure_change();
 }
 
 int TitleWindow::insert_ibeam(const char *txt, int ofs)
@@ -656,7 +694,7 @@ int TitleWindow::insert_ibeam(const char *txt, int ofs)
                ibeam = client->config.wlen;
        text->wset_selection(-1, -1, ibeam);
        text->update(client->config.wtext);
-       client->send_configure_change();
+       send_configure_change();
        return 1;
 }
 
@@ -700,6 +738,7 @@ void TitleWindow::update()
        title_h->update((int64_t)client->config.title_h);
        italic->update(client->config.style & BC_FONT_ITALIC);
        bold->update(client->config.style & BC_FONT_BOLD);
+       alias->update(client->config.style & FONT_ALIAS);
        size->update(client->config.size);
        motion->update(TitleMain::motion_to_text(client->config.motion_strategy));
        loop->update(client->config.loop);
@@ -780,7 +819,7 @@ int TitleSizeTumble::handle_up_event()
 
        client->config.size = atoi(window->sizes.get(current_index)->get_text());
        window->size->update(client->config.size);
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
@@ -803,7 +842,23 @@ int TitleSizeTumble::handle_down_event()
 
        client->config.size = atoi(window->sizes.get(current_index)->get_text());
        window->size->update(client->config.size);
-       client->send_configure_change();
+       window->send_configure_change();
+       return 1;
+}
+
+TitleAlias::TitleAlias(TitleMain *client, TitleWindow *window, int x, int y)
+ : BC_CheckBox(x, y, client->config.style & FONT_ALIAS, _("Alias"))
+{
+       this->client = client;
+       this->window = window;
+}
+
+int TitleAlias::handle_event()
+{
+       client->config.style =
+               (client->config.style & ~FONT_ALIAS) |
+                       (get_value() ? FONT_ALIAS : 0);
+       window->send_configure_change();
        return 1;
 }
 
@@ -819,7 +874,7 @@ int TitleBold::handle_event()
        client->config.style =
                (client->config.style & ~BC_FONT_BOLD) |
                        (get_value() ? BC_FONT_BOLD : 0);
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
@@ -834,7 +889,7 @@ int TitleItalic::handle_event()
        client->config.style =
                (client->config.style & ~BC_FONT_ITALIC) |
                        (get_value() ? BC_FONT_ITALIC : 0);
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
@@ -853,7 +908,7 @@ int TitleSize::handle_event()
 {
        client->config.size = atol(get_text());
 //printf("TitleSize::handle_event 1 %s\n", get_text());
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 void TitleSize::update(int size)
@@ -880,7 +935,7 @@ TitlePitch::
 int TitlePitch::handle_event()
 {
        *value = atol(get_text());
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
@@ -921,25 +976,27 @@ TitleMotion::TitleMotion(TitleMain *client, TitleWindow *window, int x, int y)
 int TitleMotion::handle_event()
 {
        client->config.motion_strategy = client->text_to_motion(get_text());
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
-TitleLoop::TitleLoop(TitleMain *client, int x, int y)
+TitleLoop::TitleLoop(TitleMain *client, TitleWindow *window, int x, int y)
  : BC_CheckBox(x, y, client->config.loop, _("Loop"))
 {
        this->client = client;
+       this->window = window;
 }
 int TitleLoop::handle_event()
 {
        client->config.loop = get_value();
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
-TitleTimecode::TitleTimecode(TitleMain *client, int x, int y)
+TitleTimecode::TitleTimecode(TitleMain *client, TitleWindow *window, int x, int y)
  : BC_CheckBox(x, y, client->config.timecode, _("Stamp timecode"))
 {
        this->client = client;
+       this->window = window;
 }
 int TitleTimecode::handle_event()
 {
@@ -948,16 +1005,18 @@ int TitleTimecode::handle_event()
        return 1;
 }
 
-TitleTimecodeFormat::TitleTimecodeFormat(TitleMain *client, int x, int y, const char *text)
+TitleTimecodeFormat::TitleTimecodeFormat(TitleMain *client, TitleWindow *window,
+               int x, int y, const char *text)
  : BC_PopupMenu(x, y, 100, text, 1)
 {
        this->client = client;
+       this->window = window;
 }
 
 int TitleTimecodeFormat::handle_event()
 {
        client->config.timecode_format = Units::text_to_format(get_text());
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
@@ -996,7 +1055,7 @@ TitleFade::TitleFade(TitleMain *client, TitleWindow *window,
 int TitleFade::handle_event()
 {
        *value = atof(get_text());
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
@@ -1042,7 +1101,7 @@ int TitleFont::handle_event()
 {
        strcpy(client->config.font, get_text());
        window->check_style(client->config.font, 1);
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
@@ -1075,11 +1134,11 @@ int TitleText::handle_event()
        if( text_len >= avail ) { // back off last utf8 char
                char text[2*sizeof(client->config.wtext)];
                strcpy(text, get_text());
-                text_len = avail;
-                while( text_len > 0 && (text[text_len-1] & 0xc0) == 0x80 )
-                        text[--text_len] = 0;
-                if( text_len > 0 )
-                        text[--text_len] = 0;
+               text_len = avail;
+               while( text_len > 0 && (text[text_len-1] & 0xc0) == 0x80 )
+                       text[--text_len] = 0;
+               if( text_len > 0 )
+                       text[--text_len] = 0;
                update(text);
        }
        int len =  sizeof(client->config.wtext) / sizeof(wchar_t);
@@ -1087,7 +1146,7 @@ int TitleText::handle_event()
        client->config.wtext[len-1] = 0;
        client->config.wlen = wcslen(client->config.wtext);
        window->update_stats();
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 TitleTextChars::TitleTextChars(int x, int y, int w)
@@ -1120,8 +1179,8 @@ int TitleTextBfrSz::update(int n)
 
 
 TitleDropShadow::TitleDropShadow(TitleMain *client, TitleWindow *window, int x, int y)
- : BC_TumbleTextBox(window, (int64_t)client->config.dropshadow,
-       (int64_t)-1000, (int64_t)1000, x, y, 70)
+ : BC_TumbleTextBox(window, client->config.dropshadow,
+               -1000, 1000, x, y, 70)
 {
        this->client = client;
        this->window = window;
@@ -1129,32 +1188,34 @@ TitleDropShadow::TitleDropShadow(TitleMain *client, TitleWindow *window, int x,
 int TitleDropShadow::handle_event()
 {
        client->config.dropshadow = atol(get_text());
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
 
 TitleOutline::TitleOutline(TitleMain *client, TitleWindow *window, int x, int y)
- : BC_TumbleTextBox(window, (int64_t)client->config.outline_size,
-       (int64_t)0, (int64_t)1000, x, y, 70)
+ : BC_TumbleTextBox(window, client->config.outline_size,
+               0.f, 1000.f, x, y, 70)
 {
        this->client = client;
        this->window = window;
+       set_precision(1);
 }
 int TitleOutline::handle_event()
 {
-       client->config.outline_size = atol(get_text());
-       client->send_configure_change();
+       client->config.outline_size = atof(get_text());
+       window->send_configure_change();
        return 1;
 }
 
 
 TitleStroker::TitleStroker(TitleMain *client, TitleWindow *window, int x, int y)
- : BC_TumbleTextBox(window, (int64_t)client->config.stroke_width,
-       (int64_t)0, (int64_t)1000, x, y, 70)
+ : BC_TumbleTextBox(window, client->config.stroke_width,
+               0.f, 1000.f, x, y, 70)
 {
        this->client = client;
        this->window = window;
+       set_precision(1);
 }
 int TitleStroker::handle_event()
 {
@@ -1163,42 +1224,44 @@ int TitleStroker::handle_event()
                client->config.style |= BC_FONT_OUTLINE;
        else
                client->config.style &= ~BC_FONT_OUTLINE;
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
 
 TitleX::TitleX(TitleMain *client, TitleWindow *window, int x, int y)
- : BC_TumbleTextBox(window, (int64_t)client->config.title_x,
-       (int64_t)-32767, (int64_t)32767, x, y, 50)
+ : BC_TumbleTextBox(window, client->config.title_x,
+               -32767.f, 32767.f, x, y, 50)
 {
        this->client = client;
        this->window = window;
+       set_precision(1);
 }
 int TitleX::handle_event()
 {
-       client->config.title_x = atol(get_text());
-       client->send_configure_change();
+       client->config.title_x = atof(get_text());
+       window->send_configure_change();
        return 1;
 }
 
 TitleY::TitleY(TitleMain *client, TitleWindow *window, int x, int y)
- : BC_TumbleTextBox(window, (int64_t)client->config.title_y,
-       (int64_t)-32767, (int64_t)32767, x, y, 50)
+ : BC_TumbleTextBox(window, client->config.title_y,
+               -32767.f, 32767.f, x, y, 50)
 {
        this->client = client;
        this->window = window;
+       set_precision(1);
 }
 int TitleY::handle_event()
 {
-       client->config.title_y = atol(get_text());
-       client->send_configure_change();
+       client->config.title_y = atof(get_text());
+       window->send_configure_change();
        return 1;
 }
 
 TitleW::TitleW(TitleMain *client, TitleWindow *window, int x, int y)
- : BC_TumbleTextBox(window, (int64_t)client->config.title_w,
-       (int64_t)0, (int64_t)32767, x, y, 50)
+ : BC_TumbleTextBox(window, client->config.title_w,
+               0, 32767, x, y, 50)
 {
        this->client = client;
        this->window = window;
@@ -1206,13 +1269,13 @@ TitleW::TitleW(TitleMain *client, TitleWindow *window, int x, int y)
 int TitleW::handle_event()
 {
        client->config.title_w = atol(get_text());
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
 TitleH::TitleH(TitleMain *client, TitleWindow *window, int x, int y)
- : BC_TumbleTextBox(window, (int64_t)client->config.title_h,
-       (int64_t)0, (int64_t)32767, x, y, 50)
+ : BC_TumbleTextBox(window, client->config.title_h,
+               0, 32767, x, y, 50)
 {
        this->client = client;
        this->window = window;
@@ -1220,15 +1283,16 @@ TitleH::TitleH(TitleMain *client, TitleWindow *window, int x, int y)
 int TitleH::handle_event()
 {
        client->config.title_h = atol(get_text());
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
 TitleSpeed::TitleSpeed(TitleMain *client, TitleWindow *window, int x, int y)
- : BC_TumbleTextBox(window, (float)client->config.pixels_per_second,
-       (float)0, (float)1000, x, y, 100)
+ : BC_TumbleTextBox(window, client->config.pixels_per_second,
+               0.f, 1000.f, x, y, 100)
 {
        this->client = client;
+       this->window = window;
        set_precision(2);
        set_increment(10);
 }
@@ -1237,7 +1301,7 @@ TitleSpeed::TitleSpeed(TitleMain *client, TitleWindow *window, int x, int y)
 int TitleSpeed::handle_event()
 {
        client->config.pixels_per_second = atof(get_text());
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
@@ -1252,7 +1316,7 @@ int TitleLeft::handle_event()
 {
        client->config.hjustification = JUSTIFY_LEFT;
        window->update_justification();
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
@@ -1266,7 +1330,7 @@ int TitleCenter::handle_event()
 {
        client->config.hjustification = JUSTIFY_CENTER;
        window->update_justification();
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
@@ -1280,7 +1344,7 @@ int TitleRight::handle_event()
 {
        client->config.hjustification = JUSTIFY_RIGHT;
        window->update_justification();
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
@@ -1296,7 +1360,7 @@ int TitleTop::handle_event()
 {
        client->config.vjustification = JUSTIFY_TOP;
        window->update_justification();
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
@@ -1310,7 +1374,7 @@ int TitleMid::handle_event()
 {
        client->config.vjustification = JUSTIFY_MID;
        window->update_justification();
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
@@ -1324,7 +1388,7 @@ int TitleBottom::handle_event()
 {
        client->config.vjustification = JUSTIFY_BOTTOM;
        window->update_justification();
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
@@ -1354,7 +1418,7 @@ int TitleColorThread::handle_new_color(int output, int alpha)
        window->flush();
        window->unlock_window();
 
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
@@ -1368,12 +1432,17 @@ TitleDrag::TitleDrag(TitleMain *client, TitleWindow *window, int x, int y)
 int TitleDrag::handle_event()
 {
        int value = get_value();
-       client->config.drag = value;
-       if( value )
-               window->grab(client->server->mwindow->cwindow->gui);
+       CWindowGUI *cwindow_gui = client->server->mwindow->cwindow->gui;
+       if( value ) {
+               if( !window->grab(cwindow_gui) ) {
+                       update(value = 0);
+                       flicker(10,50);
+               }
+       }
        else
-               window->ungrab(client->server->mwindow->cwindow->gui);
-       client->send_configure_change();
+               window->ungrab(cwindow_gui);
+       client->config.drag = value;
+       window->send_configure_change();
        return 1;
 }
 
@@ -1387,7 +1456,7 @@ TitleBackground::TitleBackground(TitleMain *client, TitleWindow *window, int x,
 int TitleBackground::handle_event()
 {
        client->config.background = get_value();
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
@@ -1401,19 +1470,20 @@ TitleBackgroundPath::TitleBackgroundPath(TitleMain *client, TitleWindow *window,
 int TitleBackgroundPath::handle_event()
 {
        strncpy(client->config.background_path, get_text(), sizeof(client->config.background_path));
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
-TitleLoopPlayback::TitleLoopPlayback(TitleMain *client, int x, int y)
+TitleLoopPlayback::TitleLoopPlayback(TitleMain *client, TitleWindow *window, int x, int y)
  : BC_CheckBox(x, y, client->config.loop_playback, _("Loop playback"))
 {
        this->client = client;
+       this->window = window;
 }
 int TitleLoopPlayback::handle_event()
 {
        client->config.loop_playback = get_value();
-       client->send_configure_change();
+       window->send_configure_change();
        return 1;
 }
 
@@ -1504,6 +1574,11 @@ void TitleCurPopup::create_objects()
        sub_menu->add_subitem("%s 10",item);
        sub_menu->add_subitem("%s 0",item);
        sub_menu->add_subitem("/%s",item);
+       add_item(cur_item = new TitleCurItem(this, item = KW_ALIAS));
+       cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item));
+       sub_menu->add_subitem("%s 1",item);
+       sub_menu->add_subitem("%s 0",item);
+       sub_menu->add_subitem("/%s",item);
        add_item(cur_item = new TitleCurItem(this, item = KW_SUP));
        cur_item->add_submenu(sub_menu = new TitleCurSubMenu(cur_item));
        sub_menu->add_subitem("%s 1",item);
@@ -1551,7 +1626,7 @@ int TitleCurSubMenuItem::handle_event()
        switch( popup_type ) {
        case POPUP_FONT: {
                int px, py;
-               window->get_pop_cursor_xy(px ,py);
+               window->get_pop_cursor(px ,py);
                window->fonts_popup->activate(px, py, 300,200);
                return 1; }
        case POPUP_COLOR: {
@@ -1654,13 +1729,12 @@ void TitlePngPopup::handle_done_event(int result)
 
 BC_Window *TitlePngPopup::new_gui()
 {
-        BC_DisplayInfo display_info;
-        int x = display_info.get_abs_cursor_x();
-        int y = display_info.get_abs_cursor_y();
+       MWindow *mwindow = client->server->mwindow;
+       int x, y;  mwindow->gui->get_abs_cursor(x, y);
 
-       BC_Window *gui = new BrowseButtonWindow(client->server->mwindow->theme,
+       BC_Window *gui = new BrowseButtonWindow(mwindow->theme,
                x-25, y-100, window, "", _("Png file"), _("Png path"), 0);
-        gui->create_objects();
+       gui->create_objects();
        return gui;
 }