#include "general.h" #include "app.h" #include "string.h" #include "win.h" #include "taskman.h" #include popup_data popup; extern WINDOW *app_bar; void CDECL popup_delete( WINDOW *win, int16 buff[8]) { WindDelete( win); popup.win = NULL; if( menu_enabled == TRUE) { menu_enabled = FALSE; draw_page( app_bar, root->x_pos - 24, root->y_pos, 24, 23); } } void process_popup_item( WINDOW *win, int16 buff[8]) { if( popup.selected < 0) return; switch( popup.function[popup.selected]) { case F_SHUTDOWN: shutdown_dialog(); break; case F_TASKMANAGER: taskman_dialog(); break; case F_QUIT_ZBAR: quit_dialog(); break; case F_KILL: Pkill( popup.entry->pid, SIGKILL); mt_evnt_timer( 100L, app.aes_global); break; case F_PREFERENCES: pref_dialog(); break; case F_QUIT: ApplWrite( popup.entry->id, AP_TERM, 0, 0, 0, 0, 0); mt_evnt_timer( 100L, app.aes_global); break; default: break; } popup_delete( win, buff); } int16 popup_item_under_mouse( void) { int16 i, ok, result = -1; for( i = 0; i < popup.item_nbr; i++) { ok = IS_IN( evnt.mx, evnt.my, popup.item_pos[i].x1, popup.item_pos[i].y1, popup.item_pos[i].x2, popup.item_pos[i].y2); if( ok) { if( popup.selectable[i] == TRUE) result = i; break; } } return result; } static void CDECL popup_redraw( WINDOW *win, int16 buff[8]) { int16 pxy[6], i, y, title_color, title_shadow; pxy[0] = popup.x_pos; pxy[1] = popup.y_pos; pxy[2] = pxy[0] + popup.w_pos - 1; pxy[3] = pxy[1] + popup.h_pos - 1; vsf_color( win->graf->handle, button_off_background); v_bar( win->graf->handle, pxy); pxy[5] = pxy[1]; pxy[1] = pxy[3]; pxy[4] = pxy[2]; vsl_color( win->graf->handle, button_off_dark_color); v_pline( win->graf->handle, 3, pxy); pxy[4] = pxy[2]; pxy[2] = pxy[0]; pxy[3] = popup.y_pos; pxy[5] = pxy[3]; vsl_color( win->graf->handle, button_off_light_color); v_pline( win->graf->handle, 3, pxy); pxy[0] = popup.x_pos + 1; pxy[1] = popup.y_pos + 1; pxy[2] = pxy[0] + popup.w_pos - 3; for( i = 0, y = popup.y_pos + 7; i < popup.item_nbr; i++, y += 18, pxy[1] += 18) { popup.item_pos[i].x1 = pxy[0]; popup.item_pos[i].x2 = popup.w_pos; popup.item_pos[i].y1 = pxy[1]; if( popup.item_name[i][0] == '\0') { int16 xy[4] = { pxy[0] + 1, pxy[1] + 5, pxy[2] - 1, pxy[1] + 5}; v_pline( win->graf->handle, 2, xy); xy[1]--; xy[3]--; vsl_color( win->graf->handle, button_off_dark_color); v_pline( win->graf->handle, 2, xy); y -= 9; pxy[1] -= 9; popup.item_pos[i].y2 = 9; continue; } popup.item_pos[i].y2 = 18; if( i == popup.selected) { pxy[3] = pxy[1] + 17; vsf_color( win->graf->handle, button_on_background); v_bar( win->graf->handle, pxy); title_color = button_on_text_color; title_shadow = button_on_text_shadow_color; } else { title_color = button_off_text_color; title_shadow = button_off_text_shadow_color; } if( popup.icon[i] > -1) { icons[popup.icon[i]].ob_x = popup.x_pos + x_space; icons[popup.icon[i]].ob_y = pxy[1] + 2; mt_objc_draw( icons, popup.icon[i], 1, win->graf->clip.g_x, win->graf->clip.g_y, win->graf->clip.g_w, win->graf->clip.g_h, app.aes_global); draw_text( win->graf->handle, icons[popup.icon[i]].ob_x + 17 + x_space, y + 1, title_shadow, popup.item_name[i]); draw_text( win->graf->handle, icons[popup.icon[i]].ob_x + 16 + x_space, y, title_color, popup.item_name[i]); } else { draw_text( win->graf->handle, popup.x_pos + x_space + 1, y + 1, title_shadow, popup.item_name[i]); draw_text( win->graf->handle, popup.x_pos + x_space, y, title_color, popup.item_name[i]); } } } void open_popup( app_data *entry) { int16 i, lenght, zbarx, zbary, dum; WindGet( app_bar, WF_CURRXYWH, &zbarx, &zbary, &dum, &dum); if( entry) popup.x_pos = entry->x_pos - 1; else popup.x_pos = zbarx; popup.h_pos = 5; popup.selected = -1; popup.old_selected = -1; for( popup.w_pos = 0, i = 0; i < popup.item_nbr; i++) { if( popup.item_name[i][0] == '\0') { popup.h_pos += 9; continue; } lenght = get_text_width( popup.item_name[i]); if( popup.icon[i] > -1) lenght += 16 + x_space; if( lenght > popup.w_pos) popup.w_pos = lenght; popup.h_pos += 18; } popup.w_pos += ( x_space * 3); popup.w_pos = MAX( popup.w_pos, app_width + 1); while( popup.x_pos + popup.w_pos > app.x + app.w) popup.x_pos--; popup.entry = entry; popup.win = WindCreate( 0, app.x, app.y, app.w, app.h); EvntAttach( popup.win, WM_DESTROY, popup_delete); EvntAttach( popup.win, WM_REDRAW, popup_redraw); EvntAttach( popup.win, WM_XBUTTON, process_popup_item); popup.y_pos = zbary - popup.h_pos + 1; WindOpen( popup.win, popup.x_pos, popup.y_pos, popup.w_pos, popup.h_pos); // WindSet( popup.win, WF_BEVENT, BEVENT_MODAL, 0, 0, 0); WindGet( popup.win, WF_WORKXYWH, &popup.x_pos, &popup.y_pos, &popup.w_pos, &popup.h_pos); }